tangxu
2024-09-05 e3b3911774962c8f05c76424980aa9f30267d492
WebApi/Controllers/AnaPrjController.cs
@@ -12,7 +12,7 @@
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using System.Web.Http;
namespace IStation.WebApi.Controllers
{
@@ -23,15 +23,15 @@
    public class AnaPrjController : ApiController
    {
        /// <summary>
        ///
        ///
        /// </summary>
        /// <param name="day"></param>
        /// <returns></returns>
        [Route("Debug")]
        [HttpGet]
        public IStation.Dto.ApiResult Debug(string info)
        {
            IStation.LogHelper.Info("debug:"+ info);
        {
            IStation.LogHelper.Info("debug:" + info);
            //IStation.CalcModel.AnaPrj entity = new IStation.CalcModel.AnaPrj();
            //entity.ID = "123";
@@ -45,20 +45,19 @@
            //var dal = new IStation.DAL.AnaProject();
            //dal.Insert(entity, ana_request);
            var dal = new IStation.DAL.AnaProject();
            var aa = dal.GetLastRecord();
            return new IStation.Dto.ApiResult<string >("ok");
            return new IStation.Dto.ApiResult<string>("ok");
        }
        /// <summary>
        ///
        ///
        /// </summary>
        /// <param name="day"></param>
        /// <returns></returns>
        [Route("GetPrjByDay")]
        [Route("GetDefaultPrjByStartDay")]
        [HttpGet]
        public IStation.Dto.ApiResult GetPrjByDay(string day)
        public IStation.Dto.ApiResult GetDefaultPrjByStartDay(string day)
        {
            if (day == null)
            {
@@ -70,8 +69,7 @@
                return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "day 格式不正确" };
            }
            IStation.CalcModel.AnaRequestBase requestBase = null;
            var prj = Common.HistoryAnaPrjFileHelper.GetByDay(d,out requestBase);
            var prj = Common.HistoryAnaPrjFileHelper.GetByStartDay(d, out requestBase);
            return new IStation.Dto.ApiResult<IStation.CalcModel.AnaPrj>(prj);
        }
@@ -127,16 +125,9 @@
            anaRequest.EndTime = end_timme;
            anaRequest.WaterLevels长江 = ZyPrjController.GetTide3Day(Model.eTideSouce.Book, 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
            #region 取水总量
            if (!string.IsNullOrEmpty(request.TotalFlowIn))
            {
                double TotalFlowIn = 0;
                if (!double.TryParse(request.TotalFlowIn, out TotalFlowIn))
@@ -154,12 +145,51 @@
                anaRequest.TotalFlowIn = TotalFlowIn;
            }
            #endregion 取水总量
            #region 水位要求
            if (!string.IsNullOrEmpty(request.MaxReservoirLevelTime))
            {
                anaRequest.MaxReservoirLevelTime = request.MaxReservoirLevelTime;
            }
            if (!string.IsNullOrEmpty(request.MaxReservoirLevel))
            {
                anaRequest.MaxReservoirLevel = Convert.ToDouble(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))
                {
                    IStation.LogHelper.Info(string.Format("Zy Prj  Time:{0}-{1} ,  请输入取水总量或水位要求",
                start_timme, end_timme));
                    return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "请输入取水总量或水位要求" };
                }
            }
            #endregion 水位要求
            #region 供水量
            if (string.IsNullOrEmpty(request.TotalFlowOut))
            {//用预测值
                #region 用预测值
                anaRequest.PerHourFlowOut = new List<double>();
                IStation.DAL.WaterPredictRecord dal = new DAL.WaterPredictRecord();
                var water_records = dal.GetByHourRangle(start_timme, end_timme);
                LogHelper.Info(water_records.Count.ToString());
                //LogHelper.Info(water_records.Count.ToString());
                if (water_records == null)
                {
                    IStation.LogHelper.Info(string.Format("Zy Prj  Time:{0}-{1} ,  水位预测数据为空,请先保持水位预测服务正常运行",
@@ -174,7 +204,6 @@
                    return new IStation.Dto.ApiResult<string>() { Code = ApiResultCode.Error, Data = "预测数据获取失败,数据条无法匹配, 检查是否预测服务中断" };
                }
                anaRequest.SpaceFlowOut = new List<double>();
                foreach (var r in water_records)
                {
                    if (r.States == 0)
@@ -188,21 +217,53 @@
                            Data = error_info11
                        };
                    }
                    anaRequest.SpaceFlowOut.Add(r.LastPredictValue / 10000);
                    anaRequest.PerHourFlowOut.Add(r.LastPredictValue);//计算中用吨
                }
                #endregion 用预测值
            }
            if (!string.IsNullOrEmpty(request.MaxReservoirLevelTime))
                anaRequest.MaxReservoirLevelTime = request.MaxReservoirLevelTime;
            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 = "注意供水总量单位是吨,当前参数参数过小" };
                }
                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 ;//计算中用吨
                List<double> list = new List<double>();
                var count = (end_timme - start_timme).TotalHours;
                for (var d = start_timme; d <= end_timme; d = d.AddHours(1))
                {
                    list.Add(TotalFlowOut / count);
                }
                anaRequest.PerHourFlowOut = list;
            }
            #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))
                    {
                        StartOpenPumpIndexArray.Add(index);
                    }
                }
            }
            anaRequest.IsKnownStartOpenPump = true;
            anaRequest.StartOpenPumpIndexArray = request.StartOpenPumpIndexArray;
            anaRequest.StartOpenPumpIndexArray = StartOpenPumpIndexArray;
            //陈行水库水位
            if (string.IsNullOrEmpty(request.StartReservoirLevel))
