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