tangxu
2024-07-03 871ce0adc5e746833f2a08e3e5f872535eb90516
WaterPredict/IStation.ChEr.WebApi.Predict/ÈÎÎñ/CalcWaterPredictJob.cs
@@ -33,17 +33,17 @@
        /// <returns></returns>
        public Task Execute(IJobExecutionContext context)
        {
            LogHelper.Info(DateTime.Now.ToString());
            if (DateTime.Now.Hour == 0 && DateTime.Now.Minute == 5)
            if (DateTime.Now.Hour == 0 && DateTime.Now.Minute == 15)
            {
                insert2daysPredictData();
            }
            var TodayRealdataList = ConnectHelper.GetByPumpOneDayWaterData(DateTime.Today, DateTime.Today.AddDays(1), "1h").Where(x => x.DateTime.Hour <= DateTime.Now.Hour).ToList();
            //获取当前日期前今天的所有值
            int dayHour = WaterPredictRecord.ConvertIntDay(DateTime.Now);
            int lastHour = WaterPredictRecord.ConvertIntDay(DateTime.Now.AddHours(-1));
            var TwoDaysList = _bll.GetEnd2Days(300);
            LogHelper.Info("2");
            var select = TwoDaysList.Where(x => x.DayHour == dayHour).FirstOrDefault();
            var lastDifferenceValue = TwoDaysList.Where(x => x.DayHour == lastHour).FirstOrDefault();
            if (TodayRealdataList != null)
            {
                LogHelper.Info("已找到当前时间前所有数据");
@@ -57,16 +57,36 @@
                            var secondLastElementTotal = TodayRealdataList[TodayRealdataList.Count - 2].Total;
                            select.RealTotalValue = TodayRealdataList.Last().Total;
                            select.RealDifferenceValue = lastElementTotal - secondLastElementTotal;
                            if (select.RealDifferenceValue == 0 || select.RealDifferenceValue < 0)
                            if (select.RealDifferenceValue == 0 || select.RealDifferenceValue < 0 || select.RealDifferenceValue > 100000)
                            {
                                if (PredictHelper.IsOpenState())
                                {
                                    select.Description = "真实数据出现异常";
                                    select.Description += ",时间:" + DateTime.Now.ToString("HH:mm") + "众毅提供真实数据出现异常";
                                    var ErrorBakData = ConnectHelper.GetByPumpOneDayWaterData(DateTime.Today, DateTime.Today.AddDays(1), "300s").Where(x => x.DateTime.Hour <= DateTime.Now.Hour).ToList();  //获取当前日期前今天的所有值
                                    select.BakData = JsonHelper.Object2Json(ErrorBakData);
                                    select.States = 0;
                                    if (lastDifferenceValue.RealDifferenceValue > 0)
                                    {
                                        select.RealDifferenceValue = lastDifferenceValue.RealDifferenceValue;
                                    }
                                    else
                                    {
                                        select.RealDifferenceValue = 60000;
                                    }
                                    _bll.Update(select);
                                    return null;
                                }
                                else
                                {
                                    if (lastDifferenceValue.RealDifferenceValue > 0)
                                    {
                                        select.RealDifferenceValue = lastDifferenceValue.RealDifferenceValue;
                                    }
                                    else
                                    {
                                        select.RealDifferenceValue = 60000;
                                    }
                                    select.States = 0;
                                    _bll.Update(select);
                                }
                            }
                            else
@@ -79,14 +99,35 @@
                        {
                            select.RealTotalValue = TodayRealdataList.Last().Total;
                            select.RealDifferenceValue = TodayRealdataList.Last().Total - _bll.GetEnd2Days(240).Where(x => x.DayHour == WaterPredictRecord.ConvertIntDay(DateTime.Now.AddHours(-1))).Last().RealTotalValue;
                            if (select.RealDifferenceValue == 0 || select.RealDifferenceValue < 0)
                            if (select.RealDifferenceValue == 0 || select.RealDifferenceValue < 0 || select.RealDifferenceValue > 100000)
                            {
                                if (PredictHelper.IsOpenState())
                                {
                                    select.Description = "真实数据出现异常";
                                    select.Description += ",时间:" + DateTime.Now.ToString("HH:mm") + "众毅提供真实数据出现异常";
                                    var ErrorBakData = ConnectHelper.GetByPumpOneDayWaterData(DateTime.Today, DateTime.Today.AddDays(1), "300s").Where(x => x.DateTime.Hour <= DateTime.Now.Hour).ToList();  //获取当前日期前今天的所有值
                                    select.BakData = JsonHelper.Object2Json(ErrorBakData);
                                    select.States = 0;
                                    if (lastDifferenceValue.RealDifferenceValue > 0)
                                    {
                                        select.RealDifferenceValue = lastDifferenceValue.RealDifferenceValue;
                                    }
                                    else
                                    {
                                        select.RealDifferenceValue = 60000;
                                    }
                                    _bll.Update(select);
                                }
                                else
                                {
                                    if (lastDifferenceValue.RealDifferenceValue > 0)
                                    {
                                        select.RealDifferenceValue = lastDifferenceValue.RealDifferenceValue;
                                    }
                                    else
                                    {
                                        select.RealDifferenceValue = 60000;
                                    }
                                    select.States = 1;
                                    _bll.Update(select);
                                }
                            }
@@ -99,32 +140,35 @@
                    }
                    catch (Exception e)
                    {
                        select.RealTotalValue = 0;
                        select.RealTotalValue = TodayRealdataList.Last().Total;
                        select.States = 0;
                        select.Description = "为真实数据赋值错误!" + "原因:" + e;
                        select.RealDifferenceValue = lastDifferenceValue.RealDifferenceValue; ;
                        select.Description += ",时间:" + DateTime.Now.ToString("HH:mm") + "遇到未知错误!" + "原因:" + e;
                        var ErrorBakData = ConnectHelper.GetByPumpOneDayWaterData(DateTime.Today, DateTime.Today.AddDays(1), "300s").Where(x => x.DateTime.Hour <= DateTime.Now.Hour).ToList();  //获取当前日期前今天的所有值
                        select.BakData = JsonHelper.Object2Json(ErrorBakData);
                        _bll.Update(select);
                        // LogHelper.Info("未能从众毅取到真实数据,时间:" + DateTime.Now.ToString());
                        LogHelper.Info("遇到未知错误!" + "原因:" + e);
                    }
                }
                else
                {
                    select.RealTotalValue = 0;
                    select.States = 0;
                    select.RealDifferenceValue = 60000;
                    select.Description = "取到的数据与当前时间不匹配,或找不到与当前时间匹配的预测值";
                    var ErrorBakData = ConnectHelper.GetByPumpOneDayWaterData(DateTime.Today, DateTime.Today.AddDays(1), "300s").Where(x => x.DateTime.Hour <= DateTime.Now.Hour).ToList();  //获取当前日期前今天的所有值
                    select.BakData = JsonHelper.Object2Json(ErrorBakData);
                    _bll.Update(select);
                    /*  select.RealTotalValue = 0;
                      select.States = 0;
                      select.RealDifferenceValue = 60000;
                      select.Description += ",时间:" + DateTime.Now.ToString("HH:mm") + "取到的数据与当前时间不匹配,或找不到与当前时间匹配的预测值";
                      var ErrorBakData = ConnectHelper.GetByPumpOneDayWaterData(DateTime.Today, DateTime.Today.AddDays(1), "300s").Where(x => x.DateTime.Hour <= DateTime.Now.Hour).ToList();  //获取当前日期前今天的所有值
                      select.BakData = JsonHelper.Object2Json(ErrorBakData);
                      _bll.Update(select);*/
                    LogHelper.Info("找不到对应当前时间对应数据 æ—¶é—´:" + DateTime.Now);
                    return null;
                }
            }
            else
            {
                select.RealTotalValue = 0;
                select.States = 0;
                select.Description = "未能从众毅取到真实数据";
                select.RealDifferenceValue = 60000;
                select.Description += ",时间:" + DateTime.Now.ToString("HH:mm") + "未能从众毅取到真实数据";
                select.RealDifferenceValue = lastDifferenceValue.RealDifferenceValue; ;
                var ErrorBakData = ConnectHelper.GetByPumpOneDayWaterData(DateTime.Today, DateTime.Today.AddDays(1), "300s").Where(x => x.DateTime.Hour <= DateTime.Now.Hour).ToList();  //获取当前日期前今天的所有值
                select.BakData = JsonHelper.Object2Json(ErrorBakData);
                _bll.Update(select);
@@ -145,22 +189,29 @@
            var starthour = int.Parse(string.Format("{0:00}{1:00}{2:00}", DateTime.Now.Month, DateTime.Now.Day, 0));
            var endhour = int.Parse(string.Format("{0:00}{1:00}{2:00}", DateTime.Now.Month, DateTime.Now.Day, 23));
            var currentdata = TwoDaysList.Where(x => x.DayHour >= starthour && x.DayHour <= endhour).OrderBy(x => x.DayHour).ToList();
            for (int i = 0; i < currentdata.Count; i++)
            if (currentdata.Count == 24)
            {
                currentdata[i].LastPredictValue = Math.Round(predictdata[i].Total, 0);
                if (currentdata[i].LastPredictValue > 90000 || currentdata[i].LastPredictValue < 20000)
                for (int i = 0; i < currentdata.Count; i++)
                {
                    currentdata[i].Description = "预测数据偏差过大";
                    var ErrorBakData = ConnectHelper.GetByPumpOneDayWaterData(DateTime.Today, DateTime.Today.AddDays(1), "300s").Where(x => x.DateTime.Hour <= DateTime.Now.Hour).ToList();  //获取当前日期前今天的所有值
                    currentdata[i].BakData = JsonHelper.Object2Json(ErrorBakData);
                    currentdata[i].States = 0;
                    currentdata[i].LastPredictValue = Math.Round(predictdata[i].Total, 0);
                    if (currentdata[i].LastPredictValue > 90000 || currentdata[i].LastPredictValue < 20000)
                    {
                        currentdata[i].Description += ",时间:" + DateTime.Now.ToString("HH:mm") + "预测数据偏差过大";
                        var ErrorBakData = ConnectHelper.GetByPumpOneDayWaterData(DateTime.Today, DateTime.Today.AddDays(1), "300s").Where(x => x.DateTime.Hour <= DateTime.Now.Hour).ToList();  //获取当前日期前今天的所有值
                        currentdata[i].BakData = JsonHelper.Object2Json(ErrorBakData);
                        currentdata[i].States = 0;
                    }
                    else
                    {
                        currentdata[i].States = 1;
                    }
                    currentdata[i].LastPredictTime = DateTime.Now;
                    currentdata[i].PredictValueList = currentdata[i].LastPredictValue.ToString() + "," + currentdata[i].PredictValueList;
                }
                else
                {
                    currentdata[i].States = 1;
                }
                currentdata[i].LastPredictTime = DateTime.Now;
                currentdata[i].PredictValueList = currentdata[i].LastPredictValue.ToString() + "," + currentdata[i].PredictValueList;
            }
            else
            {
                LogHelper.Info("今天一天的数据小于24条 ---不全");
            }
            _bll.BatSet(currentdata);
            LogHelper.Info("已经替换真实数据");
@@ -189,23 +240,40 @@
            var predictdata = _SSAPredictHelper.Predict(tupleList, 3600, 10, 2880, (float)0.99, 48);
            var list = alllist.Where(x => x.DayHour >= lastdaystarthour + 100 && x.DayHour <= lastdayendhour + 100).OrderBy(x => x.DayHour).ToList();
            //找到今天所有的预测数据,并替换
            for (int i = 0; i < predictdata.Count; i++)
            if (list.Count == 0 || list.Count < 24)
            {
                if (i < 24)
                {
                    list[i].LastPredictTime = DateTime.Now;
                    list[i].LastPredictValue = Math.Round(predictdata[i].Total, 0);
                    list[i].PredictValueList = list[i].LastPredictValue.ToString() + "," + list[i].PredictValueList;
                    list[i].States = 1;
                }
                else
                LogHelper.Info("替换当日完整预测数据时找不到对应时间--");
                for (int i = 24; i < predictdata.Count; i++)
                {
                    int dayHour = int.Parse(string.Format("{0:00}{1:00}{2:00}", predictdata[i].DateTime.Month, predictdata[i].DateTime.Day, predictdata[i].DateTime.Hour));
                    list.Add(new WaterPredictRecord { DayHour = dayHour, PredictTime = DateTime.Now, LastPredictValue = Math.Round(predictdata[i].Total, 0), States = 1 });
                }
                _bll.BatSet(list);
                LogHelper.Info("时间:" + DateTime.Now + "---预测今明两天数据");
                return;
            }
            _bll.BatSet(list);
            LogHelper.Info("时间:" + DateTime.Now + "---预测今明两天数据");
            if (list.Count == 24)
            {
                for (int i = 0; i < predictdata.Count; i++)
                {
                    if (i < 24)
                    {
                        list[i].LastPredictTime = DateTime.Now;
                        list[i].LastPredictValue = Math.Round(predictdata[i].Total, 0);
                        list[i].PredictValueList = list[i].LastPredictValue.ToString() + "," + list[i].PredictValueList;
                        list[i].States = 1;
                    }
                    else
                    {
                        int dayHour = int.Parse(string.Format("{0:00}{1:00}{2:00}", predictdata[i].DateTime.Month, predictdata[i].DateTime.Day, predictdata[i].DateTime.Hour));
                        list.Add(new WaterPredictRecord { DayHour = dayHour, PredictTime = DateTime.Now, LastPredictValue = Math.Round(predictdata[i].Total, 0), States = 1 });
                    }
                }
                _bll.BatSet(list);
                LogHelper.Info("时间:" + DateTime.Now + "---预测今明两天数据");
            }
            /*  _bll.BatSet(list);
              LogHelper.Info("时间:" + DateTime.Now + "---预测今明两天数据");*/
        }
    }
}