1.debug: 水電表歸檔機制,結構調整

2.儲存於水電歸檔table 時需要先 四捨五入
3.報表匯出時,增加 join device 以過濾 deleted 的設備
This commit is contained in:
jiahao 2023-09-18 01:49:00 +08:00
parent b098c427fe
commit 48a90ece43
11 changed files with 1061 additions and 681 deletions

View File

@ -19,4 +19,8 @@ namespace Backend.Models
public byte Is_complete { get; set; }
public double Repeat_times { get; set; }
}
public class archiveTable
{
public string archive_yyyymm { get; set; }
}
}

View File

@ -69,7 +69,7 @@ namespace BackendWorkerService.Quartz
string Times = null;
try
{
var sql = $@"select b.system_value from task_detail a
var sql = $@" select b.system_value from task_detail a
join variable b on a.variable_id = b.id
where a.task = '{task}' and a.task_item = '{task_item}'";
Times = await backendRepository.GetOneAsync<string>(sql);
@ -95,12 +95,16 @@ namespace BackendWorkerService.Quartz
where a.task = '{task}' and a.task_item = '{task_item}'";
var lastworkTime = await backendRepository.GetOneAsync<string>(sql);
if (task_item == "Compensate")
{
string ss = "";
}
DateTime dateTime = lastworkTime != null ? Convert.ToDateTime(lastworkTime) : Convert.ToDateTime("1970-01-01 00:00:01");
var nextTime = CrontabSchedule.Parse(await GetWorkRule(task, task_item), new ParseOptions { IncludingSeconds = true } ).GetNextOccurrence(dateTime);
//取得 variable 中的 crob 時間設定 ex: 0 0/1 * * * *
var crobTime = await GetWorkRule(task, task_item);
var nextTime = CrontabSchedule.Parse(crobTime, new ParseOptions { IncludingSeconds = true } ).GetNextOccurrence(dateTime);
if (DateTime.Now >= nextTime)
{
return true;

File diff suppressed because it is too large Load Diff

View File

@ -17,6 +17,10 @@ using Repository.BackendRepository.Interface;
using Repository.BackendRepository.Implement;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using BackendWorkerService.Quartz;
using BackendWorkerService.Quartz.Jobs;
using Microsoft.Extensions.Logging;
namespace BackendWorkerService.Services.Implement
{
@ -25,12 +29,16 @@ namespace BackendWorkerService.Services.Implement
/// </summary>
public class ProcEletricMeterService
{
private readonly ILogger<ProcEletricMeterService> logger;
private readonly IBackgroundServiceRepository backgroundServiceRepository;
private readonly IBackgroundServiceMsSqlRepository backgroundServiceMsSqlRepository;
public ProcEletricMeterService(IBackgroundServiceRepository backgroundServiceRepository,
public ProcEletricMeterService(
ILogger<ProcEletricMeterService> logger,
IBackgroundServiceRepository backgroundServiceRepository,
IBackgroundServiceMsSqlRepository backgroundServiceMySqlRepository)
{
this.logger = logger;
this.backgroundServiceRepository = backgroundServiceRepository;
this.backgroundServiceMsSqlRepository = backgroundServiceMySqlRepository;
}
@ -74,8 +82,9 @@ namespace BackendWorkerService.Services.Implement
var MYsql_update_format = @"
UPDATE {0} SET
count_rawdata = @count_rawdata,
min_rawdata = @min_rawdata,
max_rawdata = @max_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,
@ -94,6 +103,7 @@ namespace BackendWorkerService.Services.Implement
count_rawdata,
min_rawdata,
max_rawdata,
kwh_result,
avg_rawdata,
sum_rawdata,
is_complete,
@ -105,8 +115,9 @@ namespace BackendWorkerService.Services.Implement
@start_timestamp,
@end_timestamp,
@count_rawdata,
@min_rawdata,
@max_rawdata,
round(@min_rawdata, 2),
round(@max_rawdata, 2),
round(@max_rawdata, 2) - round(@min_rawdata, 2),
@avg_rawdata,
@sum_rawdata,
@is_complete,
@ -118,8 +129,9 @@ namespace BackendWorkerService.Services.Implement
UPDATE {0} SET
count_rawdata = @count_rawdata,
min_rawdata = @min_rawdata,
max_rawdata = @max_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,
@ -140,6 +152,7 @@ namespace BackendWorkerService.Services.Implement
count_rawdata,
min_rawdata,
max_rawdata,
kwh_result
avg_rawdata,
sum_rawdata,
is_complete,
@ -151,8 +164,9 @@ namespace BackendWorkerService.Services.Implement
@start_timestamp,
@end_timestamp,
@count_rawdata,
@min_rawdata,
@max_rawdata,
round(@min_rawdata, 2),
round(@max_rawdata, 2),
round(@max_rawdata, 2) - round(@min_rawdata, 2),
@avg_rawdata,
@sum_rawdata,
@is_complete,
@ -250,17 +264,34 @@ namespace BackendWorkerService.Services.Implement
#endregion
#region
#region day
string schema = await backgroundServiceRepository.GetOneAsync<string>(@"
select system_value from variable where system_type = 'project_name' and deleted = 0");
//取得所有須補償的設備資訊
targetTable = await backgroundServiceRepository.GetOneAsync<string>($@"
select table_name
from information_schema.`TABLES`
where TABLE_NAME like 'archive_electric_meter_day%' and TABLE_SCHEMA = '{schema.Split('/')[0]}'
order by TABLE_NAME desc limit 1 ");
if (!string.IsNullOrEmpty(targetTable))
//targetTable = await backgroundServiceRepository.GetOneAsync<string>($@"
// select table_name
// from information_schema.`TABLES`
// where TABLE_NAME like 'archive_electric_meter_day%' and TABLE_SCHEMA = '{schema.Split('/')[0]}'
// order by TABLE_NAME desc limit 1 ");
var archiveTables = await backgroundServiceRepository.GetAllAsync<archiveTable>($@"
select archive_yyyymm from
(
select CONCAT(
'archive_electric_meter_day_',
year(start_timestamp),
case when MONTH(start_timestamp) < 10 then CONCAT('0' , MONTH(start_timestamp)) else MONTH(start_timestamp) end
) archive_yyyymm
from archive_electric_meter_month
where point = 'KWH' and is_complete = 0
)a
group by archive_yyyymm");
//if (!string.IsNullOrEmpty(targetTable))
//{
foreach (var tb_yyyymm in archiveTables)
{
sql_error_day = string.Format(sql_error_format, targetTable);
targetTable = tb_yyyymm.archive_yyyymm;
sql_error_day = $@"SELECT * FROM {targetTable} WHERE is_complete = 0 AND repeat_times < @RepeatTimes AND (point = 'KWH' or point = 'RCV')";
var electric_error_days = await backgroundServiceRepository.GetAllAsync<ArchiveElectricMeter>(sql_error_day, new { RepeatTimes = repeatTimes });
List<Dictionary<string, object>> electricArchiveDayRawDatas = new List<Dictionary<string, object>>();
if (electric_error_days.Count() > 0)
@ -272,12 +303,17 @@ namespace BackendWorkerService.Services.Implement
deviceNumberPoint.Point = error_day.Point;
deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_day.Device_number, error_day.Point);
var startTimestamp = string.Format("{0}+08:00", error_day.Start_timestamp.Replace(" ", "T"));
var endTimestamp = string.Format("{0}+08:00", error_day.End_timestamp.Replace(" ", "T"));
//var startTimestamp = string.Format("{0}+08:00", error_day.Start_timestamp.Replace(" ", "T"));
//var startTimestamp = string.Format("{0}+08:00", DateTime.Parse(error_day.Start_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T"));
var startTimestamp = string.Format("{0}T00:00:00.000+08:00", DateTime.Parse(error_day.Start_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T"));
//var endTimestamp = string.Format("{0}+08:00", error_day.End_timestamp.Replace(" ", "T"));
var endTimestamp = string.Format("{0}T00:00:10.000+08:00", DateTime.Parse(error_day.End_timestamp).AddDays(1).ToString("yyyy-MM-dd").Replace(" ", "T"));
var historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
<abstime name='start' val='{startTimestamp}' />
<abstime name='end' val='{endTimestamp}' />
<reltime name='interval' val = 'PT1D' />
<reltime name='interval' val = 'PT2D' />
</obj>";
string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "");
@ -345,10 +381,50 @@ namespace BackendWorkerService.Services.Implement
{
await backgroundServiceMsSqlRepository.ExecuteSql(sql_error_update, electricArchiveDayRawDatas);
}
#region
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);
//先清空 該月份的數據
string sql = @$"update archive_electric_meter_month set count_rawdata = 0, kwh_result = 0, max_rawdata = 0,
min_rawdata = 0, repeat_times = 0, is_complete = 0, fail_reason = null, updated_at = null
where `point` = 'KWH' and date(start_timestamp) = CONCAT('{yyyy}-{mm}', '-01'); ";
try
{
await backgroundServiceRepository.ExecuteSql(sql);
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, a.is_complete = 1;";
await backgroundServiceRepository.ExecuteSql(sql);
}
catch (Exception ex)
{
//await task_Detail.WorkFail("ArchiveElectricMeterDayJob", "Compensate", ex.ToString());
logger.LogError("【ArchiveElectricMeterDayJob】【補償機制 - 月總計】【任務失敗】");
logger.LogError("【ArchiveElectricMeterDayJob】【補償機制 - 月總計】【任務失敗】[Exception]{0}", ex.ToString() + Environment.NewLine + sql);
}
#endregion
}
}
}
#endregion day
#region day
targetTable = await backgroundServiceRepository.GetOneAsync<string>($@"
select table_name
from information_schema.`TABLES`
@ -368,12 +444,17 @@ namespace BackendWorkerService.Services.Implement
deviceNumberPoint.Point = error_day.Point;
deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_day.Device_number, error_day.Point);
var startTimestamp = string.Format("{0}+08:00", error_day.Start_timestamp.Replace(" ", "T"));
var endTimestamp = string.Format("{0}+08:00", error_day.End_timestamp.Replace(" ", "T"));
//var startTimestamp = string.Format("{0}+08:00", error_day.Start_timestamp.Replace(" ", "T"));
//var startTimestamp = string.Format("{0}+08:00", DateTime.Parse(error_day.Start_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T"));
var startTimestamp = string.Format("{0}T00:00:00.000+08:00", DateTime.Parse(error_day.Start_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T"));
//var endTimestamp = string.Format("{0}+08:00", error_day.End_timestamp.Replace(" ", "T"));
var endTimestamp = string.Format("{0}T00:00:01.000+08:00", DateTime.Parse(error_day.End_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T"));
var historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
<abstime name='start' val='{startTimestamp}' />
<abstime name='end' val='{endTimestamp}' />
<reltime name='interval' val = 'PT1D' />
<reltime name='interval' val = 'PT2D' />
</obj>";
string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "");
@ -444,6 +525,8 @@ namespace BackendWorkerService.Services.Implement
}
}
}
#endregion day
#endregion
#region
@ -461,13 +544,17 @@ namespace BackendWorkerService.Services.Implement
deviceNumberPoint.Point = error_week.Point;
deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_week.Device_number, error_week.Point);
var startTimestamp = string.Format("{0}+08:00", error_week.Start_timestamp.Replace(" ", "T"));
var endTimestamp = string.Format("{0}+08:00", error_week.End_timestamp.Replace(" ", "T"));
//var startTimestamp = string.Format("{0}+08:00", error_week.Start_timestamp.Replace(" ", "T"));
var startTimestamp = string.Format("{0}T00:00:00.000+08:00", DateTime.Parse(error_week.Start_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T"));
//var endTimestamp = string.Format("{0}+08:00", error_week.End_timestamp.Replace(" ", "T"));
var endTimestamp = string.Format("{0}T00:00:01.000+08:00", DateTime.Parse(error_week.End_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T"));
//var endTimestamp = string.Format("{0}T00:00:01.000+08:00", DateTime.Parse(error_week.End_timestamp).ToString("dd/MM/yyyy").Replace(" ", "T"));
var historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
<abstime name='start' val='{startTimestamp}' />
<abstime name='end' val='{endTimestamp}' />
<reltime name='interval' val = 'PT7D' />
<reltime name='interval' val = 'PT8D' />
</obj>";
string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "");
@ -551,13 +638,14 @@ namespace BackendWorkerService.Services.Implement
deviceNumberPoint.Point = error_week.Point;
deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_week.Device_number, error_week.Point);
var startTimestamp = string.Format("{0}+08:00", error_week.Start_timestamp.Replace(" ", "T"));
var endTimestamp = string.Format("{0}+08:00", error_week.End_timestamp.Replace(" ", "T"));
//var startTimestamp = string.Format("{0}+08:00", error_week.Start_timestamp.Replace(" ", "T"));
//var endTimestamp = string.Format("{0}+08:00", error_week.End_timestamp.Replace(" ", "T"));
var startTimestamp = string.Format("{0}T00:00:00.000+08:00", DateTime.Parse(error_week.Start_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T"));
var endTimestamp = string.Format("{0}T00:00:01.000+08:00", DateTime.Parse(error_week.End_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T"));
var historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
<abstime name='start' val='{startTimestamp}' />
<abstime name='end' val='{endTimestamp}' />
<reltime name='interval' val = 'PT7D' />
<reltime name='interval' val = 'PT8D' />
</obj>";
string device_number = deviceNumberPoint.FullDeviceNumberPoint.Replace("$3", "");
@ -630,192 +718,199 @@ namespace BackendWorkerService.Services.Implement
#endregion
#region
//取得所有須補償的設備資訊
targetTable = "archive_electric_meter_month";
var sql_error_month = string.Format(sql_error_format, targetTable);
var electric_error_months = await backgroundServiceRepository.GetAllAsync<ArchiveElectricMeter>(sql_error_month, new { RepeatTimes = repeatTimes });
List<Dictionary<string, object>> electricArchiveMonthRawDatas = new List<Dictionary<string, object>>();
if (electric_error_months.Count() > 0)
{
foreach (var error_month in electric_error_months)
{
DeviceNumberPoint deviceNumberPoint = new DeviceNumberPoint();
deviceNumberPoint.DeviceNumber = error_month.Device_number;
deviceNumberPoint.Point = error_month.Point;
deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_month.Device_number, error_month.Point);
var startTimestamp = string.Format("{0}+08:00", error_month.Start_timestamp.Replace(" ", "T"));
var endTimestamp = string.Format("{0}+08:00", error_month.End_timestamp.Replace(" ", "T"));
////取得所有須補償的設備資訊
//targetTable = "archive_electric_meter_month";
//var sql_error_month = string.Format(sql_error_format, targetTable);
//var electric_error_months = await backgroundServiceRepository.GetAllAsync<ArchiveElectricMeter>(sql_error_month, new { RepeatTimes = repeatTimes });
//List<Dictionary<string, object>> electricArchiveMonthRawDatas = new List<Dictionary<string, object>>();
//if (electric_error_months.Count() > 0)
//{
// foreach (var error_month in electric_error_months)
// {
// DeviceNumberPoint deviceNumberPoint = new DeviceNumberPoint();
// deviceNumberPoint.DeviceNumber = error_month.Device_number;
// deviceNumberPoint.Point = error_month.Point;
// deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_month.Device_number, error_month.Point);
var startDateTime = Convert.ToDateTime(error_month.Start_timestamp);
var dayInMonth = DateTime.DaysInMonth(startDateTime.Year, startDateTime.Month);
// //var startTimestamp = string.Format("{0}+08:00", error_month.Start_timestamp.Replace(" ", "T"));
// //var endTimestamp = string.Format("{0}+08:00", error_month.End_timestamp.Replace(" ", "T"));
// var startTimestamp = string.Format("{0}T00:00:00.000+08:00", DateTime.Parse(error_month.Start_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T"));
var historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
<abstime name='start' val='{startTimestamp}' />
<abstime name='end' val='{endTimestamp}' />
<reltime name='interval' val = 'PT{dayInMonth}D' />
</obj>";
// var endTimestamp = string.Format("{0}T00:00:01.000+08:00", DateTime.Parse(error_month.End_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T"));
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 archiveMonthRequest = (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/");
archiveMonthRequest.Method = "POST";
archiveMonthRequest.Headers.Add("Authorization", "Basic " + encoded);
archiveMonthRequest.PreAuthenticate = true;
// var startDateTime = Convert.ToDateTime(error_month.Start_timestamp);
// var dayInMonth = DateTime.DaysInMonth(startDateTime.Year, startDateTime.Month) + 1; //比原定的多加 1天
byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter);
using (Stream reqStream = archiveMonthRequest.GetRequestStream())
{
reqStream.Write(byteArray, 0, byteArray.Length);
}
// var historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
// <abstime name='start' val='{startTimestamp}' />
// <abstime name='end' val='{endTimestamp}' />
// <reltime name='interval' val = 'PT{dayInMonth}D' />
// </obj>";
HttpWebResponse archiveMonthResponse = (HttpWebResponse)archiveMonthRequest.GetResponse();
var archiveMonthResponseContent = new StreamReader(archiveMonthResponse.GetResponseStream()).ReadToEnd();
// 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 archiveMonthRequest = (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/");
// archiveMonthRequest.Method = "POST";
// archiveMonthRequest.Headers.Add("Authorization", "Basic " + encoded);
// archiveMonthRequest.PreAuthenticate = true;
xmlDocument.LoadXml(archiveMonthResponseContent);
string archiveMonthJson = JsonConvert.SerializeXmlNode(xmlDocument);
JObject archiveMonthJsonResult = (JObject)JsonConvert.DeserializeObject(archiveMonthJson);
// byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter);
// using (Stream reqStream = archiveMonthRequest.GetRequestStream())
// {
// reqStream.Write(byteArray, 0, byteArray.Length);
// }
if (archiveMonthJsonResult.ContainsKey("err")) //抓取錯誤
{
Dictionary<string, object> archiveMonthRawData = new Dictionary<string, object>();
archiveMonthRawData.Add("@device_number", error_month.Device_number);
archiveMonthRawData.Add("@point", error_month.Point);
archiveMonthRawData.Add("@start_timestamp", DateTime.Parse(error_month.Start_timestamp, System.Globalization.CultureInfo.CurrentCulture));
archiveMonthRawData.Add("@end_timestamp", DateTime.Parse(error_month.End_timestamp, System.Globalization.CultureInfo.CurrentCulture));
archiveMonthRawData.Add("@is_complete", 0);
archiveMonthRawData.Add("@repeat_times", ++error_month.Repeat_times);
archiveMonthRawData.Add("@fail_reason", archiveMonthJson);
// HttpWebResponse archiveMonthResponse = (HttpWebResponse)archiveMonthRequest.GetResponse();
// var archiveMonthResponseContent = new StreamReader(archiveMonthResponse.GetResponseStream()).ReadToEnd();
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"));
// xmlDocument.LoadXml(archiveMonthResponseContent);
// string archiveMonthJson = JsonConvert.SerializeXmlNode(xmlDocument);
// JObject archiveMonthJsonResult = (JObject)JsonConvert.DeserializeObject(archiveMonthJson);
electricArchiveMonthRawDatas.Add(archiveMonthRawData);
}
// if (archiveMonthJsonResult.ContainsKey("err")) //抓取錯誤
// {
// Dictionary<string, object> archiveMonthRawData = new Dictionary<string, object>();
// archiveMonthRawData.Add("@device_number", error_month.Device_number);
// archiveMonthRawData.Add("@point", error_month.Point);
// archiveMonthRawData.Add("@start_timestamp", DateTime.Parse(error_month.Start_timestamp, System.Globalization.CultureInfo.CurrentCulture));
// archiveMonthRawData.Add("@end_timestamp", DateTime.Parse(error_month.End_timestamp, System.Globalization.CultureInfo.CurrentCulture));
// archiveMonthRawData.Add("@is_complete", 0);
// archiveMonthRawData.Add("@repeat_times", ++error_month.Repeat_times);
// archiveMonthRawData.Add("@fail_reason", archiveMonthJson);
if (archiveMonthJsonResult.ContainsKey("obj")) //表示可以讀取到內容
{
var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveMonthJsonResult);
if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0)
{
electricArchiveMonthRawDatas.AddRange(ArrangeRawDatas);
}
}
}
// 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"));
if (electricArchiveMonthRawDatas.Count() > 0)
{
var Mysql_error_update = string.Format(MYsql_update_format, targetTable);
var sql_error_update = string.Format(sql_update_format, targetTable);
if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1")
{
await backgroundServiceMsSqlRepository.ExecuteSql(sql_error_update, electricArchiveMonthRawDatas);
}
await backgroundServiceRepository.ExecuteSql(Mysql_error_update, electricArchiveMonthRawDatas);
}
}
// electricArchiveMonthRawDatas.Add(archiveMonthRawData);
// }
targetTable = "archive_water_meter_month";
sql_error_month = string.Format(sql_error_format, targetTable);
var water_error_months = await backgroundServiceRepository.GetAllAsync<ArchiveElectricMeter>(sql_error_month, new { RepeatTimes = repeatTimes });
List<Dictionary<string, object>> waterArchiveMonthRawDatas = new List<Dictionary<string, object>>();
if (water_error_months.Count() > 0)
{
foreach (var error_month in water_error_months)
{
DeviceNumberPoint deviceNumberPoint = new DeviceNumberPoint();
deviceNumberPoint.DeviceNumber = error_month.Device_number;
deviceNumberPoint.Point = error_month.Point;
deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_month.Device_number, error_month.Point);
// if (archiveMonthJsonResult.ContainsKey("obj")) //表示可以讀取到內容
// {
// var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveMonthJsonResult);
// if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0)
// {
// electricArchiveMonthRawDatas.AddRange(ArrangeRawDatas);
// }
// }
// }
var startTimestamp = string.Format("{0}+08:00", error_month.Start_timestamp.Replace(" ", "T"));
var endTimestamp = string.Format("{0}+08:00", error_month.End_timestamp.Replace(" ", "T"));
// if (electricArchiveMonthRawDatas.Count() > 0)
// {
// var Mysql_error_update = string.Format(MYsql_update_format, targetTable);
// var sql_error_update = string.Format(sql_update_format, targetTable);
// if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1")
// {
// await backgroundServiceMsSqlRepository.ExecuteSql(sql_error_update, electricArchiveMonthRawDatas);
// }
// await backgroundServiceRepository.ExecuteSql(Mysql_error_update, electricArchiveMonthRawDatas);
// }
//}
var startDateTime = Convert.ToDateTime(error_month.Start_timestamp);
var dayInMonth = DateTime.DaysInMonth(startDateTime.Year, startDateTime.Month);
//targetTable = "archive_water_meter_month";
//sql_error_month = string.Format(sql_error_format, targetTable);
//var water_error_months = await backgroundServiceRepository.GetAllAsync<ArchiveElectricMeter>(sql_error_month, new { RepeatTimes = repeatTimes });
//List<Dictionary<string, object>> waterArchiveMonthRawDatas = new List<Dictionary<string, object>>();
//if (water_error_months.Count() > 0)
//{
// foreach (var error_month in water_error_months)
// {
// DeviceNumberPoint deviceNumberPoint = new DeviceNumberPoint();
// deviceNumberPoint.DeviceNumber = error_month.Device_number;
// deviceNumberPoint.Point = error_month.Point;
// deviceNumberPoint.FullDeviceNumberPoint = string.Format("{0}_{1}", error_month.Device_number, error_month.Point);
var historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
<abstime name='start' val='{startTimestamp}' />
<abstime name='end' val='{endTimestamp}' />
<reltime name='interval' val = 'PT{dayInMonth}D' />
</obj>";
// //var startTimestamp = string.Format("{0}+08:00", error_month.Start_timestamp.Replace(" ", "T"));
// //var endTimestamp = string.Format("{0}+08:00", error_month.End_timestamp.Replace(" ", "T"));
// var startTimestamp = string.Format("{0}T00:00:00.000+08:00", DateTime.Parse(error_month.Start_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T"));
// var endTimestamp = string.Format("{0}T00:00:01.000+08:00", DateTime.Parse(error_month.End_timestamp).ToString("yyyy-MM-dd").Replace(" ", "T"));
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 archiveMonthRequest = (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/");
archiveMonthRequest.Method = "POST";
archiveMonthRequest.Headers.Add("Authorization", "Basic " + encoded);
archiveMonthRequest.PreAuthenticate = true;
byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter);
using (Stream reqStream = archiveMonthRequest.GetRequestStream())
{
reqStream.Write(byteArray, 0, byteArray.Length);
}
// var startDateTime = Convert.ToDateTime(error_month.Start_timestamp);
// var dayInMonth = DateTime.DaysInMonth(startDateTime.Year, startDateTime.Month) + 1; //比原定的多加 1天
HttpWebResponse archiveMonthResponse = (HttpWebResponse)archiveMonthRequest.GetResponse();
var archiveMonthResponseContent = new StreamReader(archiveMonthResponse.GetResponseStream()).ReadToEnd();
// var historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
// <abstime name='start' val='{startTimestamp}' />
// <abstime name='end' val='{endTimestamp}' />
// <reltime name='interval' val = 'PT{dayInMonth}D' />
// </obj>";
xmlDocument.LoadXml(archiveMonthResponseContent);
string archiveMonthJson = JsonConvert.SerializeXmlNode(xmlDocument);
JObject archiveMonthJsonResult = (JObject)JsonConvert.DeserializeObject(archiveMonthJson);
// 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 archiveMonthRequest = (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/");
// archiveMonthRequest.Method = "POST";
// archiveMonthRequest.Headers.Add("Authorization", "Basic " + encoded);
// archiveMonthRequest.PreAuthenticate = true;
if (archiveMonthJsonResult.ContainsKey("err")) //抓取錯誤
{
Dictionary<string, object> archiveMonthRawData = new Dictionary<string, object>();
archiveMonthRawData.Add("@device_number", error_month.Device_number);
archiveMonthRawData.Add("@point", error_month.Point);
archiveMonthRawData.Add("@start_timestamp", DateTime.Parse(error_month.Start_timestamp, System.Globalization.CultureInfo.CurrentCulture));
archiveMonthRawData.Add("@end_timestamp", DateTime.Parse(error_month.End_timestamp, System.Globalization.CultureInfo.CurrentCulture));
archiveMonthRawData.Add("@is_complete", 0);
archiveMonthRawData.Add("@repeat_times", ++error_month.Repeat_times);
archiveMonthRawData.Add("@fail_reason", archiveMonthJson);
// byte[] byteArray = Encoding.UTF8.GetBytes(historyQueryFilter);
// using (Stream reqStream = archiveMonthRequest.GetRequestStream())
// {
// reqStream.Write(byteArray, 0, byteArray.Length);
// }
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"));
// HttpWebResponse archiveMonthResponse = (HttpWebResponse)archiveMonthRequest.GetResponse();
// var archiveMonthResponseContent = new StreamReader(archiveMonthResponse.GetResponseStream()).ReadToEnd();
waterArchiveMonthRawDatas.Add(archiveMonthRawData);
}
// xmlDocument.LoadXml(archiveMonthResponseContent);
// string archiveMonthJson = JsonConvert.SerializeXmlNode(xmlDocument);
// JObject archiveMonthJsonResult = (JObject)JsonConvert.DeserializeObject(archiveMonthJson);
if (archiveMonthJsonResult.ContainsKey("obj")) //表示可以讀取到內容
{
var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveMonthJsonResult);
if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0)
{
waterArchiveMonthRawDatas.AddRange(ArrangeRawDatas);
}
}
}
// if (archiveMonthJsonResult.ContainsKey("err")) //抓取錯誤
// {
// Dictionary<string, object> archiveMonthRawData = new Dictionary<string, object>();
// archiveMonthRawData.Add("@device_number", error_month.Device_number);
// archiveMonthRawData.Add("@point", error_month.Point);
// archiveMonthRawData.Add("@start_timestamp", DateTime.Parse(error_month.Start_timestamp, System.Globalization.CultureInfo.CurrentCulture));
// archiveMonthRawData.Add("@end_timestamp", DateTime.Parse(error_month.End_timestamp, System.Globalization.CultureInfo.CurrentCulture));
// archiveMonthRawData.Add("@is_complete", 0);
// archiveMonthRawData.Add("@repeat_times", ++error_month.Repeat_times);
// archiveMonthRawData.Add("@fail_reason", archiveMonthJson);
if (waterArchiveMonthRawDatas.Count() > 0)
{
var Mysql_error_update = string.Format(MYsql_update_format, targetTable);
var sql_error_update = string.Format(sql_update_format, targetTable);
if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1")
{
await backgroundServiceMsSqlRepository.ExecuteSql(sql_error_update, waterArchiveMonthRawDatas);
}
await backgroundServiceRepository.ExecuteSql(Mysql_error_update, waterArchiveMonthRawDatas);
}
}
// 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 (archiveMonthJsonResult.ContainsKey("obj")) //表示可以讀取到內容
// {
// var ArrangeRawDatas = ArrangeRawData(deviceNumberPoint, archiveMonthJsonResult);
// if (ArrangeRawDatas != null && ArrangeRawDatas.Count() > 0)
// {
// waterArchiveMonthRawDatas.AddRange(ArrangeRawDatas);
// }
// }
// }
// if (waterArchiveMonthRawDatas.Count() > 0)
// {
// var Mysql_error_update = string.Format(MYsql_update_format, targetTable);
// var sql_error_update = string.Format(sql_update_format, targetTable);
// if (!string.IsNullOrEmpty(saveToMSDB) && saveToMSDB == "1")
// {
// await backgroundServiceMsSqlRepository.ExecuteSql(sql_error_update, waterArchiveMonthRawDatas);
// }
// await backgroundServiceRepository.ExecuteSql(Mysql_error_update, waterArchiveMonthRawDatas);
// }
//}
#endregion
result = true;
@ -828,6 +923,92 @@ namespace BackendWorkerService.Services.Implement
return result;
}
/// <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>
public 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 List<Dictionary<string, object>> ArrangeRawData(DeviceNumberPoint deviceNumberPoint, JObject jsonResult)
{
List<Dictionary<string, object>> arrangeRawDatas = new List<Dictionary<string, object>>();
@ -969,6 +1150,7 @@ namespace BackendWorkerService.Services.Implement
arrangeRawData.Add("@sum_rawdata", sum);
break;
}
}
}
@ -983,5 +1165,7 @@ namespace BackendWorkerService.Services.Implement
return arrangeRawDatas;
}
}
}