@@ -222,12 +283,11 @@
                    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;
@@ -246,33 +306,95 @@
                IStation.LogHelper.Info(string.Format("Zy Prj  Time:{0}-{1} ,  计算成功", start_timme, end_timme));
            }
            //保存方案
            if (!isTemp)
            {
                var ret = Common.HistoryAnaPrjFileHelper.SavePrj(IStation.AnaGlobalParas.Setting, anaRequest, defaultPrj);
            }
            //保存方案,不需要保存, 由客户端,点击保存再保存
            //if (!isTemp)
            //{
            //    var ret = Common.HistoryAnaPrjFileHelper.SavePrj(IStation.AnaGlobalParas.Setting, anaRequest, defaultPrj);
            //}
            #region 推送
            if (!string.IsNullOrEmpty(request.IsSubmit) && Convert.ToBoolean(request.IsSubmit))
            {
                Task.Run(() =>
                {
                    _ = ZyProjectHelper.SubmitPrj(defaultPrj);
                });
            }
            //if (!string.IsNullOrEmpty(request.IsSubmit) && Convert.ToBoolean(request.IsSubmit))
            //{
            //    Task.Run(() =>
            //    {
            //        _ = ZyProjectHelper.SubmitPrj(defaultPrj);
            //    });
            //}
            #endregion 推送
            return new IStation.Dto.ApiResult<AnaPrj>(defaultPrj) { Code = ApiResultCode.Success };
        }
        /// <summary>
        /// 获取初始水位,和当时的开机状态, 用于调试众毅
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [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) };
                }
                DateTime calcTime = DateTime.Now;//new DateTime(2024, 6, 11, 17, 10, 10);//
                IStation.CalcModel.ZyStartInfo zyStartInfo = new IStation.CalcModel.ZyStartInfo();
                if (prj.EndTimeOpenPumpStatus != null && prj.EndTimeOpenPumpStatus.Count > 0)
                {
                    zyStartInfo.OpenPumpStatus = string.Join(",", prj.EndTimeOpenPumpStatus);
                }
                var near_pt = prj.NearPointTime(calcTime);
                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;
                double start_yuce = lz + now_level - new_yuce;
                IStation.LogHelper.Info(string.Format("GetAnaStartPara  {0},{1},{2},{3} ", lz, now_level, new_yuce, start_yuce));
                zyStartInfo.ReservoirWaterLevel = start_yuce;
                return new IStation.Dto.ApiResult<IStation.CalcModel.ZyStartInfo>(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) };
            }
        }
        /// <summary>
        ///
        ///
        /// </summary>
        /// <param name="day"></param>
        /// <returns></returns>
