using Antlr.Runtime.Tree;
using IStation.CalcModel;
using IStation.Common;
using IStation.Dto;
using IStation.Model;
using IStation.ZyDto;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Runtime.CompilerServices;
using System.Security.Permissions;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
namespace IStation.ZyDto
{
public class ZyPrjRequest
{
public ZyPrjRequest()
{ }
public string StartTime { get; set; }
public string EndTime { get; set; }
public int? StartOpenCount { get; set; } = -1;
public string TotalFlowIn { get; set; }//取水总量 (单位 吨)
public string StartReservoirLevel { get; set; }//开始水库水位(可空):单位m
public string MaxReservoirLevel { get; set; }//最高水库水位限制(可空):单位m
public string MaxReservoirLevelTime { get; set; }//最高水库水位限制时间(可空) 时间格式
public string IsSubmit { get; set; }//计算完,是否推送
}
}
namespace IStation.WebApi.Controllers
{
///
/// 计算配置
///
[RoutePrefix("ZyPrj")]
public class ZyPrjController : ApiController
{
///
///
///
///
///
[Route("Calc")]
[HttpPost]
public IStation.Dto.ApiResult Calc([FromBody] ZyPrjRequest request)
{
LogHelper.Info(JsonHelper.Object2Json(request));
if (request == null)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "request is null" };
}
if (string.IsNullOrEmpty(request.StartTime))
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "StartTime is null" };
}
if (string.IsNullOrEmpty(request.EndTime))
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "EndTime is null" };
}
DateTime start_timme = DateTime.Now;
DateTime end_timme = DateTime.Now;
if (!DateTime.TryParse(request.StartTime, out start_timme))
{
IStation.LogHelper.Error(string.Format("ZyPrjRequest Time:{0}-{1} StartTime is error format", start_timme, end_timme));
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "StartTime is error format" };
}
if (!DateTime.TryParse(request.EndTime, out end_timme))
{
IStation.LogHelper.Error(string.Format("ZyPrjRequest Time:{0}-{1} EndTime is error format", start_timme, end_timme));
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "EndTime is error format" };
}
if (end_timme < start_timme.AddMinutes(60))
{
IStation.LogHelper.Error(string.Format("ZyPrjRequest Time:{0}-{1} 时间范围错误,间隔过短", start_timme, end_timme));
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "时间范围错误,间隔过短" };
}
if (end_timme > start_timme.AddDays(1))
{
IStation.LogHelper.Error(string.Format("ZyPrjRequest Time:{0}-{1} 时间范围错误,不能超过24小时", start_timme, end_timme));
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "时间范围错误,不能超过24小时" };
}
IStation.CalcModel.AnaRequest anaRequest = new AnaRequest();
anaRequest.CalcOptType = (eCalcOptType)IStation.AnaGlobalParas.Setting.OptSortType;
anaRequest.StartTime = start_timme;
anaRequest.EndTime = end_timme;
anaRequest.WaterLevels长江 = GetTide3Day(start_timme);
if (string.IsNullOrEmpty(request.TotalFlowIn))
{
if (string.IsNullOrEmpty(request.MaxReservoirLevel))
{
IStation.LogHelper.Info(string.Format("Zy Prj Time:{0}-{1} , 请输入取水总量或水位要求",
start_timme, end_timme));
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "请输入取水总量或水位要求" };
}
}
else
{
double TotalFlowIn = 0;
if (!double.TryParse(request.TotalFlowIn, out TotalFlowIn))
{
IStation.LogHelper.Info(string.Format("Zy Prj Time:{0}-{1} , 注意取水总量单位是吨,当前参数参数过小",
start_timme, end_timme));
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "注意取水总量单位是吨,当前参数参数过小" };
}
if (TotalFlowIn < 10000)
{
IStation.LogHelper.Info(string.Format("Zy Prj Time:{0}-{1} , 注意取水总量单位是吨,当前参数参数过小",
start_timme, end_timme));
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "注意取水总量单位是吨,当前参数参数过小" };
}
anaRequest.TotalFlowIn = TotalFlowIn;
}
if (!string.IsNullOrEmpty(request.MaxReservoirLevel))
{
anaRequest.MaxLimitWaterBoxLevel = Convert.ToDouble(request.MaxReservoirLevel);
IStation.DAL.WaterPredictRecord dal = new DAL.WaterPredictRecord();
var water_records = dal.GetByHourRangle(start_timme, end_timme);
LogHelper.Info(water_records.Count.ToString());
if (water_records == null)
{
IStation.LogHelper.Info(string.Format("Zy Prj Time:{0}-{1} , 水位预测数据为空,请先保持水位预测服务正常运行",
start_timme, end_timme));
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Data = "水位预测数据为空,请先保持水位预测服务正常运行" };
}
var count = (end_timme - start_timme).TotalHours;
if (water_records.Count != count)
{
IStation.LogHelper.Info(string.Format("Zy Prj Time:{0}-{1} , 预测数据获取失败,数据条无法匹配, 检查是否预测服务中断",
start_timme, end_timme));
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Data = "预测数据获取失败,数据条无法匹配, 检查是否预测服务中断" };
}
anaRequest.SpaceFlowOut = new List();
foreach (var r in water_records)
{
if (r.States == 0)
{
var error_info11 = string.Format("预测数据异常,无法进行水位计算:{0} {1},{2}", r.DayHour, r.LastPredictValue, r.Description);
IStation.LogHelper.Info(string.Format("Zy Prj Time:{0}-{1} , {2}}",
start_timme, end_timme, error_info11));
return new IStation.Dto.ApiResult()
{
Code = ApiResultCode.Error,
Data = error_info11
};
}
anaRequest.SpaceFlowOut.Add(r.LastPredictValue / 10000);
}
}
if (!string.IsNullOrEmpty(request.MaxReservoirLevelTime))
anaRequest.MaxLimitWaterBoxTime = request.MaxReservoirLevelTime;
//
if (request.StartOpenCount == null)
{
anaRequest.StartOpenCount = -1;
}
else
{
anaRequest.StartOpenCount = request.StartOpenCount.Value;
}
//陈行水库水位
if (!string.IsNullOrEmpty(request.StartReservoirLevel))
{
anaRequest.CurrentWaterBoxLevel = Convert.ToDouble(request.StartReservoirLevel);
}
else
{
anaRequest.CurrentWaterBoxLevel = ZyConnectHelper.GetRealReservoirWaterLevel();
}
var calcHelper = new IStation.CalcPrjHelper();
AnaPrj defaultPrj = null;
string error_info = calcHelper.Calc(anaRequest, out defaultPrj);
LogHelper.Info(error_info);
if (!string.IsNullOrEmpty(error_info) || defaultPrj == null)
{
IStation.LogHelper.Info(string.Format("Zy Prj Time:{0}-{1} , 计算错误, 原因是:{2} ,Request::: ",
start_timme, end_timme, error_info) + JsonHelper.Object2Json(anaRequest));
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "计算错误, 原因是:" + error_info };
}
else
{
IStation.LogHelper.Info(string.Format("Zy Prj Time:{0}-{1} , 计算成功", start_timme, end_timme));
}
//保存方案
var ret = Common.HistoryAnaPrjFileHelper.SavePrj(IStation.AnaGlobalParas.Setting, anaRequest, defaultPrj);
var dto_prj = ToPrjDto(defaultPrj);
#region 推送
if (!string.IsNullOrEmpty(request.IsSubmit) && Convert.ToBoolean(request.IsSubmit))
{
Task.Run(() =>
{
_ = ZyProjectHelper.SubmitPrj(defaultPrj);
});
}
#endregion 推送
return new IStation.Dto.ApiResult(dto_prj) { Code = ApiResultCode.Success };
}
#region 换算成DTO
private IStation.ZyDto.SubmitPrj ToPrjDto(AnaPrj defaultPrj)
{
IStation.ZyDto.SubmitPrj dto_prj = new ZyDto.SubmitPrj();
if (string.IsNullOrEmpty(defaultPrj.ID))
{
var time = DateTime.Now;
defaultPrj.ID = $"{time.Year}{time.Month}{time.Day}{time.Hour}{time.Minute}{time.Second}";
}
dto_prj.schemeID = defaultPrj.ID;
dto_prj.Day = defaultPrj.StartTime.ToString("yyyy-MM-dd");
dto_prj.StartTime = defaultPrj.StartTime.ToString("yyyy-MM-dd HH:mm:ss");
dto_prj.EndTime = defaultPrj.EndTime.ToString("yyyy-MM-dd HH:mm:ss");
dto_prj.FlowTotal = Math.Round(defaultPrj.SumFlow, 0);
dto_prj.PowerTotal = Math.Round(defaultPrj.SumPower, 0);
dto_prj.MoneyTotal = Math.Round(defaultPrj.SumMoney, 0);
dto_prj.Items = new List();
foreach (var bt in defaultPrj.BlockTimes)
{
if (bt.OpenPumpCount == 0)
continue;
ZyDto.SubmitPrjItem dto_item = new ZyDto.SubmitPrjItem();
dto_item.StartTime = bt.StartTime;
dto_item.EndTime = bt.EndTime;
dto_item.OpenPumpCount = bt.OpenPumpCount;
dto_item.OpenPumpIndexs = IStation.AnaGlobalParas.Setting.GetOpenPumpIndexArrays(bt.OpenPumpCount);
dto_prj.Items.Add(dto_item);
}
if (defaultPrj.PointTimes != null)
{
dto_prj.Records = new List();
foreach (var bt in defaultPrj.PointTimes)
{
dto_prj.Records.Add(new SubmitPrjTime(bt));
}
}
return dto_prj;
}
#endregion 换算成DTO
///
/// 获取某一天,最近一条
///
///
///
[Route("GetHistoryByDay")]
[HttpGet]
public IStation.Dto.ApiResult GetHistoryByDay(string day)
{
if (string.IsNullOrEmpty(day))
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "入参day 为空" };
}
DateTime d;
if (!DateTime.TryParse(day, out d))
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "day 格式不正确" };
}
IStation.CalcModel.AnaRequestBase requestBase = null;
var prj = Common.HistoryAnaPrjFileHelper.GetByDay(d, out requestBase);
if (prj != null)
{
var dto_prj = ToPrjDto(prj);
return new IStation.Dto.ApiResult(dto_prj) { Code = ApiResultCode.Success };
}
else
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Alert, Message = "未找到项目" };
}
}
///
/// 获取最近一条
///
///
///
[Route("GetLastHistoryRecord")]
[HttpGet]
public IStation.Dto.ApiResult GetLastHistoryRecord()
{
var dal = new IStation.DAL.AnaProject();
var record = dal.GetLastRecord();
if (record == null)
return null;
IStation.CalcModel.AnaRequestBase requestBase = null;
var prj = Common.HistoryAnaPrjFileHelper.GetByStartTime(record.StartTime, out requestBase);
if (prj != null)
{
var dto_prj = ToPrjDto(prj);
return new IStation.Dto.ApiResult(dto_prj) { Code = ApiResultCode.Success };
}
else
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Alert, Message = "未找到项目" };
}
}
///
///
///
///
[Route("GetSetting")]
[HttpGet]
public IStation.Dto.ApiResult GetSetting()
{
var model_setting = IStation.AnaGlobalParas.Setting;
IStation.Dto.ZyPrjAnaSetting dto_setting = new ZyPrjAnaSetting();
dto_setting.MinOpenTimeMinute = model_setting.MinOpenTimeMinute;
dto_setting.MinSwitchTimeMinute = model_setting.MinSwitchTimeMinute;
dto_setting.MaxPumpSwitchCount = model_setting.MaxPumpSwitchCountQ;
dto_setting.OptSortType = model_setting.OptSortType;
dto_setting.OpenPumpIndexs = model_setting.OpenPumpIndexs;
if (model_setting.SwitchPumpIgnoreTimes != null)
{
dto_setting.SwitchPumpIgnoreTimes = new List();
foreach (var m in model_setting.SwitchPumpIgnoreTimes)
{
dto_setting.SwitchPumpIgnoreTimes.Add(new ZyPrjAnaSetting.TimeRangeZy()
{
IsUse = m.IsUse,
StartHour = m.StartHour,
StartMinute = m.StartMinute,
EndHour = m.EndHour,
EndMinute = m.EndMinute,
});
}
}
if (model_setting.OpenPumpTimes != null)
{
dto_setting.OpenPumpTimes = new List();
foreach (var m in model_setting.OpenPumpTimes)
{
dto_setting.OpenPumpTimes.Add(new ZyPrjAnaSetting.TimeRangeZy()
{
IsUse = m.IsUse,
StartHour = m.StartHour,
StartMinute = m.StartMinute,
EndHour = m.EndHour,
EndMinute = m.EndMinute,
});
}
}
return new IStation.Dto.ApiResult(dto_setting);
}
///
///
///
///
///
[Route("SaveSetting")]
[HttpPost]
public IStation.Dto.ApiResult SaveSetting([FromBody] IStation.Dto.ZyPrjAnaSetting dto)
{
if (dto == null)
{
return new IStation.Dto.ApiResult(false);
}
var model_setting = IStation.AnaGlobalParas.Setting;
IStation.LogHelper.Info("ZyPrj SaveSetting");
if (dto.MinOpenTimeMinute < 5)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "最少开泵时间 设置过少" };
}
if (dto.MinOpenTimeMinute > 120)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "最少开泵时间 设置过长" };
}
model_setting.MinOpenTimeMinute = dto.MinOpenTimeMinute;
if (dto.MinSwitchTimeMinute < 5)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "最少切泵时间 设置过少" };
}
if (dto.MinSwitchTimeMinute > 120)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "最少切泵时间 设置过长" };
}
model_setting.MinSwitchTimeMinute = dto.MinSwitchTimeMinute;
if (dto.MaxPumpSwitchCount < 1)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "最大切泵次数 设置过少" };
}
if (dto.MaxPumpSwitchCount > 10)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "最大切泵次数 设置过长" };
}
model_setting.MaxPumpSwitchCountQ = dto.MaxPumpSwitchCount;
if (dto.OptSortType >= 2)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "OptSortType 只能设置 0 或者 1, 0代表 用电量最少 1代表 电费最少" };
}
model_setting.OptSortType = dto.OptSortType;
if (dto.SwitchPumpIgnoreTimes != null)
{
model_setting.SwitchPumpIgnoreTimes = new List();
foreach (var m in dto.SwitchPumpIgnoreTimes)
{
if (m.StartHour == 0 && m.EndHour == 0 && m.StartMinute == 0 && m.EndMinute == 0)
continue;
if (m.StartHour < 0 || m.StartHour > 24)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "不许切泵时间 时间范围设置不合理" };
}
if (m.EndHour < 0 || m.EndHour > 24)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "不许切泵时间 时间范围设置不合理" };
}
if (m.StartMinute < 0 || m.StartMinute > 60)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "不许切泵时间 时间范围设置不合理" };
}
if (m.EndMinute < 0 || m.EndMinute > 60)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "不许切泵时间 时间范围设置不合理" };
}
if (m.StartHour > m.EndHour)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "不许切泵时间 时间范围设置不合理" };
}
if (m.StartHour == m.EndHour)
{
if (m.StartMinute > m.EndMinute)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "不许切泵时间 时间范围设置不合理" };
}
}
model_setting.SwitchPumpIgnoreTimes.Add(new CalcModel.AnaSetting.TimeRange()
{
IsUse = m.IsUse,
StartHour = m.StartHour,
StartMinute = m.StartMinute,
EndHour = m.EndHour,
EndMinute = m.EndMinute,
});
}
}
if (dto.OpenPumpTimes != null)
{
model_setting.OpenPumpTimes = new List();
foreach (var m in dto.OpenPumpTimes)
{
if (m.StartHour < 0 || m.StartHour > 24)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "开泵时间 时间范围设置不合理" };
}
if (m.EndHour < 0 || m.EndHour > 24)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "开泵时间 时间范围设置不合理" };
}
if (m.StartMinute < 0 || m.StartMinute > 60)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "开泵时间 时间范围设置不合理" };
}
if (m.EndMinute < 0 || m.EndMinute > 60)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "开泵时间 时间范围设置不合理" };
}
if (m.StartHour > m.EndHour)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "开泵时间 时间范围设置不合理" };
}
if (m.StartHour == m.EndHour)
{
if (m.StartMinute > m.EndMinute)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "开泵时间 时间范围设置不合理" };
}
}
model_setting.OpenPumpTimes.Add(new CalcModel.AnaSetting.TimeRange()
{
IsUse = m.IsUse,
StartHour = m.StartHour,
StartMinute = m.StartMinute,
EndHour = m.EndHour,
EndMinute = m.EndMinute,
});
}
}
if (dto.OpenPumpIndexs != null)
{
List penPumpIndexs = new List();
foreach (var ind in dto.OpenPumpIndexs)
{
if (ind < 0 || ind > 5)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "机泵开泵顺序设置参数不合理" };
}
else
{
penPumpIndexs.Add(ind);
}
}
if (penPumpIndexs.Distinct().Count() != 5)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "机泵开泵顺序设置参数不合理" };
}
model_setting.OpenPumpIndexs = penPumpIndexs.ToArray();
}
return new IStation.Dto.ApiResult(IStation.Common.AnaSetting.SaveSetting(model_setting));
}
private Model.eTideSouce _tideSouce = Model.eTideSouce.Book;
private List GetTide3Day(DateTime calc_day)
{
DateTime _rangDay1, _rangDay2, _rangDay3;
string error1, error2, error3;
List waterLevels长江1, waterLevels长江2, waterLevels长江3;
if (calc_day == DateTime.Today)
{
_rangDay1 = calc_day.AddDays(-1);
_rangDay2 = calc_day;
_rangDay3 = calc_day.AddDays(1);
}
else if (calc_day == DateTime.Today.AddDays(1))
{
_rangDay1 = calc_day.AddDays(-2);
_rangDay2 = calc_day.AddDays(-1);
_rangDay3 = calc_day;
}
else
{
_rangDay1 = calc_day.AddDays(-1);
_rangDay2 = calc_day;
_rangDay3 = calc_day.AddDays(1);
}
waterLevels长江1 = TideHelper.GetByDay(_tideSouce, _rangDay1, out error1);
waterLevels长江2 = TideHelper.GetByDay(_tideSouce, _rangDay2, out error2);
waterLevels长江3 = TideHelper.GetByDay(_tideSouce, _rangDay3, out error3);
List timeValues = new List();
if (waterLevels长江1 != null)
{
timeValues.AddRange(waterLevels长江1);
}
if (waterLevels长江2 != null)
{
timeValues.AddRange(waterLevels长江2);
}
if (waterLevels长江3 != null)
{
timeValues.AddRange(waterLevels长江3);
}
return timeValues;
}
}
}