namespace IStation.Application
{
///
/// 调度决策
///
[AllowAnonymous]
[Route("Web/ScheduleDecision")]
[ApiDescriptionSettings("Web", Name = "决策调度", Order = 2)]
public class ScheduleDecision_Controller : IDynamicApiController, ITransient
{
private static readonly Service.ScheduleRequest _service_schedule_request = 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();
private static readonly Service.Station _service_station = new();
private static readonly Service.ScheduleConfig _service_schedule_config = new();
private static readonly Service.AnalysisFactor _service_analysis_factor = new();
private static readonly Service.AnalysisDeviation _service_analysis_deviation = new();
private static readonly string _model_file = Path.Combine(
Settings.ParasHelper.LocalFile.DataFolderDirectory,
Settings.ParasHelper.LocalFile.HydraulicModelFile);
///
/// 获取监测值
///
[Route("GetMonitorValue@V1.0")]
[HttpGet]
public ScheduleMonitorOutput GetMonitorValue()
{
GlobalHelper.GetMonitorRecordList(DateTime.Now, out List monitor_record_list, true);
GlobalHelper.GetPipeFlagFlowAndPressureDict(monitor_record_list, out Dictionary> station1_pipe_flag_flow_pressure_dict, out Dictionary> station2_pipe_flag_flow_pressure_dict);
var output = new ScheduleMonitorOutput();
var target_flow1 = station1_pipe_flag_flow_pressure_dict.Sum(x => x.Value.Item1) ?? 0;
var target_pressure1 = station1_pipe_flag_flow_pressure_dict.Average(x => x.Value.Item2) ?? 0;
var target_flow2 = station2_pipe_flag_flow_pressure_dict.Sum(x => x.Value.Item1) ?? 0;
var target_pressure2 = station2_pipe_flag_flow_pressure_dict.Average(x => x.Value.Item2) ?? 0;
target_flow1.Round(1);
target_pressure1.M2Mpa();
target_pressure1.Round(5);
target_flow2.Round(1);
target_pressure2.M2Mpa();
target_pressure2.Round(5);
output.TargetFlow1 = target_flow1;
output.TargetFlow2 = target_flow2;
output.TargetPressure1 = target_pressure1;
output.TargetPressure2 = target_pressure2;
return output;
}
///
/// 计算
///
[Route("Calculate@V1.0")]
[HttpPost]
public DecisionCalcOutput Calculate([Required] ScheduleCalcInput input)
{
var receipt_time = DateTime.Now;
var request_id = Yw.YitIdHelper.NextId();
var station_info = _service_station.Get();
if (station_info == null)
{
throw Yw.Dto.YOops.Oh(Yw.Dto.eResultCode.Error, Yw.Dto.InternalErrorCodes.A001, $"基础信息文件缺失!");
}
var target_flow1 = input.TargetFlow1;
var target_mpa_pressure1 = input.TargetPressure1;
var target_flow2 = input.TargetFlow2;
var target_mpa_pressure2 = input.TargetPressure2;
var target_pressure1 = Curve.PumpCalculateHelper.Mpa2M(target_mpa_pressure1);
var target_pressure2 = Curve.PumpCalculateHelper.Mpa2M(target_mpa_pressure2);
GlobalHelper.GetMonitorRecordList(receipt_time, out List monitor_record_list, true);
var station1 = station_info.Station1;
var station2 = station_info.Station2;
var station1_schedule_config = _service_schedule_config.GetStation1();
var station2_schedule_config = _service_schedule_config.GetStation2();
var station1_flag_list = GlobalHelper.Station1FlagList;
var station2_flag_list = GlobalHelper.Station2FlagList;
var analysis_deviation_list = _service_analysis_deviation.GetList();
var analysis_factor_list = _service_analysis_factor.GetList();
GlobalHelper.GetStationOpenFlagList(monitor_record_list, out List station1_open_flag_list, out List station2_open_flag_list);
GlobalHelper.GetStationFlagStateList(monitor_record_list, out List station1_flag_maintenance_list, out List station2_maintenance_flag_list, out List station1_priority_flag_list, out List station2_priority_flag_list);
GlobalHelper.GetFlagInletWaterLevelDict(monitor_record_list, out Dictionary station1_flag_inlet_water_level_dict, out Dictionary station2_flag_inlet_water_level_dict);
GlobalHelper.GetPipeFlagFlowAndPressureDict(monitor_record_list, out Dictionary> station1_pipe_flag_flow_pressure_dict, out Dictionary> station2_pipe_flag_flow_pressure_dict);
GlobalHelper.GetFlagRpmAndFlowAndPressureDict(monitor_record_list, out Dictionary> station1_flag_rpm_pressure_dict, out Dictionary> station2_flag_rpm_flow_pressure_dict);
if (station1_flag_maintenance_list != null && station1_flag_maintenance_list.Any())
{
ScheduleLog.Info(request_id, "机泵检修", $"1输水:{Yw.Untity.IntListHelper.ToString(station1_flag_maintenance_list)}");
station1_schedule_config.MustCloseFlagList.AddRange(station1_flag_maintenance_list);
}
if (station2_maintenance_flag_list != null && station2_maintenance_flag_list.Any())
{
ScheduleLog.Info(request_id, "机泵检修", $"2输水:{Yw.Untity.IntListHelper.ToString(station2_maintenance_flag_list)}");
station2_schedule_config.MustCloseFlagList.AddRange(station2_maintenance_flag_list);
}
if (station1_priority_flag_list != null && station1_priority_flag_list.Any())
{
ScheduleLog.Info(request_id, "机泵优先", $"1输水:{Yw.Untity.IntListHelper.ToString(station1_priority_flag_list)}");
station1_schedule_config.MustOpenFlagList.AddRange(station1_priority_flag_list);
}
if (station2_priority_flag_list != null && station2_priority_flag_list.Any())
{
ScheduleLog.Info(request_id, "机泵优先", $"2输水:{Yw.Untity.IntListHelper.ToString(station2_priority_flag_list)}");
station2_schedule_config.MustOpenFlagList.AddRange(station2_priority_flag_list);
}
analysis_deviation_list = null;
var helper = new Service.ScheduleHelper();
helper.Initial(station1_open_flag_list, station1_schedule_config, analysis_deviation_list);
var optimal_combine1 = helper.GetOptAnaCombine(station1, station1_flag_inlet_water_level_dict, target_flow1, target_pressure1);
helper.Initial(station2_open_flag_list, station2_schedule_config, analysis_deviation_list);
var optimal_combine2 = helper.GetOptAnaCombine(station2, station2_flag_inlet_water_level_dict, target_flow2, target_pressure2);
if (optimal_combine1 == null && optimal_combine2 == null)
{
throw Yw.Dto.YOops.Oh(Yw.Dto.eResultCode.Error, Yw.Dto.InternalErrorCodes.A001, $"计算失败!");
}
var pump_id_mapping_dict = GlobalHelper.ModelPumpIdMappingDict;
var pattern_id_mapping_dict = GlobalHelper.ModelPatternIdMappingDict;
var output = new DecisionCalcOutput();
output.PumpCompares1 = new List();
output.PumpCompares2 = new List();
if (optimal_combine1 != null)
{
optimal_combine1.Round();
var pump_bp_dict = station1.ToDictionary(x => x.Flag, x => x.IsBp);
foreach (var flag in GlobalHelper.Station1FlagList)
{
var name = $"{flag}#泵";
var rpm_pressure = station1_flag_rpm_pressure_dict[flag];
var wl = station1_flag_inlet_water_level_dict[flag];
var compare = new DecisionPumpCompare();
compare.SrcWaterLevel = wl;
compare.Name = name;
compare.SrcSpeed = rpm_pressure.Item1;
compare.SrcPressure = rpm_pressure.Item2;
output.PumpCompares1.Add(compare);
var fre_pump = optimal_combine1.AnaFrePumps.Find(x => x.Flag == flag);
if (fre_pump != null)
{
var pressure = fre_pump.PressureDiff + wl;
compare.CalcSpeed = fre_pump.Speed;
compare.DiffSpeed = compare.CalcSpeed - compare.SrcSpeed;
compare.CalcFlow = fre_pump.Flow;
//compare.DiffFlow = compare.CalcFlow - compare.SrcFlow;
compare.DiffFlow = null;
compare.CalcPressure = Math.Round(pressure, 1);
compare.DiffPressure = compare.CalcPressure - compare.SrcPressure;
if (compare.DiffSpeed.HasValue)
compare.DiffSpeed = Math.Round(compare.DiffSpeed.Value, 1);
if (compare.DiffPressure.HasValue)
compare.DiffPressure = Math.Round(compare.DiffPressure.Value, 1);
}
}
}
if (optimal_combine2 != null)
{
optimal_combine2.Round();
var pump_bp_dict = station2.ToDictionary(x => x.Flag, x => x.IsBp);
foreach (var flag in GlobalHelper.Station2FlagList)
{
var name = $"{flag}#泵";
var rpm_pressure = station2_flag_rpm_flow_pressure_dict[flag];
var wl = station2_flag_inlet_water_level_dict[flag];
var compare = new DecisionPumpCompare();
compare.Name = name;
compare.SrcWaterLevel = wl;
compare.SrcSpeed = rpm_pressure.Item1;
compare.SrcFlow = rpm_pressure.Item2;
compare.SrcPressure = rpm_pressure.Item3;
output.PumpCompares2.Add(compare);
var fre_pump = optimal_combine2.AnaFrePumps.Find(x => x.Flag == flag);
if (fre_pump != null)
{
var pressure = fre_pump.PressureDiff + wl;
compare.CalcSpeed = fre_pump.Speed;
compare.DiffSpeed = compare.CalcSpeed - compare.SrcSpeed;
compare.CalcFlow = fre_pump.Flow;
compare.DiffFlow = compare.CalcFlow - compare.SrcFlow;
compare.CalcPressure = Math.Round(pressure,1);
compare.DiffPressure = compare.CalcPressure - compare.SrcPressure;
if (compare.DiffSpeed.HasValue)
compare.DiffSpeed = Math.Round(compare.DiffSpeed.Value, 1);
if (compare.DiffPressure.HasValue)
compare.DiffPressure = Math.Round(compare.DiffPressure.Value, 1);
if (compare.DiffFlow.HasValue)
compare.DiffFlow = Math.Round(compare.DiffFlow.Value, 1);
}
}
}
return output;
}
}
}