using System; using System.Collections.Generic; using System.Linq; using System.Web; using Microsoft.Extensions.Logging; using Quartz; using System.Threading.Tasks; using static IStation.Service.SSAPredictHelper; using SqlSugar.Extensions; using IStation.Service; using IStation.ChEr.Model; using Microsoft.AspNetCore.Components.Forms; using IStation.Application; using System.Data; namespace IStation.ChEr.WebApi { /// /// /// [DisallowConcurrentExecution] public class CalcWaterPredictJob : IJob { /// /// / /// public CalcWaterPredictJob() { } private SSAPredictHelper _SSAPredictHelper = new SSAPredictHelper(); private BLL.WaterPredictRecord _bll = new BLL.WaterPredictRecord(); /// /// /// /// /// public Task Execute(IJobExecutionContext context) { if (DateTime.Now.Hour == 0 && DateTime.Now.Minute == 2) { insert2daysData(); } var realdata = ConnectHelper.GetByPumpOneDayWaterData(DateTime.Now, DateTime.Now); int dayHour = int.Parse(string.Format("{0:00}{1:00}{2:00}", DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour)); var twoDaysList = _bll.GerEnd2Days(300); var select = twoDaysList.Where(x => x.DayHour == dayHour).FirstOrDefault(); if (realdata.Last().DateTime.Hour != DateTime.Now.Hour) { select.RealValue = realdata.Last().Total; } else { select.RealValue = -1; LogHelper.Info("未能从中毅取到真实数据,时间:" + DateTime.Now.ToString()); } select.LastPredictTime = DateTime.Now; _bll.Update(select); var beforedata = twoDaysList.Where(x => x.DayHour <= dayHour).Take(240).ToList(); List> 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(); 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); return null; } //预测两天数据(今天和明天) private void insert2daysData() { List waterPredictRecords = new List(); List ssaInput = new List(); var alllist = _bll.GerEnd2Days(240); foreach (var item in alllist) { // 提取月份、日期和小时部分 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> 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 }); } _bll.BatSet(waterPredictRecords); } } }