namespace IStation.Algorithm
{
///
/// 分析泵项
///
public class AnaPumpItem
{
public AnaPumpItem() { }
public AnaPumpItem(Pump rhs)
{
this.ID = rhs.ID;
this.Name = rhs.Name;
this.Code = rhs.Code;
this.IsBp = rhs.IsBp;
this.Qr = rhs.Qr;
this.Hr = rhs.Hr;
this.Nr = rhs.Nr;
this.Pr = rhs.Pr;
this.Er = rhs.Er;
if (rhs.CurveQH != null && rhs.CurveQP != null)
{
this.CurveQH = rhs.CurveQH.Clone();
this.CurveQP = rhs.CurveQP.Clone();
this.AllowCalc = true;
}
}
public AnaPumpItem(Pump rhs, double freDef, double freMin, double freMax, double freSpace) : this(rhs)
{
this.CalcFrequencyItems(freDef, freMin, freMax, freSpace);
}
public int ID { get; set; }
public string Code { get; set; }
public string Name { get; set; }
public double Qr { get; set; }
public double Hr { get; set; }
public double Nr { get; set; }
public double Pr { get; set; }
public double Er { get; set; }
public bool IsBp { get; set; }
public Curve.CurveExpress CurveQH { get; set; }
public Curve.CurveExpress CurveQP { get; set; }
public List AnaFrequencyItems { get; set; }
public bool AllowCalc { get; set; }
void CalcFrequencyItems(double freDef, double freMin, double freMax, double freSpace)
{
if (!this.AllowCalc)
return;
this.AnaFrequencyItems = new List();
//var freItemDef = new AnaFrequencyItem();
//freItemDef.Frequency = freMax;
//freItemDef.CurveQH = this.CurveQH.Clone();
//freItemDef.CurveQP = this.CurveQP.Clone();
//this.AnaFrequencyItems.Add(freItemDef);
for (double fre = freMax; fre >= freMin; fre -= freSpace)
{
var freItem = new AnaPumpFreItem();
freItem.Frequency = fre;
freItem.CurveQH = Curve.PumpCalculateHelper.CalculateSimilarQH(this.CurveQH, freDef, fre);
freItem.CurveQP = Curve.PumpCalculateHelper.CalculateSimilarQP(this.CurveQP, freDef, fre);
this.AnaFrequencyItems.Add(freItem);
}
}
}
///
/// 分析泵变频项
///
public class AnaPumpFreItem
{
public double Frequency { get; set; }
public Curve.CurveExpress CurveQH { get; set; }
public Curve.CurveExpress CurveQP { get; set; }
}
///
/// 调度分析辅助类
///
public class SchedulingAnaHelper
{
double _frequency_def = 50;
double _frequency_min = 25;
double _frequency_max = 50;
double _frequency_space = 0.1;//频率间隔
DAL.ScheduleCombine _dal = new DAL.ScheduleCombine();
DAL.ScheduleCombineLog _dalLog = new DAL.ScheduleCombineLog();
DAL.ScheduleAnaLog _dalAnaLog = new DAL.ScheduleAnaLog();
#region TableName
string _tableFrePumpTag = "B";
string _tableFixPumpTag = "G";
string _tableSpaceMark = "_";
string GetTableName(List pumpItems)
{
var tableName = string.Empty;
var count = pumpItems.Count;
pumpItems = pumpItems.OrderBy(p => p.ID).ToList();
for (int i = 0; i < count; i++)
{
var pumpItem = pumpItems[i];
tableName += GetTableName(pumpItem);
if ((i + 1) != count)
{
tableName += _tableSpaceMark;
}
}
return tableName;
}
string GetTableName(AnaPumpItem pumpItem)
{
return (pumpItem.IsBp ? _tableFrePumpTag : _tableFixPumpTag) + pumpItem.ID;
}
#endregion
///
/// 分析泵组合
///
/// 泵列表
///
public bool AnaPumpCombine(List pumps)
{
if (pumps == null || pumps.Count < 1)
return false;
var fre_def = _frequency_def;
var anaPumpItems = new List();
foreach (var pump in pumps)
{
if (pump.IsBp)
{
//变频泵
var anaPump = new AnaPumpItem(pump, fre_def, _frequency_min, _frequency_max, _frequency_space);
if (anaPump.AllowCalc)
anaPumpItems.Add(anaPump);
}
else
{
//固频泵
var anaPump = new AnaPumpItem(pump);
if (anaPump.AllowCalc)
anaPumpItems.Add(anaPump);
}
}
if (anaPumpItems.Count < 1)
return false;
InsertAnaLog("开始分析");
var maxRunCount = 3;
var anaPumpItemsArray = anaPumpItems.ToArray();
for (int runCount = 1; runCount <= maxRunCount; runCount++)
{
var pumpCombineList = PermutationAndCombination.GetCombination(anaPumpItemsArray, runCount);
for (int i = 0; i < pumpCombineList.Count; i++)
{
var anaPumps = pumpCombineList[i].ToList();
var runFalg = GetTableName(anaPumps);
var scheduleCombineList = GetScheduleCombineList(runFalg, anaPumps);
}
}
InsertAnaLog("分析完毕");
return true;
}
///
///
///
///
///
///
private List GetScheduleCombineList(string runFlag, List anaPumps)
{
if (anaPumps == null || anaPumps.Count < 2)
return default;
if (anaPumps.Exists(x => !x.AllowCalc))
return default;
List pump1, pump2, pump3;
var parallelHelper = new ParallelConnectionHelper();
var list = new List();
var pumpCount = anaPumps.Count;
switch (pumpCount)
{
case 1:
{
pump1 = anaPumps[0].AnaFrequencyItems;
foreach (var freItem in pump1)
{
var scheduleCombine = new Model.ScheduleCombine();
scheduleCombine.RunFlag = runFlag;
scheduleCombine.RunCount = pumpCount;
scheduleCombine.RunHZ = $"{freItem.Frequency}";
scheduleCombine.CurveQH = freItem.CurveQH;
scheduleCombine.CurveQP = freItem.CurveQP;
scheduleCombine.AnaStatus = false;
list.Add(scheduleCombine);
}
}
break;
case 2:
{
pump1 = anaPumps[0].AnaFrequencyItems;
pump2 = anaPumps[1].AnaFrequencyItems;
for (int pump1Index = 0; pump1Index < pump1.Count; pump1Index++)
{
for (int pump2Index = 0; pump2Index < pump2.Count; pump2Index++)
{
var freItem1 = pump1[pump1Index];
var freItem2 = pump2[pump2Index];
parallelHelper.ClearCurve();
parallelHelper.AddCurve(freItem1.CurveQH, freItem1.CurveQP);
parallelHelper.AddCurve(freItem2.CurveQH, freItem2.CurveQP);
var allowParallel = parallelHelper.CalculateParallel(out List pointQH, out List pointQE, out List pointQP);
if (!allowParallel)
continue;
var scheduleCombine = new Model.ScheduleCombine();
scheduleCombine.RunFlag = runFlag;
scheduleCombine.RunCount = pumpCount;
scheduleCombine.RunHZ = $"{freItem1.Frequency},{freItem2.Frequency}";
scheduleCombine.CurveQH = FitHelper.BuildCurveExpress(pointQH);
scheduleCombine.CurveQP = FitHelper.BuildCurveExpress(pointQP);
scheduleCombine.AnaStatus = false;
list.Add(scheduleCombine);
}
}
}
break;
case 3:
{
pump1 = anaPumps[0].AnaFrequencyItems;
pump2 = anaPumps[1].AnaFrequencyItems;
pump3 = anaPumps[2].AnaFrequencyItems;
for (int pump1Index = 0; pump1Index < pump1.Count; pump1Index++)
{
for (int pump2Index = 0; pump2Index < pump2.Count; pump2Index++)
{
for (int pump3Index = 0; pump3Index < pump3.Count; pump3Index++)
{
var freItem1 = pump1[pump1Index];
var freItem2 = pump2[pump2Index];
var freItem3 = pump3[pump3Index];
parallelHelper.ClearCurve();
parallelHelper.AddCurve(freItem1.CurveQH, freItem1.CurveQP);
parallelHelper.AddCurve(freItem2.CurveQH, freItem2.CurveQP);
parallelHelper.AddCurve(freItem3.CurveQH, freItem3.CurveQP);
var allowParallel = parallelHelper.CalculateParallel(out List pointQH, out List pointQE, out List pointQP);
if (!allowParallel)
continue;
var scheduleCombine = new Model.ScheduleCombine();
scheduleCombine.RunFlag = runFlag;
scheduleCombine.RunCount = pumpCount;
scheduleCombine.RunHZ = $"{freItem1.Frequency},{freItem2.Frequency},{freItem3.Frequency}";
scheduleCombine.CurveQH = FitHelper.BuildCurveExpress(pointQH);
scheduleCombine.CurveQP = FitHelper.BuildCurveExpress(pointQP);
scheduleCombine.AnaStatus = false;
list.Add(scheduleCombine);
}
}
}
}
break;
default: break;
}
return list;
}
///
/// 插入分析日志
///
///
private void InsertAnaLog(string info)
{
var entity = new Entity.ScheduleAnaLog(info);
_dalAnaLog.Insert(entity);
}
}
/////
///// 数据库
/////
//public class _dalAnaLog
//{
// ///
// /// 连接配置
// ///
// public static ConnectionConfig ConnectionConfig
// {
// get
// {
// var filePath = DAL._dalAnaLogInitial._dalAnaLogFilePath;
// if (!System.IO.File.Exists(filePath))
// {
// DAL._dalAnaLogInitial.InitTables();
// }
// var config = new ConnectionConfig()
// {
// ConnectionString = $"DataSource={filePath}",
// IsAutoCloseConnection = true,
// _dalAnaLogType = SqlSugar._dalAnaLogType.Sqlite
// };
// return config;
// }
// }
// ///
// /// 大批量插入
// ///
// public static bool BulkInserts()
// {
// //if (list == null || list.Count < 1)
// // return default;
// //var entities = Models2Entities(list);
// //using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig))
// //{
// // ///自己来制定定义的规则
// // db.CurrentConnectionConfig.ConfigureExternalServices.SplitTableService = new RunFlagSubTableService();
// // db.CodeFirst
// // .SplitTables()//标识分表
// // .InitTables(); //程序启动时加这一行,如果一张表没有会初始化一张
// // //大数据写入+表不存在会建表
// // //自动找表大数据写入
// // return db.Fastest().SplitTable().BulkCopy(entities) > 0;
// //}
// return false;
// }
// ///
// /// 大批量插入
// ///
// public static bool BulkInserts(List list)
// {
// if (list == null || !list.Any())
// return false;
// var entities = Models2Entities(list);
// if (entities == null || !entities.Any())
// return false;
// using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig))
// {
// return db.Fastest().BulkCopy(entities) > 0;
// }
// }
// static List Models2Entities(List modelList)
// {
// if (modelList == null || !modelList.Any())
// return default;
// var entities = new List();
// foreach (var model in modelList)
// {
// var entity = new Entity.ScheduleCombine();
// entity.RunFlag = model.RunFlag;
// entity.RunCount = model.RunCount;
// entity.RunHZ = model.RunHZ;
// entity.CurveQH = model.CurveQH?.ToJson();
// entity.CurveQP = model.CurveQP?.ToJson();
// entity.AnaStatus = model.AnaStatus;
// entities.Add(entity);
// }
// return entities;
// }
// ///
// /// 插入
// ///
// public static bool Insert(string info)
// {
// var log = new Entity.ScheduleAnaLog(info);
// using (SqlSugarClient db = new SqlSugarClient(ConnectionConfig))
// {
// return db.Insertable(log).ExecuteCommandIdentityIntoEntity();
// }
// }
// internal static object SplitHelper()
// {
// throw new NotImplementedException();
// }
//}
/////
///// 分表规则
/////
//public class RunFlagSubTableService : ISplitTableService
//{
// ///
// /// 获取所有的数据库中的表
// ///
// ///
// ///
// ///
// ///
// ///
// public List GetAllTables(ISqlSugarClient db, EntityInfo EntityInfo, List<_dalAnaLogTableInfo> tableInfos)
// {
// List result = new List();
// foreach (var item in tableInfos)
// {
// if (item.Name.Contains("_Run_")) //区分标识如果不用正则符复杂一些,防止找错表
// {
// SplitTableInfo data = new SplitTableInfo()
// {
// TableName = item.Name //要用item.name不要写错了
// };
// result.Add(data);
// }
// }
// return result.OrderBy(it => it.TableName).ToList();//打断点看一下有没有查出所有分表
// }
// ///
// ///
// ///
// ///
// ///
// ///
// ///
// ///
// public object GetFieldValue(ISqlSugarClient db, EntityInfo entityInfo, SplitType splitType, object entityValue)
// {
// var splitColumn = entityInfo.Columns.FirstOrDefault(it => it.PropertyInfo.GetCustomAttribute() != null);
// return splitColumn.PropertyInfo.GetValue(entityValue, null);
// }
// ///
// ///
// ///
// ///
// ///
// ///
// public string GetTableName(ISqlSugarClient db, EntityInfo EntityInfo)
// {
// return EntityInfo._dalAnaLogTableName + "_Run";
// }
// public string GetTableName(ISqlSugarClient db, EntityInfo EntityInfo, SplitType type)
// {
// return EntityInfo._dalAnaLogTableName + "_Run";
// }
// ///
// /// 确定生成数据库表的时候,表的名称
// ///
// ///
// ///
// ///
// ///
// ///
// public string GetTableName(ISqlSugarClient db, EntityInfo entityInfo, SplitType splitType, object fieldValue)
// {
// return entityInfo._dalAnaLogTableName + "_Run_" + fieldValue.ToString();
// }
//}
/////
///// 调度组合
/////
//[SplitTable(SplitType._Custom01)]
//public class ScheduleCombine
//{
// public ScheduleCombine() { }
// public ScheduleCombine(ScheduleCombine rhs)
// {
// this.Pump1 = rhs.Pump1;
// this.Pump2 = rhs.Pump2;
// this.Pump3 = rhs.Pump3;
// this.Head = rhs.Head;
// this.Flow = rhs.Flow;
// this.Power = rhs.Power;
// this.WP = rhs.WP;
// this.UWP = rhs.UWP;
// }
// public void Round()
// {
// this.Pump1 = Math.Round(this.Pump1, 1);
// this.Pump2 = Math.Round(this.Pump2, 1);
// this.Pump3 = Math.Round(this.Pump3, 1);
// this.Head = Math.Round(this.Head, 1);
// this.Flow = Math.Round(this.Flow, 1);
// this.Power = Math.Round(this.Power, 1);
// this.WP = Math.Round(this.WP, 1);
// this.UWP = Math.Round(this.UWP, 1);
// }
// ///
// /// 运行标志 (标志枚举)
// ///
// [SplitField]
// public string RunFlag { get; set; }
// ///
// /// 泵1
// ///
// public double Pump1 { get; set; }
// ///
// /// 泵2
// ///
// public double Pump2 { get; set; }
// ///
// /// 泵3
// ///
// public double Pump3 { get; set; }
// ///
// /// 扬程
// ///
// public double Head { get; set; }
// ///
// /// 总流量
// ///
// public double Flow { get; set; }
// ///
// /// 总功率
// ///
// public double Power { get; set; }
// ///
// /// 千吨水能耗
// ///
// public double WP { get; set; }
// ///
// /// 单位能耗
// ///
// public double UWP { get; set; }
// ///
// /// 创建时间
// ///
// public DateTime CreateTime { get; set; } = DateTime.Now;
//}
}