using IStation.Application; using System.Diagnostics; namespace IStation.Service { /// /// 调度分析辅助类 /// 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.1m;//频率间隔 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 /// /// 分析泵 /// /// /// /// public void AnalysisPump(List pumps, List analysis_factor_list=null) { InsertLog("开始分析泵组合"); if (pumps == null || pumps.Count < 1) { InsertLog("分析失败:没有泵数据!"); return; } var ana_pump_list = new List(); 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(); 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(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}台泵,分析完毕!"); } /// /// 获取分析泵变频项 /// /// /// /// /// /// /// /// private static List GetAnaPumpFreItems( decimal fre_def, decimal fre_min, decimal fre_max, decimal fre_space, Model.Pump pump, Dictionary 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(); 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; } #endregion #region AnalysisParameter /// /// 分析参数 /// 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.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>(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); 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 /// /// 插入日志 /// private void InsertLog(string info) { AnalysisLog.Info(info); } /// /// 批量插入 /// public void Inserts(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 Inserts(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 } }