namespace IStation.Test { public class ScheduleModelValidHelper { private static readonly Service.Station _service_station = new(); private static readonly Service.Scada _service_scada = new(); private static readonly Service.ScheduleConfig _service_schedule_config = new(); public static bool Analysis() { var pressure_id_mapping_dict = new Dictionary() { {"Jjd1","1输水总压力"}, {"Jjd2","1输水总压力"}, {"Jjd3","1输水总压力"}, {"Jpump11","1输水11#扬程"}, {"Jpump12","1输水12#扬程"}, {"Jpump13","1输水13#扬程"}, {"Jpump14","1输水14#扬程"}, {"Jpump15","1输水15#扬程"}, {"Jpump16","1输水16#扬程"}, {"Jpump17","1输水17#扬程"}, {"Jpump18","1输水18#扬程"}, {"Jdn2400","2输水总压力"}, {"Jdn2700","2输水总压力"}, {"Jpump21","2输水21#扬程"}, {"Jpump22","2输水22#扬程"}, {"Jpump23","2输水23#扬程"}, {"Jpump24","2输水24#扬程"}, {"Jpump25","2输水25#扬程"}, {"Jpump26","2输水26#扬程"}, {"Jpump27","2输水27#扬程"} }; var flow_id_mapping_dict = new Dictionary() { {"Pjd1","1输水总流量"}, {"Pjd2","1输水总流量"}, {"Pjd3","1输水总流量"}, {"Pdn2400","2输水总流量"}, {"Pdn2700","2输水总流量"}, {"Ppump21","2输水21#流量"}, {"Ppump22","2输水22#流量"}, {"Ppump23","2输水23#流量"}, {"Ppump24","2输水24#流量"}, {"Ppump25","2输水25#流量"}, {"Ppump26","2输水26#流量"}, {"Ppump27","2输水27#流量"} }; var pattern_id_mapping_dict = new Dictionary() { {"Pump11","1输水11#频率"}, {"Pump12","1输水12#频率"}, {"Pump13","1输水13#频率"}, {"Pump14","1输水14#频率"}, {"Pump15","1输水15#频率"}, {"Pump16","1输水16#频率"}, {"Pump17","1输水17#频率"}, {"Pump18","1输水18#频率"}, {"R3", "R3"}, {"R2", "R2"}, {"R1", "R1"}, {"SFJD1", "SFJD1"}, {"SFJD2", "SFJD2"}, {"SFJD3", "SFJD3"}, {"RPump21", "RPump21"}, {"SFPump21", "SFPump21"}, {"Pump21", "2输水21#频率"}, {"RPump22", "RPump22"}, {"SFPump22", "SFPump22"}, {"Pump22", "2输水22#频率"}, {"RPump23", "RPump23"}, {"SFPump23", "SFPump23"}, {"Pump23", "2输水23#频率"}, {"RPump24", "RPump24"}, {"SFPump24", "SFPump24"}, {"Pump24", "2输水24#频率"}, {"RPump25", "RPump25"}, {"SFPump25", "SFPump25"}, {"Pump25", "2输水25#频率"}, {"RPump26", "RPump26"}, {"SFPump26", "SFPump26"}, {"Pump26", "2输水26#频率"}, {"RPump27", "RPump27"}, {"SFPump27", "SFPump27"}, {"Pump27", "2输水27#频率"}, {"SFDN2400", "SFDN2400"}, {"SFDN2700", "SFDN2700"} }; var pressure_id_mapping_list1 = new List() { "SPJD1", "SPJD2", "SPJD3" }; var pressure_id_mapping_list2 = new List() { "SPDN2400", "SPDN2700" }; var flow_id_mapping_list1 = new List() { "SFJD1", "SFJD2", "SFJD3" }; var flow_id_mapping_list2 = new List() { "SFDN2400", "SFDN2700" }; var pump_id_mapping_list1 = new Dictionary() { {"Pump11",11}, {"Pump12",12}, {"Pump13",13}, {"Pump14",14}, {"Pump15",15}, {"Pump16",16}, {"Pump17",17}, {"Pump18",18}, }; var pump_id_mapping_list2 = new Dictionary() { {"Pump21",21}, {"Pump22",22}, {"Pump23",23}, {"Pump24",24}, {"Pump25",25}, {"Pump26",26}, {"Pump27",27}, }; var water_level_tag_list_1 = new List() { "R1", "R2", "R3" }; var water_level_tag_list_2 = new List() { "RPump21", "RPump22", "RPump23", "RPump24", "RPump25", "RPump26", "RPump27" }; var station_info = _service_station.Get(); var schedule_config1 = _service_schedule_config.GetStation1(); var schedule_config2 = _service_schedule_config.GetStation2(); var verify_id = Yw.YitIdHelper.NextId(); var file_path = $"{AppDomain.CurrentDomain.BaseDirectory}Data\\HydraulicModel.inp"; var day_value_list = IStation.Test.DayValueHelper.GetDayValues(); if (day_value_list == null || !day_value_list.Any()) return false; foreach (var day_value in day_value_list) { var patternList = new List(); foreach (var pattern_item in pattern_id_mapping_dict) { var pattern = new IStation.Hydraulic.Pattern { Id = pattern_item.Key, FactorList = new List() }; patternList.Add(pattern); } var timeValueList = day_value.TimeValueList.OrderBy(x => x.Time).ToList(); foreach (var timeValue in timeValueList) { var time = timeValue.Time; var value_dict = timeValue.Value; var pressure_1_list = new List(); var flow_1_list = new List(); var pressure_2_list = new List(); var flow_2_list = new List(); var current_open_pump_flags1 = new List(); var current_open_pump_flags2 = new List(); var water_level_valid_value_list1 = new List(); var water_level_valid_value_list2 = new List(); foreach (var item in value_dict) { var scada_id = item.Key; var scada_value = item.Value; var pattern = patternList.Find(x => x.Id == scada_id); if (pattern != null) { if (pattern.Id == scada_id) { pattern.FactorList.Add((float)scada_value); } } if (pressure_id_mapping_list1.Contains(scada_id)) { pressure_1_list.Add(scada_value); continue; } else if (pressure_id_mapping_list2.Contains(scada_id)) { pressure_2_list.Add(scada_value); continue; } else if (flow_id_mapping_list1.Contains(scada_id)) { flow_1_list.Add(scada_value); continue; } else if (flow_id_mapping_list2.Contains(scada_id)) { flow_2_list.Add(scada_value); continue; } else if (water_level_tag_list_1.Contains(scada_id)) { water_level_valid_value_list1.Add(scada_value); continue; } else if (water_level_tag_list_2.Contains(scada_id)) { water_level_valid_value_list2.Add(scada_value); continue; } bool ct = false; foreach (var pump in pump_id_mapping_list1) { if (pump.Key == scada_id && scada_value > 0) { current_open_pump_flags1.Add(pump.Value); ct = true; } } if (ct) continue; foreach (var pump in pump_id_mapping_list2) { if (pump.Key == scada_id && scada_value > 0) { current_open_pump_flags2.Add(pump.Value); } } } var water_level1 = water_level_valid_value_list1.Average(x => x); var water_level2 = water_level_valid_value_list2.Average(x => x); var target_flow1 = flow_1_list.Sum(); var target_flow2 = flow_2_list.Sum(); var pressure_1 = pressure_1_list.Max(); var pressure_2 = pressure_2_list.Max(); var target_head1 = pressure_1 - water_level1; var target_head2 = pressure_2 - water_level2; var helper = new Algorithm.ScheduleHelper(); helper.Initial(current_open_pump_flags1, schedule_config1); var optimal_combine1 = helper.Calc(station_info.S1, station_info.S1FlagsPart1, station_info.S1FlagsPart2, target_flow1, target_head1); helper.Initial(current_open_pump_flags2, schedule_config2); var optimal_combine2 = helper.Calc(station_info.S2, station_info.S2FlagsPart1, station_info.S2FlagsPart2, target_flow2, target_head2); var objects = new Dictionary(); if (optimal_combine1 != null) { objects["1输水总流量"] = optimal_combine1.Flow; objects["1输水总压力"] = Math.Round(Curve.PumpCalculateHelper.M2Mpa(optimal_combine1.Head), 4); foreach (var combine in optimal_combine1.Combines) { foreach (var fre_pump in combine.FrePumps) { var flag = fre_pump.Flag; objects[$"1输水{flag}#流量"] = fre_pump.Flow; objects[$"1输水{flag}#扬程"] = fre_pump.Head; objects[$"1输水{flag}#频率"] = fre_pump.Frequency; } } } else { Yw.LogHelper.Info($"1输水调度计算失败,无法满足目标流量:{target_flow1},目标压力:{target_head1}!"); } if (optimal_combine2 != null) { objects["2输水总流量"] = optimal_combine2.Flow; objects["2输水总压力"] = Math.Round(Curve.PumpCalculateHelper.M2Mpa(optimal_combine2.Head), 4); foreach (var combine in optimal_combine2.Combines) { foreach (var fre_pump in combine.FrePumps) { var flag = fre_pump.Flag; objects[$"2输水{flag}#流量"] = fre_pump.Flow; objects[$"2输水{flag}#扬程"] = fre_pump.Head; objects[$"2输水{flag}#频率"] = fre_pump.Frequency; } } } else { Yw.LogHelper.Info($"2输水调度计算失败,无法满足目标流量:{target_flow2},目标压力:{target_head2}!"); } foreach (var item in objects) { timeValue.Value.Add(item.Key, item.Value); foreach (var pattern_map in pattern_id_mapping_dict) { if (pattern_map.Value == item.Key) { var pattern = patternList.Find(x => x.Id == pattern_map.Key); if (pattern != null) { pattern.FactorList.Add((float)item.Value); } } } } } day_value.PatternList = patternList; } var hydraulic_model_validation = new IStation.Model.HydraulicModelValidation(); hydraulic_model_validation.ID = verify_id; hydraulic_model_validation.Time = DateTime.Now; hydraulic_model_validation.Config = "调度验证"; var bol = new IStation.Service.HydraulicModelValidation().Insert(hydraulic_model_validation) > 0; if (!bol) { return false; } var hydraulic_model_record_list = IStation.Hydraulic.ModeVerifyHelper.Verify(verify_id, file_path, flow_id_mapping_dict, pressure_id_mapping_dict, day_value_list); bol = new IStation.Service.HydraulicModelRecord().BulkInserts(hydraulic_model_record_list); return bol; } } }