using OrpaonEMS.App.Models;
using OrpaonEMS.Model;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
namespace OrpaonEMS.App.Services
{
///
/// 月浦
/// 数据分析模型
/// 数据统计模型
///
public class YuPuPwAnalyzeService : BindableBase
{
///
/// 周期定时器
///
private System.Timers.Timer CycleTimer { get; set; }
public ILogService LogService { get; }
///
/// 实例化函数
///
public YuPuPwAnalyzeService(ILogService logService,
IFreeSql freeSql,
ConfigDataService configDataService,
//SolarEnergyService solarEnergyService,
YuePuRunModelService yuePuRunModelService
)
{
LogService = logService;
this.freeSql = freeSql;
ConfigDataService = configDataService;
//SolarEnergyService = solarEnergyService;
YuePuRunModelService = yuePuRunModelService;
//InPowerPCSDataService = inPowerPCSDataService;
if (ConfigDataService.IsMaster)
{
//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;
LoadInitialYuPuHourDataByDb();
}
//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 _ListLastYuPuHourData = new ObservableCollection();
///
/// 日小数数据集合
///
public ObservableCollection ListLastYuPuHourData
{
get { return _ListLastYuPuHourData; }
set { _ListLastYuPuHourData = value; RaisePropertyChanged(); }
}
#region 年月日 时分 触发动作
private int _CurMinInfo;
///
/// 当前的分钟信息
/// 用分钟用于触发小时的数据
///
private int CurMinInfo
{
get { return _CurMinInfo; }
set
{
EsManageAnalyse.TotalChargPw = YuePuRunModelService.EsEleMeter1.EleQ_P;
EsManageAnalyse.TotalDisChargPw = YuePuRunModelService.EsEleMeter1.EleQ_N;
//日充放电量
EsManageAnalyse.DayChargPw = YuePuRunModelService.EsEleMeter1.EleQ_P - EsManageAnalyse.DayStartPointChargPw;
EsManageAnalyse.DayDisChargPw = YuePuRunModelService.EsEleMeter1.EleQ_N - EsManageAnalyse.DayStartPointDisChargPw;
//月充放电量
EsManageAnalyse.MonthChargPw = EsManageAnalyse.TotalChargPw - EsManageAnalyse.MonthStartPointChargPw;
EsManageAnalyse.MonthDisChargPw = EsManageAnalyse.TotalDisChargPw - EsManageAnalyse.MonthStartPointDisChargPw;
//年充放电量
EsManageAnalyse.YearChargPw = EsManageAnalyse.TotalChargPw - EsManageAnalyse.YearStartPointChargPw;
EsManageAnalyse.YearDisChargPw = EsManageAnalyse.TotalDisChargPw - EsManageAnalyse.YearStartPointDisChargPw;
SolarTaxAnalyse.TotalChargPw = YuePuRunModelService.SolarEleMeter3.EleQ_N;
SolarTaxAnalyse.DayChargPw = YuePuRunModelService.SolarEleMeter3.EleQ_N - SolarTaxAnalyse.DayStartPointPw;
SolarTaxAnalyse.MonthChargPw = YuePuRunModelService.SolarEleMeter3.EleQ_N - SolarTaxAnalyse.MonthStartPointPw;
SolarTaxAnalyse.YearChargPw = YuePuRunModelService.SolarEleMeter3.EleQ_N - SolarTaxAnalyse.YearStartPointPw;
SolarManageAnalyse.TotalChargPw = YuePuRunModelService.SolarEleMeter2.EleQ_N;
SolarManageAnalyse.DayChargPw = YuePuRunModelService.SolarEleMeter2.EleQ_N - SolarManageAnalyse.DayStartPointPw;
SolarManageAnalyse.MonthChargPw = YuePuRunModelService.SolarEleMeter2.EleQ_N - SolarManageAnalyse.MonthStartPointPw;
SolarManageAnalyse.YearChargPw = YuePuRunModelService.SolarEleMeter2.EleQ_N - SolarManageAnalyse.YearStartPointPw;
if (_CurMinInfo != value)
{
//DayChargPw = energyStorage.AcrelMeters.TotalInPWh - DayStartPointChargPw;
//DayDisChargPw = energyStorage.AcrelMeters.TotalOutPWh - DayStartPointDisChargPw;
_CurMinInfo = value;
//分钟改变和分钟数据为0那么需要触发小时保存数据
if (value == 59)
{
RecordYuPuHourData();
}
}
}
}
//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)
{
//不为空的话,则赋值。获取本月第一个小时的数据作为本月的初始数据信息
EsManageAnalyse.DayStartPointChargPw = DayInitData.EsManageHourPointChargValue;
EsManageAnalyse.DayStartPointDisChargPw = DayInitData.EsManageHourPointDisChargValue;
SolarTaxAnalyse.DayStartPointPw = DayInitData.SolarTaxHourPointValue;
SolarManageAnalyse.DayStartPointPw = DayInitData.SolarManageHourPointValue;
}
else
{
EsManageAnalyse.DayStartPointChargPw = GetEsAccChargPw();
EsManageAnalyse.DayStartPointDisChargPw = GetEsAccDisChargPw();
SolarTaxAnalyse.DayStartPointPw = YuePuRunModelService.SolarEleMeter3.EleQ_N;
SolarManageAnalyse.DayStartPointPw = YuePuRunModelService.SolarEleMeter2.EleQ_N;
}
_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)
{
//不为空的话,则赋值。获取本月第一个小时的数据作为本月的初始数据信息
EsManageAnalyse.MonthStartPointChargPw = MonthInitData.EsManageHourPointChargValue;
EsManageAnalyse.MonthStartPointDisChargPw = MonthInitData.EsManageHourPointDisChargValue;
SolarTaxAnalyse.MonthStartPointPw = MonthInitData.SolarTaxHourPointValue;
SolarManageAnalyse.MonthStartPointPw = MonthInitData.SolarManageHourPointValue;
}
else
{
EsManageAnalyse.MonthStartPointChargPw = GetEsAccChargPw();
EsManageAnalyse.MonthStartPointDisChargPw = GetEsAccDisChargPw();
SolarTaxAnalyse.MonthStartPointPw = YuePuRunModelService.SolarEleMeter3.EleQ_N;
SolarManageAnalyse.MonthStartPointPw = YuePuRunModelService.SolarEleMeter2.EleQ_N;
}
_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)
{
//不为空的话,则赋值。获取新年第一个小时的数据作为本年的初始数据信息
EsManageAnalyse.YearStartPointChargPw = YearInitData.EsManageHourPointChargValue;
EsManageAnalyse.YearStartPointDisChargPw = YearInitData.EsManageHourPointDisChargValue;
SolarTaxAnalyse.YearStartPointPw = YearInitData.SolarTaxHourPointValue;
SolarManageAnalyse.YearStartPointPw = YearInitData.SolarManageHourPointValue;
}
else
{
EsManageAnalyse.YearStartPointChargPw = GetEsAccChargPw();
EsManageAnalyse.YearStartPointDisChargPw = GetEsAccDisChargPw();
SolarTaxAnalyse.YearStartPointPw = YuePuRunModelService.SolarEleMeter3.EleQ_N;
SolarManageAnalyse.YearStartPointPw = YuePuRunModelService.SolarEleMeter2.EleQ_N;
}
_CurYearInfo = value;
}
}
}
///
/// ConfigDbData Category数据
///
private string Category { get; set; } = "PwAnalyze";
#endregion
///
/// 上个小时保存的数据
/// 保存的上个小时的数据
///
private YuPuHourData LastHourEnergyData { get; set; }
private IFreeSql freeSql { get; set; }
///
/// 当前的配置服务
///
public ConfigDataService ConfigDataService { get; }
//public SolarEnergyService SolarEnergyService { get; }
public YuePuRunModelService YuePuRunModelService { get; }
//public InPowerPCSDataService InPowerPCSDataService { get; }
///
/// 记录小时数据
///
private void RecordYuPuHourData()
{
try
{
var InsertData = freeSql.Insert(new YuPuHourData()
{
WorkDay = DateTime.Now.Day,
Month = DateTime.Now.Month,
Year = DateTime.Now.Year,
HourInfo = DateTime.Now.Hour,
//正向代表给储能充电
//反向代表储能给管理大楼放电
EsManageHourPointChargValue = GetEsAccChargPw(),
EsManageHourPointDisChargValue = GetEsAccDisChargPw(),
EsManageHourCharg = GetEsHourCharg(),
EsManageHourDisCharg = GetEsHourDisCharg(),
//反向代表光伏给税务大楼的供能
SolarTaxHourPointValue = YuePuRunModelService.SolarEleMeter3.EleQ_N,
SolarTaxHourCharg = GetSolarHour(),
SolarManageHourPointValue = YuePuRunModelService.SolarEleMeter2.EleQ_N,
SolarManageHourCharg = GetSolarToManageHour(),
}).ExecuteInserted();
Console.WriteLine($"{DateTime.Now.ToString()}:小时数据触发");
//保存小时数据成功
if (InsertData.Count > 0)
{
LastHourEnergyData = InsertData.FirstOrDefault();
ListLastYuPuHourData = GetDayYuPuHourData();
}
}
catch (Exception ex)
{
LogService.Info($"时间:{DateTime.Now.ToString()}-【RecordYuPuHourData】-{ex.Message}");
}
}
///
/// 获取小时数据
///
public ObservableCollection GetDayYuPuHourData()
{
try
{
//获取最近12个小时的数据
var Data = freeSql.Select().OrderByDescending(a => a.CreateTime).Take(24).ToList();
return new ObservableCollection(Data);
}
catch (Exception ex)
{
LogService.Info($"时间:{DateTime.Now.ToString()}-【ExitPeakValley】-{ex.Message}");
return new ObservableCollection();
}
}
///
/// 加载初始的数据
///
///
public void LoadInitialYuPuHourDataByDb()
{
//如果程序中间中断了一天,那么最新的作为上一个一个小时的数据,那么这个小时的数据会比较大,这个也没有问题,确保总数对的上即可。
var FirstData = freeSql.Select().OrderByDescending(a => a.CreateTime).Take(24).ToList();
if (FirstData.Count > 0)
{
LastHourEnergyData = FirstData!.FirstOrDefault();
ListLastYuPuHourData = new ObservableCollection(FirstData);
}
else
{
LastHourEnergyData = new YuPuHourData();
}
}
#region 统计信息
///
/// 获取储能的总充电数据
/// 取决于使用哪个数据仪表/PCS,封装成方法,方便替换
///
///
private double GetEsAccChargPw()
{
return YuePuRunModelService.EsEleMeter1.EleQ_P;
}
///
/// 获取储能的小时收益数据
///
///
private double GetEsHourRevenue(double price)
{
return (GetEsHourCharg() - GetEsHourDisCharg()) * price;
}
///
/// 获取储能的总放电数据
/// 取决于使用哪个数据仪表/PCS,封装成方法,方便替换
///
///
private double GetEsAccDisChargPw()
{
return YuePuRunModelService.EsEleMeter1.EleQ_N;
}
///
/// 获取储能的充电小时数据
///
///
private double GetEsHourCharg()
{
return GetEsAccChargPw() - LastHourEnergyData.EsManageHourPointChargValue;
}
///
/// 获取储能的放电小时数据
///
///
private double GetEsHourDisCharg()
{
return GetEsAccDisChargPw() - LastHourEnergyData.EsManageHourPointDisChargValue;
}
///
/// 获取光伏的放电小时数据
///
///
private double GetSolarHour()
{
return YuePuRunModelService.SolarEleMeter3.EleQ_N - LastHourEnergyData.SolarTaxHourPointValue;
}
///
/// 获取光伏到管理大楼的放电小时数据
///
///
private double GetSolarToManageHour()
{
return YuePuRunModelService.SolarEleMeter2.EleQ_N - LastHourEnergyData.SolarManageHourPointValue;
}
/////
///// 新的一年,年的初始信息
/////
/////
//private void LoadYearInit()
//{
// //获取今年第一天的数据历史信息
// freeSql.Select().Where(a => a.Year == DateTime.Now.Year && a.Month ==)
//}
///
/// 获取年月日的信息
///
///
private YuPuHourData 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 YuPuSolarTaxAnalyse SolarTaxAnalyse { get; set; } = new YuPuSolarTaxAnalyse();
///
/// 管理大楼光伏统计模型
///
public YuPuSolarManageAnalyse SolarManageAnalyse { get; set; } = new YuPuSolarManageAnalyse();
///
/// 管理大楼储能统计模型
///
public YuPuManageAnalyse EsManageAnalyse { get; set; } = new YuPuManageAnalyse();
/////
///// 液冷统计模型
/////
//public CoolAnalyse CoolAnalyse { get; set; } = new CoolAnalyse();
#endregion
}
public class YuPuManageAnalyse : BindableBase
{
///
/// 一天的开始0时充电量数据
///
public double DayStartPointChargPw { get; set; }
///
/// 一天的开始0时放电量数据
///
public double DayStartPointDisChargPw { get; set; }
///
/// 月度的开始1号充电量数据
///
public double MonthStartPointChargPw { get; set; }
///
/// 月度的开始1号充电量数据
///
public double MonthStartPointDisChargPw { get; set; }
///
/// 年的开始1号充电量数据
///
public double YearStartPointChargPw { get; set; }
///
/// 年的开始1号充电量数据
///
public double YearStartPointDisChargPw { get; set; }
///
/// ////////////////////////////////////储能充电量////////////////////////////////////////////
///
private double _DayChargPw;
///
/// 储能 日充电量 kWh
///
public double DayChargPw
{
get { return _DayChargPw; }
set { _DayChargPw = value; RaisePropertyChanged(); }
}
private double _MonthChargPw;
///
/// 储能 月充电量 kWh
///
public double MonthChargPw
{
get { return _MonthChargPw; }
set { _MonthChargPw = value; RaisePropertyChanged(); }
}
private double _YearChargPw;
///
/// 储能 年充电量 kWh
///
public double YearChargPw
{
get { return _YearChargPw; }
set { _YearChargPw = value; RaisePropertyChanged(); }
}
private double _TotalChargPw;
///
/// 储能 总充电量 kWh
///
public double TotalChargPw
{
get { return _TotalChargPw; }
set { _TotalChargPw = value; RaisePropertyChanged(); }
}
///
/// ////////////////////////////////////储能放电量////////////////////////////////////////////
///
private double _DayDisChargPw;
///
/// 储能 日放电量 kWh
///
public double DayDisChargPw
{
get { return _DayDisChargPw; }
set { _DayDisChargPw = value; RaisePropertyChanged(); }
}
private double _MonthDisChargPw;
///
/// 储能 月放电量 kWh
///
public double MonthDisChargPw
{
get { return _MonthDisChargPw; }
set { _MonthDisChargPw = value; RaisePropertyChanged(); }
}
private double _YearDisChargPw;
///
/// 储能 年放电量 kWh
///
public double YearDisChargPw
{
get { return _YearDisChargPw; }
set { _YearDisChargPw = value; RaisePropertyChanged(); }
}
private double _TotalDisChargPw;
///
/// 储能 总放电量 kWh
///
public double TotalDisChargPw
{
get { return _TotalDisChargPw; }
set { _TotalDisChargPw = value; RaisePropertyChanged(); }
}
}
///
/// 光伏税务
///
public class YuPuSolarTaxAnalyse : BindableBase
{
///
/// 一天的开始0时发电量数据
///
public double DayStartPointPw { get; set; }
///
/// 月份的开始0时发电量数据
///
public double MonthStartPointPw { get; set; }
///
/// 年的开始0时发电量数据
///
public double YearStartPointPw { get; set; }
private double _DayChargPw;
///
/// 光伏 光伏日发电量 kWh
///
public double DayChargPw
{
get { return _DayChargPw; }
set { _DayChargPw = value; RaisePropertyChanged(); }
}
private double _MonthChargPw;
///
/// 光伏 光伏月发电量 kWh
///
public double MonthChargPw
{
get { return _MonthChargPw; }
set { _MonthChargPw = value; RaisePropertyChanged(); }
}
private double _YearChargPw;
///
/// 光伏 光伏年发电量 kWh
///
public double YearChargPw
{
get { return _YearChargPw; }
set { _YearChargPw = value; RaisePropertyChanged(); }
}
private double _TotalChargPw;
///
/// 光伏 光伏总发电量 kWh
///
public double TotalChargPw
{
get { return _TotalChargPw; }
set { _TotalChargPw = value; RaisePropertyChanged(); }
}
}
///
/// 光伏管理大楼
///
public class YuPuSolarManageAnalyse : BindableBase
{
///
/// 一天的开始0时发电量数据
///
public double DayStartPointPw { get; set; }
///
/// 月份的开始0时发电量数据
///
public double MonthStartPointPw { get; set; }
///
/// 年的开始0时发电量数据
///
public double YearStartPointPw { get; set; }
private double _DayChargPw;
///
/// 光伏 光伏日发电量 kWh
///
public double DayChargPw
{
get { return _DayChargPw; }
set { _DayChargPw = value; RaisePropertyChanged(); }
}
private double _MonthChargPw;
///
/// 光伏 光伏月发电量 kWh
///
public double MonthChargPw
{
get { return _MonthChargPw; }
set { _MonthChargPw = value; RaisePropertyChanged(); }
}
private double _YearChargPw;
///
/// 光伏 光伏年发电量 kWh
///
public double YearChargPw
{
get { return _YearChargPw; }
set { _YearChargPw = value; RaisePropertyChanged(); }
}
private double _TotalChargPw;
///
/// 光伏 光伏总发电量 kWh
///
public double TotalChargPw
{
get { return _TotalChargPw; }
set { _TotalChargPw = value; RaisePropertyChanged(); }
}
}
}