1.歸檔回補機制 v1.0

2.前台 api:客製化報表 debug,設備名稱修改
This commit is contained in:
jiahao 2023-09-27 01:37:25 +08:00
parent 3751a21273
commit 174133fec7
5 changed files with 195 additions and 87 deletions

View File

@ -190,7 +190,7 @@ namespace BackendWorkerService.Quartz.Jobs
//} //}
//} //}
await task_Detail.InsertWorkTime_End("ArchiveElectricMeterDayJob", "Day", "任務完成"); await task_Detail.InsertWorkTime_End("ArchiveElectricMeterDayJob", "Day", "任務完成0927");
} }
catch (Exception exception) catch (Exception exception)
{ {
@ -615,38 +615,43 @@ namespace BackendWorkerService.Quartz.Jobs
try try
{ {
await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "Month", "水電表月任務開始"); await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "Month", "水電表月任務開始");
//var FirstDay = actionDay.AddDays(-actionDay.Day + 1); //var FirstDay = now.AddDays(-now.Day + 1);
//var LastDay = now.AddMonths(1).AddDays(-now.AddMonths(1).Day);
//var dayInMonth = DateTime.DaysInMonth(now.Year, now.Month);
//var FirstDay = actionDay.AddDays(-actionDay.Day + 1); // 計算出當月 1日
//var LastDay = actionDay.AddMonths(1).AddDays(-actionDay.AddMonths(1).Day); //var LastDay = actionDay.AddMonths(1).AddDays(-actionDay.AddMonths(1).Day);
var FirstDay = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-") + "01");
var LastDay = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd"));
// 需要比原定日期增加 1天因 Niagara 內部判斷為 < lastData, 並未包含結束當天 add by jiahao @2023-09-16 //var FirstDay = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-") + "01");
var dayInMonth = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month) + 1; //var LastDay = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd"));
var startTimestamp = string.Format("{0}T00:00:00.000+08:00", FirstDay.ToString("yyyy-MM-dd")); //// 需要比原定日期增加 1天因 Niagara 內部判斷為 < lastData, 並未包含結束當天 add by jiahao @2023-09-16
//var endTimestamp = string.Format("{0}T23:59:59.000+08:00", LastDay.ToString("yyyy-MM-dd")); //var dayInMonth = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month) + 1;
var endTimestamp = string.Format("{0}T00:00:10.000+08:00", LastDay.ToString("yyyy-MM-dd")); // by jiahao @2023-09-16
var historyQueryFilter = $@"<obj is='obix: HistoryFilter'> //var startTimestamp = string.Format("{0}T00:00:00.000+08:00", FirstDay.ToString("yyyy-MM-dd"));
<abstime name='start' val='{startTimestamp}' /> ////var endTimestamp = string.Format("{0}T23:59:59.000+08:00", LastDay.ToString("yyyy-MM-dd"));
<abstime name='end' val='{endTimestamp}' /> //var endTimestamp = string.Format("{0}T00:00:10.000+08:00", LastDay.ToString("yyyy-MM-dd")); // by jiahao @2023-09-16
<reltime name='interval' val = 'PT{dayInMonth}D' />
</obj>";
logger.LogInformation("【ArchiveElectricMeterMonth】startTimestamp=", startTimestamp + " endTimestamp=" + endTimestamp); //var historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
// <abstime name='start' val='{startTimestamp}' />
// <abstime name='end' val='{endTimestamp}' />
// <reltime name='interval' val = 'PT{dayInMonth}D' />
// </obj>";
//logger.LogInformation("【ArchiveElectricMeterMonth】startTimestamp=", startTimestamp + " endTimestamp=" + endTimestamp);
//Stopwatch stopWatch = new Stopwatch(); //Stopwatch stopWatch = new Stopwatch();
//stopWatch.Start(); //stopWatch.Start();
//抓取每個設備的資料 //抓取每個設備的資料
List<Dictionary<string, object>> electricArchiveMonthRawDatas = new List<Dictionary<string, object>>(); List<Dictionary<string, object>> electricArchiveMonthRawDatas = new List<Dictionary<string, object>>();
List<Dictionary<string, object>> waterArchiveMonthRawDatas = new List<Dictionary<string, object>>(); List<Dictionary<string, object>> waterArchiveMonthRawDatas = new List<Dictionary<string, object>>();
//收集 niagara 電錶 Data //收集 niagara 電錶 Data
procEletricMeterService.obixData_collect_range(xmlDocument, electricDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, electricArchiveMonthRawDatas); procEletricMeterService.obixData_collect_range(xmlDocument, electricDeviceNumberPoints, obixApiConfig, encoded, electricArchiveMonthRawDatas);
//水錶結果收集 //水錶結果收集
procEletricMeterService.obixData_collect_range(xmlDocument, waterDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, waterArchiveMonthRawDatas); procEletricMeterService.obixData_collect_range(xmlDocument, waterDeviceNumberPoints, obixApiConfig, encoded, waterArchiveMonthRawDatas);
//if (electricMeters.Where(e => e.Device_number == "NTPC_D8_EE_E4_RF_Total_WHT_N1").Count() == 1) //if (electricMeters.Where(e => e.Device_number == "NTPC_D8_EE_E4_RF_Total_WHT_N1").Count() == 1)
//{ //{
@ -1021,11 +1026,11 @@ namespace BackendWorkerService.Quartz.Jobs
try try
{ {
await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "Compensate", "補償機制任務開始"); await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "Compensate", "補償機制任務開始");
await procEletricMeterService.ArchiveData(); await procEletricMeterService.ArchiveData();
await task_Detail.InsertWorkTime_End("ArchiveElectricMeterDayJob", "Compensate", "任務完成"); await task_Detail.InsertWorkTime_End("ArchiveElectricMeterDayJob", "Compensate", "任務完成");
} }
catch(Exception ex) catch (Exception ex)
{ {
await task_Detail.WorkFail("ArchiveElectricMeterDayJob", "Compensate", ex.ToString()); await task_Detail.WorkFail("ArchiveElectricMeterDayJob", "Compensate", ex.ToString());
logger.LogError("【ArchiveElectricMeterDayJob】【補償機制】【任務失敗】"); logger.LogError("【ArchiveElectricMeterDayJob】【補償機制】【任務失敗】");
@ -1060,6 +1065,9 @@ namespace BackendWorkerService.Quartz.Jobs
List<Dictionary<string, object>> electericArchiveDayRawDatas = new List<Dictionary<string, object>>(); List<Dictionary<string, object>> electericArchiveDayRawDatas = new List<Dictionary<string, object>>();
List<Dictionary<string, object>> waterArchiveDayRawDatas = new List<Dictionary<string, object>>(); List<Dictionary<string, object>> waterArchiveDayRawDatas = new List<Dictionary<string, object>>();
//異常清單
Dictionary<string, string> dicError = new Dictionary<string, string>();
#region old request niagara history by obix #region old request niagara history by obix
//foreach (var deviceNumberPoint in electricDeviceNumberPoints) //foreach (var deviceNumberPoint in electricDeviceNumberPoints)
//{ //{
@ -1140,11 +1148,11 @@ namespace BackendWorkerService.Quartz.Jobs
//} //}
//電錶結果收集 //電錶結果收集
// procEletricMeterService.obixData_collect(xmlDocument, electricDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, electericArchiveDayRawDatas); // procEletricMeterService.obixData_collect(xmlDocument, electricDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, electericArchiveDayRawDatas);
procEletricMeterService.obixData_collect(xmlDocument, electricDeviceNumberPoints, obixApiConfig, encoded, electericArchiveDayRawDatas); procEletricMeterService.obixData_collect(xmlDocument, electricDeviceNumberPoints, obixApiConfig, encoded, electericArchiveDayRawDatas, ref dicError);
//水錶結果收集 //水錶結果收集
//procEletricMeterService.obixData_collect(xmlDocument, waterDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, waterArchiveDayRawDatas); //procEletricMeterService.obixData_collect(xmlDocument, waterDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, waterArchiveDayRawDatas);
procEletricMeterService.obixData_collect(xmlDocument, waterDeviceNumberPoints, obixApiConfig, encoded, waterArchiveDayRawDatas); procEletricMeterService.obixData_collect(xmlDocument, waterDeviceNumberPoints, obixApiConfig, encoded, waterArchiveDayRawDatas, ref dicError);
stopWatch.Stop(); stopWatch.Stop();
logger.LogInformation(@$"【ArchiveElectricMeterDayJob】【天歸檔】【效能檢驗】[取得資料花費時間]{stopWatch.ElapsedMilliseconds } 毫秒 資料筆數=" + electericArchiveDayRawDatas.Count() ); logger.LogInformation(@$"【ArchiveElectricMeterDayJob】【天歸檔】【效能檢驗】[取得資料花費時間]{stopWatch.ElapsedMilliseconds } 毫秒 資料筆數=" + electericArchiveDayRawDatas.Count() );
@ -1286,15 +1294,28 @@ namespace BackendWorkerService.Quartz.Jobs
END END
COMMIT TRANSACTION;"; COMMIT TRANSACTION;";
// logger.LogInformation($@"putint value NTPC_G6_EE_E4_B1F_CB3_WHT_N1 ={electricMeter.archive_lastDate} archive_lastActionDate={electricMeter.archive_lastActionDate}"); // logger.LogInformation($@"putint value NTPC_G6_EE_E4_B1F_CB3_WHT_N1 ={electricMeter.archive_lastDate} archive_lastActionDate={electricMeter.archive_lastActionDate}");
//異常設備 update
string sql2 = string.Empty;
foreach (var kv in dicError)
{
sql2 += $@"update device set archive_lastDate = '{kv.Value}' where device_number = '{kv.Key}' , archive_lastActionDate = now();";
}
if (!string.IsNullOrEmpty(sql2))
{
await backgroundServiceRepository.ExecuteSql(sql2);
}
logger.LogInformation("run sql electericArchiveDayRawDatas.Count() = " + electericArchiveDayRawDatas.Count()); logger.LogInformation("run sql electericArchiveDayRawDatas.Count() = " + electericArchiveDayRawDatas.Count());
await backgroundServiceRepository.ExecuteSql(sql, electericArchiveDayRawDatas); await backgroundServiceRepository.ExecuteSql(sql, electericArchiveDayRawDatas);
if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1") if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1")
{ {
await backgroundServiceMsSqlRepository.ExecuteSql(mySql, electericArchiveDayRawDatas); await backgroundServiceMsSqlRepository.ExecuteSql(mySql, electericArchiveDayRawDatas);
} }
} }
if (waterArchiveDayRawDatas.Count() > 0) if (waterArchiveDayRawDatas.Count() > 0)
{ {

View File

@ -22,6 +22,7 @@ using BackendWorkerService.Quartz;
using BackendWorkerService.Quartz.Jobs; using BackendWorkerService.Quartz.Jobs;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.Pkcs;
using NPOI.SS.Formula.Functions;
namespace BackendWorkerService.Services.Implement namespace BackendWorkerService.Services.Implement
{ {
@ -55,7 +56,8 @@ namespace BackendWorkerService.Services.Implement
XmlDocument xmlDocument = new XmlDocument(); XmlDocument xmlDocument = new XmlDocument();
var obixApiConfig = new ObixApiConfig(); var obixApiConfig = new ObixApiConfig();
string encoded = string.Empty; string encoded = string.Empty;
//異常清單
Dictionary<string, string> dicError = new Dictionary<string, string>();
try try
{ {
//取得可錯誤次數 //取得可錯誤次數
@ -377,7 +379,7 @@ namespace BackendWorkerService.Services.Implement
if (archiveDayJsonResult.ContainsKey("obj")) //表示可以讀取到內容 if (archiveDayJsonResult.ContainsKey("obj")) //表示可以讀取到內容
{ {
var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveDayJsonResult); var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveDayJsonResult, ref dicError);
if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0)
{ {
electricArchiveDayRawDatas.AddRange(ArrangeRawDatas); electricArchiveDayRawDatas.AddRange(ArrangeRawDatas);
@ -524,7 +526,7 @@ namespace BackendWorkerService.Services.Implement
if (archiveDayJsonResult.ContainsKey("obj")) //表示可以讀取到內容 if (archiveDayJsonResult.ContainsKey("obj")) //表示可以讀取到內容
{ {
var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveDayJsonResult); var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveDayJsonResult, ref dicError);
if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0)
{ {
waterArchiveDayRawDatas.AddRange(ArrangeRawDatas); waterArchiveDayRawDatas.AddRange(ArrangeRawDatas);
@ -624,7 +626,7 @@ namespace BackendWorkerService.Services.Implement
if (archiveWeekJsonResult.ContainsKey("obj")) //表示可以讀取到內容 if (archiveWeekJsonResult.ContainsKey("obj")) //表示可以讀取到內容
{ {
var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveWeekJsonResult); var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveWeekJsonResult, ref dicError);
if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0)
{ {
electricArchiveWeekRawDatas.AddRange(ArrangeRawDatas); electricArchiveWeekRawDatas.AddRange(ArrangeRawDatas);
@ -715,7 +717,7 @@ namespace BackendWorkerService.Services.Implement
if (archiveWeekJsonResult.ContainsKey("obj")) //表示可以讀取到內容 if (archiveWeekJsonResult.ContainsKey("obj")) //表示可以讀取到內容
{ {
var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveWeekJsonResult); var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveWeekJsonResult, ref dicError);
if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0)
{ {
waterArchiveWeekRawDatas.AddRange(ArrangeRawDatas); waterArchiveWeekRawDatas.AddRange(ArrangeRawDatas);
@ -956,7 +958,7 @@ namespace BackendWorkerService.Services.Implement
/// <param name="endTimestamp"></param> /// <param name="endTimestamp"></param>
/// <param name="historyQueryFilter"></param> /// <param name="historyQueryFilter"></param>
/// <param name="waterArchiveDayRawDatas"></param> /// <param name="waterArchiveDayRawDatas"></param>
public void obixData_collect(XmlDocument xmlDocument, List<DeviceNumberPoint> DeviceNumberPoints, ObixApiConfig obixApiConfig, string encoded, List<Dictionary<string, object>> resultArchiveDayRawDatas) public void obixData_collect(XmlDocument xmlDocument, List<DeviceNumberPoint> DeviceNumberPoints, ObixApiConfig obixApiConfig, string encoded, List<Dictionary<string, object>> resultArchiveDayRawDatas, ref Dictionary<string, string> dicError)
{ {
#region save to DB start #region save to DB start
@ -975,16 +977,7 @@ namespace BackendWorkerService.Services.Implement
var startDay = string.Format("{0}T00:00:00.000+08:00", deviceNumberPoint.archive_lastDate.ToString("yyyy-MM-dd").Replace(" ", "T")); var startDay = string.Format("{0}T00:00:00.000+08:00", deviceNumberPoint.archive_lastDate.ToString("yyyy-MM-dd").Replace(" ", "T"));
var endDay = System.DateTime.Now.ToString("yyyy-MM-dd"); var endDay = System.DateTime.Now.ToString("yyyy-MM-dd");
//var endTimestamp = string.Format("{0}+08:00", error_day.End_timestamp.Replace(" ", "T"));
//if (DateTime.Parse(startTimestamp).ToString("yyyy-MM-dd") == DateTime.Parse(endTimestamp).ToString("yyyy-MM-dd"))
//{
// //同一天為 舊有格式 採用 endtime
// endDay = string.Format("{0}T00:00:10.000+08:00", DateTime.Parse(endTimestamp).AddDays(1).ToString("yyyy-MM-dd").Replace(" ", "T"));
//}
//else
//{ //不同天為新格式 採用 Start_timestamp
// endDay = string.Format("{0}T00:00:10.000+08:00", DateTime.Parse(endDay).AddDays(1).ToString("yyyy-MM-dd").Replace(" ", "T"));
//}
logger.LogInformation($@"before startDay = {startDay} endDay={endDay}"); // ----------- log logger.LogInformation($@"before startDay = {startDay} endDay={endDay}"); // ----------- log
#region #region
@ -1003,8 +996,8 @@ namespace BackendWorkerService.Services.Implement
string historyQueryFilter = $@"<obj is='obix: HistoryFilter'> string historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
<abstime name='start' val='{startDay}' /> <abstime name='start' val='{sDay}' />
<abstime name='end' val='{endDay}' /> <abstime name='end' val='{eDay}' />
<reltime name='interval' val = 'PT2D' /> <reltime name='interval' val = 'PT2D' />
</obj>"; </obj>";
string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "");
@ -1039,10 +1032,10 @@ namespace BackendWorkerService.Services.Implement
xmlDocument.LoadXml(archiveResponseContent); xmlDocument.LoadXml(archiveResponseContent);
var archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); var archiveJson = JsonConvert.SerializeXmlNode(xmlDocument);
var archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); var archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson);
if (device_number == "NTPC_G6_EE_E4_B1F_CB3_WHT_N1") //if (device_number == "NTPC_G6_EE_E4_B1F_CB3_WHT_N1_KWH")
{ //{
logger.LogError("obixData_collect - NTPC_G6_EE_E4_B1F_CB3_WHT_N1 json = " + archiveJsonResult); // logger.LogError("obixData_collect - NTPC_G6_EE_E4_B1F_CB3_WHT_N1_KWH json = " + archiveJsonResult);
} //}
if (archiveJsonResult.ContainsKey("err")) //抓取錯誤 if (archiveJsonResult.ContainsKey("err")) //抓取錯誤
{ {
//logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【取得資料失敗】"); //logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【取得資料失敗】");
@ -1065,41 +1058,86 @@ namespace BackendWorkerService.Services.Implement
archiveDayRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); archiveDayRawData.Add("@updated_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
resultArchiveDayRawDatas.Add(archiveDayRawData); resultArchiveDayRawDatas.Add(archiveDayRawData);
if (!dicError.ContainsKey(deviceNumberPoint.DeviceNumber))
{
dicError.Add(deviceNumberPoint.DeviceNumber, day.ToString("yyyy-MM-dd")); //記錄異常設備與日期
}
} }
if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容 if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容
{ {
logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【OK】{0}", archiveJsonResult); //logger.LogInformation("【ArchiveElectricMeterDayJob】【天歸檔】【OK】{0}", archiveJsonResult);
var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult);
var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult, ref dicError); // <-- 解析內容中 也有判斷是否 max == 0 的收集
if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0)
{ {
logger.LogInformation(@$"obix result {deviceNumberPoint.DeviceNumber} day = {day.ToString("yyyy-MM-dd")} ArrangeRawDatas.count() = {ArrangeRawDatas.Count().ToString()}"); logger.LogInformation(@$"obix result {deviceNumberPoint.DeviceNumber} day = {day.ToString("yyyy-MM-dd")} ArrangeRawDatas.count() = {ArrangeRawDatas.Count().ToString()}");
resultArchiveDayRawDatas.AddRange(ArrangeRawDatas); resultArchiveDayRawDatas.AddRange(ArrangeRawDatas);
} }
} else {
if (!dicError.ContainsKey(deviceNumberPoint.DeviceNumber))
{
dicError.Add(deviceNumberPoint.DeviceNumber, day.ToString("yyyy-MM-dd")); //記錄異常設備與日期
}
}
}
} }
#endregion #endregion
} }
#endregion save to DB end #endregion save to DB end
// string funish = string.Empty;
} }
public void obixData_collect_range(XmlDocument xmlDocument, List<DeviceNumberPoint> DeviceNumberPoints, ObixApiConfig obixApiConfig, string encoded, string startTimestamp, string endTimestamp, string historyQueryFilter, List<Dictionary<string, object>> resultArchiveDayRawDatas) public void obixData_collect_range(XmlDocument xmlDocument, List<DeviceNumberPoint> DeviceNumberPoints, ObixApiConfig obixApiConfig, string encoded, List<Dictionary<string, object>> resultArchiveDayRawDatas)
{ {
//異常清單
Dictionary<string, string> dicError = new Dictionary<string, string>(); //僅需要記錄在 day 此處不需要
#region save to DB start #region save to DB start
// 需要先 group by DeviceNumberPoints 因為已經展開日期 // 需要先 group by DeviceNumberPoints 因為已經展開日期
var DevicePoints = DeviceNumberPoints //var DevicePoints = DeviceNumberPoints
.GroupBy(x => new { _FullDeviceNumberPoint = x.FullDeviceNumberPoint }) // .GroupBy(x => new { _FullDeviceNumberPoint = x.FullDeviceNumberPoint })
.Select(x => new DeviceNumberPoint { FullDeviceNumberPoint = x.Key._FullDeviceNumberPoint }).ToList(); // .Select(x => new DeviceNumberPoint { FullDeviceNumberPoint = x.Key._FullDeviceNumberPoint }).ToList();
logger.LogInformation($@"before groupby DeviceNumberPoints.Count() = {DeviceNumberPoints.Count().ToString()} after DevicePoints.Count() = {DevicePoints.Count().ToString()}"); // ----------- log //logger.LogInformation($@"before groupby DeviceNumberPoints.Count() = {DeviceNumberPoints.Count().ToString()} after DevicePoints.Count() = {DevicePoints.Count().ToString()}"); // ----------- log
// string last_deviceNumber = string.Empty;
foreach (var deviceNumberPoint in DeviceNumberPoints)
{
//if (string.IsNullOrEmpty(last_deviceNumber)) last_deviceNumber = deviceNumberPoint.DeviceNumber;
//if (deviceNumberPoint.DeviceNumber == "NTPC_G6_EE_E4_B1F_CB3_WHT_N1")
//{
// logger.LogInformation($@"s1 devie_number = NTPC_G6_EE_E4_B1F_CB3_WHT_N1 archive_lastDate={deviceNumberPoint.archive_lastDate}");
//}
//if (deviceNumberPoint.archive_lastDate.ToString("yyyy-MM-dd") == DateTime.Now.ToString("yyyy-MM-dd"))
//{
// logger.LogInformation($@" foreach (var deviceNumberPoint in DeviceNumberPoints) 判斷為今天 不用跑 deviceNumberPoint.archive_lastDate = {deviceNumberPoint.archive_lastDate} "); // ----------- log
// continue; //如果是今天 就不要用歸檔了
//}
foreach (var deviceNumberPoint in DevicePoints) var startDay = deviceNumberPoint.archive_lastDate.ToString("yyyy-MM-dd");
{ var endDay = DateTime.Now.ToString("yyyy-MM-dd");
logger.LogInformation($@"before startDay = {startDay} endDay={endDay}"); // ----------- log
#region #region
// foreach (DateTime day in EachDay(startDay, endDay)) 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;
var startTimestamp = string.Format("{0}T00:00:00.000+08:00", day.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 historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
<abstime name='start' val='{startTimestamp}' />
<abstime name='end' val='{endTimestamp}' />
<reltime name='interval' val = 'PT{dayInMonth}D' />
</obj>";
logger.LogInformation("【ArchiveElectricMeterMonth】startTimestamp=", startTimestamp + " endTimestamp=" + endTimestamp);
string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "");
var station = backgroundServiceRepository.GetOneAsync<string>($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and var station = backgroundServiceRepository.GetOneAsync<string>($@"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]}' device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}'
@ -1157,20 +1195,20 @@ namespace BackendWorkerService.Services.Implement
if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容 if (archiveJsonResult.ContainsKey("obj")) //表示可以讀取到內容
{ {
var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult); var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveJsonResult, ref dicError);
if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0) if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0)
{ {
resultArchiveDayRawDatas.AddRange(ArrangeRawDatas); resultArchiveDayRawDatas.AddRange(ArrangeRawDatas);
} }
} }
//} }
#endregion #endregion
} }
#endregion save to DB end #endregion save to DB end
} }
private List<Dictionary<string, object>> ArrangeRawData(DeviceNumberPoint deviceNumberPoint, JObject jsonResult) private List<Dictionary<string, object>> ArrangeRawData(DeviceNumberPoint deviceNumberPoint, JObject jsonResult, ref Dictionary<string, string> dicError)
{ {
List<Dictionary<string, object>> arrangeRawDatas = new List<Dictionary<string, object>>(); List<Dictionary<string, object>> arrangeRawDatas = new List<Dictionary<string, object>>();
var histories = jsonResult["obj"]["list"]; var histories = jsonResult["obj"]["list"];
@ -1233,6 +1271,16 @@ namespace BackendWorkerService.Services.Implement
case "max": case "max":
var max = Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float); var max = Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float);
arrangeRawData.Add("@max_rawdata", max); arrangeRawData.Add("@max_rawdata", max);
//add by jiahao 2023-09-26
//if (max == 0)
//{
// if (!dicError.ContainsKey(deviceNumberPoint.DeviceNumber))
// {
// dicError.Add(deviceNumberPoint.DeviceNumber, arrangeRawData["@start_timestamp"].ToString()); //記錄異常設備與日期
// }
//}
break; break;
case "avg": case "avg":
var avg = Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float); var avg = Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float);
@ -1301,6 +1349,16 @@ namespace BackendWorkerService.Services.Implement
case "max": case "max":
var max = Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float); var max = Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float);
arrangeRawData.Add("@max_rawdata", max); arrangeRawData.Add("@max_rawdata", max);
//add by jiahao 2023-09-26
//if (max == 0)
//{
// if (!dicError.ContainsKey(deviceNumberPoint.DeviceNumber))
// {
// dicError.Add(deviceNumberPoint.DeviceNumber, arrangeRawData["@start_timestamp"].ToString()); //記錄異常設備與日期
// }
//}
break; break;
case "avg": case "avg":
var avg = Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float); var avg = Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float);
@ -1334,17 +1392,20 @@ namespace BackendWorkerService.Services.Implement
/// <param name="thru"></param> /// <param name="thru"></param>
/// <returns></returns> /// <returns></returns>
public IEnumerable<DateTime> EachDay(string from, string thru) public IEnumerable<DateTime> EachDay(string from, string thru)
{ {
var strtday = DateTime.Parse(from); var strtday = DateTime.Parse(from).AddDays(-1); //每次重做 2天
var endday = DateTime.Parse(thru); var endday = DateTime.Parse(thru);
for (var day = strtday.Date; day.Date <= endday.Date; day = day.AddDays(1)) for (var day = strtday.Date; day.Date <= endday.Date; day = day.AddDays(1))
yield return day; yield return day;
}
public IEnumerable<DateTime> 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.AddMonths(1))
yield return _month;
/// 使用方式
//foreach (DateTime day in EachDay(DateTime.Parse(date1), DateTime.Parse(date2)))
//{
//}
} }
} }

