From 8f15f93b380fac12676487603297e3cc32f377f8 Mon Sep 17 00:00:00 2001
From: Shuxia Ning <NingShuxia0927@outlook.com>
Date: 星期一, 29 七月 2024 17:51:32 +0800
Subject: [PATCH] 更新 调度验证界面

---
 IStation.Service/09-hydraulic/ModeVerifyHelper.cs |  261 ++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 203 insertions(+), 58 deletions(-)

diff --git a/IStation.Service/09-hydraulic/ModeVerifyHelper.cs b/IStation.Service/09-hydraulic/ModeVerifyHelper.cs
index 968326e..ab1d828 100644
--- a/IStation.Service/09-hydraulic/ModeVerifyHelper.cs
+++ b/IStation.Service/09-hydraulic/ModeVerifyHelper.cs
@@ -114,10 +114,6 @@
         }
 
 
-
-
-
-
         /// <summary>
         /// 瀹炴椂楠岃瘉
         /// </summary>
@@ -288,20 +284,136 @@
         }
 
 
+
         /// <summary>
         /// 鍘嗗彶鏁版嵁楠岃瘉
         /// </summary>
         /// <param name="verify_id">楠岃瘉鏍囪瘑</param>
-        /// <param name="file_path">鏂囦欢</param>
+        /// <param name="verify_file_path">楠岃瘉妯″瀷鏂囦欢</param>
+        /// <param name="zy_scada_day_dict">ZyScada鏁版嵁鍒楄〃</param> 
+        /// <returns></returns>
+        public static Dictionary<DateTime, List<Model.HydraulicModelRecord>> Verify(
+            long verify_id,
+            string verify_file_path,
+            Dictionary<DateTime, Dictionary<DateTime, List<Model.ZyScada>>> zy_scada_day_dict)
+        {
+            var log_title = "鍒濆鍖栭獙璇佹暟鎹�";
+            var log_msg = string.Empty;
+            if (zy_scada_day_dict == null || !zy_scada_day_dict.Any())
+            {
+                log_msg = "zy_scada_day_dict 鏁版嵁涓虹┖!";
+                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 day_value_dict = new Dictionary<DateTime, Tuple<Dictionary<string, float[]>, Dictionary<DateTime, Dictionary<string, double>>>>();
+            foreach (var day_item in zy_scada_day_dict)
+            {
+                var day = day_item.Key;
+                var zy_scada_list_dict = day_item.Value;
+
+                var pattern_list_dict = new Dictionary<string, List<float>>();
+                foreach (var item in pattern_id_mapping_dict)
+                {
+                    pattern_list_dict.Add(item.Key, new List<float>());
+                }
+
+
+                var scada_dict_dict = new Dictionary<DateTime, Dictionary<string, double>>();
+
+                #region 鍒濆鍖� pattern_dict scada_dict 
+                for (int i = 0; i < zy_scada_list_dict.Count; i++)
+                {
+                    var item = zy_scada_list_dict.ElementAt(i);
+                    var time = item.Key;
+                    var zy_scada_list = item.Value;  
+
+                    var scada_dict = new Dictionary<string, double>();
+                    foreach (var zy_scada in zy_scada_list)
+                    {
+                        var tag = zy_scada.Code;
+                        var value = zy_scada.Value;
+
+                        #region Pattern  
+                        foreach (var mapping in pattern_id_mapping_dict)
+                        {
+                            if (mapping.Value != tag)
+                                continue;
+                            var pattern_id = mapping.Key;
+                            var factor = value ?? 0;
+
+                            if (value.HasValue && pump_nr_dict.ContainsKey(pattern_id))
+                            {
+                                factor /= pump_nr_dict[pattern_id];
+                                factor = factor < 0 ? 0 : factor;
+                            } 
+                            pattern_list_dict[pattern_id].Add((float)factor);
+                        }
+
+                        #endregion
+
+                        #region Scada
+
+                        foreach (var mapping in flow_id_mapping_dict)
+                        {
+                            if (mapping.Value != tag)
+                                continue;
+                            scada_dict.Add(tag, value ?? 0);
+                        }
+
+                        foreach (var mapping in pressure_id_mapping_dict)
+                        {
+                            if (mapping.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
+                    }
+                    scada_dict_dict.Add(time, scada_dict);
+                }
+                #endregion
+
+                var pattern_array_dict = pattern_list_dict.ToDictionary(x => x.Key, y => y.Value.ToArray());
+                day_value_dict.Add(day, new(pattern_array_dict, scada_dict_dict));
+            }
+
+            var hydraulic_record_list_dict = Verify(verify_id, verify_file_path, flow_id_mapping_dict, pressure_id_mapping_dict, day_value_dict);
+            return hydraulic_record_list_dict;
+        }
+
+        /// <summary>
+        /// 鍘嗗彶鏁版嵁楠岃瘉
+        /// </summary>
+        /// <param name="verify_id">楠岃瘉鏍囪瘑</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="day_value_list">姣忔棩鍒嗘瀽鏁版嵁</param> 
+        /// <param name="day_value_dict">鏃ユ暟鎹垪琛�</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<DayValue> day_value_list)
+        public static Dictionary<DateTime, List<Model.HydraulicModelRecord>> Verify(
+            long verify_id,
+            string verify_file_path,
+            Dictionary<string, string> flow_id_mapping_dict,
+            Dictionary<string, string> pressure_id_mapping_dict,
+            Dictionary<DateTime, Tuple<Dictionary<string, float[]>, Dictionary<DateTime, Dictionary<string, double>>>> day_value_dict)
         {
-            var log_title = "鍒濆鍖�";
+            #region 鍏ュ弬楠岃瘉
+
+            var log_title = "寮�濮嬮獙璇�";
             var log_msg = string.Empty;
-            var hydraulic_record_list = new List<Model.HydraulicModelRecord>();
+            var hydraulic_record_list_dict = new Dictionary<DateTime, List<Model.HydraulicModelRecord>>();
             if (flow_id_mapping_dict == null || !flow_id_mapping_dict.Any())
             {
                 log_msg = "娴侀噺鏍囩瀛楀吀涓虹┖!";
@@ -314,20 +426,29 @@
                 Log.Info(verify_id, log_title, log_msg);
                 return default;
             }
-            if (day_value_list == null || !day_value_list.Any())
+            if (day_value_dict == null || !day_value_dict.Any())
             {
-                log_msg = "鏃ラ獙璇佹暟鎹负绌�!";
+                log_msg = "鏃ユ暟鎹垪琛ㄤ负绌�!";
                 Log.Info(verify_id, log_title, log_msg);
                 return default;
             }
 
-            var err = EpanetMethods.ENopen(file_path, "", "");
+            #endregion
+
+            #region 鍔犺浇妯″瀷
+
+
+            var err = EpanetMethods.ENopen(verify_file_path, "", "");
             if (err != 0)
             {
                 log_msg = err.GetMsg();
                 Log.Info(verify_id, log_title, log_msg);
                 return default;
             }
+
+            EpanetMethods.ENsettimeparam(TimeParameter.PatternStep, 1);
+            EpanetMethods.ENsettimeparam(TimeParameter.HydStep, 1);
+            EpanetMethods.ENsettimeparam(TimeParameter.ReportStep, 1);
             err = EpanetMethods.ENopenH();
             if (err != 0)
             {
@@ -336,27 +457,32 @@
                 return default;
             }
 
-            log_msg = "鍒濆鍖栨垚鍔�";
-            Log.Info(verify_id, log_title, log_msg);
+            #endregion
+
 
             log_title = "楠岃瘉";
-            var model_time_step = 0;
             var model_id_build = new StringBuilder(31);
-            foreach (var day_value in day_value_list)
+            var pattern_init = true;
+            var pattern_time_step = 0;
+            foreach (var day_value in day_value_dict)
             {
-                var pattern_list = day_value.PatternList;
-                var time_value_list = day_value.TimeValueList;
-                if (pattern_list == null || time_value_list == null)
+                var day = day_value.Key;
+                var pattern_dict = day_value.Value.Item1;
+                var time_value_dict = day_value.Value.Item2;
+                if (time_value_dict == null || !time_value_dict.Any())
                 {
                     continue;
                 }
-                var pattern_init = true;
-                foreach (var pattern in pattern_list)
+
+                #region 妯″紡鍒濆鍖�
+                pattern_init = true;
+                pattern_time_step = 0;
+                foreach (var pattern in pattern_dict)
                 {
-                    var patternId = pattern.Id;
-                    var pattern_factor_array = pattern.FactorList.ToArray();
+                    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(patternId, out int pattern_index);
+                    err = EpanetMethods.ENgetpatternindex(pattern_id, out int pattern_index);
                     if (err != ErrorCode.Ok)
                     {
                         pattern_init = false;
@@ -376,11 +502,16 @@
 
                 if (!pattern_init)
                 {
-                    log_msg = $"{day_value.Year}_{day_value.Month}_{day_value.Day}:妯″紡鍒濆鍖栧け璐�!";
+                    log_msg = $"{day:G}:妯″紡鍒濆鍖栧け璐�!";
                     Log.Info(verify_id, log_title, log_msg);
-                    continue;
+                    return default;
                 }
+                #endregion
 
+                #region 妯″瀷楠岃瘉
+
+                var time_value_dict_dict = time_value_dict.ToDictionary(x => x.Key.TimeOfDay.TotalSeconds, y => y);
+               
                 EpanetMethods.ENinitH(0);
                 do
                 {
@@ -389,11 +520,13 @@
                     EpanetMethods.ENgetcount(CountType.Node, out int node_count);
 
                     var current_time = TimeSpan.FromSeconds(current_ts);
-                    var time_value = time_value_list.Find(x => x.Time.TimeOfDay == current_time);
-                    if (time_value != null)
+                    if (time_value_dict_dict.ContainsKey(current_time.TotalSeconds))
                     {
-                        var time = time_value.Time;
-                        var scada_value_dcit = time_value.Value;
+                        var hydraulic_record_list = new List<Model.HydraulicModelRecord>();
+
+                        var time_value = time_value_dict_dict[current_ts];
+                        var verify_time = time_value.Key;
+                        var scada_dict = time_value.Value;
                         for (int link_index = 1; link_index <= link_count; link_index++)
                         {
                             if (EpanetMethods.ENgetlinkid(link_index, model_id_build) != ErrorCode.Ok)
@@ -403,21 +536,27 @@
                             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);
+                                var scada_value = scada_dict[scada_id];
 
-                                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.ModelValue = (double)model_value;
-                                record.ScadaValue = scada_value;
-                                if (record.ModelValue.HasValue)
-                                    record.ModelValue = Math.Abs(record.ModelValue.Value);
+                                EpanetMethods.ENgetlinkvalue(link_index, LinkValue.Flow, 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.Flow,
+                                    ModelValue = (double)Math.Abs(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);
                             }
                         }
 
@@ -426,38 +565,44 @@
                             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];
+                                var scada_value = scada_dict[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.ModelValue = (double)model_value;
-                                record.ScadaValue = scada_value;
-                                if (record.ModelValue.HasValue)
-                                    record.ModelValue = Math.Abs(record.ModelValue.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);
                             }
                         }
+
+                        hydraulic_record_list_dict.Add(verify_time, hydraulic_record_list);
                     }
 
-                    EpanetMethods.ENnextH(out model_time_step);
+                    EpanetMethods.ENnextH(out pattern_time_step);
 
-                } while (model_time_step > 0);
+                } while (pattern_time_step > 0);
+
+                #endregion
+
             }
             EpanetMethods.ENcloseH();
-            return hydraulic_record_list;
+            return hydraulic_record_list_dict;
         }
 
 
-    }
 
+    }
 }

--
Gitblit v1.9.3