| | |
| | | //public int? StartOpenCount { get; set; } = -1;//已作废 |
| | | |
| | | public string StartReservoirLevel { get; set; }//开始水库水位(可空):单位m |
| | | public List<int> StartOpenPumpIndexArray { get; set; }//开始机泵开机状态(新) |
| | | 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; }//最高水库水位限制时间(可空) 时间格式 |
| | | |
| | | public string IsSubmit { get; set; }//计算完,是否推送 |
| | | public string IsTemporary { get; set; }//是否是临时算一下(新) |
| | | } |
| | | } |
| | | |
| | |
| | | [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" }; |
| | |
| | | { |
| | | 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; |
| | |
| | | |
| | | #region 取水总量 |
| | | |
| | | if (!string.IsNullOrEmpty(request.TotalFlowIn)) |
| | | if (!string.IsNullOrEmpty(request.TotalFlowIn) && !string.IsNullOrWhiteSpace(request.TotalFlowIn)) |
| | | { |
| | | 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 = "注意取水总量单位是吨,当前参数参数过小" }; |
| | | { |
| | | return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "请输入数字型取水总量,接受到的输入值是:" + request.TotalFlowIn }; |
| | | } |
| | | if (TotalFlowIn < 10000) |
| | | { |
| | |
| | | anaRequest.MaxReservoirLevelTime = request.MaxReservoirLevelTime; |
| | | } |
| | | |
| | | if (!string.IsNullOrEmpty(request.MaxReservoirLevel)) |
| | | if (!string.IsNullOrEmpty(request.MaxReservoirLevel) && !string.IsNullOrWhiteSpace(request.MaxReservoirLevel)) |
| | | { |
| | | double MaxReservoirLevel = 0; |
| | | if (!double.TryParse(request.MaxReservoirLevel, out MaxReservoirLevel)) |
| | |
| | | } |
| | | else |
| | | { |
| | | if (string.IsNullOrEmpty(request.TotalFlowIn)) |
| | | if (string.IsNullOrEmpty(request.TotalFlowIn) || string.IsNullOrWhiteSpace(request.TotalFlowIn)) |
| | | { |
| | | IStation.LogHelper.Info(string.Format("Zy Prj Time:{0}-{1} , 请输入取水总量或水位要求", |
| | | start_timme, end_timme)); |
| | | 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 }; |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | #region 供水量 |
| | | |
| | | if (string.IsNullOrEmpty(request.TotalFlowOut)) |
| | | double TotalFlowOut = 0; |
| | | double TotalFlowOutPrecid = 0;//预测值的供水总量 |
| | | |
| | | if (string.IsNullOrEmpty(request.TotalFlowOut) || string.IsNullOrWhiteSpace(request.TotalFlowOut)) |
| | | {//用预测值 |
| | | #region 用预测值 |
| | | |
| | |
| | | Data = error_info11 |
| | | }; |
| | | } |
| | | TotalFlowOutPrecid += r.LastPredictValue; |
| | | anaRequest.PerHourFlowOut.Add(r.LastPredictValue);//计算中用吨 |
| | | } |
| | | |
| | | IStation.LogHelper.Info(string.Format(" 获取水量预测值: {0} ", string.Join(",",anaRequest.PerHourFlowOut))); |
| | | #endregion 用预测值 |
| | | } |
| | | else |
| | | { |
| | | double TotalFlowOut = 0; |
| | | if (!double.TryParse(request.TotalFlowOut, out TotalFlowOut)) |
| | | { |
| | | IStation.LogHelper.Info(string.Format("Zy Prj Time:{0}-{1} , 注意取水总量单位是吨,当前参数参数过小", |
| | | start_timme, end_timme)); |
| | | return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "注意供水总量单位是吨,当前参数参数过小" }; |
| | | { |
| | | return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "注意供水总量输入参数无法识别,参数是:"+ request.TotalFlowOut }; |
| | | } |
| | | if (TotalFlowOut < 10000) |
| | | { |
| | |
| | | #endregion 供水量 |
| | | |
| | | //开始时的开机状态 |
| | | if (request.StartOpenPumpIndexArray == null) |
| | | List<int> StartOpenPumpIndexArray = new List<int>(); |
| | | if (!string.IsNullOrEmpty(request.StartOpenPumpIndexArray )) |
| | | { |
| | | IStation.LogHelper.Info(" 未设置开始时机泵开停状态 (Error: StartOpenPumpIndexArray is null)"); |
| | | return new IStation.Dto.ApiResult<string>() { Code = ApiResultCode.Error, Data = "未设置开始时机泵开停状态 (Error: StartOpenPumpIndexArray is null)" }; |
| | | 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 = request.StartOpenPumpIndexArray; |
| | | anaRequest.StartOpenPumpIndexArray = StartOpenPumpIndexArray; |
| | | |
| | | //陈行水库水位 |
| | | if (string.IsNullOrEmpty(request.StartReservoirLevel)) |
| | |
| | | anaRequest.StartReservoirLevel) |
| | | }; |
| | | } |
| | | bool isTemp = false; |
| | | if (!string.IsNullOrEmpty(request.IsTemporary)) |
| | | { |
| | | isTemp = Convert.ToBoolean(request.IsTemporary); |
| | | } |
| | | //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) |
| | | { |
| | | var er = string.Format("Zy Prj Time:{0}-{1} , 计算错误, 原因是:{2} ,Request::: {3}", |
| | | start_timme, end_timme, error_info, JsonHelper.Object2Json(anaRequest)); |
| | | |
| | | IStation.LogHelper.Info(er); |
| | | { |
| | | 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 Time:{0}-{1} , 计算成功", start_timme, end_timme)); |
| | | { |
| | | // IStation.LogHelper.Info(string.Format("Zy Prj 计算成功: \r\n {0} ", JsonHelper.Object2Json(defaultPrj))); |
| | | } |
| | | IStation.LogHelper.Info("-----------------------------END--------------------------------------"); |
| | | |
| | | //保存方案 |
| | | if (!isTemp) |
| | | { |
| | | var ret = Common.HistoryAnaPrjFileHelper.SavePrj(IStation.AnaGlobalParas.Setting, anaRequest, defaultPrj); |
| | | } |
| | | //保存方案 |
| | | 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 推送 |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 确认调度方案 |
| | | /// </summary> |
| | | /// <param name="ana"></param> |
| | | /// <returns></returns> |
| | | [Route("ConfirmSchemeByID")] |
| | | [HttpPost] |
| | | public IStation.Dto.ApiResult ConfirmSchemeByID(string ID) |
| | | { |
| | | if (string.IsNullOrEmpty(ID) || ID == "string") |
| | | { |
| | | return new IStation.Dto.ApiResult<bool>(false); |
| | | } |
| | | var dal = new IStation.DAL.AnaProject(); |
| | | var info = dal.SetConfirmStatusByID(ID); |
| | | if (string.IsNullOrEmpty(info)) |
| | | return new IStation.Dto.ApiResult<bool>(true); |
| | | else |
| | | { |
| | | IStation.LogHelper.Info(string.Format(" ConfirmSchemeByID error ID:{0}, reason:{1}", ID, info)); |
| | | return new IStation.Dto.ApiResult<bool>(false); |
| | | } |
| | | } |
| | | |
| | | #region 换算成DTO |
| | | |
| | | private IStation.ZyDto.SubmitPrj ToPrjDto(AnaPrj defaultPrj) |
| | |
| | | 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.FlowTotal = Math.Round(defaultPrj.SumFlow, 0); |
| | | 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<ZyDto.SubmitPrjBlockTime>(); |
| | | double maxHeight = 0; |
| | | if (defaultPrj.BlockTimes != null) |
| | | { |
| | | foreach (var bt in defaultPrj.BlockTimes) |
| | |
| | | dto_item.Records = new List<SubmitPrjTime>(); |
| | | 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.Switchs = new List<SubmitPrjSwitchInfo>(); |
| | | if (defaultPrj.PumpSwitchs != null) |
| | | { |
| | |
| | | dto_setting.OptSortType = model_setting.OptSortType; |
| | | dto_setting.SwitchPumpMinuteSpace = model_setting.SwitchPumpMinuteSpace; |
| | | |
| | | dto_setting.OpenPumpIndexSequence = model_setting.OpenPumpIndexSequence; |
| | | dto_setting.ClosePumpIndexSequence = model_setting.ClosePumpIndexSequence; |
| | | dto_setting.OptimalPumpIndexSequence = model_setting.OptimalPumpIndexSequence; |
| | | 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) |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | if (dto.OpenPumpIndexSequence != null) |
| | | if (!string.IsNullOrEmpty(dto.OpenPumpIndexSequence)) |
| | | { |
| | | int[] new_set_sequence; |
| | | var error = BuildSequenceFromDto(dto.OpenPumpIndexSequence, out new_set_sequence); |
| | |
| | | model_setting.OpenPumpIndexSequence = new_set_sequence; |
| | | } |
| | | |
| | | if (dto.ClosePumpIndexSequence != null) |
| | | if (!string.IsNullOrEmpty(dto.ClosePumpIndexSequence))// if (dto.ClosePumpIndexSequence != null) |
| | | { |
| | | int[] new_set_sequence; |
| | | var error = BuildSequenceFromDto(dto.ClosePumpIndexSequence, out new_set_sequence); |
| | |
| | | model_setting.ClosePumpIndexSequence = new_set_sequence; |
| | | } |
| | | |
| | | if (dto.OptimalPumpIndexSequence != null) |
| | | if (!string.IsNullOrEmpty(dto.OptimalPumpIndexSequence))// if (dto.OptimalPumpIndexSequence != null) |
| | | { |
| | | int[] new_set_sequence; |
| | | var error = BuildSequenceFromDto(dto.OptimalPumpIndexSequence, out new_set_sequence); |
| | |
| | | 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<int> penPumpIndexs1 = new List<int>(); |
| | | // 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<bool>(IStation.Common.AnaSetting.SaveSetting(model_setting)); |
| | | } |
| | | |
| | | private string BuildSequenceFromDto(int[] sequenceDto, out int[] sequenceDs) |
| | | /// <summary> |
| | | ///获取机泵检修状态 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | [Route("SynOverhaulStatus")] |
| | | [HttpGet] |
| | | public IStation.Dto.ApiResult SynOverhaulStatus() |
| | | { |
| | | var overhallStatus = ZyConnectHelper.GetOverhaulStatus();//检修泵的角标, 0 表示1号泵 1 表示二号泵 为空,表示没有检修 |
| | | |
| | | return new IStation.Dto.ApiResult<List<int>>(overhallStatus); |
| | | } |
| | | private string BuildSequenceFromDto(string sequenceDto, out int[] sequenceDs) |
| | | { |
| | | sequenceDs = null; |
| | | if (string.IsNullOrEmpty(sequenceDto)) |
| | | return null; |
| | | |
| | | List<int> list = new List<int>(); |
| | | 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<int> sequenceDto, out int[] sequenceDs) |
| | | { |
| | | sequenceDs = null; |
| | | if (sequenceDto == null || sequenceDto.Count() == 0) |