ibms-MCUT/BackendWorkerService/Quartz/Jobs/ArchiveElectricMeterDayJob.cs
jiahao 61679da65a 1.bgService歸檔服務-改為補償機制
2.前台 api :棟別名稱修正、檔案下載修正
2023-09-24 20:44:16 +08:00

1734 lines
120 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Backend.Models;
using BackendWorkerService.Services.Implement;
using Dapper;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NPOI.SS.Formula.Functions;
using Quartz;
using Repository.BackendRepository.Implement;
using Repository.BackendRepository.Interface;
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;
private readonly IBackgroundServiceMsSqlRepository backgroundServiceMsSqlRepository;
protected readonly IDatabaseHelper _databaseHelper;
private readonly ILogger<Task_Detail> loggers;
private readonly ILogger<ProcEletricMeterService> logger2;
public ArchiveElectricMeterDayJob(
ILogger<ArchiveElectricMeterDayJob> logger,
IBackgroundServiceRepository backgroundServiceRepository,
IBackgroundServiceMsSqlRepository backgroundServiceMySqlRepository,
IDatabaseHelper databaseHelper, ILogger<Task_Detail> loggers, IBackendRepository backendRepository, ILogger<ProcEletricMeterService> logger2)
{
this.logger = logger;
this.backgroundServiceRepository = backgroundServiceRepository;
this.backgroundServiceMsSqlRepository = backgroundServiceMySqlRepository;
this._databaseHelper = databaseHelper;
this.loggers = loggers;
this.logger2 = logger2;
}
public async Task Execute(IJobExecutionContext context)
{
Task_Detail task_Detail = new Task_Detail(loggers, backgroundServiceRepository);
ProcEletricMeterService procEletricMeterService = new ProcEletricMeterService(logger2, backgroundServiceRepository, backgroundServiceMsSqlRepository);
string device_number = string.Empty;
try
{
//依據 variable 中的設定,現在是否需要執行
if(await task_Detail.GetNeedWorkTask("ArchiveElectricMeterDayJob", "All"))
{
await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "All", "任務開始");
EDFunction ed = new EDFunction();
XmlDocument xmlDocument = new XmlDocument();
ServicePointManager.DefaultConnectionLimit = 10;
var sqlArchive = $@"SELECT system_value as Value, system_key as Name FROM variable WHERE deleted = 0 AND system_type = 'archiveConfig'";
var saveToMSDB = await backgroundServiceRepository.GetOneAsync<string>("select system_value from variable where system_type = 'save_to_ms_db' and deleted = 0");
var variableArchive = await backgroundServiceRepository.GetAllAsync<KeyValue>(sqlArchive);
//取得 電表(E4) 水錶(W1)的小類代號
var electricMeterGuid = variableArchive.Where(x => x.Name == "ElectricMeterGuid").Select(x => x.Value).FirstOrDefault();
var waterMeterGuid = variableArchive.Where(x => x.Name == "WaterMeterGuid").Select(x => x.Value).FirstOrDefault();
// 獲取每棟的 station 與 代號 ex[M_G6001, G6] , [M_8F5001, $38F5], [M_G5001,G5]
var buildingStation = await backgroundServiceRepository.GetAllAsync<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)");
#region http variable
HttpWebRequest archiveRequest = null;
HttpWebResponse archiveResponse = null;
string archiveResponseContent = null;
string archiveJson = null;
JObject archiveJsonResult = new JObject();
#endregion
#region
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);
#endregion
#region
var sPointWhere = "is_needArchive = 1 and deleted = 0 AND device_name_tag = @sub_system_guid";
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 });
#endregion
#region
List<DeviceNumberPoint> electricDeviceNumberPoints = new List<DeviceNumberPoint>();
foreach (var electricMeter in electricMeters)
{
foreach (var point in electricPoints)
{
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);
electricDeviceNumberPoints.Add(deviceNumberPoint);
}
}
}
#endregion
#region
List<DeviceNumberPoint> waterDeviceNumberPoints = new List<DeviceNumberPoint>();
foreach (var waterMeter in waterMeters)
{
foreach (var point in waterPoints)
{
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);
waterDeviceNumberPoints.Add(deviceNumberPoint);
}
}
}
#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
var actionDay = DateTime.Now; // -- 改為 指定日期 --
var startDay = actionDay.AddDays(-1); //開始日期
var endDay = actionDay; //結束日期
#region
if (!await task_Detail.GetNeedWorkTask("ArchiveElectricMeterDayJob", "Day"))
{
}
else
{
try
{
//記錄本次作業時間 於 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');
//Create 歸檔用 table
initWork(dbDateName);
// --------- 需要變成指定日期 ----------------
var startTimestamp = string.Format("{0}T00:00:00.000+08:00", startDay.ToString("yyyy-MM-dd"));
//var endTimestamp = string.Format("{0}T23:59:59.000+08:00", endDay.ToString("yyyy-MM-dd"));
var endTimestamp = string.Format("{0}T00:00:10.000+08:00", endDay.ToString("yyyy-MM-dd"));
var historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
<abstime name='start' val='{startTimestamp}' />
<abstime name='end' val='{endTimestamp}' />
<reltime name='interval' val = 'PT2D' />
</obj>";
// 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>>();
#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);
if (electericArchiveDayRawDatas.Count() > 0)
{
var sql = $@" SET FOREIGN_KEY_CHECKS = 1;
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;
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)
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_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;";
await backgroundServiceRepository.ExecuteSql(sql, electericArchiveDayRawDatas);
if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1")
{
await backgroundServiceMsSqlRepository.ExecuteSql(mySql, electericArchiveDayRawDatas);
}
await task_Detail.InsertWorkTime_End("ArchiveElectricMeterDayJob", "Day", "任務完成");
//#region 月總計
//if (await task_Detail.GetNeedWorkTask("ArchiveElectricMeterDayJob", "Month"))
//{
// string targetTable = @$"archive_electric_meter_day_{dbDateName}";
// string yyyymm = targetTable.Split('_')[targetTable.Split('_').Length - 1]; //取出 archive_electric_meter_day_202308 的最後一段 202308
// string yyyy = yyyymm.Substring(0, 4);
// string mm = yyyymm.Remove(0, 4);
// //每次都 update 整個月
// sql = $@"update archive_electric_meter_month a
// join (
// select device_number, `point`
// , CONCAT('{yyyy}-{mm}', '-01') start_timestamp
// , LAST_DAY('{yyyy}/{mm}/01') end_timestamp
// , sum(count_rawdata) count_rawdata
// , sum(kwh_result) kwh_result
// , max(max_rawdata) max_rawdata
// , MIN(min_rawdata) min_rawdata
// from {targetTable} where point = 'KWH'
// group by device_number, `point`
// ) b on a.device_number = b.device_number and a.`point` = b.`point` and date(a.start_timestamp) = date(b.start_timestamp)
// set a.count_rawdata = b.count_rawdata, a.kwh_result = b.kwh_result, a.max_rawdata = b.max_rawdata, a.min_rawdata = b.min_rawdata, is_complete = 1";
// try
// {
// await backgroundServiceMsSqlRepository.ExecuteSql(sql);
// await task_Detail.InsertWorkTime_End("ArchiveElectricMeterDayJob", "Month", "任務完成");
// }
// catch (Exception exception)
// {
// await task_Detail.WorkFail("ArchiveElectricMeterDayJob", "Month", exception.ToString());
// logger.LogError("【ArchiveElectricMeterDayJob】【月歸檔】【任務失敗】");
// logger.LogError("【ArchiveElectricMeterDayJob】【月歸檔】【任務失敗】[Exception]{0}", exception.ToString());
// throw;
// }
//}
//#endregion
}
if (waterArchiveDayRawDatas.Count() > 0)
{
var sql = $@" 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);
}
}
}
catch (Exception exception)
{
await task_Detail.WorkFail("ArchiveElectricMeterDayJob", "Day", exception.ToString());
logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【任務失敗】");
logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【任務失敗】[Exception]{0}", exception.ToString());
}
finally
{
if (archiveResponse != null)
{
archiveResponse.Dispose();
archiveResponse.Close();
}
}
}
#endregion
#region
//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();
// }
// }
//}
#endregion
#region
if (await task_Detail.GetNeedWorkTask("ArchiveElectricMeterDayJob", "Month"))
{
try
{
await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "Month", "水電表月任務開始");
var FirstDay = actionDay.AddDays(-actionDay.Day + 1);
var LastDay = actionDay.AddMonths(1).AddDays(-actionDay.AddMonths(1).Day);
// 需要比原定日期增加 1天因 Niagara 內部判斷為 < lastData, 並未包含結束當天 add by jiahao @2023-09-16
var dayInMonth = DateTime.DaysInMonth(actionDay.Year, actionDay.Month) + 1;
var startTimestamp = string.Format("{0}T00:00:00.000+08:00", FirstDay.ToString("yyyy-MM-dd"));
//var endTimestamp = string.Format("{0}T23:59:59.000+08:00", LastDay.ToString("yyyy-MM-dd"));
var endTimestamp = string.Format("{0}T00:00:10.000+08:00", LastDay.ToString("yyyy-MM-dd")); // by jiahao @2023-09-16
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();
//抓取每個設備的資料
List<Dictionary<string, object>> electricArchiveMonthRawDatas = new List<Dictionary<string, object>>();
List<Dictionary<string, object>> waterArchiveMonthRawDatas = new List<Dictionary<string, object>>();
//收集 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
//stopWatch.Stop();
//logger.LogInformation("【ArchiveElectricMeterDayJob】【月歸檔效能檢驗】[取得資料花費時間]{0} 毫秒", stopWatch.ElapsedMilliseconds);
if (electricArchiveMonthRawDatas.Count() > 0)
{
var sql = $@"
UPDATE archive_electric_meter_month 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_month (
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_month 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_month (
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, electricArchiveMonthRawDatas);
if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1")
{
await backgroundServiceMsSqlRepository.ExecuteSql(mySql, electricArchiveMonthRawDatas);
}
}
if (waterArchiveMonthRawDatas.Count() > 0)
{
var sql = $@"
UPDATE archive_water_meter_month 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_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,
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_month 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_month (
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, waterArchiveMonthRawDatas);
if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1")
{
await backgroundServiceMsSqlRepository.ExecuteSql(mySql, waterArchiveMonthRawDatas);
}
}
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());
}
finally
{
if (archiveResponse != null)
{
archiveResponse.Dispose();
archiveResponse.Close();
}
}
}
#endregion
#region
//取得連線字串
if (await task_Detail.GetNeedWorkTask("ArchiveElectricMeterDayJob", "Compensate"))
{
try
{
await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "Compensate", "補償機制任務開始");
await procEletricMeterService.ArchiveData();
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】【任務失敗】");
logger.LogError("【ArchiveElectricMeterDayJob】【任務失敗】[Exception]{0} {1}", exception.ToString());
}
}
///// <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;
}
private List<Dictionary<string, object>> ArrangeRawData(DeviceNumberPoint deviceNumberPoint, JObject jsonResult)
{
List<Dictionary<string, object>> arrangeRawDatas = new List<Dictionary<string, object>>();
try
{
var histories = jsonResult["obj"]["list"];
var rawdateCount = Convert.ToInt32(jsonResult["obj"]["int"]["@val"].ToString());
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":
var min = real["@val"].ToString() == "NaN" ? -1 : Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float);
arrangeRawData.Add("@min_rawdata", min);
break;
case "max":
var max = real["@val"].ToString() == "NaN" ? -1 : Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float);
arrangeRawData.Add("@max_rawdata", max);
break;
case "avg":
var avg = real["@val"].ToString() == "NaN" ? -1 : Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float);
arrangeRawData.Add("@avg_rawdata", avg);
break;
case "sum":
var sum = real["@val"].ToString() == "NaN" ? -1 : Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float);
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
{ //單筆資料
Dictionary<string, object> arrangeRawData = new Dictionary<string, object>();
arrangeRawData.Add("@device_number", deviceNumberPoint.DeviceNumber);
arrangeRawData.Add("@point", deviceNumberPoint.Point);
//時間
if (histories["obj"]["abstime"] != null && histories["obj"]["abstime"].HasValues)
{
foreach (var abstime in histories["obj"]["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 (histories["obj"]["int"] != null && histories["obj"]["int"].HasValues)
{
var count = Convert.ToInt32(histories["obj"]["int"]["@val"].ToString());
arrangeRawData.Add("@count_rawdata", count);
}
//整合數值(最大、最小、平均、總和)
if (histories["obj"]["real"] != null && histories["obj"]["real"].HasValues)
{
foreach (var real in histories["obj"]["real"])
{
var name = real["@name"].ToString();
switch (name)
{
case "min":
var min = real["@val"].ToString() == "NaN" ? -1 : Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float);
arrangeRawData.Add("@min_rawdata", min);
break;
case "max":
var max = real["@val"].ToString() == "NaN" ? -1 : Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float);
arrangeRawData.Add("@max_rawdata", max);
break;
case "avg":
var avg = real["@val"].ToString() == "NaN" ? -1 : Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float);
arrangeRawData.Add("@avg_rawdata", avg);
break;
case "sum":
var sum = real["@val"].ToString() == "NaN" ? -1 : Decimal.Parse(real["@val"].ToString(), System.Globalization.NumberStyles.Float);
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);
}
}
return arrangeRawDatas;
}
catch (Exception exception)
{
logger.LogError("【ArchiveElectricMeterDayJob】【任務失敗】");
logger.LogError("【ArchiveElectricMeterDayJob】【任務失敗】[Exception]{0}", exception.ToString());
logger.LogError("【ArchiveElectricMeterDayJob】【任務失敗】[device_number]{0}", deviceNumberPoint.FullDeviceNumberPoint);
logger.LogError("【ArchiveElectricMeterDayJob】【任務失敗】[JsonString]{0}", jsonResult.ToString());
return arrangeRawDatas;
}
}
}
}