namespace IStation.Application { /// /// 调度 /// [Route("ChenHang/Dispatch")] [ApiDescriptionSettings("Web", Name = "优化调度", Order = 3)] public class OptimalSchedule_Controller : IDynamicApiController { private readonly Service.ScheduleRequest _service_schedule_request = new(); private readonly Service.ScheduleConclusion _service_schedule_conclusion = new(); private readonly Service.SchedulePump _service_schedule_pump = new(); /// ///获取泵站列表 /// [Route("GetStationList@V1.0")] [HttpGet] public List GetStationList() { var station1 = new StationTreeItemOutput() { ID = 1, Name = "陈行1输", SortCode = 1 }; var station2 = new StationTreeItemOutput() { ID = 2, Name = "陈行2输", SortCode = 2 }; return new List() { station1, station2 }; } /// /// 调度 /// [AllowAnonymous] [Route("Calculate@V1.0")] [HttpPost] public OptScheduleOutput Calculate([Required] OptScheduleStationInput input) { var stationId = input.StationID; var e_station = stationId == 1 ? IStation.eDockingStation.Ch1s : IStation.eDockingStation.Ch2s; var receipt_time = DateTime.Now; var request_id = Yw.YitIdHelper.NextId(); var log_title = string.Empty; var station = new Service.Station().Get(); var water_level = input.WaterLevel; var target_flow = input.TargetFlow; var target_pressure = input.TargetPressure; var target_head = Curve.PumpCalculateHelper.Mpa2M(target_pressure) - water_level; log_title = "需水请求"; Log.Info(request_id, log_title, $"water_level:{water_level},target_flow:{target_flow},target_pressure:{target_pressure},target_head:{target_head}"); Log.Debug(request_id, log_title, JsonHelper.Object2Json(input)); List pumps = null; List flags_part1 = null, flags_part2 = null, current_open_pump_flags = null; if (e_station == IStation.eDockingStation.Ch1s) { pumps = station.S1; flags_part1 = station.S1FlagsPart1; flags_part2 = station.S1FlagsPart2; } else { pumps = station.S2; flags_part1 = station.S2FlagsPart1; flags_part2 = station.S2FlagsPart2; } var helper = new IStation.Algorithm.ScheduleHelper(); var optimal_combine = helper.Calc(pumps, flags_part1, flags_part2, target_flow, target_head); var schedule_request = new Model.ScheduleRequest(); schedule_request.ID = request_id; if (stationId == 1) { schedule_request.WaterLevel1 = water_level; schedule_request.TargetFlow1 = target_flow; schedule_request.TargetPressure1 = target_pressure; schedule_request.ScheduleStatus1 = optimal_combine != null; } else { schedule_request.WaterLevel2 = water_level; schedule_request.TargetFlow2 = target_flow; schedule_request.TargetPressure2 = target_pressure; schedule_request.ScheduleStatus2 = optimal_combine != null; } schedule_request.TotalTimeSpent = (DateTime.Now - receipt_time).TotalSeconds; schedule_request.ReceptionTime = receipt_time; Model.ScheduleConclusion schedule_solution = null; List schedule_pump_list = null; OptScheduleOutput output = null; var msg = "计算成功"; log_title = "调度返回"; if (optimal_combine == null) { Log.Info(request_id, log_title, $"{stationId}:调度计算失败,无法满足目标流量:{target_flow},目标压力:{target_pressure}!"); Yw.Dto.YOops.Oh(Yw.Dto.eResultCode.Error, Yw.Dto.InternalErrorCodes.A001, $"{stationId}:调度计算失败,无法满足目标流量:{target_flow},目标压力:{target_pressure}!"); } else { schedule_solution = new Model.ScheduleConclusion(); schedule_solution.ID = Yw.YitIdHelper.NextId(); schedule_solution.RequestID = request_id; schedule_solution.Station = e_station; schedule_solution.TotalFlow = optimal_combine.Flow; schedule_solution.TotalHead = optimal_combine.Head; schedule_solution.TotalPower = optimal_combine.Power; schedule_solution.TotalEfficiency = optimal_combine.Efficiency; schedule_solution.WP = optimal_combine.WP; schedule_solution.UWP = optimal_combine.UWP; schedule_solution.Flags = IntListHelper.ToString(optimal_combine.Flags); schedule_solution.MeritRatio = optimal_combine.MeritRatio; schedule_pump_list = new List(); output = new OptScheduleOutput(); output.Station = new OptScheduleStationOutput(); output.Station.TotalFlow = optimal_combine.Flow; output.Station.TotalPressure = Math.Round(Curve.PumpCalculateHelper.M2Mpa(optimal_combine.Head), 4); output.Station.TotalPower = optimal_combine.Power; output.Station.TotalEfficiency = optimal_combine.Efficiency; output.Station.WP = optimal_combine.WP; output.Station.UWP = optimal_combine.UWP; output.Pumps = new List(); foreach (var combine in optimal_combine.Combines) { foreach (var fre_pump in combine.FrePumps) { var flag = fre_pump.Flag; var chPump = new OptSchedulePumpOutput(); chPump.ID = flag; chPump.Name = flag + "#"; chPump.Flow = fre_pump.Flow; chPump.Head = fre_pump.Head; chPump.Power = fre_pump.Power; chPump.Efficiency = fre_pump.Efficiency; chPump.Frequency = fre_pump.Frequency; chPump.Speed = fre_pump.Speed; chPump.Status = 1; output.Pumps.Add(chPump); var schedule_pump = new Model.SchedulePump(); schedule_pump.RequestID = request_id; schedule_pump.Station = e_station; 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_list.Add(schedule_pump); } } } Log.Info(request_id, log_title, msg); try { log_title = "存储方案"; var bol = false; bol = _service_schedule_request.Insert(schedule_request) > 0; if (!bol) { Log.Info(request_id, log_title, "schedule_request 插入异常"); Log.Debug(request_id, log_title, JsonHelper.Object2Json(schedule_request)); } if (schedule_solution != null) { bol = _service_schedule_conclusion.Insert(schedule_solution) > 0; if (!bol) { Log.Info(request_id, log_title, "schedule_solution 插入异常"); Log.Debug(request_id, log_title, JsonHelper.Object2Json(schedule_solution)); } } if (schedule_pump_list != null) { bol = _service_schedule_pump.Inserts(schedule_pump_list); if (!bol) { Log.Info(request_id, log_title, "schedule_pump_list 插入异常"); Log.Debug(request_id, log_title, JsonHelper.Object2Json(schedule_pump_list)); } } } catch (Exception ex) { Log.Error(request_id, log_title, "数据库异常!", ex); } return output; } } }