using System.Diagnostics;
namespace IStation.Algorithm
{
///
/// 调度分析辅助类
///
public partial class AnalysisHelper
{
double _frequency_def = 50;
double _frequency_min = 25;
double _frequency_max = 50;
double _frequency_space = 0.1;//频率间隔
double _head_space = 0.1;//扬程间隔
readonly DAL.SQLite.AnalysisCombine _dal_analysis_combine = new();
readonly DAL.SQLite.AnalysisConclusion _dal_analysis_conclusion = new();
readonly DAL.SQLite.AnalysisLog _dal_analysis_log = new();
readonly DAL.SQLite.AnalysisDeviation _dal_analysis_deviation = new();
///
/// 分析泵组合(目前只分析单泵)
///
/// 泵列表
///
public void AnalysisCombine(List pumps)
{
InsertAnaLog("开始分析泵组合");
if (pumps == null || pumps.Count < 1)
{
InsertAnaLog("分析失败:没有泵数据!");
return;
}
var fre_def = _frequency_def;
var ana_pump_list = new List();
foreach (var pump in pumps)
{
if (pump.IsBp)
{
//变频泵
var anaPump = new AnaPump(pump, fre_def, _frequency_min, _frequency_max, _frequency_space);
if (anaPump.AllowCalc)
ana_pump_list.Add(anaPump);
}
else
{
//固频泵
var anaPump = new AnaPump(pump);
if (anaPump.AllowCalc)
ana_pump_list.Add(anaPump);
}
}
if (!ana_pump_list.Any())
{
InsertAnaLog($"分析进度:没有泵可分析");
return;
}
for (int i = 0; i < ana_pump_list.Count; i++)
{
var pump = ana_pump_list[i];
var ana_frequency_items = pump.AnaFrequencyItems;
if (ana_frequency_items == null || !ana_frequency_items.Any())
continue;
var run_flag = RunFlagHelper.GetRunFlag(pump.Flag, pump.IsBp);
InsertAnaLog($"分析进度:第{i + 1}台泵");
var list = new List(pump.AnaFrequencyItems.Count);
foreach (var freItem in ana_frequency_items)
{
var scheduleCombine = new Entity.AnalysisCombine();
scheduleCombine.ID = Yw.YitIdHelper.NextId();
scheduleCombine.Pump = freItem.Frequency;
scheduleCombine.CurveQH = freItem.CurveQH.ToJson();
scheduleCombine.CurveQP = freItem.CurveQP.ToJson();
freItem.CurveQH.GetMinMaxPointY(out double maxHead, out double minHead);
scheduleCombine.MinFlow = Math.Round(freItem.CurveQH.Min, 4);
scheduleCombine.MaxFlow = Math.Round(freItem.CurveQH.Max, 4);
scheduleCombine.MaxHead = Math.Round(maxHead, 4);
scheduleCombine.MinHead = Math.Round(minHead, 4);
scheduleCombine.AnaStatus = false;
list.Add(scheduleCombine);
}
InsertAnalysisCombineList(i + 1, run_flag, list);
}
InsertAnaLog($"分析进度:{pumps.Count}台泵,分析完毕!");
}
///
/// 分析结论
///
public void AnalysisConclusion()
{
InsertAnaLog($"开始分析泵组合结论!");
_dal_analysis_conclusion.DeleteAllTable();
var analysis_combine_table_list = _dal_analysis_combine.GetAllTableName();
if (analysis_combine_table_list == null || !analysis_combine_table_list.Any())
{
InsertAnaLog($"无泵组合表!");
return;
}
var tableCount = analysis_combine_table_list.Count();
InsertAnaLog($"分析{tableCount}个组合!");
for (int tableIndex = 0; tableIndex < tableCount; tableIndex++)
{
var table_name = analysis_combine_table_list[tableIndex];
var analysis_combine_list = _dal_analysis_combine.GetNoAnalysisByTableName(table_name);
if (analysis_combine_list == null || !analysis_combine_list.Any())
{
InsertAnaLog($"分析进度:{table_name},第{tableIndex + 1}个,分析完毕");
continue;
}
var analysis_combine_list_count = analysis_combine_list.Count();
var analysis_conclusion_list = new List>(analysis_combine_list_count);
var analysis_combine_ids = new List(analysis_combine_list_count);
for (int combineIndex = 0; combineIndex < analysis_combine_list_count; combineIndex++)
{
var analysis_combine = analysis_combine_list[combineIndex];
var analysis_combine_id = analysis_combine.ID;
analysis_combine_ids.Add(analysis_combine_id);
var curveQH = JsonHelper.Json2Object(analysis_combine.CurveQH);
var curveQP = JsonHelper.Json2Object(analysis_combine.CurveQP);
var bol = curveQH.GetMinMaxPointY(out double maxY, out double minY);
if (!bol)
return;
var maxHead = Math.Ceiling(maxY);
var minHead = Math.Floor(minY);
var currentListCount = (int)((maxHead - minHead) / _head_space) + 1;
var current_analysis_conclusion_list = new List(currentListCount);
for (double head = minHead; head <= maxHead; head += _head_space)
{
var flow = curveQH.GetInterPointLastX(head);
if (!flow.HasValue)
{
continue;
}
var analysis_conclusion = new Entity.AnalysisConclusion();
analysis_conclusion.ID = Yw.YitIdHelper.NextId();
analysis_conclusion.CombineID = analysis_combine_id;
analysis_conclusion.Pump = analysis_combine.Pump;
analysis_conclusion.Head = head;
analysis_conclusion.Flow = flow.Value;
analysis_conclusion.Power = curveQP.GetFitPointY(flow.Value);
analysis_conclusion.UWP = PumpCalculateHelper.CalculateUWP(analysis_conclusion.Power, analysis_conclusion.Flow, analysis_conclusion.Head);
analysis_conclusion.WP = PumpCalculateHelper.CalculateWP(analysis_conclusion.Power, analysis_conclusion.Flow);
Round(analysis_conclusion);
current_analysis_conclusion_list.Add(analysis_conclusion);
}
analysis_conclusion_list.Add(current_analysis_conclusion_list);
}
UpdateAnaStatus(table_name, analysis_combine_ids);
var list = analysis_conclusion_list.SelectMany(x => x.ToList()).ToList();
var run_flag = _dal_analysis_combine.GetRunFlag(table_name);
InsertAnalysisConclusionList(tableIndex + 1, run_flag, list);
}
}
#region Expand
///
/// 圆整
///
private void Round(Entity.AnalysisConclusion conclusion)
{
conclusion.Pump = Math.Round(conclusion.Pump, 1);
conclusion.Head = Math.Round(conclusion.Head, 1);
conclusion.Flow = Math.Round(conclusion.Flow, 1);
conclusion.Power = Math.Round(conclusion.Power, 1);
conclusion.WP = Math.Round(conclusion.WP, 1);
conclusion.UWP = Math.Round(conclusion.UWP, 1);
}
///
/// 插入分析日志
///
private void InsertAnaLog(string info)
{
var entity = new Entity.AnalysisLog(info);
_dal_analysis_log.Insert(entity);
}
///
/// 更新分析状态
///
public bool UpdateAnaStatus(string tableName, List ids)
{
if (ids == null || !ids.Any())
{
return false;
}
return _dal_analysis_combine.UpdateAnaStatus(tableName, ids);
}
///
/// 插入分析组合列表
///
public void InsertAnalysisCombineList(int index, string runFlag, List list)
{
string log;
if (list == null || !list.Any())
{
log = $"{runFlag}:下标:{index},无数据";
InsertAnaLog(log);
return;
}
var sw = Stopwatch.StartNew();
_dal_analysis_combine.BulkInsertsEx(runFlag, list);
log = $"{runFlag}:下标:{index},数量:{list.Count},插入耗时:{sw.ElapsedMilliseconds / 1000}m";
InsertAnaLog(log);
}
///
/// 插入分析结论列表
///
public void InsertAnalysisConclusionList(int index, string runFlag, List list)
{
string log;
if (list == null || !list.Any())
{
log = $"{runFlag}:下标:{index},无数据";
InsertAnaLog(log);
return;
}
var sw = Stopwatch.StartNew();
_dal_analysis_conclusion.BulkInsertsEx(runFlag, list);
log = $"分析进度:{runFlag},下标:{index},数量:{list.Count},插入耗时:{sw.ElapsedMilliseconds / 1000}m";
InsertAnaLog(log);
}
///
/// 插入分析偏差
///
private bool InsertAnalysisDeviationList(List analysis_deviation_list)
{
var bol = _dal_analysis_deviation.Inserts(analysis_deviation_list);
return bol;
}
#endregion
}
}