View File

@ -7,6 +7,8 @@
}
},
"LoggerPath": "C:\\inetpub\\Taipei_dome_background_service\\Logs",
//MIN HOUR DOM MON DOW CMD
"BackgroundServiceCron": {
"ExecutionBackgroundServicePlanJob": "0 0 2 * * ?",
"MessageNotificationJob": "0 0 2 * * ?",
@ -14,7 +16,7 @@
"RegularUpdateDBTableJob": "0 0 2 * * ?",
"ParkingJob": "0 0 2 * * ?",
"ArchiveElectricMeterHourJob": "0 0 2 * * ?",
"ArchiveElectricMeterDayJob": "0/5 * * * * ?",
"ArchiveElectricMeterDayJob": "0/5 * * * * ?", // 5
"WeatherAPIJob": "0 0 2 * * ?"
},
"DBConfig": {

View File

@ -175,7 +175,11 @@ namespace FrontendWebApi.ApiControllers
HistoryExport hed = new HistoryExport();
hed.type = devicePoint.Where(x => x.device_building_tag == d.building_tag && x.points == ard["@point"].ToString()).Select(x => x.full_name).FirstOrDefault();
hed.deviceName = device.Where(x => x.device_number == ard["@device_number"].ToString()).Select(x => x.full_name).FirstOrDefault();
hed.value = ard["@avg_rawdata"].ToString() == "-1" ? "NaN" : Math.Round((decimal.Parse(ard["@avg_rawdata"].ToString(), System.Globalization.NumberStyles.Float)), 2).ToString();
// 四捨六入
//hed.value = ard["@avg_rawdata"].ToString() == "-1" ? "NaN" : Math.Round((decimal.Parse(ard["@avg_rawdata"].ToString(), System.Globalization.NumberStyles.Float)), 2).ToString();
// 四捨五入
//ref: Math.Round(Convert.ToDecimal(45.365), 2, MidpointRounding.AwayFromZero)
hed.value = ard["@avg_rawdata"].ToString() == "-1" ? "NaN" : Math.Round(Convert.ToDecimal(ard["@avg_rawdata"].ToString()), 2, MidpointRounding.AwayFromZero).ToString();
hed.timestamp = Convert.ToDateTime(ard["@start_timestamp"].ToString());
hed.building_tag = d.building_tag;
he.Add(hed);

View File

@ -114,7 +114,7 @@ namespace FrontendWebApi.ApiControllers
if (input.tableType == "year")
{
sqlGroup = $@" group by year(start_timestamp), year(end_timestamp), device_number ";
sqlAvgRawData = " round(avg(kwh_result), 2) as avg_rawdata, year(start_timestamp) as start_timestamp, year(end_timestamp) as end_timestamp ";
sqlAvgRawData = " round(sum(kwh_result), 2) as avg_rawdata, year(start_timestamp) as start_timestamp, year(end_timestamp) as end_timestamp ";
}
else
sqlAvgRawData = " round(kwh_result, 2) as avg_rawdata, start_timestamp, end_timestamp ";
@ -138,14 +138,14 @@ namespace FrontendWebApi.ApiControllers
select *
from (
(
SELECT DATE(ADDDATE(@startTime, INTERVAL @i:=@i+1 {input.tableType})) AS date
SELECT DATE(ADDDATE('{startTime}', INTERVAL @i:=@i+1 {input.tableType})) AS date
FROM {table}
HAVING @i < TIMESTAMPDIFF({input.tableType}, @startTime, ADDDATE(@endTime, INTERVAL -1 DAY))
HAVING @i < TIMESTAMPDIFF({input.tableType}, '{startTime}', ADDDATE('{endTime}' , INTERVAL -1 DAY))
) d,
(
select device_number
from {table}
where start_timestamp >= @startTime and end_timestamp < @endTime and point = 'KWH' {buildingSql}
where start_timestamp >= '{startTime}' and end_timestamp < '{endTime}' and point = 'KWH' {buildingSql}
{sqlWhere}
group by device_number
) dn
@ -154,11 +154,13 @@ namespace FrontendWebApi.ApiControllers
left join (
select device_number, {sqlAvgRawData}
from {table}
where start_timestamp >= @startTime and end_timestamp < @endTime and point = 'KWH' {buildingSql}
where start_timestamp >= '{startTime}' and end_timestamp < '{endTime}' and point = 'KWH' {buildingSql}
{sqlWhere} {sqlGroup}
) aemm on aemm.start_timestamp >= {aemmStaDate} and aemm.end_timestamp < {aemmEndDate} and aemm.device_number = fd.device_number
join device dc on fd.device_number = dc.device_number
where dc.deleted = 0
order by fd.device_number, fd.date";
Logger.LogInformation("SQL = " + sql + " startTime=" + startTime + " endTime=" + endTime + " building=" + input.building_tag + " floor_tag = " + input.floor_tag);
Logger.LogInformation("0918 SQL = " + sql + Environment.NewLine + " startTime='" + startTime + "' endTime='" + endTime + "' building=" + input.building_tag );
var rawData = await backendRepository.GetAllAsync<HydroMeterRawDataOutput>(sql,
new { startTime = startTime, endtime = endTime, building_tag = input.building_tag, dateFormat = dateFormat });
@ -177,7 +179,7 @@ namespace FrontendWebApi.ApiControllers
.Select(x => new HydroMeterOutput { building_tag = x.Key.building_tag, floor_tag = x.Key.floor_tag, device_serial_tag = x.Key.device_serial_tag, device_master = x.Key.device_master, device_number = x.Key.device_number })
.ToList();
}
int i = 0;
foreach (var l in list)
{
l.rawData = new List<HydroMeterRawDataOutput>();
@ -200,9 +202,11 @@ namespace FrontendWebApi.ApiControllers
l.price = input.price.HasValue
? (Math.Round(input.price.Value, 2)).ToString()
: Math.Round((await backendRepository.GetOneAsync<decimal>("select system_value from variable where system_type = 'ElectricPrice' and deleted = 0")), 2).ToString();
l.total_price = Math.Round((Decimal.Parse(l.total) * Decimal.Parse(l.price)), 2).ToString();
}
l.total_price = Math.Round((Decimal.Parse(l.total) * Decimal.Parse(l.price)), 2).ToString();
i++;
}
Logger.LogInformation(" 筆數:" + i.ToString());
apiResult.Code = "0000";
apiResult.Data = list;
}
@ -467,6 +471,20 @@ namespace FrontendWebApi.ApiControllers
styleLine12.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
styleLine12.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
styleLine12.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
#region setting for data
//IFont fontNumeric = workbook.CreateFont();
//fontNumeric.FontName = "新細明體";
//fontNumeric.FontHeightInPoints = 12;
//ICellStyle styleLineNumeric = workbook.CreateCellStyle();
//styleLineNumeric.SetFont(fontNumeric);
//styleLineNumeric.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
//styleLineNumeric.VerticalAlignment = VerticalAlignment.Center;
//styleLineNumeric.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
//styleLineNumeric.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
//styleLineNumeric.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
//styleLineNumeric.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
#endregion
ICellStyle stylein12 = workbook.CreateCellStyle();
stylein12.SetFont(font12Times);
stylein12.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;
@ -482,7 +500,7 @@ namespace FrontendWebApi.ApiControllers
if (r.Count > 0)
{
string buildingName = r.Select(x => x.building_name).FirstOrDefault();
var sheet = workbook.CreateSheet($"{buildingName} 電表報表");
var sheet = workbook.CreateSheet($"{r.Select( x=> x.device_full_name).FirstOrDefault()} 電表報表");
int RowPosition = 0;
#region set cell
IRow row = sheet.CreateRow(RowPosition);
@ -585,7 +603,7 @@ namespace FrontendWebApi.ApiControllers
ms.Flush();
ms.Seek(0, SeekOrigin.Begin);
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", @$"{building}_電表報表{System.DateTime.Now.ToString("yyyyMMddHHmm")}.xlsx");
}
[HttpPost]

