using Backend.Models; using BackendWorkerService.Models; using BackendWorkerService.Services.Implement; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Quartz; using Repository.BackendRepository.Interface; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Xml; namespace BackendWorkerService.Quartz.Jobs { /// /// 電錶歸檔,每小時執行,只執行小時歸檔 /// [DisallowConcurrentExecution] class ArchiveSolarDayJob : IJob { private readonly ILogger logger; private readonly IBackgroundServicePostgresqlRepository backgroundServiceRepository; private readonly ILogger loggers; public ArchiveSolarDayJob( ILogger logger, IBackgroundServicePostgresqlRepository backgroundServiceRepository, ILogger loggers) { this.logger = logger; this.backgroundServiceRepository = backgroundServiceRepository; this.loggers = loggers; } public async Task Execute(IJobExecutionContext context) { Task_Detail task_Detail = new Task_Detail(loggers, backgroundServiceRepository); try { if (await task_Detail.GetNeedWorkTask("ArchiveSolarDayJob", "Day")) { await task_Detail.InsertWorkTime("ArchiveSolarDayJob", "Day", "太陽能日任務開始"); EDFunction ed = new EDFunction(); XmlDocument xmlDocument = new XmlDocument(); var solarService = new SolarService(); var deviceSyncData = new List(); var devicePointSyncData = new List(); var sites = new List(); string bql = string.Empty; string sql = string.Empty; #region 取得obix 設定 var obixApiConfig = new ObixApiConfig(); var sqlObix = $@"SELECT system_value as Value, system_key as Name FROM variable WHERE deleted = 0 AND system_type = 'obixConfig'"; var variableObix = await backgroundServiceRepository.GetAllAsync(sqlObix); obixApiConfig.ApiBase = variableObix.Where(x => x.Name == "ApiBase").Select(x => x.Value).FirstOrDefault(); obixApiConfig.UserName = ed.AESDecrypt(variableObix.Where(x => x.Name == "UserName").Select(x => x.Value).FirstOrDefault()); obixApiConfig.Password = ed.AESDecrypt(variableObix.Where(x => x.Name == "Password").Select(x => x.Value).FirstOrDefault()); String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(obixApiConfig.UserName + ":" + obixApiConfig.Password)); #endregion 取得obix 設定 #region sync solar data await solarService.SyncSiteInfo(logger, sites, obixApiConfig); bql = "neql:solar:archive|bql:select slotPath, name,displayName"; await solarService.SyncDevice(logger, deviceSyncData, obixApiConfig, bql, sites); await solarService.ImportDevice(logger, backgroundServiceRepository, deviceSyncData); bql = "neql:solar:archive and n:history|bql:select displayName, slotPath"; await solarService.SyncDevicePoint(logger, backgroundServiceRepository, devicePointSyncData, obixApiConfig, bql); await solarService.ImportDevicePoint(logger, backgroundServiceRepository, devicePointSyncData); #endregion #region 找出所有solar設備 sql = "select * from device where is_link = '1'"; var deviceData = await backgroundServiceRepository.GetAllAsync(sql); #endregion 找出所有solar設備 #region 找出所有solar系統的點位 sql = "select * from device_point where is_link = '1'"; var devicePointData = await backgroundServiceRepository.GetAllAsync(sql); #endregion 找出所有solar系統的點位 if (deviceData.Any() && devicePointData.Any()) { var now = DateTime.Now; var preHour = now.AddDays(-1); //取得前一天 var startTimestamp = $"{preHour.ToString("yyyy-MM-dd")}T23:55:00.000+08:00"; var endTimestamp = $"{now.ToString("yyyy-MM-dd")}T00:00:00.000+08:00"; string intervalValue = "PT5M"; var data_value = new List(); await solarService.SyncDataValue(logger, data_value, obixApiConfig); await solarService.CheckLastData(logger, backgroundServiceRepository, obixApiConfig, deviceData, devicePointData, startTimestamp, endTimestamp, intervalValue, data_value); startTimestamp = $"{preHour.ToString("yyyy-MM-dd")}T00:00:00.000+08:00"; endTimestamp = $"{now.ToString("yyyy-MM-dd")}T00:00:00.000+08:00"; intervalValue = "PT1H"; if (deviceData.Any()) { await solarService.SyncData(logger, backgroundServiceRepository, obixApiConfig, deviceData, devicePointData, startTimestamp, endTimestamp, intervalValue, data_value, true); } } await task_Detail.InsertWorkTime_End("ArchiveSolarDayJob", "Day", "太陽能日任務完成"); } if (await task_Detail.GetNeedWorkTask("ArchiveSolarDayJob", "Month")) { await task_Detail.InsertWorkTime("ArchiveSolarDayJob", "Month", "太陽能月任務開始"); EDFunction ed = new EDFunction(); XmlDocument xmlDocument = new XmlDocument(); var solarService = new SolarService(); var deviceSyncData = new List(); var devicePointSyncData = new List(); var sites = new List(); string bql = string.Empty; string sql = string.Empty; #region 取得obix 設定 var obixApiConfig = new ObixApiConfig(); var sqlObix = $@"SELECT system_value as Value, system_key as Name FROM variable WHERE deleted = 0 AND system_type = 'obixConfig'"; var variableObix = await backgroundServiceRepository.GetAllAsync(sqlObix); obixApiConfig.ApiBase = variableObix.Where(x => x.Name == "ApiBase").Select(x => x.Value).FirstOrDefault(); obixApiConfig.UserName = ed.AESDecrypt(variableObix.Where(x => x.Name == "UserName").Select(x => x.Value).FirstOrDefault()); obixApiConfig.Password = ed.AESDecrypt(variableObix.Where(x => x.Name == "Password").Select(x => x.Value).FirstOrDefault()); String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(obixApiConfig.UserName + ":" + obixApiConfig.Password)); #endregion 取得obix 設定 #region sync solar data await solarService.SyncSiteInfo(logger, sites, obixApiConfig); bql = "neql:solar:archive|bql:select slotPath, name,displayName"; await solarService.SyncDevice(logger, deviceSyncData, obixApiConfig, bql, sites); await solarService.ImportDevice(logger, backgroundServiceRepository, deviceSyncData); bql = "neql:solar:archive and n:history|bql:select displayName, slotPath"; await solarService.SyncDevicePoint(logger, backgroundServiceRepository, devicePointSyncData, obixApiConfig, bql); await solarService.ImportDevicePoint(logger, backgroundServiceRepository, devicePointSyncData); #endregion #region 找出所有solar設備 sql = "select * from device where is_link = '1'"; var deviceData = await backgroundServiceRepository.GetAllAsync(sql); #endregion 找出所有solar設備 #region 找出所有solar系統的點位 sql = "select * from device_point where is_link = '1'"; var devicePointData = await backgroundServiceRepository.GetAllAsync(sql); #endregion 找出所有solar系統的點位 if (deviceData.Any() && devicePointData.Any()) { var now = DateTime.Now; var preHour = now.AddMonths(-1); //取得前一月 var startTimestamp = $"{preHour.ToString("yyyy-MM-dd")}T00:00:00.000+08:00"; var endTimestamp = $"{now.ToString("yyyy-MM-dd")}T00:00:00.000+08:00"; string intervalValue = "PT1H"; var data_value = new List(); await solarService.SyncDataValue(logger, data_value, obixApiConfig); await solarService.SyncData(logger, backgroundServiceRepository, obixApiConfig, deviceData, devicePointData, startTimestamp, endTimestamp, intervalValue, data_value, false); } await task_Detail.InsertWorkTime_End("ArchiveSolarDayJob", "Month", "太陽能月任務完成"); } } catch (Exception exception) { await task_Detail.WorkFail("ArchiveSolarDayJob", "Day", exception.ToString()); logger.LogError("【ArchiveSolarDayJob】【任務失敗】"); logger.LogError("【ArchiveSolarDayJob】【任務失敗】[Exception]:{0}", exception.ToString()); } } } }