From fd681339c81201ed6fb3303647ecab89e3e6c0c1 Mon Sep 17 00:00:00 2001
From: Shuxia Ning <NingShuxia0927@outlook.com>
Date: 星期三, 17 七月 2024 09:50:11 +0800
Subject: [PATCH] 调度逻辑修改,新增笛卡尔积过滤循环

---
 IStation.Service/09-hydraulic/ModeVerifyHelper.cs |  461 ++++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 291 insertions(+), 170 deletions(-)

diff --git a/IStation.Service/08-hydraulic/ModeVerifyHelper.cs b/IStation.Service/09-hydraulic/ModeVerifyHelper.cs
similarity index 65%
rename from IStation.Service/08-hydraulic/ModeVerifyHelper.cs
rename to IStation.Service/09-hydraulic/ModeVerifyHelper.cs
index 07b671a..968326e 100644
--- a/IStation.Service/08-hydraulic/ModeVerifyHelper.cs
+++ b/IStation.Service/09-hydraulic/ModeVerifyHelper.cs
@@ -7,7 +7,286 @@
     /// 妯″瀷楠岃瘉杈呭姪绫�
     /// </summary>
     public partial class ModeVerifyHelper
-    { 
+    {
+
+
+        /// <summary>
+        /// 瀹炴椂楠岃瘉
+        /// </summary>
+        /// <param name="verify_id">楠岃瘉鏍囪瘑</param>
+        /// <param name="verify_time">楠岃瘉鏃堕棿</param>
+        /// <param name="verify_file_path">楠岃瘉妯″瀷鏂囦欢</param>
+        /// <param name="zy_scada_list">ZyScada鏁版嵁鍒楄〃</param>
+        /// <param name="pump_pattern_custom_dict">鑷畾涔夋车妯″紡</param>
+        /// <returns></returns>
+        public static List<Model.HydraulicModelRecord> Verify(
+            long verify_id,
+            DateTime verify_time,
+            string verify_file_path,
+            List<Model.ZyScada> zy_scada_list,
+            Dictionary<string, double?> pump_pattern_custom_dict = null)
+        {
+            var log_title = "鍒濆鍖栭獙璇佹暟鎹�";
+            var log_msg = string.Empty;
+            if (zy_scada_list == null || !zy_scada_list.Any())
+            {
+                log_msg = "zy_scada_list 鏁版嵁涓虹┖!";
+                Log.Info(verify_id, log_title, log_msg);
+                return default;
+            }
+
+            var pump_nr_dict = GlobalHelper.ModelPumpNrDict;
+            var pattern_id_mapping_dict = GlobalHelper.ModelPatternIdMappingDict;
+            var flow_id_mapping_dict = GlobalHelper.ModelFlowIdMappingDict;
+            var pressure_id_mapping_dict = GlobalHelper.ModelPressureIdMappingDict;
+            var pressure_id_kPa_list = GlobalHelper.ModelPressureIdkPaList;
+
+            var pattern_dict = new Dictionary<string, float[]>();
+            var scada_dict = new Dictionary<string, double>();
+
+            var exist_pump_pattern_custom_dict = pump_pattern_custom_dict != null && pump_pattern_custom_dict.Any();
+
+            #region 鍒濆鍖� pattern_dict scada_dict
+
+            foreach (var zy_scada in zy_scada_list)
+            {
+                var tag = zy_scada.Code;
+                var value = zy_scada.Value;
+
+                #region Pattern
+
+                foreach (var item in pattern_id_mapping_dict)
+                {
+                    if (item.Value != tag)
+                        continue;
+                    var pattern_id = item.Key;
+                    var factor = value ?? 0;
+                    if (exist_pump_pattern_custom_dict)
+                    {
+                        if (pump_pattern_custom_dict.ContainsKey(pattern_id))
+                        {
+                            factor = pump_pattern_custom_dict[pattern_id] ?? 0;
+                        }
+                    }
+                    else
+                    {
+                        if (value.HasValue && pump_nr_dict.ContainsKey(pattern_id))
+                        {
+                            factor /= pump_nr_dict[pattern_id];
+                            factor = factor < 0 ? 0 : factor;
+                        }
+                    }
+
+                    pattern_dict.Add(pattern_id, new float[] { (float)factor });
+                }
+
+                #endregion
+
+                #region Scada
+
+                foreach (var item in flow_id_mapping_dict)
+                {
+                    if (item.Value != tag)
+                        continue;
+                    scada_dict.Add(tag, value ?? 0);
+                }
+
+                foreach (var item in pressure_id_mapping_dict)
+                {
+                    if (item.Value != tag)
+                        continue;
+                    var pressure_value = value ?? 0;
+                    if (pressure_id_kPa_list.Contains(tag))
+                    {
+                        pressure_value /= 1000;
+                    }
+                    pressure_value = IStation.Curve.PumpCalculateHelper.Mpa2M(pressure_value);
+                    scada_dict.Add(tag, pressure_value);
+                }
+                #endregion
+            }
+
+            #endregion
+
+
+            var hydraulic_record_list = Verify(verify_id, verify_time, verify_file_path, flow_id_mapping_dict, pressure_id_mapping_dict, pattern_dict, scada_dict);
+            return hydraulic_record_list;
+        }
+
+
+
+
+
+
+        /// <summary>
+        /// 瀹炴椂楠岃瘉
+        /// </summary>
+        /// <param name="verify_id">楠岃瘉鏍囪瘑</param>
+        /// <param name="verify_time">楠岃瘉鏃堕棿</param>
+        /// <param name="verify_file_path">楠岃瘉妯″瀷鏂囦欢</param>
+        /// <param name="flow_id_mapping_dict">娴侀噺Scada鏍囪瘑瀛楀吀</param>
+        /// <param name="pressure_id_mapping_dict">鍘嬪姏Scada鏍囪瘑瀛楀吀</param>
+        /// <param name="pattern_dict">妯″紡鏁版嵁</param>
+        /// <param name="scada_dict">Scada鏁版嵁</param>
+        /// <returns></returns>
+        public static List<Model.HydraulicModelRecord> Verify(
+            long verify_id,
+            DateTime verify_time,
+            string verify_file_path,
+            Dictionary<string, string> flow_id_mapping_dict,
+            Dictionary<string, string> pressure_id_mapping_dict,
+            Dictionary<string, float[]> pattern_dict,
+            Dictionary<string, double> scada_dict)
+        {
+            var log_title = "寮�濮嬮獙璇�";
+            var log_msg = string.Empty;
+            var hydraulic_record_list = new List<Model.HydraulicModelRecord>();
+            if (flow_id_mapping_dict == null || !flow_id_mapping_dict.Any())
+            {
+                log_msg = "娴侀噺鏍囩瀛楀吀涓虹┖!";
+                Log.Info(verify_id, log_title, log_msg);
+                return default;
+            }
+            if (pressure_id_mapping_dict == null || !pressure_id_mapping_dict.Any())
+            {
+                log_msg = "鍘嬪姏鏍囩瀛楀吀涓虹┖!";
+                Log.Info(verify_id, log_title, log_msg);
+                return default;
+            }
+            if (pattern_dict == null || !pattern_dict.Any())
+            {
+                log_msg = "妯″紡鏁版嵁涓虹┖!";
+                Log.Info(verify_id, log_title, log_msg);
+                return default;
+            }
+            if (scada_dict == null || !scada_dict.Any())
+            {
+                log_msg = "Scada鏁版嵁涓虹┖!";
+                Log.Info(verify_id, log_title, log_msg);
+                return default;
+            }
+
+            var err = EpanetMethods.ENopen(verify_file_path, "", "");
+            if (err != 0)
+            {
+                log_msg = err.GetMsg();
+                Log.Info(verify_id, log_title, log_msg);
+                return default;
+            }
+            err = EpanetMethods.ENopenH();
+            if (err != 0)
+            {
+                log_msg = err.GetMsg();
+                Log.Info(verify_id, log_title, log_msg);
+                return default;
+            }
+
+
+            log_title = "楠岃瘉";
+            var model_id_build = new StringBuilder(31);
+            var pattern_init = true;
+            foreach (var pattern in pattern_dict)
+            {
+                var pattern_id = pattern.Key;
+                var pattern_factor_array = pattern.Value;
+                var pattern_factor_array_count = pattern_factor_array.Length == 0 ? 1 : pattern_factor_array.Length;
+                err = EpanetMethods.ENgetpatternindex(pattern_id, out int pattern_index);
+
+                if (err != ErrorCode.Ok)
+                {
+                    pattern_init = false;
+                    log_msg = err.GetMsg();
+                    Log.Info(verify_id, log_title, log_msg);
+                    continue;
+                }
+                err = EpanetMethods.ENsetpattern(pattern_index, pattern_factor_array, pattern_factor_array_count);
+                if (err != ErrorCode.Ok)
+                {
+                    pattern_init = false;
+                    log_msg = err.GetMsg();
+                    Log.Info(verify_id, log_title, log_msg);
+                    continue;
+                }
+            }
+
+            if (!pattern_init)
+            {
+                log_msg = $"{verify_time:G}:妯″紡鍒濆鍖栧け璐�!";
+                Log.Info(verify_id, log_title, log_msg);
+                return default;
+            }
+
+            EpanetMethods.ENinitH(0);
+            EpanetMethods.ENrunH(out _);
+            EpanetMethods.ENgetcount(CountType.Link, out int link_count);
+            EpanetMethods.ENgetcount(CountType.Node, out int node_count);
+
+            for (int link_index = 1; link_index <= link_count; link_index++)
+            {
+                if (EpanetMethods.ENgetlinkid(link_index, model_id_build) != ErrorCode.Ok)
+                    continue;
+                var model_id = model_id_build.ToString();
+
+                if (flow_id_mapping_dict.ContainsKey(model_id))
+                {
+                    var scada_id = flow_id_mapping_dict[model_id];
+                    var scada_value = scada_dict[scada_id];
+                    EpanetMethods.ENgetlinkvalue(link_index, LinkValue.Flow, out float model_value);
+                    model_value = Math.Abs(model_value);
+
+                    var record = new IStation.Model.HydraulicModelRecord
+                    {
+                        VerificationID = verify_id,
+                        Time = verify_time,
+                        ModelId = model_id,
+                        ScadaId = scada_id,
+                        ValueType = IStation.eValueType.Flow,
+                        ModelValue = (double)model_value,
+                        ScadaValue = scada_value
+                    };
+                    record.DifferenceValue = record.ScadaValue - record.ModelValue;
+                    hydraulic_record_list.Add(record);
+                }
+
+                EpanetMethods.ENgetlinktype(link_index, out LinkType linkType);
+                if (linkType == LinkType.Pump)
+                {
+                    EpanetMethods.ENgetlinkvalue(link_index, LinkValue.InitStatus, out float on_off);
+                }
+            }
+
+            for (int node_index = 1; node_index <= node_count; node_index++)
+            {
+                if (EpanetMethods.ENgetnodeid(node_index, model_id_build) != ErrorCode.Ok)
+                    continue;
+                var model_id = model_id_build.ToString();
+
+                if (pressure_id_mapping_dict.ContainsKey(model_id))
+                {
+                    var scada_id = pressure_id_mapping_dict[model_id];
+                    var scada_value = scada_dict[scada_id];
+
+                    EpanetMethods.ENgetnodevalue(node_index, NodeValue.Head, out float model_value);
+
+                    var record = new IStation.Model.HydraulicModelRecord
+                    {
+                        VerificationID = verify_id,
+                        Time = verify_time,
+                        ModelId = model_id,
+                        ScadaId = scada_id,
+                        ValueType = IStation.eValueType.Head,
+                        ModelValue = (double)model_value,
+                        ScadaValue = scada_value
+                    };
+                    record.DifferenceValue = record.ScadaValue - record.ModelValue;
+                    hydraulic_record_list.Add(record);
+                }
+            }
+
+            EpanetMethods.ENcloseH();
+            return hydraulic_record_list;
+        }
+
 
         /// <summary>
         /// 鍘嗗彶鏁版嵁楠岃瘉
@@ -62,7 +341,7 @@
 
             log_title = "楠岃瘉";
             var model_time_step = 0;
-            var model_id_build = new StringBuilder(31); 
+            var model_id_build = new StringBuilder(31);
             foreach (var day_value in day_value_list)
             {
                 var pattern_list = day_value.PatternList;
@@ -133,11 +412,11 @@
                                 record.ModelId = model_id;
                                 record.ScadaId = scada_id;
                                 record.ValueType = IStation.eValueType.Flow;
-                                record.ModeValue = (double)model_value;
+                                record.ModelValue = (double)model_value;
                                 record.ScadaValue = scada_value;
-                                if (record.ModeValue.HasValue)
-                                    record.ModeValue = Math.Abs(record.ModeValue.Value);
-                                record.DifferenceValue = record.ScadaValue -  record.ModeValue;
+                                if (record.ModelValue.HasValue)
+                                    record.ModelValue = Math.Abs(record.ModelValue.Value);
+                                record.DifferenceValue = record.ScadaValue - record.ModelValue;
                                 hydraulic_record_list.Add(record);
                             }
                         }
@@ -146,7 +425,7 @@
                         {
                             if (EpanetMethods.ENgetnodeid(node_index, model_id_build) != ErrorCode.Ok)
                                 continue;
-                            var model_id = model_id_build.ToString(); 
+                            var model_id = model_id_build.ToString();
                             if (pressure_id_mapping_dict.ContainsKey(model_id))
                             {
                                 var scada_id = pressure_id_mapping_dict[model_id];
@@ -160,11 +439,11 @@
                                 record.ModelId = model_id;
                                 record.ScadaId = scada_id;
                                 record.ValueType = IStation.eValueType.Head;
-                                record.ModeValue = (double)model_value;
+                                record.ModelValue = (double)model_value;
                                 record.ScadaValue = scada_value;
-                                if (record.ModeValue.HasValue)
-                                    record.ModeValue = Math.Abs(record.ModeValue.Value);
-                                record.DifferenceValue = record.ScadaValue - record.ModeValue;
+                                if (record.ModelValue.HasValue)
+                                    record.ModelValue = Math.Abs(record.ModelValue.Value);
+                                record.DifferenceValue = record.ScadaValue - record.ModelValue;
                                 hydraulic_record_list.Add(record);
                             }
                         }
@@ -177,166 +456,8 @@
             EpanetMethods.ENcloseH();
             return hydraulic_record_list;
         }
