using IStation.CalcModel;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace IStation.Calc.Core
|
{
|
internal class CalcPrj
|
{
|
bool isLimitLevel = false;
|
bool isIgnoreOpenLimitAble = false;
|
private List<Model.ElecPriceMonthSetting> _elePriceMonthList = null;
|
private List<IStation.CalcModel.PumpInfo> _allCalcPumpInfos;
|
|
public CalcPrj() { }
|
|
public string Calc(IStation.CalcModel.AnaRequest anaRequest, out AnaPrj defaultPrj)
|
{
|
InitalPumpInfo();
|
InitialElePrice();
|
|
var calcHelper = GetCalcHelper(anaRequest);
|
//string error_info = null;
|
//var prj = calcHelper.CalcOptPrjs(out error_info);
|
|
string error_info;
|
var anaPrjs = calcHelper.CalcOptPrjs(out error_info);
|
|
if (!string.IsNullOrEmpty(error_info) || anaPrjs == null || anaPrjs.Count() == 0)
|
{
|
defaultPrj = null;
|
return error_info;
|
}
|
anaPrjs.Sort(new AnaPrj.Comparer(anaRequest.CalcOptType));
|
|
defaultPrj = anaPrjs.First();
|
|
return null;
|
}
|
/// <summary>
|
/// 构建计算辅助类
|
/// </summary>
|
/// <param name="isIgnoreOpenLimitAble"></param>
|
/// <returns></returns>
|
private IStation.Calc.ErQuCalcBaseHelper GetCalcHelper(IStation.CalcModel.AnaRequest anaRequest)
|
{
|
IStation.Calc.ErQuCalcBaseHelper calcHelper = IStation.Calc.ErQuCalcBaseHelper.Build();
|
calcHelper.MinOpenPumpMinute = IStation.AnaGlobalParas.Setting.MinOpenTimeMinute;
|
calcHelper.MinSwitchPumpMinute = IStation.AnaGlobalParas.Setting.MinSwitchTimeMinute;
|
|
if (isLimitLevel)
|
{
|
calcHelper.CalcSpaceMinute = IStation.AnaGlobalParas.Setting.CalcSpaceMinuteL;
|
calcHelper.MaxPumpSwitchCount = IStation.AnaGlobalParas.Setting.MaxPumpSwitchCountL;
|
}
|
else
|
{
|
calcHelper.CalcSpaceMinute = IStation.AnaGlobalParas.Setting.CalcSpaceMinuteQ;
|
calcHelper.MaxPumpSwitchCount = IStation.AnaGlobalParas.Setting.MaxPumpSwitchCountQ;
|
}
|
DateTime rangeStartTime = anaRequest.StartTime ;
|
DateTime rangeEndTime = anaRequest.EndTime;
|
calcHelper.SetPumpInfo(_allCalcPumpInfos);
|
calcHelper.SetCalcTimeRange(rangeStartTime, rangeEndTime);
|
calcHelper.StartOpenCount = anaRequest.StartOpenCount;// Convert.ToInt32(imageComboCurrentOpenCount.EditValue);
|
|
calcHelper.ElecPrice = _elePriceMonthList;
|
|
calcHelper.IsDispDebug = false ;
|
calcHelper.OnShowDebugInfo += (info) =>
|
{
|
//if (tabPageDebug.PageVisible)
|
// this.listBoxDebug.Items.Add(info);
|
};
|
|
|
|
|
//不许切泵时间
|
if (IStation.AnaGlobalParas.Setting.SwitchPumpIgnoreTimes != null && IStation.AnaGlobalParas.Setting.SwitchPumpIgnoreTimes.Count > 0)
|
{
|
List<IStation.CalcModel.TimeRange> limit_times = new List<IStation.CalcModel.TimeRange>();
|
foreach (var t in IStation.AnaGlobalParas.Setting.SwitchPumpIgnoreTimes)
|
{
|
if (t.IsUse == false)
|
continue;
|
|
int ed_h = t.EndHour;
|
int st_h = t.StartHour;
|
|
IStation.CalcModel.TimeRange v = new IStation.CalcModel.TimeRange();
|
|
if (ed_h <= rangeStartTime.Hour)
|
{
|
var nextDay = rangeStartTime.AddDays(1);
|
v.Start = new DateTime(nextDay.Year, nextDay.Month,
|
nextDay.Day, st_h, t.StartMinute, 0);
|
}
|
else
|
{
|
v.Start = new DateTime(rangeStartTime.Year, rangeStartTime.Month,
|
rangeStartTime.Day, st_h, t.StartMinute, 0);
|
}
|
|
|
bool isNext = ed_h > 23 ? true : false;
|
if (isNext)
|
{
|
var nextDay = v.Start.AddDays(1);
|
v.End = new DateTime(nextDay.Year, nextDay.Month,
|
nextDay.Day, ed_h - 24, t.EndMinute, 0);
|
}
|
else
|
{
|
v.End = new DateTime(v.Start.Year, v.Start.Month,
|
v.Start.Day, ed_h, t.EndMinute, 0);
|
}
|
if (v.End > v.Start)
|
{
|
limit_times.Add(v);
|
}
|
}
|
calcHelper.LimitSwitchPumpTimes = limit_times;
|
}
|
|
|
//不许开泵时间
|
if (isIgnoreOpenLimitAble == true && IStation.AnaGlobalParas.Setting.OpenPumpTimes != null &&
|
IStation.AnaGlobalParas.Setting.OpenPumpTimes.Count > 0)
|
{
|
List<IStation.CalcModel.TimeRange> limit_times = new List<IStation.CalcModel.TimeRange>();
|
|
var listUse = (from x in IStation.AnaGlobalParas.Setting.OpenPumpTimes where x.IsUse select x).ToList();
|
if (listUse.Count == 1)
|
{
|
if (listUse[0].StartHour > 0 || listUse[0].StartMinute > 0)
|
{
|
limit_times.Add(new IStation.CalcModel.TimeRange()
|
{
|
Start = rangeStartTime,
|
End = new DateTime(
|
rangeStartTime.Year, rangeStartTime.Month, rangeStartTime.Day,
|
listUse[0].StartHour,
|
listUse[0].StartMinute,
|
0)
|
});
|
}
|
if (listUse[0].EndHour < 24)
|
{
|
limit_times.Add(new IStation.CalcModel.TimeRange()
|
{
|
Start = new DateTime(
|
rangeStartTime.Year, rangeStartTime.Month, rangeStartTime.Day,
|
listUse.Last().EndHour,
|
listUse.Last().EndMinute,
|
0),
|
End = new DateTime(rangeStartTime.Year, rangeStartTime.Month, rangeStartTime.Day, 23, 59, 59),
|
});
|
}
|
}
|
else if (listUse.Count() > 1)
|
{
|
for (int i = 0; i < listUse.Count(); i++)
|
{
|
if (i == 0)
|
{
|
if (listUse[0].StartHour > 0 || listUse[0].StartMinute > 0)
|
{
|
limit_times.Add(new IStation.CalcModel.TimeRange()
|
{
|
Start = rangeStartTime,
|
End = new DateTime(
|
rangeStartTime.Year, rangeStartTime.Month, rangeStartTime.Day,
|
listUse[0].StartHour,
|
listUse[0].StartMinute,
|
0)
|
});
|
}
|
}
|
else if (i == listUse.Count() - 1)
|
{
|
if (listUse.Last().EndHour < 24)
|
{
|
limit_times.Add(new IStation.CalcModel.TimeRange()
|
{
|
Start = new DateTime(
|
rangeStartTime.Year, rangeStartTime.Month, rangeStartTime.Day,
|
listUse.Last().EndHour,
|
listUse.Last().EndHour,
|
0),
|
End = new DateTime(
|
rangeStartTime.Year, rangeStartTime.Month, rangeStartTime.Day,
|
23,
|
59,
|
59)
|
});
|
}
|
}
|
else
|
{
|
limit_times.Add(new IStation.CalcModel.TimeRange()
|
{
|
Start = new DateTime(
|
rangeStartTime.Year, rangeStartTime.Month, rangeStartTime.Day,
|
listUse[i - 1].EndHour,
|
listUse[i - 1].EndHour,
|
0),
|
End = new DateTime(
|
rangeStartTime.Year, rangeStartTime.Month, rangeStartTime.Day,
|
listUse[i].StartHour,
|
listUse[i].StartHour,
|
0)
|
});
|
}
|
}
|
}
|
|
|
calcHelper.LimitOpenPumpTimes = limit_times;
|
|
if (limit_times.Count > 0)
|
{
|
if (limit_times[0].Start == rangeStartTime)
|
{
|
anaRequest.StartOpenCount = -1;//不考虑
|
}
|
}
|
}
|
|
|
|
|
calcHelper.SetAnaRequest(anaRequest);
|
|
|
|
return calcHelper;
|
}
|
|
#region 初始化
|
/// <summary>
|
///
|
/// </summary>
|
private void InitalPumpInfo()
|
{
|
|
var allCurveList = IStation.Common.PumpCurve.GetAll();
|
var allPumpMapList = IStation.Common.PumpCurveMapping.GetAll();
|
var allPumpList = IStation.Common.Product.GetAllPump();
|
|
_allCalcPumpInfos = new List<IStation.CalcModel.PumpInfo>();
|
foreach (var pump in allPumpList)
|
{
|
var curve_wrk_map = (from x in allPumpMapList where x.PumpID == pump.ID && x.IsWorking select x).FirstOrDefault();
|
if (curve_wrk_map == null)
|
{
|
IStation.LogHelper.Info(pump.Name + "未设置工作曲线");
|
return;
|
}
|
var curve = allCurveList.Find(x => x.ID == curve_wrk_map.CurveID);
|
|
IStation.CalcModel.PumpInfo calcPumpInfo = new IStation.CalcModel.PumpInfo();
|
calcPumpInfo.Product = pump;
|
calcPumpInfo.ID = pump.ID;
|
calcPumpInfo.Name = pump.Name;
|
calcPumpInfo.CurveInfo = curve.CurveInfo;
|
calcPumpInfo.RatedParas = pump.RatedParas;
|
|
_allCalcPumpInfos.Add(calcPumpInfo);
|
}
|
|
}
|
/// <summary>
|
///
|
/// </summary>
|
private void InitialElePrice()
|
{
|
|
var allPrices = IStation.Common.ElecPrice.GetAll();
|
_elePriceMonthList = allPrices.First().Settings.MonthList;
|
|
}
|
#endregion
|
|
}
|
}
|