duheng
2024-05-22 157b56b903b53847c7257ff8548d3a38cec2e92c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
using IStation.Application;
using IStation.ChEr.Model;
using IStation.Service;
using Quartz;
using System.Data;
using static IStation.Service.SSAPredictHelper;
 
namespace IStation.ChEr.WebApi
{
    /// <summary>
    ///
    /// </summary>
    [DisallowConcurrentExecution]//此特性标识 必须等待这次任务执行完成后,才能执行下次任务
    public class CalcWaterPredictJob : IJob
    {
        /// <summary>
        /// /
        /// </summary>
        public CalcWaterPredictJob()
        {
        }
 
        private SSAPredictHelper _SSAPredictHelper = new SSAPredictHelper();
        private BLL.WaterPredictRecord _bll = new BLL.WaterPredictRecord();
 
        /// <summary>
        ///
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public Task Execute(IJobExecutionContext context)
        {
            if (DateTime.Now.Hour == 0 && DateTime.Now.Minute == 5)
            {
                insert2daysPredictData();
            }
            var TodayRealdataList = ConnectHelper.GetByPumpOneDayWaterData(DateTime.Today, DateTime.Today).Where(x => x.DateTime.Hour <= DateTime.Now.Hour).ToList();  //获取当前日期前今天的所有值
            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();
            if (TodayRealdataList.Last().DateTime.Hour == DateTime.Now.Hour && select != null)
            {
                try
                {
                    select.RealValue = TodayRealdataList.Last().Total;
                    select.LastPredictTime = DateTime.Now;
                    _bll.Update(select);
                }
                catch
                {
                    select.RealValue = -1;
                    _bll.Update(select);
                    LogHelper.Info("未能从众毅取到真实数据,时间:" + DateTime.Now.ToString());
                }
            }
            else
            {
                select.RealValue = -1;
                select.LastPredictTime = DateTime.Now;
                _bll.Update(select);
                LogHelper.Info("未能从众毅取到真实数据,时间:" + DateTime.Now.ToString());
            }
            var beforedata = TwoDaysList.Where(x => x.DayHour <= dayHour).Take(240).ToList();
 
            List<Tuple<DateTime, double>> tupleList = beforedata
    .Select(input =>
    {
        int month = input.DayHour / 10000; // 获取整数的万位数表示月份
        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);
    }).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();
            for (int i = 0; i < currentdata.Count; i++)
            {
                currentdata[i].LastPredictValue = Math.Round(predictdata[i].Total, 1);
                currentdata[i].LastPredictTime = DateTime.Now;
                currentdata[i].PredictValueList = currentdata[i].LastPredictValue.ToString() + "," + currentdata[i].PredictValueList;
            }
            _bll.BatSet(currentdata);
            LogHelper.Info("已经替换真实数据");
            return null;
        }
 
        //预测两天数据(今天和明天)
        public void insert2daysPredictData()
        {
            List<WaterPredictRecord> waterPredictRecords = new List<WaterPredictRecord>();
            List<SSAInput> ssaInput = new List<SSAInput>();
 
            var alllist = _bll.GetEnd2Days(300);
            var lastdaystarthour = int.Parse(string.Format("{0:00}{1:00}{2:00}", DateTime.Today.AddDays(-1).Month, DateTime.Today.AddDays(-1).Day, 0));
            var lastdayendhour = int.Parse(string.Format("{0:00}{1:00}{2:00}", DateTime.Today.AddDays(-1).Month, DateTime.Today.AddDays(-1).Day, 23));
            var selectList = alllist.Where(x => x.DayHour <= lastdayendhour).ToList();
            foreach (var item in selectList)
            {
                // 提取月份、日期和小时部分
                int month = item.DayHour / 10000; // 获取整数的万位数表示月份
                int day = (item.DayHour % 10000) / 100; // 获取整数的百位和十位表示日期
                int hour = item.DayHour % 100; // 获取整数的个位数表示小时
 
                // 构造 DateTime 对象
                DateTime dateTime = new DateTime(DateTime.Now.Year, month, day, hour, 0, 0);
                ssaInput.Add(new SSAInput { Time = dateTime, Value = (float)item.RealValue });
            }
            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++)
            {
                if (i < 24)
                {
                    list[i].LastPredictTime = DateTime.Now;
                    list[i].LastPredictValue = Math.Round(predictdata[i].Total, 1);
                    list[i].PredictValueList = list[i].LastPredictValue.ToString() + "," + list[i].PredictValueList;
                }
                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, 1) });
                }
            }
            _bll.BatSet(list);
            LogHelper.Info("时间:" + DateTime.Now + "---预测今明两天数据");
        }
    }
}