View File

@ -27,7 +27,8 @@
//"Database": "IgYBsgG2VLKKxFb64j7LOA==", //wsp //"Database": "IgYBsgG2VLKKxFb64j7LOA==", //wsp
//"Database": "7gWfmZ28HGIJZbxEbK+0yg==", //tpe_dome_dome //"Database": "7gWfmZ28HGIJZbxEbK+0yg==", //tpe_dome_dome
//"Database": "siTUcDaC/g2yGTMFWD72Kg==", //tpe_dome_hotel //"Database": "siTUcDaC/g2yGTMFWD72Kg==", //tpe_dome_hotel
"Database": "Rq7Gn4x6LwBvVtl7GY8LbA==", //mcut //"Database": "Rq7Gn4x6LwBvVtl7GY8LbA==", //mcut
"Database": "j9LOmjFh2/9PpuwnVB8ugqnKdBDJHx1AAT7aTWeh37E=", //ibms_mcut_online
"Root": "SzdxEgaJJ7tcTCrUl2zKsA==", "Root": "SzdxEgaJJ7tcTCrUl2zKsA==",
"Password": "FVAPxztxpY4gJJKQ/se4bQ==" "Password": "FVAPxztxpY4gJJKQ/se4bQ=="
}, },

View File

@ -978,12 +978,12 @@ namespace FrontendWebApi.ApiControllers
int columnIndex = 1; // 假設第一欄是要填入的位置 int columnIndex = 1; // 假設第一欄是要填入的位置
List<string> need_cal_total = new List<string> List<string> need_cal_total = new List<string>
{ {
"綜合大樓", "綜合大樓", //G6
"體育舘", "體育舘", //F5
"化工電機", "化工電機", //D8
"創新大樓", "創新大樓", //G9
"學人會館", "學人會館", //B9
"綠能中心" "綠能中心" //$340B9
}; };
List<string> no_cal_sum_device = new List<string> List<string> no_cal_sum_device = new List<string>
{ {
@ -992,7 +992,7 @@ namespace FrontendWebApi.ApiControllers
"第二校區總盤", "第二校區總盤",
"薄膜分盤" "薄膜分盤"
}; };
List<string> need_green_device = new List<string> List<string> need_green_device = new List<string> //需要綠色底色
{ {
"第一校區總盤", "第一校區總盤",
"圖資大樓總盤", "圖資大樓總盤",
@ -1000,8 +1000,8 @@ namespace FrontendWebApi.ApiControllers
"電子館分盤", "電子館分盤",
"機械館分盤", "機械館分盤",
"電機館分盤", "電機館分盤",
"學1-4舍空調總盤", "學1-4舍餐廳總盤", //C7
"學五舍五眷總盤", "學5舍5眷總盤", //B4
"8眷舍分盤", "8眷舍分盤",
"企教分盤", "企教分盤",
"7眷舍分盤", "7眷舍分盤",
@ -1017,6 +1017,14 @@ namespace FrontendWebApi.ApiControllers
#region #region
foreach (var item in result) foreach (var item in result)
{ {
if (item.device_full_name == "NTPC_B4_EE_E4_B1F_VCB3B_WHT_N1") //學5舍5眷總盤
{
Console.WriteLine("here 學5舍5眷總盤 " + item.building_name);
if (item.building_name == "學5舍5眷總盤")
{
Console.WriteLine("here 學5舍5眷總盤 " + item.building_name);
}
}
if (!need_cal_total.Contains(item.building_name)) if (!need_cal_total.Contains(item.building_name))
{ {
continue; continue;
@ -1115,7 +1123,19 @@ namespace FrontendWebApi.ApiControllers
columnIndex++; columnIndex++;
cell = row.GetCell(columnIndex++) ?? row.CreateCell(columnIndex++); cell = row.GetCell(columnIndex++) ?? row.CreateCell(columnIndex++);
cell.SetCellValue(last_build + "總計");
if (last_build == "化工電機")
{
cell.SetCellValue("化工館總計");
}
else if (last_build == "學人會館")
{
cell.SetCellValue("學人國際總計");
}
else {
cell.SetCellValue(last_build + "總計");
}
cell.CellStyle = greenCellStyle; cell.CellStyle = greenCellStyle;
foreach (var timeStampData in buildingSumData[last_build]) foreach (var timeStampData in buildingSumData[last_build])
@ -1287,8 +1307,8 @@ order by e.report_priority, a.priority";
"電子館分盤", "電子館分盤",
"機械館分盤", "機械館分盤",
"電機館分盤", "電機館分盤",
"學1-4舍空調總盤", "學1-4舍餐廳總盤",
"學五舍五眷總盤", "學5舍5眷總盤",
"8眷舍分盤", "8眷舍分盤",
"企教分盤", "企教分盤",
"7眷舍分盤", "7眷舍分盤",
@ -1307,10 +1327,15 @@ order by e.report_priority, a.priority";
foreach (var l in ResultData) foreach (var l in ResultData)
{ {
var full_name = await backendRepository.GetOneAsync<string>($"select full_name from device where device_number = '{l.device_number}'"); var full_name = await backendRepository.GetOneAsync<string>($"select full_name from device where device_number = '{l.device_number}'");
//if (l.device_number == "NTPC_B4_EE_E4_B1F_VCB3B_WHT_N1")//"學5舍5眷總盤"
//{
// Console.WriteLine("here " + l.device_full_name);
//}
if (input.Mode == HydroMeterInputSearchMode.Custom && !need_green_device.Contains(full_name)) if (input.Mode == HydroMeterInputSearchMode.Custom && !need_green_device.Contains(full_name))
{ {
continue; continue;
} }
l.rawData = new List<HydroMeterRawDataOutput>(); l.rawData = new List<HydroMeterRawDataOutput>();
@ -1386,11 +1411,11 @@ order by e.report_priority, a.priority";
apiResult.Code = "0000"; apiResult.Code = "0000";
if (input.Mode == HydroMeterInputSearchMode.All) if (input.Mode == HydroMeterInputSearchMode.All)
{ {
apiResult.Data = ResultData; apiResult.Data = ResultData; //含分盤
} }
else else
{ {
apiResult.Data = ResultData_custom; apiResult.Data = ResultData_custom; //不含分盤
} }
} }
catch (Exception exception) catch (Exception exception)

View File

@ -22,7 +22,7 @@
//"Database": "siTUcDaC/g2yGTMFWD72Kg==", //tpe_dome_hotel //"Database": "siTUcDaC/g2yGTMFWD72Kg==", //tpe_dome_hotel
//"Database": "iuaY0h0+TWkir44/eZLDqw==", //tpe_dome_office //"Database": "iuaY0h0+TWkir44/eZLDqw==", //tpe_dome_office
//"Database": "Rq7Gn4x6LwBvVtl7GY8LbA==", //MCUT //"Database": "Rq7Gn4x6LwBvVtl7GY8LbA==", //MCUT
"Database": "j9LOmjFh2/9PpuwnVB8ugqnKdBDJHx1AAT7aTWeh37E=", "Database": "j9LOmjFh2/9PpuwnVB8ugqnKdBDJHx1AAT7aTWeh37E=", // ibms_mcut_online
"Root": "SzdxEgaJJ7tcTCrUl2zKsA==", "Root": "SzdxEgaJJ7tcTCrUl2zKsA==",
"Password": "FVAPxztxpY4gJJKQ/se4bQ==" "Password": "FVAPxztxpY4gJJKQ/se4bQ=="
} }