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
}
}