duheng
2024-05-29 b4189107397fb4e2da2bd9343d0eb85d44918932
WaterPredict/IStation.ChEr.WebApi.Predict/ÈÎÎñ/CalcWaterPredictJob.cs
@@ -1,4 +1,5 @@
using IStation.Application;
using IStation.ChEr.Application;
using IStation.ChEr.Model;
using IStation.Service;
using Quartz;
@@ -35,7 +36,7 @@
                insert2daysPredictData();
            }
            var TodayRealdataList = ConnectHelper.GetByPumpOneDayWaterData(DateTime.Today, DateTime.Today.AddDays(1)).Where(x => x.DateTime.Hour <= DateTime.Now.Hour).ToList();  //获取当前日期前今天的所有值
            LogHelper.Info("已找到当天时间前所有数据");
            LogHelper.Info("已找到当前时间前所有数据");
            int dayHour = int.Parse(string.Format("{0:00}{1:00}{2:00}", DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour));
            var TwoDaysList = _bll.GetEnd2Days(300);
            var select = TwoDaysList.Where(x => x.DayHour == dayHour).FirstOrDefault();
@@ -43,21 +44,54 @@
            {
                try
                {
                    select.RealValue = TodayRealdataList.Last().Total;
                    select.LastPredictTime = DateTime.Now;
                    _bll.Update(select);
                    if (TodayRealdataList.Count >= 2)
                    {
                        var lastElementTotal = TodayRealdataList.Last().Total;
                        var secondLastElementTotal = TodayRealdataList[TodayRealdataList.Count - 2].Total;
                        select.RealValue = TodayRealdataList.Last().Total;
                        select.RealDifferenceValue = lastElementTotal - secondLastElementTotal;
                        if (select.RealDifferenceValue == 0 || select.RealDifferenceValue < 0)
                        {
                            if (PredictHelper.IsOpenState())
                            {
                                select.Description = "真实数据出现异常";
                                select.States = 0;
                                _bll.Update(select);
                                return null;
                            }
                        }
                        select.States = 1;
                        _bll.Update(select);
                    }
                    else
                    {
                        select.RealValue = TodayRealdataList.Last().Total;
                        select.RealDifferenceValue = TodayRealdataList.Last().Total - _bll.GetEnd2Days(24).Last().RealValue;
                        if (select.RealDifferenceValue == 0 || select.RealDifferenceValue < 0)
                        {
                            if (PredictHelper.IsOpenState())
                            {
                                select.Description = "真实数据出现异常";
                            }
                        }
                        select.States = 1;
                        _bll.Update(select);
                    }
                }
                catch
                catch (Exception e)
                {
                    select.RealValue = -1;
                    select.RealValue = 0;
                    select.States = 0;
                    select.Description = "为真实数据赋值错误!" + "原因:" + e;
                    _bll.Update(select);
                    LogHelper.Info("未能从众毅取到真实数据,时间:" + DateTime.Now.ToString());
                    // LogHelper.Info("未能从众毅取到真实数据,时间:" + DateTime.Now.ToString());
                }
            }
            else
            {
                select.RealValue = -1;
                select.LastPredictTime = DateTime.Now;
                select.RealValue = 0;
                select.States = 0;
                select.Description = "未能从众毅取到真实数据";
                _bll.Update(select);
                LogHelper.Info("未能从众毅取到真实数据,时间:" + DateTime.Now.ToString());
            }
@@ -70,17 +104,21 @@
        int day = (input.DayHour % 10000) / 100; // èŽ·å–æ•´æ•°çš„ç™¾ä½å’Œåä½è¡¨ç¤ºæ—¥æœŸ
        int hour = input.DayHour % 100; // èŽ·å–æ•´æ•°çš„ä¸ªä½æ•°è¡¨ç¤ºå°æ—¶
        DateTime dateTime = new DateTime(DateTime.Now.Year, month, day, hour, 0, 0);
        return Tuple.Create(dateTime, (double)input.RealValue);
        return Tuple.Create(dateTime, (double)input.RealDifferenceValue);
    }).ToList(); //转换为SSA算法所需入参
            tupleList = tupleList.OrderBy(x => x.Item1).ToList();  //按照时间进行排序
            var predictdata = _SSAPredictHelper.Predict(tupleList, 3600, 10, 3600, (float)0.99, 24);
            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).ToList();
            var currentdata = TwoDaysList.Where(x => x.DayHour >= starthour && x.DayHour <= endhour).OrderBy(x => x.DayHour).ToList();
            for (int i = 0; i < currentdata.Count; i++)
            {
                currentdata[i].LastPredictValue = Math.Round(predictdata[i].Total, 1);
                currentdata[i].LastPredictValue = Math.Round(predictdata[i].Total, 0);
                if (currentdata[i].LastPredictValue > 90000 || currentdata[i].LastPredictValue < 20000)
                {
                    currentdata[i].Description = "预测数据差异过大";
                }
                currentdata[i].LastPredictTime = DateTime.Now;
                currentdata[i].PredictValueList = currentdata[i].LastPredictValue.ToString() + "," + currentdata[i].PredictValueList;
            }
@@ -108,18 +146,13 @@
                // æž„造 DateTime å¯¹è±¡
                DateTime dateTime = new DateTime(DateTime.Now.Year, month, day, hour, 0, 0);
                ssaInput.Add(new SSAInput { Time = dateTime, Value = (float)item.RealValue });
                ssaInput.Add(new SSAInput { Time = dateTime, Value = (float)item.RealDifferenceValue });
            }
            ssaInput = ssaInput.OrderBy(x => x.Time).ToList();
            List<Tuple<DateTime, double>> tupleList = ssaInput
      .Select(input => Tuple.Create(input.Time, (double)input.Value))
      .ToList();
            var predictdata = _SSAPredictHelper.Predict(tupleList, 3600, 10, 3600, (float)0.99, 48);
            /*            foreach (var item in predictdata)
                        {
                            int dayHour = int.Parse(string.Format("{0:00}{1:00}{2:00}", item.DateTime.Month, item.DateTime.Day, item.DateTime.Hour));
                            waterPredictRecords.Add(new WaterPredictRecord { DayHour = dayHour, PredictTime = DateTime.Now, LastPredictValue = item.Total });
                        }*/
            var list = alllist.Where(x => x.DayHour >= lastdaystarthour + 100 && x.DayHour <= lastdayendhour + 100).ToList();
            //找到今天所有的预测数据,并替换
            for (int i = 0; i < predictdata.Count; i++)