1.bgService月報表歸檔調整

2.月報表 API SQL 語法調整
This commit is contained in:
jiahao 2023-10-03 21:07:04 +08:00
parent d4eec76beb
commit 22396c5736
3 changed files with 61 additions and 26 deletions

View File

@ -792,6 +792,8 @@ namespace BackendWorkerService.Quartz.Jobs
//stopWatch.Stop(); //stopWatch.Stop();
//logger.LogInformation("【ArchiveElectricMeterDayJob】【月歸檔效能檢驗】[取得資料花費時間]{0} 毫秒", stopWatch.ElapsedMilliseconds); //logger.LogInformation("【ArchiveElectricMeterDayJob】【月歸檔效能檢驗】[取得資料花費時間]{0} 毫秒", stopWatch.ElapsedMilliseconds);
logger.LogInformation($@"before 月報 electricArchiveMonthRawDatas.Count() ={electricArchiveMonthRawDatas.Count()} ");
if (electricArchiveMonthRawDatas.Count() > 0) if (electricArchiveMonthRawDatas.Count() > 0)
{ {
var sql = $@" var sql = $@"
@ -890,12 +892,15 @@ namespace BackendWorkerService.Quartz.Jobs
END END
COMMIT TRANSACTION;"; COMMIT TRANSACTION;";
await backgroundServiceRepository.ExecuteSql(sql, electricArchiveMonthRawDatas); await backgroundServiceRepository.ExecuteSql(sql, electricArchiveMonthRawDatas);
if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1") if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1")
{ {
await backgroundServiceMsSqlRepository.ExecuteSql(mySql, electricArchiveMonthRawDatas); await backgroundServiceMsSqlRepository.ExecuteSql(mySql, electricArchiveMonthRawDatas);
} }
} }
// 水錶
if (waterArchiveMonthRawDatas.Count() > 0) if (waterArchiveMonthRawDatas.Count() > 0)
{ {
var sql = $@" var sql = $@"
@ -993,6 +998,7 @@ namespace BackendWorkerService.Quartz.Jobs
END END
COMMIT TRANSACTION;"; COMMIT TRANSACTION;";
await backgroundServiceRepository.ExecuteSql(sql, waterArchiveMonthRawDatas); await backgroundServiceRepository.ExecuteSql(sql, waterArchiveMonthRawDatas);
if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1") if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1")
{ {
@ -1314,10 +1320,11 @@ namespace BackendWorkerService.Quartz.Jobs
logger.LogInformation("run sql electericArchiveDayRawDatas.Count() = " + electericArchiveDayRawDatas.Count()); logger.LogInformation("run sql electericArchiveDayRawDatas.Count() = " + electericArchiveDayRawDatas.Count());
await backgroundServiceRepository.ExecuteSql(sql, electericArchiveDayRawDatas); await backgroundServiceRepository.ExecuteSql(sql, electericArchiveDayRawDatas);
if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1") //明志 沒有mssql
{ //if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1")
await backgroundServiceMsSqlRepository.ExecuteSql(mySql, electericArchiveDayRawDatas); //{
} // await backgroundServiceMsSqlRepository.ExecuteSql(mySql, electericArchiveDayRawDatas);
//}
} }
if (waterArchiveDayRawDatas.Count() > 0) if (waterArchiveDayRawDatas.Count() > 0)
@ -1556,7 +1563,7 @@ namespace BackendWorkerService.Quartz.Jobs
{ {
string sql = $@"CREATE TABLE IF NOT EXISTS `archive_electric_meter_day_{dbDateName}` ( 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, `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, `point` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`start_timestamp` datetime(6) NOT NULL, `start_timestamp` datetime(6) NOT NULL,
`end_timestamp` datetime(6) NULL DEFAULT NULL, `end_timestamp` datetime(6) NULL DEFAULT NULL,
`count_rawdata` int(11) NULL DEFAULT NULL, `count_rawdata` int(11) NULL DEFAULT NULL,

View File

@ -1016,7 +1016,7 @@ namespace BackendWorkerService.Services.Implement
archiveRequest.Headers.Add("Authorization", "Basic " + encoded); archiveRequest.Headers.Add("Authorization", "Basic " + encoded);
archiveRequest.PreAuthenticate = true; archiveRequest.PreAuthenticate = true;
logger.LogInformation($@" {device_number} station = {station} task= {startDay} ~ {endDay} action ={sDay} ~ {eDay}"); // ----------- log // logger.LogInformation($@"url= {$"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/" + Environment.NewLine} {device_number} station = {station} task= {startDay} ~ {endDay} action ={sDay} ~ {eDay}"); // ----------- log
byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter); byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter);
using (Stream reqStream = archiveRequest.GetRequestStream()) using (Stream reqStream = archiveRequest.GetRequestStream())
@ -1124,19 +1124,21 @@ namespace BackendWorkerService.Services.Implement
foreach (DateTime day in EachMonth(startDay , endDay)) foreach (DateTime day in EachMonth(startDay , endDay))
{ {
// 需要比原定日期增加 1天因 Niagara 內部判斷為 < lastData, 並未包含結束當天 add by jiahao @2023-09-16 // 需要比原定日期增加 1天因 Niagara 內部判斷為 < lastData, 並未包含結束當天 add by jiahao @2023-09-16
var dayInMonth = DateTime.DaysInMonth(day.Year, day.Month) +1; //var dayInMonth = DateTime.DaysInMonth(day.Year, day.Month) +1; 、、(DateTime.Now - DateTime.Parse(startDay)).Days
var dayInMonth = (DateTime.Now - DateTime.Parse(day.ToString("yyyy-MM-") + "01")).Days + 1;
var startTimestamp = string.Format("{0}T00:00:00.000+08:00", day.ToString("yyyy-MM-") + "01"); var startTimestamp = string.Format("{0}T00:00:00.000+08:00", day.ToString("yyyy-MM-") + "01");
//var endTimestamp = string.Format("{0}T23:59:59.000+08:00", LastDay.ToString("yyyy-MM-dd")); //var endTimestamp = string.Format("{0}T23:59:59.000+08:00", LastDay.ToString("yyyy-MM-dd"));
var endTimestamp = string.Format("{0}T00:00:10.000+08:00", day.AddMonths(1).ToString("yyyy-MM-") + "01"); // by jiahao @2023-09-26 //var endTimestamp = string.Format("{0}T00:00:10.000+08:00", day.AddMonths(1).ToString("yyyy-MM-") + "01"); // by jiahao @2023-09-26
var endTimestamp = string.Format("{0}T00:00:10.000+08:00", DateTime.Now.ToString("yyyy-MM-dd")); // by jiahao @2023-10-03
var historyQueryFilter = $@"<obj is='obix: HistoryFilter'> var historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
<abstime name='start' val='{startTimestamp}' /> <abstime name='start' val='{startTimestamp}' />
<abstime name='end' val='{endTimestamp}' /> <abstime name='end' val='{endTimestamp}' />
<reltime name='interval' val = 'PT{dayInMonth}D' /> <reltime name='interval' val = 'PT{dayInMonth.ToString()}D' />
</obj>"; </obj>";
logger.LogInformation("【ArchiveElectricMeterMonth】startTimestamp=", startTimestamp + " endTimestamp=" + endTimestamp);
string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", ""); string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "");
var station = backgroundServiceRepository.GetOneAsync<string>($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and var station = backgroundServiceRepository.GetOneAsync<string>($@"select parent_path from import_niagara_item_history where device_building_tag = '{device_number.Split("_")[1].Replace("$3", "")}' and
@ -1162,12 +1164,17 @@ namespace BackendWorkerService.Services.Implement
archiveResponse.Dispose(); archiveResponse.Dispose();
archiveResponse.Close(); archiveResponse.Close();
logger.LogInformation(@$"【ArchiveElectricMeterMonth】{device_number} startTimestamp={startTimestamp} endTimestamp= {endTimestamp} interval = PT{dayInMonth.ToString()}D url = {$"{obixApiConfig.ApiBase}obix/histories/{station}/{deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "")}/~historyRollup/"}");
xmlDocument.LoadXml(archiveResponseContent); xmlDocument.LoadXml(archiveResponseContent);
var archiveJson = JsonConvert.SerializeXmlNode(xmlDocument); var archiveJson = JsonConvert.SerializeXmlNode(xmlDocument);
var archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson); var archiveJsonResult = (JObject)JsonConvert.DeserializeObject(archiveJson);
//if (device_number == "NTPC_D8_EE_E4_RF_Total_WHT_N1")
//if (device_number == "NTPC_D8_EE_E4_RF_Total_WHT_N1" || device_number == "NTPC_D8_EE_E4_RF_H2_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); logger.LogError(@$"{device_number} json = {archiveJsonResult}");
//} //}
if (archiveJsonResult.ContainsKey("err")) //抓取錯誤 if (archiveJsonResult.ContainsKey("err")) //抓取錯誤
{ {

View File

@ -21,6 +21,8 @@ using Google.Protobuf.Collections;
using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.Pkcs;
using NPOI.SS.Formula.Functions; using NPOI.SS.Formula.Functions;
using static ICSharpCode.SharpZipLib.Zip.ExtendedUnixData; using static ICSharpCode.SharpZipLib.Zip.ExtendedUnixData;
using static NPOI.HSSF.Record.PageBreakRecord;
using System.Linq.Expressions;
namespace FrontendWebApi.ApiControllers namespace FrontendWebApi.ApiControllers
{ {
@ -136,10 +138,11 @@ namespace FrontendWebApi.ApiControllers
switch (input.tableType) switch (input.tableType)
{ {
case "day": date_yyyymmdd = @$" date(aemm.start_timestamp) = {aemmStaDate}"; break; case "day": date_yyyymmdd = @$" date(aemm.start_timestamp) = {aemmStaDate}"; break;
case "month": date_yyyymmdd = @$" aemm.start_timestamp >= {aemmStaDate} and aemm.end_timestamp < {aemmEndDate} "; break; // case "month": date_yyyymmdd = @$" aemm.start_timestamp >= {aemmStaDate} and aemm.end_timestamp < {aemmEndDate} "; break;
case "month": date_yyyymmdd = @$" date(aemm.start_timestamp) = {aemmStaDate}"; break;
case "year": date_yyyymmdd = @$" aemm.start_timestamp >= {aemmStaDate} and aemm.end_timestamp < {aemmEndDate} "; break; case "year": date_yyyymmdd = @$" aemm.start_timestamp >= {aemmStaDate} and aemm.end_timestamp < {aemmEndDate} "; break;
} }
var sql = $@"set @i = -1; var sql = $@" set @i = -1;
select fd.device_number, case when aemm.avg_rawdata = -1.0 then 'NaN' when aemm.avg_rawdata is null then 0.00 else aemm.avg_rawdata end as avg_rawdata, DATE_FORMAT(fd.date, @dateFormat) as timestamp select fd.device_number, case when aemm.avg_rawdata = -1.0 then 'NaN' when aemm.avg_rawdata is null then 0.00 else aemm.avg_rawdata end as avg_rawdata, DATE_FORMAT(fd.date, @dateFormat) as timestamp
from ( from (
select * select *
@ -445,11 +448,12 @@ namespace FrontendWebApi.ApiControllers
{ {
List<List<HydroMeterOutput>> result = new List<List<HydroMeterOutput>>(); List<List<HydroMeterOutput>> result = new List<List<HydroMeterOutput>>();
var building = backendRepository.GetAllAsync<HydroBuildList>("select * from building where deleted = 0").Result; var building = backendRepository.GetAllAsync<HydroBuildList>("select * from building where deleted = 0").Result;
foreach(var b in building) //foreach(var b in building)
{ //{
input.building_tag = b.building_tag; // input.building_tag = b.building_tag;
// 0 result.Add(this.ElectricList(input).Result.Value.Data.ToList());
//}
result.Add(this.ElectricList(input).Result.Value.Data.ToList()); result.Add(this.ElectricList(input).Result.Value.Data.ToList());
}
List<Dictionary<string, byte[]>> docFile = new List<Dictionary<string, byte[]>>(); List<Dictionary<string, byte[]>> docFile = new List<Dictionary<string, byte[]>>();
var workbook = new XSSFWorkbook(); var workbook = new XSSFWorkbook();
@ -508,14 +512,25 @@ namespace FrontendWebApi.ApiControllers
stylein12.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; stylein12.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
stylein12.WrapText = true; stylein12.WrapText = true;
#endregion #endregion
string reportType = string.Empty;
switch (input.tableType.ToLower()) //day, week, month, year
{
case "day": reportType = "日報表"; break;
case "week": reportType = "周報表"; break;
case "month": reportType = "月報表"; break;
case "year": reportType = "年報表"; break;
}
//var sheet = workbook.CreateSheet($"{buildingName}");
var sheet = workbook.CreateSheet($"{reportType}");
foreach (var r in result) foreach (var r in result)
{ {
if (r.Count > 0) if (r.Count > 0)
{ {
string buildingName = r.Select(x => x.building_name).FirstOrDefault(); string buildingName = r.Select(x => x.building_name).FirstOrDefault();
var sheet = workbook.CreateSheet($"{buildingName}"); Logger.LogInformation(@$"buildingName = {buildingName}" + Environment.NewLine);
int RowPosition = 0; int RowPosition = 0;
#region set cell #region set cell for columns
IRow row = sheet.CreateRow(RowPosition); IRow row = sheet.CreateRow(RowPosition);
sheet.SetColumnWidth(0, 4 * 160 * 12); sheet.SetColumnWidth(0, 4 * 160 * 12);
sheet.SetColumnWidth(1, 4 * 160 * 12); sheet.SetColumnWidth(1, 4 * 160 * 12);
@ -616,7 +631,7 @@ 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", @$"電表報表_{reportType}_{System.DateTime.Now.ToString("yyyyMMddHHmm")}.xlsx");
} }
[HttpPost] [HttpPost]
@ -860,6 +875,12 @@ namespace FrontendWebApi.ApiControllers
return File(ms, "application/vnd.ms-excel", @$"電表報表{System.DateTime.Now.ToString("yyyyMMddHHmm")}.xlsx"); return File(ms, "application/vnd.ms-excel", @$"電表報表{System.DateTime.Now.ToString("yyyyMMddHHmm")}.xlsx");
} }
/// <summary>
/// 客製化報表 excel 匯出 - 總計不含分盤
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost] [HttpPost]
[Route("api/ExportElectricEachTotalCompareList")] [Route("api/ExportElectricEachTotalCompareList")]
public FileResult OpeExportEachTotalCompareExcelElec([FromBody] HydroMeterInput input) public FileResult OpeExportEachTotalCompareExcelElec([FromBody] HydroMeterInput input)