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;
}
}
}