From 5766931a1f77e683c59d50caeafdc3b6c5c0a8c7 Mon Sep 17 00:00:00 2001 From: "jay.chang" Date: Tue, 10 Sep 2024 14:50:16 +0800 Subject: [PATCH] =?UTF-8?q?[BGService]=E6=9C=88=E6=AD=B8=E6=AA=94=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E8=B7=A8=E6=9C=88=E8=A3=9C=E6=AA=94=E6=A9=9F=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Implement/ProcEletricMeterService.cs | 190 ++++++++++-------- 1 file changed, 104 insertions(+), 86 deletions(-) diff --git a/BackendWorkerService/Services/Implement/ProcEletricMeterService.cs b/BackendWorkerService/Services/Implement/ProcEletricMeterService.cs index 322ab9f..4100228 100644 --- a/BackendWorkerService/Services/Implement/ProcEletricMeterService.cs +++ b/BackendWorkerService/Services/Implement/ProcEletricMeterService.cs @@ -390,7 +390,7 @@ namespace BackendWorkerService.Services.Implement catch (Exception ex) { logger.LogError("【ArchiveElectricMeterDayJob】【補償機制 - 天】【任務失敗】Device_number=" + error_day.Device_number + " point = " + error_day.Point + " date =" + error_day + " startTimestamp" + startTimestamp + " endTimestamp =" + endTimestamp); - logger.LogError("【ArchiveElectricMeterDayJob】【補償機制 - 天】【任務失敗】[Exception]:{0}", ex.ToString() + Environment.NewLine ); + logger.LogError("【ArchiveElectricMeterDayJob】【補償機制 - 天】【任務失敗】[Exception]:{0}", ex.ToString() + Environment.NewLine); } } @@ -405,7 +405,7 @@ namespace BackendWorkerService.Services.Implement } #region 月總計 - string yyyymm = targetTable.Split('_')[targetTable.Split('_').Length-1]; //取出 archive_electric_meter_day_202308 的最後一段 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); //先清空 該月份的數據 @@ -959,7 +959,7 @@ namespace BackendWorkerService.Services.Implement /// /// /// - public void obixData_collect(XmlDocument xmlDocument, List DeviceNumberPoints, ObixApiConfig obixApiConfig, string encoded, List> resultArchiveDayRawDatas, ref Dictionary dicError) + public void obixData_collect(XmlDocument xmlDocument, List DeviceNumberPoints, ObixApiConfig obixApiConfig, string encoded, List> resultArchiveDayRawDatas, ref Dictionary dicError) { #region 水電錶 save to DB start @@ -1082,7 +1082,8 @@ namespace BackendWorkerService.Services.Implement //logger.LogInformation(@$"obix result {deviceNumberPoint.DeviceNumber} day = {day.ToString("yyyy-MM-dd")} ArrangeRawDatas.count() = {ArrangeRawDatas.Count().ToString()}"); resultArchiveDayRawDatas.AddRange(ArrangeRawDatas); } - else { + else + { if (!dicError.ContainsKey(deviceNumberPoint.DeviceNumber)) { dicError.Add(deviceNumberPoint.DeviceNumber, day.ToString("yyyy-MM-dd")); //記錄異常設備與日期 @@ -1125,109 +1126,125 @@ namespace BackendWorkerService.Services.Implement var startDay = deviceNumberPoint.archive_lastDate.ToString("yyyy-MM-dd"); var endDay = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"); + DateTime today = DateTime.Now; logger.LogInformation($@"before startDay = {startDay} endDay={endDay}"); // ----------- log #region - //foreach (DateTime day in EachMonth(startDay , endDay)) - //{ - // 需要比原定日期增加 1天:因 Niagara 內部判斷為 < lastData, 並未包含結束當天 add by jiahao @2023-09-16 - //var dayInMonth = DateTime.DaysInMonth(day.Year, day.Month) +1; 、、(DateTime.Now - DateTime.Parse(startDay)).Days - DateTime today = DateTime.Now; + foreach (DateTime month in EachMonth(startDay, endDay)) + { + // 需要比原定日期增加 1天:因 Niagara 內部判斷為 < lastData, 並未包含結束當天 add by jiahao @2023-09-16 + //var dayInMonth = DateTime.DaysInMonth(day.Year, day.Month) +1; 、、(DateTime.Now - DateTime.Parse(startDay)).Days + var startTimestamp = ""; + var endTimestamp = ""; + var dayInMonth = 0; + // 區分當月與其他月份 + if (month.ToString("yyyy-MM") == System.DateTime.Now.AddDays(-1).ToString("yyyy-MM")) + { + var preDay = today.AddDays(-1); //取得前一天 - var preDay = today.AddDays(-1); //取得前一天 + dayInMonth = DateTime.DaysInMonth(preDay.Year, preDay.Month); + var FirstDay = new DateTime(preDay.Year, preDay.Month, 1); + var LastDay = today; + startTimestamp = string.Format("{0}T00:00:00.000+08:00", FirstDay.ToString("yyyy-MM-dd")); + endTimestamp = string.Format("{0}T00:01:00.000+08:00", LastDay.ToString("yyyy-MM-dd")); + } + else + { + dayInMonth = DateTime.DaysInMonth(month.Year, month.Month); + var FirstDay = new DateTime(month.Year, month.Month, 1); + var LastDay = new DateTime(month.Year, month.Month, dayInMonth).AddDays(1); - var dayInMonth = DateTime.DaysInMonth(preDay.Year, preDay.Month); - var FirstDay = new DateTime(preDay.Year, preDay.Month, 1); - var LastDay = today; - var startTimestamp = string.Format("{0}T00:00:00.000+08:00", FirstDay.ToString("yyyy-MM-dd")); - var endTimestamp = string.Format("{0}T00:01:00.000+08:00", LastDay.ToString("yyyy-MM-dd")); + startTimestamp = string.Format("{0}T00:00:00.000+08:00", FirstDay.ToString("yyyy-MM-dd")); - //var dayInMonth = (DateTime.Now - DateTime.Parse(today.ToString("yyyy-MM-") + "01")).Days + 1; + endTimestamp = string.Format("{0}T00:01:00.000+08:00", LastDay.ToString("yyyy-MM-dd")); + + } + //var dayInMonth = (DateTime.Now - DateTime.Parse(today.ToString("yyyy-MM-") + "01")).Days + 1; - //var startTimestamp = string.Format("{0}T00:00:00.000+08:00", today.ToString("yyyy-MM-") + "01"); - ////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", day.AddMonths(1).ToString("yyyy-MM-") + "01"); // by jiahao @2023-09-26 - //var endTimestamp = string.Format("{0}T00:00:10.000+08:00", DateTime.Now.ToString("yyyy-MM-dd")); // by jiahao @2023-10-03 + //var startTimestamp = string.Format("{0}T00:00:00.000+08:00", today.ToString("yyyy-MM-") + "01"); + ////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", day.AddMonths(1).ToString("yyyy-MM-") + "01"); // by jiahao @2023-09-26 + //var endTimestamp = string.Format("{0}T00:00:10.000+08:00", DateTime.Now.ToString("yyyy-MM-dd")); // by jiahao @2023-10-03 - var historyQueryFilter = $@" + 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 + 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; + 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(); - - //logger.LogInformation(@$"【ArchiveElectricMeterMonth】{device_number} startTimestamp={startTimestamp} endTimestamp= {endTimestamp} interval = PT{dayInMonth.ToString()}D url = {$"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"}"); - - - xmlDocument.LoadXml(archiveResponseContent); - var archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); - var archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); - - - //if (device_number == "NTPC_D8_EE_E4_RF_Total_WHT_N1" || device_number == "NTPC_D8_EE_E4_RF_H2_WHT_N1") - //{ - logger.LogInformation(@$"{device_number} json = {archiveJsonResult}"); - //} - 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, ref dicError); - if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) + byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); + using (Stream reqStream = archiveRequest.GetRequestStream()) { - resultArchiveDayRawDatas.AddRange(ArrangeRawDatas); + reqStream.Write(byteArray, 0, byteArray.Length); + } + + var archiveResponse = (HttpWebResponse)archiveRequest.GetResponse(); + var archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd(); + archiveResponse.Dispose(); + archiveResponse.Close(); + + //logger.LogInformation(@$"【ArchiveElectricMeterMonth】{device_number} startTimestamp={startTimestamp} endTimestamp= {endTimestamp} interval = PT{dayInMonth.ToString()}D url = {$"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"}"); + + + xmlDocument.LoadXml(archiveResponseContent); + var archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); + var archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); + + + //if (device_number == "NTPC_D8_EE_E4_RF_Total_WHT_N1" || device_number == "NTPC_D8_EE_E4_RF_H2_WHT_N1") + //{ + logger.LogInformation(@$"{device_number} json = {archiveJsonResult}"); + //} + 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, ref dicError); + if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) + { + resultArchiveDayRawDatas.AddRange(ArrangeRawDatas); + } } } - //} - #endregion + #endregion } #endregion 水電錶作業 save to DB end @@ -1423,14 +1440,15 @@ namespace BackendWorkerService.Services.Implement for (var day = strtday.Date; day.Date <= endday.Date; day = day.AddDays(1)) yield return day; } - public IEnumerable EachMonth(string from, string thru) { var strtday = DateTime.Parse(from); var endday = DateTime.Parse(thru); - for (var _month = strtday.Date; _month.Month <= endday.Month; _month = _month.AddDays(1)) - yield return _month; + for (var _month = strtday.Date; _month <= endday; _month = _month.AddMonths(1)) + { + yield return _month; + } } }