using System; using System.Collections.Generic; using System.IO.Pipelines; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IStation.Calculation.DispatchAna { /// /// /// public class CalculatorOptAnaBase: CalculatorBase { /// /// 计算最优方案 /// /// /// /// /// protected virtual List CalcSchemes压力( IStation.Calculation.DispatchAna.Model.RequestParasComplex complex_request_paras, IStation.Calculation.DispatchAna.Model.MachineRunPara machine_run_status, out string error_info) { error_info = "未实例化"; return null; } Dictionary _dict = new Dictionary(); /// /// 计算汇总数据 /// /// /// 是否用缓存 /// /// public virtual IStation.Calculation.DispatchAna.Model.DaySumData CalcSumData( List HourRequests, bool isUseCache, out string error_info) { error_info = null; IStation.Calculation.DispatchAna.Model.DaySumData sum = new Model.DaySumData(); sum.Qt = 0; foreach (var hourRequest in HourRequests) { var complex_request_paras = hourRequest.Request; #region 检查数据 if (complex_request_paras.OutletPipePara == null || complex_request_paras.OutletPipePara.Count < 1) { error_info = string.Format("第{0},分析出错,原因是:{1}", hourRequest.Hour + 1, "出口管路参数有误, 请确认是否赋值, ERROR 35"); return null; } StringBuilder cacheNameBuilder = new StringBuilder(); double target_flow = 0; bool isHaveSetPress = false; foreach (var pipe in complex_request_paras.OutletPipePara) { target_flow += pipe.TargetFlow; if (pipe.TargetPress > 0.01) { isHaveSetPress = true; } cacheNameBuilder.AppendFormat("Q{0}H{1}", Math.Round(pipe.TargetFlow, 0), Math.Round(pipe.TargetPress, 3)); } if (target_flow < 50) {//检查流量 continue; } if (!isHaveSetPress) {//检查压力 continue; } if (complex_request_paras.WaterLevelPara != null) { foreach (var wl in complex_request_paras.WaterLevelPara) { cacheNameBuilder.AppendFormat("V{0}", Math.Round(wl.Value, 0)); } } #endregion //由于循环调取,所以以前分析数据缓存起来 var cacheName = cacheNameBuilder.ToString(); IStation.Calculation.DispatchAna.Model.AnaScheme opt_anaScheme; if (_dict.ContainsKey(cacheName)) { opt_anaScheme = _dict[cacheName]; } else { var result_anaSchemes = CalcSchemes压力(complex_request_paras, null, out error_info); if (result_anaSchemes == null || result_anaSchemes.Count == 0) { error_info = string.Format("第{0},分析出错,原因是:{1}", hourRequest.Hour + 1, error_info); return null; } opt_anaScheme = result_anaSchemes.First(); _dict[cacheName] = opt_anaScheme; } //汇总 sum.Qt = sum.Qt + opt_anaScheme.TotalWrkQ; sum.Dt = sum.Dt + opt_anaScheme.TotalWrkP; } sum.WP = CalculateWP(sum.Dt, sum.Qt); return sum; } } }