Files
YuPu-OrpaonEMS/OrpaonEMS.App/Services/PwAnalyzeService.cs
2025-02-28 22:23:13 +08:00

621 lines
24 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
{
/// <summary>
/// 数据分析模型
/// 数据统计模型
/// </summary>
public class PwAnalyzeService : BindableBase
{
/// <summary>
/// 周期定时器
/// </summary>
private System.Timers.Timer CycleTimer { get; set; }
public ILogService LogService { get; }
/// <summary>
/// 实例化函数
/// </summary>
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();
}
/// <summary>
/// 周期调用这个方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <exception cref="NotImplementedException"></exception>
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<HourData> _ListLastHourData = new ObservableCollection<HourData>();
/// <summary>
/// 日小数数据集合
/// </summary>
public ObservableCollection<HourData> ListLastHourData
{
get { return _ListLastHourData; }
set { _ListLastHourData = value; RaisePropertyChanged(); }
}
#region
private int _CurMinInfo;
/// <summary>
/// 当前的分钟信息
/// 用分钟用于触发小时的数据
/// </summary>
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;
///// <summary>
///// 当前的小时信息
///// 用户触发天的信息
///// </summary>
//private int CurHourInfo
//{
// get { return _CurHourInfo; }
// set
// {
// if (_CurHourInfo != value)
// {
// //小时改变和那么需要触发天的数据获取
// if (value == 0)
// {
// StartDayInfo();
// }
// _CurHourInfo = value;
// }
// }
//}
private int _CurDayInfo;
/// <summary>
/// 当前的天的信息
/// </summary>
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;
/// <summary>
/// 当前的月的信息
/// </summary>
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;
/// <summary>
/// 当前的年的信息
/// </summary>
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;
}
}
}
/// <summary>
/// ConfigDbData Category数据
/// </summary>
private string Category { get; set; } = "PwAnalyze";
/// <summary>
/// 关闭App的操作信息 防止信息丢失
/// 保存日初始数据
/// 保存月度的初始数据
/// 保存年度的初始数据
/// -----舍弃
/// </summary>
private void CloseAppAction()
{
try
{
////ConfigDbData freeSql
//var data = freeSql.Select<ConfigDbData>().Where(a => a.Category == Category && a.Name == "1").ToList();
//if (data.Count > 0)
//{
//储能
freeSql.Update<ConfigDbData>()
.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<ConfigDbData>()
.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<ConfigDbData>()
.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<ConfigDbData>()
.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<ConfigDbData>()
.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<ConfigDbData>()
.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<ConfigDbData>()
.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<ConfigDbData>()
.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<ConfigDbData>()
.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}");
}
}
/// <summary>
/// 获取初始的数据
/// -----舍弃
/// </summary>
private void LoadInitStartData()
{
try
{
EsAnalyse.DayStartPointChargPw = double.Parse(freeSql.Select<ConfigDbData>().Where(a => a.Category == Category && a.Name == "DayStartPointChargPw").First().Value);
EsAnalyse.DayStartPointDisChargPw = double.Parse(freeSql.Select<ConfigDbData>().Where(a => a.Category == Category && a.Name == "DayStartPointDisChargPw").First().Value);
EsAnalyse.MonthStartPointChargPw = double.Parse(freeSql.Select<ConfigDbData>().Where(a => a.Category == Category && a.Name == "MonthStartPointChargPw").First().Value);
EsAnalyse.MonthStartPointDisChargPw = double.Parse(freeSql.Select<ConfigDbData>().Where(a => a.Category == Category && a.Name == "MonthStartPointDisChargPw").First().Value);
EsAnalyse.YearStartPointChargPw = double.Parse(freeSql.Select<ConfigDbData>().Where(a => a.Category == Category && a.Name == "YearStartPointChargPw").First().Value);
EsAnalyse.YearStartPointDisChargPw = double.Parse(freeSql.Select<ConfigDbData>().Where(a => a.Category == Category && a.Name == "YearStartPointDisChargPw").First().Value);
SolarAnalyse.DayStartPointPw = double.Parse(freeSql.Select<ConfigDbData>().Where(a => a.Category == Category && a.Name == "DayStartPointPw").First().Value);
SolarAnalyse.MonthStartPointPw = double.Parse(freeSql.Select<ConfigDbData>().Where(a => a.Category == Category && a.Name == "MonthStartPointPw").First().Value);
SolarAnalyse.YearStartPointPw = double.Parse(freeSql.Select<ConfigDbData>().Where(a => a.Category == Category && a.Name == "YearStartPointPw").First().Value);
}
catch (Exception ex)
{
LogService.Info($"时间:{DateTime.Now.ToString()}-【CloseAppAction】-{ex.Message}");
}
}
#endregion
/// <summary>
/// 上个小时保存的数据
/// 保存的上个小时的数据
/// </summary>
private HourData LastHourEnergyData { get; set; }
private IFreeSql freeSql { get; set; }
/// <summary>
/// 当前的配置服务
/// </summary>
public ConfigDataService ConfigDataService { get; }
public SolarEnergyService SolarEnergyService { get; }
public InPowerPCSDataService InPowerPCSDataService { get; }
/// <summary>
/// 记录小时数据
/// </summary>
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<HourData>(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}");
}
}
///// <summary>
///// 开始一天的数据信息
///// 做数据的清除
///// 做开始数据的记录
///// </summary>
//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;
//}
/// <summary>
/// 获取小时数据
/// </summary>
public ObservableCollection<HourData> GetDayHourData()
{
try
{
//获取最近12个小时的数据
var Data = freeSql.Select<HourData>().OrderByDescending(a => a.CreateTime).Take(24).ToList();
//可以计算这个里面的数据 比如汇总和计算小时电价等数据
//foreach (var itemHour in Data)
//{
// itemHour.HourValue = itemHour.HourDisCharg - itemHour.HourCharg;
//}
return new ObservableCollection<HourData>(Data);
}
catch (Exception ex)
{
LogService.Info($"时间:{DateTime.Now.ToString()}-【ExitPeakValley】-{ex.Message}");
return new ObservableCollection<HourData>();
}
}
/// <summary>
/// 加载初始的数据
/// </summary>
/// <returns></returns>
public void LoadInitialHourDataByDb()
{
//如果程序中间中断了一天,那么最新的作为上一个一个小时的数据,那么这个小时的数据会比较大,这个也没有问题,确保总数对的上即可。
var FirstData = freeSql.Select<HourData>().OrderByDescending(a => a.CreateTime).Take(24).ToList();
if (FirstData.Count > 0)
{
LastHourEnergyData = FirstData!.FirstOrDefault();
ListLastHourData = new ObservableCollection<HourData>(FirstData);
}
else
{
LastHourEnergyData = new HourData();
}
}
#region
/// <summary>
/// 获取储能的总充电数据
/// 取决于使用哪个数据仪表/PCS封装成方法方便替换
/// </summary>
/// <returns></returns>
private double GetEsAccChargPw()
{
return InPowerPCSDataService.AccChargPw;
}
/// <summary>
/// 获取储能的小时收益数据
/// </summary>
/// <returns></returns>
private double GetEsHourRevenue(double price)
{
return (GetEsHourCharg() - GetEsHourDisCharg()) * price;
}
/// <summary>
/// 获取储能的总放电数据
/// 取决于使用哪个数据仪表/PCS封装成方法方便替换
/// </summary>
/// <returns></returns>
private double GetEsAccDisChargPw()
{
return InPowerPCSDataService.AccDisChargPw;
}
/// <summary>
/// 获取储能的充电小时数据
/// </summary>
/// <returns></returns>
private double GetEsHourCharg()
{
return GetEsAccChargPw() - LastHourEnergyData.EsHourPointChargValue;
}
/// <summary>
/// 获取储能的放电小时数据
/// </summary>
/// <returns></returns>
private double GetEsHourDisCharg()
{
return GetEsAccDisChargPw() - LastHourEnergyData.EsHourPointDisChargValue;
}
/// <summary>
/// 获取光伏的放电小时数据
/// </summary>
/// <returns></returns>
private double GetSolarHour()
{
return SolarEnergyService.AccPw - LastHourEnergyData.SolarHourPointValue;
}
///// <summary>
///// 新的一年,年的初始信息
///// </summary>
///// <returns></returns>
//private void LoadYearInit()
//{
// //获取今年第一天的数据历史信息
// freeSql.Select<HourData>().Where(a => a.Year == DateTime.Now.Year && a.Month ==)
//}
/// <summary>
/// 获取年月日的信息
/// </summary>
/// <returns></returns>
private HourData GetHistoryDataInfo(int Year, int Month, int Day, int hour)
{
//获取今年第一天的数据历史信息
var Data = freeSql.Select<HourData>().Where(a => a.Year == Year && a.Month == Month && a.WorkDay == Day && a.HourInfo == hour).ToList();
if (Data.Count > 0)
{
return Data.FirstOrDefault();
}
return null;
}
/// <summary>
/// 光伏统计模型
/// </summary>
public SolarAnalyse SolarAnalyse { get; set; } = new SolarAnalyse();
/// <summary>
/// 储能统计模型
/// </summary>
public EsAnalyse EsAnalyse { get; set; } = new EsAnalyse();
/// <summary>
/// 液冷统计模型
/// </summary>
public CoolAnalyse CoolAnalyse { get; set; } = new CoolAnalyse();
#endregion
}
}