using IStation.Application;
|
using System.Diagnostics;
|
|
namespace IStation.Service
|
{
|
/// <summary>
|
/// 调度分析辅助类
|
/// </summary>
|
public partial class AnalysisHelper
|
{
|
private readonly decimal _frequency_def = 50m;
|
private readonly decimal _frequency_min = 25m;
|
private readonly decimal _frequency_max = 50m;
|
private readonly decimal _frequency_space = 0.2m;//频率间隔
|
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();
|
|
#region AnalysisPump
|
|
/// <summary>
|
/// 分析泵
|
/// </summary>
|
/// <param name="pumps"></param>
|
/// <param name="analysis_factor_list"></param>
|
/// <exception cref="Exception"></exception>
|
public void AnalysisPump(List<Model.Pump> pumps, List<Model.AnalysisFactor> analysis_factor_list = null)
|
{
|
InsertLog("开始分析泵组合");
|
if (pumps == null || pumps.Count < 1)
|
{
|
InsertLog("分析失败:没有泵数据!");
|
return;
|
}
|
|
var ana_pump_list = new List<AnaPump>();
|
foreach (var pump in pumps)
|
{
|
var ana_pump = new AnaPump(pump);
|
if (!ana_pump.AllowCalc)
|
{
|
throw new Exception("曲线数据异常!");
|
}
|
var ana_pump_fre_item_list = new List<AnaPumpFreItem>();
|
if (!pump.IsBp)
|
{
|
ana_pump_fre_item_list = GetAnaPumpFreItems(_frequency_def, _frequency_def, _frequency_def, _frequency_space, pump);
|
}
|
else
|
{
|
var hz_head_dev_dict = analysis_factor_list?.Where(x => x.Flag == pump.Flag)?.ToDictionary(x => x.Hz, y => y.HeadDeviation);
|
ana_pump_fre_item_list = GetAnaPumpFreItems(_frequency_def, _frequency_min, _frequency_max, _frequency_space, pump, hz_head_dev_dict);
|
}
|
|
ana_pump.AnaPumpFreItems = ana_pump_fre_item_list;
|
ana_pump_list.Add(ana_pump);
|
}
|
|
if (!ana_pump_list.Any())
|
{
|
InsertLog($"分析进度:没有泵可分析");
|
return;
|
}
|
for (int i = 0; i < ana_pump_list.Count; i++)
|
{
|
var pump = ana_pump_list[i];
|
var ana_pump_fre_items = pump.AnaPumpFreItems;
|
if (ana_pump_fre_items == null || !ana_pump_fre_items.Any())
|
continue;
|
|
var run_flag = RunFlagHelper.Get(pump.Flag, pump.IsBp);
|
InsertLog($"分析进度:第{i + 1}台泵");
|
|
var list = new List<Entity.AnalysisPump>(pump.AnaPumpFreItems.Count);
|
foreach (var freItem in ana_pump_fre_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);
|
}
|
Inserts(i + 1, run_flag, list);
|
}
|
|
InsertLog($"分析进度:{pumps.Count}台泵,分析完毕!");
|
}
|
|
|
/// <summary>
|
/// 获取分析泵变频项
|
/// </summary>
|
/// <param name="fre_def"></param>
|
/// <param name="fre_min"></param>
|
/// <param name="fre_max"></param>
|
/// <param name="fre_space"></param>
|
/// <param name="pump"></param>
|
/// <param name="hz_head_dev_dict"></param>
|
/// <returns></returns>
|
private static List<AnaPumpFreItem> GetAnaPumpFreItems(
|
decimal fre_def,
|
decimal fre_min,
|
decimal fre_max,
|
decimal fre_space,
|
Model.Pump pump,
|
Dictionary<double, double?> hz_head_dev_dict = null)
|
{
|
if (pump == null)
|
{
|
return default;
|
}
|
if (pump.CurveQH == null || pump.CurveQP == null)
|
{
|
return default;
|
}
|
|
var exist_dict = hz_head_dev_dict != null && hz_head_dev_dict.Any();
|
var list = new List<AnaPumpFreItem>();
|
for (decimal fre = fre_max; fre >= fre_min; fre -= fre_space)
|
{
|
var hz = (double)Math.Round(fre, 1);
|
var hz0 = Math.Round(hz, 0);
|
|
Curve.CurveExpress qh = pump.CurveQH, qp = pump.CurveQP;
|
if (exist_dict)
|
{
|
if (hz_head_dev_dict.ContainsKey(hz0))
|
{
|
var head_diff_factor = hz_head_dev_dict[hz0] ?? 0;
|
var add_factor_points = pump.CurveQH.DefinePoints
|
.Select(x => new Curve.CurvePoint(x.X, x.Y + head_diff_factor))
|
.ToList();
|
qh = Curve.FitHelper.BuildCurveExpress(add_factor_points, eFitType.CubicCurve);
|
}
|
}
|
var freItem = new AnaPumpFreItem();
|
freItem.Frequency = hz;
|
freItem.CurveQH = Curve.PumpCalculateHelper.CalculateSimilarQH(qh, (double)fre_def, (double)fre);
|
freItem.CurveQP = Curve.PumpCalculateHelper.CalculateSimilarQP(qp, (double)fre_def, (double)fre);
|
list.Add(freItem);
|
}
|
|
return list;
|
|
}
|
|
|
|
/// <summary>
|
/// 分析泵
|
/// </summary>
|
/// <param name="pumps"></param>
|
/// <param name="analysis_factor_list"></param>
|
/// <exception cref="Exception"></exception>
|
public void AnalysisNew(List<Model.Pump> pumps, Dictionary<int, Dictionary<int, List<CurvePoint>>> flagHzCurveDict)
|
{
|
InsertLog("开始分析泵");
|
if (pumps == null || pumps.Count < 1)
|
{
|
InsertLog("分析失败:没有泵数据!");
|
return;
|
}
|
|
var ana_pump_list = new List<AnaPump>();
|
foreach (var pump in pumps)
|
{
|
var ana_pump = new AnaPump(pump);
|
if (!ana_pump.AllowCalc)
|
{
|
throw new Exception("曲线数据异常!");
|
}
|
|
var hzCurveDict = flagHzCurveDict[pump.Flag];
|
var ana_pump_fre_item_list = new List<AnaPumpFreItem>();
|
if (!pump.IsBp)
|
{
|
ana_pump_fre_item_list = GetAnaPumpFreItems(_frequency_def, _frequency_def, _frequency_def, _frequency_space, pump, hzCurveDict);
|
}
|
else
|
{
|
ana_pump_fre_item_list = GetAnaPumpFreItems(_frequency_def, _frequency_min, _frequency_max, _frequency_space, pump, hzCurveDict);
|
}
|
|
ana_pump.AnaPumpFreItems = ana_pump_fre_item_list;
|
ana_pump_list.Add(ana_pump);
|
}
|
|
if (!ana_pump_list.Any())
|
{
|
InsertLog($"分析进度:没有泵可分析");
|
return;
|
}
|
for (int i = 0; i < ana_pump_list.Count; i++)
|
{
|
var pump = ana_pump_list[i];
|
var ana_pump_fre_items = pump.AnaPumpFreItems;
|
if (ana_pump_fre_items == null || !ana_pump_fre_items.Any())
|
continue;
|
|
var run_flag = RunFlagHelper.Get(pump.Flag, pump.IsBp);
|
InsertLog($"分析进度:第{i + 1}台泵");
|
|
var list = new List<Entity.AnalysisPump>(pump.AnaPumpFreItems.Count);
|
foreach (var freItem in ana_pump_fre_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);
|
}
|
Inserts(i + 1, run_flag, list);
|
}
|
|
InsertLog($"分析进度:{pumps.Count}台泵,分析完毕!");
|
}
|
|
/// <summary>
|
/// 获取分析泵变频项
|
/// </summary>
|
private static List<AnaPumpFreItem> GetAnaPumpFreItems(
|
decimal fre_def,
|
decimal fre_min,
|
decimal fre_max,
|
decimal fre_space,
|
Model.Pump pump,
|
Dictionary<int,List<CurvePoint>> hzCurveDict)
|
{
|
if (pump == null)
|
{
|
return default;
|
}
|
if (pump.CurveQH == null || pump.CurveQP == null)
|
{
|
return default;
|
}
|
var list = new List<AnaPumpFreItem>();
|
for (int i = (int)fre_max; i >= fre_min; i--)
|
{
|
var hz = i;
|
if (!hzCurveDict.ContainsKey(hz))
|
{
|
continue;
|
}
|
var qhHzCurve = hzCurveDict[hz];
|
for (decimal j = 1; j >= 0; j -= fre_space)
|
{
|
var fre = hz - j;
|
var qh = IStation.Curve.FitHelper.BuildCurveExpress(qhHzCurve);
|
var qp = pump.CurveQP;
|
|
var freItem = new AnaPumpFreItem();
|
freItem.Frequency = (double)fre;
|
freItem.CurveQH = Curve.PumpCalculateHelper.CalculateSimilarQH(qh, (double)hz, (double)fre);
|
freItem.CurveQP = Curve.PumpCalculateHelper.CalculateSimilarQP(qp, (double)fre_def, (double)fre);
|
list.Add(freItem);
|
}
|
|
}
|
|
return list;
|
|
}
|
|
#endregion
|
|
#region AnalysisParameter
|
|
/// <summary>
|
/// 分析参数
|
/// </summary>
|
public void AnalysisParameter(List<Model.Pump> 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.Get(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<List<Entity.AnalysisParameter>>(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<Curve.CurveExpress>(analysis_pump.CurveQH);
|
var curveQP = JsonHelper.Json2Object<Curve.CurveExpress>(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<Entity.AnalysisParameter>(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);
|
|
|
|
int digits = 1;
|
analysis_conclusion.Hz = Math.Round(analysis_conclusion.Hz, digits);
|
analysis_conclusion.Head = Math.Round(analysis_conclusion.Head, digits);
|
analysis_conclusion.PressureDiff = Math.Round(analysis_conclusion.PressureDiff, digits);
|
analysis_conclusion.Flow = Math.Round(analysis_conclusion.Flow, digits);
|
analysis_conclusion.Power = Math.Round(analysis_conclusion.Power, digits);
|
analysis_conclusion.WP = Math.Round(analysis_conclusion.WP, digits);
|
analysis_conclusion.UWP = Math.Round(analysis_conclusion.UWP, digits);
|
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();
|
Inserts(pump_index + 1, run_flag, list);
|
}
|
}
|
|
|
#endregion
|
|
#region Insert
|
|
/// <summary>
|
/// 插入日志
|
/// </summary>
|
private void InsertLog(string info)
|
{
|
AnalysisLog.Info(info);
|
}
|
|
/// <summary>
|
/// 批量插入
|
/// </summary>
|
public void Inserts(int index, string runFlag, List<Entity.AnalysisPump> 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);
|
}
|
|
/// <summary>
|
/// 批量插入
|
/// </summary>
|
public void Inserts(int index, string runFlag, List<Entity.AnalysisParameter> 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
|
|
}
|
}
|