ibms-MCUT/Frontend/_reportManagement.html
dev02 99fabe689e [前端] 修改年月份顯示
[後端] 修改搜尋變數錯誤
2024-01-02 14:17:22 +08:00

1242 lines
39 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>
</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 offset-1">
選擇<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 ml-2"
onclick="setExportList()">
匯出
</button>
<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",
},
},
};
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();
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 (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"
? 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 =
baseApiUrl +
"/api/" +
`${sent_data[0]?.Mode?.toString()
? reportTypeDict["RElec"]["listApiUrlForTotal"]
: reportTypeDict["RElec"]["listApiUrl"]
}`;
setLoading(true);
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.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") === "compare";
if (ElecEachTotal) {
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 {
datesColumns = setTableColumns();
}
const compareType = $("label.active [name=compareTypeRadio]").val();
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: [
{
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("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 url =
baseApiUrl +
"/api/" +
reportTypeDict["RElec"]["exportListApiUrl"][tableType];
setLoading(true, "匯出中");
$.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 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>