-         
-        /// <summary>
-        /// 瀹炴椂楠岃瘉
-        /// </summary>
-        /// <param name="verify_id">楠岃瘉鏍囪瘑</param>
-        /// <param name="file_path">鏂囦欢</param>
-        /// <param name="flow_id_mapping_dict">娴侀噺Scada鏍囪瘑瀛楀吀</param>
-        /// <param name="pressure_id_mapping_dict">鍘嬪姏Scada鏍囪瘑瀛楀吀</param>
-        /// <param name="pattern_list"></param>
-        /// <param name="time_value">楠岃瘉鏁版嵁</param>
-        /// <returns></returns>
-        public static List<Model.HydraulicModelRecord> Verify(long verify_id, string file_path, Dictionary<string, string> flow_id_mapping_dict, Dictionary<string, string> pressure_id_mapping_dict, List<Pattern> pattern_list, TimeValue time_value)
-        {
-            var log_title = "鍒濆鍖�";
-            var log_msg = string.Empty;
-            var hydraulic_record_list = new List<Model.HydraulicModelRecord>();
-            if (flow_id_mapping_dict == null || !flow_id_mapping_dict.Any())
-            {
-                log_msg = "娴侀噺鏍囩瀛楀吀涓虹┖!";
-                Log.Info(verify_id, log_title, log_msg);
-                return default;
-            }
-            if (pressure_id_mapping_dict == null || !pressure_id_mapping_dict.Any())
-            {
-                log_msg = "鍘嬪姏鏍囩瀛楀吀涓虹┖!";
-                Log.Info(verify_id, log_title, log_msg);
-                return default;
-            }
-            if (pattern_list == null || !pattern_list.Any())
-            {
-                log_msg = "妯″紡鏁版嵁涓虹┖!";
-                Log.Info(verify_id, log_title, log_msg);
-                return default;
-            }
-            if (time_value == null)
-            {
-                log_msg = "楠岃瘉鏁版嵁涓虹┖!";
-                Log.Info(verify_id, log_title, log_msg);
-                return default;
-            }
 
-            var err = EpanetMethods.ENopen(file_path, "", "");
-            if (err != 0)
-            {
-                log_msg = err.GetMsg();
-                Log.Info(verify_id, log_title, log_msg);
-                return default;
-            }
-            err = EpanetMethods.ENopenH();
-            if (err != 0)
-            {
-                log_msg = err.GetMsg();
-                Log.Info(verify_id, log_title, log_msg);
-                return default;
-            }
-
-           
-            log_title = "楠岃瘉";
-            var model_id_build = new StringBuilder(31); 
-            var pattern_init = true;
-            foreach (var pattern in pattern_list)
-            {
-                var pattern_id = pattern.Id;
-                var pattern_factor_array = pattern.FactorList.ToArray();
-                var pattern_factor_array_count = pattern_factor_array.Length == 0 ? 1 : pattern_factor_array.Length;
-                err = EpanetMethods.ENgetpatternindex(pattern_id, out int pattern_index);
-
-                if (err != ErrorCode.Ok)
-                {
-                    pattern_init = false;
-                    log_msg = err.GetMsg();
-                    Log.Info(verify_id, log_title, log_msg);
-                    continue;
-                }
-                err = EpanetMethods.ENsetpattern(pattern_index, pattern_factor_array, pattern_factor_array_count);
-                if (err != ErrorCode.Ok)
-                {
-                    pattern_init = false;
-                    log_msg = err.GetMsg();
-                    Log.Info(verify_id, log_title, log_msg);
-                    continue;
-                }
-            }
-
-            if (!pattern_init)
-            {
-                log_msg = $"{time_value.Time:G}:妯″紡鍒濆鍖栧け璐�!";
-                Log.Info(verify_id, log_title, log_msg);
-                return default;
-            }
-
-            EpanetMethods.ENinitH(0);
-            EpanetMethods.ENrunH(out _);
-            EpanetMethods.ENgetcount(CountType.Link, out int link_count);
-            EpanetMethods.ENgetcount(CountType.Node, out int node_count);
-
-            var time = time_value.Time;
-            var scada_value_dcit = time_value.Value;
-            for (int link_index = 1; link_index <= link_count; link_index++)
-            {
-                if (EpanetMethods.ENgetlinkid(link_index, model_id_build) != ErrorCode.Ok)
-                    continue;
-                var model_id = model_id_build.ToString();
-
-
-                if (flow_id_mapping_dict.ContainsKey(model_id))
-                {
-                    var scada_id = flow_id_mapping_dict[model_id];
-                    var scada_value = scada_value_dcit[scada_id];
-                    EpanetMethods.ENgetlinkvalue(link_index, LinkValue.Flow, out float model_value);
-                    model_value = Math.Abs(model_value);
-
-                    var record = new IStation.Model.HydraulicModelRecord();
-                    record.VerificationID = verify_id;
-                    record.Time = time;
-                    record.ModelId = model_id;
-                    record.ScadaId = scada_id;
-                    record.ValueType = IStation.eValueType.Flow;
-                    record.ModeValue = (double)model_value;
-                    record.ScadaValue = scada_value;
-                    record.DifferenceValue = record.ScadaValue - record.ModeValue;
-                    hydraulic_record_list.Add(record);
-                }
-
-                EpanetMethods.ENgetlinktype(link_index, out LinkType linkType);
-                if (linkType == LinkType.Pump)
-                {
-                    EpanetMethods.ENgetlinkvalue(link_index, LinkValue.InitStatus, out float on_off);
-                }
-            }
-
-            for (int node_index = 1; node_index <= node_count; node_index++)
-            {
-                if (EpanetMethods.ENgetnodeid(node_index, model_id_build) != ErrorCode.Ok)
-                    continue;
-                var model_id = model_id_build.ToString();
-
-                if (pressure_id_mapping_dict.ContainsKey(model_id))
-                {
-                    var scada_id = pressure_id_mapping_dict[model_id];
-                    var scada_value = scada_value_dcit[scada_id];
-                     
-                    EpanetMethods.ENgetnodevalue(node_index, NodeValue.Head, out float model_value); 
-
-                    var record = new IStation.Model.HydraulicModelRecord();
-                    record.VerificationID = verify_id;
-                    record.Time = time;
-                    record.ModelId = model_id;
-                    record.ScadaId = scada_id;
-                    record.ValueType = IStation.eValueType.Head;
-                    record.ModeValue = (double)model_value;
-                    record.ScadaValue = scada_value;
-                    record.DifferenceValue = record.ScadaValue - record.ModeValue;
-                    hydraulic_record_list.Add(record);
-                }
-            }
-
-            EpanetMethods.ENcloseH();
-            return hydraulic_record_list;
-        }
 
     }
+
 }

--
Gitblit v1.9.3