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