using System; using System.Collections.Generic; using System.Linq; using System.Numerics; using System.Text; using System.Threading.Tasks; using IStation.Calculation.DispatchAna.Model; namespace IStation.Calculation.DispatchAna { /// /// 陈行二输调度方案计算器(最优方案) /// public class Calculator_OptAna_SHYS_陈行二输: CalculatorBase_SHYS_陈行二输, IOptAnaCalc { List _allMachineList = null; /// /// / /// public Calculator_OptAna_SHYS_陈行二输() { } #region 计算 最优方案 /// /// 计算 最优方案 /// /// /// /// /// /// public List CalcSchemes( IStation.Calculation.DispatchAna.Model.RequestParasComplex complex_request_paras, IStation.Calculation.DispatchAna.Model.EtaAnaRecord4Station eta_ana_records, IStation.Calculation.DispatchAna.Model.MachineRunPara machine_run_status, out string error_info) { this._corpID = complex_request_paras.CorpID; this._stationID = complex_request_paras.StationID; var isUsePress = complex_request_paras.PressValueType == Model.RequestParasComplex.ePressValueType.压力 ? true : false; if (isUsePress) return CalcSchemes压力(complex_request_paras, machine_run_status, out error_info); else return CalcSchemes扬程(complex_request_paras, machine_run_status, out error_info); } /// /// /// /// /// /// /// protected override List CalcSchemes压力( IStation.Calculation.DispatchAna.Model.RequestParasComplex complex_request_paras, IStation.Calculation.DispatchAna.Model.MachineRunPara machine_run_status, out string error_info) { error_info = ""; if (complex_request_paras == null) { error_info = "ERROR 30"; return null; } if (complex_request_paras.OutletPipePara == null || complex_request_paras.OutletPipePara.Count < 2) { error_info = "ERROR 35,陈行二输需要两个管路的流量"; return null; } double pipe1_TargetFlow = complex_request_paras.OutletPipePara[0].TargetFlow; double pipe2_TargetFlow = complex_request_paras.OutletPipePara[1].TargetFlow; if (pipe1_TargetFlow < 50 && pipe2_TargetFlow < 50) {//都关机 error_info = "ERROR 35,陈行二输需要两个管路的流量都为0"; return null; } double pipe1_TargetPess = complex_request_paras.OutletPipePara[0].TargetPress; double pipe2_TargetPess = complex_request_paras.OutletPipePara[1].TargetPress; if (pipe1_TargetFlow > 50) { if (pipe1_TargetPess < 0.01) { error_info = "ERROR 35,陈行二输需要一号管压力未赋值"; return default; } } if (pipe2_TargetFlow > 50) { if (pipe2_TargetPess < 0.01) { error_info = "ERROR 35,陈行二输需要二号管压力未赋值"; return default; } } double water_level = 0;//水位 if (complex_request_paras.InletPipePara != null && complex_request_paras.InletPipePara.Count > 0) { water_level = complex_request_paras.InletPipePara[0].Value; } //机泵信息 if (_allMachineList == null) { if (!BuildMachineList( out _allMachineList, out error_info)) { error_info = "机泵组无法构建,ERROR 70,错误信息:" + error_info; return null; } } Common.DispatchAnaGeneralHelper压力 calc_pipe1_helper = new Common.DispatchAnaGeneralHelper压力(); Common.DispatchAnaGeneralHelper压力 calc_pipe2_helper = new Common.DispatchAnaGeneralHelper压力(); if (pipe2_TargetFlow < 50) {//只开一号泵二号泵 calc_pipe1_helper.InitialParas( pipe1_TargetFlow, water_level,true , pipe1_TargetPess,false , null, null, (from x in _allMachineList where pipe1_machineIds.Contains(x.MachineID) select x).ToList(), machine_run_status == null ? null : machine_run_status.MachineRunFilter); return calc_pipe1_helper.CalcOptList(complex_request_paras.SchemeSortType, 3); } else if (pipe1_TargetFlow < 50) { calc_pipe2_helper.InitialParas( pipe2_TargetFlow, water_level, true, pipe2_TargetPess, false, null, null, (from x in _allMachineList where pipe2_machineIds.Contains(x.MachineID) select x).ToList(), machine_run_status == null ? null : machine_run_status.MachineRunFilter); return calc_pipe2_helper.CalcOptList(complex_request_paras.SchemeSortType, 3); } calc_pipe1_helper.InitialParas( pipe1_TargetFlow, water_level,true , pipe1_TargetPess,false , null, null, (from x in _allMachineList where pipe1_machineIds.Contains(x.MachineID) select x).ToList(), machine_run_status == null ? null : machine_run_status.MachineRunFilter); var pipe1_result = calc_pipe1_helper.CalcOptList(complex_request_paras.SchemeSortType, 3); if (pipe1_result == null) { error_info = String.Format("管路一调度方案无法计算,请确认数据是否合理,液位:{0}m,出口压力:{1}MPa,流量要求:{2}", water_level, pipe1_TargetPess, pipe1_TargetFlow); return null; } calc_pipe2_helper.InitialParas( pipe2_TargetFlow, water_level, true, pipe2_TargetPess, false, null, null, (from x in _allMachineList where pipe2_machineIds.Contains(x.MachineID) select x).ToList(), machine_run_status == null ? null : machine_run_status.MachineRunFilter); var pipe2_result = calc_pipe2_helper.CalcOptList(complex_request_paras.SchemeSortType, 3); if (pipe2_result == null) { error_info = String.Format("管路2调度方案无法计算,请确认数据是否合理,液位:{0}m,出口压力:{1}MPa,流量要求:{2}", water_level, pipe2_TargetPess, pipe2_TargetFlow); return null; } var result_1 = pipe1_result.First(); var result_2 = pipe2_result.First(); var plan = new Model.AnaScheme(); plan.ID = 1; plan.TotalWrkQ = result_1.TotalWrkQ + result_2.TotalWrkQ; plan.TotalWrkH = result_1.TotalWrkH + result_2.TotalWrkH; plan.TotalWrkP = result_1.TotalWrkP + result_2.TotalWrkP; plan.TotalWrkE = IStation.Common.PumpParaHelper.CalculateE(plan.TotalWrkQ, plan.TotalWrkH, plan.TotalWrkP); plan.UWP = CalculateUWP(plan.TotalWrkP, plan.TotalWrkQ, plan.TotalWrkH); plan.WP = CalculateWP(plan.TotalWrkP, plan.TotalWrkQ); plan.Items = new List(); if (result_1.Items != null && result_1.Items.Count > 0) plan.Items.AddRange(result_1.Items); if (result_2.Items != null && result_2.Items.Count > 0) plan.Items.AddRange(result_2.Items); return new List() { plan }; } private List CalcSchemes扬程( IStation.Calculation.DispatchAna.Model.RequestParasComplex complex_request_paras, IStation.Calculation.DispatchAna.Model.MachineRunPara machine_run_status, out string error_info) { error_info = ""; if (complex_request_paras == null) { error_info = "ERROR 30"; return null; } if (complex_request_paras.OutletPipePara == null || complex_request_paras.OutletPipePara.Count < 2) { error_info = "ERROR 35,陈行二输需要两个管路的流量"; return null; } double pipe1_TargetFlow = complex_request_paras.OutletPipePara[0].TargetFlow; double pipe2_TargetFlow = complex_request_paras.OutletPipePara[1].TargetFlow; if (pipe1_TargetFlow < 50 && pipe2_TargetFlow < 50) {//都关机 error_info = "ERROR 35,陈行二输需要两个管路的流量 都为0"; return null; } double pipe1_TargetHead = complex_request_paras.OutletPipePara[0].TargetPress; double pipe2_TargetHead = complex_request_paras.OutletPipePara[1].TargetPress; if (pipe1_TargetFlow > 50) { if (pipe1_TargetHead < 0.01) { error_info = "ERROR 35,陈行二输需要一号管压力未赋值"; return default; } } if (pipe2_TargetFlow > 50) { if (pipe2_TargetHead < 0.01) { error_info = "ERROR 35,陈行二输需要二号管压力未赋值"; return default; } } //机泵信息 if (_allMachineList == null) { if (!BuildMachineList( out _allMachineList, out error_info)) { error_info = "机泵组无法构建,ERROR 70,错误信息:" + error_info; return null; } } Common.DispatchAnaGeneralHelper扬程 calc_pipe1_helper = new Common.DispatchAnaGeneralHelper扬程(); Common.DispatchAnaGeneralHelper扬程 calc_pipe2_helper = new Common.DispatchAnaGeneralHelper扬程(); if (pipe2_TargetFlow < 50) {//只开一号泵二号泵 calc_pipe1_helper.InitialParas( pipe1_TargetFlow, pipe1_TargetHead, null, null, (from x in _allMachineList where pipe1_machineIds.Contains(x.MachineID) select x).ToList(), machine_run_status == null ? null : machine_run_status.MachineRunFilter); return calc_pipe1_helper.CalcOptList(complex_request_paras.SchemeSortType, 3); } else if (pipe1_TargetFlow < 50) { calc_pipe2_helper.InitialParas( pipe2_TargetFlow, pipe2_TargetHead, null, null, (from x in _allMachineList where pipe2_machineIds.Contains(x.MachineID) select x).ToList(), machine_run_status == null ? null : machine_run_status.MachineRunFilter); return calc_pipe2_helper.CalcOptList(complex_request_paras.SchemeSortType, 3); } calc_pipe1_helper.InitialParas( pipe1_TargetFlow, pipe1_TargetHead, null, null, (from x in _allMachineList where pipe1_machineIds.Contains(x.MachineID) select x).ToList(), machine_run_status == null ? null : machine_run_status.MachineRunFilter); var pipe1_result = calc_pipe1_helper.CalcOptList(complex_request_paras.SchemeSortType, 3); if (pipe1_result == null) { error_info = String.Format("管路一调度方案无法计算,请确认数据是否合理, 流量要求:{1},扬程{0}m", pipe1_TargetFlow, pipe1_TargetHead); return null; } calc_pipe2_helper.InitialParas( pipe2_TargetFlow, pipe2_TargetHead, null, null, (from x in _allMachineList where pipe2_machineIds.Contains(x.MachineID) select x).ToList(), machine_run_status == null ? null : machine_run_status.MachineRunFilter); var pipe2_result = calc_pipe2_helper.CalcOptList(complex_request_paras.SchemeSortType, 3); if (pipe2_result == null) { error_info = String.Format("管路一调度方案无法计算,请确认数据是否合理, 流量要求:{1},扬程{0}m", pipe2_TargetFlow, pipe2_TargetHead); return null; } var result_1 = pipe1_result.First(); var result_2 = pipe2_result.First(); var plan = new Model.AnaScheme(); plan.ID = 1; plan.TotalWrkQ = result_1.TotalWrkQ + result_2.TotalWrkQ; plan.TotalWrkH = (result_1.TotalWrkH + result_2.TotalWrkH)/2; plan.TotalWrkP = result_1.TotalWrkP + result_2.TotalWrkP; plan.TotalWrkE = IStation.Common.PumpParaHelper.CalculateE(plan.TotalWrkQ, plan.TotalWrkH, plan.TotalWrkP); plan.UWP = CalculateUWP(plan.TotalWrkP, plan.TotalWrkQ, plan.TotalWrkH); plan.WP = CalculateWP(plan.TotalWrkP, plan.TotalWrkQ); plan.Items = new List(); if (result_1.Items != null && result_1.Items.Count > 0) plan.Items.AddRange(result_1.Items); if (result_2.Items != null && result_2.Items.Count > 0) plan.Items.AddRange(result_2.Items); return new List() { plan }; } #endregion } }