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(); } } } }