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 ;
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
2022-10-14 16:08:54 +08:00
#region 找 出 所 有 電 錶 設 備
2023-09-18 01:49:00 +08:00
var sWhere_E4 = @ $"device_name_tag = '{electricMeterGuid}' and deleted = 0 " ;
var sWhere_W1 = @ $"device_name_tag = '{waterMeterGuid}' and deleted = 0 " ;
var electricMeters = await backgroundServiceRepository . GetAllAsync < Device > ( "device" , sWhere_E4 ) ;
var waterMeters = await backgroundServiceRepository . GetAllAsync < Device > ( "device" , sWhere_W1 ) ;
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 )
{
DeviceNumberPoint deviceNumberPoint = new DeviceNumberPoint ( ) ;
deviceNumberPoint . DeviceNumber = electricMeter . Device_number ;
deviceNumberPoint . Point = point . points ;
deviceNumberPoint . FullDeviceNumberPoint = string . Format ( "{0}_{1}" , electricMeter . Device_number , point . points ) ;
2022-10-14 16:08:54 +08:00
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-05-10 18:06:02 +08:00
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 ) ) ;
#endregion 取 得 obix 設 定
2023-09-18 01:49:00 +08:00
var actionDay = DateTime . Now ; // -- 改為 指定日期 --
var startDay = actionDay . AddDays ( - 1 ) ; //開始日期
var endDay = actionDay ; //結束日期
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
{
try
{
2023-09-18 01:49:00 +08:00
//記錄本次作業時間 於 task_detal.lastwork_time
await task_Detail . InsertWorkTime ( "ArchiveElectricMeterDayJob" , "Day" , "水電表 day 任務開始" ) ;
var dbDateName = startDay . Year . ToString ( ) . PadLeft ( 4 , '0' ) + startDay . Month . ToString ( ) . PadLeft ( 2 , '0' ) ;
2022-10-14 16:08:54 +08:00
2023-09-18 01:49:00 +08:00
//Create 歸檔用 table
initWork ( dbDateName ) ;
// --------- 需要變成指定日期 ----------------
var startTimestamp = string . Format ( "{0}T00:00:00.000+08:00" , startDay . ToString ( "yyyy-MM-dd" ) ) ;
//var endTimestamp = string.Format("{0}T23:59:59.000+08:00", endDay.ToString("yyyy-MM-dd"));
var endTimestamp = string . Format ( "{0}T00:00:10.000+08:00" , endDay . ToString ( "yyyy-MM-dd" ) ) ;
2022-10-14 16:08:54 +08:00
var historyQueryFilter = $ @ "<obj is='obix: HistoryFilter'>
< abstime name = ' start ' val = ' { startTimestamp } ' / >
< abstime name = ' end ' val = ' { endTimestamp } ' / >
2023-09-18 01:49:00 +08:00
< reltime name = ' interval ' val = ' PT2D ' / >
2022-10-14 16:08:54 +08:00
< / obj > ";
2023-09-18 01:49:00 +08:00
// PT2D 需要設定超過1天
2022-10-14 16:08:54 +08:00
2023-09-18 01:49:00 +08:00
Stopwatch stopWatch = new Stopwatch ( ) ;
stopWatch . Start ( ) ;
2022-10-14 16:08:54 +08:00
//抓取每個設備的資料
2023-05-10 18:06:02 +08:00
List < Dictionary < string , object > > electericArchiveDayRawDatas = new List < Dictionary < string , object > > ( ) ;
List < Dictionary < string , object > > waterArchiveDayRawDatas = new List < Dictionary < string , object > > ( ) ;
2023-06-08 09:55:44 +08:00
2023-09-18 01:49:00 +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
// obixData_collect(ref device_number, xmlDocument, List<DeviceNumberPoint> DeviceNumberPoints, ObixApiConfig obixApiConfig, string encoded, string startTimestamp, string endTimestamp, string historyQueryFilter, List<Dictionary<string, object>> waterArchiveDayRawDatas)
//電錶結果收集
procEletricMeterService . obixData_collect ( xmlDocument , electricDeviceNumberPoints , obixApiConfig , encoded , startTimestamp , endTimestamp , historyQueryFilter , electericArchiveDayRawDatas ) ;
//水錶結果收集
procEletricMeterService . obixData_collect ( xmlDocument , waterDeviceNumberPoints , obixApiConfig , encoded , startTimestamp , endTimestamp , historyQueryFilter , waterArchiveDayRawDatas ) ;
stopWatch . Stop ( ) ;
logger . LogInformation ( "【ArchiveElectricMeterDayJob】【天歸檔】【效能檢驗】[取得資料花費時間]{0} 毫秒" , stopWatch . ElapsedMilliseconds ) ;
2022-10-14 16:08:54 +08:00
2023-05-10 18:06:02 +08:00
if ( electericArchiveDayRawDatas . Count ( ) > 0 )
2022-10-14 16:08:54 +08:00
{
2023-09-18 01:49:00 +08:00
var sql = $ @ " SET FOREIGN_KEY_CHECKS = 1;
2023-05-29 16:21:41 +08:00
UPDATE archive_electric_meter_day_ { dbDateName } SET
2023-05-04 16:45:05 +08:00
count_rawdata = @count_rawdata ,
min_rawdata = @min_rawdata ,
max_rawdata = @max_rawdata ,
2023-07-27 17:51:31 +08:00
kwh_result = @max_rawdata - @min_rawdata ,
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 ;
2023-05-29 16:21:41 +08:00
INSERT INTO archive_electric_meter_day_ { dbDateName } (
2023-05-04 16:45:05 +08:00
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 ,
@min_rawdata ,
@max_rawdata ,
2023-07-27 17:51:31 +08:00
@max_rawdata - @min_rawdata ,
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;
2023-05-29 17:10:19 +08:00
IF OBJECT_ID ( N ' dbo . archive_electric_meter_day_ { dbDateName } ' , N 'U' ) is null
2023-05-29 16:21:41 +08:00
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 ,
2023-07-27 17:51:31 +08:00
[kwh_result] [ decimal ] ( 15 , 3 ) NULL ,
2023-05-29 16:21:41 +08:00
[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
2022-10-14 16:08:54 +08:00
2023-05-29 16:21:41 +08:00
UPDATE archive_electric_meter_day_ { dbDateName } SET
2022-10-14 16:08:54 +08:00
count_rawdata = @count_rawdata ,
min_rawdata = @min_rawdata ,
max_rawdata = @max_rawdata ,
2023-07-27 17:51:31 +08:00
kwh_result = @max_rawdata - @min_rawdata ,
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
2023-05-29 16:21:41 +08:00
INSERT INTO archive_electric_meter_day_ { dbDateName } (
2022-10-14 16:08:54 +08:00
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 ,
@min_rawdata ,
@max_rawdata ,
2023-07-27 17:51:31 +08:00
@max_rawdata - @min_rawdata
2022-10-14 16:08:54 +08:00
@avg_rawdata ,
@sum_rawdata ,
@is_complete ,
@repeat_times ,
@fail_reason )
END
COMMIT TRANSACTION ; ";
2023-05-10 18:06:02 +08:00
await backgroundServiceRepository . ExecuteSql ( sql , electericArchiveDayRawDatas ) ;
2023-05-29 16:21:41 +08:00
if ( ! string . IsNullOrEmpty ( saveToMSDB ) & & saveToMSDB = = "1" )
{
await backgroundServiceMsSqlRepository . ExecuteSql ( mySql , electericArchiveDayRawDatas ) ;
}
2023-09-18 01:49:00 +08:00
await task_Detail . InsertWorkTime_End ( "ArchiveElectricMeterDayJob" , "Day" , "任務完成" ) ;
//#region 月總計
//if (await task_Detail.GetNeedWorkTask("ArchiveElectricMeterDayJob", "Month"))
//{
// string targetTable = @$"archive_electric_meter_day_{dbDateName}";
// string yyyymm = targetTable.Split('_')[targetTable.Split('_').Length - 1]; //取出 archive_electric_meter_day_202308 的最後一段 202308
// string yyyy = yyyymm.Substring(0, 4);
// string mm = yyyymm.Remove(0, 4);
// //每次都 update 整個月
// sql = $@"update archive_electric_meter_month a
// join (
// select device_number, `point`
// , CONCAT('{yyyy}-{mm}', '-01') start_timestamp
// , LAST_DAY('{yyyy}/{mm}/01') end_timestamp
// , sum(count_rawdata) count_rawdata
// , sum(kwh_result) kwh_result
// , max(max_rawdata) max_rawdata
// , MIN(min_rawdata) min_rawdata
// from {targetTable} where point = 'KWH'
// group by device_number, `point`
// ) b on a.device_number = b.device_number and a.`point` = b.`point` and date(a.start_timestamp) = date(b.start_timestamp)
// set a.count_rawdata = b.count_rawdata, a.kwh_result = b.kwh_result, a.max_rawdata = b.max_rawdata, a.min_rawdata = b.min_rawdata, is_complete = 1";
// try
// {
// await backgroundServiceMsSqlRepository.ExecuteSql(sql);
// await task_Detail.InsertWorkTime_End("ArchiveElectricMeterDayJob", "Month", "任務完成");
// }
// catch (Exception exception)
// {
// await task_Detail.WorkFail("ArchiveElectricMeterDayJob", "Month", exception.ToString());
// logger.LogError("【ArchiveElectricMeterDayJob】【月歸檔】【任務失敗】");
// logger.LogError("【ArchiveElectricMeterDayJob】【月歸檔】【任務失敗】[Exception]: {0}", exception.ToString());
// throw;
// }
//}
//#endregion
2023-05-10 18:06:02 +08:00
}
if ( waterArchiveDayRawDatas . Count ( ) > 0 )
{
2023-09-18 01:49:00 +08:00
var sql = $ @ " UPDATE archive_water_meter_day_{dbDateName} SET
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 ;
2023-05-29 17:10:19 +08:00
INSERT INTO archive_water_meter_day_ { dbDateName } (
2023-05-10 18:06:02 +08:00
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 )
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;
2023-05-29 16:21:41 +08:00
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 ,
2023-09-18 01:49:00 +08:00
[kwh_result] [ decimal ] ( 15 , 3 ) NULL ,
2023-05-29 16:21:41 +08:00
[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
2023-05-10 18:06:02 +08:00
2023-05-29 17:10:19 +08:00
UPDATE archive_water_meter_day_ { dbDateName } SET
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
2023-05-29 17:10:19 +08:00
INSERT INTO archive_water_meter_day_ { dbDateName } (
2023-05-10 18:06:02 +08:00
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
COMMIT TRANSACTION ; ";
await backgroundServiceRepository . ExecuteSql ( sql , waterArchiveDayRawDatas ) ;
2023-05-29 16:21:41 +08:00
if ( ! string . IsNullOrEmpty ( saveToMSDB ) & & saveToMSDB = = "1" )
{
await backgroundServiceMsSqlRepository . ExecuteSql ( mySql , waterArchiveDayRawDatas ) ;
}
2023-09-18 01:49:00 +08:00
}
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 ( ) ;
}
}
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 週 歸 檔
if ( await task_Detail . GetNeedWorkTask ( "ArchiveElectricMeterDayJob" , "Week" ) )
{
try
{
2023-06-06 16:43:46 +08:00
await task_Detail . InsertWorkTime ( "ArchiveElectricMeterDayJob" , "Week" , "水電表周任務開始" ) ;
2023-09-18 01:49:00 +08:00
int week = Convert . ToInt32 ( actionDay . DayOfWeek ) ;
2022-10-14 16:08:54 +08:00
week = week = = 0 ? 7 : week ;
2023-09-18 01:49:00 +08:00
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" ) ) ;
2022-10-14 16:08:54 +08:00
var historyQueryFilter = $ @ "<obj is='obix: HistoryFilter'>
< abstime name = ' start ' val = ' { startTimestamp } ' / >
< abstime name = ' end ' val = ' { endTimestamp } ' / >
2023-09-18 01:49:00 +08:00
< reltime name = ' interval ' val = ' PT8D ' / >
2022-10-14 16:08:54 +08:00
< / obj > ";
//Stopwatch stopWatch = new Stopwatch();
//stopWatch.Start();
//抓取每個設備的資料
2023-05-10 18:06:02 +08:00
List < Dictionary < string , object > > electricArchiveWeekRawDatas = new List < Dictionary < string , object > > ( ) ;
List < Dictionary < string , object > > waterArchiveWeekRawDatas = new List < Dictionary < string , object > > ( ) ;
2023-09-18 01:49:00 +08:00
//電錶結果收集
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
2022-10-14 16:08:54 +08:00
//stopWatch.Stop();
//logger.LogInformation("【ArchiveElectricMeterDayJob】【週歸檔】【效能檢驗】[取得資料花費時間]{0} 毫秒", stopWatch.ElapsedMilliseconds);
2023-05-10 18:06:02 +08:00
if ( electricArchiveWeekRawDatas . Count ( ) > 0 )
2022-10-14 16:08:54 +08:00
{
2023-05-04 16:45:05 +08:00
var sql = $ @ "
UPDATE archive_electric_meter_week SET
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_week (
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_week SET
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 ( @min_rawdata , 2 ) - round ( @max_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_week (
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
COMMIT TRANSACTION ; ";
2023-05-10 18:06:02 +08:00
await backgroundServiceRepository . ExecuteSql ( sql , electricArchiveWeekRawDatas ) ;
2023-05-29 16:21:41 +08:00
if ( ! string . IsNullOrEmpty ( saveToMSDB ) & & saveToMSDB = = "1" )
{
await backgroundServiceMsSqlRepository . ExecuteSql ( mySql , electricArchiveWeekRawDatas ) ;
}
2023-05-10 18:06:02 +08:00
}
if ( waterArchiveWeekRawDatas . Count ( ) > 0 )
{
2023-09-18 01:49:00 +08:00
var sql = $ @ " UPDATE archive_water_meter_week SET
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 ( @min_rawdata , 2 ) - round ( @max_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_week (
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 )
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_week SET
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_week (
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
COMMIT TRANSACTION ; ";
await backgroundServiceRepository . ExecuteSql ( sql , waterArchiveWeekRawDatas ) ;
2023-05-29 16:21:41 +08:00
if ( ! string . IsNullOrEmpty ( saveToMSDB ) & & saveToMSDB = = "1" )
{
await backgroundServiceMsSqlRepository . ExecuteSql ( mySql , waterArchiveWeekRawDatas ) ;
}
2022-10-14 16:08:54 +08:00
}
await task_Detail . InsertWorkTime_End ( "ArchiveElectricMeterDayJob" , "Week" , "任務完成" ) ;
}
catch ( Exception exception )
{
await task_Detail . WorkFail ( "ArchiveElectricMeterDayJob" , "Week" , 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 月 歸 檔
if ( await task_Detail . GetNeedWorkTask ( "ArchiveElectricMeterDayJob" , "Month" ) )
{
try
{
2023-06-06 16:43:46 +08:00
await task_Detail . InsertWorkTime ( "ArchiveElectricMeterDayJob" , "Month" , "水電表月任務開始" ) ;
2023-09-18 01:49:00 +08:00
var FirstDay = actionDay . AddDays ( - actionDay . Day + 1 ) ;
var LastDay = actionDay . AddMonths ( 1 ) . AddDays ( - actionDay . AddMonths ( 1 ) . Day ) ;
2022-10-14 16:08:54 +08:00
2023-09-18 01:49:00 +08:00
// 需要比原定日期增加 1天: 因 Niagara 內部判斷為 < lastData, 並未包含結束當天 add by jiahao @2023-09-16
var dayInMonth = DateTime . DaysInMonth ( actionDay . Year , actionDay . Month ) + 1 ;
2022-10-14 16:08:54 +08:00
var startTimestamp = string . Format ( "{0}T00:00:00.000+08:00" , FirstDay . ToString ( "yyyy-MM-dd" ) ) ;
2023-09-18 01:49:00 +08:00
//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
var historyQueryFilter = $ @ "<obj is='obix: HistoryFilter'>
< abstime name = ' start ' val = ' { startTimestamp } ' / >
< abstime name = ' end ' val = ' { endTimestamp } ' / >
< reltime name = ' interval ' val = ' PT { dayInMonth } D ' / >
< / obj > ";
//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 > > ( ) ;
2023-06-08 09:55:44 +08:00
2022-10-14 16:08:54 +08:00
2023-09-18 01:49:00 +08:00
//收集 niagara 電錶 Data
procEletricMeterService . obixData_collect ( xmlDocument , electricDeviceNumberPoints , obixApiConfig , encoded , startTimestamp , endTimestamp , historyQueryFilter , electricArchiveMonthRawDatas ) ;
//水錶結果收集
procEletricMeterService . obixData_collect ( xmlDocument , waterDeviceNumberPoints , obixApiConfig , encoded , startTimestamp , endTimestamp , historyQueryFilter , waterArchiveMonthRawDatas ) ;
#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-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
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
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
COMMIT TRANSACTION ; ";
2023-05-10 18:06:02 +08:00
await backgroundServiceRepository . ExecuteSql ( sql , electricArchiveMonthRawDatas ) ;
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
}
if ( waterArchiveMonthRawDatas . Count ( ) > 0 )
{
var sql = $ @ "
UPDATE archive_water_meter_month SET
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
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
COMMIT TRANSACTION ; ";
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-18 01:49:00 +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" , "任務完成" ) ;
}
catch ( Exception ex )
{
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-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
//}
private bool initWork ( string dbDateName )
{
try
{
string sql = $ @ "CREATE TABLE IF NOT EXISTS `archive_electric_meter_day_{dbDateName}` (
` device_number ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL ,
` point ` varchar ( 20 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL ,
` start_timestamp ` datetime ( 6 ) NOT NULL ,
` end_timestamp ` datetime ( 6 ) NULL DEFAULT NULL ,
` count_rawdata ` int ( 11 ) NULL DEFAULT NULL ,
` min_rawdata ` decimal ( 15 , 3 ) NULL DEFAULT NULL ,
` max_rawdata ` decimal ( 15 , 3 ) NULL DEFAULT NULL ,
` kwh_result ` decimal ( 15 , 3 ) NULL DEFAULT - 1.0 ,
` avg_rawdata ` decimal ( 15 , 3 ) NULL DEFAULT NULL ,
` sum_rawdata ` decimal ( 15 , 3 ) NULL DEFAULT NULL ,
` is_complete ` tinyint ( 3 ) UNSIGNED NULL DEFAULT NULL COMMENT ' 是 否 完 成 , 0 : 未 完 成 1 : 完 成 ' ,
` repeat_times ` int ( 11 ) NULL DEFAULT 0 COMMENT ' 重 複 次 數 ' ,
` fail_reason ` varchar ( 4000 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 失 敗 原 因 ' ,
` created_at ` timestamp NULL DEFAULT CURRENT_TIMESTAMP ,
` updated_at ` datetime ( 6 ) NULL DEFAULT NULL ,
PRIMARY KEY ( ` device_number ` , ` point ` , ` start_timestamp ` ) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC ;
CREATE TABLE IF NOT EXISTS ` archive_water_meter_day_ { dbDateName } ` (
` device_number ` varchar ( 50 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL ,
` point ` varchar ( 20 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL ,
` start_timestamp ` datetime ( 6 ) NOT NULL ,
` end_timestamp ` datetime ( 6 ) NULL DEFAULT NULL ,
` count_rawdata ` int ( 11 ) NULL DEFAULT NULL ,
` min_rawdata ` decimal ( 15 , 3 ) NULL DEFAULT NULL ,
` max_rawdata ` decimal ( 15 , 3 ) NULL DEFAULT NULL ,
` avg_rawdata ` decimal ( 15 , 3 ) NULL DEFAULT NULL ,
` sum_rawdata ` decimal ( 15 , 3 ) NULL DEFAULT NULL ,
` is_complete ` tinyint ( 3 ) UNSIGNED NULL DEFAULT NULL COMMENT ' 是 否 完 成 , 0 : 未 完 成 1 : 完 成 ' ,
` repeat_times ` int ( 11 ) NULL DEFAULT 0 COMMENT ' 重 複 次 數 ' ,
` fail_reason ` varchar ( 4000 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ' 失 敗 原 因 ' ,
` created_at ` timestamp NULL DEFAULT CURRENT_TIMESTAMP ,
` updated_at ` datetime ( 6 ) NULL DEFAULT NULL ,
PRIMARY KEY ( ` device_number ` , ` point ` , ` start_timestamp ` ) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC ; ";
backgroundServiceRepository . ExecuteSql ( sql ) ;
}
catch ( Exception exception )
{
logger . LogError ( "【initWork】【任務失敗】" ) ;
logger . LogError ( "【initWork】【任務失敗】[Exception]: {0}" , exception . ToString ( ) ) ;
}
return true ;
}
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
}
}
}
}