2022-10-14 16:08:54 +08:00
using Backend.Models ;
using BackendWorkerService.Services.Implement ;
2023-05-04 16:45:05 +08:00
using Dapper ;
2023-09-18 01:49:00 +08:00
using Microsoft.AspNetCore.Mvc ;
2022-10-14 16:08:54 +08:00
using Microsoft.Extensions.Configuration ;
using Microsoft.Extensions.Logging ;
using Microsoft.Extensions.Options ;
2023-11-28 23:48:37 +08:00
using MySqlX.XDevAPI.Relational ;
2022-10-14 16:08:54 +08:00
using Newtonsoft.Json ;
using Newtonsoft.Json.Linq ;
2023-09-18 01:49:00 +08:00
using NPOI.SS.Formula.Functions ;
2022-10-14 16:08:54 +08:00
using Quartz ;
2023-07-24 12:45:11 +08:00
using Repository.BackendRepository.Implement ;
2022-10-14 16:08:54 +08:00
using Repository.BackendRepository.Interface ;
using Repository.Helper ;
using System ;
using System.Collections.Generic ;
using System.Diagnostics ;
using System.IO ;
using System.Linq ;
using System.Net ;
using System.Text ;
using System.Threading.Tasks ;
using System.Xml ;
namespace BackendWorkerService.Quartz.Jobs
{
[DisallowConcurrentExecution]
class ArchiveElectricMeterDayJob : IJob
{
private readonly ILogger < ArchiveElectricMeterDayJob > logger ;
private readonly IBackgroundServiceRepository backgroundServiceRepository ;
2023-05-04 16:45:05 +08:00
private readonly IBackgroundServiceMsSqlRepository backgroundServiceMsSqlRepository ;
2022-10-14 16:08:54 +08:00
protected readonly IDatabaseHelper _databaseHelper ;
private readonly ILogger < Task_Detail > loggers ;
2023-09-18 01:49:00 +08:00
private readonly ILogger < ProcEletricMeterService > logger2 ;
2022-10-14 16:08:54 +08:00
public ArchiveElectricMeterDayJob (
ILogger < ArchiveElectricMeterDayJob > logger ,
IBackgroundServiceRepository backgroundServiceRepository ,
2023-05-04 16:45:05 +08:00
IBackgroundServiceMsSqlRepository backgroundServiceMySqlRepository ,
2023-09-18 01:49:00 +08:00
IDatabaseHelper databaseHelper , ILogger < Task_Detail > loggers , IBackendRepository backendRepository , ILogger < ProcEletricMeterService > logger2 )
2022-10-14 16:08:54 +08:00
{
this . logger = logger ;
this . backgroundServiceRepository = backgroundServiceRepository ;
2023-05-04 16:45:05 +08:00
this . backgroundServiceMsSqlRepository = backgroundServiceMySqlRepository ;
2022-10-14 16:08:54 +08:00
this . _databaseHelper = databaseHelper ;
this . loggers = loggers ;
2023-09-18 01:49:00 +08:00
this . logger2 = logger2 ;
2022-10-14 16:08:54 +08:00
}
public async Task Execute ( IJobExecutionContext context )
{
Task_Detail task_Detail = new Task_Detail ( loggers , backgroundServiceRepository ) ;
2023-09-18 01:49:00 +08:00
ProcEletricMeterService procEletricMeterService = new ProcEletricMeterService ( logger2 , backgroundServiceRepository , backgroundServiceMsSqlRepository ) ;
2023-07-14 12:25:46 +08:00
string device_number = string . Empty ;
2022-10-14 16:08:54 +08:00
try
{
2023-09-18 01:49:00 +08:00
//依據 variable 中的設定,現在是否需要執行
2022-10-14 16:08:54 +08:00
if ( await task_Detail . GetNeedWorkTask ( "ArchiveElectricMeterDayJob" , "All" ) )
{
await task_Detail . InsertWorkTime ( "ArchiveElectricMeterDayJob" , "All" , "任務開始" ) ;
EDFunction ed = new EDFunction ( ) ;
XmlDocument xmlDocument = new XmlDocument ( ) ;
2023-06-07 12:18:46 +08:00
ServicePointManager . DefaultConnectionLimit = 10 ;
2022-10-14 16:08:54 +08:00
var sqlArchive = $@"SELECT system_value as Value, system_key as Name FROM variable WHERE deleted = 0 AND system_type = 'archiveConfig'" ;
2023-05-29 16:21:41 +08:00
var saveToMSDB = await backgroundServiceRepository . GetOneAsync < string > ( "select system_value from variable where system_type = 'save_to_ms_db' and deleted = 0" ) ;
2022-10-14 16:08:54 +08:00
var variableArchive = await backgroundServiceRepository . GetAllAsync < KeyValue > ( sqlArchive ) ;
2023-09-18 01:49:00 +08:00
//取得 電表(E4) 水錶(W1)的小類代號
2022-10-14 16:08:54 +08:00
var electricMeterGuid = variableArchive . Where ( x = > x . Name = = "ElectricMeterGuid" ) . Select ( x = > x . Value ) . FirstOrDefault ( ) ;
2023-05-10 18:06:02 +08:00
var waterMeterGuid = variableArchive . Where ( x = > x . Name = = "WaterMeterGuid" ) . Select ( x = > x . Value ) . FirstOrDefault ( ) ;
2023-09-18 01:49:00 +08:00
// 獲取每棟的 station 與 代號 ex: [M_G6001, G6] , [M_8F5001, $38F5], [M_G5001,G5]
2023-06-29 11:21:36 +08:00
var buildingStation = await backgroundServiceRepository . GetAllAsync < BuildStation > ( "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)" ) ;
2022-10-14 16:08:54 +08:00
2023-06-07 12:18:46 +08:00
#region http variable
HttpWebRequest archiveRequest = null ;
HttpWebResponse archiveResponse = null ;
string archiveResponseContent = null ;
string archiveJson = null ;
JObject archiveJsonResult = new JObject ( ) ;
#endregion
2023-09-24 20:44:30 +08:00
#region 找 出 所 有 電 錶 設 備 與 前 次 成 功 日 期
var sWhere_E4 = @ $"device_name_tag = '{electricMeterGuid}' and deleted = 0 " ;
var sWhere_W1 = @ $"device_name_tag = '{waterMeterGuid}' and deleted = 0 " ;
2023-09-18 01:49:00 +08:00
var electricMeters = await backgroundServiceRepository . GetAllAsync < Device > ( "device" , sWhere_E4 ) ;
var waterMeters = await backgroundServiceRepository . GetAllAsync < Device > ( "device" , sWhere_W1 ) ;
2023-09-24 20:44:30 +08:00
2023-09-25 11:47:19 +08:00
//var device_test = electricMeters.Where(e => e.Device_number == "NTPC_G6_EE_E4_B1F_CB3_WHT_N1").First();
//if (device_test != null)
//{
// logger.LogInformation($@"s1 devie_number = NTPC_G6_EE_E4_B1F_CB3_WHT_N1 archive_lastActionDate={device_test.archive_lastActionDate} archive_lastDate={device_test.archive_lastDate}");
//}
2022-10-14 16:08:54 +08:00
#endregion 找 出 所 有 電 錶 設 備
#region 找 出 所 有 電 錶 系 統 的 點 位
2023-09-18 01:49:00 +08:00
var sPointWhere = "is_needArchive = 1 and deleted = 0 AND device_name_tag = @sub_system_guid" ;
2023-05-10 18:06:02 +08:00
var electricPoints = await backgroundServiceRepository . GetAllAsync < Device_item > ( "device_item" , sPointWhere , new { sub_system_guid = electricMeterGuid } ) ;
var waterPoints = await backgroundServiceRepository . GetAllAsync < Device_item > ( "device_item" , sPointWhere , new { sub_system_guid = waterMeterGuid } ) ;
2022-10-14 16:08:54 +08:00
#endregion 找 出 所 有 電 錶 系 統 的 點 位
#region 組 合 出 所 有 電 錶 設 備 點 位
2023-05-10 18:06:02 +08:00
List < DeviceNumberPoint > electricDeviceNumberPoints = new List < DeviceNumberPoint > ( ) ;
2022-10-14 16:08:54 +08:00
foreach ( var electricMeter in electricMeters )
{
2023-05-10 18:06:02 +08:00
foreach ( var point in electricPoints )
2022-10-14 16:08:54 +08:00
{
2023-06-07 16:45:00 +08:00
if ( electricMeter . device_building_tag = = point . device_building_tag )
{
2023-09-25 11:47:19 +08:00
if ( electricMeter . Device_number = = "NTPC_G6_EE_E4_B1F_CB3_WHT_N1" )
{
logger . LogInformation ( $@"putin value NTPC_G6_EE_E4_B1F_CB3_WHT_N1 ={electricMeter.archive_lastDate} archive_lastActionDate={electricMeter.archive_lastActionDate}" ) ;
}
2023-06-07 16:45:00 +08:00
DeviceNumberPoint deviceNumberPoint = new DeviceNumberPoint ( ) ;
deviceNumberPoint . DeviceNumber = electricMeter . Device_number ;
deviceNumberPoint . Point = point . points ;
deviceNumberPoint . FullDeviceNumberPoint = string . Format ( "{0}_{1}" , electricMeter . Device_number , point . points ) ;
2023-09-24 20:44:30 +08:00
deviceNumberPoint . archive_lastDate = electricMeter . archive_lastDate ;
2023-06-07 16:45:00 +08:00
electricDeviceNumberPoints . Add ( deviceNumberPoint ) ;
}
2023-05-10 18:06:02 +08:00
}
}
#endregion 組 合 出 所 有 電 錶 設 備 點 位
#region 組 合 出 所 有 水 錶 設 備 點 位
List < DeviceNumberPoint > waterDeviceNumberPoints = new List < DeviceNumberPoint > ( ) ;
foreach ( var waterMeter in waterMeters )
{
foreach ( var point in waterPoints )
{
2023-06-07 16:45:00 +08:00
if ( waterMeter . device_building_tag = = point . device_building_tag )
{
DeviceNumberPoint deviceNumberPoint = new DeviceNumberPoint ( ) ;
deviceNumberPoint . DeviceNumber = waterMeter . Device_number ;
deviceNumberPoint . Point = point . points ;
deviceNumberPoint . FullDeviceNumberPoint = string . Format ( "{0}_{1}" , waterMeter . Device_number , point . points ) ;
2023-09-25 11:47:19 +08:00
deviceNumberPoint . archive_lastDate = waterMeter . archive_lastDate ;
2023-06-07 16:45:00 +08:00
waterDeviceNumberPoints . Add ( deviceNumberPoint ) ;
}
2022-10-14 16:08:54 +08:00
}
}
#endregion 組 合 出 所 有 電 錶 設 備 點 位
#region 取 得 obix 設 定
var obixApiConfig = new ObixApiConfig ( ) ;
var sqlObix = $@"SELECT system_value as Value, system_key as Name FROM variable WHERE deleted = 0 AND system_type = 'obixConfig'" ;
var variableObix = await backgroundServiceRepository . GetAllAsync < KeyValue > ( sqlObix ) ;
obixApiConfig . ApiBase = variableObix . Where ( x = > x . Name = = "ApiBase" ) . Select ( x = > x . Value ) . FirstOrDefault ( ) ;
obixApiConfig . UserName = ed . AESDecrypt ( variableObix . Where ( x = > x . Name = = "UserName" ) . Select ( x = > x . Value ) . FirstOrDefault ( ) ) ;
obixApiConfig . Password = ed . AESDecrypt ( variableObix . Where ( x = > x . Name = = "Password" ) . Select ( x = > x . Value ) . FirstOrDefault ( ) ) ;
String encoded = System . Convert . ToBase64String ( System . Text . Encoding . GetEncoding ( "ISO-8859-1" ) . GetBytes ( obixApiConfig . UserName + ":" + obixApiConfig . Password ) ) ;
2023-09-24 20:44:30 +08:00
#endregion 取 得 obix 設 定
2022-10-14 16:08:54 +08:00
#region 天 歸 檔
2023-09-18 01:49:00 +08:00
if ( ! await task_Detail . GetNeedWorkTask ( "ArchiveElectricMeterDayJob" , "Day" ) )
{
}
else
2022-10-14 16:08:54 +08:00
{
2023-09-24 20:44:30 +08:00
//記錄本次作業時間 於 task_detal.lastwork_time
await task_Detail . InsertWorkTime ( "ArchiveElectricMeterDayJob" , "Day" , "水電表 day 任務開始" ) ;
2023-09-18 01:49:00 +08:00
2023-09-24 20:44:30 +08:00
#region 從 前 次 成 功 日 期 到 昨 天 為 止
var actionDay = DateTime . Now ; // -- 改為 指定日期 --
var startDay = actionDay . AddDays ( - 1 ) ; //開始日期
var endDay = actionDay ; //結束日期
2022-10-14 16:08:54 +08:00
2023-09-24 20:44:30 +08:00
var dbDateName = startDay . Year . ToString ( ) . PadLeft ( 4 , '0' ) + startDay . Month . ToString ( ) . PadLeft ( 2 , '0' ) ;
//Create 歸檔用 table
initWork ( dbDateName ) ;
2022-10-14 16:08:54 +08:00
2023-09-24 20:44:30 +08:00
try
{
//foreach (var electricMeter in electricMeters)
2023-09-18 01:49:00 +08:00
//{
2023-09-25 11:47:19 +08:00
// startDay = DateTime.Parse(electricMeter.archive_lastDate.ToString("yyyy-MM-dd"));// 起始日
//endDay = DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")); // 結束日
//foreach (DateTime day in procEletricMeterService.EachDay(startDay, endDay))
//{
// logger.LogInformation(@$"【EachDay】{electricMeter.Device_number} startDay=", startDay + " endDay=" + endDay);
// if (electricMeter.Device_number == "NTPC_G6_EE_E4_B1F_CB3_WHT_N1")
// {
// logger.LogInformation($@"EachDay devie_number = NTPC_G6_EE_E4_B1F_CB3_WHT_N1 startDay={startDay} endDay={endDay}");
// }
logger . LogInformation ( $@"before day_proc electricDeviceNumberPoints.Count() ={electricDeviceNumberPoints.Count()} " ) ;
// 每日資料製作
await day_proc ( procEletricMeterService , saveToMSDB , archiveResponse , electricDeviceNumberPoints , waterDeviceNumberPoints , obixApiConfig , encoded , startDay , endDay , dbDateName ) ;
2024-02-05 07:20:30 +08:00
//}
2023-09-24 20:44:30 +08:00
//}
2023-09-27 01:37:25 +08:00
await task_Detail . InsertWorkTime_End ( "ArchiveElectricMeterDayJob" , "Day" , "任務完成0927" ) ;
2022-10-14 16:08:54 +08:00
}
catch ( Exception exception )
{
await task_Detail . WorkFail ( "ArchiveElectricMeterDayJob" , "Day" , exception . ToString ( ) ) ;
logger . LogError ( "【ArchiveElectricMeterDayJob】【天歸檔】【任務失敗】" ) ;
2023-07-20 10:08:50 +08:00
logger . LogError ( "【ArchiveElectricMeterDayJob】【天歸檔】【任務失敗】[Exception]: {0}" , exception . ToString ( ) ) ;
2022-10-14 16:08:54 +08:00
}
2023-06-07 12:18:46 +08:00
finally
{
if ( archiveResponse ! = null )
{
archiveResponse . Dispose ( ) ;
archiveResponse . Close ( ) ;
}
}
2024-02-05 07:20:30 +08:00
#endregion
2022-10-14 16:08:54 +08:00
}
2023-09-18 01:49:00 +08:00
2022-10-14 16:08:54 +08:00
#endregion 天 歸 檔
#region 週 歸 檔
2023-09-19 18:41:55 +08:00
//if (await task_Detail.GetNeedWorkTask("ArchiveElectricMeterDayJob", "Week"))
//{
// try
// {
// await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "Week", "水電表周任務開始");
// int week = Convert.ToInt32(actionDay.DayOfWeek);
// week = week == 0 ? 7 : week;
// 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 = $@"<obj is='obix: HistoryFilter'>
// <abstime name='start' val='{startTimestamp}' />
// <abstime name='end' val='{endTimestamp}' />
// <reltime name='interval' val = 'PT8D' />
// </obj>";
// //Stopwatch stopWatch = new Stopwatch();
// //stopWatch.Start();
// //抓取每個設備的資料
// List<Dictionary<string, object>> electricArchiveWeekRawDatas = new List<Dictionary<string, object>>();
// List<Dictionary<string, object>> waterArchiveWeekRawDatas = new List<Dictionary<string, object>>();
// //電錶結果收集
// 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<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]}'
// // 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);
// // }
// // 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}", archiveWeekJsonResult);
// // Dictionary<string, object> archiveWeekRawData = new Dictionary<string, object>();
// // 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"));
// // 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<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]}'
// // 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);
// // }
// // 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}", archiveWeekJsonResult);
// // Dictionary<string, object> archiveWeekRawData = new Dictionary<string, object>();
// // 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"));
// // waterArchiveWeekRawDatas.Add(archiveWeekRawData);
// // }
// // 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);
// if (electricArchiveWeekRawDatas.Count() > 0)
// {
// var sql = $@"
// UPDATE archive_electric_meter_week SET
// count_rawdata = @count_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,
// repeat_times = @repeat_times,
// fail_reason = @fail_reason,
// updated_at = @updated_at
// WHERE device_number = @device_number
// AND point = @point
// AND start_timestamp = @start_timestamp;
// INSERT INTO archive_electric_meter_week (
// device_number,
// point,
// start_timestamp,
// end_timestamp,
// count_rawdata,
// min_rawdata,
// max_rawdata,
// kwh_result,
// avg_rawdata,
// sum_rawdata,
// is_complete,
// repeat_times,
// fail_reason)
// SELECT
// @device_number,
// @point,
// @start_timestamp,
// @end_timestamp,
// @count_rawdata,
// round(@min_rawdata, 2),
// round(@max_rawdata, 2),
// round(@max_rawdata, 2) - round(@min_rawdata, 2),
// @avg_rawdata,
// @sum_rawdata,
// @is_complete,
// @repeat_times,
// @fail_reason
// WHERE ROW_COUNT() = 0;
// ";
// var mySql = $@"BEGIN TRANSACTION;
// UPDATE archive_electric_meter_week SET
// count_rawdata = @count_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,
// repeat_times = @repeat_times,
// fail_reason = @fail_reason,
// updated_at = @updated_at
// WHERE device_number = @device_number
// AND point = @point
// AND start_timestamp = @start_timestamp;
// IF @@ROWCOUNT = 0
// BEGIN
// INSERT INTO archive_electric_meter_week (
// device_number,
// point,
// start_timestamp,
// end_timestamp,
// count_rawdata,
// min_rawdata,
// max_rawdata,
// kwh_result,
// avg_rawdata,
// sum_rawdata,
// is_complete,
// repeat_times,
// fail_reason)
// VALUES (
// @device_number,
// @point,
// @start_timestamp,
// @end_timestamp,
// @count_rawdata,
// round(@min_rawdata, 2),
// round(@max_rawdata, 2),
// round(@max_rawdata, 2) - round(@min_rawdata, 2),
// @avg_rawdata,
// @sum_rawdata,
// @is_complete,
// @repeat_times,
// @fail_reason)
// END
// COMMIT TRANSACTION;";
// await backgroundServiceRepository.ExecuteSql(sql, electricArchiveWeekRawDatas);
// if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1")
// {
// await backgroundServiceMsSqlRepository.ExecuteSql(mySql, electricArchiveWeekRawDatas);
// }
// }
// if (waterArchiveWeekRawDatas.Count() > 0)
// {
// var sql = $@" UPDATE archive_water_meter_week SET
// count_rawdata = @count_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,
// repeat_times = @repeat_times,
// fail_reason = @fail_reason,
// updated_at = @updated_at
// WHERE device_number = @device_number
// AND point = @point
// AND start_timestamp = @start_timestamp;
// INSERT INTO archive_water_meter_week (
// device_number,
// point,
// start_timestamp,
// end_timestamp,
// count_rawdata,
// min_rawdata,
// max_rawdata,
// kwh_result,
// avg_rawdata,
// sum_rawdata,
// is_complete,
// repeat_times,
// fail_reason)
// SELECT
// @device_number,
// @point,
// @start_timestamp,
// @end_timestamp,
// @count_rawdata,
// round(@min_rawdata, 2),
// round(@max_rawdata, 2),
// round(@max_rawdata, 2) - round(@min_rawdata, 2),
// @avg_rawdata,
// @sum_rawdata,
// @is_complete,
// @repeat_times,
// @fail_reason
// WHERE ROW_COUNT() = 0;
// ";
// var mySql = $@"BEGIN TRANSACTION;
// UPDATE archive_water_meter_week SET
// count_rawdata = @count_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,
// repeat_times = @repeat_times,
// fail_reason = @fail_reason,
// updated_at = @updated_at
// WHERE device_number = @device_number
// AND point = @point
// AND start_timestamp = @start_timestamp;
// IF @@ROWCOUNT = 0
// BEGIN
// INSERT INTO archive_water_meter_week (
// device_number,
// point,
// start_timestamp,
// end_timestamp,
// count_rawdata,
// min_rawdata,
// max_rawdata,
// kwh_result,
// avg_rawdata,
// sum_rawdata,
// is_complete,
// repeat_times,
// fail_reason)
// VALUES (
// @device_number,
// @point,
// @start_timestamp,
// @end_timestamp,
// @count_rawdata,
// round(@min_rawdata,2) ,
// round(@max_rawdata,2) ,
// round(@max_rawdata, 2) - round(@min_rawdata, 2),
// @avg_rawdata,
// @sum_rawdata,
// @is_complete,
// @repeat_times,
// @fail_reason)
// END
// COMMIT TRANSACTION;";
// await backgroundServiceRepository.ExecuteSql(sql, waterArchiveWeekRawDatas);
// if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1")
// {
// await backgroundServiceMsSqlRepository.ExecuteSql(mySql, waterArchiveWeekRawDatas);
// }
// }
// await task_Detail.InsertWorkTime_End("ArchiveElectricMeterDayJob", "Week", "任務完成");
// }
// catch (Exception exception)
// {
// await task_Detail.WorkFail("ArchiveElectricMeterDayJob", "Week", exception.ToString());
// logger.LogError("【ArchiveElectricMeterDayJob】【週歸檔】【任務失敗】");
// logger.LogError("【ArchiveElectricMeterDayJob】【週歸檔】【任務失敗】[Exception]: {0}", exception.ToString());
// }
// finally
// {
// if (archiveResponse != null)
// {
// archiveResponse.Dispose();
// archiveResponse.Close();
// }
// }
//}
2022-10-14 16:08:54 +08:00
#endregion 週 歸 檔
#region 月 歸 檔
if ( await task_Detail . GetNeedWorkTask ( "ArchiveElectricMeterDayJob" , "Month" ) )
{
try
{
2023-06-06 16:43:46 +08:00
await task_Detail . InsertWorkTime ( "ArchiveElectricMeterDayJob" , "Month" , "水電表月任務開始" ) ;
2023-09-27 01:37:25 +08:00
//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日
2023-09-24 20:44:30 +08:00
//var LastDay = actionDay.AddMonths(1).AddDays(-actionDay.AddMonths(1).Day);
2022-10-14 16:08:54 +08:00
2023-09-27 01:37:25 +08:00
//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 dayInMonth = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month) + 1;
2022-10-14 16:08:54 +08:00
2023-09-27 01:37:25 +08:00
//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}T00:00:10.000+08:00", LastDay.ToString("yyyy-MM-dd")); // by jiahao @2023-09-16
2022-10-14 16:08:54 +08:00
2023-09-27 01:37:25 +08:00
//var historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
// <abstime name='start' val='{startTimestamp}' />
// <abstime name='end' val='{endTimestamp}' />
// <reltime name='interval' val = 'PT{dayInMonth}D' />
// </obj>";
2022-10-14 16:08:54 +08:00
2023-09-27 01:37:25 +08:00
//logger.LogInformation("【ArchiveElectricMeterMonth】startTimestamp=", startTimestamp + " endTimestamp=" + endTimestamp);
2022-10-14 16:08:54 +08:00
//Stopwatch stopWatch = new Stopwatch();
//stopWatch.Start();
//抓取每個設備的資料
2023-05-10 18:06:02 +08:00
List < Dictionary < string , object > > electricArchiveMonthRawDatas = new List < Dictionary < string , object > > ( ) ;
List < Dictionary < string , object > > waterArchiveMonthRawDatas = new List < Dictionary < string , object > > ( ) ;
2024-02-05 07:20:30 +08:00
2022-10-14 16:08:54 +08:00
2023-09-18 01:49:00 +08:00
//收集 niagara 電錶 Data
2023-09-27 01:37:25 +08:00
procEletricMeterService . obixData_collect_range ( xmlDocument , electricDeviceNumberPoints , obixApiConfig , encoded , electricArchiveMonthRawDatas ) ;
2023-09-18 01:49:00 +08:00
//水錶結果收集
2023-09-27 01:37:25 +08:00
procEletricMeterService . obixData_collect_range ( xmlDocument , waterDeviceNumberPoints , obixApiConfig , encoded , waterArchiveMonthRawDatas ) ;
2023-09-18 01:49:00 +08:00
2023-09-24 20:44:30 +08:00
//if (electricMeters.Where(e => e.Device_number == "NTPC_D8_EE_E4_RF_Total_WHT_N1").Count() == 1)
//{
// logger.LogInformation("【ArchiveElectricMeterDayMonth】有包含 NTPC_D8_EE_E4_RF_Total_WHT_N1 ");
//}
2023-09-18 01:49:00 +08:00
#region old request niagara by obix
//foreach (var deviceNumberPoint in electricDeviceNumberPoints)
//{
// 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
// 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<string, object> archiveMonthRawData = new Dictionary<string, object>();
// 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<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]}'
// 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<string, object> archiveMonthRawData = new Dictionary<string, object>();
// 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
2022-10-14 16:08:54 +08:00
//stopWatch.Stop();
//logger.LogInformation("【ArchiveElectricMeterDayJob】【月歸檔效能檢驗】[取得資料花費時間]{0} 毫秒", stopWatch.ElapsedMilliseconds);
2023-10-03 21:07:04 +08:00
logger . LogInformation ( $@"before 月報 electricArchiveMonthRawDatas.Count() ={electricArchiveMonthRawDatas.Count()} " ) ;
2023-05-10 18:06:02 +08:00
if ( electricArchiveMonthRawDatas . Count ( ) > 0 )
2022-10-14 16:08:54 +08:00
{
2023-05-04 16:45:05 +08:00
var sql = $ @ "
UPDATE archive_electric_meter_month SET
2024-02-05 07:20:30 +08:00
start_timestamp = @start_timestamp ,
end_timestamp = @end_timestamp ,
2023-05-04 16:45:05 +08:00
count_rawdata = @count_rawdata ,
2023-09-18 01:49:00 +08:00
min_rawdata = round ( @min_rawdata , 2 ) ,
max_rawdata = round ( @max_rawdata , 2 ) ,
kwh_result = round ( @max_rawdata , 2 ) - round ( @min_rawdata , 2 ) ,
2023-05-04 16:45:05 +08:00
avg_rawdata = @avg_rawdata ,
sum_rawdata = @sum_rawdata ,
is_complete = @is_complete ,
repeat_times = @repeat_times ,
fail_reason = @fail_reason ,
updated_at = @updated_at
WHERE device_number = @device_number
AND point = @point
AND start_timestamp = @start_timestamp ;
INSERT INTO archive_electric_meter_month (
device_number ,
point ,
start_timestamp ,
end_timestamp ,
count_rawdata ,
min_rawdata ,
max_rawdata ,
2023-07-27 17:51:31 +08:00
kwh_result ,
2023-05-04 16:45:05 +08:00
avg_rawdata ,
sum_rawdata ,
is_complete ,
repeat_times ,
fail_reason )
SELECT
@device_number ,
@point ,
@start_timestamp ,
@end_timestamp ,
@count_rawdata ,
2023-09-18 01:49:00 +08:00
round ( @min_rawdata , 2 ) ,
round ( @max_rawdata , 2 ) ,
round ( @max_rawdata , 2 ) - round ( @min_rawdata , 2 ) ,
2023-05-04 16:45:05 +08:00
@avg_rawdata ,
@sum_rawdata ,
@is_complete ,
@repeat_times ,
@fail_reason
WHERE ROW_COUNT ( ) = 0 ; ";
var mySql = $ @ "BEGIN TRANSACTION;
2022-10-14 16:08:54 +08:00
UPDATE archive_electric_meter_month SET
2024-02-05 07:20:30 +08:00
start_timestamp = @start_timestamp ,
end_timestamp = @end_timestamp ,
2022-10-14 16:08:54 +08:00
count_rawdata = @count_rawdata ,
2023-09-18 01:49:00 +08:00
min_rawdata = round ( @min_rawdata , 2 ) ,
max_rawdata = round ( @max_rawdata , 2 ) ,
kwh_result = round ( @max_rawdata , 2 ) - round ( @min_rawdata , 2 ) ,
2022-10-14 16:08:54 +08:00
avg_rawdata = @avg_rawdata ,
sum_rawdata = @sum_rawdata ,
is_complete = @is_complete ,
repeat_times = @repeat_times ,
fail_reason = @fail_reason ,
updated_at = @updated_at
WHERE device_number = @device_number
AND point = @point
AND start_timestamp = @start_timestamp ;
IF @ @ROWCOUNT = 0
BEGIN
INSERT INTO archive_electric_meter_month (
device_number ,
point ,
start_timestamp ,
end_timestamp ,
count_rawdata ,
min_rawdata ,
max_rawdata ,
2023-07-27 17:51:31 +08:00
kwh_result ,
2022-10-14 16:08:54 +08:00
avg_rawdata ,
sum_rawdata ,
is_complete ,
repeat_times ,
fail_reason )
VALUES (
@device_number ,
@point ,
@start_timestamp ,
@end_timestamp ,
@count_rawdata ,
2023-09-18 01:49:00 +08:00
round ( @min_rawdata , 2 ) ,
round ( @max_rawdata , 2 ) ,
round ( @max_rawdata , 2 ) - round ( @min_rawdata , 2 ) ,
2022-10-14 16:08:54 +08:00
@avg_rawdata ,
@sum_rawdata ,
@is_complete ,
@repeat_times ,
@fail_reason )
END
2024-02-05 07:20:30 +08:00
COMMIT TRANSACTION ; ";
2023-10-03 21:07:04 +08:00
2023-05-10 18:06:02 +08:00
await backgroundServiceRepository . ExecuteSql ( sql , electricArchiveMonthRawDatas ) ;
2023-10-03 21:07:04 +08:00
2023-05-29 16:21:41 +08:00
if ( ! string . IsNullOrEmpty ( saveToMSDB ) & & saveToMSDB = = "1" )
{
await backgroundServiceMsSqlRepository . ExecuteSql ( mySql , electricArchiveMonthRawDatas ) ;
}
2023-05-10 18:06:02 +08:00
}
2023-10-03 21:07:04 +08:00
// 水錶
2023-05-10 18:06:02 +08:00
if ( waterArchiveMonthRawDatas . Count ( ) > 0 )
{
var sql = $ @ "
UPDATE archive_water_meter_month SET
2024-02-05 07:20:30 +08:00
start_timestamp = @start_timestamp ,
end_timestamp = @end_timestamp ,
2023-05-10 18:06:02 +08:00
count_rawdata = @count_rawdata ,
2023-09-18 01:49:00 +08:00
min_rawdata = round ( @min_rawdata , 2 ) ,
max_rawdata = round ( @max_rawdata , 2 ) ,
kwh_result = round ( @max_rawdata , 2 ) - round ( @min_rawdata , 2 ) ,
2023-05-10 18:06:02 +08:00
avg_rawdata = @avg_rawdata ,
sum_rawdata = @sum_rawdata ,
is_complete = @is_complete ,
repeat_times = @repeat_times ,
fail_reason = @fail_reason ,
updated_at = @updated_at
WHERE device_number = @device_number
AND point = @point
AND start_timestamp = @start_timestamp ;
INSERT INTO archive_water_meter_month (
device_number ,
point ,
start_timestamp ,
end_timestamp ,
count_rawdata ,
min_rawdata ,
max_rawdata ,
avg_rawdata ,
sum_rawdata ,
is_complete ,
repeat_times ,
fail_reason )
SELECT
@device_number ,
@point ,
@start_timestamp ,
@end_timestamp ,
@count_rawdata ,
2023-09-18 01:49:00 +08:00
round ( @min_rawdata , 2 ) ,
round ( @max_rawdata , 2 ) ,
round ( @max_rawdata , 2 ) - round ( @min_rawdata , 2 ) ,
2023-05-10 18:06:02 +08:00
@avg_rawdata ,
@sum_rawdata ,
@is_complete ,
@repeat_times ,
@fail_reason
WHERE ROW_COUNT ( ) = 0 ; ";
var mySql = $ @ "BEGIN TRANSACTION;
UPDATE archive_water_meter_month SET
2024-02-05 07:20:30 +08:00
start_timestamp = @start_timestamp ,
end_timestamp = @end_timestamp ,
2023-05-10 18:06:02 +08:00
count_rawdata = @count_rawdata ,
2023-09-18 01:49:00 +08:00
min_rawdata = round ( @min_rawdata , 2 ) ,
max_rawdata = round ( @max_rawdata , 2 ) ,
kwh_result = round ( @max_rawdata , 2 ) - round ( @min_rawdata , 2 ) ,
2023-05-10 18:06:02 +08:00
avg_rawdata = @avg_rawdata ,
sum_rawdata = @sum_rawdata ,
is_complete = @is_complete ,
repeat_times = @repeat_times ,
fail_reason = @fail_reason ,
updated_at = @updated_at
WHERE device_number = @device_number
AND point = @point
AND start_timestamp = @start_timestamp ;
IF @ @ROWCOUNT = 0
BEGIN
INSERT INTO archive_water_meter_month (
device_number ,
point ,
start_timestamp ,
end_timestamp ,
count_rawdata ,
min_rawdata ,
max_rawdata ,
2023-09-18 01:49:00 +08:00
kwh_result ,
2023-05-10 18:06:02 +08:00
avg_rawdata ,
sum_rawdata ,
is_complete ,
repeat_times ,
fail_reason )
VALUES (
@device_number ,
@point ,
@start_timestamp ,
@end_timestamp ,
@count_rawdata ,
2023-09-18 01:49:00 +08:00
round ( @min_rawdata , 2 ) ,
round ( @max_rawdata , 2 ) ,
round ( @max_rawdata , 2 ) - round ( @min_rawdata , 2 ) ,
2023-05-10 18:06:02 +08:00
@avg_rawdata ,
@sum_rawdata ,
@is_complete ,
@repeat_times ,
@fail_reason )
END
2024-02-05 07:20:30 +08:00
COMMIT TRANSACTION ; ";
2023-10-03 21:07:04 +08:00
2023-05-10 18:06:02 +08:00
await backgroundServiceRepository . ExecuteSql ( sql , waterArchiveMonthRawDatas ) ;
2023-05-29 16:21:41 +08:00
if ( ! string . IsNullOrEmpty ( saveToMSDB ) & & saveToMSDB = = "1" )
{
await backgroundServiceMsSqlRepository . ExecuteSql ( mySql , waterArchiveMonthRawDatas ) ;
}
2022-10-14 16:08:54 +08:00
}
await task_Detail . InsertWorkTime_End ( "ArchiveElectricMeterDayJob" , "Month" , "任務完成" ) ;
}
catch ( Exception exception )
{
await task_Detail . WorkFail ( "ArchiveElectricMeterDayJob" , "Month" , exception . ToString ( ) ) ;
logger . LogError ( "【ArchiveElectricMeterDayJob】【月歸檔】【任務失敗】" ) ;
2023-07-20 10:08:50 +08:00
logger . LogError ( "【ArchiveElectricMeterDayJob】【月歸檔】【任務失敗】[Exception]: {0}" , exception . ToString ( ) ) ;
2022-10-14 16:08:54 +08:00
}
2023-06-07 12:18:46 +08:00
finally
{
if ( archiveResponse ! = null )
{
archiveResponse . Dispose ( ) ;
archiveResponse . Close ( ) ;
}
}
2022-10-14 16:08:54 +08:00
}
#endregion 月 歸 檔
#region 補 償 機 制
//取得連線字串
2023-09-18 01:49:00 +08:00
2023-05-04 16:45:05 +08:00
if ( await task_Detail . GetNeedWorkTask ( "ArchiveElectricMeterDayJob" , "Compensate" ) )
2022-10-14 16:08:54 +08:00
{
try
{
2023-06-07 12:18:46 +08:00
await task_Detail . InsertWorkTime ( "ArchiveElectricMeterDayJob" , "Compensate" , "補償機制任務開始" ) ;
2023-09-27 01:37:25 +08:00
2023-05-04 16:45:05 +08:00
await procEletricMeterService . ArchiveData ( ) ;
2022-10-14 16:08:54 +08:00
await task_Detail . InsertWorkTime_End ( "ArchiveElectricMeterDayJob" , "Compensate" , "任務完成" ) ;
}
2023-09-27 01:37:25 +08:00
catch ( Exception ex )
2022-10-14 16:08:54 +08:00
{
await task_Detail . WorkFail ( "ArchiveElectricMeterDayJob" , "Compensate" , ex . ToString ( ) ) ;
logger . LogError ( "【ArchiveElectricMeterDayJob】【補償機制】【任務失敗】" ) ;
logger . LogError ( "【ArchiveElectricMeterDayJob】【補償機制】【任務失敗】[Exception]: {0}" , ex . ToString ( ) ) ;
}
}
#endregion 補 償 機 制
await task_Detail . InsertWorkTime_End ( "ArchiveElectricMeterDayJob" , "All" , "任務完成" ) ;
}
}
catch ( Exception exception )
{
await task_Detail . WorkFail ( "ArchiveElectricMeterDayJob" , "All" , exception . ToString ( ) ) ;
logger . LogError ( "【ArchiveElectricMeterDayJob】【任務失敗】" ) ;
2023-07-17 14:18:57 +08:00
logger . LogError ( "【ArchiveElectricMeterDayJob】【任務失敗】[Exception]: {0} {1}" , exception . ToString ( ) ) ;
2022-10-14 16:08:54 +08:00
}
}
2023-09-24 20:44:30 +08:00
private async Task day_proc ( ProcEletricMeterService procEletricMeterService , string saveToMSDB , HttpWebResponse archiveResponse , List < DeviceNumberPoint > electricDeviceNumberPoints , List < DeviceNumberPoint > waterDeviceNumberPoints , ObixApiConfig obixApiConfig , string encoded , DateTime startDay , DateTime endDay , string dbDateName )
{
2024-02-05 07:20:30 +08:00
XmlDocument xmlDocument = new XmlDocument ( ) ;
2023-09-24 20:44:30 +08:00
// --------- 需要變成指定日期 ----------------
2024-02-05 07:20:30 +08:00
2023-09-24 20:44:30 +08:00
// PT2D 需要設定超過1天
Stopwatch stopWatch = new Stopwatch ( ) ;
stopWatch . Start ( ) ;
//抓取每個設備的資料
List < Dictionary < string , object > > electericArchiveDayRawDatas = new List < Dictionary < string , object > > ( ) ;
List < Dictionary < string , object > > waterArchiveDayRawDatas = new List < Dictionary < string , object > > ( ) ;
2023-09-27 01:37:25 +08:00
//異常清單
Dictionary < string , string > dicError = new Dictionary < string , string > ( ) ;
2023-09-24 20:44:30 +08:00
#region old request niagara history by obix
//foreach (var deviceNumberPoint in electricDeviceNumberPoints)
//{
// 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
// 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);
// }
// 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}", archiveDayJsonResult);
// Dictionary<string, object> archiveDayRawData = new Dictionary<string, object>();
// 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"));
// 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
//request niagara get data NTPC_D8_EE_E4_RF_Total_WHT_N1
//if (electricMeters.Where(e => e.Device_number == "NTPC_D8_EE_E4_RF_Total_WHT_N1").Count() == 1)
//{
// logger.LogInformation("【ArchiveElectricMeterDayJob】有包含 NTPC_D8_EE_E4_RF_Total_WHT_N1 ");
//}
//if (electricDeviceNumberPoints..Device_number == "NTPC_G6_EE_E4_B1F_CB3_WHT_N1")
//{
// logger.LogInformation($@"devie_number = NTPC_G6_EE_E4_B1F_CB3_WHT_N1 obix startDay={startTimestamp} endDay={endTimestamp}");
//}
//電錶結果收集
// procEletricMeterService.obixData_collect(xmlDocument, electricDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, electericArchiveDayRawDatas);
2023-09-27 01:37:25 +08:00
procEletricMeterService . obixData_collect ( xmlDocument , electricDeviceNumberPoints , obixApiConfig , encoded , electericArchiveDayRawDatas , ref dicError ) ;
2023-09-24 20:44:30 +08:00
//水錶結果收集
//procEletricMeterService.obixData_collect(xmlDocument, waterDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, waterArchiveDayRawDatas);
2023-09-27 01:37:25 +08:00
procEletricMeterService . obixData_collect ( xmlDocument , waterDeviceNumberPoints , obixApiConfig , encoded , waterArchiveDayRawDatas , ref dicError ) ;
2023-09-24 20:44:30 +08:00
stopWatch . Stop ( ) ;
2023-09-25 11:47:19 +08:00
logger . LogInformation ( @ $"【ArchiveElectricMeterDayJob】【天歸檔】【效能檢驗】[取得資料花費時間]{stopWatch.ElapsedMilliseconds } 毫秒 資料筆數=" + electericArchiveDayRawDatas . Count ( ) ) ;
2023-09-24 20:44:30 +08:00
if ( electericArchiveDayRawDatas . Count ( ) > 0 )
{
2023-11-28 23:48:37 +08:00
object vv = null ;
electericArchiveDayRawDatas . Where ( x = > x . TryGetValue ( "@start_timestamp" , out vv ) ) . ToString ( ) ;
// var lastMonth = electericArchiveDayRawDatas.Where( x => x.Where(z => z.))
// 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 )
2024-02-05 07:20:30 +08:00
{
2023-11-28 23:48:37 +08:00
sql2 + = $@"update device set archive_lastDate = '{kv.Value}', archive_lastActionDate = now() where device_number = '{kv.Key}' ;" ;
}
if ( ! string . IsNullOrEmpty ( sql2 ) )
{
await backgroundServiceRepository . ExecuteSql ( sql2 ) ;
}
logger . LogInformation ( "run sql electericArchiveDayRawDatas.Count() = " + electericArchiveDayRawDatas . Count ( ) ) ;
2024-02-05 07:20:30 +08:00
2023-11-28 23:48:37 +08:00
foreach ( var row in electericArchiveDayRawDatas )
{
row . TryGetValue ( "@start_timestamp" , out var yyyymmData ) ;
dbDateName = System . DateTime . Parse ( yyyymmData . ToString ( ) ) . ToString ( "yyyyMM" ) ;
var mySql = $ @ " SET FOREIGN_KEY_CHECKS = 1;
2023-09-24 20:44:30 +08:00
UPDATE archive_electric_meter_day_ { dbDateName } SET
count_rawdata = @count_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 ,
repeat_times = @repeat_times ,
fail_reason = @fail_reason ,
2023-09-25 11:47:19 +08:00
updated_at = @updated_at
2023-09-24 20:44:30 +08:00
WHERE device_number = @device_number
AND point = @point
AND start_timestamp = @start_timestamp ;
INSERT INTO archive_electric_meter_day_ { dbDateName } (
2023-11-28 23:48:37 +08:00
device_number , point ,
start_timestamp , end_timestamp ,
count_rawdata , min_rawdata ,
max_rawdata , kwh_result ,
avg_rawdata , sum_rawdata ,
is_complete , repeat_times ,
2023-09-25 11:47:19 +08:00
fail_reason , updated_at )
2023-09-24 20:44:30 +08:00
SELECT
2023-11-28 23:48:37 +08:00
@device_number , @point ,
@start_timestamp , @end_timestamp ,
@count_rawdata ,
2023-09-24 20:44:30 +08:00
round ( @min_rawdata , 2 ) ,
round ( @max_rawdata , 2 ) ,
round ( @max_rawdata , 2 ) - round ( @min_rawdata , 2 ) ,
2023-11-28 23:48:37 +08:00
@avg_rawdata , @sum_rawdata ,
@is_complete , @repeat_times ,
@fail_reason , @updated_at
2023-09-27 16:03:33 +08:00
WHERE ROW_COUNT ( ) = 0 ;
update device set archive_lastDate = @start_timestamp , archive_lastActionDate = @updated_at
2023-11-28 23:48:37 +08:00
where device_number = @device_number ; "; //archive_lastDate 前次完成時間 , archive_lastActionDate 本次作業時間
2023-12-12 14:15:21 +08:00
await backgroundServiceRepository . ExecuteSql ( mySql , row ) ;
2023-09-27 01:37:25 +08:00
}
2023-11-28 23:48:37 +08:00
#region 明 志 沒 有 mssql
2023-10-03 21:07:04 +08:00
//if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1")
//{
// await backgroundServiceMsSqlRepository.ExecuteSql(mySql, electericArchiveDayRawDatas);
//}
2023-11-28 23:48:37 +08:00
//var msSql = $@"BEGIN TRANSACTION;
// IF OBJECT_ID(N'dbo.archive_electric_meter_day_{dbDateName}', N'U') is null
// BEGIN
// CREATE TABLE [dbo].[archive_electric_meter_day_{dbDateName}](
// [device_number] [varchar](50) NOT NULL,
// [point] [varchar](20) NOT NULL,
// [start_timestamp] [datetime] NOT NULL,
// [end_timestamp] [datetime] NULL,
// [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,
// [repeat_times] [int] NULL,
// [fail_reason] [nvarchar](max) NULL,
// [created_at] [datetime] NULL,
// [updated_at] [datetime] NULL,
// CONSTRAINT [PK_archive_electric_meter_day_{dbDateName}] PRIMARY KEY CLUSTERED
// (
// [device_number] ASC,
// [point] ASC,
// [start_timestamp] ASC
// )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
// ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
// ALTER TABLE [dbo].[archive_electric_meter_day_{dbDateName}] ADD CONSTRAINT [DF_archive_electric_meter_day_{dbDateName}_repeat_times] DEFAULT ((0)) FOR [repeat_times]
// ALTER TABLE [dbo].[archive_electric_meter_day_{dbDateName}] ADD CONSTRAINT [DF_archive_electric_meter_day_{dbDateName}_created_at] DEFAULT (getdate()) FOR [created_at]
// ALTER TABLE [dbo].[archive_electric_meter_day_{dbDateName}] ADD CONSTRAINT [DF_archive_electric_meter_day_{dbDateName}_updated_at] DEFAULT (NULL) FOR [updated_at]
// EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'是否完成, 0:未完成 1:完成' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'archive_electric_meter_day_{dbDateName}', @level2type=N'COLUMN',@level2name=N'is_complete'
// EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'重複次數' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'archive_electric_meter_day_{dbDateName}', @level2type=N'COLUMN',@level2name=N'repeat_times'
// EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'失敗原因' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'archive_electric_meter_day_{dbDateName}', @level2type=N'COLUMN',@level2name=N'fail_reason'
// END
// UPDATE archive_electric_meter_day_{dbDateName} SET
// count_rawdata = @count_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,
// repeat_times = @repeat_times,
// fail_reason = @fail_reason,
// updated_at = @updated_at
// WHERE device_number = @device_number
// AND point = @point
// AND start_timestamp = @start_timestamp;
// IF @@ROWCOUNT = 0
// BEGIN
// INSERT INTO archive_electric_meter_day_{dbDateName} (
// device_number,
// point,
// start_timestamp,
// end_timestamp,
// count_rawdata,
// min_rawdata,
// max_rawdata,
// kwh_result,
// avg_rawdata,
// sum_rawdata,
// is_complete,
// repeat_times,
// fail_reason)
// VALUES (
// @device_number,
// @point,
// @start_timestamp,
// @end_timestamp,
// @count_rawdata,
// round(@min_rawdata, 2),
// round(@max_rawdata, 2) ,
// round(@max_rawdata, 2) - round(@min_rawdata, 2),
// @avg_rawdata,
// @sum_rawdata,
// @is_complete,
// @repeat_times,
// @fail_reason)
// END
// COMMIT TRANSACTION;";
#endregion
2023-09-24 20:44:30 +08:00
}
if ( waterArchiveDayRawDatas . Count ( ) > 0 )
2024-02-05 07:20:30 +08:00
{
foreach ( var row in waterArchiveDayRawDatas )
2023-09-24 20:44:30 +08:00
{
2024-02-05 07:20:30 +08:00
row . TryGetValue ( "@start_timestamp" , out var yyyymmData ) ;
dbDateName = System . DateTime . Parse ( yyyymmData . ToString ( ) ) . ToString ( "yyyyMM" ) ;
2023-09-24 20:44:30 +08:00
var sql = $ @ " UPDATE archive_water_meter_day_{dbDateName} SET
count_rawdata = @count_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 ,
repeat_times = @repeat_times ,
fail_reason = @fail_reason ,
updated_at = @updated_at
WHERE device_number = @device_number
AND point = @point
AND start_timestamp = @start_timestamp ;
INSERT INTO archive_water_meter_day_ { dbDateName } (
device_number ,
point ,
start_timestamp ,
end_timestamp ,
count_rawdata ,
min_rawdata ,
max_rawdata ,
kwh_result ,
avg_rawdata ,
sum_rawdata ,
is_complete ,
repeat_times ,
fail_reason )
SELECT
@device_number ,
@point ,
@start_timestamp ,
@end_timestamp ,
@count_rawdata ,
round ( @min_rawdata , 2 ) ,
round ( @max_rawdata , 2 ) ,
round ( @max_rawdata , 2 ) - round ( @min_rawdata , 2 ) ,
@avg_rawdata ,
@sum_rawdata ,
@is_complete ,
@repeat_times ,
@fail_reason
WHERE ROW_COUNT ( ) = 0 ; ";
var mySql = $ @ "BEGIN TRANSACTION;
IF OBJECT_ID ( N ' dbo . archive_water_meter_day_ { dbDateName } ' , N 'U' ) is null
BEGIN
CREATE TABLE [ dbo ] . [ archive_water_meter_day_ { dbDateName } ] (
[device_number] [ varchar ] ( 50 ) NOT NULL ,
[point] [ varchar ] ( 20 ) NOT NULL ,
[start_timestamp] [ datetime ] NOT NULL ,
[end_timestamp] [ datetime ] NULL ,
[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 ,
[repeat_times] [ int ] NULL ,
[fail_reason] [ nvarchar ] ( max ) NULL ,
[created_at] [ datetime ] NULL ,
[updated_at] [ datetime ] NULL ,
CONSTRAINT [ PK_archive_water_meter_day_ { dbDateName } ] PRIMARY KEY CLUSTERED
(
[device_number] ASC ,
[point] ASC ,
[start_timestamp] ASC
) WITH ( PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON , OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF ) ON [ PRIMARY ]
) ON [ PRIMARY ] TEXTIMAGE_ON [ PRIMARY ]
ALTER TABLE [ dbo ] . [ archive_water_meter_day_ { dbDateName } ] ADD CONSTRAINT [ DF_archive_water_meter_day_ { dbDateName } _repeat_times ] DEFAULT ( ( 0 ) ) FOR [ repeat_times ]
ALTER TABLE [ dbo ] . [ archive_water_meter_day_ { dbDateName } ] ADD CONSTRAINT [ DF_archive_water_meter_day_ { dbDateName } _created_at ] DEFAULT ( getdate ( ) ) FOR [ created_at ]
ALTER TABLE [ dbo ] . [ archive_water_meter_day_ { dbDateName } ] ADD CONSTRAINT [ DF_archive_water_meter_day_ { dbDateName } _updated_at ] DEFAULT ( NULL ) FOR [ updated_at ]
EXEC sys . sp_addextendedproperty @name = N ' MS_Description ' , @value = N ' 是 否 完 成 , 0 : 未 完 成 1 : 完 成 ' , @level0type = N ' SCHEMA ' , @level0name = N ' dbo ' , @level1type = N ' TABLE ' , @level1name = N ' archive_water_meter_day_ { dbDateName } ' , @level2type = N ' COLUMN ' , @level2name = N ' is_complete '
EXEC sys . sp_addextendedproperty @name = N ' MS_Description ' , @value = N ' 重 複 次 數 ' , @level0type = N ' SCHEMA ' , @level0name = N ' dbo ' , @level1type = N ' TABLE ' , @level1name = N ' archive_water_meter_day_ { dbDateName } ' , @level2type = N ' COLUMN ' , @level2name = N ' repeat_times '
EXEC sys . sp_addextendedproperty @name = N ' MS_Description ' , @value = N ' 失 敗 原 因 ' , @level0type = N ' SCHEMA ' , @level0name = N ' dbo ' , @level1type = N ' TABLE ' , @level1name = N ' archive_water_meter_day_ { dbDateName } ' , @level2type = N ' COLUMN ' , @level2name = N ' fail_reason '
END
UPDATE archive_water_meter_day_ { dbDateName } SET
count_rawdata = @count_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 ,
repeat_times = @repeat_times ,
fail_reason = @fail_reason ,
updated_at = @updated_at
WHERE device_number = @device_number
AND point = @point
AND start_timestamp = @start_timestamp ;
IF @ @ROWCOUNT = 0
BEGIN
INSERT INTO archive_water_meter_day_ { dbDateName } (
device_number ,
point ,
start_timestamp ,
end_timestamp ,
count_rawdata ,
min_rawdata ,
max_rawdata ,
kwh_result ,
avg_rawdata ,
sum_rawdata ,
is_complete ,
repeat_times ,
fail_reason )
VALUES (
@device_number ,
@point ,
@start_timestamp ,
@end_timestamp ,
@count_rawdata ,
round ( @min_rawdata , 2 ) ,
round ( @max_rawdata , 2 ) ,
round ( @max_rawdata , 2 ) - round ( @min_rawdata , 2 ) ,
@avg_rawdata ,
@sum_rawdata ,
@is_complete ,
@repeat_times ,
@fail_reason )
END
COMMIT TRANSACTION ; ";
await backgroundServiceRepository . ExecuteSql ( sql , waterArchiveDayRawDatas ) ;
if ( ! string . IsNullOrEmpty ( saveToMSDB ) & & saveToMSDB = = "1" )
{
await backgroundServiceMsSqlRepository . ExecuteSql ( mySql , waterArchiveDayRawDatas ) ;
}
}
2024-02-05 07:20:30 +08:00
}
2023-09-24 20:44:30 +08:00
}
2023-09-18 01:49:00 +08:00
///// <summary>
///// 獲取 Niagara 資料,並儲存於 List 中
///// </summary>
///// <param name="device_number"></param>
///// <param name="xmlDocument"></param>
///// <param name="DeviceNumberPoints"></param>
///// <param name="obixApiConfig"></param>
///// <param name="encoded"></param>
///// <param name="startTimestamp"></param>
///// <param name="endTimestamp"></param>
///// <param name="historyQueryFilter"></param>
///// <param name="waterArchiveDayRawDatas"></param>
//private void obixData_collect( XmlDocument xmlDocument, List<DeviceNumberPoint> DeviceNumberPoints, ObixApiConfig obixApiConfig, string encoded, string startTimestamp, string endTimestamp, string historyQueryFilter, List<Dictionary<string, object>> resultArchiveDayRawDatas)
//{
// #region 水電錶 save to DB start
// foreach (var deviceNumberPoint in DeviceNumberPoints)
// {
// 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
// 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<string, object> archiveDayRawData = new Dictionary<string, object>();
// 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
//}
2024-02-05 07:20:30 +08:00
private bool initWork ( string dbDateName )
2023-09-18 01:49:00 +08:00
{
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 ,
2023-10-03 21:07:04 +08:00
` point ` varchar ( 20 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL ,
2023-09-18 01:49:00 +08:00
` 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】【任務失敗】" ) ;
2024-02-05 07:20:30 +08:00
logger . LogError ( "【initWork】【任務失敗】[Exception]: {0}" , exception . ToString ( ) ) ;
}
2023-09-18 01:49:00 +08:00
return true ;
}
2022-10-14 16:08:54 +08:00
private List < Dictionary < string , object > > ArrangeRawData ( DeviceNumberPoint deviceNumberPoint , JObject jsonResult )
{
List < Dictionary < string , object > > arrangeRawDatas = new List < Dictionary < string , object > > ( ) ;
2023-07-17 14:18:57 +08:00
try
2022-10-14 16:08:54 +08:00
{
2023-07-17 14:18:57 +08:00
var histories = jsonResult [ "obj" ] [ "list" ] ;
var rawdateCount = Convert . ToInt32 ( jsonResult [ "obj" ] [ "int" ] [ "@val" ] . ToString ( ) ) ;
2022-10-14 16:08:54 +08:00
2023-07-17 14:18:57 +08:00
if ( rawdateCount = = 0 )
{
return null ;
}
if ( histories ! = null & & histories . HasValues )
{
if ( rawdateCount > 1 )
{ //多筆資料
foreach ( var history in histories )
{
Dictionary < string , object > arrangeRawData = new Dictionary < string , object > ( ) ;
arrangeRawData . Add ( "@device_number" , deviceNumberPoint . DeviceNumber ) ;
arrangeRawData . Add ( "@point" , deviceNumberPoint . Point ) ;
//時間
if ( history [ "abstime" ] ! = null & & history [ "abstime" ] . HasValues )
{
foreach ( var abstime in history [ "abstime" ] )
{
var name = abstime [ "@name" ] . ToString ( ) ;
switch ( name )
{
case "start" :
var startTimstamp = Convert . ToDateTime ( abstime [ "@val" ] . ToString ( ) ) . ToString ( "yyyy-MM-dd HH:mm:ss" ) ;
arrangeRawData . Add ( "@start_timestamp" , startTimstamp ) ;
break ;
case "end" :
var endTimstamp = Convert . ToDateTime ( abstime [ "@val" ] . ToString ( ) ) . ToString ( "yyyy-MM-dd HH:mm:ss" ) ;
arrangeRawData . Add ( "@end_timestamp" , endTimstamp ) ;
break ;
}
}
}
//區間內資料筆數
if ( history [ "int" ] ! = null & & history [ "int" ] . HasValues )
{
var count = Convert . ToInt32 ( histories [ "obj" ] [ "int" ] [ "@val" ] . ToString ( ) ) ;
arrangeRawData . Add ( "@count_rawdata" , count ) ;
}
//整合數值(最大、最小、平均、總和)
if ( history [ "real" ] ! = null & & history [ "real" ] . HasValues )
{
foreach ( var real in history [ "real" ] )
{
var name = real [ "@name" ] . ToString ( ) ;
switch ( name )
{
case "min" :
2023-07-20 10:08:50 +08:00
var min = real [ "@val" ] . ToString ( ) = = "NaN" ? - 1 : Decimal . Parse ( real [ "@val" ] . ToString ( ) , System . Globalization . NumberStyles . Float ) ;
2023-07-17 14:18:57 +08:00
arrangeRawData . Add ( "@min_rawdata" , min ) ;
break ;
case "max" :
2023-07-20 10:08:50 +08:00
var max = real [ "@val" ] . ToString ( ) = = "NaN" ? - 1 : Decimal . Parse ( real [ "@val" ] . ToString ( ) , System . Globalization . NumberStyles . Float ) ;
2023-07-17 14:18:57 +08:00
arrangeRawData . Add ( "@max_rawdata" , max ) ;
break ;
case "avg" :
2023-07-20 10:08:50 +08:00
var avg = real [ "@val" ] . ToString ( ) = = "NaN" ? - 1 : Decimal . Parse ( real [ "@val" ] . ToString ( ) , System . Globalization . NumberStyles . Float ) ;
2023-07-17 14:18:57 +08:00
arrangeRawData . Add ( "@avg_rawdata" , avg ) ;
break ;
case "sum" :
2023-07-20 10:08:50 +08:00
var sum = real [ "@val" ] . ToString ( ) = = "NaN" ? - 1 : Decimal . Parse ( real [ "@val" ] . ToString ( ) , System . Globalization . NumberStyles . Float ) ;
2023-07-17 14:18:57 +08:00
arrangeRawData . Add ( "@sum_rawdata" , sum ) ;
break ;
}
}
}
arrangeRawData . Add ( "@is_complete" , 1 ) ;
arrangeRawData . Add ( "@repeat_times" , 0 ) ;
arrangeRawData . Add ( "@fail_reason" , null ) ;
arrangeRawData . Add ( "@updated_at" , DateTime . Now . ToString ( "yyyy-MM-dd HH:mm:ss" ) ) ;
arrangeRawDatas . Add ( arrangeRawData ) ;
}
}
else
{ //單筆資料
2022-10-14 16:08:54 +08:00
Dictionary < string , object > arrangeRawData = new Dictionary < string , object > ( ) ;
arrangeRawData . Add ( "@device_number" , deviceNumberPoint . DeviceNumber ) ;
arrangeRawData . Add ( "@point" , deviceNumberPoint . Point ) ;
//時間
2023-07-17 14:18:57 +08:00
if ( histories [ "obj" ] [ "abstime" ] ! = null & & histories [ "obj" ] [ "abstime" ] . HasValues )
2022-10-14 16:08:54 +08:00
{
2023-07-17 14:18:57 +08:00
foreach ( var abstime in histories [ "obj" ] [ "abstime" ] )
2022-10-14 16:08:54 +08:00
{
var name = abstime [ "@name" ] . ToString ( ) ;
switch ( name )
{
case "start" :
var startTimstamp = Convert . ToDateTime ( abstime [ "@val" ] . ToString ( ) ) . ToString ( "yyyy-MM-dd HH:mm:ss" ) ;
arrangeRawData . Add ( "@start_timestamp" , startTimstamp ) ;
break ;
case "end" :
var endTimstamp = Convert . ToDateTime ( abstime [ "@val" ] . ToString ( ) ) . ToString ( "yyyy-MM-dd HH:mm:ss" ) ;
arrangeRawData . Add ( "@end_timestamp" , endTimstamp ) ;
break ;
}
}
}
//區間內資料筆數
2023-07-17 14:18:57 +08:00
if ( histories [ "obj" ] [ "int" ] ! = null & & histories [ "obj" ] [ "int" ] . HasValues )
2022-10-14 16:08:54 +08:00
{
var count = Convert . ToInt32 ( histories [ "obj" ] [ "int" ] [ "@val" ] . ToString ( ) ) ;
arrangeRawData . Add ( "@count_rawdata" , count ) ;
}
//整合數值(最大、最小、平均、總和)
2023-07-17 14:18:57 +08:00
if ( histories [ "obj" ] [ "real" ] ! = null & & histories [ "obj" ] [ "real" ] . HasValues )
2022-10-14 16:08:54 +08:00
{
2023-07-17 14:18:57 +08:00
foreach ( var real in histories [ "obj" ] [ "real" ] )
2022-10-14 16:08:54 +08:00
{
var name = real [ "@name" ] . ToString ( ) ;
switch ( name )
{
case "min" :
2023-07-20 10:08:50 +08:00
var min = real [ "@val" ] . ToString ( ) = = "NaN" ? - 1 : Decimal . Parse ( real [ "@val" ] . ToString ( ) , System . Globalization . NumberStyles . Float ) ;
2022-10-14 16:08:54 +08:00
arrangeRawData . Add ( "@min_rawdata" , min ) ;
break ;
case "max" :
2023-07-20 10:08:50 +08:00
var max = real [ "@val" ] . ToString ( ) = = "NaN" ? - 1 : Decimal . Parse ( real [ "@val" ] . ToString ( ) , System . Globalization . NumberStyles . Float ) ;
2022-10-14 16:08:54 +08:00
arrangeRawData . Add ( "@max_rawdata" , max ) ;
break ;
case "avg" :
2023-07-20 10:08:50 +08:00
var avg = real [ "@val" ] . ToString ( ) = = "NaN" ? - 1 : Decimal . Parse ( real [ "@val" ] . ToString ( ) , System . Globalization . NumberStyles . Float ) ;
2022-10-14 16:08:54 +08:00
arrangeRawData . Add ( "@avg_rawdata" , avg ) ;
break ;
case "sum" :
2023-07-20 10:08:50 +08:00
var sum = real [ "@val" ] . ToString ( ) = = "NaN" ? - 1 : Decimal . Parse ( real [ "@val" ] . ToString ( ) , System . Globalization . NumberStyles . Float ) ;
2022-10-14 16:08:54 +08:00
arrangeRawData . Add ( "@sum_rawdata" , sum ) ;
break ;
}
}
}
arrangeRawData . Add ( "@is_complete" , 1 ) ;
arrangeRawData . Add ( "@repeat_times" , 0 ) ;
arrangeRawData . Add ( "@fail_reason" , null ) ;
arrangeRawData . Add ( "@updated_at" , DateTime . Now . ToString ( "yyyy-MM-dd HH:mm:ss" ) ) ;
arrangeRawDatas . Add ( arrangeRawData ) ;
}
}
2023-07-17 14:18:57 +08:00
return arrangeRawDatas ;
}
catch ( Exception exception )
{
logger . LogError ( "【ArchiveElectricMeterDayJob】【任務失敗】" ) ;
2023-07-20 10:08:50 +08:00
logger . LogError ( "【ArchiveElectricMeterDayJob】【任務失敗】[Exception]: {0}" , exception . ToString ( ) ) ;
logger . LogError ( "【ArchiveElectricMeterDayJob】【任務失敗】[device_number]: {0}" , deviceNumberPoint . FullDeviceNumberPoint ) ;
logger . LogError ( "【ArchiveElectricMeterDayJob】【任務失敗】[JsonString]: {0}" , jsonResult . ToString ( ) ) ;
2023-07-17 14:18:57 +08:00
return arrangeRawDatas ;
2022-10-14 16:08:54 +08:00
}
}
}
}