duheng
2024-05-13 af447e8f2a28cd775bb8bd345ee59dbd575beb47
WaterPredict/IStation.ChEr.WebApi.Predict/ÈÎÎñ/CalcWaterPredictJob.cs
@@ -1,40 +1,116 @@

using System;
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
{
    /// <summary>
    ///
    ///
    /// </summary>
    [DisallowConcurrentExecution]
    public class CalcWaterPredictJob : IJob
    {
        /// <summary>
        /// /
        /// </summary>
        public CalcWaterPredictJob( )
        /// </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)
        {
            IStation.LogHelper.Info("CalcWaterPredict");
            if (DateTime.Now.Hour == 12 && DateTime.Now.Minute == 2)
            {
                insert2daysData();
            }
            var realdata = ConnectHelper.GetByPumpOneDayWaterData(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();
            select.RealValue = realdata.Total;
            select.LastPredictTime = DateTime.Now;
            _bll.Update(select);
            var beforedata = twoDaysList.Where(x => x.DayHour <= dayHour).Take(240).ToList();
            return Task.CompletedTask;
            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();
            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, 1));
            var endhour = int.Parse(string.Format("{0:00}{1:00}{2:00}", DateTime.Now.Month, DateTime.Now.Day, 24));
            var currentdata = twoDaysList.Where(x => x.DayHour >= starthour && x.DayHour <= endhour).ToList();
            for (int i = 0; i < currentdata.Count; i++)
            {
                currentdata[i].LastPredictValue = predictdata[i].Total;
                currentdata[i].LastPredictTime = DateTime.Now;
                currentdata[i].PredictValueList = currentdata[i].LastPredictValue.ToString() + "," + currentdata[i].PredictValueList;
            }
            _bll.BatSet(currentdata);
            return null;
        }
        //预测两天数据(今天和明天)
        private void insert2daysData()
        {
            List<WaterPredictRecord> waterPredictRecords = new List<WaterPredictRecord>();
            List<SSAInput> SSAInput = new List<SSAInput>();
            var bll = new BLL.WaterPredictRecord();
            var alllist = bll.GetLast(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 });
            }
            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 });
            }
            foreach (var item in waterPredictRecords)
            {
                bll.Insert(item);
            }
            //   bll.Inserts(waterPredictRecords);
        }
    }
}