using System.Diagnostics;
namespace IStation.Algorithm
{
///
/// 调度分析辅助类
///
public partial class AnalysisHelper
{
private readonly double _frequency_def = 50;
private readonly double _frequency_min = 25;
private readonly double _frequency_max = 50;
private readonly double _frequency_space = 0.10;//频率间隔
private readonly decimal _head_space = 0.1m;//扬程间隔
private readonly DAL.SQLite.AnalysisPump _dal_analysis_pump = new();
private readonly DAL.SQLite.AnalysisParameter _dal_analysis_conclusion = new();
private readonly DAL.SQLite.AnalysisFactor _dal_analysis_factor = new();
///
/// 分析泵
///
/// 泵列表
///
public void AnalysisPump(List pumps)
{
InsertLog("开始分析泵组合");
if (pumps == null || pumps.Count < 1)
{
InsertLog("分析失败:没有泵数据!");
return;
}
var all_analysis_factor_list = _dal_analysis_factor.GetAll();
var fre_def = _frequency_def;
var analysis_pump_list = new List();
foreach (var pump in pumps)
{
var pump_factor_list = all_analysis_factor_list?.Where(x => x.Flag == pump.Flag).ToList();
if (pump.IsBp)
{
//变频泵
var fre_head_diff_avg_dict = pump_factor_list?.ToDictionary(x => x.Hz, y => y.HeadDeviation);
var analysisPump = new AnaPump(pump, fre_def, _frequency_min, _frequency_max, _frequency_space, fre_head_diff_avg_dict);
if (analysisPump.AllowCalc)
analysis_pump_list.Add(analysisPump);
}
else
{
//固频泵
var analysisPump = new AnaPump(pump);
if (analysisPump.AllowCalc)
analysis_pump_list.Add(analysisPump);
}
}
if (!analysis_pump_list.Any())
{
InsertLog($"分析进度:没有泵可分析");
return;
}
for (int i = 0; i < analysis_pump_list.Count; i++)
{
var pump = analysis_pump_list[i];
var analysis_frequency_items = pump.AnaFrequencyItems;
if (analysis_frequency_items == null || !analysis_frequency_items.Any())
continue;
var run_flag = RunFlagHelper.GetRunFlag(pump.Flag, pump.IsBp);
InsertLog($"分析进度:第{i + 1}台泵");
var list = new List(pump.AnaFrequencyItems.Count);
foreach (var freItem in analysis_frequency_items)
{
var analysis_pump = new Entity.AnalysisPump();
analysis_pump.ID = Yw.YitIdHelper.NextId();
analysis_pump.Flag = pump.Flag;
analysis_pump.Hz = freItem.Frequency;
analysis_pump.CurveQH = freItem.CurveQH.ToJson();
analysis_pump.CurveQP = freItem.CurveQP.ToJson();
freItem.CurveQH.GetMinMaxPointY(out double maxHead, out double minHead);
analysis_pump.MinFlow = Math.Round(freItem.CurveQH.Min, 4);
analysis_pump.MaxFlow = Math.Round(freItem.CurveQH.Max, 4);
analysis_pump.MaxHead = Math.Round(maxHead, 4);
analysis_pump.MinHead = Math.Round(minHead, 4);
list.Add(analysis_pump);
}
InsertList(i + 1, run_flag, list);
}
InsertLog($"分析进度:{pumps.Count}台泵,分析完毕!");
}
///
/// 分析参数
///
public void AnalysisParameter(List pumps)
{
InsertLog($"开始分析泵结论!");
if (pumps == null || pumps.Count < 1)
{
InsertLog("分析失败:没有泵数据!");
return;
}
_dal_analysis_conclusion.DeleteAllTable();
for (int pump_index = 0; pump_index < pumps.Count; pump_index++)
{
var pump = pumps[pump_index];
var flag = pump.Flag;
var run_flag = RunFlagHelper.GetRunFlag(flag, pump.IsBp);
var table_name = _dal_analysis_pump.GetTableName(run_flag);
var analysis_pump_list = _dal_analysis_pump.GetAllByTableName(table_name);
if (analysis_pump_list == null || !analysis_pump_list.Any())
{
InsertLog($"分析进度:{table_name},第{pump_index + 1}个,分析完毕");
continue;
}
var analysis_pump_list_count = analysis_pump_list.Count();
var analysis_conclusion_list = new List>(analysis_pump_list_count);
for (int analysis_pump_index = 0; analysis_pump_index < analysis_pump_list_count; analysis_pump_index++)
{
var analysis_pump = analysis_pump_list[analysis_pump_index];
var curveQH = JsonHelper.Json2Object(analysis_pump.CurveQH);
var curveQP = JsonHelper.Json2Object(analysis_pump.CurveQP);
var bol = curveQH.GetMinMaxPointY(out double maxY, out double minY);
if (!bol)
throw new Exception("曲线异常");
decimal max_head = (decimal)Math.Ceiling(maxY);
decimal min_head = (decimal)Math.Floor(minY);
var current_list_count = (int)((max_head - min_head) / _head_space) + 1;
var current_analysis_conclusion_list = new List(current_list_count);
for (decimal head = min_head; head <= max_head; head += _head_space)
{
var flow = curveQH.GetInterPointLastX((double)head) ?? 0;
if (flow < 1)
{
continue;
}
double differV = 0;
if (pump.Oc != null)
{
//1输和2输都是用的进口液位,不考虑进口口径
differV = PumpCalculateHelper.CalculateOtherPress(flow, null, pump.Oc, null, null);
}
var analysis_conclusion = new Entity.AnalysisParameter();
analysis_conclusion.ID = Yw.YitIdHelper.NextId();
analysis_conclusion.PumpID = analysis_pump.ID;
analysis_conclusion.Hz = analysis_pump.Hz;
analysis_conclusion.Head = (double)head;
analysis_conclusion.PressureDiff = (double)head - differV;
analysis_conclusion.Flow = flow;
analysis_conclusion.Power = curveQP.GetFitPointY(flow);
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);
}
var list = analysis_conclusion_list.SelectMany(x => x.ToList()).ToList();
InsertList(pump_index + 1, run_flag, list);
}
}
///
/// 分析参数
///
public void Test(List pumps)
{
if (pumps == null || pumps.Count < 1)
{
return;
}
_dal_analysis_conclusion.DeleteAllTable();
for (int pump_index = 0; pump_index < pumps.Count; pump_index++)
{
var pump = pumps[pump_index];
var flag = pump.Flag;
var run_flag = RunFlagHelper.GetRunFlag(flag, pump.IsBp);
var table_name = _dal_analysis_pump.GetTableName(run_flag);
var analysis_pump_list = _dal_analysis_pump.GetAllByTableName(table_name);
if (analysis_pump_list == null || !analysis_pump_list.Any())
{
continue;
}
var analysis_pump_list_count = analysis_pump_list.Count();
var analysis_conclusion_list = new List>(analysis_pump_list_count);
for (int analysis_pump_index = 0; analysis_pump_index < analysis_pump_list_count; analysis_pump_index++)
{
var analysis_pump = analysis_pump_list[analysis_pump_index];
var curveQH = JsonHelper.Json2Object(analysis_pump.CurveQH);
var curveQP = JsonHelper.Json2Object(analysis_pump.CurveQP);
var bol = curveQH.GetMinMaxPointY(out double maxY, out double minY);
if (!bol)
throw new Exception("曲线异常");
decimal max_head = (decimal)Math.Ceiling(maxY);
decimal min_head = (decimal)Math.Floor(minY);
decimal head_space = 0.01m;
var current_list_count = (int)((max_head - min_head) / head_space) + 1;
var current_analysis_conclusion_list = new List(current_list_count);
for (decimal head = min_head; head <= max_head; head += head_space)
{
var flow = curveQH.GetInterPointLastX((double)head) ?? 0;
if (flow < 1)
{
continue;
}
double differV = 0;
if (pump.Oc != null)
{
differV = PumpCalculateHelper.CalculateOtherPress(flow, pump.Ic, pump.Oc, null, null);
}
var analysis_conclusion = new Entity.AnalysisParameter();
analysis_conclusion.ID = Yw.YitIdHelper.NextId();
analysis_conclusion.PumpID = analysis_pump.ID;
analysis_conclusion.Hz = analysis_pump.Hz;
analysis_conclusion.Head = (double)head;
analysis_conclusion.PressureDiff = (double)head - differV;
analysis_conclusion.Flow = flow;
analysis_conclusion.Power = curveQP.GetFitPointY(flow);
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);
analysis_conclusion.Hz = Math.Round(analysis_conclusion.Hz, 1);
analysis_conclusion.Head = Math.Round(analysis_conclusion.Head, 2);
analysis_conclusion.PressureDiff = Math.Round(analysis_conclusion.PressureDiff, 2);
analysis_conclusion.Flow = Math.Round(analysis_conclusion.Flow, 1);
analysis_conclusion.Power = Math.Round(analysis_conclusion.Power, 1);
analysis_conclusion.WP = Math.Round(analysis_conclusion.WP, 1);
analysis_conclusion.UWP = Math.Round(analysis_conclusion.UWP, 1);
current_analysis_conclusion_list.Add(analysis_conclusion);
}
analysis_conclusion_list.Add(current_analysis_conclusion_list);
}
var list = analysis_conclusion_list.SelectMany(x => x.ToList()).ToList();
InsertList(pump_index + 1, run_flag, list);
}
}
#region Expand
///
/// 圆整
///
private void Round(Entity.AnalysisParameter conclusion)
{
conclusion.Hz = Math.Round(conclusion.Hz, 1);
conclusion.Head = Math.Round(conclusion.Head, 1);
conclusion.PressureDiff = Math.Round(conclusion.PressureDiff, 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 InsertLog(string info)
{
LogHelper.Info(info);
}
///
/// 插入分析组合列表
///
public void InsertList(int index, string runFlag, List list)
{
string log;
if (list == null || !list.Any())
{
log = $"{runFlag}:下标:{index},无数据";
InsertLog(log);
return;
}
var sw = Stopwatch.StartNew();
_dal_analysis_pump.BulkInsertsEx(runFlag, list);
log = $"{runFlag}:下标:{index},数量:{list.Count},插入耗时:{sw.ElapsedMilliseconds / 1000}m";
InsertLog(log);
}
///
/// 插入分析参数列表
///
public void InsertList(int index, string runFlag, List list)
{
string log;
if (list == null || !list.Any())
{
log = $"{runFlag}:下标:{index},无数据";
InsertLog(log);
return;
}
var sw = Stopwatch.StartNew();
_dal_analysis_conclusion.BulkInsertsEx(runFlag, list);
log = $"分析进度:{runFlag},下标:{index},数量:{list.Count},插入耗时:{sw.ElapsedMilliseconds / 1000}m";
InsertLog(log);
}
#endregion
}
}
/////
///// 分析参数
/////
//public void Test_bak(List pumps)
//{
// if (pumps == null || pumps.Count < 1)
// {
// return;
// }
// _dal_analysis_conclusion.DeleteAllTable();
// for (int pump_index = 0; pump_index < pumps.Count; pump_index++)
// {
// var pump = pumps[pump_index];
// var flag = pump.Flag;
// var run_flag = RunFlagHelper.GetRunFlag(flag, pump.IsBp);
// var table_name = _dal_analysis_pump.GetTableName(run_flag);
// var analysis_pump_list = _dal_analysis_pump.GetAllByTableName(table_name);
// if (analysis_pump_list == null || !analysis_pump_list.Any())
// {
// continue;
// }
// var analysis_pump_list_count = analysis_pump_list.Count();
// var analysis_conclusion_list = new List>(analysis_pump_list_count);
// for (int analysis_pump_index = 0; analysis_pump_index < analysis_pump_list_count; analysis_pump_index++)
// {
// var analysis_pump = analysis_pump_list[analysis_pump_index];
// var curveQH = JsonHelper.Json2Object(analysis_pump.CurveQH);
// var curveQP = JsonHelper.Json2Object(analysis_pump.CurveQP);
// var bol = curveQH.GetMinMaxPointY(out double maxY, out double minY);
// if (!bol)
// throw new Exception("曲线异常");
// var min_flow = curveQH.Min;
// var max_flow = curveQH.Max;
// var min_flow_head = curveQH.GetFitPointY(min_flow);
// var max_flow_head = curveQH.GetFitPointY(max_flow);
// var min_flow_diffV = PumpCalculateHelper.CalculateOtherPress(min_flow, pump.Ic, pump.Oc, null, null);
// var max_flow_diffV = PumpCalculateHelper.CalculateOtherPress(max_flow, pump.Ic, pump.Oc, null, null);
// decimal min_flow_pressure_diff = (decimal)(min_flow_head - min_flow_diffV);
// decimal max_flow_pressure_diff = (decimal)(max_flow_head - max_flow_diffV);
// decimal pressure_space = 0.1m;
// for (decimal pressure_diff = max_flow_pressure_diff; pressure_diff < max_flow_pressure_diff; pressure_diff += pressure_space)
// {
// }
// var max_head = Math.Ceiling(maxY);
// var min_head = Math.Floor(minY);
// //var curve_max_flow= max.X;
// //var curve_min_flow= min.X;
// //var curve_max_diffV = PumpCalculateHelper.CalculateOtherPress(curve_max_flow, pump.Ic, pump.Oc, null, null);
// //var curve_min_diffV = PumpCalculateHelper.CalculateOtherPress(curve_min_flow, pump.Ic, pump.Oc, null, null);
// //var curve_max_pressure_diff = max_head - curve_max_diffV;
// //var curve_min_pressure_diff = min_head - curve_min_diffV;
// var max_diffV = PumpCalculateHelper.CalculateOtherPress(min_flow, pump.Ic, pump.Oc, null, null);
// var min_diffV = PumpCalculateHelper.CalculateOtherPress(max_flow, pump.Ic, pump.Oc, null, null);
// var max_pressure_diff = max_head - max_diffV;
// var min_pressure_diff = min_head - min_diffV;
// //max_pressure_diff = Math.Round(max_pressure_diff);
// var current_list_count = (int)((max_head - min_head) / _head_space) + 1;
// var current_analysis_conclusion_list = new List(current_list_count);
// for (double head = min_head; head <= max_head; head += _head_space)
// {
// var flow = curveQH.GetInterPointLastX(head) ?? 0;
// if (flow < 1)
// {
// continue;
// }
// double diffV = 0;
// if (pump.Oc != null)
// {
// diffV = PumpCalculateHelper.CalculateOtherPress(flow, pump.Ic, pump.Oc, null, null);
// }
// var analysis_conclusion = new Entity.AnalysisParameter();
// analysis_conclusion.ID = Yw.YitIdHelper.NextId();
// analysis_conclusion.PumpID = analysis_pump.ID;
// analysis_conclusion.Hz = analysis_pump.Hz;
// analysis_conclusion.Head = head;
// analysis_conclusion.PressureDiff = head - diffV;
// analysis_conclusion.Flow = flow;
// analysis_conclusion.Power = curveQP.GetFitPointY(flow);
// 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);
// }
// var list = analysis_conclusion_list.SelectMany(x => x.ToList()).ToList();
// InsertList(pump_index + 1, run_flag, list);
// }
//}
/////
///// 分析参数
/////
//public void AnalysisParameterBak(List pumps)
//{
// InsertLog($"开始分析泵结论!");
// if (pumps == null || pumps.Count < 1)
// {
// InsertLog("分析失败:没有泵数据!");
// return;
// }
// _dal_analysis_conclusion.DeleteAllTable();
// var analysis_pump_table_list = _dal_analysis_pump.GetAllTableName();
// if (analysis_pump_table_list == null || !analysis_pump_table_list.Any())
// {
// InsertLog($"无分析泵表!");
// return;
// }
// var flag_pump_dict = pumps.ToDictionary(x => x.Flag, x => x);
// var tableCount = analysis_pump_table_list.Count();
// InsertLog($"分析{tableCount}台泵结论!");
// for (int tableIndex = 0; tableIndex < tableCount; tableIndex++)
// {
// var table_name = analysis_pump_table_list[tableIndex];
// var analysis_pump_list = _dal_analysis_pump.GetAllByTableName(table_name);
// if (analysis_pump_list == null || !analysis_pump_list.Any())
// {
// InsertLog($"分析进度:{table_name},第{tableIndex + 1}个,分析完毕");
// continue;
// }
// var analysis_pump_list_count = analysis_pump_list.Count();
// var analysis_conclusion_list = new List>(analysis_pump_list_count);
// for (int analysis_pump_index = 0; analysis_pump_index < analysis_pump_list_count; analysis_pump_index++)
// {
// var analysis_pump = analysis_pump_list[analysis_pump_index];
// var pump = flag_pump_dict[analysis_pump.Flag];
// var curveQH = JsonHelper.Json2Object(analysis_pump.CurveQH);
// var curveQP = JsonHelper.Json2Object(analysis_pump.CurveQP);
// var bol = curveQH.GetMinMaxPointY(out double maxY, out double minY);
// if (!bol)
// return;
// var max_head = Math.Ceiling(maxY);
// var min_head = Math.Floor(minY);
// var current_list_count = (int)((max_head - min_head) / _head_space) + 1;
// var current_analysis_conclusion_list = new List(current_list_count);
// for (double head = min_head; head <= max_head; head += _head_space)
// {
// var flow = curveQH.GetInterPointLastX(head) ?? 0;
// if (flow < 1)
// {
// continue;
// }
// double differV = 0;
// if (pump.Oc != null)
// {
// differV = PumpCalculateHelper.CalculateOtherPress(flow, pump.Ic, pump.Oc, null, null);
// }
// var analysis_conclusion = new Entity.AnalysisParameter();
// analysis_conclusion.ID = Yw.YitIdHelper.NextId();
// analysis_conclusion.PumpID = analysis_pump.ID;
// analysis_conclusion.Hz = analysis_pump.Hz;
// analysis_conclusion.Head = head;
// analysis_conclusion.PressureDiff = head - differV;
// analysis_conclusion.Flow = flow;
// analysis_conclusion.Power = curveQP.GetFitPointY(flow);
// 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);
// }
// var list = analysis_conclusion_list.SelectMany(x => x.ToList()).ToList();
// var run_flag = _dal_analysis_pump.GetRunFlag(table_name);
// InsertList(tableIndex + 1, run_flag, list);
// }
//}