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 double? TotalFlowIn { get; set; }//取水总量 (单位 吨)
}
}
namespace IStation.WebApi.Controllers
{
///
/// 计算配置
///
[RoutePrefix("ZyPrj")]
public class ZyPrjController : ApiController
{
///
///
///
///
///
[Route("Calc")]
[HttpPost]
public IStation.Dto.ApiResult Calc([FromBody] ZyPrjRequest 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小时" };
}
if (request.TotalFlowIn == null)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "取水总量错误" };
}
if (request.TotalFlowIn < 10000)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "注意取水总量单位是吨,当前参数参数过小" };
}
IStation.LogHelper.Info(string.Format("Zy Prj Time:{0}-{1} ,StartOpenCount:{2}, TotalFlowIn:{3}",
start_timme, end_timme, request.StartOpenCount, request.TotalFlowIn));
IStation.CalcModel.AnaRequest anaRequest = new AnaRequest();
anaRequest.CalcOptType = eCalcOptType.电费;
anaRequest.StartTime = start_timme;
anaRequest.EndTime = end_timme;
anaRequest.WaterLevels长江 = GetTide3Day(start_timme);
anaRequest.StartOpenCount = request.StartOpenCount;
anaRequest.TotalFlow取水总量 = request.TotalFlowIn;
var calcHelper = new IStation.CalcPrjHelper();
AnaPrj defaultPrj = null;
string error_info = calcHelper.Calc(anaRequest, out defaultPrj);
if (!string.IsNullOrEmpty(error_info) || defaultPrj == null)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "计算错误, 原因是:"+ error_info };
}
var ret = Common.HistoryAnaPrjFileHelper.SavePrj(IStation.AnaGlobalParas.Setting, anaRequest, 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 (request.isSubmit)
//{
// string error = await ZyConnectHelper.SubmitPrj(request.prj);//, (id) => { IStation.LogHelper.Info("SavePrj success id=" + id); }, (info) => { IStation.LogHelper.Info("SavePrj failse info:" + info); });//.Result;
// if (!string.IsNullOrEmpty(error))
// {
// IStation.LogHelper.Info("Submit prj finish (fail) day:" + request.requestBase.StartTime + ",error:" + error);
// return new IStation.Dto.ApiResult(error) { Code = ApiResultCode.Error };
// }
// else
// {
// IStation.LogHelper.Info("Submit prj finish (success) day:" + request.requestBase.StartTime);
// }
//}
return new IStation.Dto.ApiResult< IStation.ZyDto.SubmitPrj>(dto_prj) { Code = ApiResultCode.Success };
}
///
///
///
///
[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;
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;
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.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 && dto.OpenPumpIndexs.Count() == 5)
{
List penPumpIndexs = new List();
foreach(var ind in dto.OpenPumpIndexs)
{
if(ind<0 || ind > 5)
{
return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "机泵开泵顺序设置参数不合理" };
}
}
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));
}
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;
}
}
}