MCUT_Supervisor/_reportManagement.html

1476 lines
45 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

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

<main id="js-page-content" role="main" class="page-content">
<div class="row">
<div class="col-sm-12 col-xl-12">
<h1 class="p-2 mb-0">報表管理</h1>
<div class="row">
<div class="col-sm-12 col-xl-2">
<div class="rounded border border-white">
<!-- nav-menu-reset will reset the font colors -->
<ul
class="nav-menu nav-menu-reset nav-menu-compact mb-sm-4 mb-md-0 rounded border border-white"
data-nav-accordion="true"
>
<li class="active">
<a name="reportTypeRadio" href="javascript:;" data-value="day">
<span class="nav-link-text"> 電錶 - 日報表 </span>
</a>
</li>
<li>
<a
name="reportTypeRadio"
href="javascript:;"
data-value="month"
>
<span class="nav-link-text"> 電錶 - 月報表 </span>
</a>
</li>
<li>
<a name="reportTypeRadio" href="javascript:;" data-value="year">
<span class="nav-link-text"> 電錶 - 年報表 </span>
</a>
</li>
<li>
<a
name="reportTypeRadio"
href="javascript:;"
data-value="compare"
>
<span class="nav-link-text"> 電錶 - 同期比較 </span>
</a>
</li>
<li>
<a
name="reportTypeRadio"
href="javascript:;"
data-value="day"
data-type="compare"
>
<span class="nav-link-text">
電錶 - 總盤與分盤 - 月份比較
</span>
</a>
</li>
<li>
<a
name="reportTypeRadio"
href="javascript:;"
data-value="elec"
data-type="elec"
>
<span class="nav-link-text"> 電錶 - 各單位用電(月)比較 </span>
</a>
</li>
</ul>
<div
class="filter-message js-filter-message m-0 text-left pl-4 py-3 fw-500"
></div>
</div>
</div>
<div class="col-12 col-xl-10">
<div class="panel-hdr" style="min-height: auto">
<h2 class="py-2" id="xx">
<div class="col-auto price">
<span class="report-type-name"></span>費每度單價
</div>
<input
type="text"
id="elecPriceDegree"
class="form-control col-1 price"
/>
<div
id="compareTypeBtnsDiv"
class="item btn-group btn-group-toggle offset-1"
data-toggle="buttons"
style="display: none"
>
<label
class="btn btn-outline-success waves-effect active waves-themed"
>
<input
type="radio"
name="compareTypeRadio"
id="compareMonth"
value="month"
checked
/>
年度同月比較
</label>
<label
class="btn btn-outline-success waves-effect waves-themed"
>
<input
type="radio"
name="compareTypeRadio"
id="compareDay"
value="day"
/>
月份同日比較
</label>
</div>
<div
id="compareAreaBtnsDiv"
class="item btn-group btn-group-toggle"
data-toggle="buttons"
style="display: none"
>
<label
class="btn btn-outline-success waves-effect active waves-themed"
>
<input
type="radio"
name="compareEleRadio"
id="compareAll"
value="0"
checked
/>
總計含分盤資料
</label>
<label
class="btn btn-outline-success waves-effect waves-themed"
>
<input
type="radio"
name="compareEleRadio"
id="compareSeperate"
value="1"
/>
總計不含分盤資料
</label>
</div>
<div class="col-auto">
選擇<span id="elecTimeText">單一月份</span>
</div>
<input
type="text"
id="elecMonthDate"
class="form-control col-2"
/>
<input
type="text"
id="elecYearDate"
class="form-control col-2"
style="display: none"
/>
<div
id="elecStartEndDiv"
class="row m-0 align-items-center"
style="display: none"
>
<input
type="text"
id="elecSYearDate"
class="form-control col-4"
/>
<span class="px-2">~</span>
<input
type="text"
id="elecEYearDate"
class="form-control col-4"
/>
</div>
<div
id="elecCompareDiv"
class="row m-0 align-items-center"
style="display: none"
>
<div id="elecComYearDiv" class="row m-0 align-items-center">
<input
type="text"
id="elecCom1YearDate"
class="form-control col-4"
/>
<span class="px-2"></span>
<input
type="text"
id="elecCom2YearDate"
class="form-control col-4"
/>
</div>
<div
id="elecComMonthDiv"
class="row m-0 align-items-center"
style="display: none"
>
<input
type="text"
id="elecCom1MonthDate"
class="form-control col-4"
/>
<span class="px-2"></span>
<input
type="text"
id="elecCom2MonthDate"
class="form-control col-4"
/>
</div>
</div>
</h2>
</div>
<div class="panel-hdr" style="min-height: auto">
<h2 class="py-2 col-12" id="school_zone">
<div class="col-1">校區</div>
<div
class="item btn-group btn-group-toggle"
data-toggle="buttons"
></div>
</h2>
</div>
<div class="panel-hdr" style="min-height: auto">
<h2 class="py-2 col-12" id="building">
<div class="col-1">棟別</div>
<div
class="item btn-group btn-group-toggle"
data-toggle="buttons"
></div>
</h2>
</div>
<div class="panel-hdr" style="min-height: auto">
<!-- <h2 class="py-2 col-12" id="floors">
<div class="col-1">樓層</div>
<button
type="button"
class="btn btn-secondary float-right allbtn mr-2 col-auto align-self-center"
onclick="allFloor()"
style="display: none"
>
全選
</button>
<div
class="item btn-group btn-group-toggle row m-0"
data-toggle="buttons"
style="row-gap: 5px"
></div>
<span
class="text-notice notice-noSelectedBuilding"
style="display: none"
>請選擇棟別</span
>
<span class="text-notice notice-noBuilding" style="display: none"
>該棟別沒有樓層</span
>
</h2> -->
</div>
<div class="d-flex my-2">
<button
type="button"
class="btn btn-primary"
onclick="getMeterData()"
>
查詢
</button>
<button
type="button"
class="btn btn-danger mx-2"
onclick="setExportList()"
>
匯出
</button>
<!-- <div id="ArchiveBtnDiv" style="display: none">
<button
type="button"
class="btn btn-info"
id="recalculateBtn"
onclick="recalculateArchive()"
>
重新計算
</button>
<span class="h6 text-light pl-2" id="lastUpdateTime"
>最後更新時間 :
</span>
</div> -->
<div
id="tableLoading"
class="row m-0 align-items-center"
style="display: none"
>
<div
class="spinner-border text-info mx-2"
role="status"
style="width: 1.2rem; height: 1.2rem"
>
<span class="sr-only">Loading...</span>
</div>
<span id="tableLoadingText">列表讀取中</span>
</div>
<!-- <button type="button" class="btn btn-primary" onclick="SaveRealTimeCombination()">儲存常用組合</button>
<button type="button" class="btn btn-danger ml-2" onclick="CleanAll()">全部清除</button>
<button type="button" class="btn btn-info allbtn ml-2" onclick="LookRealTime()">查看即時資訊</button> -->
</div>
<span class="d-flex justify-content-end">單位kWh </span>
<table
id="report_table"
class="table table-bordered table-striped text-center m-0 w-100"
></table>
</div>
</div>
</div>
</div>
</main>
<script>
var default_building = localStorage.getItem("default_building");
var Building; //取得所有棟別
var SelectBuildings = new Array(0); //選擇的區域
var datatable;
var datepickerOptions = {
autoclose: true,
minViewMode: 1,
language: "zh-TW",
format: "yyyy-mm",
};
var reportTypeDict = {
RWater: {
name: "Water",
chiName: "水",
listApiUrl: "WaterList",
exportListApiUrl: "ExportWaterList",
},
RElec: {
name: "Electric",
chiName: "電",
listApiUrl: "ElectricList",
listApiUrlForTotal: "ElectricListEachTotal",
exportListApiUrl: {
day: "ExportElectricList",
month: "ExportElectricList",
year: "ExportElectricList",
compare: "ExportElectricCompareList",
compareForEachTotal: "ExportElectricEachTotalCompareList",
depCampareExcel: "ElecData/ExportDepCampareExcel",
},
},
};
var token = cookies.get("JWT-Authorization");
var school_zone = "0";
$(function () {
console.log("即時趨勢進入點");
getSchoolZone();
setNameByType();
initDatePicker();
eventsInit();
getPrice();
setReportTable([]);
$("#elecSYearDate")
.val(moment().subtract(5, "years").format("YYYY"))
.trigger("change");
$("#elecEYearDate").val(moment().format("YYYY")).trigger("change");
$("#elecCom1YearDate").val(moment().subtract(1, "years").format("YYYY"));
$("#elecCom2YearDate").val(moment().format("YYYY"));
$("#elecCom1MonthDate").val(
moment().subtract(1, "months").format("YYYY-MM")
);
$("#elecCom2MonthDate").val(moment().format("YYYY-MM"));
//調整畫面
$("#js-page-content").removeClass("mt-0");
// var html = "";
// for (let building of pageAct.buildList) {
// html += `<label class="btn btn-outline-success waves-effect waves-themed">
// <input type="checkbox" name="buildingRadio" id="radio_${building.building_tag}" value="${building.building_tag}" onChange="SelectBuild(this,'${building.building_tag}')"> ${building.full_name}
// </label>`;
// }
// $("#building").find(".item").empty();
// $("#building").find(".item").append(html);
getbuildings(school_zone);
checkIsSelectedBuilding();
});
function setNameByType() {
$(".report-type-name").text(reportTypeDict["RElec"]["chiName"]);
}
function initDatePicker(name = null, otherParam = {}) {
const datepickerMonthOptions = Object.assign(
{},
datepickerOptions,
Object.assign(
{
minViewMode: 1,
format: "yyyy-mm",
},
otherParam
)
);
const datepickerYearOptions = Object.assign(
{},
datepickerOptions,
Object.assign(
{
minViewMode: 2,
format: "yyyy",
},
otherParam
)
);
const datepickerSYearOptions = Object.assign(
{},
datepickerOptions,
Object.assign(
{
minViewMode: 2,
format: "yyyy",
},
otherParam
)
);
const datepickerEYearOptions = Object.assign(
{},
datepickerOptions,
Object.assign(
{
minViewMode: 2,
format: "yyyy",
},
otherParam
)
);
const datepickerComYear1Options = Object.assign(
{},
datepickerOptions,
Object.assign(
{
minViewMode: 2,
format: "yyyy",
},
otherParam
)
);
const datepickerComYear2Options = Object.assign(
{},
datepickerOptions,
Object.assign(
{
minViewMode: 2,
format: "yyyy",
},
otherParam
)
);
const datepickerComMonth1Options = Object.assign(
{},
datepickerOptions,
Object.assign(
{
minViewMode: 1,
format: "yyyy-mm",
},
otherParam
)
);
const datepickerComMonth2Options = Object.assign(
{},
datepickerOptions,
Object.assign(
{
minViewMode: 1,
format: "yyyy-mm",
},
otherParam
)
);
if (name == null || name == "Month") {
$("#elecMonthDate")
.datepicker("destroy")
.datepicker(datepickerMonthOptions)
.focus(function () {
$(this).datepicker("show");
})
.datepicker("update", new Date());
}
if (name == null || name == "Year") {
$("#elecYearDate")
.datepicker("destroy")
.datepicker(datepickerYearOptions)
.focus(function () {
$(this).datepicker("show");
})
.datepicker("update", new Date());
}
if (name == null || name == "SYear") {
$("#elecSYearDate")
.datepicker("destroy")
.datepicker(datepickerSYearOptions)
.focus(function () {
$(this).datepicker("show");
});
}
if (name == null || name == "EYear") {
$("#elecEYearDate")
.datepicker("destroy")
.datepicker(datepickerEYearOptions)
.focus(function () {
$(this).datepicker("show");
});
}
if (name == null || name == "ComYear1") {
$("#elecCom1YearDate")
.datepicker("destroy")
.datepicker(datepickerComYear1Options)
.focus(function () {
$(this).datepicker("show");
});
}
if (name == null || name == "ComYear2") {
$("#elecCom2YearDate")
.datepicker("destroy")
.datepicker(datepickerComYear2Options)
.focus(function () {
$(this).datepicker("show");
});
}
if (name == null || name == "ComMonth1") {
$("#elecCom1MonthDate")
.datepicker("destroy")
.datepicker(datepickerComMonth1Options)
.focus(function () {
$(this).datepicker("show");
});
}
if (name == null || name == "ComMonth2") {
$("#elecCom2MonthDate")
.datepicker("destroy")
.datepicker(datepickerComMonth2Options)
.focus(function () {
$(this).datepicker("show");
});
}
}
function eventsInit() {
$("body").on("change", "[name=reportTypeRadio]", function () {
$(
"#elecMonthDate, #elecYearDate, #elecStartEndDiv, #elecCompareDiv"
).hide();
$("#compareTypeBtnsDiv").hide();
$("#compareAreaBtnsDiv").hide();
// $("#ArchiveBtnDiv").hide();
const value = $(this).data("value");
const type = $(this).data("type");
const curDate = $("#elecDate").val();
$("#school_zone").show();
$("#building").show();
$(".price").show();
if (type === "compare") {
$("#elecTimeText").text("月份");
$("#elecMonthDate").show();
$("#compareAreaBtnsDiv").show();
$("#school_zone").hide();
$("#building").hide();
$(".price").hide();
} else if (type === "elec") {
$("#elecTimeText").text("月份");
$("#elecMonthDate").show();
// $("#ArchiveBtnDiv").show();
$("#school_zone").hide();
$("#building").hide();
$(".price").hide();
} else if (value === "day") {
$("#elecTimeText").text("月份");
$("#elecMonthDate").show();
} else if (value == "month") {
$("#elecTimeText").text("年份");
$("#elecYearDate").show();
} else if (value == "year") {
$("#elecTimeText").text("年份範圍");
$("#elecStartEndDiv").show();
} else if (value == "compare") {
$("#elecTimeText").text("年份");
$("#elecCompareDiv").show();
$("#compareTypeBtnsDiv").show();
}
});
$("body").on("change", "[name=compareTypeRadio]", function () {
$("#elecComYearDiv, #elecComMonthDiv").hide();
const value = $(this).val();
if (value === "month") {
$("#elecTimeText").text("年份");
$("#elecComYearDiv").show();
} else if (value == "day") {
$("#elecTimeText").text("月份");
$("#elecComMonthDiv").show();
}
});
$("[name=reportTypeRadio]")
.parent("li")
.on("click", function () {
$("[name=reportTypeRadio]").parent("li.active").removeClass("active");
// $("[name=compareTypeRadio]").parent("label").removeClass("active");
const oldVal = $("li.active [name=reportTypeRadio]").data("value");
$(this).addClass("active");
const newVal = $("li.active [name=reportTypeRadio]").data("value");
if (oldVal !== newVal) {
$("li.active [name=reportTypeRadio]").trigger("change");
}
});
$("[name=compareTypeRadio]")
.parent("label")
.on("click", function () {
$("[name=compareTypeRadio]").parent("label").removeClass("active");
const oldVal = $("label.active [name=compareTypeRadio]").val();
$(this).addClass("active");
const newVal = $("label.active [name=compareTypeRadio]").val();
if (oldVal !== newVal) {
$("label.active [name=compareTypeRadio]").trigger("change");
}
});
$("[name=compareEleRadio]")
.parent("label")
.on("click", function () {
$("[name=compareEleRadio]").parent("label").removeClass("active");
const oldVal = $("label.active [name=compareEleRadio]").val();
$(this).addClass("active");
const newVal = $("label.active [name=compareEleRadio]").val();
if (oldVal !== newVal) {
$("label.active [name=compareEleRadio]").trigger("change");
}
});
$("[name=floorCheckbox]")
.parent(".btn")
.off("click")
.on("click", function () {
const oldVal = $("[name=floorCheckbox]:checked").val();
$(this).find("input[name=floorCheckbox]").prop("checked", true);
const newVal = $("[name=floorCheckbox]:checked").val();
if (oldVal !== newVal) {
$("[name=floorCheckbox]:checked").trigger("change");
}
});
$("body").on("change", "#elecSYearDate", function () {
initDatePicker("EYear", {
startDate: moment($(this).val()).startOf("year").toDate(),
});
});
$("body").on("change", "#elecEYearDate", function () {
initDatePicker("SYear", {
endDate: moment($(this).val()).endOf("year").toDate(),
});
});
}
function getListSendData() {
const tableType = $("li.active [name=reportTypeRadio]").data("value");
const compareType = $("label.active [name=compareTypeRadio]").val();
const Mode =
$("li.active [name=reportTypeRadio]").data("type") == "compare"
? $("label.active [name=compareEleRadio]").val()
: null; // 總盤、分盤
const startTime =
tableType == "day"
? $("#elecMonthDate").val()
: tableType == "month"
? $("#elecYearDate").val()
: tableType == "year"
? $("#elecSYearDate").val()
: tableType == "compare" || tableType == "elec"
? compareType == "month"
? !$("#elecCom1YearDate").val() || !$("#elecCom2YearDate").val()
? null
: [$("#elecCom1YearDate").val(), $("#elecCom2YearDate").val()]
: compareType == "day"
? !$("#elecCom1MonthDate").val() || !$("#elecCom2MonthDate").val()
? null
: [$("#elecCom1MonthDate").val(), $("#elecCom2MonthDate").val()]
: null
: null;
if (!startTime) {
toast_error("請選擇日期");
return;
}
if (Array.isArray(startTime) && startTime.length < 2) {
toast_error("請選擇比較日期");
return;
}
const endTime = tableType == "year" ? $("#elecEYearDate").val() : null;
if (!endTime && tableType == "year") {
toast_error("請選擇結束日期");
return;
}
let sent_data = Mode
? {
tableType: "month",
building_tag: "",
floor_tag: $("[name=floorCheckbox]:checked")
.map((i, e) => $(e).val())
.toArray(),
startTime: startTime,
endTime: endTime,
price: $("#elecPriceDegree").val()
? parseFloat($("#elecPriceDegree").val())
: null,
Mode: parseInt(Mode),
}
: {
tableType:
$("li.active [name=reportTypeRadio]").data("value") == "compare"
? $("[name=compareTypeRadio]:checked").val()
: $("li.active [name=reportTypeRadio]").data("value"),
building_tag: SelectBuildings.join(","),
floor_tag: $("[name=floorCheckbox]:checked")
.map((i, e) => $(e).val())
.toArray(),
startTime: startTime,
endTime: endTime,
price: $("#elecPriceDegree").val()
? parseFloat($("#elecPriceDegree").val())
: null,
};
if (Array.isArray(startTime)) {
sent_data = [Object.assign({}, sent_data), Object.assign({}, sent_data)];
startTime.forEach((sTime, i) => {
const compareType = $("[name=compareTypeRadio]:checked").val();
sent_data[i].startTime = sTime;
sent_data[i].endTime = null;
});
}
return sent_data;
}
function getMeterData() {
let result = [];
var sent_data = getListSendData();
if (!Array.isArray(sent_data)) {
sent_data = [sent_data];
}
if (
!sent_data[0]?.Mode?.toString() &&
!sent_data.some((s) => s.building_tag)
) {
toast_error("請選擇棟別");
return;
}
if (!sent_data.some((s) => s.floor_tag)) {
toast_error("請選擇樓層");
return;
}
var url;
var isElecType =
$("li.active [name=reportTypeRadio]").data("type") === "elec";
setLoading(true);
if (isElecType) {
// 取得月份
var date = $("#elecMonthDate").val();
url = baseApiUrl + "/ElecData/GetMonthElecCompData?Date=" + date;
$.ajax({
type: "GET",
headers: {
Authorization: "Bearer " + token,
},
url: url,
async: false,
contentType: "application/json; charset=utf-8",
success: function (rel) {
result = rel.data;
},
complete: () => {
setLoading(false);
},
});
} else {
url =
baseApiUrl +
"/api/" +
`${
sent_data[0]?.Mode?.toString()
? reportTypeDict["RElec"]["listApiUrlForTotal"]
: reportTypeDict["RElec"]["listApiUrl"]
}`;
sent_data.forEach((sdata, i) => {
$.ajax({
type: "POST",
headers: {
Authorization: "Bearer " + token,
},
url: url,
async: false,
data: JSON.stringify(sdata),
contentType: "application/json; charset=utf-8",
success: function (rel) {
if (rel.code != "0000") {
if (rel.code == "9999") {
toast_error(rel.msg);
} else {
toast_warning(rel.msg);
}
return;
}
if (i == 0) {
result = result.concat(rel.data);
result.forEach((r) => {
r._compare_price = null;
r._compare_total = null;
r._compare_total_price = null;
});
} else {
rel.data.forEach((r) => {
let target =
result.find(
(d) =>
d.building_tag == r.building_tag &&
d.device_serial_tag == r.device_serial_tag &&
d.device_master == r.device_master &&
d.floor_tag == r.floor_tag
) ?? null;
let _target = {};
// if(!target){
// result.push(target);
// target = {};
// }
_target.rawData = (target?.rawData ?? []).concat(r.rawData);
_target._compare_price = r.price;
_target._compare_total = r.total;
_target._compare_total_price = r.total_price;
if (!target) {
_target = Object.assign(_target, r);
_target.price = null;
_target.total = null;
_target.total_price = null;
result.push(_target);
return;
}
target = Object.assign(target, _target);
});
}
},
complete: () => {
if (sent_data.length - 1 == i) {
setLoading(false);
}
},
});
});
}
setReportTable(result);
}
function getPrice() {
var sentdata = {
type: reportTypeDict["RElec"]["name"],
};
var url = baseApiUrl + "/api/HydroMeterPrice";
$.ajax({
type: "POST",
url: url,
headers: {
Authorization: "Bearer " + token,
},
data: JSON.stringify(sentdata),
contentType: "application/json; charset=UTF-8;",
success: function (rel) {
if (rel.code != "0000") {
if (rel.code == "9999") {
toast_error(rel.msg);
} else {
toast_warning(rel.msg);
}
return;
}
$("#elecPriceDegree").val(rel.data);
},
});
}
function getDayByMonth(month) {
const firstDayOfMonth = moment(month).startOf("month");
const lastDayOfMonth = moment(month).endOf("month");
const datesOfMonth = [];
let currentDay = moment(firstDayOfMonth);
while (currentDay.isSameOrBefore(lastDayOfMonth)) {
datesOfMonth.push(currentDay.format("YYYY-MM-DD"));
currentDay = currentDay.add(1, "day");
}
return datesOfMonth;
}
function getMonthByYear(year) {
const firstMonthOfYear = moment(year).startOf("year").month();
const lastMonthOfYear = moment(year).endOf("year").month();
const monthOfYear = [];
for (let i = firstMonthOfYear; i <= lastMonthOfYear; i++) {
monthOfYear.push(moment(year).month(i).format("YYYY-MM"));
}
return monthOfYear;
}
function getStartEndYear(sYear, eYear) {
const years = [];
for (let i = sYear; i <= eYear; i++) {
years.push(moment().year(i).format("YYYY"));
}
return years;
}
function setTableColumns() {
const tableType = $("li.active [name=reportTypeRadio]").data("value");
const compareType = $("label.active [name=compareTypeRadio]").val();
const columnWidth = "45px";
let columns = [];
switch (tableType) {
case "day":
columns = getDayByMonth($("#elecMonthDate").val()).map((dc) => {
return { title: dc, data: dc, width: columnWidth };
});
break;
case "month":
columns = getMonthByYear($("#elecYearDate").val()).map((dc) => {
return { title: dc, data: dc, width: columnWidth };
});
break;
case "year":
columns = getStartEndYear(
$("#elecSYearDate").val(),
$("#elecEYearDate").val()
).map((dc) => {
return { title: dc, data: dc, width: columnWidth };
});
break;
case "compare":
let compareResult = [];
switch (compareType) {
case "month":
columns1 = getMonthByYear($("#elecCom1YearDate").val());
columns2 = getMonthByYear($("#elecCom2YearDate").val());
columns1.forEach((c1, index) => {
compareResult.push(c1);
if (columns2[index]) {
compareResult.push({
value: columns2[index],
_isCompared: true,
});
}
});
break;
case "day":
columns1 = getDayByMonth($("#elecCom1MonthDate").val());
columns2 = getDayByMonth($("#elecCom2MonthDate").val());
columns1.forEach((c1, index) => {
compareResult.push(c1);
if (columns2[index]) {
compareResult.push({
value: columns2[index],
_isCompared: true,
});
}
});
break;
}
return compareResult.map((dc) => {
if (dc._isCompared) {
return {
title: dc.value,
data: dc.value,
sClass: "compare",
width: columnWidth,
};
}
return { title: dc, data: dc, width: columnWidth };
});
break;
}
return columns;
}
function setReportTable(datas = []) {
if (datatable) {
datatable.clear().draw();
datatable.destroy();
$("#report_table").empty();
}
const ElecEachTotal = $("li.active [name=reportTypeRadio]").data("type");
if (ElecEachTotal === "compare") {
let preDate = new Date($("#elecMonthDate").val().split("-") + "-01");
preDate.setMonth(preDate.getMonth() - 1);
const [year, month] = $("#elecMonthDate").val().split("-");
const preYear = preDate.getFullYear();
const preMonth = (preDate.getMonth() + 1).toString().padStart(2, "0");
datesColumns = [
{
label: "選擇月份 <br>" + `${year}${month}` + "(A)",
value: $("#elecMonthDate").val(),
},
{
label: "前一月份 <br>" + `${preYear}${preMonth}` + "(B)",
value: `${preYear}-${preMonth}`,
},
{
label:
"差異比較 <br>" + `${year}${month}(A)-${preYear}${preMonth}(B)`,
value: "last month different",
},
{
label: "去年同期 <br>" + `${year - 1}${month}` + "(C)",
value: `${year - 1}-${month}`,
},
{
label: "同期差異 <br>" + `${year - 1}${month}(A)-${year}${month}(C)`,
value: "last year different",
},
].map((dc) => {
return { title: dc.label, data: dc.value, width: "120px" };
});
} else if (ElecEachTotal === "elec") {
let preDate = new Date($("#elecMonthDate").val().split("-") + "-01");
preDate.setMonth(preDate.getMonth() - 1);
const [year, month] = $("#elecMonthDate").val().split("-");
const preYear = preDate.getFullYear();
const preMonth = (preDate.getMonth() + 1).toString().padStart(2, "0");
datesColumns = [
{ title: "項次", data: "rowIndex", width: "60px" },
{
title: "當月用電度數/(第一校區+第二校區)%",
data: "proportion",
width: "120px",
},
{ title: "單位", data: "dep_name", width: "120px" },
{
title: `選擇月份 <br>${year}${month}(A)`,
data: "now_month_kWh",
width: "120px",
},
{
title: `前一月份 <br>${preYear}${preMonth}(B)`,
data: "last_month_kWh",
width: "120px",
},
{
title: `差異比較 <br>${year}${month}(A)-${preYear}${preMonth}(B)`,
data: "compare_last_month",
width: "120px",
},
{
title: `去年同期 <br>${year - 1}${month}(C)`,
data: "last_year_same_month",
width: "120px",
},
{
title: `同期差異 <br>${year - 1}${month}(A)-${year}${month}(C)`,
data: "compare_last_year",
width: "120px",
},
];
// 自動加 rowIndex
datas = datas.map((d, idx) => ({ ...d, rowIndex: idx + 1 }));
} else {
datesColumns = setTableColumns();
}
const compareType = $("label.active [name=compareTypeRadio]").val();
if (ElecEachTotal !== "elec") {
datas.forEach((td) => {
td.rawData.forEach((rd) => {
td[rd.timeStamp] = rd.avg_rawdata;
});
datesColumns.forEach((dc) => {
td[dc.data] = td[dc.data] === undefined ? null : td[dc.data];
});
});
}
let totalColumns = [
{
title: "小計",
data: "total",
width: "70px",
className: "text-nowrap",
},
{
title: "單價",
data: "price",
width: "45px",
className: "text-nowrap",
render: function (data) {
return parseInt(data) === 0 ? "" : data;
},
},
{
title: "金額總計",
data: "total_price",
width: "70px",
className: "text-nowrap",
render: function (data) {
return parseInt(data) === 0 ? "" : data;
},
},
];
const tableType = $("li.active [name=reportTypeRadio]").data("value");
if (tableType == "compare") {
const com1Time =
compareType == "month"
? $("#elecCom1YearDate").val()
: $("#elecCom1MonthDate").val();
const com2Time =
compareType == "month"
? $("#elecCom2YearDate").val()
: $("#elecCom2MonthDate").val();
for (var i = 0; i < totalColumns.length; i++) {
let c = totalColumns[i];
if (["total", "price", "total_price"].includes(c.data)) {
totalColumns.splice(i + 1, 0, {
title: com2Time + c.title,
data: "_compare_" + c.data,
width: "70px",
sClass: "compare text-nowrap",
});
c.title = com1Time + c.title;
c.width = "70px";
c.className = "text-nowrap";
}
}
}
datatable = $("#report_table").DataTable({
data: datas,
destroy: true,
sDom: '<"toolbar">tipl',
fixedColumns: {
leftColumns: 3,
rightColumns: tableType == "compare" ? 2 : 3,
},
scrollX: "auto",
scrollCollapse: true,
autoWidth: false,
language: { url: "/file/BajascriptTest/js/dataTables/zh-HANT.json" },
aaSorting: [],
columns: [
...(ElecEachTotal === "elec"
? []
: [
{
title: "棟別",
data: "building_name",
className: "text-nowrap",
width: "100px",
},
{
title: "樓層",
data: "floor_tag",
width: "8%",
className: "text-nowrap",
},
{
title: "設備",
data: "device_full_name",
width: "300px",
className: "text-nowrap",
},
]),
...datesColumns,
...(ElecEachTotal ? [] : totalColumns),
],
});
}
function setExportList() {
const tableType =
$("li.active [name=reportTypeRadio]").data("type") === "compare"
? "compareForEachTotal"
: $("li.active [name=reportTypeRadio]").data("type") === "elec"
? "depCampareExcel"
: $("li.active [name=reportTypeRadio]").data("value");
var sent_data = getListSendData();
if (!Array.isArray(sent_data)) {
sent_data = [sent_data];
}
// if (!sent_data.some((s) => s.building_tag)) {
// toast_error("請選擇棟別");
// return;
// }
// if (!sent_data.some((s) => s.floor_tag)) {
// toast_error("請選擇樓層");
// return;
// }
var isElecType =
$("li.active [name=reportTypeRadio]").data("type") === "elec";
var date = $("#elecMonthDate").val();
var url = isElecType
? baseApiUrl +
"/" +
reportTypeDict["RElec"]["exportListApiUrl"][tableType]+"?Date=" + date
: baseApiUrl +
"/api/" +
reportTypeDict["RElec"]["exportListApiUrl"][tableType];
setLoading(true, "匯出中");
if (isElecType) {
$.ajax({
type: "GET",
url: url,
headers: {
Authorization: "Bearer " + token,
},
contentType: "application/json; charset=utf-8",
xhrFields: {
responseType: "blob", // to avoid binary data being mangled on charset conversion
},
success: function (rel, text, xhr) {
if (rel) {
downloadByBlob(xhr, rel);
}
},
complete: (xhr) => {
setLoading(false);
},
});
} else {
$.ajax({
type: "POST",
url: url,
data:
tableType == "compare"
? JSON.stringify(sent_data)
: JSON.stringify(sent_data[0]),
headers: {
Authorization: "Bearer " + token,
},
contentType: "application/json; charset=utf-8",
xhrFields: {
responseType: "blob", // to avoid binary data being mangled on charset conversion
},
success: function (rel, text, xhr) {
if (rel) {
downloadByBlob(xhr, rel);
}
},
complete: (xhr) => {
setLoading(false);
},
});
}
}
function recalculateArchive() {
var url = baseApiUrl + "/ElecData/ArchiveDepCampare";
$("#recalculateBtn").prop("disabled", true);
setLoading(true, "重新計算中");
$.ajax({
type: "POST",
headers: {
Authorization: "Bearer " + token,
},
url: url,
async: true,
contentType: "application/json; charset=utf-8",
success: function (rel) {
if (rel.code == "9999") {
toast_error(rel.msg);
} else {
var now = moment(rel.data[0].execute_time).format(
"YYYY-MM-DD HH:mm:ss"
);
$("#lastUpdateTime").html("最後更新時間 : " + now);
toast_ok("重新計算完成");
}
},
error: function () {
toast_error("重新計算失敗");
},
complete: function () {
setLoading(false);
$("#recalculateBtn").prop("disabled", false);
},
});
}
function setLoading(type = true, text = "列表讀取中") {
if (type) {
$("#tableLoading").fadeIn(200);
$("#tableLoadingText").html(text);
} else {
$("#tableLoading").fadeOut(200);
}
}
//選擇棟別
function SelectBuild(e, building_tag) {
console.log(building_tag);
if (SelectBuildings.includes(building_tag)) {
SelectBuildings = SelectBuildings.filter((bui) => bui !== building_tag);
} else {
SelectBuildings.push(building_tag);
}
checkIsSelectedBuilding();
// GetFloors(building_tag);
}
//取得樓層
function GetFloors(building_tag) {
var sentdata = {
building_tag: building_tag,
};
var url = baseApiUrl + "/api/GetAllfloor";
$.ajax({
type: "POST",
url: url,
headers: {
Authorization: "Bearer " + token,
},
data: sentdata,
success: function (rel) {
if (rel.code != "0000") {
if (rel.code == "9999") {
toast_error(rel.msg);
} else {
toast_warning(rel.msg);
}
return;
}
if (rel.data && rel.data.length > 0) {
$(".allbtn").show();
}
drawFloorsBtn(rel.data);
checkIsHasFloorByBuilding();
// JudgeCurrentDeviceData();
// RedrawDataTable();
},
});
}
function allFloor() {
$("[name=floorCheckbox]").prop("checked", true);
$("[name=floorCheckbox]").parent(".btn").addClass("active");
}
function checkIsSelectedBuilding() {
let result = false;
let buildingRadios = $("[name=buildingRadio]:checked");
if (buildingRadios && buildingRadios.length > 0) {
$("#floors .text-notice.notice-noSelectedBuilding").hide();
result = true;
} else {
$("#floors .text-notice.notice-noSelectedBuilding").show();
$(".allbtn").hide();
}
return result;
}
function checkIsHasFloorByBuilding() {
let result = false;
let floorCheckboxs = $("[name=floorCheckbox]");
if (!checkIsSelectedBuilding()) {
return null;
}
if (floorCheckboxs && floorCheckboxs.length > 0) {
$("#floors .text-notice.notice-noBuilding").hide();
result = true;
} else {
$("#floors .text-notice.notice-noBuilding").show();
$(".allbtn").hide();
}
return result;
}
function drawFloorsBtn(floors) {
var html = "";
for (let floor of floors) {
html += `<label class="btn btn-outline-success waves-effect waves-themed" style="flex:0 0 auto">
<input type="checkbox" name="floorCheckbox" onChange="SelectFloor(this,'${floor.floor_guid}')" value="${floor.full_name}" id="${floor.floor_guid}"> ${floor.full_name}
</label>`;
}
$("#floors").find(".item").empty();
$("#floors").find(".item").append(html);
}
function SelectFloor(e, floor_guid) {
// getMeterData();
}
function getSchoolZone() {
var url = baseApiUrl + "/api/Device/GetSchoolZone";
$.ajax({
type: "POST",
url: url,
headers: {
Authorization: "Bearer " + token,
},
success: function (rel) {
if (rel.code != "0000") {
if (rel.code == "9999") {
toast_error(rel.msg);
} else {
toast_warning(rel.msg);
}
return;
}
if (rel.data && rel.data.length > 0) {
let htmlStr = "";
rel.data.forEach(({ system_key, system_value }) => {
htmlStr += `
<label
class="btn btn-outline-success waves-effect waves-themed ${
school_zone === system_key ? "active" : ""
}"
>
<input type="radio" name="buildingRadio" value=${system_key} />${system_value}
</label>`;
});
$("#school_zone>.btn-group").append(htmlStr);
}
},
});
}
$("#school_zone").on("click", function (event) {
event.stopPropagation();
if (
event.target.tagName !== "INPUT" &&
!$(event.target).hasClass("active")
) {
$("#school_zone label.active").removeClass("active");
$(event.target).addClass("active");
SelectBuildings = [];
} else if (event.target.tagName === "INPUT") {
console.log();
school_zone = event.target.value;
getbuildings(school_zone);
}
});
function getbuildings(value) {
const selectZoneBui = pageAct.buildList.filter(
({ school_zone }) => school_zone === value
);
let html = "";
for (let building of selectZoneBui) {
html += `<label class="btn btn-outline-success waves-effect waves-themed active">
<input type="checkbox" name="buildingRadio" id="radio_${building.building_tag}" value="${building.building_tag}" onChange="SelectBuild(this,'${building.building_tag}')"> ${building.full_name}
</label>`;
}
$("#building").find(".item").empty();
$("#building").find(".item").append(html);
console.log(selectZoneBui.map(({ building_tag }) => building_tag));
SelectBuildings = selectZoneBui.map(({ building_tag }) => building_tag);
}
</script>