using IStation.Application;
using IStation.ChEr.Model;
using IStation.Service;
using Quartz;
using System.Data;
using static IStation.Service.SSAPredictHelper;
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 == 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> 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 waterPredictRecords = new List();
List ssaInput = new List();
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> 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 + "---预测今明两天数据");
}
}
}