This commit is contained in:
dev01 2023-10-06 09:25:44 +08:00
commit bca579903b
23 changed files with 6509 additions and 5100 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

@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Permissions;
using System.Threading.Tasks;
namespace Backend.Models
@ -77,9 +78,19 @@ namespace Backend.Models
public string Device_ip { get; set; }
public string Device_port { get; set; }
public string device_name_tag { get; set; }
public string device_system_tag { get; set; }
public string device_system_tag { get; set; }
public List<DeviceDisaster> Device_disasters { 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
@ -264,6 +275,16 @@ namespace Backend.Models
public string DeviceNumber { get; set; }
public string Point { 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

View File

@ -45,6 +45,15 @@ namespace Backend.Models
public byte is_bool { get; set; }
public byte is_link { 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

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

@ -82,7 +82,7 @@ namespace BackendWorkerService.Quartz.Jobs
var spaceResponseResult = JsonConvert.DeserializeObject<SpaceResponse>(spaceResponseContent);
//取得停車場車位對應表
var sqlSapceMapping = $@"SELECT * FROM variable WHERE deleted = 0 AND system_type = 'parkingSapceMapping'";
var sqlSapceMapping = $@" SELECT * FROM variable WHERE deleted = 0 AND system_type = 'parkingSapceMapping'";
var parkingSapceMapping = await backgroundServiceRepository.GetAllAsync<VariableInfo>(sqlSapceMapping);
if (spaceResponseResult != null && spaceResponseResult.Code == "20000")

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/2 * * * * ?", // 5
"WeatherAPIJob": "0 0 2 * * ?"
},
"DBConfig": {
@ -25,7 +27,8 @@
//"Database": "IgYBsgG2VLKKxFb64j7LOA==", //wsp
//"Database": "7gWfmZ28HGIJZbxEbK+0yg==", //tpe_dome_dome
//"Database": "siTUcDaC/g2yGTMFWD72Kg==", //tpe_dome_hotel
"Database": "Rq7Gn4x6LwBvVtl7GY8LbA==", //mcut
//"Database": "Rq7Gn4x6LwBvVtl7GY8LbA==", //mcut
"Database": "j9LOmjFh2/9PpuwnVB8ugqnKdBDJHx1AAT7aTWeh37E=", //ibms_mcut_online
"Root": "SzdxEgaJJ7tcTCrUl2zKsA==",
"Password": "FVAPxztxpY4gJJKQ/se4bQ=="
},

File diff suppressed because it is too large Load Diff

View File

@ -199,7 +199,7 @@
class="panel"
style="height: calc(100% - 1.5rem)">
<div class="panel-hdr">
<h2>即時契約容量占比 - 第一校區</h2>
<h2>即時契約容量占比 - 第一校區 <span id="contractCapacityForArea1">--</span></h2>
</div>
<div class="panel-container show h-100">
<div id="contractValueChart" style="height: 240px"></div>
@ -211,7 +211,7 @@
class="panel"
style="height: calc(100% - 1.5rem)">
<div class="panel-hdr">
<h2>即時契約容量占比 - 第二校區</h2>
<h2>即時契約容量占比 - 第二校區 <span id="contractCapacityForArea2">--</span></</h2>
</div>
<div class="panel-container h-100 show">
<div id="contractValueChart2" style="height: 240px"></div>
@ -441,11 +441,11 @@
let devPath = tarElePath.split("/")[1]?.split("_").slice(0, 8).join("/");
let tempOrdPath = { devicePath: devPath };
let myBaja = new subscriptionElectricmeter();
const deviceTag = devPath.split("/")[devPath.split("/").length - 1]
myBaja.setSubscribeElectricmeterByBql(tempOrdPath);
myBaja.setSubscribeElectricmeterCallBack(function (data) {
if (data.point_name == "P") {
let value = parseFloat(data.value).roundDecimal(2);
myBaja.setSubscribeElectricmeterCallBack(function (data) {
if (data.point_name === "P" && data.device_number === deviceTag) {
let value = parseFloat(data.value.replaceAll(",", "")).roundDecimal(2);
$("#insPower").text(value);
// $("#insPowerPer").text((value / 4).roundDecimal(2));
$("#insPowerPer").text((value / contractCapacity).roundDecimal(2));
@ -469,9 +469,11 @@
({ point_name }) => point_name === "Capacity"
)?.value;
}
$("#contractCapacityForArea1").text(` (${contractCapacityForchart1} kW)`);
chartContractValue(
"contractValueChart",
((value / contractCapacityForchart1) * 100).roundDecimal(2)
Math.round((value / contractCapacityForchart1) * 100),
value
);
} else if (value && compus === "Area2") {
if (data.some(({ point_name }) => point_name === "Capacity")) {
@ -479,9 +481,11 @@
({ point_name }) => point_name === "Capacity"
)?.value;
}
$("#contractCapacityForArea2").text(` (${contractCapacityForchart2} kW)`);
chartContractValue(
"contractValueChart2",
((value / contractCapacityForchart2) * 100).roundDecimal(2)
Math.round((value / contractCapacityForchart2) * 100),
value
);
}
});
@ -1121,7 +1125,7 @@
}
// 圖表 - 取得契約容量
function chartContractValue(ele, value) {
function chartContractValue(ele, value, pValue) {
var chartDom = document.getElementById(ele);
contractValueChart = echarts.init(chartDom, null, {
renderer: "canvas",
@ -1132,6 +1136,9 @@
series: [
{
type: "gauge",
//startAngle: 180,
//endAngle: 0,
//center: ['50%', '60%'],
axisLine: {
lineStyle: {
width: 30,
@ -1171,13 +1178,13 @@
},
detail: {
valueAnimation: true,
formatter: "{value} %",
formatter: (value) => { return `\t\n ${value} % \t\n ${Math.round(pValue)} kW` },
color: "inherit",
fontSize: 20,
},
data: [
{
value,
value
},
],
},

View File

@ -6,14 +6,17 @@
<div class="rounded border border-white">
<div class="d-flex position-relative py-3 px-4">
<i class="fal fa-search color-success-700 position-absolute pos-left fs-lg px-3 py-2 mt-1 ml-4"></i>
<input type="text" id="js_nested_list_filter" class="form-control shadow-inset-1 pl-6 border-success" placeholder="輸入兩字以上">
<input type="text"
id="js_nested_list_filter"
class="form-control shadow-inset-1 pl-6 border-success"
placeholder="輸入兩字以上" />
</div>
<!-- nav-menu-reset will reset the font colors -->
<ul id="js_nested_list" class="nav-menu nav-menu-reset nav-menu-compact mb-sm-4 mb-md-0 rounded border border-white" data-nav-accordion="true">
</ul>
<ul id="js_nested_list"
class="nav-menu nav-menu-reset nav-menu-compact mb-sm-4 mb-md-0 rounded border border-white"
data-nav-accordion="true"></ul>
<div class="filter-message js-filter-message m-0 text-left pl-4 py-3 fw-500"></div>
</div>
</div>
<div class="col-sm-12 col-xl-10">
<div class="row bg-dark p-2">
@ -27,207 +30,296 @@
<div class="row bg-dark p-2 mb-5 align-items-center">
<div class="col-auto">
<div class="btn-group">
<button type="button" onclick="setDateType('day', this)" class="btn btn-secondary waves-effect waves-themed">日期</button>
<button type="button" onclick="setDateType('range', this)" class="btn btn-secondary waves-effect waves-themed">區間</button>
<button type="button" onclick="setDateType('month', this)" class="btn btn-secondary waves-effect waves-themed"></button>
<button type="button"
onclick="setDateType('day', this)"
class="btn btn-secondary waves-effect waves-themed">
日期
</button>
<button type="button"
onclick="setDateType('range', this)"
class="btn btn-secondary waves-effect waves-themed">
區間
</button>
<button type="button"
onclick="setDateType('month', this)"
class="btn btn-secondary waves-effect waves-themed">
</button>
</div>
</div>
<div class="col-auto">
<div class="btn-group">
<button type="button" onclick="setDateType('today', this)" class="btn btn-secondary waves-effect waves-themed">今天</button>
<button type="button" onclick="setDateType('ytd', this)" class="btn btn-secondary waves-effect waves-themed">昨天</button>
<button type="button"
onclick="setDateType('today', this)"
class="btn btn-secondary waves-effect waves-themed">
今天
</button>
<button type="button"
onclick="setDateType('ytd', this)"
class="btn btn-secondary waves-effect waves-themed">
昨天
</button>
</div>
</div>
<div class="col-auto">
<div class="form-group">
<input class="form-control flatpickr flatpickr-input selectDate" id="his_startdate" data-val="" type="date" name="date" value="">
<input class="form-control" id="getmonth" type="month" style="display: none" />
<input class="form-control flatpickr flatpickr-input selectDate"
id="his_startdate"
data-val=""
type="date"
name="date"
value="" />
<input class="form-control flatpickr flatpickr-input selectMonth"
id="getmonth"
type="month"
style="display: none" />
</div>
</div>
<div class="col-auto" id="his_enddate" style="display: none">
<div class="form-group">
<input class="form-control" type="date" data-val="" name="date" value="">
<input class="form-control flatpickr flatpickr-input selectDate"
type="date"
data-val=""
name="date"
value="" />
</div>
</div>
<div class="col-auto">
<a href="#" onclick="searchDate()" class="btn btn-info">查詢</a>
<a href="#" onclick="exportExcel()" class="btn btn-info waves-effect waves-themed">
<a href="#"
onclick="exportExcel()"
class="btn btn-info waves-effect waves-themed">
<span class="fal fa-file-excel mr-1"></span>
匯出
</a>
</div>
</div>
<div class="row-cols-1 mb-2">
<div id="devPointsList" class="btn-group">
</div>
<div class="row-cols-1 mb-2">
<div id="devPointsList" class="btn-group"></div>
</div>
<div>
<div class="frame-wrap">
<table id="historyTable" class="table table-bordered table-striped text-center m-0 w-100">
</table>
<table id="historyTable"
class="table table-bordered table-striped text-center m-0 w-100"></table>
</div>
</div>
</div>
</div>
</main>
<style>
.flatpickr-monthDropdown-month {
color: black !important;
}
</style>
<script>
var historyTable = null;
var buildingTag = null;
pageAct.hisBuiName = "";
hisFirst = true;
$(function () {
flatpickr(".selectDate", {});
flatpickr(".selectDate", {
locale: "zh_tw",
});
flatpickr(".selectMonth", {
dateFormat: "Y-m",
locale: "zh_tw",
onMonthChange: (selectedDates, dateStr, instance) => {
const curMon = new Date(
`${instance.currentYear}-${instance.currentMonth + 1}`
);
instance.setDate(curMon);
},
onYearChange: (selectedDates, dateStr, instance) => {
const curMon = new Date(
`${instance.currentYear}-${instance.currentMonth + 1}`
);
instance.setDate(curMon);
},
});
let html = "";
for (let building of pageAct.buildList) {
html += `<label class="btn btn-secondary">
<input type="radio" name="buildingRadio" id="radio-${building.getway}" value="${building.building_tag}" onChange="SelectBuild(this,'${building.building_tag}')"> ${building.full_name}
</label>`;
<input type="radio" name="buildingRadio" id="radio-${building.getway}" value="${building.building_tag}" onChange="SelectBuild(this,'${building.building_tag}')"> ${building.full_name}
</label>`;
}
$("#his_building").find(".item").empty();
$("#his_building").find(".item").append(html);
if ($("#his_building .item label").first())
$("#his_building .item label").first().click()
$("#his_building .item label").first().click();
initList();
// default list filter
initApp.listFilter($('#js_default_list'), $('#js_default_list_filter'));
initApp.listFilter($("#js_default_list"), $("#js_default_list_filter"));
// custom response message
initApp.listFilter($('#js-list-msg'), $('#js-list-msg-filter'));
initApp.listFilter($("#js-list-msg"), $("#js-list-msg-filter"));
//accordion filter
initApp.listFilter($('#js_list_accordion'), $('#js_list_accordion_filter'));
initApp.listFilter($("#js_list_accordion"), $("#js_list_accordion_filter"));
// nested list filter
initApp.listFilter($('#js_nested_list'), $('#js_nested_list_filter'));
initApp.listFilter($("#js_nested_list"), $("#js_nested_list_filter"));
//init navigation
initApp.buildNavigation($('#js_nested_list'));
initApp.buildNavigation($("#js_nested_list"));
loadTable(null);
$(`[onclick="setDateType('day', this)"]`).click();
$(`[onclick="setDateType('today', this)"]`).click();
onEvent('change', '#his_startdate', function () {
let today = displayDate(new Date(Date.now()), 'date').replaceAll('/', '-');
let ytd = displayDate(new Date(new Date().setDate(new Date(Date.now()).getDate() - 1)), 'date').replaceAll('/', '-');
onEvent("change", "#his_startdate", function () {
let today = displayDate(new Date(Date.now()), "date").replaceAll(
"/",
"-"
);
let ytd = displayDate(
new Date(new Date().setDate(new Date(Date.now()).getDate() - 1)),
"date"
).replaceAll("/", "-");
if (pageAct.dateType == 'range') {
if ($('#his_startdate').val() > $('#his_enddate input').val() && ($('#his_startdate').val() != "" && $('#his_enddate input').val() != "")) {
$('#his_startdate').val($('#his_startdate').data('val'));
toast_error('不可選擇大於結束時間');
}
else {
$('#his_startdate').data('val', $('#his_startdate').val());
$('#his_enddate input').data('val', $('#his_enddate input').val());
if (pageAct.dateType == "range") {
if (
$("#his_startdate").val() > $("#his_enddate input").val() &&
$("#his_startdate").val() != "" &&
$("#his_enddate input").val() != ""
) {
$("#his_startdate").val($("#his_startdate").data("val"));
toast_error("不可選擇大於結束時間");
} else {
$("#his_startdate").data("val", $("#his_startdate").val());
$("#his_enddate input").data("val", $("#his_enddate input").val());
$(`[onclick="setDateType('today', this)"]`).addClass('btn-secondary');
$(`[onclick="setDateType('today', this)"]`).removeClass('btn-info');
$(`[onclick="setDateType('ytd', this)"]`).addClass('btn-secondary');
$(`[onclick="setDateType('ytd', this)"]`).removeClass('btn-info');
$(`[onclick="setDateType('today', this)"]`).addClass("btn-secondary");
$(`[onclick="setDateType('today', this)"]`).removeClass("btn-info");
$(`[onclick="setDateType('ytd', this)"]`).addClass("btn-secondary");
$(`[onclick="setDateType('ytd', this)"]`).removeClass("btn-info");
if ($('#his_startdate').val() == $('#his_enddate input').val()) {
if ($('#his_startdate').val() == today) {
$(`[onclick="setDateType('today', this)"]`).removeClass('btn-secondary');
$(`[onclick="setDateType('today', this)"]`).addClass('btn-info');
}
else if ($('#his_startdate').val() == ytd) {
$(`[onclick="setDateType('ytd', this)"]`).removeClass('btn-secondary');
$(`[onclick="setDateType('ytd', this)"]`).addClass('btn-info');
if ($("#his_startdate").val() == $("#his_enddate input").val()) {
if ($("#his_startdate").val() == today) {
$(`[onclick="setDateType('today', this)"]`).removeClass(
"btn-secondary"
);
$(`[onclick="setDateType('today', this)"]`).addClass("btn-info");
} else if ($("#his_startdate").val() == ytd) {
$(`[onclick="setDateType('ytd', this)"]`).removeClass(
"btn-secondary"
);
$(`[onclick="setDateType('ytd', this)"]`).addClass("btn-info");
}
}
}
}
else if ($(this).val() == today) {
$(`[onclick="setDateType('today', this)"]`).removeClass('btn-secondary');
$(`[onclick="setDateType('today', this)"]`).addClass('btn-info');
$(`[onclick="setDateType('ytd', this)"]`).addClass('btn-secondary');
$(`[onclick="setDateType('ytd', this)"]`).removeClass('btn-info');
}
else if ($(this).val() == ytd) {
$(`[onclick="setDateType('today', this)"]`).addClass('btn-secondary');
$(`[onclick="setDateType('today', this)"]`).removeClass('btn-info');
$(`[onclick="setDateType('ytd', this)"]`).removeClass('btn-secondary');
$(`[onclick="setDateType('ytd', this)"]`).addClass('btn-info');
} else if ($(this).val() == today) {
$(`[onclick="setDateType('today', this)"]`).removeClass(
"btn-secondary"
);
$(`[onclick="setDateType('today', this)"]`).addClass("btn-info");
$(`[onclick="setDateType('ytd', this)"]`).addClass("btn-secondary");
$(`[onclick="setDateType('ytd', this)"]`).removeClass("btn-info");
} else if ($(this).val() == ytd) {
$(`[onclick="setDateType('today', this)"]`).addClass("btn-secondary");
$(`[onclick="setDateType('today', this)"]`).removeClass("btn-info");
$(`[onclick="setDateType('ytd', this)"]`).removeClass("btn-secondary");
$(`[onclick="setDateType('ytd', this)"]`).addClass("btn-info");
}
});
onEvent('change', '#his_enddate input', function () {
let today = displayDate(new Date(Date.now()), 'date').replaceAll('/', '-');
let ytd = displayDate(new Date(new Date().setDate(new Date(Date.now()).getDate() - 1)), 'date').replaceAll('/', '-');
onEvent("change", "#his_enddate input", function () {
let today = displayDate(new Date(Date.now()), "date").replaceAll(
"/",
"-"
);
let ytd = displayDate(
new Date(new Date().setDate(new Date(Date.now()).getDate() - 1)),
"date"
).replaceAll("/", "-");
if ($('#his_startdate').val() > $('#his_enddate input').val() && ($('#his_startdate').val() != "" && $('#his_enddate input').val() != "")) {
$('#his_enddate input').val($('#his_enddate input').data('val'));
toast_error('不可選擇大於結束時間');
}
else {
$('#his_startdate').data('val', $('#his_startdate').val());
$('#his_enddate input').data('val', $('#his_enddate input').val());
if (
$("#his_startdate").val() > $("#his_enddate input").val() &&
$("#his_startdate").val() != "" &&
$("#his_enddate input").val() != ""
) {
$("#his_enddate input").val($("#his_enddate input").data("val"));
toast_error("不可選擇大於結束時間");
} else {
$("#his_startdate").data("val", $("#his_startdate").val());
$("#his_enddate input").data("val", $("#his_enddate input").val());
$(`[onclick="setDateType('today', this)"]`).addClass('btn-secondary');
$(`[onclick="setDateType('today', this)"]`).removeClass('btn-info');
$(`[onclick="setDateType('ytd', this)"]`).addClass('btn-secondary');
$(`[onclick="setDateType('ytd', this)"]`).removeClass('btn-info');
$(`[onclick="setDateType('today', this)"]`).addClass("btn-secondary");
$(`[onclick="setDateType('today', this)"]`).removeClass("btn-info");
$(`[onclick="setDateType('ytd', this)"]`).addClass("btn-secondary");
$(`[onclick="setDateType('ytd', this)"]`).removeClass("btn-info");
if ($('#his_startdate').val() == $('#his_enddate input').val()) {
if ($('#his_startdate').val() == today) {
$(`[onclick="setDateType('today', this)"]`).removeClass('btn-secondary');
$(`[onclick="setDateType('today', this)"]`).addClass('btn-info');
}
else if ($('#his_startdate').val() == ytd) {
$(`[onclick="setDateType('ytd', this)"]`).removeClass('btn-secondary');
$(`[onclick="setDateType('ytd', this)"]`).addClass('btn-info');
if ($("#his_startdate").val() == $("#his_enddate input").val()) {
if ($("#his_startdate").val() == today) {
$(`[onclick="setDateType('today', this)"]`).removeClass(
"btn-secondary"
);
$(`[onclick="setDateType('today', this)"]`).addClass("btn-info");
} else if ($("#his_startdate").val() == ytd) {
$(`[onclick="setDateType('ytd', this)"]`).removeClass(
"btn-secondary"
);
$(`[onclick="setDateType('ytd', this)"]`).addClass("btn-info");
}
}
}
});
});
function initList() {
let sendData = {
building_tag: buildingTag
}
building_tag: buildingTag,
};
objSendData.Data = sendData;
let url = baseApiUrl + "/api/History/GetMainSub";
function success(res) {
let strHtml = ``;
let i1 = null, i2 = null, first = true;
let i1 = null,
i2 = null,
first = true;
$.each(res.data.history_Main_Systems, function (index, val) {
if (pageAct.mainStatus) {
strHtml += `<li>
<a href="#" data-filter-tags="${val.full_name.toLowerCase()}" data-maintag="${val.main_system_tag}">
<span class="nav-link-text">${val.full_name}</span>
</a>
<ul style="${index == 0 ? `display:block;` : ``}">`;
<a href="#" data-filter-tags="${val.full_name.toLowerCase()}" data-maintag="${val.main_system_tag
}">
<span class="nav-link-text">${val.full_name
}</span>
</a>
<ul style="${index == 0 ? `display:block;` : ``
}">`;
i1 = (val.history_Sub_systems != null && i1 == null) ? index : null;
i1 = val.history_Sub_systems != null && i1 == null ? index : null;
}
$.each(val.history_Sub_systems, function (index2, val2) {
i2 = (val2.device != null && i2 == null) ? index2 : null;
i2 = val2.device != null && i2 == null ? index2 : null;
strHtml += `<li>
<a href="#" data-filter-tags="${val2.full_name.toLowerCase()}" data-subtag="${val2.sub_system_tag}">
<span class="nav-link-text">
${val2.full_name}
</span>
</a>
<ul style="${(i1 != null ? index == i1 : first) && index2 == i2 ? `display:block;` : ``}">`;
<a href="#" data-filter-tags="${val2.full_name.toLowerCase()}" data-subtag="${val2.sub_system_tag
}">
<span class="nav-link-text">
${val2.full_name}
</span>
</a>
<ul style="${(i1 != null ? index == i1 : first) &&
index2 == i2
? `display:block;`
: ``
}">`;
$.each(val2.device, function (index3, val3) {
if (val3.device_number.includes("$3"))
val3.device_number = val3.device_number.replace("$3", "");
strHtml += `<li data-tabname="hisListItem">
<a href="#" onClick="setValue('${val3.device_number}', '${val3.full_name}', null)" data-filter-tags="${val3.full_name.toLowerCase()} ${val3.device_serial_tag.toLowerCase()}" data-devnum="${val3.device_number}">
<span class="nav-link-text">
${val3.full_name}
</span>
</a>
</li>`;
<a href="#" onClick="setValue('${val3.device_number
}', '${val3.full_name
}', null)" data-filter-tags="${val3.full_name.toLowerCase()} ${val3.device_serial_tag.toLowerCase()}" data-devnum="${val3.device_number
}">
<span class="nav-link-text">
${val3.full_name}
</span>
</a>
</li>`;
if (pageAct.mainStatus) {
if (index == i1 && index2 == i2 && first) {
@ -236,8 +328,7 @@
pageAct.deviceName = val3.full_name;
devPointsList();
}
}
else {
} else {
if (index2 == i2 && first) {
first = false;
pageAct.deviceNumber = val3.device_number;
@ -254,7 +345,7 @@
}
});
$('#js_nested_list').html(strHtml);
$("#js_nested_list").html(strHtml);
$(`[data-tabname="hisListItem"]`).YTTab();
}
$(loadEle).Loading("close");
@ -263,8 +354,8 @@
function devPointsList() {
let sendData = {
device_number: pageAct.deviceNumber
}
device_number: pageAct.deviceNumber,
};
objSendData.Data = sendData;
let url = baseApiUrl + "/api/History/GetDevPoi";
function success(res) {
@ -272,15 +363,19 @@
$.each(res.data, function (index, val) {
if (index == 0) {
strHtml += `<button onClick="setValue(null, null, '${val.points}', this)" type="button" class="btn btn-info waves-effect waves-themed">${val.full_name || val.points}</button>`;
strHtml += `<button onClick="setValue(null, null, '${val.points
}', this)" type="button" class="btn btn-info waves-effect waves-themed">${val.full_name || val.points
}</button>`;
pageAct.deviceItem = val.points;
pageAct.devicePoiName = val.full_name + ' ' + val.points;
pageAct.devicePoiName = val.full_name + " " + val.points;
} else {
strHtml += `<button onClick="setValue(null, null, '${val.points}', this)" type="button" class="btn btn-secondary waves-effect waves-themed">${val.full_name || val.points}</button>`;
strHtml += `<button onClick="setValue(null, null, '${val.points
}', this)" type="button" class="btn btn-secondary waves-effect waves-themed">${val.full_name || val.points
}</button>`;
}
});
$('#devPointsList').html(strHtml);
$("#devPointsList").html(strHtml);
if (!hisFirst) {
searchDate();
@ -298,48 +393,60 @@
let sendData = {
device_number: pageAct.deviceNumber,
device_point: pageAct.deviceItem
}
device_point: pageAct.deviceItem,
};
objSendData.Data = sendData;
let url = baseApiUrl + "/api/DevGetWay";
ytAjax = new YourTeam.Ajax(url, objSendData, function (res) {
if (res && res.code == "0000") {
pageAct.hisBuiName = res.data;
getHistoryDataByBaja(pageAct.deviceNumber + "_" + pageAct.deviceItem,
new Date(start).getTime(),
new Date(end).getTime(),
pageAct.deviceName,
pageAct.hisBuiName,
callBackFromHistory);
}
else {
ytAjax = new YourTeam.Ajax(
url,
objSendData,
function (res) {
if (res && res.code == "0000") {
pageAct.hisBuiName = res.data;
getHistoryDataByBaja(
pageAct.deviceNumber + "_" + pageAct.deviceItem,
new Date(start).getTime(),
new Date(end).getTime(),
pageAct.deviceName,
pageAct.hisBuiName,
callBackFromHistory
);
} else {
$(loadEle).Loading("close");
}
},
function (res) {
$(loadEle).Loading("close");
}
}, function (res) { $(loadEle).Loading("close"); }, "POST", true).send();
},
"POST",
true
).send();
}
function callBackFromHistory(res = '{"count":0,"data":[]}') {
res = JSON.parse(res);
loadTable(res.data);
if (historyTable != null) {
let t = $('#historyTable').dataTable();
let t = $("#historyTable").dataTable();
t.fnClearTable();
if (res.data.length > 0)
t.fnAddData(res.data);
if (res.data.length > 0) t.fnAddData(res.data);
}
}
function setValue(deviceNumber, deviceName, deviceItem, elem) {
hisFirst = false;
btnSelCss(elem);
if ((deviceNumber != null && deviceNumber != undefined) && (deviceName != null && deviceName != undefined)) {
if (
deviceNumber != null &&
deviceNumber != undefined &&
deviceName != null &&
deviceName != undefined
) {
pageAct.deviceNumber = deviceNumber;
pageAct.deviceName = deviceName;
devPointsList();
}
else if (deviceItem != null && deviceItem != undefined) {
} else if (deviceItem != null && deviceItem != undefined) {
pageAct.devicePoiName = $(elem).text();
pageAct.deviceItem = deviceItem;
@ -352,67 +459,83 @@
pageAct.dateType = type;
let now = formatDate(new Date(Date.now()), "date");
let ytd = formatDate(new Date(new Date().setDate(new Date().getDate() - 1)), "date");
let tmr = formatDate(new Date(new Date().setDate(new Date().getDate() + 1)), "date");
let ytd = formatDate(
new Date(new Date().setDate(new Date().getDate() - 1)),
"date"
);
let tmr = formatDate(
new Date(new Date().setDate(new Date().getDate() + 1)),
"date"
);
$(".flatpickr-innerContainer").show();
if (type == "day" || type == "today" || type == "ytd") {
let date = type == "ytd" ? ytd : now;
$('#his_startdate').css('display', 'block');
$('#his_enddate').css('display', 'none');
$('#getmonth').css('display', 'none');
$('#his_startdate').val(date);
$("#his_startdate").css("display", "block");
$("#his_enddate").css("display", "none");
$("#getmonth").css("display", "none");
$("#his_startdate").val(date);
if (type == "today")
getData(formatDate(now, "date", true), formatDate(now, "date", true));
else if (type == "ytd")
getData(formatDate(ytd, "date", true), formatDate(ytd, "date", true));
else {
$(`[onclick="setDateType('today', this)"]`).removeClass('btn-secondary');
$(`[onclick="setDateType('today', this)"]`).addClass('btn-info');
$(`[onclick="setDateType('today', this)"]`).removeClass(
"btn-secondary"
);
$(`[onclick="setDateType('today', this)"]`).addClass("btn-info");
}
}
else if (type == "range") {
$(`[onclick="setDateType('today', this)"], [onclick="setDateType('ytd', this)"]`).removeClass('btn-info');
$(`[onclick="setDateType('today', this)"], [onclick="setDateType('ytd', this)"]`).addClass('btn-secondary');
} else if (type == "range") {
$(
`[onclick="setDateType('today', this)"], [onclick="setDateType('ytd', this)"]`
).removeClass("btn-info");
$(
`[onclick="setDateType('today', this)"], [onclick="setDateType('ytd', this)"]`
).addClass("btn-secondary");
$('#his_startdate').css('display', 'block');
$('#his_enddate').css('display', 'block');
$('#getmonth').css('display', 'none');
$('#his_startdate').val(now);
$('#his_startdate').data('val', now);
$('#his_enddate input').val(tmr);
$('#his_enddate input').data('val', tmr);
}
else if (type == "month") {
$(`[onclick="setDateType('today', this)"], [onclick="setDateType('ytd', this)"]`).removeClass('btn-info');
$(`[onclick="setDateType('today', this)"], [onclick="setDateType('ytd', this)"]`).addClass('btn-secondary');
$("#his_startdate").css("display", "block");
$("#his_enddate").css("display", "block");
$("#getmonth").css("display", "none");
$("#his_startdate").val(now);
$("#his_startdate").data("val", now);
$("#his_enddate input").val(tmr);
$("#his_enddate input").data("val", tmr);
} else if (type == "month") {
$(
`[onclick="setDateType('today', this)"], [onclick="setDateType('ytd', this)"]`
).removeClass("btn-info");
$(
`[onclick="setDateType('today', this)"], [onclick="setDateType('ytd', this)"]`
).addClass("btn-secondary");
$('#his_startdate').css('display', 'none');
$('#his_enddate').css('display', 'none');
$('#getmonth').css('display', 'block');
$('#getmonth').val(now.substr(0, 7));
}
else if (type == "ytd") {
$('#his_startdate').css('display', 'block');
$('#his_enddate').css('display', 'none');
$('#getmonth').css('display', 'none');
$('#his_startdate').val(ytd);
$("#his_startdate").css("display", "none");
$("#his_enddate").css("display", "none");
$("#getmonth").css("display", "block");
$("#getmonth").val(now.substr(0, 7));
$(".flatpickr-innerContainer").hide();
} else if (type == "ytd") {
$("#his_startdate").css("display", "block");
$("#his_enddate").css("display", "none");
$("#getmonth").css("display", "none");
$("#his_startdate").val(ytd);
}
}
function searchDate() {
let start = new Date($('#his_startdate').val());
let end = new Date($('#his_enddate input').val());
let start = new Date($("#his_startdate").val());
let end = new Date($("#his_enddate input").val());
if (pageAct.dateType == "today" || pageAct.dateType == "day" || pageAct.dateType == "ytd")
if (
pageAct.dateType == "today" ||
pageAct.dateType == "day" ||
pageAct.dateType == "ytd"
)
end = start;
else if (pageAct.dateType == "month") {
start = new Date($('#getmonth').val());
start = new Date($("#getmonth").val());
end = new Date(start.valueOf()).setMonth(start.getMonth() + 1);
end = new Date(new Date(end).setDate(new Date(end).getDate() - 1));
}
else if (pageAct.dateType != "range")
return;
} else if (pageAct.dateType != "range") return;
pageAct.hisStartDate = start;
pageAct.hisEndDate = end;
@ -420,20 +543,18 @@
}
function formatDate(date, type, send = false) {
if (!send)
return displayDate(date, type).replaceAll("/", "-");
if (!send) return displayDate(date, type).replaceAll("/", "-");
else {
date = displayDate(date, type);
let month = date.split('/')[1];
let year = date.split('/')[0];
let day = date.split('/')[2];
let month = date.split("/")[1];
let year = date.split("/")[0];
let day = date.split("/")[2];
return month + "/" + day + "/" + year;
}
}
function loadTable(data) {
if (data) {
$.each(data, function (i, v) {
v.type = pageAct.devicePoiName.split(" ")[0];
});
@ -441,41 +562,51 @@
let tag = "#historyTable";
let column_defs = [
{ "targets": [0], "width": "20%", "sortable": true },
{ "targets": [1], "width": "20%", "sortable": true },
{ "targets": [2], "width": "20%", "sortable": true }
{ targets: [0], width: "20%", sortable: true },
{ targets: [1], width: "20%", sortable: true },
{ targets: [2], width: "20%", sortable: true },
];
let columns = [
{
"title": "類別",
"data": "type"
title: "類別",
data: "type",
},
{
"title": "設備名稱",
"data": "deviceName",
title: "設備名稱",
data: "deviceName",
},
{
"title": "數值",
"data": "value",
"render": function (data) {
title: "數值",
data: "value",
render: function (data) {
if (isNaN(data.toString())) {
return data
return data;
}
return data.roundDecimal(2);
}
},
},
{
"title": "紀錄時間",
"data": "timestamp",
"render": function (data) {
title: "紀錄時間",
data: "timestamp",
render: function (data) {
return displayDate(data, "datetime");
}
}
},
},
];
historyTable = new YourTeam.JqDataTables.getTableByStatic(tag, data, columns, column_defs, null, null, null, null, "tpi");
$(tag).DataTable().order([3, 'desc']);
historyTable = new YourTeam.JqDataTables.getTableByStatic(
tag,
data,
columns,
column_defs,
null,
null,
null,
null,
"tpi"
);
$(tag).DataTable().order([3, "desc"]);
}
}
@ -543,10 +674,10 @@
$("[name=buildingRadio]:checked").parent().removeClass("btn-secondary");
$("[name=buildingRadio]:checked").parent().addClass("btn-info");
buildingTag = buildingRadios.val(); //building tag
pageAct.hisBuiName = buildingRadios.prop('id').split("-")[1];
pageAct.hisBuiName = buildingRadios.prop("id").split("-")[1];
initList();
result = true;
}
return result;
}
</script>
</script>

View File

@ -806,12 +806,12 @@
switch (tableType) {
case "day":
columns = getDayByMonth($("#elecMonthDate").val()).map((dc) => {
return { title: dc, data: dc, sWidth: columnWidth };
return { title: dc, data: dc, width: columnWidth };
});
break;
case "month":
columns = getMonthByYear($("#elecYearDate").val()).map((dc) => {
return { title: dc, data: dc, sWidth: columnWidth };
return { title: dc, data: dc, width: columnWidth };
});
break;
case "year":
@ -819,7 +819,7 @@
$("#elecSYearDate").val(),
$("#elecEYearDate").val()
).map((dc) => {
return { title: dc, data: dc, sWidth: columnWidth };
return { title: dc, data: dc, width: columnWidth };
});
break;
case "compare":
@ -859,10 +859,10 @@
title: dc.value,
data: dc.value,
sClass: "compare",
sWidth: columnWidth,
width: columnWidth,
};
}
return { title: dc, data: dc, sWidth: columnWidth };
return { title: dc, data: dc, width: columnWidth };
});
break;
@ -909,7 +909,7 @@
value: "last year different",
},
].map((dc) => {
return { title: dc.label, data: dc.value, sWidth: "120px" };
return { title: dc.label, data: dc.value, width: "120px" };
});
} else {
datesColumns = setTableColumns();
@ -929,12 +929,14 @@
{
title: "小計",
data: "total",
sWidth: "70px",
width: "70px",
className: "text-nowrap",
},
{
title: "單價",
data: "price",
sWidth: "45px",
width: "45px",
className: "text-nowrap",
render: function (data) {
return parseInt(data) === 0 ? "" : data;
},
@ -942,7 +944,8 @@
{
title: "金額總計",
data: "total_price",
sWidth: "70px",
width: "70px",
className: "text-nowrap",
render: function (data) {
return parseInt(data) === 0 ? "" : data;
},
@ -966,11 +969,12 @@
totalColumns.splice(i + 1, 0, {
title: com2Time + c.title,
data: "_compare_" + c.data,
sWidth: "70px",
sClass: "compare",
width: "70px",
sClass: "compare text-nowrap",
});
c.title = com1Time + c.title;
c.sWidth = "70px";
c.width = "70px";
c.className = "text-nowrap";
}
}
}
@ -979,10 +983,13 @@
data: datas,
destroy: true,
sDom: '<"toolbar">tipl',
fixedColumns: { left: 3, right: tableType == "compare" ? 2 : 3 },
fixedColumns: {
leftColumns: 3,
rightColumns: tableType == "compare" ? 2 : 3,
},
scrollX: "auto",
scrollCollapse: true,
autoWidth: true,
autoWidth: false,
language: { url: "/file/BajascriptTest/js/dataTables/zh-HANT.json" },
aaSorting: [],
columns: [
@ -990,18 +997,19 @@
title: "棟別",
data: "building_name",
className: "text-nowrap",
sWidth: "100px",
width: "100px",
},
{
title: "樓層",
data: "floor_tag",
sWidth: "8%",
width: "8%",
className: "text-nowrap",
},
{
title: "設備",
data: "device_full_name",
sWidth: "100px",
width: "300px",
className: "text-nowrap",
},
...datesColumns,
...(ElecEachTotal ? [] : totalColumns),

File diff suppressed because it is too large Load Diff

View File

@ -99,20 +99,32 @@ function getAlarmByBaja(
var _index = 0;
var _recoverState = isRecover ? "= 'normal'" : "= 'offnormal'";
var _ackState = isAck ? "= 'acked'" : "= 'unacked'";
//console.log("local:|foxs:|alarm:|bql:select timestamp, ackState, alarmClass, alarmClassDisplayName, alarmValue, alarmData, alarmData.sourceName, uuid, alarmData.msgText, alarmData.numericValue, alarmData.presentValue, alarmData.status, alarmData.toState, normalTime where alarmClass = '" + alarmClass + "' and timestamp.millis > " + startDate_millisecond + " and timestamp.millis < " + endDate_millisecond + " and normalTime " + _recoverState + " and ackState " + _ackState + " order by timestamp asc")
// console.log('@@@@@@@@@',
// "local:|foxs:|alarm:|bql:select timestamp, ackTime, ackState, alarmClass, alarmClassDisplayName, alarmValue, alarmData, alarmData.sourceName, uuid, alarmData.msgText, alarmData.numericValue, alarmData.presentValue, alarmData.status, alarmData.toState, normalTime where alarmClass = '" +
// alarmClass +
// "' and timestamp.millis > " +
// startDate_millisecond +
// " and timestamp.millis < " +
// endDate_millisecond +
// " and sourceState " +
// _recoverState +
// " and ackState " +
// _ackState +
// " order by timestamp asc"
// );
require(["baja!"], function (baja) {
baja.Ord.make(
"local:|foxs:|alarm:|bql:select timestamp, ackTime, ackState, alarmClass, alarmClassDisplayName, alarmValue, alarmData, alarmData.sourceName, uuid, alarmData.msgText, alarmData.numericValue, alarmData.presentValue, alarmData.status, alarmData.toState, normalTime where alarmClass = '" +
alarmClass +
"' and timestamp.millis > " +
startDate_millisecond +
" and timestamp.millis < " +
endDate_millisecond +
" and sourceState " +
_recoverState +
" and ackState " +
_ackState +
" order by timestamp asc"
alarmClass +
"' and timestamp.millis > " +
startDate_millisecond +
" and timestamp.millis < " +
endDate_millisecond +
" and sourceState " +
_recoverState +
" and ackState " +
_ackState +
" order by timestamp asc"
)
.get()
.then(function (table) {
@ -121,25 +133,24 @@ function getAlarmByBaja(
const alarmDisplayName =
record.get("alarmData").get("sourceName").split(":")[1] ??
record.get("alarmData").get("sourceName").split(":")[0];
//console.log(alarmDisplayName)
_sourceTmp = alarmDisplayName.split("_");
_bfName = _sourceTmp[1] + "-" + _sourceTmp[4];
_sourceName = _sourceTmp.slice(0, 8).join("_");
_sourceTmp = _sourceTmp[7] + "-" + _sourceTmp[8];
if (!_sourceTmp.includes("undefined")) {
_ss.push({
buildingFloorName_zh: _bfName,
uuid: record.get("uuid"),
timestamp: record.get("timestamp").$cEncStr,
alarmClass: record.get("alarmClass"),
sourceName_zh: _sourceName,
sourceTmp: _sourceTmp,
msgText: record.get("alarmData").get("msgText"),
ackState: record.get("ackState"),
normalTime: record.get("normalTime"),
ackedTime: record.get("ackTime").$cEncStr,
});
}
// if (!_sourceTmp.includes("undefined")) {
_ss.push({
buildingFloorName_zh: _bfName,
uuid: record.get("uuid"),
timestamp: record.get("timestamp").$cEncStr,
alarmClass: record.get("alarmClass"),
sourceName_zh: _sourceName,
sourceTmp: _sourceTmp,
msgText: record.get("alarmData").get("msgText"),
ackState: record.get("ackState"),
normalTime: record.get("normalTime"),
ackedTime: record.get("ackTime").$cEncStr,
});
// }
_index++;
},
after: function () {
@ -202,8 +213,8 @@ function getOneDeviceAlarmTop10ByBaja(devicePath, callback) {
require(["baja!"], function (baja) {
baja.Ord.make(
"local:|foxs:|alarm:|bql:select top 10 timestamp, ackState, alarmData, alarmData.sourceName, sourceState, uuid, alarmData.msgText, normalTime where alarmData.sourceName like '%" +
devicePath +
"%' order by timestamp desc"
devicePath +
"%' order by timestamp desc"
)
.get()
.then(function (table) {
@ -262,7 +273,6 @@ function getOneDeviceAlarmTop10ByBaja(devicePath, callback) {
})
.catch(() => {
$(loadEle).Loading("close");
});
});
}
@ -305,8 +315,8 @@ function getOneSystemAlarmStateByBaja(systemPath, callback) {
require(["baja!"], function (baja) {
baja.Ord.make(
"local:|foxs:|alarm:|bql:select alarmData, alarmData.sourceName, sourceState, uuid where alarmData.sourceName like '%" +
systemPath +
"%' order by timestamp desc"
systemPath +
"%' order by timestamp desc"
)
.get()
.then(function (table) {
@ -360,10 +370,10 @@ function getOneSystemStateByBaja(systemPath, callback) {
require(["baja!"], function (baja) {
baja.Ord.make(
"local:|foxs:" +
port +
"|alarm:|bql:select top 1 alarmData, alarmData.sourceName, sourceState where alarmData.sourceName like '%" +
systemPath +
"%' order by timestamp desc"
port +
"|alarm:|bql:select top 1 alarmData, alarmData.sourceName, sourceState where alarmData.sourceName like '%" +
systemPath +
"%' order by timestamp desc"
)
.get()
.then(function (table) {
@ -420,8 +430,8 @@ function getAlarmCountByBaja(callback) {
require(["baja!"], function (baja) {
baja.Ord.make(
"local:|foxs:" +
port +
"|alarm:|bql:select COUNT(*) where sourceState = 'offnormal'"
port +
"|alarm:|bql:select COUNT(*) where sourceState = 'offnormal'"
)
.get()
.then(function (table) {
@ -468,8 +478,8 @@ function getRecoverCountByBaja(callback) {
require(["baja!"], function (baja) {
baja.Ord.make(
"local:|foxs:" +
port +
"|alarm:|bql:select COUNT(*) where normalTime != null"
port +
"|alarm:|bql:select COUNT(*) where normalTime != null"
)
.get()
.then(function (table) {
@ -515,8 +525,8 @@ function getCheckedAckedCountByBaja(callback) {
require(["baja!"], function (baja) {
baja.Ord.make(
"local:|foxs:" +
port +
"|alarm:|bql:select COUNT(*) where ackState='acked'"
port +
"|alarm:|bql:select COUNT(*) where ackState='acked'"
)
.get()
.then(function (table) {
@ -562,8 +572,8 @@ function getUnCheckedAckedCountByBaja(callback) {
require(["baja!"], function (baja) {
baja.Ord.make(
"local:|foxs:" +
port +
"|alarm:|bql:select COUNT(*) where ackState='unacked'"
port +
"|alarm:|bql:select COUNT(*) where ackState='unacked'"
)
.get()
.then(function (table) {
@ -593,8 +603,8 @@ function getSystemAlarmByBaja(callback) {
//baja.Ord.make("local:|foxs:|alarm:|bql:select timestamp, ackState, alarmClass, alarmClassDisplayName, alarmValue, alarmData, alarmData.sourceName, uuid, alarmData.msgText, alarmData.numericValue, alarmData.presentValue, alarmData.status, alarmData.toState, normalTime where isAlarm").get()
baja.Ord.make(
"local:|foxs:" +
port +
"|alarm:|bql:select alarmClass where sourceState = 'offnormal'"
port +
"|alarm:|bql:select alarmClass where sourceState = 'offnormal'"
)
.get()
.then(function (table) {
@ -709,8 +719,8 @@ function getOneDeviceAlarmByBaja(devicePath, callback) {
// console.log("local:|foxs:|alarm:|bql:select timestamp, ackState, alarmClass, alarmClassDisplayName, alarmValue, alarmData, alarmData.sourceName, uuid, alarmData.msgText, alarmData.numericValue, alarmData.presentValue, alarmData.status, alarmData.toState, normalTime where alarmData.sourceName like '%" + devicePath + "%' order by timestamp desc");
baja.Ord.make(
"local:|foxs:|alarm:|bql:select timestamp, ackState, alarmClass, alarmClassDisplayName, alarmValue, alarmData, alarmData.sourceName, uuid, alarmData.msgText, alarmData.numericValue, alarmData.presentValue, alarmData.status, alarmData.toState, normalTime where alarmData.sourceName like '%" +
devicePath +
"%' order by timestamp desc"
devicePath +
"%' order by timestamp desc"
)
.get()
.then(function (table) {
@ -770,6 +780,18 @@ function getOtherAlarmByBaja(
console.log(
"告警2",
"local:|foxs:|alarm:|bql:select timestamp, ackTime, priority ,ackState, alarmClass, alarmClassDisplayName, alarmValue, alarmData, alarmData.sourceName, uuid, alarmData.msgText, alarmData.numericValue, alarmData.presentValue, alarmData.status, alarmData.toState, normalTime where " +
startUrl +
"timestamp.millis <= " +
endDate_millisecond +
" and sourceState " +
_recoverState +
" and ackState " +
_ackState +
" order by timestamp desc"
);
require(["baja!"], function (baja) {
baja.Ord.make(
"local:|foxs:|alarm:|bql:select timestamp, ackTime, priority ,ackState, alarmClass, alarmClassDisplayName, alarmValue, alarmData, alarmData.sourceName, uuid, alarmData.msgText, alarmData.numericValue, alarmData.presentValue, alarmData.status, alarmData.toState, normalTime where " +
startUrl +
"timestamp.millis <= " +
endDate_millisecond +
@ -778,18 +800,6 @@ function getOtherAlarmByBaja(
" and ackState " +
_ackState +
" order by timestamp desc"
);
require(["baja!"], function (baja) {
baja.Ord.make(
"local:|foxs:|alarm:|bql:select timestamp, ackTime, priority ,ackState, alarmClass, alarmClassDisplayName, alarmValue, alarmData, alarmData.sourceName, uuid, alarmData.msgText, alarmData.numericValue, alarmData.presentValue, alarmData.status, alarmData.toState, normalTime where " +
startUrl +
"timestamp.millis <= " +
endDate_millisecond +
" and sourceState " +
_recoverState +
" and ackState " +
_ackState +
" order by timestamp desc"
)
.get()
.then(function (table) {
@ -868,14 +878,14 @@ function getAllDeviceAlarmByBaja(
require(["baja!"], function (baja) {
baja.Ord.make(
"local:|foxs:|alarm:|bql:select timestamp, ackTime, priority ,ackState, alarmClass, alarmClassDisplayName, alarmValue, alarmData, alarmData.sourceName, uuid, alarmData.msgText, alarmData.numericValue, alarmData.presentValue, alarmData.status, alarmData.toState, normalTime where " +
startUrl +
"timestamp.millis <= " +
endDate_millisecond +
" and sourceState " +
_recoverState +
" and ackState " +
_ackState +
" order by timestamp desc"
startUrl +
"timestamp.millis <= " +
endDate_millisecond +
" and sourceState " +
_recoverState +
" and ackState " +
_ackState +
" order by timestamp desc"
)
.get()
.then(function (table) {
@ -951,14 +961,14 @@ function getDeviceAlarmCardByBaja(
require(["baja!"], function (baja) {
baja.Ord.make(
"local:|foxs:|alarm:|bql:select timestamp, ackTime, priority ,ackState, alarmClass, alarmClassDisplayName, alarmValue, alarmData, alarmData.sourceName, uuid, alarmData.msgText, alarmData.numericValue, alarmData.presentValue, alarmData.status, alarmData.toState, normalTime where " +
startUrl +
"timestamp.millis <= " +
endDate_millisecond +
" and sourceState " +
_recoverState +
" and ackState " +
_ackState +
" order by timestamp desc"
startUrl +
"timestamp.millis <= " +
endDate_millisecond +
" and sourceState " +
_recoverState +
" and ackState " +
_ackState +
" order by timestamp desc"
)
.get()
.then(function (table) {

View File

@ -102,7 +102,7 @@ namespace FrontendWebApi.ApiControllers
#endregion
#region get data from niagara
lhe.endtime = lhe.dateType == "today" ? lhe.starttime : lhe.dateType == "month" ? lhe.starttime.AddMonths(1) : lhe.endtime;
lhe.endtime = lhe.dateType == "today" ? lhe.starttime : lhe.dateType == "month" ? lhe.starttime.AddMonths(1).AddDays(-1) : lhe.endtime;
var startTimestamp = string.Format("{0}T00:00:00.000+08:00", lhe.starttime.ToString("yyyy-MM-dd"));
var endTimestamp = string.Format("{0}T23:59:59.000+08:00", lhe.endtime?.ToString("yyyy-MM-dd"));
var historyQueryFilter = $@"<obj is='obix: HistoryFilter'>
@ -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);
@ -262,8 +266,10 @@ namespace FrontendWebApi.ApiControllers
}
if (d.type != lastDeviceItem)
{
RowPosition = 0;
lastDeviceItem = d.type;
sheet = workbook.CreateSheet($"{building.Where(x => x.building_tag == lhe.device_number.Split("_")[1]).Select(x => x.full_name).FirstOrDefault()}{"_" + d.type}");
//sheet = workbook.CreateSheet($"{d.deviceName}{"_" + d.type}");
#region set cell
row = sheet.CreateRow(RowPosition);
sheet.SetColumnWidth(0, 4 * 160 * 12);
@ -282,7 +288,7 @@ namespace FrontendWebApi.ApiControllers
cell.SetCellValue("記錄時間");
cell.CellStyle = styleLine12;
#endregion
RowPosition = 0;
RowPosition = 1;
}
else {
RowPosition += 1;

View File

@ -21,6 +21,8 @@ using Google.Protobuf.Collections;
using Org.BouncyCastle.Asn1.Pkcs;
using NPOI.SS.Formula.Functions;
using static ICSharpCode.SharpZipLib.Zip.ExtendedUnixData;
using static NPOI.HSSF.Record.PageBreakRecord;
using System.Linq.Expressions;
namespace FrontendWebApi.ApiControllers
{
@ -114,7 +116,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 ";
@ -132,20 +134,28 @@ namespace FrontendWebApi.ApiControllers
var dateFormat = input.tableType == "day" || input.tableType == "week" ? "%Y-%m-%d" : input.tableType == "month" ? "%Y-%m" : input.tableType == "year" ? "%Y" : null;
var aemmEndDate = input.tableType == "year" ? $"year(DATE_ADD(fd.date, INTERVAL +1 {input.tableType}))" : $"DATE_ADD(fd.date, INTERVAL +1 {input.tableType})";
var aemmStaDate = input.tableType == "year" ? "year(fd.date)" : "fd.date";
var sql = $@"set @i = -1;
string date_yyyymmdd = "";
switch (input.tableType)
{
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 = @$" date(aemm.start_timestamp) = {aemmStaDate}"; break;
case "year": date_yyyymmdd = @$" aemm.start_timestamp >= {aemmStaDate} and aemm.end_timestamp < {aemmEndDate} "; break;
}
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
from (
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 +164,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
) aemm on {date_yyyymmdd} 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 +189,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>();
@ -196,13 +208,21 @@ namespace FrontendWebApi.ApiControllers
}
l.building_name = await backendRepository.GetOneAsync<string>("select full_name from building where building_tag = @building_tag and deleted = 0",
new { building_tag = l.building_tag });
//如果是 總計不含分盤 mode = custom 就呈現 化工總計
//if (input.Mode == HydroMeterInputSearchMode.Custom && l.building_tag == "D8")
//{
// l.building_name = "化工館總計";
//}
l.total = l.rawData.Where(x => x.avg_rawdata != "NaN").Sum(x => decimal.Parse(x.avg_rawdata ?? "0", System.Globalization.NumberStyles.Float)).ToString();
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();
i++;
}
Logger.LogInformation(" 筆數:" + i.ToString());
apiResult.Code = "0000";
apiResult.Data = list;
}
@ -428,11 +448,12 @@ namespace FrontendWebApi.ApiControllers
{
List<List<HydroMeterOutput>> result = new List<List<HydroMeterOutput>>();
var building = backendRepository.GetAllAsync<HydroBuildList>("select * from building where deleted = 0").Result;
foreach(var b in building)
{
input.building_tag = b.building_tag;
result.Add(this.ElectricList(input).Result.Value.Data.ToList());
}
//foreach(var b in building)
//{
// 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());
List<Dictionary<string, byte[]>> docFile = new List<Dictionary<string, byte[]>>();
var workbook = new XSSFWorkbook();
@ -467,6 +488,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;
@ -477,14 +512,25 @@ namespace FrontendWebApi.ApiControllers
stylein12.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
stylein12.WrapText = true;
#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)
{
if (r.Count > 0)
{
string buildingName = r.Select(x => x.building_name).FirstOrDefault();
var sheet = workbook.CreateSheet($"{buildingName} 電表報表");
Logger.LogInformation(@$"buildingName = {buildingName}" + Environment.NewLine);
int RowPosition = 0;
#region set cell
#region set cell for columns
IRow row = sheet.CreateRow(RowPosition);
sheet.SetColumnWidth(0, 4 * 160 * 12);
sheet.SetColumnWidth(1, 4 * 160 * 12);
@ -585,7 +631,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", @$"電表報表_{reportType}_{System.DateTime.Now.ToString("yyyyMMddHHmm")}.xlsx");
}
[HttpPost]
@ -829,27 +875,30 @@ namespace FrontendWebApi.ApiControllers
return File(ms, "application/vnd.ms-excel", @$"電表報表{System.DateTime.Now.ToString("yyyyMMddHHmm")}.xlsx");
}
/// <summary>
/// 客製化報表 excel 匯出 - 總計不含分盤
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost]
[Route("api/ExportElectricEachTotalCompareList")]
public FileResult OpeExportEachTotalCompareExcelElec([FromBody] HydroMeterInput input)
{
List<HydroMeterOutput> result = new List<HydroMeterOutput>();
List<HydroMeterOutput> result_for_sum = new List<HydroMeterOutput>();
result = ElectricListEachTotal(input).Result.Value.Data.ToList();
bool flag = true;
bool total_flag = false;
string outputFileName = input.Mode == HydroMeterInputSearchMode.All ? "用電月份比較_含分盤_" : "用電月份比較_";
if (input.Mode == HydroMeterInputSearchMode.Custom)
{
result_for_sum = ElectricListEachTotal(input).Result.Value.Data.ToList();
flag = false;
//flag = false;
total_flag = true;
}
else
{
result_for_sum = new List<HydroMeterOutput>(result);
input.Mode = HydroMeterInputSearchMode.All;
}
List<HydroMeterOutput> result = new List<HydroMeterOutput>();
result = ElectricListEachTotal(input).Result.Value.Data.ToList();
List<Dictionary<string, byte[]>> docFile = new List<Dictionary<string, byte[]>>();
var workbook = new XSSFWorkbook();
@ -956,12 +1005,12 @@ namespace FrontendWebApi.ApiControllers
int columnIndex = 1; // 假設第一欄是要填入的位置
List<string> need_cal_total = new List<string>
{
"綜合大樓",
"體育舘",
"化工館",
"創新大樓",
"學人會館",
"綠能中心"
"綜合大樓", //G6
"體育舘", //F5
"化工電機", //D8
"創新大樓", //G9
"學人會館", //B9
"綠能中心" //$340B9
};
List<string> no_cal_sum_device = new List<string>
{
@ -970,16 +1019,16 @@ namespace FrontendWebApi.ApiControllers
"第二校區總盤",
"薄膜分盤"
};
List<string> need_green_device = new List<string>
List<string> need_green_device = new List<string> //需要綠色底色
{
"第一校區總盤",
"圖資大樓總盤",
"教學大樓總盤",
"教學大樓總盤",
"電子館分盤",
"機械館分盤",
"電機館分盤",
"學5舍總盤",
"學1-4舍餐廳總盤", //C7
"學5舍5眷總盤", //B4
"8眷舍分盤",
"企教分盤",
"7眷舍分盤",
@ -991,11 +1040,18 @@ namespace FrontendWebApi.ApiControllers
string last_build = "";
string last_device = "";
// ------------------
Dictionary<string, Dictionary<string, double>> buildingSumData = new Dictionary<string, Dictionary<string, double>>();
#region
foreach (var item in result_for_sum)
foreach (var item in result)
{
if (item.device_full_name == "NTPC_D8_EE_E4_RF_H1_WHT_N1") //化工電機
{
Console.WriteLine("here 化工電機 " + item.building_name);
if (item.building_name == "化工電機")
{
Console.WriteLine("here 化工電機 " + item.building_name);
}
}
if (!need_cal_total.Contains(item.building_name))
{
continue;
@ -1020,7 +1076,7 @@ namespace FrontendWebApi.ApiControllers
buildingSumData[item.building_name][dataItem.timeStamp] += Math.Round(double.Parse(dataItem.avg_rawdata));
}
}
#endregion
// 測試
//foreach (var building in buildingSumData)
//{
@ -1030,40 +1086,61 @@ namespace FrontendWebApi.ApiControllers
// Console.WriteLine($" TimeStamp: {timeStampData.Key}, Total Avg RawData: {timeStampData.Value}");
// }
//}
// ------------------
#endregion
foreach (var r in result)
{
if (total_flag)
{
flag = false;
}
//if (total_flag)
//{
// flag = false;
//}
string buildingName = r.building_name;
string floorTag = r.floor_tag;
string deviceFullName = r.device_full_name;
columnIndex = 0;
// 這兩個盤不納入該棟總計
if (last_device == "電機館分盤" || last_device == "薄膜分盤")
{
flag = false;
}
if ((flag && buildingName == "化工" && deviceFullName == "電機館分盤") || (flag && buildingName == "綠能中心" && deviceFullName == "薄膜分盤"))
if ((flag && buildingName == "化工電機" && deviceFullName == "電機館分盤") || (flag && buildingName == "綠能中心" && deviceFullName == "薄膜分盤"))
{
row = sheet.GetRow(rowIndex) ?? sheet.CreateRow(rowIndex);
cell = row.GetCell(columnIndex++) ?? row.CreateCell(columnIndex++);
cell.SetCellValue(count_index.ToString());
count_index++;
if (total_flag)
{
cell = row.GetCell(columnIndex) ?? row.CreateCell(columnIndex);
cell.SetCellValue(buildingName + floorTag);
}
columnIndex++;
cell = row.GetCell(columnIndex++) ?? row.CreateCell(columnIndex++);
cell.SetCellValue(last_build + "總計");
if (last_build == "化工電機")
{
cell.SetCellValue("化工館總計");
}
else {
cell.SetCellValue(last_build + "總計");
}
cell.CellStyle = greenCellStyle;
foreach (var timeStampData in buildingSumData[last_build])
{
cell = row.GetCell(columnIndex++) ?? row.CreateCell(columnIndex++);
cell.SetCellValue(timeStampData.Value.ToString());
//if (last_build == "化工電機")
//{
// cell.SetCellValue(10); //總計結果寫入
//}
//else
//{
cell.SetCellValue(timeStampData.Value.ToString()); //總計結果寫入 by jiahao 09/28
//}
}
rowIndex++;
@ -1071,8 +1148,9 @@ namespace FrontendWebApi.ApiControllers
flag = false;
columnIndex = 0;
}
if ((total_flag && need_cal_total.Contains(last_build)) || (flag && buildingName != last_build && need_cal_total.Contains(last_build)))
//增加總計欄位
if (flag && buildingName != last_build && need_cal_total.Contains(last_build))
{
row = sheet.GetRow(rowIndex) ?? sheet.CreateRow(rowIndex);
cell = row.GetCell(columnIndex++) ?? row.CreateCell(columnIndex++);
@ -1087,7 +1165,15 @@ namespace FrontendWebApi.ApiControllers
columnIndex++;
cell = row.GetCell(columnIndex++) ?? row.CreateCell(columnIndex++);
cell.SetCellValue(last_build + "總計");
if (last_build == "學人會館")
{
cell.SetCellValue("學人國際總計");
}
else {
cell.SetCellValue(last_build + "總計");
}
cell.CellStyle = greenCellStyle;
foreach (var timeStampData in buildingSumData[last_build])
@ -1101,7 +1187,40 @@ namespace FrontendWebApi.ApiControllers
// continue;
}
//是否需要總計
if (total_flag)
{
if (need_green_device.Contains(deviceFullName))
{
columnIndex = 0;
row = sheet.GetRow(rowIndex) ?? sheet.CreateRow(rowIndex);
cell = row.GetCell(columnIndex++) ?? row.CreateCell(columnIndex++);
cell.SetCellValue(count_index.ToString());
count_index++;
cell = row.GetCell(columnIndex++) ?? row.CreateCell(columnIndex++);
cell.SetCellValue(buildingName + floorTag);
cell = row.GetCell(columnIndex++) ?? row.CreateCell(columnIndex++);
cell.SetCellValue(deviceFullName);
cell.CellStyle = greenCellStyle;
foreach (var rawD in r.rawData)
{
cell = row.GetCell(columnIndex++) ?? row.CreateCell(columnIndex++);
cell.SetCellValue(rawD.avg_rawdata);
}
rowIndex++;
last_build = buildingName;
last_device = deviceFullName;
flag = true;
}
last_build = buildingName;
last_device = deviceFullName;
flag = true;
continue;
}
columnIndex = 0;
row = sheet.GetRow(rowIndex) ?? sheet.CreateRow(rowIndex);
cell = row.GetCell(columnIndex++) ?? row.CreateCell(columnIndex++);
@ -1113,7 +1232,7 @@ namespace FrontendWebApi.ApiControllers
cell = row.GetCell(columnIndex++) ?? row.CreateCell(columnIndex++);
cell.SetCellValue(deviceFullName);
if (total_flag || need_green_device.Contains(deviceFullName))
if (need_green_device.Contains(deviceFullName))
{
cell.CellStyle = greenCellStyle;
}
@ -1123,7 +1242,6 @@ namespace FrontendWebApi.ApiControllers
cell = row.GetCell(columnIndex++) ?? row.CreateCell(columnIndex++);
cell.SetCellValue(rawD.avg_rawdata);
}
rowIndex++;
last_build = buildingName;
last_device = deviceFullName;
@ -1139,7 +1257,8 @@ 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", @$"{outputFileName}{System.DateTime.Now.ToString("yyyyMMddHHmm")}.xlsx");
}
[HttpPost]
@ -1178,19 +1297,20 @@ namespace FrontendWebApi.ApiControllers
string sqlWhere = "";
string tag_quantity = await backendRepository.GetOneAsync<string>("select system_value from variable where system_type = 'obixConfig' and system_key = 'tag_quantity' and deleted = 0");
switch (input.Mode)
{
case HydroMeterInputSearchMode.All:
sqlWhere = @$" a.priority <> 0 ";
break;
//switch (input.Mode)
//{
// case HydroMeterInputSearchMode.All:
// sqlWhere = @$" a.priority <> 0 ";
// break;
case HydroMeterInputSearchMode.Custom:
sqlWhere = @$" a.device_number in (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(system_value, '/', -1), '_', 8) COLLATE utf8mb4_0900_ai_ci as val FROM variable where system_type = 'dashboard_total_elec')";
break;
// case HydroMeterInputSearchMode.Custom:
// sqlWhere = @$" a.device_number in (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(system_value, '/', -1), '_', 8) COLLATE utf8mb4_0900_ai_ci as val FROM variable where system_type = 'dashboard_total_elec')";
// break;
default:
break;
}
// default:
// break;
//}
sqlWhere = @$" a.priority <> 0 ";
var table = "archive_electric_meter_month";
var schema = await backendRepository.GetOneAsync<string>($"select system_value from variable where system_type = 'project_name'");
@ -1218,6 +1338,25 @@ order by e.report_priority, a.priority";
Logger.LogInformation("SQL = " + sql + " building=" + input.building_tag + " floor_tag = " + input.floor_tag);
var rawData = await backendRepository.GetAllAsync<HydroMeterRawDataEachTotalOutput>(sql);
List<string> need_green_device = new List<string>
{
"第一校區總盤",
"圖資大樓總盤",
"教學大樓總盤",
"電子館分盤",
"機械館分盤",
"化工電機總盤",
"電機館分盤",
"學1-4舍餐廳總盤",
"學5舍5眷總盤",
"8眷舍分盤",
"企教分盤",
"7眷舍分盤",
"第二校區總盤",
"薄膜一館分盤",
"薄膜二館分盤"
};
List<HydroMeterOutput> ResultData = new List<HydroMeterOutput>();
ResultData = rawData
@ -1227,7 +1366,21 @@ order by e.report_priority, a.priority";
foreach (var l in ResultData)
{
var full_name = await backendRepository.GetOneAsync<string>($"select full_name from device where device_number = '{l.device_number}'");
//if (l.device_number == "NTPC_B4_EE_E4_B1F_VCB3B_WHT_N1")//"學5舍5眷總盤"
//{
// Console.WriteLine("here " + l.device_full_name);
//}
if (l.device_number == "NTPC_D8_EE_E4_RF_HM_WHT_N1")// 化工電機總盤
{
Console.WriteLine("here " + l.device_full_name);
}
if (input.Mode == HydroMeterInputSearchMode.Custom && !need_green_device.Contains(full_name))
{
continue;
}
l.rawData = new List<HydroMeterRawDataOutput>();
l.rawData.AddRange(
@ -1281,18 +1434,39 @@ order by e.report_priority, a.priority";
})
);
l.device_full_name = await backendRepository.GetOneAsync<string>($"select full_name from device where device_number = '{l.device_number}'");
l.device_full_name = full_name;
l.building_name = await backendRepository.GetOneAsync<string>("select full_name from building where building_tag = @building_tag and deleted = 0",
new { building_tag = l.building_tag });
//不含分盤 需要修改大樓名稱
//if(input.Mode == HydroMeterInputSearchMode.Custom && l.)
//{
// l.building_name = "化工館總計";
//}
l.total = l.rawData.Where(x => x.avg_rawdata != "NaN").Sum(x => decimal.Parse(x.avg_rawdata ?? "0", System.Globalization.NumberStyles.Float)).ToString();
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))).ToString();
}
List<HydroMeterOutput> ResultData_custom = new List<HydroMeterOutput>();
foreach (var l in ResultData)
{
if (l.device_full_name != null)
{
ResultData_custom.Add(l);
}
}
apiResult.Code = "0000";
apiResult.Data = ResultData;
if (input.Mode == HydroMeterInputSearchMode.All)
{
apiResult.Data = ResultData; //含分盤
}
else
{
apiResult.Data = ResultData_custom; //不含分盤
}
}
catch (Exception exception)
{

View File

@ -24,6 +24,7 @@ using System.Threading.Tasks;
using Image = System.Drawing.Image;
using System.IdentityModel.Tokens.Jwt;
using System.Net;
using System.Data.SqlTypes;
namespace FrontendWebApi.ApiControllers
{
@ -206,7 +207,7 @@ namespace FrontendWebApi.ApiControllers
try
{
var sqlString = @$"select device_number, concat(device_floor_tag, ' ', full_name) as device_name, full_name, device_floor_tag, device_system_tag, device_name_tag
from device where deleted = 0 and device_area_tag = @device_area_tag and device_building_tag = @device_building_tag and device_name_tag in @list_sub_system_tag ";
from device where deleted = 0 and device_area_tag = @device_area_tag and device_name_tag in @list_sub_system_tag ";
var param = new { @device_building_tag = bl.device_building_tag, @device_area_tag = bl.device_area_tag, @list_sub_system_tag = bl.list_sub_system_tag };
@ -769,7 +770,7 @@ namespace FrontendWebApi.ApiControllers
List<Operation_Firm> opList = new List<Operation_Firm>();
try
{
var sqlString = $@"select id, name from operation_firm where deleted = 0 and device_system_category_layer3 in @sub_system_tag";
var sqlString = $@"select id, name from operation_firm where deleted = 0";
opList = await backendRepository.GetAllAsync<Operation_Firm>(sqlString, new { @sub_system_tag = ofl.sub_system_tag });
apiResult.Code = "0000";
@ -1226,8 +1227,8 @@ namespace FrontendWebApi.ApiControllers
{ "@device_system_category_layer3", or.device_system_category_layer3},
{ "@work_type", or.work_type},
{ "@error_code", or.error_code},
{ "@fix_do", or.fix_do},
{ "@fix_do_code", or.fix_do_code },
{ "@fix_do", or.fix_do == "null" ? "" : or.fix_do },
{ "@fix_do_code", or.fix_do_code == "null" ? "" : or.fix_do_code },
{ "@fix_firm", or.fix_firm},
{ "@status", or.status},
{ "@work_person_id", or.work_person_id},
@ -1291,8 +1292,8 @@ namespace FrontendWebApi.ApiControllers
{ "@device_system_category_layer2", or.device_system_category_layer2},
{ "@device_system_category_layer3", or.device_system_category_layer3},
{ "@error_code", or.error_code},
{ "@fix_do", or.fix_do},
{ "@fix_do_code", or.fix_do_code },
{ "@fix_do", or.fix_do == "null" ? "" : or.fix_do },
{ "@fix_do_code", or.fix_do_code == "null" ? "" : or.fix_do_code },
{ "@fix_firm", or.fix_firm},
{ "@status", or.status},
{ "@work_person_id", or.work_person_id},
@ -1300,8 +1301,8 @@ namespace FrontendWebApi.ApiControllers
{ "@end_time", or.end_time},
{ "@work_time", or.work_time},
{ "@finish_time", or.finish_time},
{ "@notice", or.notice},
{ "@description", or.description},
{ "@notice", or.notice == "null" ? null : or.notice},
{ "@description", or.description == "null" ? null : or.description},
{ "@updated_by", myUser.userinfo_guid},
{ "@updated_at", DateTime.Now}
};

View File

@ -21,7 +21,8 @@
//"Database": "7gWfmZ28HGIJZbxEbK+0yg==", //tpe_dome_dome
//"Database": "siTUcDaC/g2yGTMFWD72Kg==", //tpe_dome_hotel
//"Database": "iuaY0h0+TWkir44/eZLDqw==", //tpe_dome_office
"Database": "Rq7Gn4x6LwBvVtl7GY8LbA==", //MCUT
//"Database": "Rq7Gn4x6LwBvVtl7GY8LbA==", //MCUT
"Database": "j9LOmjFh2/9PpuwnVB8ugqnKdBDJHx1AAT7aTWeh37E=", // ibms_mcut_online
"Root": "SzdxEgaJJ7tcTCrUl2zKsA==",
"Password": "FVAPxztxpY4gJJKQ/se4bQ=="
}

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>