diff --git a/Backend/Models/Archive.cs b/Backend/Models/Archive.cs index f1ce3a0..ef03f13 100644 --- a/Backend/Models/Archive.cs +++ b/Backend/Models/Archive.cs @@ -19,4 +19,8 @@ namespace Backend.Models public byte Is_complete { get; set; } public double Repeat_times { get; set; } } + public class archiveTable + { + public string archive_yyyymm { get; set; } + } } diff --git a/BackendWorkerService/Quartz/JobSchedule.cs b/BackendWorkerService/Quartz/JobSchedule.cs index ae2344d..25ca584 100644 --- a/BackendWorkerService/Quartz/JobSchedule.cs +++ b/BackendWorkerService/Quartz/JobSchedule.cs @@ -69,7 +69,7 @@ namespace BackendWorkerService.Quartz string Times = null; try { - var sql = $@"select b.system_value from task_detail a + var sql = $@" select b.system_value from task_detail a join variable b on a.variable_id = b.id where a.task = '{task}' and a.task_item = '{task_item}'"; Times = await backendRepository.GetOneAsync(sql); @@ -95,12 +95,16 @@ namespace BackendWorkerService.Quartz where a.task = '{task}' and a.task_item = '{task_item}'"; var lastworkTime = await backendRepository.GetOneAsync(sql); - - + if (task_item == "Compensate") + { + string ss = ""; + } DateTime dateTime = lastworkTime != null ? Convert.ToDateTime(lastworkTime) : Convert.ToDateTime("1970-01-01 00:00:01"); - var nextTime = CrontabSchedule.Parse(await GetWorkRule(task, task_item), new ParseOptions { IncludingSeconds = true } ).GetNextOccurrence(dateTime); + //取得 variable 中的 crob 時間設定 ex: 0 0/1 * * * * + var crobTime = await GetWorkRule(task, task_item); + var nextTime = CrontabSchedule.Parse(crobTime, new ParseOptions { IncludingSeconds = true } ).GetNextOccurrence(dateTime); if (DateTime.Now >= nextTime) { return true; diff --git a/BackendWorkerService/Quartz/Jobs/ArchiveElectricMeterDayJob.cs b/BackendWorkerService/Quartz/Jobs/ArchiveElectricMeterDayJob.cs index 75762a5..a13e4dc 100644 --- a/BackendWorkerService/Quartz/Jobs/ArchiveElectricMeterDayJob.cs +++ b/BackendWorkerService/Quartz/Jobs/ArchiveElectricMeterDayJob.cs @@ -1,11 +1,13 @@ using Backend.Models; using BackendWorkerService.Services.Implement; using Dapper; +using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using NPOI.SS.Formula.Functions; using Quartz; using Repository.BackendRepository.Implement; using Repository.BackendRepository.Interface; @@ -30,27 +32,30 @@ namespace BackendWorkerService.Quartz.Jobs private readonly IBackgroundServiceMsSqlRepository backgroundServiceMsSqlRepository; protected readonly IDatabaseHelper _databaseHelper; private readonly ILogger loggers; - + private readonly ILogger logger2; public ArchiveElectricMeterDayJob( ILogger logger, IBackgroundServiceRepository backgroundServiceRepository, IBackgroundServiceMsSqlRepository backgroundServiceMySqlRepository, - IDatabaseHelper databaseHelper, ILogger loggers, IBackendRepository backendRepository) + IDatabaseHelper databaseHelper, ILogger loggers, IBackendRepository backendRepository, ILogger logger2) { this.logger = logger; this.backgroundServiceRepository = backgroundServiceRepository; this.backgroundServiceMsSqlRepository = backgroundServiceMySqlRepository; this._databaseHelper = databaseHelper; this.loggers = loggers; + this.logger2 = logger2; } public async Task Execute(IJobExecutionContext context) { Task_Detail task_Detail = new Task_Detail(loggers, backgroundServiceRepository); + ProcEletricMeterService procEletricMeterService = new ProcEletricMeterService(logger2, backgroundServiceRepository, backgroundServiceMsSqlRepository); string device_number = string.Empty; try { + //依據 variable 中的設定,現在是否需要執行 if(await task_Detail.GetNeedWorkTask("ArchiveElectricMeterDayJob", "All")) { await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "All", "任務開始"); @@ -61,8 +66,10 @@ namespace BackendWorkerService.Quartz.Jobs var sqlArchive = $@"SELECT system_value as Value, system_key as Name FROM variable WHERE deleted = 0 AND system_type = 'archiveConfig'"; var saveToMSDB = await backgroundServiceRepository.GetOneAsync("select system_value from variable where system_type = 'save_to_ms_db' and deleted = 0"); var variableArchive = await backgroundServiceRepository.GetAllAsync(sqlArchive); + //取得 電表(E4) 水錶(W1)的小類代號 var electricMeterGuid = variableArchive.Where(x => x.Name == "ElectricMeterGuid").Select(x => x.Value).FirstOrDefault(); var waterMeterGuid = variableArchive.Where(x => x.Name == "WaterMeterGuid").Select(x => x.Value).FirstOrDefault(); + // 獲取每棟的 station 與 代號 ex:[M_G6001, G6] , [M_8F5001, $38F5], [M_G5001,G5] var buildingStation = await backgroundServiceRepository.GetAllAsync("select SUBSTRING_INDEX(system_value, '/', 1) system_value, system_key from variable where system_type = 'dashboard_total_elec' and deleted = 0 and (SUBSTRING_INDEX(system_value, '/', 1) != '' and SUBSTRING_INDEX(system_value, '/', 1) is not null)"); #region http variable @@ -73,13 +80,14 @@ namespace BackendWorkerService.Quartz.Jobs JObject archiveJsonResult = new JObject(); #endregion #region 找出所有電錶設備 - var sWhere = "deleted = 0 AND device_name_tag = @sub_system_guid"; - var electricMeters = await backgroundServiceRepository.GetAllAsync("device", sWhere, new { sub_system_guid = electricMeterGuid }); - var waterMeters = await backgroundServiceRepository.GetAllAsync("device", sWhere, new { sub_system_guid = waterMeterGuid }); + var sWhere_E4 = @$"device_name_tag = '{electricMeterGuid}' and deleted = 0 "; + var sWhere_W1 = @$"device_name_tag = '{waterMeterGuid}' and deleted = 0 "; + var electricMeters = await backgroundServiceRepository.GetAllAsync("device", sWhere_E4); + var waterMeters = await backgroundServiceRepository.GetAllAsync("device", sWhere_W1); #endregion 找出所有電錶設備 #region 找出所有電錶系統的點位 - var sPointWhere = "deleted = 0 AND device_name_tag = @sub_system_guid"; + var sPointWhere = "is_needArchive = 1 and deleted = 0 AND device_name_tag = @sub_system_guid"; var electricPoints = await backgroundServiceRepository.GetAllAsync("device_item", sPointWhere, new { sub_system_guid = electricMeterGuid }); var waterPoints = await backgroundServiceRepository.GetAllAsync("device_item", sPointWhere, new { sub_system_guid = waterMeterGuid }); #endregion 找出所有電錶系統的點位 @@ -133,187 +141,129 @@ namespace BackendWorkerService.Quartz.Jobs String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(obixApiConfig.UserName + ":" + obixApiConfig.Password)); #endregion 取得obix 設定 - var now = DateTime.Now; + var actionDay = DateTime.Now; // -- 改為 指定日期 -- + var startDay = actionDay.AddDays(-1); //開始日期 + var endDay = actionDay; //結束日期 #region 天歸檔 - if (await task_Detail.GetNeedWorkTask("ArchiveElectricMeterDayJob", "Day")) + if (!await task_Detail.GetNeedWorkTask("ArchiveElectricMeterDayJob", "Day")) + { + } + else { try { - await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "Day", "水電表天任務開始"); - var preDay = now.AddDays(-1); //取得前一天 - var dbDateName = preDay.Year.ToString().PadLeft(4, '0') + preDay.Month.ToString().PadLeft(2, '0'); + //記錄本次作業時間 於 task_detal.lastwork_time + await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "Day", "水電表 day 任務開始"); - var startTimestamp = string.Format("{0}T00:00:00.000+08:00", preDay.ToString("yyyy-MM-dd")); - var endTimestamp = string.Format("{0}T23:59:59.000+08:00", preDay.ToString("yyyy-MM-dd")); + var dbDateName = startDay.Year.ToString().PadLeft(4, '0') + startDay.Month.ToString().PadLeft(2, '0'); + + //Create 歸檔用 table + initWork(dbDateName); + + // --------- 需要變成指定日期 ---------------- + var startTimestamp = string.Format("{0}T00:00:00.000+08:00", startDay.ToString("yyyy-MM-dd")); + //var endTimestamp = string.Format("{0}T23:59:59.000+08:00", endDay.ToString("yyyy-MM-dd")); + var endTimestamp = string.Format("{0}T00:00:10.000+08:00", endDay.ToString("yyyy-MM-dd")); var historyQueryFilter = $@" - + "; + // PT2D 需要設定超過1天 - //Stopwatch stopWatch = new Stopwatch(); - //stopWatch.Start(); + Stopwatch stopWatch = new Stopwatch(); + stopWatch.Start(); //抓取每個設備的資料 List> electericArchiveDayRawDatas = new List>(); List> waterArchiveDayRawDatas = new List>(); - foreach (var deviceNumberPoint in electricDeviceNumberPoints) - { - device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); - var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and - device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' - and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' - and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' - and device_point_name = '{device_number.Split("_")[8]}'").Result; - if (string.IsNullOrEmpty(station)) - { - continue; - } - archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); - //HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); - archiveRequest.Method = "POST"; - archiveRequest.Headers.Add("Authorization", "Basic " + encoded); - archiveRequest.PreAuthenticate = true; - byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); - using (Stream reqStream = archiveRequest.GetRequestStream()) - { - reqStream.Write(byteArray, 0, byteArray.Length); - } + #region old request niagara history by obix + //foreach (var deviceNumberPoint in electricDeviceNumberPoints) + //{ + // device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); + // var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and + // device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' + // and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' + // and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' + // and device_point_name = '{device_number.Split("_")[8]}'").Result; + // if (string.IsNullOrEmpty(station)) + // { + // continue; + // } + // archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); + // //HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); + // archiveRequest.Method = "POST"; + // archiveRequest.Headers.Add("Authorization", "Basic " + encoded); + // archiveRequest.PreAuthenticate = true; - archiveResponse = (HttpWebResponse)archiveRequest.GetResponse(); - archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd(); - archiveResponse.Dispose(); - archiveResponse.Close(); + // byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); + // using (Stream reqStream = archiveRequest.GetRequestStream()) + // { + // reqStream.Write(byteArray, 0, byteArray.Length); + // } - xmlDocument.LoadXml(archiveResponseContent); - archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); - archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); + // archiveResponse = (HttpWebResponse)archiveRequest.GetResponse(); + // archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd(); + // archiveResponse.Dispose(); + // archiveResponse.Close(); - if (archiveJsonResult.ContainsKey("err")) //抓取錯誤 - { - //logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【取得資料失敗】"); - //logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【取得資料失敗】[錯誤內容]:{0}", archiveDayJsonResult); + // xmlDocument.LoadXml(archiveResponseContent); + // archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); + // archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); - Dictionary archiveDayRawData = new Dictionary(); - archiveDayRawData.Add("@device_number", deviceNumberPoint.DeviceNumber); - archiveDayRawData.Add("@point", deviceNumberPoint.Point); - archiveDayRawData.Add("@start_timestamp", startTimestamp.Replace("T", " ").Substring(0, 19)); - archiveDayRawData.Add("@end_timestamp", endTimestamp.Replace("T", " ").Substring(0, 19)); - archiveDayRawData.Add("@is_complete", 0); - archiveDayRawData.Add("@repeat_times", 0); - archiveDayRawData.Add("@fail_reason", archiveJson); + // if (archiveJsonResult.ContainsKey("err")) //抓取錯誤 + // { + // //logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【取得資料失敗】"); + // //logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【取得資料失敗】[錯誤內容]:{0}", archiveDayJsonResult); - archiveDayRawData.Add("@count_rawdata", 0); - archiveDayRawData.Add("@min_rawdata", 0); - archiveDayRawData.Add("@max_rawdata", 0); - archiveDayRawData.Add("@avg_rawdata", 0); - archiveDayRawData.Add("@sum_rawdata", 0); - archiveDayRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + // Dictionary archiveDayRawData = new Dictionary(); + // archiveDayRawData.Add("@device_number", deviceNumberPoint.DeviceNumber); + // archiveDayRawData.Add("@point", deviceNumberPoint.Point); + // archiveDayRawData.Add("@start_timestamp", startTimestamp.Replace("T", " ").Substring(0, 19)); + // archiveDayRawData.Add("@end_timestamp", endTimestamp.Replace("T", " ").Substring(0, 19)); + // archiveDayRawData.Add("@is_complete", 0); + // archiveDayRawData.Add("@repeat_times", 0); + // archiveDayRawData.Add("@fail_reason", archiveJson); - electericArchiveDayRawDatas.Add(archiveDayRawData); - } + // archiveDayRawData.Add("@count_rawdata", 0); + // archiveDayRawData.Add("@min_rawdata", 0); + // archiveDayRawData.Add("@max_rawdata", 0); + // archiveDayRawData.Add("@avg_rawdata", 0); + // archiveDayRawData.Add("@sum_rawdata", 0); + // archiveDayRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); - if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容 - { - var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult); - if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) - { - electericArchiveDayRawDatas.AddRange(ArrangeRawDatas); - } - } - } - foreach (var deviceNumberPoint in waterDeviceNumberPoints) - { - device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); - var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and - device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' - and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' - and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' - and device_point_name = '{device_number.Split("_")[8]}'").Result; - archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); - //HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); - archiveRequest.Method = "POST"; - archiveRequest.Headers.Add("Authorization", "Basic " + encoded); - archiveRequest.PreAuthenticate = true; + // electericArchiveDayRawDatas.Add(archiveDayRawData); + // } + // if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容 + // { + // var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult); + // if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) + // { + // electericArchiveDayRawDatas.AddRange(ArrangeRawDatas); + // } + // } + //} + #endregion old request niagara history by obix - byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); - using (Stream reqStream = archiveRequest.GetRequestStream()) - { - reqStream.Write(byteArray, 0, byteArray.Length); - } + //request niagara get data + // obixData_collect(ref device_number, xmlDocument, List DeviceNumberPoints, ObixApiConfig obixApiConfig, string encoded, string startTimestamp, string endTimestamp, string historyQueryFilter, List> waterArchiveDayRawDatas) - archiveResponse = (HttpWebResponse)archiveRequest.GetResponse(); - archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd(); - archiveResponse.Dispose(); - archiveResponse.Close(); + //電錶結果收集 + procEletricMeterService.obixData_collect( xmlDocument, electricDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, electericArchiveDayRawDatas); - xmlDocument.LoadXml(archiveResponseContent); - archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); - archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); - - if (archiveJsonResult.ContainsKey("err")) //抓取錯誤 - { - //logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【取得資料失敗】"); - //logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【取得資料失敗】[錯誤內容]:{0}", archiveDayJsonResult); - - Dictionary archiveDayRawData = new Dictionary(); - archiveDayRawData.Add("@device_number", deviceNumberPoint.DeviceNumber); - archiveDayRawData.Add("@point", deviceNumberPoint.Point); - archiveDayRawData.Add("@start_timestamp", startTimestamp.Replace("T", " ").Substring(0, 19)); - archiveDayRawData.Add("@end_timestamp", endTimestamp.Replace("T", " ").Substring(0, 19)); - archiveDayRawData.Add("@is_complete", 0); - archiveDayRawData.Add("@repeat_times", 0); - archiveDayRawData.Add("@fail_reason", archiveJson); - - archiveDayRawData.Add("@count_rawdata", 0); - archiveDayRawData.Add("@min_rawdata", 0); - archiveDayRawData.Add("@max_rawdata", 0); - archiveDayRawData.Add("@avg_rawdata", 0); - archiveDayRawData.Add("@sum_rawdata", 0); - archiveDayRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); - - waterArchiveDayRawDatas.Add(archiveDayRawData); - } - - if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容 - { - var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult); - if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) - { - waterArchiveDayRawDatas.AddRange(ArrangeRawDatas); - } - } - } - - //stopWatch.Stop(); - //logger.LogInformation("【ArchiveElectricMeterDayJob】【天歸檔】【效能檢驗】[取得資料花費時間]{0} 毫秒", stopWatch.ElapsedMilliseconds); + //水錶結果收集 + procEletricMeterService.obixData_collect( xmlDocument, waterDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, waterArchiveDayRawDatas); + + stopWatch.Stop(); + logger.LogInformation("【ArchiveElectricMeterDayJob】【天歸檔】【效能檢驗】[取得資料花費時間]{0} 毫秒", stopWatch.ElapsedMilliseconds); if (electericArchiveDayRawDatas.Count() > 0) { - var sql = $@"CREATE TABLE IF NOT EXISTS `archive_electric_meter_day_{dbDateName}` ( - `device_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `point` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `start_timestamp` datetime(6) NOT NULL, - `end_timestamp` datetime(6) NULL DEFAULT NULL, - `count_rawdata` int(11) NULL DEFAULT NULL, - `min_rawdata` decimal(15, 3) NULL DEFAULT NULL, - `max_rawdata` decimal(15, 3) NULL DEFAULT NULL, - `kwh_result` decimal(15, 3) NULL DEFAULT -1.0, - `avg_rawdata` decimal(15, 3) NULL DEFAULT NULL, - `sum_rawdata` decimal(15, 3) NULL DEFAULT NULL, - `is_complete` tinyint(3) UNSIGNED NULL DEFAULT NULL COMMENT '是否完成,0:未完成 1:完成', - `repeat_times` int(11) NULL DEFAULT 0 COMMENT '重複次數', - `fail_reason` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '失敗原因', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime(6) NULL DEFAULT NULL, - PRIMARY KEY (`device_number`, `point`, `start_timestamp`) USING BTREE - ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC; - - SET FOREIGN_KEY_CHECKS = 1; + var sql = $@" SET FOREIGN_KEY_CHECKS = 1; UPDATE archive_electric_meter_day_{dbDateName} SET count_rawdata = @count_rawdata, min_rawdata = @min_rawdata, @@ -452,32 +402,51 @@ namespace BackendWorkerService.Quartz.Jobs { await backgroundServiceMsSqlRepository.ExecuteSql(mySql, electericArchiveDayRawDatas); } + await task_Detail.InsertWorkTime_End("ArchiveElectricMeterDayJob", "Day", "任務完成"); + + //#region 月總計 + //if (await task_Detail.GetNeedWorkTask("ArchiveElectricMeterDayJob", "Month")) + //{ + // string targetTable = @$"archive_electric_meter_day_{dbDateName}"; + // string yyyymm = targetTable.Split('_')[targetTable.Split('_').Length - 1]; //取出 archive_electric_meter_day_202308 的最後一段 202308 + // string yyyy = yyyymm.Substring(0, 4); + // string mm = yyyymm.Remove(0, 4); + // //每次都 update 整個月 + // sql = $@"update archive_electric_meter_month a + // join ( + // select device_number, `point` + // , CONCAT('{yyyy}-{mm}', '-01') start_timestamp + // , LAST_DAY('{yyyy}/{mm}/01') end_timestamp + // , sum(count_rawdata) count_rawdata + // , sum(kwh_result) kwh_result + // , max(max_rawdata) max_rawdata + // , MIN(min_rawdata) min_rawdata + // from {targetTable} where point = 'KWH' + // group by device_number, `point` + // ) b on a.device_number = b.device_number and a.`point` = b.`point` and date(a.start_timestamp) = date(b.start_timestamp) + // set a.count_rawdata = b.count_rawdata, a.kwh_result = b.kwh_result, a.max_rawdata = b.max_rawdata, a.min_rawdata = b.min_rawdata, is_complete = 1"; + // try + // { + // await backgroundServiceMsSqlRepository.ExecuteSql(sql); + // await task_Detail.InsertWorkTime_End("ArchiveElectricMeterDayJob", "Month", "任務完成"); + // } + // catch (Exception exception) + // { + // await task_Detail.WorkFail("ArchiveElectricMeterDayJob", "Month", exception.ToString()); + // logger.LogError("【ArchiveElectricMeterDayJob】【月歸檔】【任務失敗】"); + // logger.LogError("【ArchiveElectricMeterDayJob】【月歸檔】【任務失敗】[Exception]:{0}", exception.ToString()); + // throw; + // } + //} + //#endregion } if (waterArchiveDayRawDatas.Count() > 0) { - var sql = $@" - CREATE TABLE IF NOT EXISTS `archive_water_meter_day_{dbDateName}` ( - `device_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `point` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `start_timestamp` datetime(6) NOT NULL, - `end_timestamp` datetime(6) NULL DEFAULT NULL, - `count_rawdata` int(11) NULL DEFAULT NULL, - `min_rawdata` decimal(15, 3) NULL DEFAULT NULL, - `max_rawdata` decimal(15, 3) NULL DEFAULT NULL, - `avg_rawdata` decimal(15, 3) NULL DEFAULT NULL, - `sum_rawdata` decimal(15, 3) NULL DEFAULT NULL, - `is_complete` tinyint(3) UNSIGNED NULL DEFAULT NULL COMMENT '是否完成,0:未完成 1:完成', - `repeat_times` int(11) NULL DEFAULT 0 COMMENT '重複次數', - `fail_reason` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '失敗原因', - `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - `updated_at` datetime(6) NULL DEFAULT NULL, - PRIMARY KEY (`device_number`, `point`, `start_timestamp`) USING BTREE - ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC; - - UPDATE archive_water_meter_day_{dbDateName} SET + var sql = $@" UPDATE archive_water_meter_day_{dbDateName} SET count_rawdata = @count_rawdata, - min_rawdata = @min_rawdata, - max_rawdata = @max_rawdata, + min_rawdata = round(@min_rawdata, 2), + max_rawdata = round(@max_rawdata, 2), + kwh_result = round(@max_rawdata, 2) - round(@min_rawdata, 2), avg_rawdata = @avg_rawdata, sum_rawdata = @sum_rawdata, is_complete = @is_complete, @@ -497,6 +466,7 @@ namespace BackendWorkerService.Quartz.Jobs count_rawdata, min_rawdata, max_rawdata, + kwh_result, avg_rawdata, sum_rawdata, is_complete, @@ -508,8 +478,9 @@ namespace BackendWorkerService.Quartz.Jobs @start_timestamp, @end_timestamp, @count_rawdata, - @min_rawdata, - @max_rawdata, + round(@min_rawdata, 2), + round(@max_rawdata, 2), + round(@max_rawdata, 2) - round(@min_rawdata, 2), @avg_rawdata, @sum_rawdata, @is_complete, @@ -528,6 +499,7 @@ namespace BackendWorkerService.Quartz.Jobs [count_rawdata] [int] NULL, [min_rawdata] [decimal](15, 3) NULL, [max_rawdata] [decimal](15, 3) NULL, + [kwh_result] [decimal](15, 3) NULL, [avg_rawdata] [decimal](15, 3) NULL, [sum_rawdata] [decimal](15, 3) NULL, [is_complete] [tinyint] NULL, @@ -558,8 +530,9 @@ namespace BackendWorkerService.Quartz.Jobs UPDATE archive_water_meter_day_{dbDateName} SET count_rawdata = @count_rawdata, - min_rawdata = @min_rawdata, - max_rawdata = @max_rawdata, + min_rawdata = round(@min_rawdata, 2), + max_rawdata = round(@max_rawdata, 2), + kwh_result = round(@max_rawdata, 2) - round(@min_rawdata, 2), avg_rawdata = @avg_rawdata, sum_rawdata = @sum_rawdata, is_complete = @is_complete, @@ -580,6 +553,7 @@ namespace BackendWorkerService.Quartz.Jobs count_rawdata, min_rawdata, max_rawdata, + kwh_result, avg_rawdata, sum_rawdata, is_complete, @@ -591,8 +565,9 @@ namespace BackendWorkerService.Quartz.Jobs @start_timestamp, @end_timestamp, @count_rawdata, - @min_rawdata, - @max_rawdata, + round(@min_rawdata, 2), + round(@max_rawdata, 2), + round(@max_rawdata, 2) - round(@min_rawdata, 2), @avg_rawdata, @sum_rawdata, @is_complete, @@ -606,8 +581,7 @@ namespace BackendWorkerService.Quartz.Jobs { await backgroundServiceMsSqlRepository.ExecuteSql(mySql, waterArchiveDayRawDatas); } - } - await task_Detail.InsertWorkTime_End("ArchiveElectricMeterDayJob", "Day", "任務完成"); + } } catch (Exception exception) { @@ -624,6 +598,7 @@ namespace BackendWorkerService.Quartz.Jobs } } } + #endregion 天歸檔 #region 週歸檔 @@ -632,16 +607,17 @@ namespace BackendWorkerService.Quartz.Jobs try { await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "Week", "水電表周任務開始"); - int week = Convert.ToInt32(now.DayOfWeek); + int week = Convert.ToInt32(actionDay.DayOfWeek); week = week == 0 ? 7 : week; - var startTimestamp = string.Format("{0}T00:00:00.000+08:00", now.AddDays(1 - week).ToString("yyyy-MM-dd")); - var endTimestamp = string.Format("{0}T23:59:59.000+08:00", now.AddDays(7 - week).ToString("yyyy-MM-dd")); + var startTimestamp = string.Format("{0}T00:00:00.000+08:00", actionDay.AddDays(1 - week).ToString("yyyy-MM-dd")); + //var endTimestamp = string.Format("{0}T23:59:59.000+08:00", actionDay.AddDays(7 - week).ToString("yyyy-MM-dd")); + var endTimestamp = string.Format("{0}T00:00:01.000+08:00", actionDay.AddDays(7 - week).ToString("yyyy-MM-dd")); var historyQueryFilter = $@" - + "; //Stopwatch stopWatch = new Stopwatch(); @@ -650,135 +626,143 @@ namespace BackendWorkerService.Quartz.Jobs //抓取每個設備的資料 List> electricArchiveWeekRawDatas = new List>(); List> waterArchiveWeekRawDatas = new List>(); - foreach (var deviceNumberPoint in electricDeviceNumberPoints) - { - device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); - var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and - device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' - and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' - and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' - and device_point_name = '{device_number.Split("_")[8]}'").Result; - if (string.IsNullOrEmpty(station)) - { - continue; - } - archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); - //HttpWebRequest archiveWeekRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); - archiveRequest.Method = "POST"; - archiveRequest.Headers.Add("Authorization", "Basic " + encoded); - archiveRequest.PreAuthenticate = true; + //電錶結果收集 + procEletricMeterService.obixData_collect(xmlDocument, electricDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, electricArchiveWeekRawDatas); + + //水錶結果收集 + procEletricMeterService.obixData_collect(xmlDocument, waterDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, waterArchiveWeekRawDatas); + #region old request niagara obix data + + //foreach (var deviceNumberPoint in electricDeviceNumberPoints) + //{ + // device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); + // var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and + // device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' + // and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' + // and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' + // and device_point_name = '{device_number.Split("_")[8]}'").Result; + // if (string.IsNullOrEmpty(station)) + // { + // continue; + // } + // archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); + // //HttpWebRequest archiveWeekRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); + // archiveRequest.Method = "POST"; + // archiveRequest.Headers.Add("Authorization", "Basic " + encoded); + // archiveRequest.PreAuthenticate = true; - byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); - using (Stream reqStream = archiveRequest.GetRequestStream()) - { - reqStream.Write(byteArray, 0, byteArray.Length); - } + // byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); + // using (Stream reqStream = archiveRequest.GetRequestStream()) + // { + // reqStream.Write(byteArray, 0, byteArray.Length); + // } - archiveResponse = (HttpWebResponse)archiveRequest.GetResponse(); - archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd(); - archiveResponse.Dispose(); - archiveResponse.Close(); + // archiveResponse = (HttpWebResponse)archiveRequest.GetResponse(); + // archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd(); + // archiveResponse.Dispose(); + // archiveResponse.Close(); - xmlDocument.LoadXml(archiveResponseContent); - archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); - archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); + // xmlDocument.LoadXml(archiveResponseContent); + // archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); + // archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); - if (archiveJsonResult.ContainsKey("err")) //抓取錯誤 - { - //logger.LogError("【ArchiveElectricMeterDayJob】【週歸檔】【取得資料失敗】"); - //logger.LogError("【ArchiveElectricMeterDayJob】【週歸檔】【取得資料失敗】[錯誤內容]:{0}", archiveWeekJsonResult); + // if (archiveJsonResult.ContainsKey("err")) //抓取錯誤 + // { + // //logger.LogError("【ArchiveElectricMeterDayJob】【週歸檔】【取得資料失敗】"); + // //logger.LogError("【ArchiveElectricMeterDayJob】【週歸檔】【取得資料失敗】[錯誤內容]:{0}", archiveWeekJsonResult); - Dictionary archiveWeekRawData = new Dictionary(); - archiveWeekRawData.Add("@device_number", deviceNumberPoint.DeviceNumber); - archiveWeekRawData.Add("@point", deviceNumberPoint.Point); - archiveWeekRawData.Add("@start_timestamp", startTimestamp.Replace("T", " ").Substring(0, 19)); - archiveWeekRawData.Add("@end_timestamp", endTimestamp.Replace("T", " ").Substring(0, 19)); - archiveWeekRawData.Add("@is_complete", 0); - archiveWeekRawData.Add("@repeat_times", 0); - archiveWeekRawData.Add("@fail_reason", archiveJson); + // Dictionary archiveWeekRawData = new Dictionary(); + // archiveWeekRawData.Add("@device_number", deviceNumberPoint.DeviceNumber); + // archiveWeekRawData.Add("@point", deviceNumberPoint.Point); + // archiveWeekRawData.Add("@start_timestamp", startTimestamp.Replace("T", " ").Substring(0, 19)); + // archiveWeekRawData.Add("@end_timestamp", endTimestamp.Replace("T", " ").Substring(0, 19)); + // archiveWeekRawData.Add("@is_complete", 0); + // archiveWeekRawData.Add("@repeat_times", 0); + // archiveWeekRawData.Add("@fail_reason", archiveJson); - archiveWeekRawData.Add("@count_rawdata", 0); - archiveWeekRawData.Add("@min_rawdata", 0); - archiveWeekRawData.Add("@max_rawdata", 0); - archiveWeekRawData.Add("@avg_rawdata", 0); - archiveWeekRawData.Add("@sum_rawdata", 0); - archiveWeekRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + // archiveWeekRawData.Add("@count_rawdata", 0); + // archiveWeekRawData.Add("@min_rawdata", 0); + // archiveWeekRawData.Add("@max_rawdata", 0); + // archiveWeekRawData.Add("@avg_rawdata", 0); + // archiveWeekRawData.Add("@sum_rawdata", 0); + // archiveWeekRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); - electricArchiveWeekRawDatas.Add(archiveWeekRawData); - } + // electricArchiveWeekRawDatas.Add(archiveWeekRawData); + // } - if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容 - { - var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult); - if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) - { - electricArchiveWeekRawDatas.AddRange(ArrangeRawDatas); - } - } - } - foreach (var deviceNumberPoint in waterDeviceNumberPoints) - { - device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); - var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and - device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' - and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' - and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' - and device_point_name = '{device_number.Split("_")[8]}'").Result; - archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); - //HttpWebRequest archiveWeekRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); - archiveRequest.Method = "POST"; - archiveRequest.Headers.Add("Authorization", "Basic " + encoded); - archiveRequest.PreAuthenticate = true; + // if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容 + // { + // var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult); + // if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) + // { + // electricArchiveWeekRawDatas.AddRange(ArrangeRawDatas); + // } + // } + //} + //foreach (var deviceNumberPoint in waterDeviceNumberPoints) + //{ + // device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); + // var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and + // device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' + // and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' + // and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' + // and device_point_name = '{device_number.Split("_")[8]}'").Result; + // archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); + // //HttpWebRequest archiveWeekRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); + // archiveRequest.Method = "POST"; + // archiveRequest.Headers.Add("Authorization", "Basic " + encoded); + // archiveRequest.PreAuthenticate = true; - byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); - using (Stream reqStream = archiveRequest.GetRequestStream()) - { - reqStream.Write(byteArray, 0, byteArray.Length); - } + // byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); + // using (Stream reqStream = archiveRequest.GetRequestStream()) + // { + // reqStream.Write(byteArray, 0, byteArray.Length); + // } - archiveResponse = (HttpWebResponse)archiveRequest.GetResponse(); - archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd(); - archiveResponse.Dispose(); - archiveResponse.Close(); + // archiveResponse = (HttpWebResponse)archiveRequest.GetResponse(); + // archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd(); + // archiveResponse.Dispose(); + // archiveResponse.Close(); - xmlDocument.LoadXml(archiveResponseContent); - archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); - archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); + // xmlDocument.LoadXml(archiveResponseContent); + // archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); + // archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); - if (archiveJsonResult.ContainsKey("err")) //抓取錯誤 - { - //logger.LogError("【ArchiveElectricMeterDayJob】【週歸檔】【取得資料失敗】"); - //logger.LogError("【ArchiveElectricMeterDayJob】【週歸檔】【取得資料失敗】[錯誤內容]:{0}", archiveWeekJsonResult); + // if (archiveJsonResult.ContainsKey("err")) //抓取錯誤 + // { + // //logger.LogError("【ArchiveElectricMeterDayJob】【週歸檔】【取得資料失敗】"); + // //logger.LogError("【ArchiveElectricMeterDayJob】【週歸檔】【取得資料失敗】[錯誤內容]:{0}", archiveWeekJsonResult); - Dictionary archiveWeekRawData = new Dictionary(); - archiveWeekRawData.Add("@device_number", deviceNumberPoint.DeviceNumber); - archiveWeekRawData.Add("@point", deviceNumberPoint.Point); - archiveWeekRawData.Add("@start_timestamp", startTimestamp.Replace("T", " ").Substring(0, 19)); - archiveWeekRawData.Add("@end_timestamp", endTimestamp.Replace("T", " ").Substring(0, 19)); - archiveWeekRawData.Add("@is_complete", 0); - archiveWeekRawData.Add("@repeat_times", 0); - archiveWeekRawData.Add("@fail_reason", archiveJson); + // Dictionary archiveWeekRawData = new Dictionary(); + // archiveWeekRawData.Add("@device_number", deviceNumberPoint.DeviceNumber); + // archiveWeekRawData.Add("@point", deviceNumberPoint.Point); + // archiveWeekRawData.Add("@start_timestamp", startTimestamp.Replace("T", " ").Substring(0, 19)); + // archiveWeekRawData.Add("@end_timestamp", endTimestamp.Replace("T", " ").Substring(0, 19)); + // archiveWeekRawData.Add("@is_complete", 0); + // archiveWeekRawData.Add("@repeat_times", 0); + // archiveWeekRawData.Add("@fail_reason", archiveJson); - archiveWeekRawData.Add("@count_rawdata", 0); - archiveWeekRawData.Add("@min_rawdata", 0); - archiveWeekRawData.Add("@max_rawdata", 0); - archiveWeekRawData.Add("@avg_rawdata", 0); - archiveWeekRawData.Add("@sum_rawdata", 0); - archiveWeekRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + // archiveWeekRawData.Add("@count_rawdata", 0); + // archiveWeekRawData.Add("@min_rawdata", 0); + // archiveWeekRawData.Add("@max_rawdata", 0); + // archiveWeekRawData.Add("@avg_rawdata", 0); + // archiveWeekRawData.Add("@sum_rawdata", 0); + // archiveWeekRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); - waterArchiveWeekRawDatas.Add(archiveWeekRawData); - } + // waterArchiveWeekRawDatas.Add(archiveWeekRawData); + // } - if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容 - { - var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult); - if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) - { - waterArchiveWeekRawDatas.AddRange(ArrangeRawDatas); - } - } - } + // if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容 + // { + // var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult); + // if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) + // { + // waterArchiveWeekRawDatas.AddRange(ArrangeRawDatas); + // } + // } + //} + #endregion //stopWatch.Stop(); //logger.LogInformation("【ArchiveElectricMeterDayJob】【週歸檔】【效能檢驗】[取得資料花費時間]{0} 毫秒", stopWatch.ElapsedMilliseconds); @@ -788,9 +772,9 @@ namespace BackendWorkerService.Quartz.Jobs var sql = $@" UPDATE archive_electric_meter_week SET count_rawdata = @count_rawdata, - min_rawdata = @min_rawdata, - max_rawdata = @max_rawdata, - kwh_result = @max_rawdata - @min_rawdata, + min_rawdata = round(@min_rawdata, 2) + max_rawdata = round(@max_rawdata, 2) + kwh_result = round(@max_rawdata, 2) - round(@min_rawdata, 2), avg_rawdata = @avg_rawdata, sum_rawdata = @sum_rawdata, is_complete = @is_complete, @@ -822,9 +806,9 @@ namespace BackendWorkerService.Quartz.Jobs @start_timestamp, @end_timestamp, @count_rawdata, - @min_rawdata, - @max_rawdata, - @max_rawdata - @min_rawdata, + round(@min_rawdata, 2), + round(@max_rawdata, 2), + round(@max_rawdata, 2) - round(@min_rawdata, 2), @avg_rawdata, @sum_rawdata, @is_complete, @@ -837,9 +821,9 @@ namespace BackendWorkerService.Quartz.Jobs UPDATE archive_electric_meter_week SET count_rawdata = @count_rawdata, - min_rawdata = @min_rawdata, - max_rawdata = @max_rawdata, - kwh_result = @max_rawdata - @min_rawdata, + min_rawdata = round(@min_rawdata, 2), + max_rawdata = round(@max_rawdata, 2), + kwh_result = round(@min_rawdata, 2) - round(@max_rawdata, 2), avg_rawdata = @avg_rawdata, sum_rawdata = @sum_rawdata, is_complete = @is_complete, @@ -872,9 +856,9 @@ namespace BackendWorkerService.Quartz.Jobs @start_timestamp, @end_timestamp, @count_rawdata, - @min_rawdata, - @max_rawdata, - @max_rawdata - @min_rawdata, + round(@min_rawdata, 2), + round(@max_rawdata, 2), + round(@max_rawdata, 2) - round(@min_rawdata, 2), @avg_rawdata, @sum_rawdata, @is_complete, @@ -892,12 +876,11 @@ namespace BackendWorkerService.Quartz.Jobs } if (waterArchiveWeekRawDatas.Count() > 0) { - var sql = $@" - - UPDATE archive_water_meter_week SET + var sql = $@" UPDATE archive_water_meter_week SET count_rawdata = @count_rawdata, - min_rawdata = @min_rawdata, - max_rawdata = @max_rawdata, + min_rawdata = round(@min_rawdata, 2), + max_rawdata = round(@max_rawdata, 2), + kwh_result = round(@min_rawdata, 2) - round(@max_rawdata, 2), avg_rawdata = @avg_rawdata, sum_rawdata = @sum_rawdata, is_complete = @is_complete, @@ -917,6 +900,7 @@ namespace BackendWorkerService.Quartz.Jobs count_rawdata, min_rawdata, max_rawdata, + kwh_result, avg_rawdata, sum_rawdata, is_complete, @@ -928,8 +912,9 @@ namespace BackendWorkerService.Quartz.Jobs @start_timestamp, @end_timestamp, @count_rawdata, - @min_rawdata, - @max_rawdata, + round(@min_rawdata, 2), + round(@max_rawdata, 2), + round(@max_rawdata, 2) - round(@min_rawdata, 2), @avg_rawdata, @sum_rawdata, @is_complete, @@ -942,8 +927,9 @@ namespace BackendWorkerService.Quartz.Jobs UPDATE archive_water_meter_week SET count_rawdata = @count_rawdata, - min_rawdata = @min_rawdata, - max_rawdata = @max_rawdata, + min_rawdata = round(@min_rawdata, 2), + max_rawdata = round(@max_rawdata, 2), + kwh_result = round(@max_rawdata, 2) - round(@min_rawdata, 2), avg_rawdata = @avg_rawdata, sum_rawdata = @sum_rawdata, is_complete = @is_complete, @@ -964,6 +950,7 @@ namespace BackendWorkerService.Quartz.Jobs count_rawdata, min_rawdata, max_rawdata, + kwh_result, avg_rawdata, sum_rawdata, is_complete, @@ -975,8 +962,9 @@ namespace BackendWorkerService.Quartz.Jobs @start_timestamp, @end_timestamp, @count_rawdata, - @min_rawdata, - @max_rawdata, + round(@min_rawdata,2) , + round(@max_rawdata,2) , + round(@max_rawdata, 2) - round(@min_rawdata, 2), @avg_rawdata, @sum_rawdata, @is_complete, @@ -1016,13 +1004,15 @@ namespace BackendWorkerService.Quartz.Jobs try { await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "Month", "水電表月任務開始"); - var FirstDay = now.AddDays(-now.Day + 1); - var LastDay = now.AddMonths(1).AddDays(-now.AddMonths(1).Day); + var FirstDay = actionDay.AddDays(-actionDay.Day + 1); + var LastDay = actionDay.AddMonths(1).AddDays(-actionDay.AddMonths(1).Day); - var dayInMonth = DateTime.DaysInMonth(now.Year, now.Month); + // 需要比原定日期增加 1天:因 Niagara 內部判斷為 < lastData, 並未包含結束當天 add by jiahao @2023-09-16 + var dayInMonth = DateTime.DaysInMonth(actionDay.Year, actionDay.Month) + 1; var startTimestamp = string.Format("{0}T00:00:00.000+08:00", FirstDay.ToString("yyyy-MM-dd")); - var endTimestamp = string.Format("{0}T23:59:59.000+08:00", LastDay.ToString("yyyy-MM-dd")); + //var endTimestamp = string.Format("{0}T23:59:59.000+08:00", LastDay.ToString("yyyy-MM-dd")); + var endTimestamp = string.Format("{0}T00:00:10.000+08:00", LastDay.ToString("yyyy-MM-dd")); // by jiahao @2023-09-16 var historyQueryFilter = $@" @@ -1036,135 +1026,146 @@ namespace BackendWorkerService.Quartz.Jobs //抓取每個設備的資料 List> electricArchiveMonthRawDatas = new List>(); List> waterArchiveMonthRawDatas = new List>(); - foreach (var deviceNumberPoint in electricDeviceNumberPoints) - { - device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); - var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and - device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' - and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' - and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' - and device_point_name = '{device_number.Split("_")[8]}'").Result; - if (string.IsNullOrEmpty(station)) - { - continue; - } - archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); - //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); - archiveRequest.Method = "POST"; - archiveRequest.Headers.Add("Authorization", "Basic " + encoded); - archiveRequest.PreAuthenticate = true; - - byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); - using (Stream reqStream = archiveRequest.GetRequestStream()) - { - reqStream.Write(byteArray, 0, byteArray.Length); - } - - archiveResponse = (HttpWebResponse)archiveRequest.GetResponse(); - archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd(); - archiveResponse.Dispose(); - archiveResponse.Close(); - - xmlDocument.LoadXml(archiveResponseContent); - archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); - archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); - - if (archiveJsonResult.ContainsKey("err")) //抓取錯誤 - { - //logger.LogError("【ArchiveElectricMeterDayJob】【月歸檔】【取得資料失敗】"); - //logger.LogError("【ArchiveElectricMeterDayJob】【月歸檔】【取得資料失敗】[錯誤內容]:{0}", archiveMonthJsonResult); - - Dictionary archiveMonthRawData = new Dictionary(); - archiveMonthRawData.Add("@device_number", deviceNumberPoint.DeviceNumber); - archiveMonthRawData.Add("@point", deviceNumberPoint.Point); - archiveMonthRawData.Add("@start_timestamp", startTimestamp.Replace("T", " ").Substring(0, 19)); - archiveMonthRawData.Add("@end_timestamp", endTimestamp.Replace("T", " ").Substring(0, 19)); - archiveMonthRawData.Add("@is_complete", 0); - archiveMonthRawData.Add("@repeat_times", 0); - archiveMonthRawData.Add("@fail_reason", archiveJson); - - archiveMonthRawData.Add("@count_rawdata", 0); - archiveMonthRawData.Add("@min_rawdata", 0); - archiveMonthRawData.Add("@max_rawdata", 0); - archiveMonthRawData.Add("@avg_rawdata", 0); - archiveMonthRawData.Add("@sum_rawdata", 0); - archiveMonthRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); - - electricArchiveMonthRawDatas.Add(archiveMonthRawData); - } - - if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容 - { - var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult); - if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) - { - electricArchiveMonthRawDatas.AddRange(ArrangeRawDatas); - } - } - } - foreach (var deviceNumberPoint in waterDeviceNumberPoints) - { - device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); - var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and - device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' - and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' - and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' - and device_point_name = '{device_number.Split("_")[8]}'").Result; - archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); - //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); - archiveRequest.Method = "POST"; - archiveRequest.Headers.Add("Authorization", "Basic " + encoded); - archiveRequest.PreAuthenticate = true; - byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); - using (Stream reqStream = archiveRequest.GetRequestStream()) - { - reqStream.Write(byteArray, 0, byteArray.Length); - } + //收集 niagara 電錶 Data + procEletricMeterService.obixData_collect(xmlDocument, electricDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, electricArchiveMonthRawDatas); - archiveResponse = (HttpWebResponse)archiveRequest.GetResponse(); - archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd(); - archiveResponse.Dispose(); - archiveResponse.Close(); + //水錶結果收集 + procEletricMeterService.obixData_collect(xmlDocument, waterDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, waterArchiveMonthRawDatas); - xmlDocument.LoadXml(archiveResponseContent); - archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); - archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); - if (archiveJsonResult.ContainsKey("err")) //抓取錯誤 - { - //logger.LogError("【ArchiveElectricMeterDayJob】【月歸檔】【取得資料失敗】"); - //logger.LogError("【ArchiveElectricMeterDayJob】【月歸檔】【取得資料失敗】[錯誤內容]:{0}", archiveMonthJsonResult); + #region old request niagara by obix + //foreach (var deviceNumberPoint in electricDeviceNumberPoints) + //{ + // device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); + // var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and + // device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' + // and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' + // and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' + // and device_point_name = '{device_number.Split("_")[8]}'").Result; + // if (string.IsNullOrEmpty(station)) + // { + // continue; + // } + // archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); + // //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); + // archiveRequest.Method = "POST"; + // archiveRequest.Headers.Add("Authorization", "Basic " + encoded); + // archiveRequest.PreAuthenticate = true; - Dictionary archiveMonthRawData = new Dictionary(); - archiveMonthRawData.Add("@device_number", deviceNumberPoint.DeviceNumber); - archiveMonthRawData.Add("@point", deviceNumberPoint.Point); - archiveMonthRawData.Add("@start_timestamp", startTimestamp.Replace("T", " ").Substring(0, 19)); - archiveMonthRawData.Add("@end_timestamp", endTimestamp.Replace("T", " ").Substring(0, 19)); - archiveMonthRawData.Add("@is_complete", 0); - archiveMonthRawData.Add("@repeat_times", 0); - archiveMonthRawData.Add("@fail_reason", archiveJson); + // byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); + // using (Stream reqStream = archiveRequest.GetRequestStream()) + // { + // reqStream.Write(byteArray, 0, byteArray.Length); + // } - archiveMonthRawData.Add("@count_rawdata", 0); - archiveMonthRawData.Add("@min_rawdata", 0); - archiveMonthRawData.Add("@max_rawdata", 0); - archiveMonthRawData.Add("@avg_rawdata", 0); - archiveMonthRawData.Add("@sum_rawdata", 0); - archiveMonthRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + // archiveResponse = (HttpWebResponse)archiveRequest.GetResponse(); + // archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd(); + // archiveResponse.Dispose(); + // archiveResponse.Close(); - waterArchiveMonthRawDatas.Add(archiveMonthRawData); - } + // xmlDocument.LoadXml(archiveResponseContent); + // archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); + // archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); - if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容 - { - var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult); - if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) - { - waterArchiveMonthRawDatas.AddRange(ArrangeRawDatas); - } - } - } + // if (archiveJsonResult.ContainsKey("err")) //抓取錯誤 + // { + // //logger.LogError("【ArchiveElectricMeterDayJob】【月歸檔】【取得資料失敗】"); + // //logger.LogError("【ArchiveElectricMeterDayJob】【月歸檔】【取得資料失敗】[錯誤內容]:{0}", archiveMonthJsonResult); + + // Dictionary archiveMonthRawData = new Dictionary(); + // archiveMonthRawData.Add("@device_number", deviceNumberPoint.DeviceNumber); + // archiveMonthRawData.Add("@point", deviceNumberPoint.Point); + // archiveMonthRawData.Add("@start_timestamp", startTimestamp.Replace("T", " ").Substring(0, 19)); + // archiveMonthRawData.Add("@end_timestamp", endTimestamp.Replace("T", " ").Substring(0, 19)); + // archiveMonthRawData.Add("@is_complete", 0); + // archiveMonthRawData.Add("@repeat_times", 0); + // archiveMonthRawData.Add("@fail_reason", archiveJson); + + // archiveMonthRawData.Add("@count_rawdata", 0); + // archiveMonthRawData.Add("@min_rawdata", 0); + // archiveMonthRawData.Add("@max_rawdata", 0); + // archiveMonthRawData.Add("@avg_rawdata", 0); + // archiveMonthRawData.Add("@sum_rawdata", 0); + // archiveMonthRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + + // electricArchiveMonthRawDatas.Add(archiveMonthRawData); + // } + + // if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容 + // { + // var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult); + // if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) + // { + // electricArchiveMonthRawDatas.AddRange(ArrangeRawDatas); + // } + // } + //} + //foreach (var deviceNumberPoint in waterDeviceNumberPoints) + //{ + // device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); + // var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and + // device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' + // and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' + // and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' + // and device_point_name = '{device_number.Split("_")[8]}'").Result; + // archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); + // //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); + // archiveRequest.Method = "POST"; + // archiveRequest.Headers.Add("Authorization", "Basic " + encoded); + // archiveRequest.PreAuthenticate = true; + + + // byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); + // using (Stream reqStream = archiveRequest.GetRequestStream()) + // { + // reqStream.Write(byteArray, 0, byteArray.Length); + // } + + // archiveResponse = (HttpWebResponse)archiveRequest.GetResponse(); + // archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd(); + // archiveResponse.Dispose(); + // archiveResponse.Close(); + + // xmlDocument.LoadXml(archiveResponseContent); + // archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); + // archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); + + // if (archiveJsonResult.ContainsKey("err")) //抓取錯誤 + // { + // //logger.LogError("【ArchiveElectricMeterDayJob】【月歸檔】【取得資料失敗】"); + // //logger.LogError("【ArchiveElectricMeterDayJob】【月歸檔】【取得資料失敗】[錯誤內容]:{0}", archiveMonthJsonResult); + + // Dictionary archiveMonthRawData = new Dictionary(); + // archiveMonthRawData.Add("@device_number", deviceNumberPoint.DeviceNumber); + // archiveMonthRawData.Add("@point", deviceNumberPoint.Point); + // archiveMonthRawData.Add("@start_timestamp", startTimestamp.Replace("T", " ").Substring(0, 19)); + // archiveMonthRawData.Add("@end_timestamp", endTimestamp.Replace("T", " ").Substring(0, 19)); + // archiveMonthRawData.Add("@is_complete", 0); + // archiveMonthRawData.Add("@repeat_times", 0); + // archiveMonthRawData.Add("@fail_reason", archiveJson); + + // archiveMonthRawData.Add("@count_rawdata", 0); + // archiveMonthRawData.Add("@min_rawdata", 0); + // archiveMonthRawData.Add("@max_rawdata", 0); + // archiveMonthRawData.Add("@avg_rawdata", 0); + // archiveMonthRawData.Add("@sum_rawdata", 0); + // archiveMonthRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + + // waterArchiveMonthRawDatas.Add(archiveMonthRawData); + // } + + // if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容 + // { + // var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult); + // if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) + // { + // waterArchiveMonthRawDatas.AddRange(ArrangeRawDatas); + // } + // } + //} + #endregion //stopWatch.Stop(); //logger.LogInformation("【ArchiveElectricMeterDayJob】【月歸檔效能檢驗】[取得資料花費時間]{0} 毫秒", stopWatch.ElapsedMilliseconds); @@ -1174,9 +1175,9 @@ namespace BackendWorkerService.Quartz.Jobs var sql = $@" UPDATE archive_electric_meter_month SET count_rawdata = @count_rawdata, - min_rawdata = @min_rawdata, - max_rawdata = @max_rawdata, - kwh_result = @max_rawdata - @min_rawdata, + min_rawdata = round(@min_rawdata, 2), + max_rawdata = round(@max_rawdata, 2), + kwh_result = round(@max_rawdata, 2) - round(@min_rawdata, 2), avg_rawdata = @avg_rawdata, sum_rawdata = @sum_rawdata, is_complete = @is_complete, @@ -1207,9 +1208,9 @@ namespace BackendWorkerService.Quartz.Jobs @start_timestamp, @end_timestamp, @count_rawdata, - @min_rawdata, - @max_rawdata, - @max_rawdata - @min_rawdata, + round(@min_rawdata, 2), + round(@max_rawdata, 2), + round(@max_rawdata, 2) - round(@min_rawdata, 2), @avg_rawdata, @sum_rawdata, @is_complete, @@ -1221,9 +1222,9 @@ namespace BackendWorkerService.Quartz.Jobs UPDATE archive_electric_meter_month SET count_rawdata = @count_rawdata, - min_rawdata = @min_rawdata, - max_rawdata = @max_rawdata, - kwh_result = @max_rawdata - @min_rawdata, + min_rawdata = round(@min_rawdata, 2), + max_rawdata = round(@max_rawdata, 2), + kwh_result = round(@max_rawdata, 2) - round(@min_rawdata, 2), avg_rawdata = @avg_rawdata, sum_rawdata = @sum_rawdata, is_complete = @is_complete, @@ -1256,9 +1257,9 @@ namespace BackendWorkerService.Quartz.Jobs @start_timestamp, @end_timestamp, @count_rawdata, - @min_rawdata, - @max_rawdata, - @max_rawdata - @min_rawdata, + round(@min_rawdata, 2), + round(@max_rawdata, 2), + round(@max_rawdata, 2) - round(@min_rawdata, 2), @avg_rawdata, @sum_rawdata, @is_complete, @@ -1278,8 +1279,9 @@ namespace BackendWorkerService.Quartz.Jobs var sql = $@" UPDATE archive_water_meter_month SET count_rawdata = @count_rawdata, - min_rawdata = @min_rawdata, - max_rawdata = @max_rawdata, + min_rawdata = round(@min_rawdata, 2), + max_rawdata = round(@max_rawdata, 2), + kwh_result = round(@max_rawdata, 2) - round(@min_rawdata, 2), avg_rawdata = @avg_rawdata, sum_rawdata = @sum_rawdata, is_complete = @is_complete, @@ -1309,8 +1311,9 @@ namespace BackendWorkerService.Quartz.Jobs @start_timestamp, @end_timestamp, @count_rawdata, - @min_rawdata, - @max_rawdata, + round(@min_rawdata, 2), + round(@max_rawdata, 2), + round(@max_rawdata, 2) - round(@min_rawdata, 2), @avg_rawdata, @sum_rawdata, @is_complete, @@ -1322,8 +1325,9 @@ namespace BackendWorkerService.Quartz.Jobs UPDATE archive_water_meter_month SET count_rawdata = @count_rawdata, - min_rawdata = @min_rawdata, - max_rawdata = @max_rawdata, + min_rawdata = round(@min_rawdata, 2), + max_rawdata = round(@max_rawdata, 2), + kwh_result = round(@max_rawdata, 2) - round(@min_rawdata, 2), avg_rawdata = @avg_rawdata, sum_rawdata = @sum_rawdata, is_complete = @is_complete, @@ -1344,6 +1348,7 @@ namespace BackendWorkerService.Quartz.Jobs count_rawdata, min_rawdata, max_rawdata, + kwh_result, avg_rawdata, sum_rawdata, is_complete, @@ -1355,8 +1360,9 @@ namespace BackendWorkerService.Quartz.Jobs @start_timestamp, @end_timestamp, @count_rawdata, - @min_rawdata, - @max_rawdata, + round(@min_rawdata, 2), + round(@max_rawdata, 2), + round(@max_rawdata, 2) - round(@min_rawdata, 2), @avg_rawdata, @sum_rawdata, @is_complete, @@ -1392,12 +1398,13 @@ namespace BackendWorkerService.Quartz.Jobs #region 補償機制 //取得連線字串 + if (await task_Detail.GetNeedWorkTask("ArchiveElectricMeterDayJob", "Compensate")) { try { await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "Compensate", "補償機制任務開始"); - ProcEletricMeterService procEletricMeterService = new ProcEletricMeterService(backgroundServiceRepository, backgroundServiceMsSqlRepository); + await procEletricMeterService.ArchiveData(); await task_Detail.InsertWorkTime_End("ArchiveElectricMeterDayJob", "Compensate", "任務完成"); } @@ -1421,6 +1428,142 @@ namespace BackendWorkerService.Quartz.Jobs } } + + ///// + ///// 獲取 Niagara 資料,並儲存於 List 中 + ///// + ///// + ///// + ///// + ///// + ///// + ///// + ///// + ///// + ///// + //private void obixData_collect( XmlDocument xmlDocument, List DeviceNumberPoints, ObixApiConfig obixApiConfig, string encoded, string startTimestamp, string endTimestamp, string historyQueryFilter, List> resultArchiveDayRawDatas) + //{ + + // #region 水電錶 save to DB start + + // foreach (var deviceNumberPoint in DeviceNumberPoints) + // { + // string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); + // var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and + // device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' + // and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' + // and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' + // and device_point_name = '{device_number.Split("_")[8]}'").Result; + // HttpWebRequest archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); + // //HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); + // archiveRequest.Method = "POST"; + // archiveRequest.Headers.Add("Authorization", "Basic " + encoded); + // archiveRequest.PreAuthenticate = true; + + + // byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); + // using (Stream reqStream = archiveRequest.GetRequestStream()) + // { + // reqStream.Write(byteArray, 0, byteArray.Length); + // } + + // var archiveResponse = (HttpWebResponse)archiveRequest.GetResponse(); + // var archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd(); + // archiveResponse.Dispose(); + // archiveResponse.Close(); + + // xmlDocument.LoadXml(archiveResponseContent); + // var archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); + // var archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); + + // if (archiveJsonResult.ContainsKey("err")) //抓取錯誤 + // { + // //logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【取得資料失敗】"); + // //logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【取得資料失敗】[錯誤內容]:{0}", archiveDayJsonResult); + + // Dictionary archiveDayRawData = new Dictionary(); + // archiveDayRawData.Add("@device_number", deviceNumberPoint.DeviceNumber); + // archiveDayRawData.Add("@point", deviceNumberPoint.Point); + // archiveDayRawData.Add("@start_timestamp", startTimestamp.Replace("T", " ").Substring(0, 19)); + // archiveDayRawData.Add("@end_timestamp", endTimestamp.Replace("T", " ").Substring(0, 19)); + // archiveDayRawData.Add("@is_complete", 0); + // archiveDayRawData.Add("@repeat_times", 0); + // archiveDayRawData.Add("@fail_reason", archiveJson); + + // archiveDayRawData.Add("@count_rawdata", 0); + // archiveDayRawData.Add("@min_rawdata", 0); + // archiveDayRawData.Add("@max_rawdata", 0); + // archiveDayRawData.Add("@avg_rawdata", 0); + // archiveDayRawData.Add("@sum_rawdata", 0); + // archiveDayRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + + // resultArchiveDayRawDatas.Add(archiveDayRawData); + // } + + // if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容 + // { + // var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult); + // if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) + // { + // resultArchiveDayRawDatas.AddRange(ArrangeRawDatas); + // } + // } + // } + + // #endregion 水電錶作業 save to DB end + //} + + private bool initWork(string dbDateName) + { + try + { + string sql = $@"CREATE TABLE IF NOT EXISTS `archive_electric_meter_day_{dbDateName}` ( + `device_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `point` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `start_timestamp` datetime(6) NOT NULL, + `end_timestamp` datetime(6) NULL DEFAULT NULL, + `count_rawdata` int(11) NULL DEFAULT NULL, + `min_rawdata` decimal(15, 3) NULL DEFAULT NULL, + `max_rawdata` decimal(15, 3) NULL DEFAULT NULL, + `kwh_result` decimal(15, 3) NULL DEFAULT -1.0, + `avg_rawdata` decimal(15, 3) NULL DEFAULT NULL, + `sum_rawdata` decimal(15, 3) NULL DEFAULT NULL, + `is_complete` tinyint(3) UNSIGNED NULL DEFAULT NULL COMMENT '是否完成,0:未完成 1:完成', + `repeat_times` int(11) NULL DEFAULT 0 COMMENT '重複次數', + `fail_reason` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '失敗原因', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime(6) NULL DEFAULT NULL, + PRIMARY KEY (`device_number`, `point`, `start_timestamp`) USING BTREE + ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; + + CREATE TABLE IF NOT EXISTS `archive_water_meter_day_{dbDateName}` ( + `device_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `point` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `start_timestamp` datetime(6) NOT NULL, + `end_timestamp` datetime(6) NULL DEFAULT NULL, + `count_rawdata` int(11) NULL DEFAULT NULL, + `min_rawdata` decimal(15, 3) NULL DEFAULT NULL, + `max_rawdata` decimal(15, 3) NULL DEFAULT NULL, + `avg_rawdata` decimal(15, 3) NULL DEFAULT NULL, + `sum_rawdata` decimal(15, 3) NULL DEFAULT NULL, + `is_complete` tinyint(3) UNSIGNED NULL DEFAULT NULL COMMENT '是否完成,0:未完成 1:完成', + `repeat_times` int(11) NULL DEFAULT 0 COMMENT '重複次數', + `fail_reason` varchar(4000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '失敗原因', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime(6) NULL DEFAULT NULL, + PRIMARY KEY (`device_number`, `point`, `start_timestamp`) USING BTREE + ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC;"; + backgroundServiceRepository.ExecuteSql(sql); + } + catch (Exception exception) + { + logger.LogError("【initWork】【任務失敗】"); + logger.LogError("【initWork】【任務失敗】[Exception]:{0}", exception.ToString()); + } + + return true; + } + private List> ArrangeRawData(DeviceNumberPoint deviceNumberPoint, JObject jsonResult) { List> arrangeRawDatas = new List>(); diff --git a/BackendWorkerService/Services/Implement/ProcEletricMeterService.cs b/BackendWorkerService/Services/Implement/ProcEletricMeterService.cs index 0033fc7..bb1c8f3 100644 --- a/BackendWorkerService/Services/Implement/ProcEletricMeterService.cs +++ b/BackendWorkerService/Services/Implement/ProcEletricMeterService.cs @@ -17,6 +17,10 @@ using Repository.BackendRepository.Interface; using Repository.BackendRepository.Implement; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.Infrastructure; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using BackendWorkerService.Quartz; +using BackendWorkerService.Quartz.Jobs; +using Microsoft.Extensions.Logging; namespace BackendWorkerService.Services.Implement { @@ -25,12 +29,16 @@ namespace BackendWorkerService.Services.Implement /// public class ProcEletricMeterService { + private readonly ILogger logger; private readonly IBackgroundServiceRepository backgroundServiceRepository; private readonly IBackgroundServiceMsSqlRepository backgroundServiceMsSqlRepository; - public ProcEletricMeterService(IBackgroundServiceRepository backgroundServiceRepository, + public ProcEletricMeterService( + ILogger logger, + IBackgroundServiceRepository backgroundServiceRepository, IBackgroundServiceMsSqlRepository backgroundServiceMySqlRepository) { + this.logger = logger; this.backgroundServiceRepository = backgroundServiceRepository; this.backgroundServiceMsSqlRepository = backgroundServiceMySqlRepository; } @@ -74,8 +82,9 @@ namespace BackendWorkerService.Services.Implement var MYsql_update_format = @" UPDATE {0} SET count_rawdata = @count_rawdata, - min_rawdata = @min_rawdata, - max_rawdata = @max_rawdata, + min_rawdata = round(@min_rawdata, 2), + max_rawdata = round(@max_rawdata, 2), + kwh_result = round(@max_rawdata, 2) - round(@min_rawdata, 2), avg_rawdata = @avg_rawdata, sum_rawdata = @sum_rawdata, is_complete = @is_complete, @@ -94,6 +103,7 @@ namespace BackendWorkerService.Services.Implement count_rawdata, min_rawdata, max_rawdata, + kwh_result, avg_rawdata, sum_rawdata, is_complete, @@ -105,8 +115,9 @@ namespace BackendWorkerService.Services.Implement @start_timestamp, @end_timestamp, @count_rawdata, - @min_rawdata, - @max_rawdata, + round(@min_rawdata, 2), + round(@max_rawdata, 2), + round(@max_rawdata, 2) - round(@min_rawdata, 2), @avg_rawdata, @sum_rawdata, @is_complete, @@ -118,8 +129,9 @@ namespace BackendWorkerService.Services.Implement UPDATE {0} SET count_rawdata = @count_rawdata, - min_rawdata = @min_rawdata, - max_rawdata = @max_rawdata, + min_rawdata = round(@min_rawdata, 2), + max_rawdata = round(@max_rawdata, 2), + kwh_result = round(@max_rawdata, 2) - round(@min_rawdata, 2), avg_rawdata = @avg_rawdata, sum_rawdata = @sum_rawdata, is_complete = @is_complete, @@ -140,6 +152,7 @@ namespace BackendWorkerService.Services.Implement count_rawdata, min_rawdata, max_rawdata, + kwh_result avg_rawdata, sum_rawdata, is_complete, @@ -151,8 +164,9 @@ namespace BackendWorkerService.Services.Implement @start_timestamp, @end_timestamp, @count_rawdata, - @min_rawdata, - @max_rawdata, + round(@min_rawdata, 2), + round(@max_rawdata, 2), + round(@max_rawdata, 2) - round(@min_rawdata, 2), @avg_rawdata, @sum_rawdata, @is_complete, @@ -250,17 +264,34 @@ namespace BackendWorkerService.Services.Implement #endregion 時歸檔補償 #region 天歸檔補償 + #region 電錶補償 day string schema = await backgroundServiceRepository.GetOneAsync(@" select system_value from variable where system_type = 'project_name' and deleted = 0"); //取得所有須補償的設備資訊 - targetTable = await backgroundServiceRepository.GetOneAsync($@" - select table_name - from information_schema.`TABLES` - where TABLE_NAME like 'archive_electric_meter_day%' and TABLE_SCHEMA = '{schema.Split('/')[0]}' - order by TABLE_NAME desc limit 1 "); - if (!string.IsNullOrEmpty(targetTable)) + //targetTable = await backgroundServiceRepository.GetOneAsync($@" + // select table_name + // from information_schema.`TABLES` + // where TABLE_NAME like 'archive_electric_meter_day%' and TABLE_SCHEMA = '{schema.Split('/')[0]}' + // order by TABLE_NAME desc limit 1 "); + var archiveTables = await backgroundServiceRepository.GetAllAsync($@" + select archive_yyyymm from + ( + select CONCAT( + 'archive_electric_meter_day_', + year(start_timestamp), + case when MONTH(start_timestamp) < 10 then CONCAT('0' , MONTH(start_timestamp)) else MONTH(start_timestamp) end + ) archive_yyyymm + from archive_electric_meter_month + where point = 'KWH' and is_complete = 0 + )a + group by archive_yyyymm"); + + //if (!string.IsNullOrEmpty(targetTable)) + //{ + foreach (var tb_yyyymm in archiveTables) { - sql_error_day = string.Format(sql_error_format, targetTable); + targetTable = tb_yyyymm.archive_yyyymm; + sql_error_day = $@"SELECT * FROM {targetTable} WHERE is_complete = 0 AND repeat_times < @RepeatTimes AND (point = 'KWH' or point = 'RCV')"; var electric_error_days = await backgroundServiceRepository.GetAllAsync(sql_error_day, new { RepeatTimes = repeatTimes }); List> electricArchiveDayRawDatas = new List>(); if (electric_error_days.Count() > 0) @@ -272,12 +303,17 @@ namespace BackendWorkerService.Services.Implement deviceNumberPoint.Point = error_day.Point; deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_day.Device_number, error_day.Point); - var startTimestamp = string.Format("{0}+08:00", error_day.Start_timestamp.Replace(" ", "T")); - var endTimestamp = string.Format("{0}+08:00", error_day.End_timestamp.Replace(" ", "T")); + //var startTimestamp = string.Format("{0}+08:00", error_day.Start_timestamp.Replace(" ", "T")); + //var startTimestamp = string.Format("{0}+08:00", DateTime.Parse(error_day.Start_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T")); + var startTimestamp = string.Format("{0}T00:00:00.000+08:00", DateTime.Parse(error_day.Start_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T")); + + //var endTimestamp = string.Format("{0}+08:00", error_day.End_timestamp.Replace(" ", "T")); + var endTimestamp = string.Format("{0}T00:00:10.000+08:00", DateTime.Parse(error_day.End_timestamp).AddDays(1).ToString("yyyy-MM-dd").Replace(" ", "T")); + var historyQueryFilter = $@" - + "; string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); @@ -342,13 +378,53 @@ namespace BackendWorkerService.Services.Implement var sql_error_update = string.Format(sql_update_format, targetTable); await backgroundServiceRepository.ExecuteSql(Mysql_error_update, electricArchiveDayRawDatas); if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1") - { + { await backgroundServiceMsSqlRepository.ExecuteSql(sql_error_update, electricArchiveDayRawDatas); } + + #region 月總計 + string yyyymm = targetTable.Split('_')[targetTable.Split('_').Length-1]; //取出 archive_electric_meter_day_202308 的最後一段 202308 + string yyyy = yyyymm.Substring(0, 4); + string mm = yyyymm.Remove(0, 4); + //先清空 該月份的數據 + string sql = @$"update archive_electric_meter_month set count_rawdata = 0, kwh_result = 0, max_rawdata = 0, + min_rawdata = 0, repeat_times = 0, is_complete = 0, fail_reason = null, updated_at = null + where `point` = 'KWH' and date(start_timestamp) = CONCAT('{yyyy}-{mm}', '-01'); "; + + try + { + await backgroundServiceRepository.ExecuteSql(sql); + + sql = $@"update archive_electric_meter_month a + join ( + select device_number, `point` + , CONCAT('{yyyy}-{mm}', '-01') start_timestamp + , LAST_DAY('{yyyy}/{mm}/01') end_timestamp + , sum(count_rawdata) count_rawdata + , sum(kwh_result) kwh_result + , max(max_rawdata) max_rawdata + , MIN(min_rawdata) min_rawdata + from {targetTable} where point = 'KWH' + group by device_number, `point` + ) b on a.device_number = b.device_number and a.`point` = b.`point` and date(a.start_timestamp) = date(b.start_timestamp) + set a.count_rawdata = b.count_rawdata, a.kwh_result = b.kwh_result, a.max_rawdata = b.max_rawdata, a.min_rawdata = b.min_rawdata, a.is_complete = 1;"; + await backgroundServiceRepository.ExecuteSql(sql); + } + catch (Exception ex) + { + //await task_Detail.WorkFail("ArchiveElectricMeterDayJob", "Compensate", ex.ToString()); + logger.LogError("【ArchiveElectricMeterDayJob】【補償機制 - 月總計】【任務失敗】"); + logger.LogError("【ArchiveElectricMeterDayJob】【補償機制 - 月總計】【任務失敗】[Exception]:{0}", ex.ToString() + Environment.NewLine + sql); + } + #endregion } } } + #endregion 電錶補償 day + + #region 水錶補償 day + targetTable = await backgroundServiceRepository.GetOneAsync($@" select table_name from information_schema.`TABLES` @@ -368,12 +444,17 @@ namespace BackendWorkerService.Services.Implement deviceNumberPoint.Point = error_day.Point; deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_day.Device_number, error_day.Point); - var startTimestamp = string.Format("{0}+08:00", error_day.Start_timestamp.Replace(" ", "T")); - var endTimestamp = string.Format("{0}+08:00", error_day.End_timestamp.Replace(" ", "T")); + //var startTimestamp = string.Format("{0}+08:00", error_day.Start_timestamp.Replace(" ", "T")); + //var startTimestamp = string.Format("{0}+08:00", DateTime.Parse(error_day.Start_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T")); + var startTimestamp = string.Format("{0}T00:00:00.000+08:00", DateTime.Parse(error_day.Start_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T")); + + //var endTimestamp = string.Format("{0}+08:00", error_day.End_timestamp.Replace(" ", "T")); + var endTimestamp = string.Format("{0}T00:00:01.000+08:00", DateTime.Parse(error_day.End_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T")); + var historyQueryFilter = $@" - + "; string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); @@ -444,6 +525,8 @@ namespace BackendWorkerService.Services.Implement } } } + #endregion 水錶補償 day + #endregion 天歸檔補償 #region 週歸檔補償 @@ -461,13 +544,17 @@ namespace BackendWorkerService.Services.Implement deviceNumberPoint.Point = error_week.Point; deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_week.Device_number, error_week.Point); - var startTimestamp = string.Format("{0}+08:00", error_week.Start_timestamp.Replace(" ", "T")); - var endTimestamp = string.Format("{0}+08:00", error_week.End_timestamp.Replace(" ", "T")); + //var startTimestamp = string.Format("{0}+08:00", error_week.Start_timestamp.Replace(" ", "T")); + var startTimestamp = string.Format("{0}T00:00:00.000+08:00", DateTime.Parse(error_week.Start_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T")); + + //var endTimestamp = string.Format("{0}+08:00", error_week.End_timestamp.Replace(" ", "T")); + var endTimestamp = string.Format("{0}T00:00:01.000+08:00", DateTime.Parse(error_week.End_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T")); + //var endTimestamp = string.Format("{0}T00:00:01.000+08:00", DateTime.Parse(error_week.End_timestamp).ToString("dd/MM/yyyy").Replace(" ", "T")); var historyQueryFilter = $@" - + "; string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); @@ -551,13 +638,14 @@ namespace BackendWorkerService.Services.Implement deviceNumberPoint.Point = error_week.Point; deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_week.Device_number, error_week.Point); - var startTimestamp = string.Format("{0}+08:00", error_week.Start_timestamp.Replace(" ", "T")); - var endTimestamp = string.Format("{0}+08:00", error_week.End_timestamp.Replace(" ", "T")); - + //var startTimestamp = string.Format("{0}+08:00", error_week.Start_timestamp.Replace(" ", "T")); + //var endTimestamp = string.Format("{0}+08:00", error_week.End_timestamp.Replace(" ", "T")); + var startTimestamp = string.Format("{0}T00:00:00.000+08:00", DateTime.Parse(error_week.Start_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T")); + var endTimestamp = string.Format("{0}T00:00:01.000+08:00", DateTime.Parse(error_week.End_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T")); var historyQueryFilter = $@" - + "; string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); @@ -630,192 +718,199 @@ namespace BackendWorkerService.Services.Implement #endregion 週歸檔補償 #region 月歸檔補償 - //取得所有須補償的設備資訊 - targetTable = "archive_electric_meter_month"; - var sql_error_month = string.Format(sql_error_format, targetTable); - var electric_error_months = await backgroundServiceRepository.GetAllAsync(sql_error_month, new { RepeatTimes = repeatTimes }); - List> electricArchiveMonthRawDatas = new List>(); - if (electric_error_months.Count() > 0) - { - foreach (var error_month in electric_error_months) - { - DeviceNumberPoint deviceNumberPoint = new DeviceNumberPoint(); - deviceNumberPoint.DeviceNumber = error_month.Device_number; - deviceNumberPoint.Point = error_month.Point; - deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_month.Device_number, error_month.Point); - var startTimestamp = string.Format("{0}+08:00", error_month.Start_timestamp.Replace(" ", "T")); - var endTimestamp = string.Format("{0}+08:00", error_month.End_timestamp.Replace(" ", "T")); + ////取得所有須補償的設備資訊 + //targetTable = "archive_electric_meter_month"; + //var sql_error_month = string.Format(sql_error_format, targetTable); + //var electric_error_months = await backgroundServiceRepository.GetAllAsync(sql_error_month, new { RepeatTimes = repeatTimes }); + //List> electricArchiveMonthRawDatas = new List>(); + //if (electric_error_months.Count() > 0) + //{ + // foreach (var error_month in electric_error_months) + // { + // DeviceNumberPoint deviceNumberPoint = new DeviceNumberPoint(); + // deviceNumberPoint.DeviceNumber = error_month.Device_number; + // deviceNumberPoint.Point = error_month.Point; + // deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_month.Device_number, error_month.Point); - var startDateTime = Convert.ToDateTime(error_month.Start_timestamp); - var dayInMonth = DateTime.DaysInMonth(startDateTime.Year, startDateTime.Month); + // //var startTimestamp = string.Format("{0}+08:00", error_month.Start_timestamp.Replace(" ", "T")); + // //var endTimestamp = string.Format("{0}+08:00", error_month.End_timestamp.Replace(" ", "T")); + // var startTimestamp = string.Format("{0}T00:00:00.000+08:00", DateTime.Parse(error_month.Start_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T")); + + // var endTimestamp = string.Format("{0}T00:00:01.000+08:00", DateTime.Parse(error_month.End_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T")); - var historyQueryFilter = $@" - - - - "; + // var startDateTime = Convert.ToDateTime(error_month.Start_timestamp); + // var dayInMonth = DateTime.DaysInMonth(startDateTime.Year, startDateTime.Month) + 1; //比原定的多加 1天 - string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); - var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and - device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' - and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' - and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' - and device_point_name = '{device_number.Split("_")[8]}'").Result; - HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); - //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); - archiveMonthRequest.Method = "POST"; - archiveMonthRequest.Headers.Add("Authorization", "Basic " + encoded); - archiveMonthRequest.PreAuthenticate = true; + // var historyQueryFilter = $@" + // + // + // + // "; - byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); - using (Stream reqStream = archiveMonthRequest.GetRequestStream()) - { - reqStream.Write(byteArray, 0, byteArray.Length); - } + // string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); + // var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and + // device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' + // and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' + // and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' + // and device_point_name = '{device_number.Split("_")[8]}'").Result; + // HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); + // //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); + // archiveMonthRequest.Method = "POST"; + // archiveMonthRequest.Headers.Add("Authorization", "Basic " + encoded); + // archiveMonthRequest.PreAuthenticate = true; - HttpWebResponse archiveMonthResponse = (HttpWebResponse)archiveMonthRequest.GetResponse(); - var archiveMonthResponseContent = new StreamReader(archiveMonthResponse.GetResponseStream()).ReadToEnd(); + // byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); + // using (Stream reqStream = archiveMonthRequest.GetRequestStream()) + // { + // reqStream.Write(byteArray, 0, byteArray.Length); + // } - xmlDocument.LoadXml(archiveMonthResponseContent); - string archiveMonthJson = JsonConvert.SerializeXmlNode(xmlDocument); - JObject archiveMonthJsonResult = (JObject)JsonConvert.DeserializeObject(archiveMonthJson); + // HttpWebResponse archiveMonthResponse = (HttpWebResponse)archiveMonthRequest.GetResponse(); + // var archiveMonthResponseContent = new StreamReader(archiveMonthResponse.GetResponseStream()).ReadToEnd(); - if (archiveMonthJsonResult.ContainsKey("err")) //抓取錯誤 - { - Dictionary archiveMonthRawData = new Dictionary(); - archiveMonthRawData.Add("@device_number", error_month.Device_number); - archiveMonthRawData.Add("@point", error_month.Point); - archiveMonthRawData.Add("@start_timestamp", DateTime.Parse(error_month.Start_timestamp, System.Globalization.CultureInfo.CurrentCulture)); - archiveMonthRawData.Add("@end_timestamp", DateTime.Parse(error_month.End_timestamp, System.Globalization.CultureInfo.CurrentCulture)); - archiveMonthRawData.Add("@is_complete", 0); - archiveMonthRawData.Add("@repeat_times", ++error_month.Repeat_times); - archiveMonthRawData.Add("@fail_reason", archiveMonthJson); + // xmlDocument.LoadXml(archiveMonthResponseContent); + // string archiveMonthJson = JsonConvert.SerializeXmlNode(xmlDocument); + // JObject archiveMonthJsonResult = (JObject)JsonConvert.DeserializeObject(archiveMonthJson); - archiveMonthRawData.Add("@count_rawdata", 0); - archiveMonthRawData.Add("@min_rawdata", 0); - archiveMonthRawData.Add("@max_rawdata", 0); - archiveMonthRawData.Add("@avg_rawdata", 0); - archiveMonthRawData.Add("@sum_rawdata", 0); - archiveMonthRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + // if (archiveMonthJsonResult.ContainsKey("err")) //抓取錯誤 + // { + // Dictionary archiveMonthRawData = new Dictionary(); + // archiveMonthRawData.Add("@device_number", error_month.Device_number); + // archiveMonthRawData.Add("@point", error_month.Point); + // archiveMonthRawData.Add("@start_timestamp", DateTime.Parse(error_month.Start_timestamp, System.Globalization.CultureInfo.CurrentCulture)); + // archiveMonthRawData.Add("@end_timestamp", DateTime.Parse(error_month.End_timestamp, System.Globalization.CultureInfo.CurrentCulture)); + // archiveMonthRawData.Add("@is_complete", 0); + // archiveMonthRawData.Add("@repeat_times", ++error_month.Repeat_times); + // archiveMonthRawData.Add("@fail_reason", archiveMonthJson); - electricArchiveMonthRawDatas.Add(archiveMonthRawData); - } + // archiveMonthRawData.Add("@count_rawdata", 0); + // archiveMonthRawData.Add("@min_rawdata", 0); + // archiveMonthRawData.Add("@max_rawdata", 0); + // archiveMonthRawData.Add("@avg_rawdata", 0); + // archiveMonthRawData.Add("@sum_rawdata", 0); + // archiveMonthRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); - if (archiveMonthJsonResult.ContainsKey("obj")) //表示可以讀取到內容 - { - var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveMonthJsonResult); - if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) - { - electricArchiveMonthRawDatas.AddRange(ArrangeRawDatas); - } - } - } + // electricArchiveMonthRawDatas.Add(archiveMonthRawData); + // } - if (electricArchiveMonthRawDatas.Count() > 0) - { - var Mysql_error_update = string.Format(MYsql_update_format, targetTable); - var sql_error_update = string.Format(sql_update_format, targetTable); - if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1") - { - await backgroundServiceMsSqlRepository.ExecuteSql(sql_error_update, electricArchiveMonthRawDatas); - } - await backgroundServiceRepository.ExecuteSql(Mysql_error_update, electricArchiveMonthRawDatas); - } - } + // if (archiveMonthJsonResult.ContainsKey("obj")) //表示可以讀取到內容 + // { + // var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveMonthJsonResult); + // if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) + // { + // electricArchiveMonthRawDatas.AddRange(ArrangeRawDatas); + // } + // } + // } - targetTable = "archive_water_meter_month"; - sql_error_month = string.Format(sql_error_format, targetTable); - var water_error_months = await backgroundServiceRepository.GetAllAsync(sql_error_month, new { RepeatTimes = repeatTimes }); - List> waterArchiveMonthRawDatas = new List>(); - if (water_error_months.Count() > 0) - { - foreach (var error_month in water_error_months) - { - DeviceNumberPoint deviceNumberPoint = new DeviceNumberPoint(); - deviceNumberPoint.DeviceNumber = error_month.Device_number; - deviceNumberPoint.Point = error_month.Point; - deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_month.Device_number, error_month.Point); + // if (electricArchiveMonthRawDatas.Count() > 0) + // { + // var Mysql_error_update = string.Format(MYsql_update_format, targetTable); + // var sql_error_update = string.Format(sql_update_format, targetTable); + // if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1") + // { + // await backgroundServiceMsSqlRepository.ExecuteSql(sql_error_update, electricArchiveMonthRawDatas); + // } + // await backgroundServiceRepository.ExecuteSql(Mysql_error_update, electricArchiveMonthRawDatas); + // } + //} - var startTimestamp = string.Format("{0}+08:00", error_month.Start_timestamp.Replace(" ", "T")); - var endTimestamp = string.Format("{0}+08:00", error_month.End_timestamp.Replace(" ", "T")); + //targetTable = "archive_water_meter_month"; + //sql_error_month = string.Format(sql_error_format, targetTable); + //var water_error_months = await backgroundServiceRepository.GetAllAsync(sql_error_month, new { RepeatTimes = repeatTimes }); + //List> waterArchiveMonthRawDatas = new List>(); + //if (water_error_months.Count() > 0) + //{ + // foreach (var error_month in water_error_months) + // { + // DeviceNumberPoint deviceNumberPoint = new DeviceNumberPoint(); + // deviceNumberPoint.DeviceNumber = error_month.Device_number; + // deviceNumberPoint.Point = error_month.Point; + // deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_month.Device_number, error_month.Point); - var startDateTime = Convert.ToDateTime(error_month.Start_timestamp); - var dayInMonth = DateTime.DaysInMonth(startDateTime.Year, startDateTime.Month); + // //var startTimestamp = string.Format("{0}+08:00", error_month.Start_timestamp.Replace(" ", "T")); + // //var endTimestamp = string.Format("{0}+08:00", error_month.End_timestamp.Replace(" ", "T")); + // var startTimestamp = string.Format("{0}T00:00:00.000+08:00", DateTime.Parse(error_month.Start_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T")); + // var endTimestamp = string.Format("{0}T00:00:01.000+08:00", DateTime.Parse(error_month.End_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T")); - var historyQueryFilter = $@" - - - - "; - string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); - var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and - device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' - and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' - and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' - and device_point_name = '{device_number.Split("_")[8]}'").Result; - HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); - //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); - archiveMonthRequest.Method = "POST"; - archiveMonthRequest.Headers.Add("Authorization", "Basic " + encoded); - archiveMonthRequest.PreAuthenticate = true; + // var startDateTime = Convert.ToDateTime(error_month.Start_timestamp); + // var dayInMonth = DateTime.DaysInMonth(startDateTime.Year, startDateTime.Month) + 1; //比原定的多加 1天 - byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); - using (Stream reqStream = archiveMonthRequest.GetRequestStream()) - { - reqStream.Write(byteArray, 0, byteArray.Length); - } + // var historyQueryFilter = $@" + // + // + // + // "; - HttpWebResponse archiveMonthResponse = (HttpWebResponse)archiveMonthRequest.GetResponse(); - var archiveMonthResponseContent = new StreamReader(archiveMonthResponse.GetResponseStream()).ReadToEnd(); + // string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); + // var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and + // device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' + // and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' + // and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' + // and device_point_name = '{device_number.Split("_")[8]}'").Result; + // HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); + // //HttpWebRequest archiveMonthRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); + // archiveMonthRequest.Method = "POST"; + // archiveMonthRequest.Headers.Add("Authorization", "Basic " + encoded); + // archiveMonthRequest.PreAuthenticate = true; - xmlDocument.LoadXml(archiveMonthResponseContent); - string archiveMonthJson = JsonConvert.SerializeXmlNode(xmlDocument); - JObject archiveMonthJsonResult = (JObject)JsonConvert.DeserializeObject(archiveMonthJson); + // byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); + // using (Stream reqStream = archiveMonthRequest.GetRequestStream()) + // { + // reqStream.Write(byteArray, 0, byteArray.Length); + // } - if (archiveMonthJsonResult.ContainsKey("err")) //抓取錯誤 - { - Dictionary archiveMonthRawData = new Dictionary(); - archiveMonthRawData.Add("@device_number", error_month.Device_number); - archiveMonthRawData.Add("@point", error_month.Point); - archiveMonthRawData.Add("@start_timestamp", DateTime.Parse(error_month.Start_timestamp, System.Globalization.CultureInfo.CurrentCulture)); - archiveMonthRawData.Add("@end_timestamp", DateTime.Parse(error_month.End_timestamp, System.Globalization.CultureInfo.CurrentCulture)); - archiveMonthRawData.Add("@is_complete", 0); - archiveMonthRawData.Add("@repeat_times", ++error_month.Repeat_times); - archiveMonthRawData.Add("@fail_reason", archiveMonthJson); + // HttpWebResponse archiveMonthResponse = (HttpWebResponse)archiveMonthRequest.GetResponse(); + // var archiveMonthResponseContent = new StreamReader(archiveMonthResponse.GetResponseStream()).ReadToEnd(); - archiveMonthRawData.Add("@count_rawdata", 0); - archiveMonthRawData.Add("@min_rawdata", 0); - archiveMonthRawData.Add("@max_rawdata", 0); - archiveMonthRawData.Add("@avg_rawdata", 0); - archiveMonthRawData.Add("@sum_rawdata", 0); - archiveMonthRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + // xmlDocument.LoadXml(archiveMonthResponseContent); + // string archiveMonthJson = JsonConvert.SerializeXmlNode(xmlDocument); + // JObject archiveMonthJsonResult = (JObject)JsonConvert.DeserializeObject(archiveMonthJson); - waterArchiveMonthRawDatas.Add(archiveMonthRawData); - } + // if (archiveMonthJsonResult.ContainsKey("err")) //抓取錯誤 + // { + // Dictionary archiveMonthRawData = new Dictionary(); + // archiveMonthRawData.Add("@device_number", error_month.Device_number); + // archiveMonthRawData.Add("@point", error_month.Point); + // archiveMonthRawData.Add("@start_timestamp", DateTime.Parse(error_month.Start_timestamp, System.Globalization.CultureInfo.CurrentCulture)); + // archiveMonthRawData.Add("@end_timestamp", DateTime.Parse(error_month.End_timestamp, System.Globalization.CultureInfo.CurrentCulture)); + // archiveMonthRawData.Add("@is_complete", 0); + // archiveMonthRawData.Add("@repeat_times", ++error_month.Repeat_times); + // archiveMonthRawData.Add("@fail_reason", archiveMonthJson); - if (archiveMonthJsonResult.ContainsKey("obj")) //表示可以讀取到內容 - { - var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveMonthJsonResult); - if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) - { - waterArchiveMonthRawDatas.AddRange(ArrangeRawDatas); - } - } - } + // archiveMonthRawData.Add("@count_rawdata", 0); + // archiveMonthRawData.Add("@min_rawdata", 0); + // archiveMonthRawData.Add("@max_rawdata", 0); + // archiveMonthRawData.Add("@avg_rawdata", 0); + // archiveMonthRawData.Add("@sum_rawdata", 0); + // archiveMonthRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); - if (waterArchiveMonthRawDatas.Count() > 0) - { - var Mysql_error_update = string.Format(MYsql_update_format, targetTable); - var sql_error_update = string.Format(sql_update_format, targetTable); - if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1") - { - await backgroundServiceMsSqlRepository.ExecuteSql(sql_error_update, waterArchiveMonthRawDatas); - } - await backgroundServiceRepository.ExecuteSql(Mysql_error_update, waterArchiveMonthRawDatas); - } - } + // waterArchiveMonthRawDatas.Add(archiveMonthRawData); + // } + + // if (archiveMonthJsonResult.ContainsKey("obj")) //表示可以讀取到內容 + // { + // var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveMonthJsonResult); + // if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) + // { + // waterArchiveMonthRawDatas.AddRange(ArrangeRawDatas); + // } + // } + // } + + // if (waterArchiveMonthRawDatas.Count() > 0) + // { + // var Mysql_error_update = string.Format(MYsql_update_format, targetTable); + // var sql_error_update = string.Format(sql_update_format, targetTable); + // if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1") + // { + // await backgroundServiceMsSqlRepository.ExecuteSql(sql_error_update, waterArchiveMonthRawDatas); + // } + // await backgroundServiceRepository.ExecuteSql(Mysql_error_update, waterArchiveMonthRawDatas); + // } + //} #endregion 月歸檔補償 result = true; @@ -828,6 +923,92 @@ namespace BackendWorkerService.Services.Implement return result; } + + /// + /// 獲取 Niagara 資料,並儲存於 List 中 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public void obixData_collect(XmlDocument xmlDocument, List DeviceNumberPoints, ObixApiConfig obixApiConfig, string encoded, string startTimestamp, string endTimestamp, string historyQueryFilter, List> resultArchiveDayRawDatas) + { + + #region 水電錶 save to DB start + + foreach (var deviceNumberPoint in DeviceNumberPoints) + { + string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); + var station = backgroundServiceRepository.GetOneAsync($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and + device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}' + and device_floor_tag = '{device_number.Split("_")[4]}' and device_master_tag = '{device_number.Split("_")[5]}' + and device_last_name_tag = '{device_number.Split("_")[6]}' and device_serial_tag = '{device_number.Split("_")[7]}' + and device_point_name = '{device_number.Split("_")[8]}'").Result; + HttpWebRequest archiveRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"); + //HttpWebRequest archiveDayRequest = (HttpWebRequest)WebRequest.Create($"{obixApiConfig.ApiBase}obix/histories/{station}/H_E1_B1F_MVCB_MVCBH_V1/~historyRollup/"); + archiveRequest.Method = "POST"; + archiveRequest.Headers.Add("Authorization", "Basic " + encoded); + archiveRequest.PreAuthenticate = true; + + + byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); + using (Stream reqStream = archiveRequest.GetRequestStream()) + { + reqStream.Write(byteArray, 0, byteArray.Length); + } + + var archiveResponse = (HttpWebResponse)archiveRequest.GetResponse(); + var archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd(); + archiveResponse.Dispose(); + archiveResponse.Close(); + + xmlDocument.LoadXml(archiveResponseContent); + var archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); + var archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); + + if (archiveJsonResult.ContainsKey("err")) //抓取錯誤 + { + //logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【取得資料失敗】"); + //logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【取得資料失敗】[錯誤內容]:{0}", archiveDayJsonResult); + + Dictionary archiveDayRawData = new Dictionary(); + archiveDayRawData.Add("@device_number", deviceNumberPoint.DeviceNumber); + archiveDayRawData.Add("@point", deviceNumberPoint.Point); + archiveDayRawData.Add("@start_timestamp", startTimestamp.Replace("T", " ").Substring(0, 19)); + archiveDayRawData.Add("@end_timestamp", endTimestamp.Replace("T", " ").Substring(0, 19)); + archiveDayRawData.Add("@is_complete", 0); + archiveDayRawData.Add("@repeat_times", 0); + archiveDayRawData.Add("@fail_reason", archiveJson); + + archiveDayRawData.Add("@count_rawdata", 0); + archiveDayRawData.Add("@min_rawdata", 0); + archiveDayRawData.Add("@max_rawdata", 0); + archiveDayRawData.Add("@avg_rawdata", 0); + archiveDayRawData.Add("@sum_rawdata", 0); + archiveDayRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); + + resultArchiveDayRawDatas.Add(archiveDayRawData); + } + + if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容 + { + var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult); + if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) + { + resultArchiveDayRawDatas.AddRange(ArrangeRawDatas); + } + } + } + + #endregion 水電錶作業 save to DB end + } + + private List> ArrangeRawData(DeviceNumberPoint deviceNumberPoint, JObject jsonResult) { List> arrangeRawDatas = new List>(); @@ -902,7 +1083,7 @@ namespace BackendWorkerService.Services.Implement break; } } - } + } arrangeRawData.Add("@is_complete", 1); arrangeRawData.Add("@repeat_times", 0); arrangeRawData.Add("@fail_reason", null); @@ -969,6 +1150,7 @@ namespace BackendWorkerService.Services.Implement arrangeRawData.Add("@sum_rawdata", sum); break; } + } } @@ -983,5 +1165,7 @@ namespace BackendWorkerService.Services.Implement return arrangeRawDatas; } + + } } diff --git a/BackendWorkerService/appsettings.Development.json b/BackendWorkerService/appsettings.Development.json index b4569f6..785f08c 100644 --- a/BackendWorkerService/appsettings.Development.json +++ b/BackendWorkerService/appsettings.Development.json @@ -7,6 +7,8 @@ } }, "LoggerPath": "C:\\inetpub\\Taipei_dome_background_service\\Logs", + + //MIN HOUR DOM MON DOW CMD "BackgroundServiceCron": { "ExecutionBackgroundServicePlanJob": "0 0 2 * * ?", "MessageNotificationJob": "0 0 2 * * ?", @@ -14,7 +16,7 @@ "RegularUpdateDBTableJob": "0 0 2 * * ?", "ParkingJob": "0 0 2 * * ?", "ArchiveElectricMeterHourJob": "0 0 2 * * ?", - "ArchiveElectricMeterDayJob": "0/5 * * * * ?", + "ArchiveElectricMeterDayJob": "0/5 * * * * ?", //每 5分鐘 "WeatherAPIJob": "0 0 2 * * ?" }, "DBConfig": { diff --git a/FrontendWebApi/ApiControllers/HistoryController.cs b/FrontendWebApi/ApiControllers/HistoryController.cs index cd53268..93d724d 100644 --- a/FrontendWebApi/ApiControllers/HistoryController.cs +++ b/FrontendWebApi/ApiControllers/HistoryController.cs @@ -175,7 +175,11 @@ namespace FrontendWebApi.ApiControllers HistoryExport hed = new HistoryExport(); hed.type = devicePoint.Where(x => x.device_building_tag == d.building_tag && x.points == ard["@point"].ToString()).Select(x => x.full_name).FirstOrDefault(); hed.deviceName = device.Where(x => x.device_number == ard["@device_number"].ToString()).Select(x => x.full_name).FirstOrDefault(); - hed.value = ard["@avg_rawdata"].ToString() == "-1" ? "NaN" : Math.Round((decimal.Parse(ard["@avg_rawdata"].ToString(), System.Globalization.NumberStyles.Float)), 2).ToString(); + // 四捨六入 + //hed.value = ard["@avg_rawdata"].ToString() == "-1" ? "NaN" : Math.Round((decimal.Parse(ard["@avg_rawdata"].ToString(), System.Globalization.NumberStyles.Float)), 2).ToString(); + // 四捨五入 + //ref: Math.Round(Convert.ToDecimal(45.365), 2, MidpointRounding.AwayFromZero) + hed.value = ard["@avg_rawdata"].ToString() == "-1" ? "NaN" : Math.Round(Convert.ToDecimal(ard["@avg_rawdata"].ToString()), 2, MidpointRounding.AwayFromZero).ToString(); hed.timestamp = Convert.ToDateTime(ard["@start_timestamp"].ToString()); hed.building_tag = d.building_tag; he.Add(hed); diff --git a/FrontendWebApi/ApiControllers/HydroMeterController.cs b/FrontendWebApi/ApiControllers/HydroMeterController.cs index d423055..bf07ada 100644 --- a/FrontendWebApi/ApiControllers/HydroMeterController.cs +++ b/FrontendWebApi/ApiControllers/HydroMeterController.cs @@ -114,7 +114,7 @@ namespace FrontendWebApi.ApiControllers if (input.tableType == "year") { sqlGroup = $@" group by year(start_timestamp), year(end_timestamp), device_number "; - sqlAvgRawData = " round(avg(kwh_result), 2) as avg_rawdata, year(start_timestamp) as start_timestamp, year(end_timestamp) as end_timestamp "; + sqlAvgRawData = " round(sum(kwh_result), 2) as avg_rawdata, year(start_timestamp) as start_timestamp, year(end_timestamp) as end_timestamp "; } else sqlAvgRawData = " round(kwh_result, 2) as avg_rawdata, start_timestamp, end_timestamp "; @@ -138,14 +138,14 @@ namespace FrontendWebApi.ApiControllers select * from ( ( - SELECT DATE(ADDDATE(@startTime, INTERVAL @i:=@i+1 {input.tableType})) AS date + SELECT DATE(ADDDATE('{startTime}', INTERVAL @i:=@i+1 {input.tableType})) AS date FROM {table} - HAVING @i < TIMESTAMPDIFF({input.tableType}, @startTime, ADDDATE(@endTime, INTERVAL -1 DAY)) + HAVING @i < TIMESTAMPDIFF({input.tableType}, '{startTime}', ADDDATE('{endTime}' , INTERVAL -1 DAY)) ) d, ( select device_number from {table} - where start_timestamp >= @startTime and end_timestamp < @endTime and point = 'KWH' {buildingSql} + where start_timestamp >= '{startTime}' and end_timestamp < '{endTime}' and point = 'KWH' {buildingSql} {sqlWhere} group by device_number ) dn @@ -154,11 +154,13 @@ namespace FrontendWebApi.ApiControllers left join ( select device_number, {sqlAvgRawData} from {table} - where start_timestamp >= @startTime and end_timestamp < @endTime and point = 'KWH' {buildingSql} + where start_timestamp >= '{startTime}' and end_timestamp < '{endTime}' and point = 'KWH' {buildingSql} {sqlWhere} {sqlGroup} ) aemm on aemm.start_timestamp >= {aemmStaDate} and aemm.end_timestamp < {aemmEndDate} and aemm.device_number = fd.device_number + join device dc on fd.device_number = dc.device_number + where dc.deleted = 0 order by fd.device_number, fd.date"; - Logger.LogInformation("SQL = " + sql + " startTime=" + startTime + " endTime=" + endTime + " building=" + input.building_tag + " floor_tag = " + input.floor_tag); + Logger.LogInformation("0918 SQL = " + sql + Environment.NewLine + " startTime='" + startTime + "' endTime='" + endTime + "' building=" + input.building_tag ); var rawData = await backendRepository.GetAllAsync(sql, new { startTime = startTime, endtime = endTime, building_tag = input.building_tag, dateFormat = dateFormat }); @@ -177,7 +179,7 @@ namespace FrontendWebApi.ApiControllers .Select(x => new HydroMeterOutput { building_tag = x.Key.building_tag, floor_tag = x.Key.floor_tag, device_serial_tag = x.Key.device_serial_tag, device_master = x.Key.device_master, device_number = x.Key.device_number }) .ToList(); } - + int i = 0; foreach (var l in list) { l.rawData = new List(); @@ -200,9 +202,11 @@ namespace FrontendWebApi.ApiControllers l.price = input.price.HasValue ? (Math.Round(input.price.Value, 2)).ToString() : Math.Round((await backendRepository.GetOneAsync("select system_value from variable where system_type = 'ElectricPrice' and deleted = 0")), 2).ToString(); + l.total_price = Math.Round((Decimal.Parse(l.total) * Decimal.Parse(l.price)), 2).ToString(); + i++; } - + Logger.LogInformation(" 筆數:" + i.ToString()); apiResult.Code = "0000"; apiResult.Data = list; } @@ -467,6 +471,20 @@ namespace FrontendWebApi.ApiControllers styleLine12.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; styleLine12.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; styleLine12.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; + #region setting for data + //IFont fontNumeric = workbook.CreateFont(); + //fontNumeric.FontName = "新細明體"; + //fontNumeric.FontHeightInPoints = 12; + //ICellStyle styleLineNumeric = workbook.CreateCellStyle(); + //styleLineNumeric.SetFont(fontNumeric); + //styleLineNumeric.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; + //styleLineNumeric.VerticalAlignment = VerticalAlignment.Center; + //styleLineNumeric.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin; + //styleLineNumeric.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; + //styleLineNumeric.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; + //styleLineNumeric.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; + #endregion + ICellStyle stylein12 = workbook.CreateCellStyle(); stylein12.SetFont(font12Times); stylein12.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left; @@ -482,7 +500,7 @@ namespace FrontendWebApi.ApiControllers if (r.Count > 0) { string buildingName = r.Select(x => x.building_name).FirstOrDefault(); - var sheet = workbook.CreateSheet($"{buildingName} 電表報表"); + var sheet = workbook.CreateSheet($"{r.Select( x=> x.device_full_name).FirstOrDefault()} 電表報表"); int RowPosition = 0; #region set cell IRow row = sheet.CreateRow(RowPosition); @@ -585,7 +603,7 @@ namespace FrontendWebApi.ApiControllers ms.Flush(); ms.Seek(0, SeekOrigin.Begin); Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition"); - return File(ms, "application/vnd.ms", @$"電表報表{System.DateTime.Now.ToString("yyyyMMddHHmm")}.xlsx"); + return File(ms, "application/vnd.ms", @$"{building}_電表報表{System.DateTime.Now.ToString("yyyyMMddHHmm")}.xlsx"); } [HttpPost] diff --git a/z01_WinAPP/Program.cs b/z01_WinAPP/Program.cs index d96e59b..1526ade 100644 --- a/z01_WinAPP/Program.cs +++ b/z01_WinAPP/Program.cs @@ -19,8 +19,8 @@ namespace tpDomeWinAPP Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new fmCheckTagName()); - Application.Run(new fmKeke()); - //Application.Run(new fmDecrypt()); + //Application.Run(new fmKeke()); + Application.Run(new fmDecrypt()); } } } diff --git a/z01_WinAPP/fmKeke.Designer.cs b/z01_WinAPP/fmKeke.Designer.cs index 8181991..631f526 100644 --- a/z01_WinAPP/fmKeke.Designer.cs +++ b/z01_WinAPP/fmKeke.Designer.cs @@ -32,6 +32,7 @@ lbMsg = new System.Windows.Forms.Label(); loadData = new System.Windows.Forms.Button(); dataGridView1 = new System.Windows.Forms.DataGridView(); + button1 = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit(); splitContainer1.Panel1.SuspendLayout(); splitContainer1.Panel2.SuspendLayout(); @@ -48,6 +49,7 @@ // // splitContainer1.Panel1 // + splitContainer1.Panel1.Controls.Add(button1); splitContainer1.Panel1.Controls.Add(lbMsg); splitContainer1.Panel1.Controls.Add(loadData); // @@ -89,6 +91,16 @@ dataGridView1.TabIndex = 0; dataGridView1.CellContentClick += dataGridView1_CellContentClick; // + // button1 + // + button1.Location = new System.Drawing.Point(238, 32); + button1.Name = "button1"; + button1.Size = new System.Drawing.Size(94, 29); + button1.TabIndex = 1; + button1.Text = "button1"; + button1.UseVisualStyleBackColor = true; + button1.Click += button1_Click_1; + // // fmKeke // AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F); @@ -113,5 +125,6 @@ private System.Windows.Forms.Button loadData; private System.Windows.Forms.Label lbMsg; private System.Windows.Forms.DataGridView dataGridView1; + private System.Windows.Forms.Button button1; } } \ No newline at end of file diff --git a/z01_WinAPP/fmKeke.cs b/z01_WinAPP/fmKeke.cs index 21cdfac..e1e93e2 100644 --- a/z01_WinAPP/fmKeke.cs +++ b/z01_WinAPP/fmKeke.cs @@ -73,5 +73,13 @@ namespace z01_WinAPP { } + + private void button1_Click_1(object sender, EventArgs e) + { + string targetTable = "archive_electric_meter_day_202308"; + string yyyymm = targetTable.Split('_')[targetTable.Split('_').Length - 1]; //取出 archive_electric_meter_day_202308 的最後一段 202308 + string yyyy = yyyymm.Substring(0, 4); + string mm = yyyymm.Remove(0, 4); + } } } diff --git a/z01_WinAPP/fmKeke.resx b/z01_WinAPP/fmKeke.resx index 49ea9be..39e2ec9 100644 --- a/z01_WinAPP/fmKeke.resx +++ b/z01_WinAPP/fmKeke.resx @@ -18,7 +18,7 @@ System.Resources.ResXResourceReader, System.Windows.Forms, ... System.Resources.ResXResourceWriter, System.Windows.Forms, ... this is my long stringthis is a comment - Blue + Blue [base64 mime encoded serialized .NET Framework object]