using IStation.CalcModel;
|
using System;
|
using System.Collections.Generic;
|
using System.IO;
|
using System.Linq;
|
|
namespace IStation.Calc
|
{
|
internal partial class ErQuCalcBaseHelper
|
{
|
/// <summary>
|
/// 计算手动添加的项目
|
/// </summary>
|
/// <param name="TargetFlowTotal"></param>
|
/// <param name="error_info"></param>
|
/// <returns></returns>
|
public virtual bool CalcManuPrj(
|
ref AnaPrj prj,
|
List<CalcModel.PumpRunRange> ranges,
|
out string error_info)
|
{
|
error_info = null;
|
|
#region 检查数据
|
|
if (this._allPumpInfo == null || this._allPumpInfo.Count() != 5)
|
{
|
error_info = "泵台数不正确";
|
return false ;
|
}
|
if (this._riverWaterLevels == null || this._riverWaterLevels.Count() < 1)
|
{
|
error_info = "长江水位未赋值";
|
return false ;
|
}
|
|
if (_listRiverWaterLevelDrop == null)
|
{
|
_listRiverWaterLevelDrop = IStation.AnaGlobalParas.RiverWaterLevelDropList;
|
if (_listRiverWaterLevelDrop == null || _listRiverWaterLevelDrop.Count() == 0)
|
{
|
error_info = "无法读取长江水位与水池落差的关系数据";
|
return false ;
|
}
|
}
|
|
#endregion
|
|
|
|
|
//
|
int dd_minute = 0;
|
CalcTimeData(dd_minute);
|
|
|
|
#region 计算各个时间点的数据
|
var allSumData = new List<AnaPrjPointTime>();
|
double lastReservoirLevel = _start_level水库水位;
|
for (int t = 0; t < _timeDataListCount; t++)
|
{
|
var time = this._timeList[t];
|
int openPumpCount = 0;
|
foreach (var r in ranges)
|
{
|
if (time.Time >= r.StartTime && time.Time < r.EndTime)
|
{
|
openPumpCount = r.PumpNumber;
|
break;
|
}
|
}
|
double drop_per = 0;
|
if (t > 0)
|
{
|
drop_per = time.ReservoirDropFlowTotal - this._timeList[t - 1].ReservoirDropFlowTotal;
|
}
|
if (openPumpCount == 0)
|
{
|
var si = new AnaPrjPointTime(time);
|
var level = CalcReservoirHeight(drop_per, 0, lastReservoirLevel);
|
si.WaterLevelH = level;
|
lastReservoirLevel = level;
|
|
allSumData.Add(si);
|
}
|
else if (openPumpCount > 5)
|
{
|
error_info = "时间范围设置不合理,请检查";
|
return false;
|
}
|
else
|
{
|
var td = this.GetTimeDataBundle(openPumpCount);
|
|
var si = new AnaPrjPointTime(time, td.TimeDatas[t], openPumpCount);
|
|
var level = CalcReservoirHeight(drop_per, si.SumFlow, lastReservoirLevel);
|
si.WaterLevelH = level;
|
lastReservoirLevel = level;
|
|
allSumData.Add(si);
|
}
|
}
|
|
#endregion
|
|
|
|
List<DateTime> splitTimeList = new List<DateTime>();
|
splitTimeList.Add(this._calStartTime);
|
splitTimeList.Add(this._calEndTime);
|
|
foreach (var item in ranges)
|
{
|
if (!splitTimeList.Contains(item.StartTime))
|
splitTimeList.Add(item.StartTime);
|
if (!splitTimeList.Contains(item.EndTime))
|
splitTimeList.Add(item.EndTime);
|
}
|
splitTimeList = splitTimeList.Distinct().ToList();
|
splitTimeList.Sort();
|
|
|
if (prj == null)
|
prj = new AnaPrj();
|
prj.BlockTimes = new List<AnaPrjBlockTime>();
|
prj.PointTimes = new List<AnaPrjPointTime>();
|
prj.StartTime = this._calStartTime;
|
prj.EndTime = this._calEndTime;
|
double sumFlow_prj = 0;
|
double sumMoney_prj = 0;
|
double sumPower_prj = 0;
|
for (int st = 0; st < splitTimeList.Count - 1; st++)
|
{
|
DateTime startTime = splitTimeList[st];
|
DateTime endTime = splitTimeList[st + 1];
|
|
var start_index = allSumData.FindIndex(x=>x.Time == startTime);
|
var end_index = allSumData.FindIndex(x => x.Time == endTime);
|
|
if (start_index < 0)
|
start_index = 0;
|
start_index++;
|
if(st == 0)
|
start_index = 0;
|
|
end_index++;
|
if (end_index > this._timeDataListCount - 1)
|
end_index = this._timeDataListCount - 1;
|
|
AnaPrjBlockTime prjItem = new AnaPrjBlockTime();
|
prjItem.StartTime = startTime;
|
prjItem.EndTime = endTime;
|
prjItem.OpenPumpCount = allSumData[start_index].OpenPumpCount;
|
|
double sumPower_item = 0, sumFlow_item = 0, sumMoney_item = 0;
|
for (int dd = start_index; dd < end_index; dd++)
|
{
|
sumFlow_item += allSumData[dd].SumFlow;
|
sumMoney_item += allSumData[dd].SumMoney;
|
sumPower_item += allSumData[dd].SumPower;
|
|
prj.PointTimes.Add(allSumData[dd]);
|
}
|
prjItem.SumFlow = sumFlow_item;
|
prjItem.SumPower = sumPower_item;
|
prjItem.SumMoney = sumMoney_item;
|
|
sumFlow_prj += sumFlow_item;
|
sumMoney_prj += sumMoney_item;
|
sumPower_prj += sumPower_item;
|
|
prj.BlockTimes.Add(prjItem);
|
}
|
|
prj.SumFlow = sumFlow_prj;
|
prj.SumMoney = sumMoney_prj;
|
prj.SumPower = sumPower_prj;
|
|
return true ;
|
}
|
|
|
private AnaPrj CalcManuPrj区分泵_BAK(
|
List<CalcModel.PumpRunRange> ranges, ref AnaPrj prj, out string error_info)
|
{
|
error_info = null;
|
//#region 检查数据
|
|
//if (this._allPumpInfo == null || this._allPumpInfo.Count() != 5)
|
//{
|
// error_info = "泵台数不正确";
|
// return null;
|
//}
|
//if (this._riverWaterLevels == null || this._riverWaterLevels.Count() < 1)
|
//{
|
// error_info = "长江水位未赋值";
|
// return null;
|
//}
|
|
//if (_listRiverWaterLevelDrop == null)
|
//{
|
// _listRiverWaterLevelDrop = BLL.RiverWaterLevelDrop.GetList();
|
// if (_listRiverWaterLevelDrop == null || _listRiverWaterLevelDrop.Count() == 0)
|
// {
|
// error_info = "无法读取长江水位与水池落差的关系数据";
|
// return null;
|
// }
|
//}
|
//List<DateTime> listTimeSplit = new List<DateTime>();
|
//foreach (var range in ranges)
|
//{
|
// if (range.StartTime >= range.EndTime)
|
// {
|
// error_info = "时间范围不对";
|
// return null;
|
// }
|
// if (!listTimeSplit.Contains(range.StartTime))
|
// listTimeSplit.Add(range.StartTime);
|
// if (!listTimeSplit.Contains(range.EndTime))
|
// listTimeSplit.Add(range.EndTime);
|
//}
|
//listTimeSplit.Sort();
|
//#endregion
|
//// 根据同扬程下 流量从大到小的泵 2->5->3->1->4
|
//if (prj == null)
|
// prj = new AnaPrj();
|
//prj.Items = new List<AnaPrjItem>();
|
//for (int mm = 0; mm < listTimeSplit.Count - 1; mm++)
|
//{
|
// var startTime = listTimeSplit[mm];
|
// var endTime = listTimeSplit[mm + 1];
|
|
// int openPumpCount = 0;
|
// foreach (var range in ranges)
|
// {
|
// if (range.StartTime <= startTime && range.EndTime >= endTime)
|
// {
|
// openPumpCount = range.PumpNumber;
|
// }
|
// }
|
// if (openPumpCount == 0)
|
// continue;
|
// AnaPrjItem prjItem = new AnaPrjItem();
|
// prjItem.StartTime = startTime;
|
// prjItem.EndTime = endTime;
|
// prjItem.OpenPumpCount = openPumpCount;
|
// prjItem.SumData = new List<AnaPrjItemSumData>();
|
|
// double dropHeight1 = GetDropHeightByPumpCount(openPumpCount);
|
// for (var time = startTime; time <= endTime; time = time.AddMinutes(this._calcSpaceMinute))
|
// {
|
// AnaPrjItemSumData sd = new AnaPrjItemSumData();
|
// sd.Time = time;
|
|
|
// //计算前池水位差
|
// var m2 = CalcPumpOutletPressM(time);
|
// var riverWaterLevel = GetRiverWaterLevelByTime(time);
|
// double dropHeight = dropHeight1;
|
// double head4Drop = 0;//扬程
|
// for (int i = 0; i < 3; i++)
|
// {
|
// head4Drop = m2 - (riverWaterLevel - dropHeight);
|
// //不断迭代 计算扬程, 因为流量变量会造成吸水高度差变化, 从而造成扬程有变化
|
// double totalFlow4drop = 0;
|
// foreach (var pump_indx in openPumpIndexs)
|
// {
|
// var pump_curve = this._allPumpInfo[pump_indx];
|
// var grpPt = pump_curve.GetPointByH(head4Drop);
|
// if (grpPt == null)
|
// {
|
// throw new Exception("出现特殊情况,未考虑!");
|
// }
|
// totalFlow4drop += grpPt.Q;
|
// }
|
|
// dropHeight = GetDropHeightByFlow(head4Drop);
|
// }
|
|
|
|
// double realHead = head4Drop;
|
// double totalFlow = 0;
|
// double totalPower = 0;
|
// foreach (var pump_indx in openPumpIndexs)
|
// {
|
// var pump_curve = this._allPumpInfo[pump_indx];
|
|
// var grpPt2 = pump_curve.GetPointByH(realHead);
|
// if (grpPt2 == null)
|
// {
|
// throw new Exception("出现特殊情况,未考虑!");
|
// }
|
|
// totalFlow += grpPt2.Q;
|
// totalPower += grpPt2.P;
|
|
// //sd.PumpDatas.Add(p2);
|
// }
|
|
// sd.WaterLevelQ = riverWaterLevel - dropHeight;
|
// sd.Head = realHead;
|
// sd.Flow = Math.Round(totalFlow, 1);
|
// sd.Power = Math.Round(totalPower, 1);
|
|
// sd.SFlow = Math.Round(totalFlow * this._calcSpaceMinute / 60, 1);
|
// sd.Ele = Math.Round(totalPower * this._calcSpaceMinute / 60, 1);
|
// sd.Money = Math.Round(CalcMoney(time, totalPower) * this._calcSpaceMinute / 60, 1);
|
|
// prjItem.SumData.Add(sd);
|
// }
|
// prj.Items.Add(prjItem);
|
//}
|
|
|
//double sumFlow = 0;
|
//double sumMoney = 0;
|
//double sumPower = 0;
|
//foreach (var item in prj.Items)
|
//{
|
// foreach (var sd in item.SumData)
|
// {
|
// sumFlow += sd.SFlow;
|
// sumMoney += sd.Money;
|
// sumPower += sd.Power;
|
// }
|
//}
|
|
//prj.SumFlow = sumFlow;
|
//prj.SumMoney = sumMoney;
|
//prj.SumPower = sumPower;
|
|
|
|
|
|
//OnShowDebugInfo.Invoke(string.Format("计算总用时: {0} 秒", sw.ElapsedMilliseconds / 1000));
|
//sw.Stop();
|
|
|
|
|
return prj;
|
}
|
|
|
}
|
}
|