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; 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 StartReservoirLevel { get; set; }//开始水库水位(可空):单位m public string StartOpenPumpIndexArray { get; set; }//开始机泵开机状态(不可空) public string TotalFlowIn { get; set; }//取水总量 (单位 吨) public string TotalFlowOut { get; set; }//供水总量 (单位 吨) 不输入就用预测值 public string MaxReservoirLevel { get; set; }//最高水库水位限制(可空):单位m public string MaxReservoirLevelTime { 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" }; } // IStation.LogHelper.Info("--------------------------START-----------------------------------------"); IStation.LogHelper.Info(string.Format("Zy Prj Calc Request: {0}", JsonHelper.Object2Json(request))); 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(_tideSouce, start_timme); #region 取水总量 if (!string.IsNullOrEmpty(request.TotalFlowIn) && !string.IsNullOrWhiteSpace(request.TotalFlowIn)) { double TotalFlowIn = 0; if (!double.TryParse(request.TotalFlowIn, out TotalFlowIn)) { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "请输入数字型取水总量,接受到的输入值是:" + request.TotalFlowIn }; } 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; } #endregion 取水总量 #region 水位要求 if (!string.IsNullOrEmpty(request.MaxReservoirLevelTime)) { anaRequest.MaxReservoirLevelTime = request.MaxReservoirLevelTime; } if (!string.IsNullOrEmpty(request.MaxReservoirLevel) && !string.IsNullOrWhiteSpace(request.MaxReservoirLevel)) { double MaxReservoirLevel = 0; if (!double.TryParse(request.MaxReservoirLevel, out MaxReservoirLevel)) { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "请输入合理的水位要求值" }; } if (MaxReservoirLevel < 1 || MaxReservoirLevel > 10) { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "请输入合理的水位要求值" }; } anaRequest.MaxReservoirLevel = MaxReservoirLevel; } else { if (string.IsNullOrEmpty(request.TotalFlowIn) || string.IsNullOrWhiteSpace(request.TotalFlowIn)) { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "请输入取水总量或水位要求" }; } double TotalFlowIn = 0; if (!double.TryParse(request.TotalFlowIn, out TotalFlowIn)) { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "请输入数字型取水总量,接受到的输入值是:" + request.TotalFlowIn }; } } #endregion 水位要求 #region 供水量 double TotalFlowOut = 0; double TotalFlowOutPrecid = 0;//预测值的供水总量 if (string.IsNullOrEmpty(request.TotalFlowOut) || string.IsNullOrWhiteSpace(request.TotalFlowOut)) {//用预测值 #region 用预测值 anaRequest.PerHourFlowOut = new List(); 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 = "预测数据获取失败,数据条无法匹配, 检查是否预测服务中断" }; } 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 }; } TotalFlowOutPrecid += r.LastPredictValue; anaRequest.PerHourFlowOut.Add(r.LastPredictValue);//计算中用吨 } IStation.LogHelper.Info(string.Format(" 获取水量预测值: {0} ", string.Join(",", anaRequest.PerHourFlowOut))); #endregion 用预测值 } else { if (!double.TryParse(request.TotalFlowOut, out TotalFlowOut)) { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "注意供水总量输入参数无法识别,参数是:" + request.TotalFlowOut }; } if (TotalFlowOut < 10000) { IStation.LogHelper.Info(string.Format("Zy Prj Time:{0}-{1} , 注意取水总量单位是吨,当前参数参数过小", start_timme, end_timme)); return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "注意供水总量单位是吨,当前参数参数过小" }; } //TotalFlowOut = TotalFlowOut / 10000;//计算中用吨 List list = new List(); var count = (end_timme - start_timme).TotalHours; for (var d = start_timme; d <= end_timme; d = d.AddHours(1)) { list.Add(Math.Round(TotalFlowOut / count, 1)); } anaRequest.PerHourFlowOut = list; } #endregion 供水量 //开始时的开机状态 List StartOpenPumpIndexArray = new List(); if (!string.IsNullOrEmpty(request.StartOpenPumpIndexArray)) { var sss = request.StartOpenPumpIndexArray.Split(','); foreach (var item in sss) { if (int.TryParse(item, out int index)) { if (index < 0 || index > 4) { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "开始时的开机状态,机泵角标要求不超过4" }; } StartOpenPumpIndexArray.Add(index); } else { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "开始时的开机状态,参数不正确" }; } } } anaRequest.IsKnownStartOpenPump = true; anaRequest.StartOpenPumpIndexArray = StartOpenPumpIndexArray; //陈行水库水位 if (string.IsNullOrEmpty(request.StartReservoirLevel)) { IStation.LogHelper.Info(" 未设置开始时水库水位 (Error: StartReservoirLevel is null)"); return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Data = "未设置开始时水库水位 (Error: StartReservoirLevel is null) " }; } anaRequest.StartReservoirLevel = Convert.ToDouble(request.StartReservoirLevel); if (anaRequest.StartReservoirLevel < 2) { IStation.LogHelper.Info(string.Format(" 设置开始时水库水位的数据过小 (Error: StartReservoirLevel is {0}})", anaRequest.StartReservoirLevel)); return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Data = string.Format(" 设置开始时水库水位的数据过小 (Error: StartReservoirLevel is {0}})", anaRequest.StartReservoirLevel) }; } //bool isTemp = false; //if (!string.IsNullOrEmpty(request.IsTemporary)) //{ // isTemp = Convert.ToBoolean(request.IsTemporary); //} var calcHelper = new IStation.CalcPrjHelper(); AnaPrj defaultPrj = null; string error_info = calcHelper.Calc(anaRequest, out defaultPrj); if (!string.IsNullOrEmpty(error_info) || defaultPrj == null) { IStation.LogHelper.Info(string.Format("Zy Prj 计算错误: \r\n {0} ", error_info)); return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "计算错误, 原因是:" + error_info }; } else { // IStation.LogHelper.Info(string.Format("Zy Prj 计算成功: \r\n {0} ", JsonHelper.Object2Json(defaultPrj))); } IStation.LogHelper.Info("-----------------------------END--------------------------------------"); //保存方案 var ret = Common.HistoryAnaPrjFileHelper.SavePrj(IStation.AnaGlobalParas.Setting, anaRequest, defaultPrj); // var dto_prj = ToPrjDto(defaultPrj); if (TotalFlowOutPrecid > 1) { dto_prj.FlowTotalOut = Math.Round(TotalFlowOutPrecid / 10000, 1); } else { dto_prj.FlowTotalOut = TotalFlowOut; } #region 推送 //if (!string.IsNullOrEmpty(request.IsSubmit) && Convert.ToBoolean(request.IsSubmit)) //{ // Task.Run(() => // { // _ = ZyProjectHelper.SubmitPrj(defaultPrj); // }); //} #endregion 推送 // IStation.LogHelper.Info(string.Format(" 产生计算方案:{0}", dto_prj.schemeID)); return new IStation.Dto.ApiResult(dto_prj) { Code = ApiResultCode.Success }; } /// /// 获取初始水位,和当时的开机状态 /// /// /// [Route("GetAnaStartPara")] [HttpGet] public IStation.Dto.ApiResult GetAnaStartPara(string AnaStartTime) { if (string.IsNullOrEmpty(AnaStartTime)) { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "day 格式不正确" }; } try { DateTime last_end_time; if (!DateTime.TryParse(AnaStartTime, out last_end_time)) { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "day 格式不正确" }; } IStation.CalcModel.AnaRequestBase requestBase; var prj = Common.HistoryAnaPrjFileHelper.GetByEndTime大于(last_end_time, out requestBase); if (prj == null) { IStation.LogHelper.Info(string.Format("GetAnaStartPara 未找到{0}结束的分析项目", AnaStartTime)); return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = string.Format("未找到{0}结束的分析项目", AnaStartTime) }; } IStation.CalcModel.ZyStartInfo zyStartInfo = new IStation.CalcModel.ZyStartInfo(); //zyStartInfo.OpenPumpStatus = prj.EndTimeOpenPumpStatus; if (prj.EndTimeOpenPumpStatus != null && prj.EndTimeOpenPumpStatus.Count > 0) { zyStartInfo.OpenPumpStatus = string.Join(",", prj.EndTimeOpenPumpStatus); } var near_pt = prj.NearPointTime(DateTime.Now); if (near_pt == null) { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = string.Format("在项目中, 未找到{0}的水库水位数据", DateTime.Now) }; } var new_yuce = near_pt.WaterLevelH;//昨天预测水位 double now_level = ZyConnectHelper.GetRealReservoirWaterLevel();//实时水位 if (prj.BlockTimes == null || prj.BlockTimes.Count() == 0) { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "在项目中, BlockTimes值为空" }; } if (prj.BlockTimes.Last().PointTimes == null || prj.BlockTimes.Last().PointTimes.Count() == 0) { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "在项目中, 最后一个 BlockTime的 PointTimes 属性值为空" }; } var lz = prj.BlockTimes.Last().PointTimes.Last().WaterLevelH; var lz_pt = prj.FindPointTime(last_end_time); if (lz_pt != null) { lz = lz_pt.WaterLevelH; } double start_yuce = lz + now_level - new_yuce; IStation.LogHelper.Info(string.Format("GetAnaStartPara StartTime {0} Level: {1},{2},{3} ,{4} ", AnaStartTime, lz, now_level, new_yuce, start_yuce)); zyStartInfo.ReservoirWaterLevel = Math.Round(start_yuce, 3); return new IStation.Dto.ApiResult(zyStartInfo) { Code = ApiResultCode.Success }; } catch (Exception ex) { IStation.LogHelper.Error("GetAnaStartPara line 277", ex); return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = string.Format("在项目中, 接口报错: {0} ", ex.Message) }; } } /// /// 确认调度方案 /// /// /// [Route("ConfirmSchemeByID")] [HttpPost] public IStation.Dto.ApiResult ConfirmSchemeByID(string ID) { if (string.IsNullOrEmpty(ID) || ID == "string") { return new IStation.Dto.ApiResult(false); } var dal = new IStation.DAL.AnaProject(); var info = dal.SetConfirmStatusByID(ID); if (string.IsNullOrEmpty(info)) return new IStation.Dto.ApiResult(true); else { IStation.LogHelper.Info(string.Format(" ConfirmSchemeByID error ID:{0}, reason:{1}", ID, info)); return new IStation.Dto.ApiResult(false); } } #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.schemeName = defaultPrj.Name; 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.FlowTotalIn = Math.Round(defaultPrj.SumFlow, 0); dto_prj.PowerTotal = Math.Round(defaultPrj.SumPower, 0); dto_prj.MoneyTotal = Math.Round(defaultPrj.SumMoney, 0); dto_prj.BlockTimes = new List(); double maxHeight = 0; double startHeight = 0; if (defaultPrj.BlockTimes != null) { startHeight = defaultPrj.BlockTimes.First().ReservoirStartHeight; foreach (var bt in defaultPrj.BlockTimes) { if (bt.OpenPumpIndexs == null) continue; ZyDto.SubmitPrjBlockTime dto_item = new ZyDto.SubmitPrjBlockTime(); dto_item.StartTime = bt.StartTime; dto_item.EndTime = bt.EndTime; dto_item.OpenPumpCount = bt.OpenPumpIndexs.Count; dto_item.OpenPumpIndexs = bt.OpenPumpIndexs; dto_item.StartSwitchGroupID = bt.StartSwitchGroupID; if (bt.PointTimes != null) { dto_item.Records = new List(); foreach (var bt2 in bt.PointTimes) { maxHeight = Math.Max(maxHeight, bt2.WaterLevelH); dto_item.Records.Add(new SubmitPrjTime(bt2)); } } dto_prj.BlockTimes.Add(dto_item); } } dto_prj.MaxWaterLevelH = maxHeight; dto_prj.StartWaterLevelH = startHeight; dto_prj.Switchs = new List(); if (defaultPrj.PumpSwitchs != null) { var fi_PumpSwitchs = from x in defaultPrj.PumpSwitchs orderby x.Time select x; foreach (var bt in fi_PumpSwitchs) { ZyDto.SubmitPrjSwitchInfo dto_item = new ZyDto.SubmitPrjSwitchInfo(); dto_item.Index = bt.Index; dto_item.GroupID = bt.GroupID;//分组ID dto_item.PumpIndex = bt.PumpIndex;//泵角标 dto_item.Time = bt.Time.ToString("yyyy-MM-dd HH:mm:ss");//时间 dto_item.SwitchType = bt.SwitchType;///1 开机 0 关机 dto_prj.Switchs.Add(dto_item); } } 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.LogHelper.Info(string.Format(" api GetHistoryByDay {0} format: {1} ", day, d)); IStation.CalcModel.AnaRequestBase requestBase = null; var prj = Common.HistoryAnaPrjFileHelper.GetByCreateDay(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.MaxPumpSwitchCount; dto_setting.OptSortType = model_setting.OptSortType; dto_setting.SwitchPumpMinuteSpace = model_setting.SwitchPumpMinuteSpace; dto_setting.OpenPumpIndexSequence = IStation.Dto.ZyPrjAnaSetting.ListToString(model_setting.OpenPumpIndexSequence); dto_setting.ClosePumpIndexSequence = IStation.Dto.ZyPrjAnaSetting.ListToString(model_setting.ClosePumpIndexSequence); dto_setting.OptimalPumpIndexSequence = IStation.Dto.ZyPrjAnaSetting.ListToString(model_setting.OptimalPumpIndexSequence); //dto_setting.OpenPumpIndexSequence = BuildSequenceToDto(model_setting.OpenPumpIndexSequence); //dto_setting.ClosePumpIndexSequence = BuildSequenceToDto(model_setting.ClosePumpIndexSequence); //dto_setting.OptimalPumpIndexSequence = BuildSequenceToDto(model_setting.OptimalPumpIndexSequence); //检修泵的角标, 0 表示1号泵 1 表示二号泵 为空,表示没有检修 try { var overhallStatus = ZyConnectHelper.GetOverhaulStatus(); if (overhallStatus == null || overhallStatus.Count == 0) { if (model_setting.UnablePumpIndexArray != null) { dto_setting.UnablePumpIndexArray = ""; model_setting.UnablePumpIndexArray = null; IStation.Common.AnaSetting.SaveSetting(model_setting); } } else { model_setting.UnablePumpIndexArray = overhallStatus.ToArray(); dto_setting.UnablePumpIndexArray = string.Join(",", overhallStatus); IStation.Common.AnaSetting.SaveSetting(model_setting); } } catch (Exception ex) { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "无法链接工控服务器,错误原因:" + ex.Message }; } 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, }); } } IStation.LogHelper.Info("ZyPrj GetSetting : Content: " + JsonHelper.Object2Json(dto_setting)); 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) { Message = "入参为空" }; } var model_setting = IStation.AnaGlobalParas.Setting; IStation.LogHelper.Info("ZyPrj SaveSetting : Content: " + JsonHelper.Object2Json(dto)); 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.MaxPumpSwitchCount = 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 (!string.IsNullOrEmpty(dto.OpenPumpIndexSequence)) { int[] new_set_sequence; var error = BuildSequenceFromDto(dto.OpenPumpIndexSequence, out new_set_sequence); if (!string.IsNullOrEmpty(error)) { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "开泵顺序 " + error }; } model_setting.OpenPumpIndexSequence = new_set_sequence; } if (!string.IsNullOrEmpty(dto.ClosePumpIndexSequence))// if (dto.ClosePumpIndexSequence != null) { int[] new_set_sequence; var error = BuildSequenceFromDto(dto.ClosePumpIndexSequence, out new_set_sequence); if (!string.IsNullOrEmpty(error)) { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "关泵顺序 " + error }; } model_setting.ClosePumpIndexSequence = new_set_sequence; } if (!string.IsNullOrEmpty(dto.OptimalPumpIndexSequence))// if (dto.OptimalPumpIndexSequence != null) { int[] new_set_sequence; var error = BuildSequenceFromDto(dto.OptimalPumpIndexSequence, out new_set_sequence); if (!string.IsNullOrEmpty(error)) { return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "调度泵优先度顺序 " + error }; } model_setting.OptimalPumpIndexSequence = new_set_sequence; } //检修状态, 直接读SCADA系统 //if (dto.UnablePumpIndexArray != null && dto.UnablePumpIndexArray.Count()>0) //{ // if (dto.UnablePumpIndexArray.Count() > 2) // { // return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "检修泵数量不能超过2台 " }; // } // if (dto.UnablePumpIndexArray.Contains(5)) // { // List penPumpIndexs1 = new List(); // foreach (var p in dto.UnablePumpIndexArray) // { // penPumpIndexs1.Add(p - 1); // } // model_setting.UnablePumpIndexArray = penPumpIndexs1.ToArray(); // } // else // { // model_setting.UnablePumpIndexArray = dto.UnablePumpIndexArray; // } // model_setting.Check_Optimal_UnablePumpIndexArray(); //} //else //{ // model_setting.UnablePumpIndexArray = null; //} return new IStation.Dto.ApiResult(IStation.Common.AnaSetting.SaveSetting(model_setting)); } /// ///获取机泵检修状态 /// /// [Route("SynOverhaulStatus")] [HttpGet] public IStation.Dto.ApiResult SynOverhaulStatus() { var overhallStatus = ZyConnectHelper.GetOverhaulStatus();//检修泵的角标, 0 表示1号泵 1 表示二号泵 为空,表示没有检修 return new IStation.Dto.ApiResult>(overhallStatus); } private string BuildSequenceFromDto(string sequenceDto, out int[] sequenceDs) { sequenceDs = null; if (string.IsNullOrEmpty(sequenceDto)) return null; List list = new List(); if (!string.IsNullOrEmpty(sequenceDto)) { var sss = sequenceDto.Split(','); foreach (var item in sss) { if (int.TryParse(item, out int index)) { list.Add(index); } else { return " 设置参数不合理,机泵序号有非数字"; } } } return BuildSequenceFromDto(list, out sequenceDs); } private string BuildSequenceFromDto(List sequenceDto, out int[] sequenceDs) { sequenceDs = null; if (sequenceDto == null || sequenceDto.Count() == 0) return null; List penPumpIndexs = new List(); foreach (var ind in sequenceDto) { if (ind < 0) { return " 设置参数不合理,机泵序号有负数"; } else if (ind > 5) { return " 设置参数不合理,机泵序号超过5"; } else { penPumpIndexs.Add(ind); } } if (penPumpIndexs.Distinct().Count() != 5) { return " 设置参数不合理"; } if (penPumpIndexs.Contains(5)) {//表示界面从1 2 3 4 5 List penPumpIndexs1 = new List(); foreach (var p in penPumpIndexs) { penPumpIndexs1.Add(p - 1); } sequenceDs = penPumpIndexs1.ToArray(); } else { sequenceDs = penPumpIndexs.ToArray(); } return null; } private int[] BuildSequenceToDto(int[] sequenceDs) { if (sequenceDs == null || sequenceDs.Length == 0) return null; List sequenceDto = new List(); foreach (var sequence in sequenceDs) { sequenceDto.Add(sequence + 1); } return sequenceDto.ToArray(); } private Model.eTideSouce _tideSouce = Model.eTideSouce.Book; public static List GetTide3Day(Model.eTideSouce tideSouce, 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; } } }