using IStation.Epanet; using IStation.Epanet.Enums; using System.Collections.Generic; using System.Text; namespace IStation { public class HistoryScadaValidHelper { public static bool Analysis() { var file_path = $"{AppDomain.CurrentDomain.BaseDirectory}Data\\HydraulicModel.inp"; if (!File.Exists(file_path)) return false; var day_value_list = IStation.DayValueHelper.GetDayValues(); if (day_value_list == null || !day_value_list.Any()) return false; var service_hydraulic_model_validation = new IStation.Service.HydraulicModelValidation(); var service_hydraulic_model_scada = new IStation.Service.HydraulicModelScada(); var service_hydraulic_model_record = new IStation.Service.HydraulicModelRecord(); var pressure_id_mapping_dict = new Dictionary() { {"Jjd1","SPJD1"}, {"Jjd2","SPJD2"}, {"Jjd3","SPJD3"}, {"Jpump11","SPPump11" }, {"Jpump12","SPPump12" }, {"Jpump13","SPPump13" }, {"Jpump14","SPPump14" }, {"Jpump15","SPPump15" }, {"Jpump16","SPPump16" }, {"Jpump17","SPPump17" }, {"Jpump18","SPPump18" }, {"Jdn2400","SPDN2400"}, {"Jdn2700","SPDN2700"}, {"Jpump21","SPPump21"}, {"Jpump22","SPPump22"}, {"Jpump23","SPPump23"}, {"Jpump24","SPPump24"}, {"Jpump25","SPPump25"}, {"Jpump26","SPPump26"}, {"Jpump27","SPPump27"} }; var flow_id_mapping_dict = new Dictionary() { {"Pjd1","SFJD1"}, {"Pjd2","SFJD2"}, {"Pjd3","SFJD3"}, {"Pdn2400","SFDN2400"}, {"Pdn2700","SFDN2700"}, {"Ppump21","SFPump21"}, {"Ppump22","SFPump22"}, {"Ppump23","SFPump23"}, {"Ppump24","SFPump24"}, {"Ppump25","SFPump25"}, {"Ppump26","SFPump26"}, {"Ppump27","SFPump27"} }; var pattern_id_mapping_dict = new Dictionary() { {"R3", "R3"}, {"R2", "R2"}, {"R1", "R1"}, {"Pump11", "Pump11"}, {"Pump12", "Pump12"}, {"Pump13", "Pump13"}, {"Pump14", "Pump14"}, {"Pump15", "Pump15"}, {"Pump16", "Pump16"}, {"Pump17", "Pump17"}, {"Pump18", "Pump18"}, {"SFJD1", "SFJD1"}, {"SFJD2", "SFJD2"}, {"SFJD3", "SFJD3"}, {"RPump21", "RPump21"}, {"RPump22", "RPump22"}, {"RPump23", "RPump23"}, {"RPump24", "RPump24"}, {"RPump25", "RPump25"}, {"RPump26", "RPump26"}, {"RPump27", "RPump27"}, {"Pump21", "Pump21"}, {"Pump22", "Pump22"}, {"Pump23", "Pump23"}, {"Pump24", "Pump24"}, {"Pump25", "Pump25"}, {"Pump26", "Pump26"}, {"Pump27", "Pump27"}, {"SFPump21", "SFPump21"}, {"SFPump22", "SFPump22"}, {"SFPump23", "SFPump23"}, {"SFPump24", "SFPump24"}, {"SFPump25", "SFPump25"}, {"SFPump26", "SFPump26"}, {"SFPump27", "SFPump27"}, {"SFDN2400", "SFDN2400"}, {"SFDN2700", "SFDN2700"}, }; //var hydraulic_model_validation_config = new IStation.Model.HydraulicModelValidationConfig(); //hydraulic_model_validation_config.FlowIdMappingDict = flow_id_mapping_dict; //hydraulic_model_validation_config.PressureIdMappingDict = pressure_id_mapping_dict; //hydraulic_model_validation_config.PatternIdMappingDict = pattern_id_mapping_dict; //var hydraulic_model_validation_config_json = Yw.JsonHelper.Object2Json(hydraulic_model_validation_config); var pattern_list = new List(); foreach (var pattern_id_mapping in pattern_id_mapping_dict) { var pattern = new IStation.Hydraulic.Pattern { Id = pattern_id_mapping.Key, FactorList = new List() }; pattern_list.Add(pattern); } var log_msg = string.Empty; var err = EpanetMethods.ENopen(file_path, "", ""); if (err != 0) { log_msg = err.GetMsg(); Console.WriteLine(log_msg); Yw.LogHelper.Info(log_msg); return default; } err = EpanetMethods.ENopenH(); if (err != 0) { log_msg = err.GetMsg(); Console.WriteLine(log_msg); Yw.LogHelper.Info(log_msg); return default; } var model_time_step = 0; var model_id_build = new StringBuilder(31); foreach (var day_value in day_value_list) { var date = $"{day_value.Year}-{day_value.Month}-{day_value.Day}"; Console.WriteLine($"模型分析,{date}"); var hydraulic_model_validation_list = new List(); var hydraulic_model_record_list = new List(); var hydraulic_model_scada_list = new List(); pattern_list.ForEach(x => x.FactorList.Clear()); var time_value_list = day_value.TimeValueList.OrderBy(x => x.Time).ToList(); foreach (var time_value in time_value_list) { var time = time_value.Time; var value_dict = time_value.Value; foreach (var value_item in value_dict) { var scada_id = value_item.Key; var scada_value = value_item.Value; var pattern = pattern_list.Find(x => x.Id == scada_id); if (pattern != null) { pattern.FactorList.Add((float)scada_value); } } } var pattern_init = true; foreach (var pattern in pattern_list) { var patternId = 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(patternId, out int pattern_index); if (err != ErrorCode.Ok) { pattern_init = false; log_msg = err.GetMsg(); Console.WriteLine(log_msg); Yw.LogHelper.Info(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(); Console.WriteLine(log_msg); Yw.LogHelper.Info(log_msg); continue; } } if (!pattern_init) { log_msg = $"{day_value.Year}_{day_value.Month}_{day_value.Day}:模式初始化失败!"; Console.WriteLine(log_msg); Yw.LogHelper.Info(log_msg); continue; } EpanetMethods.ENinitH(0); do { EpanetMethods.ENrunH(out int current_ts); EpanetMethods.ENgetcount(CountType.Link, out int link_count); 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) { var time = time_value.Time; var scada_value_dcit = time_value.Value; var verify_id = Yw.YitIdHelper.NextId(); var hydraulic_model_validation = new IStation.Model.HydraulicModelValidation(); hydraulic_model_validation.ID = verify_id; hydraulic_model_validation.Time = time; //hydraulic_model_validation.Config = hydraulic_model_validation_config_json; hydraulic_model_validation_list.Add(hydraulic_model_validation); foreach (var valud_item in scada_value_dcit) { var hydraulic_model_scada = new Model.HydraulicModelScada(); hydraulic_model_scada.VerificationID = verify_id; hydraulic_model_scada.Time = time; hydraulic_model_scada.Tag = valud_item.Key; hydraulic_model_scada.Value = valud_item.Value; hydraulic_model_scada_list.Add(hydraulic_model_scada); } 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); 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); record.DifferenceValue = record.ScadaValue - record.ModelValue; hydraulic_model_record_list.Add(record); } } 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.ModelValue = (double)model_value; record.ScadaValue = scada_value; if (record.ModelValue.HasValue) record.ModelValue = Math.Abs(record.ModelValue.Value); record.DifferenceValue = record.ScadaValue - record.ModelValue; hydraulic_model_record_list.Add(record); } } } EpanetMethods.ENnextH(out model_time_step); } while (model_time_step > 0); var bol = service_hydraulic_model_validation.Inserts(hydraulic_model_validation_list); if (!bol) { var msg = $"{date}:hydraulic_model_validation_list 插入异常"; Console.WriteLine(msg); Yw.LogHelper.Info(msg); } bol = service_hydraulic_model_scada.Inserts(hydraulic_model_scada_list); if (!bol) { var msg = $"{date}:hydraulic_model_scada_list 插入异常"; Console.WriteLine(msg); Yw.LogHelper.Info(msg); } bol = service_hydraulic_model_record.Inserts(hydraulic_model_record_list); if (!bol) { var msg = $"{date}:hydraulic_model_record_list 插入异常"; Console.WriteLine(msg); Yw.LogHelper.Info(msg); } } EpanetMethods.ENcloseH(); return true; } public static bool Statistics ( int minQ, int maxQ, int spaceQ, out List avg_statistics_station1_vm_list, out List avg_statistics_station2_vm_list ) { avg_statistics_station1_vm_list = new List(); avg_statistics_station2_vm_list = new List(); var avg_statistics_station1_vm_list_temp = new List(); var avg_statistics_station2_vm_list_temp = new List(); var file_path = $"{AppDomain.CurrentDomain.BaseDirectory}Data\\HydraulicModel.inp"; if (!File.Exists(file_path)) return false; #region day_value_list var day_value_list = IStation.DayValueHelper.GetDayValues(); if (day_value_list == null || !day_value_list.Any()) return false; var pressure_id_mapping_dict = new Dictionary() { {"Jjd1","SPJD1"}, {"Jjd2","SPJD2"}, {"Jjd3","SPJD3"}, {"Jpump11","SPPump11" }, {"Jpump12","SPPump12" }, {"Jpump13","SPPump13" }, {"Jpump14","SPPump14" }, {"Jpump15","SPPump15" }, {"Jpump16","SPPump16" }, {"Jpump17","SPPump17" }, {"Jpump18","SPPump18" }, {"Jdn2400","SPDN2400"}, {"Jdn2700","SPDN2700"}, {"Jpump21","SPPump21"}, {"Jpump22","SPPump22"}, {"Jpump23","SPPump23"}, {"Jpump24","SPPump24"}, {"Jpump25","SPPump25"}, {"Jpump26","SPPump26"}, {"Jpump27","SPPump27"} }; var flow_id_mapping_dict = new Dictionary() { {"Pjd1","SFJD1"}, {"Pjd2","SFJD2"}, {"Pjd3","SFJD3"}, {"Pdn2400","SFDN2400"}, {"Pdn2700","SFDN2700"}, {"Ppump21","SFPump21"}, {"Ppump22","SFPump22"}, {"Ppump23","SFPump23"}, {"Ppump24","SFPump24"}, {"Ppump25","SFPump25"}, {"Ppump26","SFPump26"}, {"Ppump27","SFPump27"} }; var pattern_id_mapping_dict = new Dictionary() { {"R3", "R3"}, {"R2", "R2"}, {"R1", "R1"}, {"Pump11", "Pump11"}, {"Pump12", "Pump12"}, {"Pump13", "Pump13"}, {"Pump14", "Pump14"}, {"Pump15", "Pump15"}, {"Pump16", "Pump16"}, {"Pump17", "Pump17"}, {"Pump18", "Pump18"}, {"SFJD1", "SFJD1"}, {"SFJD2", "SFJD2"}, {"SFJD3", "SFJD3"}, {"RPump21", "RPump21"}, {"RPump22", "RPump22"}, {"RPump23", "RPump23"}, {"RPump24", "RPump24"}, {"RPump25", "RPump25"}, {"RPump26", "RPump26"}, {"RPump27", "RPump27"}, {"Pump21", "Pump21"}, {"Pump22", "Pump22"}, {"Pump23", "Pump23"}, {"Pump24", "Pump24"}, {"Pump25", "Pump25"}, {"Pump26", "Pump26"}, {"Pump27", "Pump27"}, {"SFPump21", "SFPump21"}, {"SFPump22", "SFPump22"}, {"SFPump23", "SFPump23"}, {"SFPump24", "SFPump24"}, {"SFPump25", "SFPump25"}, {"SFPump26", "SFPump26"}, {"SFPump27", "SFPump27"}, {"SFDN2400", "SFDN2400"}, {"SFDN2700", "SFDN2700"}, }; var pattern_list = new List(); foreach (var pattern_id_mapping in pattern_id_mapping_dict) { var pattern = new IStation.Hydraulic.Pattern { Id = pattern_id_mapping.Key, FactorList = new List() }; pattern_list.Add(pattern); } #endregion #region init var log_msg = string.Empty; var err = EpanetMethods.ENopen(file_path, "", ""); if (err != 0) { log_msg = err.GetMsg(); Console.WriteLine(log_msg); Yw.LogHelper.Info(log_msg); return default; } err = EpanetMethods.ENopenH(); if (err != 0) { log_msg = err.GetMsg(); Console.WriteLine(log_msg); Yw.LogHelper.Info(log_msg); return default; } #endregion var model_time_step = 0; var model_id_build = new StringBuilder(31); foreach (var day_value in day_value_list) { var date = $"{day_value.Year}-{day_value.Month}-{day_value.Day}"; Console.WriteLine($"模型分析,{date}"); var model_scada_valid_vm_list = new List(); var hydraulic_model_record_dict = new Dictionary>(); pattern_list.ForEach(x => x.FactorList.Clear()); var time_value_list = day_value.TimeValueList.OrderBy(x => x.Time).ToList(); foreach (var time_value in time_value_list) { var time = time_value.Time; var value_dict = time_value.Value; foreach (var value_item in value_dict) { var scada_id = value_item.Key; var scada_value = value_item.Value; var pattern = pattern_list.Find(x => x.Id == scada_id); if (pattern != null) { pattern.FactorList.Add((float)scada_value); } } } var pattern_init = true; foreach (var pattern in pattern_list) { var patternId = 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(patternId, out int pattern_index); if (err != ErrorCode.Ok) { pattern_init = false; log_msg = err.GetMsg(); Console.WriteLine(log_msg); Yw.LogHelper.Info(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(); Console.WriteLine(log_msg); Yw.LogHelper.Info(log_msg); continue; } } if (!pattern_init) { log_msg = $"{day_value.Year}_{day_value.Month}_{day_value.Day}:模式初始化失败!"; Console.WriteLine(log_msg); Yw.LogHelper.Info(log_msg); continue; } EpanetMethods.ENinitH(0); do { EpanetMethods.ENrunH(out int current_ts); EpanetMethods.ENgetcount(CountType.Link, out int link_count); 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) { var time = time_value.Time; var scada_dict = time_value.Value; var verify_id = Yw.YitIdHelper.NextId(); var vm = new ModelScadaValidViewModel(); vm.Time = time; vm.R1s = scada_dict["R1"]; vm.R2s = scada_dict["R2"]; vm.R3s = scada_dict["R3"]; vm.RPump21s = scada_dict["RPump21"]; vm.RPump22s = scada_dict["RPump22"]; vm.RPump23s = scada_dict["RPump23"]; vm.RPump24s = scada_dict["RPump24"]; vm.RPump25s = scada_dict["RPump25"]; vm.RPump26s = scada_dict["RPump26"]; vm.RPump27s = scada_dict["RPump27"]; vm.DN2700Ps = scada_dict["SPDN2700"]; vm.DN2400Ps = scada_dict["SPDN2400"]; vm.JD1Ps = scada_dict["SPJD1"]; vm.JD2Ps = scada_dict["SPJD2"]; vm.JD3Ps = scada_dict["SPJD3"]; vm.Pump11Ps = scada_dict["SPPump11"]; vm.Pump12Ps = scada_dict["SPPump12"]; vm.Pump13Ps = scada_dict["SPPump13"]; vm.Pump14Ps = scada_dict["SPPump14"]; vm.Pump15Ps = scada_dict["SPPump15"]; vm.Pump16Ps = scada_dict["SPPump16"]; vm.Pump17Ps = scada_dict["SPPump17"]; vm.Pump18Ps = scada_dict["SPPump18"]; vm.Pump21Ps = scada_dict["SPPump21"]; vm.Pump22Ps = scada_dict["SPPump22"]; vm.Pump23Ps = scada_dict["SPPump23"]; vm.Pump24Ps = scada_dict["SPPump24"]; vm.Pump25Ps = scada_dict["SPPump25"]; vm.Pump26Ps = scada_dict["SPPump26"]; vm.Pump27Ps = scada_dict["SPPump27"]; vm.DN2700Fs = scada_dict["SFDN2700"]; vm.DN2400Fs = scada_dict["SFDN2400"]; vm.JD1Fs = scada_dict["SFJD1"]; vm.JD2Fs = scada_dict["SFJD2"]; vm.JD3Fs = scada_dict["SFJD3"]; vm.Pump21Fs = scada_dict["SFPump21"]; vm.Pump22Fs = scada_dict["SFPump22"]; vm.Pump23Fs = scada_dict["SFPump23"]; vm.Pump24Fs = scada_dict["SFPump24"]; vm.Pump25Fs = scada_dict["SFPump25"]; vm.Pump26Fs = scada_dict["SFPump26"]; vm.Pump27Fs = scada_dict["SFPump27"]; vm.Pump11s = scada_dict["Pump11"]; vm.Pump11s = scada_dict["Pump11"]; vm.Pump12s = scada_dict["Pump12"]; vm.Pump13s = scada_dict["Pump13"]; vm.Pump14s = scada_dict["Pump14"]; vm.Pump15s = scada_dict["Pump15"]; vm.Pump16s = scada_dict["Pump16"]; vm.Pump17s = scada_dict["Pump17"]; vm.Pump18s = scada_dict["Pump18"]; vm.Pump21s = scada_dict["Pump21"]; vm.Pump22s = scada_dict["Pump22"]; vm.Pump23s = scada_dict["Pump23"]; vm.Pump24s = scada_dict["Pump24"]; vm.Pump25s = scada_dict["Pump25"]; vm.Pump26s = scada_dict["Pump26"]; vm.Pump27s = scada_dict["Pump27"]; vm.Diff(); vm.Round(); model_scada_valid_vm_list.Add(vm); hydraulic_model_record_dict[time] = new List(); 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); 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); record.DifferenceValue = record.ScadaValue - record.ModelValue; hydraulic_model_record_dict[time].Add(record); } } 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(); 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); record.DifferenceValue = record.ScadaValue - record.ModelValue; hydraulic_model_record_dict[time].Add(record); } } } EpanetMethods.ENnextH(out model_time_step); } while (model_time_step > 0); var combineStatisticsViewModelList = new List(); foreach (var item in hydraulic_model_record_dict) { var time = item.Key; var list = item.Value; if (list == null || !list.Any()) continue; var model_record = model_scada_valid_vm_list.Find(x => x.Time == time); if (model_record == null) continue; var model_record_dict = list.ToDictionary(x => x.ModelId, x => x.ModelValue); model_record.DN2700P = model_record_dict["Jdn2700"]; model_record.DN2400P = model_record_dict["Jdn2400"]; model_record.JD1P = model_record_dict["Jjd1"]; model_record.JD2P = model_record_dict["Jjd2"]; model_record.JD3P = model_record_dict["Jjd3"]; model_record.Pump11P = model_record_dict["Jpump11"]; model_record.Pump12P = model_record_dict["Jpump12"]; model_record.Pump13P = model_record_dict["Jpump13"]; model_record.Pump14P = model_record_dict["Jpump14"]; model_record.Pump15P = model_record_dict["Jpump15"]; model_record.Pump16P = model_record_dict["Jpump16"]; model_record.Pump17P = model_record_dict["Jpump17"]; model_record.Pump18P = model_record_dict["Jpump18"]; model_record.Pump21P = model_record_dict["Jpump21"]; model_record.Pump22P = model_record_dict["Jpump22"]; model_record.Pump23P = model_record_dict["Jpump23"]; model_record.Pump24P = model_record_dict["Jpump24"]; model_record.Pump25P = model_record_dict["Jpump25"]; model_record.Pump26P = model_record_dict["Jpump26"]; model_record.Pump27P = model_record_dict["Jpump27"]; model_record.DN2700F = model_record_dict["Pdn2700"]; model_record.DN2400F = model_record_dict["Pdn2400"]; model_record.JD1F = model_record_dict["Pjd1"]; model_record.JD2F = model_record_dict["Pjd2"]; model_record.JD3F = model_record_dict["Pjd3"]; model_record.Pump21F = model_record_dict["Ppump21"]; model_record.Pump22F = model_record_dict["Ppump22"]; model_record.Pump23F = model_record_dict["Ppump23"]; model_record.Pump24F = model_record_dict["Ppump24"]; model_record.Pump25F = model_record_dict["Ppump25"]; model_record.Pump26F = model_record_dict["Ppump26"]; model_record.Pump27F = model_record_dict["Ppump27"]; model_record.Diff(); var combine_statistics_vm = new CombineStatisticsViewModel(model_record); combine_statistics_vm.Diff(); combine_statistics_vm.Statistics(); combineStatisticsViewModelList.Add(combine_statistics_vm); } if (!combineStatisticsViewModelList.Any()) continue; for (int currentMinQ = minQ; currentMinQ <= maxQ; currentMinQ += spaceQ) { var currentMaxQ = currentMinQ + spaceQ; var combineS1 = combineStatisticsViewModelList .Where(x => x.TotalFlow1 >= currentMinQ && x.TotalFlow1 <= currentMaxQ) .ToList(); if (combineS1 != null && combineS1.Any()) { var combineS1Group = combineS1.GroupBy(x => new { x.RunFlags1, x.RunCount1 }).ToList(); foreach (var item in combineS1Group) { if (item.Key.RunCount1 < 1) continue; var list = FiltrationS1(item.ToList()); if (list == null || list.Count() < 5) continue; var avg1 = new AvgStatisticsS1ViewModel(); avg1.MinTotalFlow = currentMinQ; avg1.MaxTotalFlow = currentMaxQ; avg1.RunCount = item.Key.RunCount1; avg1.RunFlags = item.Key.RunFlags1; avg1.Pump11Pd = item.Where(x => x.Pump11Pd.HasValue).Average(x => x.Pump11Pd); avg1.Pump12Pd = item.Where(x => x.Pump12Pd.HasValue).Average(x => x.Pump12Pd); avg1.Pump13Pd = item.Where(x => x.Pump13Pd.HasValue).Average(x => x.Pump13Pd); avg1.Pump14Pd = item.Where(x => x.Pump14Pd.HasValue).Average(x => x.Pump14Pd); avg1.Pump15Pd = item.Where(x => x.Pump15Pd.HasValue).Average(x => x.Pump15Pd); avg1.Pump16Pd = item.Where(x => x.Pump16Pd.HasValue).Average(x => x.Pump16Pd); avg1.Pump17Pd = item.Where(x => x.Pump17Pd.HasValue).Average(x => x.Pump17Pd); avg1.Pump18Pd = item.Where(x => x.Pump18Pd.HasValue).Average(x => x.Pump18Pd); avg1.TimeCount = item.Count(); avg1.Round(); avg_statistics_station1_vm_list_temp.Add(avg1); } } var combineS2 = combineStatisticsViewModelList .Where(x => x.TotalFlow2 >= currentMinQ && x.TotalFlow2 <= currentMaxQ) .ToList(); if (combineS2 != null && combineS2.Any()) { var combineS2Group = combineS2.GroupBy(x => new { x.RunFlags2, x.RunCount2 }).ToList(); foreach (var item in combineS2Group) { if (item.Key.RunCount2 < 1) continue; var list = FiltrationS2(item.ToList()); if (list == null || list.Count() < 5) continue; var avg2 = new AvgStatisticsS2ViewModel(); avg2.MinTotalFlow = currentMinQ; avg2.MaxTotalFlow = currentMaxQ; avg2.RunCount = item.Key.RunCount2; avg2.RunFlags = item.Key.RunFlags2; avg2.Pump21Pd = item.Where(x => x.Pump21Pd.HasValue).Average(x => x.Pump21Pd); avg2.Pump22Pd = item.Where(x => x.Pump22Pd.HasValue).Average(x => x.Pump22Pd); avg2.Pump23Pd = item.Where(x => x.Pump23Pd.HasValue).Average(x => x.Pump23Pd); avg2.Pump24Pd = item.Where(x => x.Pump24Pd.HasValue).Average(x => x.Pump24Pd); avg2.Pump25Pd = item.Where(x => x.Pump25Pd.HasValue).Average(x => x.Pump25Pd); avg2.Pump26Pd = item.Where(x => x.Pump26Pd.HasValue).Average(x => x.Pump26Pd); avg2.Pump27Pd = item.Where(x => x.Pump27Pd.HasValue).Average(x => x.Pump27Pd); avg2.TimeCount = item.Count(); avg2.Round(); avg_statistics_station2_vm_list_temp.Add(avg2); } } } } EpanetMethods.ENcloseH(); if (avg_statistics_station1_vm_list_temp.Any()) { var temp_group = avg_statistics_station1_vm_list_temp.GroupBy(x => new { x.MinTotalFlow, x.MaxTotalFlow, x.RunFlags,x.RunCount }); foreach (var group in temp_group) { var key = group.Key; var list = group; var avg1 = new AvgStatisticsS1ViewModel(); avg1.MinTotalFlow = key.MinTotalFlow; avg1.MaxTotalFlow = key.MaxTotalFlow; avg1.RunCount = key.RunCount; avg1.RunFlags = key.RunFlags; avg1.TimeCount = group.Sum(x => x.TimeCount); avg1.Pump11Pd = list.Where(x => x.Pump11Pd.HasValue).Average(x => x.Pump11Pd); avg1.Pump12Pd = list.Where(x => x.Pump12Pd.HasValue).Average(x => x.Pump12Pd); avg1.Pump13Pd = list.Where(x => x.Pump13Pd.HasValue).Average(x => x.Pump13Pd); avg1.Pump14Pd = list.Where(x => x.Pump14Pd.HasValue).Average(x => x.Pump14Pd); avg1.Pump15Pd = list.Where(x => x.Pump15Pd.HasValue).Average(x => x.Pump15Pd); avg1.Pump16Pd = list.Where(x => x.Pump16Pd.HasValue).Average(x => x.Pump16Pd); avg1.Pump17Pd = list.Where(x => x.Pump17Pd.HasValue).Average(x => x.Pump17Pd); avg1.Pump18Pd = list.Where(x => x.Pump18Pd.HasValue).Average(x => x.Pump18Pd); avg_statistics_station1_vm_list.Add(avg1); } } if (avg_statistics_station2_vm_list_temp.Any()) { var temp_group = avg_statistics_station2_vm_list_temp.GroupBy(x => new { x.MinTotalFlow, x.MaxTotalFlow, x.RunFlags, x.RunCount }); foreach (var group in temp_group) { var key = group.Key; var list = group; var avg2 = new AvgStatisticsS2ViewModel(); avg2.MinTotalFlow = key.MinTotalFlow; avg2.MaxTotalFlow = key.MaxTotalFlow; avg2.RunCount = key.RunCount; avg2.RunFlags = key.RunFlags; avg2.TimeCount = group.Sum(x => x.TimeCount); avg2.Pump21Pd = list.Where(x => x.Pump21Pd.HasValue).Average(x => x.Pump21Pd); avg2.Pump22Pd = list.Where(x => x.Pump22Pd.HasValue).Average(x => x.Pump22Pd); avg2.Pump23Pd = list.Where(x => x.Pump23Pd.HasValue).Average(x => x.Pump23Pd); avg2.Pump24Pd = list.Where(x => x.Pump24Pd.HasValue).Average(x => x.Pump24Pd); avg2.Pump25Pd = list.Where(x => x.Pump25Pd.HasValue).Average(x => x.Pump25Pd); avg2.Pump26Pd = list.Where(x => x.Pump26Pd.HasValue).Average(x => x.Pump26Pd); avg2.Pump27Pd = list.Where(x => x.Pump27Pd.HasValue).Average(x => x.Pump27Pd); avg_statistics_station2_vm_list.Add(avg2); } } return true; } private static double _ps_min_diff = 0.6; private static List FiltrationS1(List vm_list) { if (vm_list == null || !vm_list.Any()) return default; var list = new List(); foreach (var vm in vm_list) { var jd1 = Math.Abs(vm.JD1Pd ?? 1); var jd2 = Math.Abs(vm.JD2Pd ?? 1); var jd3 = Math.Abs(vm.JD3Pd ?? 1); if (jd1 > _ps_min_diff) continue; if (jd2 > _ps_min_diff) continue; if (jd3 > _ps_min_diff) continue; list.Add(vm); } return list; } private static List FiltrationS2(List vm_list) { if (vm_list == null || !vm_list.Any()) return default; var list = new List(); foreach (var vm in vm_list) { var dn2400 = Math.Abs(vm.DN2400Pd ?? 1); var dn2700 = Math.Abs(vm.DN2700Pd ?? 1); if (dn2400 > _ps_min_diff) continue; if (dn2700 > _ps_min_diff) continue; list.Add(vm); } return list; } } }