1.bgService歸檔服務-改為補償機制
2.前台 api :棟別名稱修正、檔案下載修正
This commit is contained in:
parent
61679da65a
commit
0eed71c0a4
@ -2,6 +2,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Security.Permissions;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Backend.Models
|
namespace Backend.Models
|
||||||
@ -80,6 +81,16 @@ namespace Backend.Models
|
|||||||
public string device_system_tag { get; set; }
|
public string device_system_tag { get; set; }
|
||||||
public List<DeviceDisaster> Device_disasters { get; set; } //防災類型
|
public List<DeviceDisaster> Device_disasters { get; set; } //防災類型
|
||||||
public List<DeviceNode> Device_nodes { get; set; } //設備子節點
|
public List<DeviceNode> Device_nodes { get; set; } //設備子節點
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 前次成功日期;下次重新歸檔日期
|
||||||
|
/// </summary>
|
||||||
|
public System.DateTime archive_lastDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 前次執行日期
|
||||||
|
/// </summary>
|
||||||
|
public System.DateTime archive_lastActionDate { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DeviceDisaster
|
public class DeviceDisaster
|
||||||
@ -264,6 +275,16 @@ namespace Backend.Models
|
|||||||
public string DeviceNumber { get; set; }
|
public string DeviceNumber { get; set; }
|
||||||
public string Point { get; set; }
|
public string Point { get; set; }
|
||||||
public string FullDeviceNumberPoint { get; set; }
|
public string FullDeviceNumberPoint { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 前次成功日期;下次重新歸檔日期
|
||||||
|
/// </summary>
|
||||||
|
public System.DateTime archive_lastDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 前次執行日期
|
||||||
|
/// </summary>
|
||||||
|
//public System.DateTime archive_lastActionDate { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ImportDevForCoo
|
public class ImportDevForCoo
|
||||||
|
@ -45,6 +45,15 @@ namespace Backend.Models
|
|||||||
public byte is_bool { get; set; }
|
public byte is_bool { get; set; }
|
||||||
public byte is_link { get; set; }
|
public byte is_link { get; set; }
|
||||||
public int is_show_history { get; set; }
|
public int is_show_history { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 歸檔作業暫存用 - 啟動的開始日期, value = (table)device.archive_lastDate 前次成功日期
|
||||||
|
/// </summary>
|
||||||
|
public string start_archive_day { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 歸檔作業暫存用 - 啟動的結束日期, value = 執行的當下日期
|
||||||
|
/// </summary>
|
||||||
|
public string end_archive_day { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Checksame
|
public class Checksame
|
||||||
|
@ -79,11 +79,17 @@ namespace BackendWorkerService.Quartz.Jobs
|
|||||||
string archiveJson = null;
|
string archiveJson = null;
|
||||||
JObject archiveJsonResult = new JObject();
|
JObject archiveJsonResult = new JObject();
|
||||||
#endregion
|
#endregion
|
||||||
#region 找出所有電錶設備
|
#region 找出所有電錶設備 與前次成功日期
|
||||||
var sWhere_E4 = @$"device_name_tag = '{electricMeterGuid}' "; // and deleted = 0 ";
|
var sWhere_E4 = @$"device_name_tag = '{electricMeterGuid}' and deleted = 0 ";
|
||||||
var sWhere_W1 = @$"device_name_tag = '{waterMeterGuid}'"; // and deleted = 0 ";
|
var sWhere_W1 = @$"device_name_tag = '{waterMeterGuid}' and deleted = 0 ";
|
||||||
var electricMeters = await backgroundServiceRepository.GetAllAsync<Device>("device", sWhere_E4);
|
var electricMeters = await backgroundServiceRepository.GetAllAsync<Device>("device", sWhere_E4);
|
||||||
var waterMeters = await backgroundServiceRepository.GetAllAsync<Device>("device", sWhere_W1);
|
var waterMeters = await backgroundServiceRepository.GetAllAsync<Device>("device", sWhere_W1);
|
||||||
|
|
||||||
|
var device_test = electricMeters.Where(e => e.Device_number == "NTPC_G6_EE_E4_B1F_CB3_WHT_N1").First();
|
||||||
|
if (device_test != null)
|
||||||
|
{
|
||||||
|
logger.LogInformation($@"s1 devie_number = NTPC_G6_EE_E4_B1F_CB3_WHT_N1 archive_lastActionDate={device_test.archive_lastActionDate} archive_lastDate={device_test.archive_lastDate}");
|
||||||
|
}
|
||||||
#endregion 找出所有電錶設備
|
#endregion 找出所有電錶設備
|
||||||
|
|
||||||
#region 找出所有電錶系統的點位
|
#region 找出所有電錶系統的點位
|
||||||
@ -104,7 +110,7 @@ namespace BackendWorkerService.Quartz.Jobs
|
|||||||
deviceNumberPoint.DeviceNumber = electricMeter.Device_number;
|
deviceNumberPoint.DeviceNumber = electricMeter.Device_number;
|
||||||
deviceNumberPoint.Point = point.points;
|
deviceNumberPoint.Point = point.points;
|
||||||
deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", electricMeter.Device_number, point.points);
|
deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", electricMeter.Device_number, point.points);
|
||||||
|
deviceNumberPoint.archive_lastDate = electricMeter.archive_lastDate;
|
||||||
electricDeviceNumberPoints.Add(deviceNumberPoint);
|
electricDeviceNumberPoints.Add(deviceNumberPoint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -141,9 +147,6 @@ namespace BackendWorkerService.Quartz.Jobs
|
|||||||
String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(obixApiConfig.UserName + ":" + obixApiConfig.Password));
|
String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(obixApiConfig.UserName + ":" + obixApiConfig.Password));
|
||||||
#endregion 取得obix 設定
|
#endregion 取得obix 設定
|
||||||
|
|
||||||
var actionDay = DateTime.Now; // -- 改為 指定日期 --
|
|
||||||
var startDay = actionDay.AddDays(-1); //開始日期
|
|
||||||
var endDay = actionDay; //結束日期
|
|
||||||
|
|
||||||
#region 天歸檔
|
#region 天歸檔
|
||||||
if (!await task_Detail.GetNeedWorkTask("ArchiveElectricMeterDayJob", "Day"))
|
if (!await task_Detail.GetNeedWorkTask("ArchiveElectricMeterDayJob", "Day"))
|
||||||
@ -151,437 +154,37 @@ namespace BackendWorkerService.Quartz.Jobs
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
//記錄本次作業時間 於 task_detal.lastwork_time
|
||||||
|
await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "Day", "水電表 day 任務開始");
|
||||||
|
|
||||||
|
#region 從前次 成功日期到昨天為止
|
||||||
|
var actionDay = DateTime.Now; // -- 改為 指定日期 --
|
||||||
|
var startDay = actionDay.AddDays(-1); //開始日期
|
||||||
|
var endDay = actionDay; //結束日期
|
||||||
|
|
||||||
|
var dbDateName = startDay.Year.ToString().PadLeft(4, '0') + startDay.Month.ToString().PadLeft(2, '0');
|
||||||
|
//Create 歸檔用 table
|
||||||
|
initWork(dbDateName);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
//記錄本次作業時間 於 task_detal.lastwork_time
|
//foreach (var electricMeter in electricMeters)
|
||||||
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", "");
|
// startDay = DateTime.Parse(electricMeter.archive_lastDate.ToString("yyyy-MM-dd"));// 起始日
|
||||||
// var station = backgroundServiceRepository.GetOneAsync<string>($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and
|
//endDay = DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")); // 結束日
|
||||||
// device_system_tag = '{device_number.Split("_")[2]}' and device_name_tag = '{device_number.Split("_")[3]}'
|
//foreach (DateTime day in procEletricMeterService.EachDay(startDay, endDay))
|
||||||
// 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}";
|
// logger.LogInformation(@$"【EachDay】{electricMeter.Device_number} startDay=", startDay + " endDay=" + endDay);
|
||||||
// string yyyymm = targetTable.Split('_')[targetTable.Split('_').Length - 1]; //取出 archive_electric_meter_day_202308 的最後一段 202308
|
// if (electricMeter.Device_number == "NTPC_G6_EE_E4_B1F_CB3_WHT_N1")
|
||||||
// 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);
|
// logger.LogInformation($@"EachDay devie_number = NTPC_G6_EE_E4_B1F_CB3_WHT_N1 startDay={startDay} endDay={endDay}");
|
||||||
// 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;
|
|
||||||
// }
|
// }
|
||||||
|
// 每日資料製作
|
||||||
|
await day_proc(procEletricMeterService, saveToMSDB, archiveResponse, electricDeviceNumberPoints, waterDeviceNumberPoints, obixApiConfig, encoded, startDay, endDay, dbDateName);
|
||||||
|
|
||||||
//}
|
//}
|
||||||
//#endregion
|
//}
|
||||||
}
|
await task_Detail.InsertWorkTime_End("ArchiveElectricMeterDayJob", "Day", "任務完成");
|
||||||
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)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
@ -597,6 +200,8 @@ namespace BackendWorkerService.Quartz.Jobs
|
|||||||
archiveResponse.Close();
|
archiveResponse.Close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion 天歸檔
|
#endregion 天歸檔
|
||||||
@ -1004,11 +609,13 @@ namespace BackendWorkerService.Quartz.Jobs
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "Month", "水電表月任務開始");
|
await task_Detail.InsertWorkTime("ArchiveElectricMeterDayJob", "Month", "水電表月任務開始");
|
||||||
var FirstDay = actionDay.AddDays(-actionDay.Day + 1);
|
//var FirstDay = actionDay.AddDays(-actionDay.Day + 1);
|
||||||
var LastDay = actionDay.AddMonths(1).AddDays(-actionDay.AddMonths(1).Day);
|
//var LastDay = actionDay.AddMonths(1).AddDays(-actionDay.AddMonths(1).Day);
|
||||||
|
var FirstDay = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-") + "01");
|
||||||
|
var LastDay = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd"));
|
||||||
|
|
||||||
// 需要比原定日期增加 1天:因 Niagara 內部判斷為 < lastData, 並未包含結束當天 add by jiahao @2023-09-16
|
// 需要比原定日期增加 1天:因 Niagara 內部判斷為 < lastData, 並未包含結束當天 add by jiahao @2023-09-16
|
||||||
var dayInMonth = DateTime.DaysInMonth(actionDay.Year, actionDay.Month) + 1;
|
var dayInMonth = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month) + 1;
|
||||||
|
|
||||||
var startTimestamp = string.Format("{0}T00:00:00.000+08:00", FirstDay.ToString("yyyy-MM-dd"));
|
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}T23:59:59.000+08:00", LastDay.ToString("yyyy-MM-dd"));
|
||||||
@ -1020,6 +627,7 @@ namespace BackendWorkerService.Quartz.Jobs
|
|||||||
<reltime name='interval' val = 'PT{dayInMonth}D' />
|
<reltime name='interval' val = 'PT{dayInMonth}D' />
|
||||||
</obj>";
|
</obj>";
|
||||||
|
|
||||||
|
logger.LogInformation("【ArchiveElectricMeterMonth】startTimestamp=", startTimestamp + " endTimestamp=" + endTimestamp);
|
||||||
//Stopwatch stopWatch = new Stopwatch();
|
//Stopwatch stopWatch = new Stopwatch();
|
||||||
//stopWatch.Start();
|
//stopWatch.Start();
|
||||||
|
|
||||||
@ -1029,12 +637,15 @@ namespace BackendWorkerService.Quartz.Jobs
|
|||||||
|
|
||||||
|
|
||||||
//收集 niagara 電錶 Data
|
//收集 niagara 電錶 Data
|
||||||
procEletricMeterService.obixData_collect(xmlDocument, electricDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, electricArchiveMonthRawDatas);
|
procEletricMeterService.obixData_collect_range(xmlDocument, electricDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, electricArchiveMonthRawDatas);
|
||||||
|
|
||||||
//水錶結果收集
|
//水錶結果收集
|
||||||
procEletricMeterService.obixData_collect(xmlDocument, waterDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, waterArchiveMonthRawDatas);
|
procEletricMeterService.obixData_collect_range(xmlDocument, waterDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, waterArchiveMonthRawDatas);
|
||||||
|
|
||||||
|
|
||||||
|
//if (electricMeters.Where(e => e.Device_number == "NTPC_D8_EE_E4_RF_Total_WHT_N1").Count() == 1)
|
||||||
|
//{
|
||||||
|
// logger.LogInformation("【ArchiveElectricMeterDayMonth】有包含 NTPC_D8_EE_E4_RF_Total_WHT_N1 ");
|
||||||
|
//}
|
||||||
#region old request niagara by obix
|
#region old request niagara by obix
|
||||||
//foreach (var deviceNumberPoint in electricDeviceNumberPoints)
|
//foreach (var deviceNumberPoint in electricDeviceNumberPoints)
|
||||||
//{
|
//{
|
||||||
@ -1428,6 +1039,404 @@ namespace BackendWorkerService.Quartz.Jobs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task day_proc( ProcEletricMeterService procEletricMeterService, string saveToMSDB, HttpWebResponse archiveResponse, List<DeviceNumberPoint> electricDeviceNumberPoints, List<DeviceNumberPoint> waterDeviceNumberPoints, ObixApiConfig obixApiConfig, string encoded, DateTime startDay, DateTime endDay, string dbDateName)
|
||||||
|
{
|
||||||
|
XmlDocument xmlDocument = new XmlDocument();
|
||||||
|
|
||||||
|
// --------- 需要變成指定日期 ----------------
|
||||||
|
|
||||||
|
// 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 NTPC_D8_EE_E4_RF_Total_WHT_N1
|
||||||
|
//if (electricMeters.Where(e => e.Device_number == "NTPC_D8_EE_E4_RF_Total_WHT_N1").Count() == 1)
|
||||||
|
//{
|
||||||
|
// logger.LogInformation("【ArchiveElectricMeterDayJob】有包含 NTPC_D8_EE_E4_RF_Total_WHT_N1 ");
|
||||||
|
//}
|
||||||
|
//if (electricDeviceNumberPoints..Device_number == "NTPC_G6_EE_E4_B1F_CB3_WHT_N1")
|
||||||
|
//{
|
||||||
|
// logger.LogInformation($@"devie_number = NTPC_G6_EE_E4_B1F_CB3_WHT_N1 obix startDay={startTimestamp} endDay={endTimestamp}");
|
||||||
|
//}
|
||||||
|
//電錶結果收集
|
||||||
|
// procEletricMeterService.obixData_collect(xmlDocument, electricDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, electericArchiveDayRawDatas);
|
||||||
|
procEletricMeterService.obixData_collect(xmlDocument, electricDeviceNumberPoints, obixApiConfig, encoded, electericArchiveDayRawDatas);
|
||||||
|
|
||||||
|
//水錶結果收集
|
||||||
|
//procEletricMeterService.obixData_collect(xmlDocument, waterDeviceNumberPoints, obixApiConfig, encoded, startTimestamp, endTimestamp, historyQueryFilter, waterArchiveDayRawDatas);
|
||||||
|
procEletricMeterService.obixData_collect(xmlDocument, waterDeviceNumberPoints, obixApiConfig, encoded, 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,
|
||||||
|
archive_lastDate = @updated_at,
|
||||||
|
archive_lastActionDate = @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,
|
||||||
|
archive_lastDate,
|
||||||
|
archive_lastActionDate)
|
||||||
|
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,
|
||||||
|
@updated_at,
|
||||||
|
@updated_at,
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///// <summary>
|
///// <summary>
|
||||||
///// 獲取 Niagara 資料,並儲存於 List 中
|
///// 獲取 Niagara 資料,並儲存於 List 中
|
||||||
|
@ -21,6 +21,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax;
|
|||||||
using BackendWorkerService.Quartz;
|
using BackendWorkerService.Quartz;
|
||||||
using BackendWorkerService.Quartz.Jobs;
|
using BackendWorkerService.Quartz.Jobs;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Org.BouncyCastle.Asn1.Pkcs;
|
||||||
|
|
||||||
namespace BackendWorkerService.Services.Implement
|
namespace BackendWorkerService.Services.Implement
|
||||||
{
|
{
|
||||||
@ -425,7 +426,7 @@ namespace BackendWorkerService.Services.Implement
|
|||||||
from {targetTable} where point = 'KWH'
|
from {targetTable} where point = 'KWH'
|
||||||
group by device_number, `point`
|
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)
|
) 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, a.is_complete = 1;";
|
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, a.is_complete = 1, updated_at = now();";
|
||||||
await backgroundServiceRepository.ExecuteSql(sql);
|
await backgroundServiceRepository.ExecuteSql(sql);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@ -955,78 +956,199 @@ namespace BackendWorkerService.Services.Implement
|
|||||||
/// <param name="endTimestamp"></param>
|
/// <param name="endTimestamp"></param>
|
||||||
/// <param name="historyQueryFilter"></param>
|
/// <param name="historyQueryFilter"></param>
|
||||||
/// <param name="waterArchiveDayRawDatas"></param>
|
/// <param name="waterArchiveDayRawDatas"></param>
|
||||||
public void obixData_collect(XmlDocument xmlDocument, List<DeviceNumberPoint> DeviceNumberPoints, ObixApiConfig obixApiConfig, string encoded, string startTimestamp, string endTimestamp, string historyQueryFilter, List<Dictionary<string, object>> resultArchiveDayRawDatas)
|
public void obixData_collect(XmlDocument xmlDocument, List<DeviceNumberPoint> DeviceNumberPoints, ObixApiConfig obixApiConfig, string encoded, List<Dictionary<string, object>> resultArchiveDayRawDatas)
|
||||||
{
|
{
|
||||||
|
|
||||||
#region 水電錶 save to DB start
|
#region 水電錶 save to DB start
|
||||||
|
|
||||||
foreach (var deviceNumberPoint in DeviceNumberPoints)
|
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;
|
|
||||||
|
|
||||||
|
if (deviceNumberPoint.archive_lastDate.ToString("yyyy-MM-dd") == DateTime.Now.ToString("yyyy-MM-dd")) break; //如果是今天 就不要用歸檔了
|
||||||
|
|
||||||
byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter);
|
var startDay = string.Format("{0}T00:00:00.000+08:00", deviceNumberPoint.archive_lastDate.ToString("yyyy-MM-dd").Replace(" ", "T"));
|
||||||
using (Stream reqStream = archiveRequest.GetRequestStream())
|
var endDay = "";
|
||||||
|
//var endTimestamp = string.Format("{0}+08:00", error_day.End_timestamp.Replace(" ", "T"));
|
||||||
|
//if (DateTime.Parse(startTimestamp).ToString("yyyy-MM-dd") == DateTime.Parse(endTimestamp).ToString("yyyy-MM-dd"))
|
||||||
|
//{
|
||||||
|
// //同一天為 舊有格式 採用 endtime
|
||||||
|
// endDay = string.Format("{0}T00:00:10.000+08:00", DateTime.Parse(endTimestamp).AddDays(1).ToString("yyyy-MM-dd").Replace(" ", "T"));
|
||||||
|
//}
|
||||||
|
//else
|
||||||
|
//{ //不同天為新格式 採用 Start_timestamp
|
||||||
|
endDay = string.Format("{0}T00:00:10.000+08:00", DateTime.Parse(endDay).AddDays(1).ToString("yyyy-MM-dd").Replace(" ", "T"));
|
||||||
|
//}
|
||||||
|
logger.LogInformation($@"before startDay = {startDay} endDay={endDay}"); // ----------- log
|
||||||
|
|
||||||
|
#region
|
||||||
|
foreach (DateTime day in EachDay(startDay, endDay))
|
||||||
{
|
{
|
||||||
reqStream.Write(byteArray, 0, byteArray.Length);
|
if (day.ToString("yyyy-MM-dd") == DateTime.Now.ToString("yyyy-MM-dd")) break; //如果是今天 就不要用歸檔了
|
||||||
}
|
|
||||||
|
|
||||||
var archiveResponse = (HttpWebResponse)archiveRequest.GetResponse();
|
var sDay = string.Format("{0}T00:00:00.000+08:00", day.ToString("yyyy-MM-dd").Replace(" ", "T"));
|
||||||
var archiveResponseContent = new StreamReader(archiveResponse.GetResponseStream()).ReadToEnd();
|
var eDay = string.Format("{0}T00:00:10.000+08:00", day.AddDays(1).ToString("yyyy-MM-dd").Replace(" ", "T"));
|
||||||
archiveResponse.Dispose();
|
logger.LogInformation($@"after sDay = {sDay} eDay={eDay}"); // ----------- log
|
||||||
archiveResponse.Close();
|
|
||||||
|
|
||||||
xmlDocument.LoadXml(archiveResponseContent);
|
string historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
|
||||||
var archiveJson = JsonConvert.SerializeXmlNode(xmlDocument);
|
<abstime name='start' val='{startDay}' />
|
||||||
var archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson);
|
<abstime name='end' val='{endDay}' />
|
||||||
|
<reltime name='interval' val = 'PT2D' />
|
||||||
|
</obj>";
|
||||||
|
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;
|
||||||
|
|
||||||
if (archiveJsonResult.ContainsKey("err")) //抓取錯誤
|
|
||||||
{
|
|
||||||
//logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【取得資料失敗】");
|
|
||||||
//logger.LogError("【ArchiveElectricMeterDayJob】【天歸檔】【取得資料失敗】[錯誤內容]:{0}", archiveDayJsonResult);
|
|
||||||
|
|
||||||
Dictionary<string, object> archiveDayRawData = new Dictionary<string, object>();
|
byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter);
|
||||||
archiveDayRawData.Add("@device_number", deviceNumberPoint.DeviceNumber);
|
using (Stream reqStream = archiveRequest.GetRequestStream())
|
||||||
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);
|
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 (device_number == "NTPC_D8_EE_E4_RF_Total_WHT_N1")
|
||||||
|
//{
|
||||||
|
// logger.LogError("obixData_collect - NTPC_D8_EE_E4_RF_Total_WHT_N1 s=" + startTimestamp.Replace("T", " ").Substring(0, 19) + " e = " + endTimestamp.Replace("T", " ").Substring(0, 19) + " json = " + archiveJsonResult);
|
||||||
|
//}
|
||||||
|
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", sDay.Replace("T", " ").Substring(0, 19));
|
||||||
|
archiveDayRawData.Add("@end_timestamp", eDay.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
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion 水電錶作業 save to DB end
|
#endregion 水電錶作業 save to DB end
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void obixData_collect_range(XmlDocument xmlDocument, List<DeviceNumberPoint> DeviceNumberPoints, ObixApiConfig obixApiConfig, string encoded, string startTimestamp, string endTimestamp, string historyQueryFilter, List<Dictionary<string, object>> resultArchiveDayRawDatas)
|
||||||
|
{
|
||||||
|
|
||||||
|
#region 水電錶 save to DB start
|
||||||
|
// 需要先 group by DeviceNumberPoints 因為已經展開日期
|
||||||
|
var DevicePoints = DeviceNumberPoints
|
||||||
|
.GroupBy(x => new { _FullDeviceNumberPoint = x.FullDeviceNumberPoint })
|
||||||
|
.Select(x => new DeviceNumberPoint { FullDeviceNumberPoint = x.Key._FullDeviceNumberPoint }).ToList();
|
||||||
|
|
||||||
|
logger.LogInformation($@"before groupby DeviceNumberPoints.Count() = {DeviceNumberPoints.Count().ToString()} after DevicePoints.Count() = {DevicePoints.Count().ToString()}"); // ----------- log
|
||||||
|
|
||||||
|
foreach (var deviceNumberPoint in DevicePoints)
|
||||||
|
{
|
||||||
|
#region
|
||||||
|
// foreach (DateTime day in EachDay(startDay, endDay))
|
||||||
|
//{
|
||||||
|
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 (device_number == "NTPC_D8_EE_E4_RF_Total_WHT_N1")
|
||||||
|
//{
|
||||||
|
// logger.LogError("obixData_collect - NTPC_D8_EE_E4_RF_Total_WHT_N1 s=" + startTimestamp.Replace("T", " ").Substring(0, 19) + " e = " + endTimestamp.Replace("T", " ").Substring(0, 19) + " json = " + archiveJsonResult);
|
||||||
|
//}
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion 水電錶作業 save to DB end
|
||||||
|
}
|
||||||
|
|
||||||
private List<Dictionary<string, object>> ArrangeRawData(DeviceNumberPoint deviceNumberPoint, JObject jsonResult)
|
private List<Dictionary<string, object>> ArrangeRawData(DeviceNumberPoint deviceNumberPoint, JObject jsonResult)
|
||||||
{
|
{
|
||||||
@ -1185,6 +1307,25 @@ namespace BackendWorkerService.Services.Implement
|
|||||||
return arrangeRawDatas;
|
return arrangeRawDatas;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 回傳區間內的每一天
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="from"></param>
|
||||||
|
/// <param name="thru"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public IEnumerable<DateTime> EachDay(string from, string thru)
|
||||||
|
{
|
||||||
|
var strtday = DateTime.Parse(from);
|
||||||
|
var endday = DateTime.Parse(thru);
|
||||||
|
for (var day = strtday.Date; day.Date <= endday.Date; day = day.AddDays(1))
|
||||||
|
yield return day;
|
||||||
|
|
||||||
|
/// 使用方式
|
||||||
|
//foreach (DateTime day in EachDay(DateTime.Parse(date1), DateTime.Parse(date2)))
|
||||||
|
//{
|
||||||
|
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -860,9 +860,11 @@ namespace FrontendWebApi.ApiControllers
|
|||||||
{
|
{
|
||||||
bool flag = true;
|
bool flag = true;
|
||||||
bool total_flag = false;
|
bool total_flag = false;
|
||||||
|
string outputFileName = input.Mode == HydroMeterInputSearchMode.All ? "用電月份比較_含分盤_" : "用電月份比較_";
|
||||||
if (input.Mode == HydroMeterInputSearchMode.Custom)
|
if (input.Mode == HydroMeterInputSearchMode.Custom)
|
||||||
{
|
{
|
||||||
//flag = false;
|
//flag = false;
|
||||||
|
|
||||||
total_flag = true;
|
total_flag = true;
|
||||||
input.Mode = HydroMeterInputSearchMode.All;
|
input.Mode = HydroMeterInputSearchMode.All;
|
||||||
}
|
}
|
||||||
@ -978,7 +980,7 @@ namespace FrontendWebApi.ApiControllers
|
|||||||
{
|
{
|
||||||
"綜合大樓",
|
"綜合大樓",
|
||||||
"體育舘",
|
"體育舘",
|
||||||
"化工館",
|
"化工電機",
|
||||||
"創新大樓",
|
"創新大樓",
|
||||||
"學人會館",
|
"學人會館",
|
||||||
"綠能中心"
|
"綠能中心"
|
||||||
@ -999,7 +1001,7 @@ namespace FrontendWebApi.ApiControllers
|
|||||||
"機械館分盤",
|
"機械館分盤",
|
||||||
"電機館分盤",
|
"電機館分盤",
|
||||||
"學1-4舍空調總盤",
|
"學1-4舍空調總盤",
|
||||||
"學五舍總盤",
|
"學五舍五眷總盤",
|
||||||
"8眷舍分盤",
|
"8眷舍分盤",
|
||||||
"企教分盤",
|
"企教分盤",
|
||||||
"7眷舍分盤",
|
"7眷舍分盤",
|
||||||
@ -1069,7 +1071,7 @@ namespace FrontendWebApi.ApiControllers
|
|||||||
flag = false;
|
flag = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((flag && buildingName == "化工館" && deviceFullName == "電機館分盤") || (flag && buildingName == "綠能中心" && deviceFullName == "薄膜分盤"))
|
if ((flag && buildingName == "化工電機" && deviceFullName == "電機館分盤") || (flag && buildingName == "綠能中心" && deviceFullName == "薄膜分盤"))
|
||||||
{
|
{
|
||||||
row = sheet.GetRow(rowIndex) ?? sheet.CreateRow(rowIndex);
|
row = sheet.GetRow(rowIndex) ?? sheet.CreateRow(rowIndex);
|
||||||
cell = row.GetCell(columnIndex++) ?? row.CreateCell(columnIndex++);
|
cell = row.GetCell(columnIndex++) ?? row.CreateCell(columnIndex++);
|
||||||
@ -1196,7 +1198,8 @@ namespace FrontendWebApi.ApiControllers
|
|||||||
ms.Flush();
|
ms.Flush();
|
||||||
ms.Seek(0, SeekOrigin.Begin);
|
ms.Seek(0, SeekOrigin.Begin);
|
||||||
Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");
|
Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");
|
||||||
return File(ms, "application/vnd.ms", @$"用電差異比較表{System.DateTime.Now.ToString("yyyyMMddHHmm")}.xlsx");
|
|
||||||
|
return File(ms, "application/vnd.ms", @$"{outputFileName}{System.DateTime.Now.ToString("yyyyMMddHHmm")}.xlsx");
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
@ -1285,7 +1288,7 @@ order by e.report_priority, a.priority";
|
|||||||
"機械館分盤",
|
"機械館分盤",
|
||||||
"電機館分盤",
|
"電機館分盤",
|
||||||
"學1-4舍空調總盤",
|
"學1-4舍空調總盤",
|
||||||
"學五舍總盤",
|
"學五舍五眷總盤",
|
||||||
"8眷舍分盤",
|
"8眷舍分盤",
|
||||||
"企教分盤",
|
"企教分盤",
|
||||||
"7眷舍分盤",
|
"7眷舍分盤",
|
||||||
|
@ -21,7 +21,8 @@
|
|||||||
//"Database": "7gWfmZ28HGIJZbxEbK+0yg==", //tpe_dome_dome
|
//"Database": "7gWfmZ28HGIJZbxEbK+0yg==", //tpe_dome_dome
|
||||||
//"Database": "siTUcDaC/g2yGTMFWD72Kg==", //tpe_dome_hotel
|
//"Database": "siTUcDaC/g2yGTMFWD72Kg==", //tpe_dome_hotel
|
||||||
//"Database": "iuaY0h0+TWkir44/eZLDqw==", //tpe_dome_office
|
//"Database": "iuaY0h0+TWkir44/eZLDqw==", //tpe_dome_office
|
||||||
"Database": "Rq7Gn4x6LwBvVtl7GY8LbA==", //MCUT
|
//"Database": "Rq7Gn4x6LwBvVtl7GY8LbA==", //MCUT
|
||||||
|
"Database": "j9LOmjFh2/9PpuwnVB8ugqnKdBDJHx1AAT7aTWeh37E=",
|
||||||
"Root": "SzdxEgaJJ7tcTCrUl2zKsA==",
|
"Root": "SzdxEgaJJ7tcTCrUl2zKsA==",
|
||||||
"Password": "FVAPxztxpY4gJJKQ/se4bQ=="
|
"Password": "FVAPxztxpY4gJJKQ/se4bQ=="
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user