using NLog; using OrpaonEMS.Core.EventHandMsg; using OrpaonEMS.Core; using OrpaonEMS.Model; using Prism.Mvvm; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Timers; using System.Collections.ObjectModel; using OrpaonEMS.App.Models; namespace OrpaonEMS.App.Services { /// /// 数据分析模型 /// 数据统计模型 /// public class PwAnalyzeService : BindableBase { /// /// 周期定时器 /// private System.Timers.Timer CycleTimer { get; set; } public ILogService LogService { get; } /// /// 实例化函数 /// public PwAnalyzeService(ILogService logService, IFreeSql freeSql, ConfigDataService configDataService, SolarEnergyService solarEnergyService, InPowerPCSDataService inPowerPCSDataService) { LogService = logService; this.freeSql = freeSql; ConfigDataService = configDataService; SolarEnergyService = solarEnergyService; InPowerPCSDataService = inPowerPCSDataService; //10秒触发一次 CycleTimer = new System.Timers.Timer(10000); CycleTimer.Elapsed += CycleAction; CycleTimer.AutoReset = true; CycleTimer.Enabled = true; LogService.Info($"时间:{DateTime.Now.ToString()}-【PwAnalyze-开始了"); _CurMinInfo = DateTime.Now.Minute; LoadInitialHourDataByDb(); //LoadInitStartData(); } /// /// 周期调用这个方法 /// /// /// /// private void CycleAction(object? sender, ElapsedEventArgs e) { try { //如果Execute执行的是一个很耗时的方法,会导致方法未执行完毕,定时器又启动了一个线程来执行Execute方法 CycleTimer.Stop(); //先关闭定时器 ////先给值 //CurHourInfo = DateTime.Now.Hour; CurMinInfo = DateTime.Now.Minute; CurDayInfo = DateTime.Now.Day; CurMonthInfo = DateTime.Now.Month; CurYearInfo = DateTime.Now.Year; CycleTimer.Start(); //执行完毕后再开启器 } catch (Exception ex) { CycleTimer.Start(); //执行完毕后再开启器 LogService.Info($"时间:{DateTime.Now.ToString()}-【PwAnalyze-CycleAction】-{ex.Message}"); } } private ObservableCollection _ListLastHourData = new ObservableCollection(); /// /// 日小数数据集合 /// public ObservableCollection ListLastHourData { get { return _ListLastHourData; } set { _ListLastHourData = value; RaisePropertyChanged(); } } #region 年月日 时分 触发动作 private int _CurMinInfo; /// /// 当前的分钟信息 /// 用分钟用于触发小时的数据 /// private int CurMinInfo { get { return _CurMinInfo; } set { EsAnalyse.TotalChargPw = InPowerPCSDataService.AccChargPw; EsAnalyse.TotalDisChargPw = InPowerPCSDataService.AccDisChargPw; //日充放电量 EsAnalyse.DayChargPw = InPowerPCSDataService.AccChargPw - EsAnalyse.DayStartPointChargPw; EsAnalyse.DayDisChargPw = InPowerPCSDataService.AccDisChargPw - EsAnalyse.DayStartPointDisChargPw; //月充放电量 EsAnalyse.MonthChargPw = EsAnalyse.TotalChargPw - EsAnalyse.MonthStartPointChargPw; EsAnalyse.MonthDisChargPw = EsAnalyse.TotalDisChargPw - EsAnalyse.MonthStartPointDisChargPw; //年充放电量 EsAnalyse.YearChargPw = EsAnalyse.TotalChargPw - EsAnalyse.YearStartPointChargPw; EsAnalyse.YearDisChargPw = EsAnalyse.TotalDisChargPw - EsAnalyse.YearStartPointDisChargPw; SolarAnalyse.TotalChargPw = SolarEnergyService.AccPw; SolarAnalyse.DayChargPw = SolarEnergyService.AccPw - SolarAnalyse.DayStartPointPw; SolarAnalyse.MonthChargPw = SolarEnergyService.AccPw - SolarAnalyse.MonthStartPointPw; SolarAnalyse.YearChargPw = SolarEnergyService.AccPw - SolarAnalyse.YearStartPointPw; CoolAnalyse.DayPw = 1; CoolAnalyse.DayRunTime = 1; CoolAnalyse.DayActionCount = 1; if (_CurMinInfo != value) { //DayChargPw = energyStorage.AcrelMeters.TotalInPWh - DayStartPointChargPw; //DayDisChargPw = energyStorage.AcrelMeters.TotalOutPWh - DayStartPointDisChargPw; _CurMinInfo = value; //分钟改变和分钟数据为0那么需要触发小时保存数据 if (value == 59) { RecordHourData(); } } } } //private int _CurHourInfo; ///// ///// 当前的小时信息 ///// 用户触发天的信息 ///// //private int CurHourInfo //{ // get { return _CurHourInfo; } // set // { // if (_CurHourInfo != value) // { // //小时改变和那么需要触发天的数据获取 // if (value == 0) // { // StartDayInfo(); // } // _CurHourInfo = value; // } // } //} private int _CurDayInfo; /// /// 当前的天的信息 /// private int CurDayInfo { get { return _CurDayInfo; } set { if (_CurDayInfo != value) { var DayInitData = GetHistoryDataInfo(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0); if (DayInitData != null) { //不为空的话,则赋值。获取本月第一个小时的数据作为本月的初始数据信息 EsAnalyse.DayStartPointChargPw = DayInitData.EsHourPointChargValue; EsAnalyse.DayStartPointDisChargPw = DayInitData.EsHourPointDisChargValue; SolarAnalyse.DayStartPointPw = DayInitData.SolarHourPointValue; } else { EsAnalyse.DayStartPointChargPw = GetEsAccChargPw(); EsAnalyse.DayStartPointDisChargPw = GetEsAccDisChargPw(); SolarAnalyse.DayStartPointPw = SolarEnergyService.AccPw; } _CurDayInfo = value; } } } private int _CurMonthInfo; /// /// 当前的月的信息 /// private int CurMonthInfo { get { return _CurMonthInfo; } set { if (_CurMonthInfo != value) { //月的改变和那么需要触月的数据获取 //需要获取当前月的第一天的数据信息 var MonthInitData = GetHistoryDataInfo(DateTime.Now.Year, DateTime.Now.Month, 1, 0); if (MonthInitData != null) { //不为空的话,则赋值。获取本月第一个小时的数据作为本月的初始数据信息 EsAnalyse.MonthStartPointChargPw = MonthInitData.EsHourPointChargValue; EsAnalyse.MonthStartPointDisChargPw = MonthInitData.EsHourPointDisChargValue; SolarAnalyse.MonthStartPointPw = MonthInitData.SolarHourPointValue; } else { EsAnalyse.MonthStartPointChargPw = GetEsAccChargPw(); EsAnalyse.MonthStartPointDisChargPw = GetEsAccDisChargPw(); SolarAnalyse.MonthStartPointPw = SolarEnergyService.AccPw; } _CurMonthInfo = value; } } } private int _CurYearInfo; /// /// 当前的年的信息 /// private int CurYearInfo { get { return _CurYearInfo; } set { if (_CurYearInfo != value) { //var data = new DateTime(DateTime.Now.Year, 1, 1, 0, 0, 1).ToString("yyyy-MM-dd"); //需要获取当前年的第一天的数据信息 var YearInitData = GetHistoryDataInfo(DateTime.Now.Year, 1, 1, 0); if (YearInitData != null) { //不为空的话,则赋值。获取新年第一个小时的数据作为本年的初始数据信息 EsAnalyse.YearStartPointChargPw = YearInitData.EsHourPointChargValue; EsAnalyse.YearStartPointDisChargPw = YearInitData.EsHourPointDisChargValue; SolarAnalyse.YearStartPointPw = YearInitData.SolarHourPointValue; } else { EsAnalyse.YearStartPointChargPw = GetEsAccChargPw(); EsAnalyse.YearStartPointDisChargPw = GetEsAccDisChargPw(); SolarAnalyse.YearStartPointPw = SolarEnergyService.AccPw; } _CurYearInfo = value; } } } /// /// ConfigDbData Category数据 /// private string Category { get; set; } = "PwAnalyze"; /// /// 关闭App的操作信息 防止信息丢失 /// 保存日初始数据 /// 保存月度的初始数据 /// 保存年度的初始数据 /// -----舍弃 /// private void CloseAppAction() { try { ////ConfigDbData freeSql //var data = freeSql.Select().Where(a => a.Category == Category && a.Name == "1").ToList(); //if (data.Count > 0) //{ //储能 freeSql.Update() .Set(a => a.Value, EsAnalyse.DayStartPointChargPw.ToString("f2")) .Set(a => a.CreateTime, DateTime.Now) .Where(a => a.Category == Category && a.Name == "DayStartPointChargPw") .ExecuteAffrows(); freeSql.Update() .Set(a => a.Value, EsAnalyse.DayStartPointDisChargPw.ToString("f2")) .Set(a => a.CreateTime, DateTime.Now) .Where(a => a.Category == Category && a.Name == "DayStartPointDisChargPw") .ExecuteAffrows(); freeSql.Update() .Set(a => a.Value, EsAnalyse.MonthStartPointChargPw.ToString("f2")) .Set(a => a.CreateTime, DateTime.Now) .Where(a => a.Category == Category && a.Name == "MonthStartPointChargPw") .ExecuteAffrows(); freeSql.Update() .Set(a => a.Value, EsAnalyse.MonthStartPointDisChargPw.ToString("f2")) .Set(a => a.CreateTime, DateTime.Now) .Where(a => a.Category == Category && a.Name == "MonthStartPointDisChargPw") .ExecuteAffrows(); freeSql.Update() .Set(a => a.Value, EsAnalyse.YearStartPointChargPw.ToString("f2")) .Set(a => a.CreateTime, DateTime.Now) .Where(a => a.Category == Category && a.Name == "YearStartPointChargPw") .ExecuteAffrows(); freeSql.Update() .Set(a => a.Value, EsAnalyse.YearStartPointDisChargPw.ToString("f2")) .Set(a => a.CreateTime, DateTime.Now) .Where(a => a.Category == Category && a.Name == "YearStartPointDisChargPw") .ExecuteAffrows(); //光伏 freeSql.Update() .Set(a => a.Value, SolarAnalyse.DayStartPointPw.ToString("f2")) .Set(a => a.CreateTime, DateTime.Now) .Where(a => a.Category == Category && a.Name == "DayStartPointPw") .ExecuteAffrows(); freeSql.Update() .Set(a => a.Value, SolarAnalyse.MonthStartPointPw.ToString("f2")) .Set(a => a.CreateTime, DateTime.Now) .Where(a => a.Category == Category && a.Name == "MonthStartPointPw") .ExecuteAffrows(); freeSql.Update() .Set(a => a.Value, SolarAnalyse.YearStartPointPw.ToString("f2")) .Set(a => a.CreateTime, DateTime.Now) .Where(a => a.Category == Category && a.Name == "YearStartPointPw") .ExecuteAffrows(); //} } catch (Exception ex) { LogService.Info($"时间:{DateTime.Now.ToString()}-【CloseAppAction】-{ex.Message}"); } } /// /// 获取初始的数据 /// -----舍弃 /// private void LoadInitStartData() { try { EsAnalyse.DayStartPointChargPw = double.Parse(freeSql.Select().Where(a => a.Category == Category && a.Name == "DayStartPointChargPw").First().Value); EsAnalyse.DayStartPointDisChargPw = double.Parse(freeSql.Select().Where(a => a.Category == Category && a.Name == "DayStartPointDisChargPw").First().Value); EsAnalyse.MonthStartPointChargPw = double.Parse(freeSql.Select().Where(a => a.Category == Category && a.Name == "MonthStartPointChargPw").First().Value); EsAnalyse.MonthStartPointDisChargPw = double.Parse(freeSql.Select().Where(a => a.Category == Category && a.Name == "MonthStartPointDisChargPw").First().Value); EsAnalyse.YearStartPointChargPw = double.Parse(freeSql.Select().Where(a => a.Category == Category && a.Name == "YearStartPointChargPw").First().Value); EsAnalyse.YearStartPointDisChargPw = double.Parse(freeSql.Select().Where(a => a.Category == Category && a.Name == "YearStartPointDisChargPw").First().Value); SolarAnalyse.DayStartPointPw = double.Parse(freeSql.Select().Where(a => a.Category == Category && a.Name == "DayStartPointPw").First().Value); SolarAnalyse.MonthStartPointPw = double.Parse(freeSql.Select().Where(a => a.Category == Category && a.Name == "MonthStartPointPw").First().Value); SolarAnalyse.YearStartPointPw = double.Parse(freeSql.Select().Where(a => a.Category == Category && a.Name == "YearStartPointPw").First().Value); } catch (Exception ex) { LogService.Info($"时间:{DateTime.Now.ToString()}-【CloseAppAction】-{ex.Message}"); } } #endregion /// /// 上个小时保存的数据 /// 保存的上个小时的数据 /// private HourData LastHourEnergyData { get; set; } private IFreeSql freeSql { get; set; } /// /// 当前的配置服务 /// public ConfigDataService ConfigDataService { get; } public SolarEnergyService SolarEnergyService { get; } public InPowerPCSDataService InPowerPCSDataService { get; } /// /// 记录小时数据 /// private void RecordHourData() { try { ////小时充电量 //var HourCharg = LastHourEnergyData != null ? energyStorage.AcrelMeters.TotalInPWh - LastHourEnergyData.Point_HourCharg : energyStorage.AcrelMeters.TotalInPWh; ////小时放电量 //var HourDisCharg = LastHourEnergyData != null ? energyStorage.AcrelMeters.TotalOutPWh - LastHourEnergyData.Point_HourDisCharg : energyStorage.AcrelMeters.TotalOutPWh; var InsertData = freeSql.Insert(new HourData() { //WorkDay = int.Parse(DateTime.Now.ToString("yyyyMMdd")), //Month = int.Parse(DateTime.Now.ToString("yyyyMM")), //Year = int.Parse(DateTime.Now.ToString("yyyy")), WorkDay = DateTime.Now.Day, Month = DateTime.Now.Month, Year = DateTime.Now.Year, HourInfo = DateTime.Now.Hour, EsHourPointChargValue = GetEsAccChargPw(), EsHourPointDisChargValue = GetEsAccDisChargPw(), EsHourCharg = GetEsHourCharg(), EsHourDisCharg = GetEsHourDisCharg(), EsElePrice = ConfigDataService.CurPeakValleyConfig.Price, EsHourRevenue = 0, SolarHourPointValue = SolarEnergyService.AccPw, SolarHourCharg = GetSolarHour(), SolarElePrice = ConfigDataService.CurPeakValleyConfig.Price, SolarHourRevenue = 0, }).ExecuteInserted(); Console.WriteLine($"{DateTime.Now.ToString()}:小时数据触发"); //保存小时数据成功 if (InsertData.Count > 0) { LastHourEnergyData = InsertData.FirstOrDefault(); ListLastHourData = GetDayHourData(); } } catch (Exception ex) { LogService.Info($"时间:{DateTime.Now.ToString()}-【RecordHourData】-{ex.Message}"); } } ///// ///// 开始一天的数据信息 ///// 做数据的清除 ///// 做开始数据的记录 ///// //private void StartDayInfo() //{ // //EsAnalyse.DayStartPointChargPw = energyStorage.AcrelMeters.TotalInPWh; // //EsAnalyse.DayStartPointDisChargPw = energyStorage.AcrelMeters.TotalOutPWh; // EsAnalyse.DayStartPointChargPw = InPowerPCSDataService.AccChargPw; // EsAnalyse.DayStartPointDisChargPw = InPowerPCSDataService.AccDisChargPw; // SolarAnalyse.DayStartPointPw = SolarEnergyService.AccPw; //} /// /// 获取小时数据 /// public ObservableCollection GetDayHourData() { try { //获取最近12个小时的数据 var Data = freeSql.Select().OrderByDescending(a => a.CreateTime).Take(24).ToList(); //可以计算这个里面的数据 比如汇总和计算小时电价等数据 //foreach (var itemHour in Data) //{ // itemHour.HourValue = itemHour.HourDisCharg - itemHour.HourCharg; //} return new ObservableCollection(Data); } catch (Exception ex) { LogService.Info($"时间:{DateTime.Now.ToString()}-【ExitPeakValley】-{ex.Message}"); return new ObservableCollection(); } } /// /// 加载初始的数据 /// /// public void LoadInitialHourDataByDb() { //如果程序中间中断了一天,那么最新的作为上一个一个小时的数据,那么这个小时的数据会比较大,这个也没有问题,确保总数对的上即可。 var FirstData = freeSql.Select().OrderByDescending(a => a.CreateTime).Take(24).ToList(); if (FirstData.Count > 0) { LastHourEnergyData = FirstData!.FirstOrDefault(); ListLastHourData = new ObservableCollection(FirstData); } else { LastHourEnergyData = new HourData(); } } #region 统计信息 /// /// 获取储能的总充电数据 /// 取决于使用哪个数据仪表/PCS,封装成方法,方便替换 /// /// private double GetEsAccChargPw() { return InPowerPCSDataService.AccChargPw; } /// /// 获取储能的小时收益数据 /// /// private double GetEsHourRevenue(double price) { return (GetEsHourCharg() - GetEsHourDisCharg()) * price; } /// /// 获取储能的总放电数据 /// 取决于使用哪个数据仪表/PCS,封装成方法,方便替换 /// /// private double GetEsAccDisChargPw() { return InPowerPCSDataService.AccDisChargPw; } /// /// 获取储能的充电小时数据 /// /// private double GetEsHourCharg() { return GetEsAccChargPw() - LastHourEnergyData.EsHourPointChargValue; } /// /// 获取储能的放电小时数据 /// /// private double GetEsHourDisCharg() { return GetEsAccDisChargPw() - LastHourEnergyData.EsHourPointDisChargValue; } /// /// 获取光伏的放电小时数据 /// /// private double GetSolarHour() { return SolarEnergyService.AccPw - LastHourEnergyData.SolarHourPointValue; } ///// ///// 新的一年,年的初始信息 ///// ///// //private void LoadYearInit() //{ // //获取今年第一天的数据历史信息 // freeSql.Select().Where(a => a.Year == DateTime.Now.Year && a.Month ==) //} /// /// 获取年月日的信息 /// /// private HourData GetHistoryDataInfo(int Year, int Month, int Day, int hour) { //获取今年第一天的数据历史信息 var Data = freeSql.Select().Where(a => a.Year == Year && a.Month == Month && a.WorkDay == Day && a.HourInfo == hour).ToList(); if (Data.Count > 0) { return Data.FirstOrDefault(); } return null; } /// /// 光伏统计模型 /// public SolarAnalyse SolarAnalyse { get; set; } = new SolarAnalyse(); /// /// 储能统计模型 /// public EsAnalyse EsAnalyse { get; set; } = new EsAnalyse(); /// /// 液冷统计模型 /// public CoolAnalyse CoolAnalyse { get; set; } = new CoolAnalyse(); #endregion } }