View File

@ -19,8 +19,8 @@ namespace tpDomeWinAPP
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new fmCheckTagName());
Application.Run(new fmKeke());
//Application.Run(new fmDecrypt());
//Application.Run(new fmKeke());
Application.Run(new fmDecrypt());
}
}
}

View File

@ -32,6 +32,7 @@
lbMsg = new System.Windows.Forms.Label();
loadData = new System.Windows.Forms.Button();
dataGridView1 = new System.Windows.Forms.DataGridView();
button1 = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit();
splitContainer1.Panel1.SuspendLayout();
splitContainer1.Panel2.SuspendLayout();
@ -48,6 +49,7 @@
//
// splitContainer1.Panel1
//
splitContainer1.Panel1.Controls.Add(button1);
splitContainer1.Panel1.Controls.Add(lbMsg);
splitContainer1.Panel1.Controls.Add(loadData);
//
@ -89,6 +91,16 @@
dataGridView1.TabIndex = 0;
dataGridView1.CellContentClick += dataGridView1_CellContentClick;
//
// button1
//
button1.Location = new System.Drawing.Point(238, 32);
button1.Name = "button1";
button1.Size = new System.Drawing.Size(94, 29);
button1.TabIndex = 1;
button1.Text = "button1";
button1.UseVisualStyleBackColor = true;
button1.Click += button1_Click_1;
//
// fmKeke
//
AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
@ -113,5 +125,6 @@
private System.Windows.Forms.Button loadData;
private System.Windows.Forms.Label lbMsg;
private System.Windows.Forms.DataGridView dataGridView1;
private System.Windows.Forms.Button button1;
}
}

View File

@ -73,5 +73,13 @@ namespace z01_WinAPP
{
}
private void button1_Click_1(object sender, EventArgs e)
{
string targetTable = "archive_electric_meter_day_202308";
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);
}
}
}

View File

@ -18,7 +18,7 @@
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing"">Blue</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>