using Yw.Untity; namespace IStation.Test { public class ScheduleModelValidHelper { private static readonly Service.Station _service_station = new(); private static readonly Service.ScheduleRequest _service_schedule_request = new(); private static readonly Service.Scada _service_scada = new(); private static readonly Service.ScheduleConfig _service_schedule_config = new(); private static readonly Service.ScheduleScada _service_schedule_scada = new(); private static readonly Service.ScheduleRule _service_schedule_rule = new(); private static readonly Service.ScheduleConclusion _service_schedule_conclusion = new(); private static readonly Service.SchedulePump _service_schedule_pump = new(); public static bool Schedule() { 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 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 station_info = _service_station.Get(); var schedule_config1 = _service_schedule_config.GetStation1(); var schedule_config2 = _service_schedule_config.GetStation2(); 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; day_value_list = day_value_list.OrderBy(x => x.Month).ThenBy(x => x.Day).ToList(); // day_value_list = day_value_list.Where(x => x.Month == 1 && x.Day == 13).OrderBy(x => x.Day).ToList(); 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(); var helper = new Algorithm.ScheduleHelper(); //try //{ foreach (var day_value in day_value_list) { var date = $"{day_value.Year}-{day_value.Month}-{day_value.Day}"; Console.WriteLine($"调度分析,{date}"); var schedule_request_list = new List(); var schedule_conclusion_list = new List(); var schedule_pump_list = new List(); var time_value_list = day_value.TimeValueList; foreach (var time_value in time_value_list) { pressure_1_list.Clear(); flow_1_list.Clear(); pressure_2_list.Clear(); flow_2_list.Clear(); current_open_pump_flags1.Clear(); current_open_pump_flags2.Clear(); water_level_valid_value_list1.Clear(); water_level_valid_value_list2.Clear(); var time = time_value.Time; var value_dict = time_value.Value; var request_id = Yw.YitIdHelper.NextId(); foreach (var zy_scada in value_dict) { var scada_id = zy_scada.Key; var scada_value = zy_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 dt_now = DateTime.Now; helper.Initial(current_open_pump_flags1, schedule_config1); var optimal_combine1 = helper.Calc(station_info.Station1, 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.Station2, station_info.S2FlagsPart1, station_info.S2FlagsPart2, target_flow2, target_head2); if (optimal_combine1 == null && optimal_combine2 == null) continue; Model.ScheduleRequest schedule_request = new Model.ScheduleRequest(); schedule_request = new Model.ScheduleRequest(); schedule_request.ID = request_id; schedule_request.TargetFlow1 = target_flow1; schedule_request.TargetPressure1 = IStation.Curve.PumpCalculateHelper.M2Mpa(pressure_1); schedule_request.TargetFlow2 = target_flow2; schedule_request.TargetPressure2 = IStation.Curve.PumpCalculateHelper.M2Mpa(pressure_2); schedule_request.WaterLevel1 = water_level1; schedule_request.WaterLevel2 = water_level2; schedule_request.ScheduleStatus1 = optimal_combine1 != null; schedule_request.ScheduleStatus2 = optimal_combine2 != null; schedule_request.TotalTimeSpent = (DateTime.Now - dt_now).TotalSeconds; schedule_request.ReceptionTime = time; schedule_request_list.Add(schedule_request); Model.ScheduleConclusion schedule_conclusion1 = null; Model.ScheduleConclusion schedule_conclusion2 = null; List schedule_pump_list1 = null; List schedule_pump_list2 = null; if (optimal_combine1 != null) { schedule_conclusion1 = new Model.ScheduleConclusion(); schedule_conclusion1.ID = Yw.YitIdHelper.NextId(); schedule_conclusion1.RequestID = request_id; schedule_conclusion1.Station = IStation.eDockingStation.Ch1s; schedule_conclusion1.TotalFlow = optimal_combine1.Flow; schedule_conclusion1.TotalHead = optimal_combine1.Head; schedule_conclusion1.TotalPower = optimal_combine1.Power; schedule_conclusion1.TotalEfficiency = optimal_combine1.Efficiency; schedule_conclusion1.WP = optimal_combine1.WP; schedule_conclusion1.UWP = optimal_combine1.UWP; schedule_conclusion1.Flags = IntListHelper.ToString(optimal_combine1.Flags); schedule_conclusion1.MeritRatio = optimal_combine1.MeritRatio; schedule_conclusion_list.Add(schedule_conclusion1); schedule_pump_list1 = new List(); foreach (var combine in optimal_combine1.Combines) { foreach (var fre_pump in combine.FrePumps) { var flag = fre_pump.Flag; var schedule_pump = new Model.SchedulePump(); schedule_pump.RequestID = request_id; schedule_pump.Station = IStation.eDockingStation.Ch1s; schedule_pump.Flag = flag; schedule_pump.Flow = fre_pump.Flow; schedule_pump.Head = fre_pump.Head; schedule_pump.Power = fre_pump.Power; schedule_pump.Efficiency = fre_pump.Efficiency; schedule_pump.Frequency = fre_pump.Frequency; schedule_pump.Speed = fre_pump.Speed; schedule_pump_list1.Add(schedule_pump); } } schedule_pump_list.AddRange(schedule_pump_list1); } if (optimal_combine2 != null) { schedule_conclusion2 = new Model.ScheduleConclusion(); schedule_conclusion2.ID = Yw.YitIdHelper.NextId(); schedule_conclusion2.RequestID = request_id; schedule_conclusion2.Station = IStation.eDockingStation.Ch2s; schedule_conclusion2.TotalFlow = optimal_combine2.Flow; schedule_conclusion2.TotalHead = optimal_combine2.Head; schedule_conclusion2.TotalPower = optimal_combine2.Power; schedule_conclusion2.TotalEfficiency = optimal_combine2.Efficiency; schedule_conclusion2.WP = optimal_combine2.WP; schedule_conclusion2.UWP = optimal_combine2.UWP; schedule_conclusion2.Flags = IntListHelper.ToString(optimal_combine2.Flags); schedule_conclusion2.MeritRatio = optimal_combine2.MeritRatio; schedule_conclusion_list.Add(schedule_conclusion2); schedule_pump_list2 = new List(); foreach (var combine in optimal_combine2.Combines) { foreach (var fre_pump in combine.FrePumps) { var flag = fre_pump.Flag; var schedule_pump = new Model.SchedulePump(); schedule_pump.RequestID = request_id; schedule_pump.Station = IStation.eDockingStation.Ch2s; schedule_pump.Flag = flag; schedule_pump.Flow = fre_pump.Flow; schedule_pump.Head = fre_pump.Head; schedule_pump.Power = fre_pump.Power; schedule_pump.Efficiency = fre_pump.Efficiency; schedule_pump.Frequency = fre_pump.Frequency; schedule_pump.Speed = fre_pump.Speed; schedule_pump_list2.Add(schedule_pump); } } schedule_pump_list.AddRange(schedule_pump_list2); } } var bol = false; if (schedule_request_list != null && schedule_request_list.Any()) { bol = _service_schedule_request.Inserts(schedule_request_list); if (!bol) { var msg = $"{date}:schedule_request_list 插入异常"; Console.WriteLine(msg); Yw.LogHelper.Info(msg); } } if (schedule_conclusion_list != null && schedule_conclusion_list.Any()) { bol = _service_schedule_conclusion.Inserts(schedule_conclusion_list); if (!bol) { var msg = $"{date}:schedule_conclusion_list 插入异常"; Console.WriteLine(msg); Yw.LogHelper.Info(msg); } } if (schedule_pump_list != null && schedule_pump_list.Any()) { bol = _service_schedule_pump.Inserts(schedule_pump_list); if (!bol) { var msg = $"{date}:schedule_pump_list 插入异常"; Console.WriteLine(msg); Yw.LogHelper.Info(msg); } }; } //} //catch (Exception ex) //{ // var msg = $"异常!{ex.Message}"; // Console.WriteLine(msg); // Yw.LogHelper.Error("异常!", ex); //} return true; } ///// ///// 历史数据验证 ///// ///// 验证标识 ///// 文件 ///// 流量Scada标识字典 ///// 压力Scada标识字典 ///// 每日分析数据 ///// //public static List Verify(long verify_id, string file_path, Dictionary flow_id_mapping_dict, Dictionary pressure_id_mapping_dict, List day_value_list) //{ // var log_title = "初始化"; // var log_msg = string.Empty; // var hydraulic_record_list = new List(); // if (flow_id_mapping_dict == null || !flow_id_mapping_dict.Any()) // { // log_msg = "流量标签字典为空!"; // return default; // } // if (pressure_id_mapping_dict == null || !pressure_id_mapping_dict.Any()) // { // log_msg = "压力标签字典为空!"; // return default; // } // if (day_value_list == null || !day_value_list.Any()) // { // log_msg = "日验证数据为空!"; // return default; // } // var err = EpanetMethods.ENopen(file_path, "", ""); // if (err != 0) // { // log_msg = err.GetMsg(); // return default; // } // err = EpanetMethods.ENopenH(); // if (err != 0) // { // log_msg = err.GetMsg(); // return default; // } // log_msg = "初始化成功"; // log_title = "验证"; // var model_time_step = 0; // var model_id_build = new StringBuilder(31); // foreach (var day_value in day_value_list) // { // var pattern_list = day_value.PatternList; // var time_value_list = day_value.TimeValueList; // if (pattern_list == null || time_value_list == null) // { // continue; // } // 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(); // continue; // } // err = EpanetMethods.ENsetpattern(pattern_index, pattern_factor_array, pattern_factor_array_count); // if (err != ErrorCode.Ok) // { // pattern_init = false; // log_msg = err.GetMsg(); // continue; // } // } // if (!pattern_init) // { // log_msg = $"{day_value.Year}_{day_value.Month}_{day_value.Day}:模式初始化失败!"; // 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; // 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.ModeValue = (double)model_value; // record.ScadaValue = scada_value; // if (record.ModeValue.HasValue) // record.ModeValue = Math.Abs(record.ModeValue.Value); // record.DifferenceValue = record.ScadaValue - record.ModeValue; // hydraulic_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.ModeValue = (double)model_value; // record.ScadaValue = scada_value; // if (record.ModeValue.HasValue) // record.ModeValue = Math.Abs(record.ModeValue.Value); // record.DifferenceValue = record.ScadaValue - record.ModeValue; // hydraulic_record_list.Add(record); // } // } // } // EpanetMethods.ENnextH(out model_time_step); // } while (model_time_step > 0); // } // EpanetMethods.ENcloseH(); // return hydraulic_record_list; //} } }