duheng
2025-02-07 c5136b7517998a076f1bd2e4abdda01decae8b6f
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
using IStation.Application;
using IStation.ChEr.Application;
using IStation.ChEr.Model;
using IStation.Service;
using Quartz;
using System.Data;
using Yw;
using Yw.Dto;
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 == 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(1272);
            //  LogHelper.Info("数据库取出" + JsonHelper.Object2Json(twoDaysList));
            //选中当前时间对应的数据库数据
            var select = twoDaysList.Find(x => x.DayHour == dayHour);
            //当前的上一个小时的数据
            var lastValue = twoDaysList.Find(x => x.DayHour == lastHour);
            try
            {
                var allRealData = ConnectHelper.GetLatelyOneHourValue("120s", out string error);
                if (error != string.Empty)
                {
                    LogHelper.Info(error);
                }
                var line1 = PredictHelper.GetAccWater(allRealData, 0, out string line1error);
                select.States = 1;
                if (line1error != string.Empty)
                {
                    select.BakData += JsonHelper.Object2Json(allRealData[0]);
                    select.Description += "嘉定一线数据有误" + line1error;
                    select.States = 0;
                }
                var line2 = PredictHelper.GetAccWater(allRealData, 1, out string line2error);
                if (line2error != string.Empty)
                {
                    select.BakData += JsonHelper.Object2Json(allRealData[1]);
                    select.Description += "嘉定二线数据有误" + line2error;
                    select.States = 0;
                }
 
                var line3 = PredictHelper.GetAccWater(allRealData, 2, out string line3error);
                if (line3error != string.Empty)
                {
                    select.BakData += JsonHelper.Object2Json(allRealData[2]);
                    select.Description += "嘉定三线数据有误" + line3error;
                    select.States = 0;
                }
 
                var pipe2400 = PredictHelper.GetAccWater(allRealData, 3, out string pipe2400error);
                if (pipe2400error != string.Empty)
                {
                    select.BakData += JsonHelper.Object2Json(allRealData[3]);
                    select.Description += "2400总管数据有误" + pipe2400error;
                    select.States = 0;
                }
 
                var pipe2700 = PredictHelper.GetAccWater(allRealData, 4, out string pipe2700error);
                if (pipe2700error != string.Empty)
                {
                    select.BakData += JsonHelper.Object2Json(allRealData[4]);
                    select.Description += "2600总管数据有误" + pipe2700error;
                    select.States = 0;
                }
 
                if (line1 != 0 || line2 != 0 || line3 != 0 || pipe2400 != 0 || pipe2700 != 0)
                {
                    select.RealDifferenceValue = line1 + line2 + line3 + pipe2400 + pipe2700;
                    if (select.RealDifferenceValue < 20000 || select.RealDifferenceValue > 90000)
                    {
                        select.Description += "真实数据偏差过大,请检测数据";
                        select.States = 0;
                    }
                }
                else
                {
                    select.RealDifferenceValue = lastValue.RealDifferenceValue;
                    LogHelper.Info(">>>>五条管内数据有异常");
                };
                //   select.RealDifferenceValue = select.RealTotalValue - lastValue.RealTotalValue;
                LogHelper.Info("替换数据");
                _bll.Update(select);
            }
            catch (Exception ex)
            {
                LogHelper.Info("出现错误,进入catch" + ex.Message);
 
                select.RealTotalValue = 0;
                select.States = 0;
                select.Description += ",时间:" + DateTime.Now.ToString("HH:mm") + "未能从众毅取到真实数据";
                select.RealDifferenceValue = lastValue.RealDifferenceValue; ;
                var ErrorBakData = ConnectHelper.GetLatelyOneHourValue("120s", out string error);
                select.BakData = JsonHelper.Object2Json(ErrorBakData);
                LogHelper.Info("准备修改数据库");
 
                _bll.Update(select);
                LogHelper.Info("众毅获取数据出现问题>>>>" + JsonHelper.Object2Json(ErrorBakData));
            }
            LogHelper.Info("开始获取历史数据");
            //开始进行预测
            var beforeTwoDays = _bll.GetEnd2Days(350);
 
            var beforedata = beforeTwoDays.Where(x => x.DayHour <= dayHour).Take(240).ToList();
            List<Tuple<DateTime, double>> tupleList = beforedata
    .Select(input =>
    {
        var dateTime = WaterPredictRecord.ConvertDatatime(input.DayHour);
        return Tuple.Create(dateTime, (double)input.RealDifferenceValue);
    }).ToList(); //转换为SSA算法所需入参
 
            tupleList = tupleList.OrderBy(x => x.Item1).ToList();  //按照时间进行排序
            var predictdata = _SSAPredictHelper.Predict(tupleList, 3600, 10, 2880, (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).OrderBy(x => x.DayHour).ToList();
            if (currentdata.Count == 24)
            {
                for (int i = 0; i < currentdata.Count; i++)
                {
                    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 realScadaDatas = ConnectHelper.GetLatelyOneHourValue("120s", out string error);
                        currentdata[i].BakData += JsonHelper.Object2Json(realScadaDatas);
                        currentdata[i].States = 0;
                    }
                    else
                    {
                        if (currentdata[i].States == 0)
                        {
                            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
            {
                LogHelper.Info("今天一天的数据小于24条 ---不全");
            }
            LogHelper.Info("开始替换真实数据");
            _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().Take(240);
            foreach (var item in selectList)
            {
                var dateTime = WaterPredictRecord.ConvertDatatime(item.DayHour);
                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, 2880, (float)0.99, 48);
            var list = alllist.Where(x => x.DayHour >= lastdaystarthour + 100 && x.DayHour <= lastdayendhour + 100).OrderBy(x => x.DayHour).ToList();
            //找到今天所有的预测数据,并替换
            if (list.Count == 0 || list.Count < 24)
            {
                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;
            }
            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 + "---预测今明两天数据");*/
        }
    }
}