@@ -283,58 +405,58 @@
            var list = HistoryAnaPrjFileHelper.GetExistStatus(year, month);
            if (list == null)
            {
                list = new List<string >();
                list = new List<string>();
            }
            return new IStation.Dto.ApiResult<List<string>>(list);
        }
        ///// <summary>
        /////
        ///// </summary>
        ///// <param name="day"></param>
        ///// <returns></returns>
        //[Route("GetLastTimeOpenPumpCount")]
        //[HttpGet]
        //public IStation.Dto.ApiResult GetLastTimeOpenPumpCount(DateTime day)
        //{
        //    var  status = HistoryAnaPrjFileHelper.GetLastTime_OpenPumpStatus (day);
        //    if(status == null)
        //    {
        //        return new IStation.Dto.ApiResult<int>(-1);
        //    }
        //  else
        //    {
        //        return new IStation.Dto.ApiResult<int>(status.Count);
        //    }
        //}
        /// <summary>
        ///
        /// </summary>
        /// <param name="day"></param>
        /// <returns></returns>
        [Route("GetLastTimeOpenPumpCount")]
        [HttpGet]
        public IStation.Dto.ApiResult GetLastTimeOpenPumpCount(DateTime day)
        {
            var  status = HistoryAnaPrjFileHelper.GetLastTime_OpenPumpStatus (day);
            if(status == null)
            {
                return new IStation.Dto.ApiResult<int>(-1);
            }
          else
            {
                return new IStation.Dto.ApiResult<int>(status.Count);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="day"></param>
        /// <returns></returns>
        [Route("GetLastTimeOpenPumpStatus")]
        [HttpGet]
        public IStation.Dto.ApiResult GetLastTimeOpenPumpStatus(DateTime day)
        {
            var  status = HistoryAnaPrjFileHelper.GetLastTime_OpenPumpStatus(day);
            if(status == null)
                return new IStation.Dto.ApiResult<string >("");
            else
            return new IStation.Dto.ApiResult<string >(string.Join(",",status));
        }
        ///// <summary>
        /////
        ///// </summary>
        ///// <param name="day"></param>
        ///// <returns></returns>
        //[Route("GetLastTimeOpenPumpStatus")]
        //[HttpGet]
        //public IStation.Dto.ApiResult GetLastTimeOpenPumpStatus(DateTime day)
        //{
        //    var  status = HistoryAnaPrjFileHelper.GetLastTime_OpenPumpStatus(day);
        //    if(status == null)
        //        return new IStation.Dto.ApiResult<string >("");
        //    else
        //    return new IStation.Dto.ApiResult<string >(string.Join(",",status));
        //}
        public class SavePrjRequest
        {
        {
            public IStation.CalcModel.AnaSetting settting { get; set; }
            public IStation.CalcModel.AnaRequestBase requestBase { get; set; }
            public IStation.CalcModel.AnaPrj prj { get; set; }
            public bool isSubmit { get; set; }
        }
        /// <summary>
        ///
        ///
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
@@ -342,7 +464,7 @@
        [HttpPost]
        public async Task<IStation.Dto.ApiResult> SavePrj([FromBody] SavePrjRequest request)
        {
            if (request == null  )
            if (request == null)
            {
                return new IStation.Dto.ApiResult() { Code = ApiResultCode.Error, Message = "day null" };
            }
@@ -357,15 +479,14 @@
            //var dal = new IStation.DAL.AnaProject();
            //dal.Insert(request.prj, request.requestBase);
            if (request.isSubmit)
            {
                string error = await ZyProjectHelper.SubmitPrj(request.prj);//, (id) => { IStation.LogHelper.Info("SavePrj success id=" + id); }, (info) => { IStation.LogHelper.Info("SavePrj failse info:" + info); });//.Result;
                if(!string.IsNullOrEmpty(error))
                if (!string.IsNullOrEmpty(error))
                {
                    IStation.LogHelper.Info("Submit prj finish (fail) day:" + request.requestBase.StartTime + ",error:" + error);
                    return new IStation.Dto.ApiResult<string>(error) {  Code = ApiResultCode.Error};
                    return new IStation.Dto.ApiResult<string>(error) { Code = ApiResultCode.Error };
                }
                else
                {
@@ -373,14 +494,7 @@
                }
            }
            return new IStation.Dto.ApiResult<bool>(ret) { Code = ApiResultCode.Success };
        }
    }
}
}