From a484f1d6af2347471253cc24b44f3dd0bcda62af Mon Sep 17 00:00:00 2001 From: ningshuxia <ningshuxia0927@outlook.com> Date: 星期二, 06 五月 2025 17:33:20 +0800 Subject: [PATCH] 代码修改 --- 01-api/Service/IStation.Service/07-helper/02-schedule/ScheduleHelper.cs | 256 +++++++++++++++++++-------------------------------- 1 files changed, 96 insertions(+), 160 deletions(-) diff --git a/01-api/Service/IStation.Service/07-helper/02-schedule/ScheduleHelper.cs b/01-api/Service/IStation.Service/07-helper/02-schedule/ScheduleHelper.cs index a84a5a7..7f49d90 100644 --- a/01-api/Service/IStation.Service/07-helper/02-schedule/ScheduleHelper.cs +++ b/01-api/Service/IStation.Service/07-helper/02-schedule/ScheduleHelper.cs @@ -1,6 +1,4 @@ -锘縰sing IStation.Model; - -namespace IStation.Service +锘縩amespace IStation.Service { /// <summary> /// 璋冨害鍒嗘瀽杈呭姪绫� @@ -19,7 +17,6 @@ } public int Flag { get; set; } } - #endregion #region Private Variable @@ -28,41 +25,44 @@ private readonly decimal _frequency_max = 50; private readonly decimal _frequency_space = 1;//棰戠巼闂撮殧 - private readonly double _start_stop_loss_coefficient = 0.95;//娉靛惎鍋滄崯澶辩郴鏁� + private readonly double _start_stop_loss_coefficient = 0.9;//娉靛惎鍋滄崯澶辩郴鏁� private double _sel_opt_flow_excess = 1;//鍙�夋柟妗堢殑娴侀噺浣欓噺 private readonly double _sel_opt_pump_pressure_excess = 0;//鍙�夋柟妗堢殑鍗曟车鎵▼榛樿鎶崌浣欓噺 + private double _station_target_flow_diff = 0; // 绔欑偣鐩爣娴侀噺宸�� - private readonly double _sel_opt_flow_deviation_ratio = 0.05;//鍙�夋柟妗堢殑娴侀噺鍋忓樊姣� + + private readonly double _sel_opt_flow_deviation_ratio = 0.08;//鍙�夋柟妗堢殑娴侀噺鍋忓樊姣� private readonly double _sel_opt_reasonable_flow_deviation_ratio = 0.005;//鍚堢悊鐨勬柟妗堢殑娴侀噺鍋忓樊姣� - private readonly Service.AnalysisParameter _service_analysis_conclusion = new(); - private readonly Service.AnalysisDeviation _service_analysis_deviation = new(); - private readonly Service.AnalysisFactor _service_analysis_factor = new(); + private readonly Service.AnalysisParameter _service_analysis_parameter = new(); private int _min_open_count;//鏈�灏忓紑娉垫暟閲� private int _max_open_count;//鏈�澶у紑娉垫暟閲� private List<int> _current_open_flag_list = null;// 褰撳墠寮�娉靛垪琛� private List<int> _must_open_flag_list = null; // 蹇呭紑娉靛垪琛� - private List<int> _must_close_flag_list = null; // 蹇呭叧娉靛垪琛� + private List<int> _must_close_flag_list = null; // 蹇呭叧娉靛垪琛� private List<List<int>> _forbidden_flag_combine_list = null; // 绂佺敤娉电粍鍚� private List<List<int>> _associative_flag_combine_list = null; // 鍏宠仈娉电粍鍚� private List<List<int>> _same_section_flag_combine_list = null; // 鍚屾娉电粍鍚� private List<Model.WaterSupplyLimit> _water_supply_limit_list = null; //渚涙按闄愬埗鍒楄〃 private List<Model.FrequencyLimit> _frequency_limit_list = null; // 棰戠巼闄愬埗鍒楄〃 private Dictionary<int, double> _flag_cumulative_runtime_dict = null; // 娉电疮璁¤繍琛屾椂闀垮瓧鍏� + private List<int> _priority_open_flag_list = null; // 浼樺厛寮�娉靛垪琛� + private List<int> _maintenance_flag_list = null; // 妫�淇垪琛� - + private List<Model.AnalysisDeviation> _analysis_deviation_list = null;//鍒嗘瀽鍋忓樊 + + #endregion /// <summary> /// 鍒濆鍖� /// </summary> - public void Initial(List<int> current_open_flag_list, Model.ScheduleConfig schedule_config, List<Model.AnalysisDeviation> analysis_deviation_list) + public void Initial(List<int> current_open_flag_list, Model.ScheduleConfig schedule_config, List<Model.AnalysisDeviation> analysis_deviation_list, double station_target_flow_diff = 0) { - _current_open_flag_list = current_open_flag_list; _min_open_count = 1; _max_open_count = 0; @@ -74,6 +74,9 @@ _water_supply_limit_list = null; _frequency_limit_list = null; _flag_cumulative_runtime_dict = null; + _priority_open_flag_list = null; + _maintenance_flag_list = null; + _station_target_flow_diff = 0; if (schedule_config != null) { _min_open_count = schedule_config.MinOpenCount; @@ -86,15 +89,16 @@ _water_supply_limit_list = schedule_config.WaterSupplyLimitList; _frequency_limit_list = schedule_config.FrequencyLimitList; _flag_cumulative_runtime_dict = schedule_config.FlagCumulativeRuntimeDict; + _priority_open_flag_list = schedule_config.PriorityOpenFlagList; + _maintenance_flag_list = schedule_config.MaintenanceFlagList; } _analysis_deviation_list = analysis_deviation_list; - + _station_target_flow_diff = station_target_flow_diff; } #region OptAnaCombine - /// <summary> /// 鑾峰彇鏈�浼樼粍鍚� @@ -106,13 +110,14 @@ /// <returns></returns> public AnaCombine GetOptAnaCombine ( - List<Model.Pump> pump_list, + List<Model.Pump> pump_list, Dictionary<int, double> flag_inlet_water_level_dict, double target_flow, double target_pressure ) { - + //鑾峰彇鏂规鏃剁敤琛ュ樊鐨勬祦閲忥紝渚涙按闄愬埗鐢ㄧ洰鏍囨祦閲忓垽鏂� + var target_flow_compensation = target_flow + _station_target_flow_diff; #region 鍒濆鍖栧弬鏁� if (pump_list == null || !pump_list.Any()) { @@ -130,6 +135,8 @@ var water_supply_limit_list = _water_supply_limit_list; var frequency_limit_list = _frequency_limit_list; var flag_cumulative_runtime_dict = _flag_cumulative_runtime_dict; + var priority_open_flag_list = _priority_open_flag_list; + var maintenance_flag_list = _maintenance_flag_list; var pump_bp_dict = pump_list.ToDictionary(x => x.Flag, x => x.IsBp); var pump_nr_dict = pump_list.ToDictionary(x => x.Flag, x => x.Nr); @@ -138,6 +145,7 @@ var combine_merit_ratio = 1d;//缁勫悎鎷╀紭鐜� target_flow = Math.Round(target_flow, 1); + target_flow_compensation = Math.Round(target_flow_compensation,1); target_pressure = Math.Round(target_pressure, 1); #endregion @@ -192,6 +200,10 @@ { var water_supply_min = water_supply_limit_list.Min(x => x.Min); var water_supply_max = water_supply_limit_list.Max(x => x.Max); + +#if DEBUG + water_supply_min = 0; +#endif if (target_flow < water_supply_min || target_flow > water_supply_max) { return default; @@ -221,6 +233,24 @@ } #endregion + #region 瀛樺湪-浼樺厛寮�娉靛垪琛� + + var priority_open_flag_list_remark = string.Empty; + var exist_priority_open_flag_list = priority_open_flag_list != null && priority_open_flag_list.Count > 0; + if (exist_priority_open_flag_list) + { + priority_open_flag_list = priority_open_flag_list.OrderBy(x => x).ToList(); + priority_open_flag_list_remark = IntListHelper.ToString(priority_open_flag_list); + } + + #endregion + + #region 瀛樺湪-妫�淇垪琛� + + var exist_maintenance_flag_list = maintenance_flag_list != null && maintenance_flag_list.Count > 0; + + #endregion + #region 瀛樺湪-褰撳墠寮�娉靛垪琛� (鏄惁鍒囨车) var exist_current_open_flag_list = current_open_flag_list != null && current_open_flag_list.Count > 0; @@ -235,7 +265,7 @@ { if (target_flow < limit.Min || target_flow > limit.Max) { - exist_limit = true; + exist_limit = true; } } } @@ -250,15 +280,16 @@ pump_bp_dict, exist_frequency_limit_list, frequency_limit_flag_dict, - target_flow, + target_flow_compensation, target_pressure ); - if (opt_ana_combine != null) + if (opt_ana_combine != null) return opt_ana_combine; } } #endregion + #endregion @@ -318,7 +349,6 @@ if (exist_intersected) continue; } - //绂佺敤缁勫悎 if (exist_forbidden_flag_combine_list) @@ -404,6 +434,24 @@ } } + //浼樺厛寮�娉靛垪琛� + if (exist_priority_open_flag_list) + { + //鐩墠閫昏緫 浼樺厛寮�娉�==蹇呭紑鏂规 + var combine_remark = IntListHelper.ToString(combine.OrderBy(x => x)); + if (!combine_remark.Contains(priority_open_flag_list_remark)) + continue; + } + + //妫�淇垪琛� + if (exist_maintenance_flag_list) + { + var exist_intersected = combine.Intersect(maintenance_flag_list).Count() > 0; + if (exist_intersected) + continue; + } + + #endregion var total_loss_ratio = Math.Pow(_start_stop_loss_coefficient, start_stop_count);//鍚仠涓�娆℃崯澶变簺鑳借�� @@ -418,7 +466,7 @@ pump_bp_dict, exist_frequency_limit_list, frequency_limit_flag_dict, - target_flow, + target_flow_compensation, target_pressure ); if (opt_ana_combine == null) @@ -426,11 +474,12 @@ opt_ana_combine_list.Add(opt_ana_combine); } + // 20250422 娉ㄩ噴鍘熷洜锛氫緵姘磋寖鍥翠細鏈夐噸鍙狅紝鑰冭檻鍒囨车鎿嶄綔 //濡傛灉褰撳墠寰幆宸茬粡婊¤冻锛屼笉闇�瑕佸啀鍔犳车 - if (opt_ana_combine_list.Any()) - { - break; - } + //if (opt_ana_combine_list.Any()) + //{ + // break; + //} } if (opt_ana_combine_list.Count < 1) @@ -477,7 +526,6 @@ //鍏堜慨姝g粍鍚堟洸绾垮拰妯″瀷鐨勫亸宸壃绋� var combine_deviation_factor_dict = GetCombineDeviationFactorDict(target_flow, combine); - var conclusion_ex_list_list = new List<List<AnalysisConclusionViewModel>>(); var conclusion_ex_list_dict = new Dictionary<int, List<AnalysisConclusionViewModel>>(); double max_supply_flow = 0; @@ -490,7 +538,8 @@ //缁勫悎鍋忓樊绯绘暟 var combine_deviation_factor = combine_deviation_factor_dict[flag]; - var current_pressure_diff = target_pressure - inlet_water_level + combine_deviation_factor + _sel_opt_pump_pressure_excess; + var current_pressure_diff = target_pressure - inlet_water_level - combine_deviation_factor + _sel_opt_pump_pressure_excess; + current_pressure_diff = Math.Round(current_pressure_diff, 1); //棰戠巼闄愬埗 @@ -498,19 +547,29 @@ if (exist_frequency_limit_list && frequency_limit_flag_dict.ContainsKey(flag)) { var limit = frequency_limit_flag_dict[flag]; - conclusion_list = _service_analysis_conclusion.GetList(run_flag, limit.Min, limit.Max, current_pressure_diff); + conclusion_list = _service_analysis_parameter.GetList(run_flag, limit.Min, limit.Max, current_pressure_diff); } else { + //瀹氶娉� 鍙兘鏈�灏忓帇宸秴杩囩洰鏍囧帇宸� - var min_pressure_diff_conclusion = _service_analysis_conclusion.GetMinPressureDiff(run_flag); + var min_pressure_diff_conclusion = _service_analysis_parameter.GetMinPressureDiff(run_flag); if (min_pressure_diff_conclusion != null && min_pressure_diff_conclusion.PressureDiff > current_pressure_diff) { conclusion_list = new List<Model.AnalysisParameter>() { min_pressure_diff_conclusion }; } else { - conclusion_list = _service_analysis_conclusion.GetList(run_flag, current_pressure_diff); + var is_bp = pump_bp_dict[flag]; + if (is_bp) + { + conclusion_list = _service_analysis_parameter.GetList(run_flag, current_pressure_diff); + } + else + { + var list = _service_analysis_parameter.GetList(run_flag); + conclusion_list = _service_analysis_parameter.GetList(run_flag, current_pressure_diff); + } } } if (conclusion_list == null || !conclusion_list.Any()) @@ -526,18 +585,15 @@ if (conclusion_ex_list_list.Count != combine.Count()) return default; - //var excess = target_flow * 0.9995; - if (max_supply_flow < target_flow * _sel_opt_flow_excess) { if (GlobalHelper.IsStation1(combine)) { - _sel_opt_flow_excess= 0.995; + _sel_opt_flow_excess = 0.97; } var flow_excess = target_flow * _sel_opt_flow_excess; if (max_supply_flow < flow_excess) return default; - } var opt_ana_combine = GetOptAnaCombine(conclusion_ex_list_dict, pump_nr_dict, pump_bp_dict, target_flow); @@ -678,7 +734,7 @@ } if (!ana_combine_list.Any()) return default; - var opt_ana_combine = ana_combine_list.OrderBy(x => x.TotalPower).First(); + var opt_ana_combine = ana_combine_list.OrderBy(x => x.TotalFlow).OrderBy(x => x.TotalPower).First(); return opt_ana_combine; } @@ -904,10 +960,6 @@ return deviation_factor_dict; } - if (GlobalHelper.IsStation2(flags)) - { - - } var a = flow; var flow_dev = flow; Model.AnalysisDeviation analysis_deviation = null; @@ -917,8 +969,8 @@ analysis_deviation = analysis_deviation_list.Where(x => x.MinFlow <= flow_dev && flow_dev <= x.MaxFlow).FirstOrDefault(); if (analysis_deviation != null) break; - } - + } + if (analysis_deviation == null) { Yw.LogHelper.Error($"[{Yw.Untity.IntListHelper.ToString(flags)}]缁勫悎涓嶅瓨鍦ㄥ亸宸郴鏁�!"); @@ -941,7 +993,7 @@ #endregion #region Expand - + /// <summary> /// 鑾峰彇鍙橀娉靛垪琛� 鏍规嵁宸ュ喌璁$畻 /// </summary> @@ -1028,123 +1080,7 @@ return ana_fre_pump_list; } - /// <summary> - /// 鑾峰彇鍙橀娉靛垪琛� 鏍规嵁宸ュ喌璁$畻 - /// </summary> - /// <param name="pumps"></param> - /// <param name="flag_rpm_dic"></param> - /// <param name="flag_inlet_water_level_dict"></param> - /// <param name="flag_flow_dic"></param> - /// <param name="flag_head_dic"></param> - /// <param name="flag_curve_head_dic"></param> - /// <param name="total_flow"></param> - /// <param name="ues_deviation_factor"></param> - /// <returns></returns> - public List<AnaFrePump> GetAnaFrePumpListByWorking( - List<Model.Pump> pumps, - Dictionary<int, double> flag_rpm_dic, - Dictionary<int, double> flag_inlet_water_level_dict, - Dictionary<int, double> flag_flow_dic, - Dictionary<int, double> flag_head_dic, - double total_flow, - out Dictionary<int, double> flag_curve_head_dic, - bool ues_deviation_factor = false - ) - { - flag_curve_head_dic = new Dictionary<int, double>(); - if (pumps == null || !pumps.Any()) - { - return default; - } - - if (flag_rpm_dic == null || !flag_rpm_dic.Any()) - { - return default; - } - - var run_flag_list = flag_rpm_dic.Where(x => x.Value > 1).Select(x => x.Key).OrderBy(x => x).ToList(); - var ana_fre_pump_list = new List<AnaFrePump>(); - foreach (var flag in run_flag_list) - { - var pump = pumps.Find(x => x.Flag == flag); - if (pump == null) - continue; - var rpm = flag_rpm_dic[flag]; - if (rpm < 1) - continue; - - var hz = Math.Round(rpm / pump.Nr * 50, 1); - - - var CurveQH50 = pump.CurveQH; - var CurveQP50 = pump.CurveQP; - //if (ues_deviation_factor) - //{ - - // var factor = _service_analysis_factor.GetByFlagAndHz(flag, hz); - // var head_diff_factor = 0d; - // if (factor != null) - // { - // head_diff_factor = factor.HeadDeviation ?? 0; - // } - - // var def_points = CurveQH50.DefinePoints.Select(x => new IStation.Curve.CurvePoint(x.X, x.Y + head_diff_factor)).ToList(); - // var update_curve = IStation.Curve.FitHelper.BuildCurveExpress(def_points, eFitType.FourM); - // CurveQH50 = update_curve; - //} - - - var curveQH = Curve.PumpCalculateHelper.CalculateSimilarQH(CurveQH50, pump.Nr, rpm); - var curveQP = Curve.PumpCalculateHelper.CalculateSimilarQP(CurveQP50, pump.Nr, rpm); - - double flow = 0, head = 0; - if (flag_head_dic != null && flag_head_dic.ContainsKey(pump.Flag)) - { - head = flag_head_dic[pump.Flag]; - } - - if (flag_inlet_water_level_dict != null && flag_inlet_water_level_dict.ContainsKey(pump.Flag)) - { - head -= flag_inlet_water_level_dict[pump.Flag]; - } - - if (ues_deviation_factor) - { - //var combine_deviation_factor_dict = GetCombineDeviationFactorDict(total_flow, run_flag_list);//淇缁勫悎鏇茬嚎鍜屾ā鍨嬬殑鍋忓樊鎵▼ - //if (combine_deviation_factor_dict != null && combine_deviation_factor_dict.ContainsKey(flag)) - //{ - // var combine_deviation_factor = combine_deviation_factor_dict[flag]; //缁勫悎鍋忓樊绯绘暟 - // head -= combine_deviation_factor; - //} - } - - flow = curveQH.GetInterPointLastX(head) ?? 0; - if (flow < 0) - continue; - - var working_flow = flag_flow_dic[flag]; - flag_curve_head_dic[flag] = curveQH.GetFitPointY(working_flow); - - var fre_pump = new AnaFrePump(); - fre_pump.Flag = flag; - fre_pump.Flow = flow; - fre_pump.Head = head; - fre_pump.Power = curveQP.GetFitPointY(flow); - fre_pump.PressureDiff = head - Curve.PumpCalculateHelper.CalculateOtherPress(flow, pump.Ic, pump.Oc, null, null); - fre_pump.Eff = Curve.PumpCalculateHelper.CalculateE(fre_pump.Flow, fre_pump.Head, fre_pump.Power); - fre_pump.Frequency = rpm / pump.Nr * 50; - fre_pump.Speed = rpm; - - ana_fre_pump_list.Add(fre_pump); - } - - - return ana_fre_pump_list; - } - - - - #endregion + #endregion } } -- Gitblit v1.9.3