2022-11-15 18:47:16 +08:00
|
|
|
|
<style>
|
|
|
|
|
</style>
|
|
|
|
|
|
|
|
|
|
<div class="row">
|
2022-12-23 16:17:22 +08:00
|
|
|
|
<div id="leftDiv" class="col-sm-12 col-xl-6">
|
2022-12-26 18:32:21 +08:00
|
|
|
|
|
2022-11-15 18:47:16 +08:00
|
|
|
|
</div>
|
2022-12-23 16:17:22 +08:00
|
|
|
|
<div id="rightDiv" class="col-sm-12 col-xl-6">
|
|
|
|
|
|
2022-11-15 18:47:16 +08:00
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
2022-12-26 18:32:21 +08:00
|
|
|
|
<!-- Modal center Add -->
|
|
|
|
|
<div class="modal fade" id="lightSchModal" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false">
|
|
|
|
|
<div class="modal-dialog modal-dialog-centered" role="document" style="min-width:60%">
|
|
|
|
|
<div class="modal-content">
|
|
|
|
|
<div class="modal-header">
|
|
|
|
|
<h4 class="modal-title">
|
|
|
|
|
燈控排程
|
|
|
|
|
</h4>
|
|
|
|
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
|
|
|
|
<span aria-hidden="true"><i class="fal fa-times"></i></span>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="modal-body">
|
|
|
|
|
<table id="lightSchTable" class="table table-bordered table-striped text-center m-0 w-100">
|
|
|
|
|
</table>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="modal-footer">
|
|
|
|
|
<button type="button" class="btn btn-secondary" data-dismiss="modal">關閉</button>
|
|
|
|
|
<button type="button" id="lightSchSavBtn" class="btn btn-primary">儲存</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
2022-11-15 18:47:16 +08:00
|
|
|
|
<script>
|
2022-11-25 18:46:40 +08:00
|
|
|
|
var allDevList = []; //全設備清單
|
2022-12-27 15:17:52 +08:00
|
|
|
|
var devicePointList = [];
|
2022-12-22 14:27:17 +08:00
|
|
|
|
|
2022-11-15 18:47:16 +08:00
|
|
|
|
$(function () {
|
2022-12-26 18:32:21 +08:00
|
|
|
|
getBuildMenu((arr, data) => {
|
2022-12-23 16:17:22 +08:00
|
|
|
|
if (arr.indexOf(4) != -1) {
|
|
|
|
|
getFloDevList();
|
|
|
|
|
setLightColor();
|
|
|
|
|
}
|
|
|
|
|
if (arr.indexOf(5) != -1) {
|
2022-12-27 18:44:22 +08:00
|
|
|
|
getHotspotPoint(() => {
|
|
|
|
|
show3DModel(data.urn_3D);
|
|
|
|
|
});
|
2022-12-26 18:20:32 +08:00
|
|
|
|
|
2022-12-23 16:17:22 +08:00
|
|
|
|
}
|
|
|
|
|
});
|
2022-11-15 18:47:16 +08:00
|
|
|
|
})
|
|
|
|
|
|
2022-12-26 18:32:21 +08:00
|
|
|
|
// 依據 drawing type 決定呈現畫面
|
|
|
|
|
function getHtmlByType(type = 0, data = {}) {
|
2022-12-23 16:17:22 +08:00
|
|
|
|
let strHtml = ``;
|
|
|
|
|
switch (type) {
|
|
|
|
|
case 2:
|
2022-12-26 18:32:21 +08:00
|
|
|
|
strHtml = `<div style="height:85vh">
|
2022-12-23 16:17:22 +08:00
|
|
|
|
<iframe src="${data.system_url}" width="100%" height="100%"></iframe>
|
|
|
|
|
</div>`;
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
strHtml = `<div class="d-flex mb-4" style="gap:15px">
|
|
|
|
|
<div class="row m-0 align-items-center">
|
|
|
|
|
<span id="sysNorLight" class="circle-light mr-2 " data-light-type="normal"></span>
|
|
|
|
|
<label class="mb-0">正常</label>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="row m-0 align-items-center">
|
|
|
|
|
<span id="sysCloLight" class="circle-light mr-2" data-light-type="close"></span>
|
|
|
|
|
<label class="mb-0">關機</label>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="row m-0 align-items-center">
|
|
|
|
|
<span id="sysErrLight" class="circle-light mr-2" data-light-type="error"></span>
|
|
|
|
|
<label class="mb-0">異常</label>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="col-12 p-0" id="floDevList">
|
|
|
|
|
|
|
|
|
|
</div>`;
|
|
|
|
|
break;
|
|
|
|
|
case 5:
|
|
|
|
|
strHtml = `<div name="forgeViewer" style="height:85vh;"></div>`;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return strHtml;
|
|
|
|
|
}
|
2022-11-23 17:19:28 +08:00
|
|
|
|
//baja 訂閱設備
|
|
|
|
|
function subDevice() {
|
2022-12-22 14:27:17 +08:00
|
|
|
|
if (myBaja == null) {
|
|
|
|
|
myBaja = new subscriptionDevices();
|
|
|
|
|
var ordPath = {
|
|
|
|
|
"area_tag": pageAct.AreaTag,
|
|
|
|
|
"building_tag": pageAct.buiTag,
|
|
|
|
|
"system_tag": pageAct.sysMainTag,
|
|
|
|
|
"name_tag": pageAct.sysSubTag,
|
2022-12-08 17:27:32 +08:00
|
|
|
|
}
|
2022-12-22 14:27:17 +08:00
|
|
|
|
myBaja.setSubscribeDevicesByBql(ordPath);
|
|
|
|
|
myBaja.setSubscribeDevicesCallBack(function (data) {
|
|
|
|
|
let matchDevice = allDevList.filter(x => x.device_number == data.device_number_full)[0];
|
|
|
|
|
if (!matchDevice) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
let norDevPoiName = matchDevice.device_normal_point_name;
|
|
|
|
|
let cloDevPoiName = matchDevice.device_close_point_name;
|
|
|
|
|
let errDevPoiName = matchDevice.device_error_point_name;
|
|
|
|
|
|
|
|
|
|
if (data.point_name == norDevPoiName && data.value == matchDevice.device_normal_point_value) {
|
|
|
|
|
//顯示正常燈號
|
|
|
|
|
$(`#${matchDevice.device_number}_status`).attr("data-light-type", "normal").data("light-type", "normal");
|
|
|
|
|
} else if (data.point_name == cloDevPoiName && data.value == matchDevice.device_close_point_value) {
|
|
|
|
|
$(`#${matchDevice.device_number}_status`).attr("data-light-type", "close").data("light-type", "close");
|
|
|
|
|
} else if (data.point_name == errDevPoiName && data.value == matchDevice.device_error_point_value) {
|
|
|
|
|
$(`#${matchDevice.device_number}_status`).attr("data-light-type", "error").data("light-type", "error");
|
|
|
|
|
}
|
|
|
|
|
setLightColor();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
myBaja.setSubscribeDeviceEndCallBack(function (data) {
|
|
|
|
|
endPageLoading();
|
|
|
|
|
});
|
|
|
|
|
}
|
2022-11-23 15:38:52 +08:00
|
|
|
|
}
|
2022-11-25 18:46:40 +08:00
|
|
|
|
//根據 data-type 設置顏色 (判斷後台是否有設定,若無則帶預設)
|
2022-11-21 18:47:47 +08:00
|
|
|
|
function setLightColor() {
|
|
|
|
|
$("[data-light-type]").each((index, ele) => {
|
|
|
|
|
let type = $(ele).data("light-type");
|
2022-11-23 17:19:28 +08:00
|
|
|
|
let isFlashing = false;
|
2022-11-21 18:47:47 +08:00
|
|
|
|
let color = "#000";
|
|
|
|
|
switch (type) {
|
|
|
|
|
case "normal":
|
|
|
|
|
color = pageAct.sysSubObj.device_normal_color ?? "var(--theme-success)";
|
2022-11-25 18:46:40 +08:00
|
|
|
|
isFlashing = pageAct.sysSubObj.device_normal_flashing == "1";
|
2022-11-21 18:47:47 +08:00
|
|
|
|
break;
|
|
|
|
|
case "close":
|
|
|
|
|
color = pageAct.sysSubObj.device_close_color ?? "var(--theme-secondary)";
|
2022-11-25 18:46:40 +08:00
|
|
|
|
isFlashing = pageAct.sysSubObj.device_close_flashing == "1";
|
2022-11-21 18:47:47 +08:00
|
|
|
|
break;
|
|
|
|
|
case "error":
|
|
|
|
|
color = pageAct.sysSubObj.device_error_color ?? "var(--theme-danger)";
|
2022-11-25 18:46:40 +08:00
|
|
|
|
isFlashing = pageAct.sysSubObj.device_error_flashing == "1";
|
2022-11-21 18:47:47 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
$(ele).css("background-color", color);
|
2022-11-25 18:46:40 +08:00
|
|
|
|
//是否閃爍
|
2022-11-23 17:19:28 +08:00
|
|
|
|
if (isFlashing) {
|
|
|
|
|
$(ele).parents(".card.device-wrap").addClass("light-flash");
|
|
|
|
|
}
|
2022-11-21 18:47:47 +08:00
|
|
|
|
})
|
2022-11-18 18:30:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-11-25 18:46:40 +08:00
|
|
|
|
//取得設備列表 並繪製卡片
|
2022-11-16 14:53:22 +08:00
|
|
|
|
function getFloDevList() {
|
|
|
|
|
let url = baseApiUrl + "/api/Device/GetDeviceList";
|
|
|
|
|
let sendData = {
|
2022-11-17 15:32:39 +08:00
|
|
|
|
sub_system_tag: pageAct.sysSubTag,
|
2022-11-16 14:53:22 +08:00
|
|
|
|
building_tag: pageAct.buiTag,
|
|
|
|
|
floor_tag: pageAct.floTag,
|
|
|
|
|
};
|
|
|
|
|
objSendData.Data = sendData;
|
|
|
|
|
ytAjax = new YourTeam.Ajax(url, objSendData, function (res) {
|
|
|
|
|
if (!res || res.code != "0000" || !res.data) {
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
let strHtml = ``;
|
|
|
|
|
$.each(res.data, (index, floObj) => {
|
2022-12-22 14:27:17 +08:00
|
|
|
|
strHtml += `<div class='d-flex justify-content-start mb-5 ' style="">`
|
|
|
|
|
strHtml += `<button id="floItemBtn${floObj.full_name}" type="button" class="btn btn-primary waves-effect waves-themed mr-5 mt-1 align-self-start" >${floObj.full_name}</button>`
|
|
|
|
|
strHtml += `<div class="col p-0 d-grid grid-gap-5 grid-temp-col-c" style="--c-grid-temp-col:repeat(auto-fill,minmax(250px,1fr))">`
|
2022-11-16 14:53:22 +08:00
|
|
|
|
$.each(floObj.device_list, (index2, devObj) => {
|
2022-11-23 15:38:52 +08:00
|
|
|
|
allDevList.push(devObj);
|
2022-12-22 14:27:17 +08:00
|
|
|
|
|
|
|
|
|
strHtml += `<div class="card m-1 border device-wrap">
|
2022-11-21 18:47:47 +08:00
|
|
|
|
<div class="card-body p-2">
|
|
|
|
|
<div class="d-flex mb-2">
|
|
|
|
|
<div class="mr-5 cur-poi">
|
|
|
|
|
<span class="d-inline-block mr-3">
|
2022-12-26 18:32:21 +08:00
|
|
|
|
<img src="${baseImgUrl + varPathDevIcon + devObj.device_image}" class="profile-image rounded-circle" onerror="defDev(this)" alt="...">
|
2022-11-21 18:47:47 +08:00
|
|
|
|
</span>
|
|
|
|
|
<a href="javascript:;">${devObj.full_name}</a>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="d-flex mb-0 mt-2 align-items-center">
|
2022-11-23 15:38:52 +08:00
|
|
|
|
<span id="${devObj.device_number}_status" class="circle-light"></span>
|
2022-11-21 18:47:47 +08:00
|
|
|
|
<span class="d-none">即時功率:</span>
|
|
|
|
|
<a href="javascript:;" name="devItem" data-id="${devObj.device_guid}" data-number="${devObj.device_number}" data-name="${devObj.full_name}" class=" ml-2 mb-0 ">詳細資料</a>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2022-11-16 14:53:22 +08:00
|
|
|
|
</div>`;
|
|
|
|
|
})
|
2022-12-22 14:27:17 +08:00
|
|
|
|
strHtml += "</div></div>";
|
2022-11-16 14:53:22 +08:00
|
|
|
|
})
|
2022-12-26 18:32:21 +08:00
|
|
|
|
// Niagara 產生 file 開頭字串問題
|
|
|
|
|
strHtml = strHtml.replaceAll(`src="/file/`, `src="`);
|
2022-12-22 14:27:17 +08:00
|
|
|
|
if (!res.data || res.data.length == 0) {
|
|
|
|
|
endPageLoading();
|
|
|
|
|
} else {
|
|
|
|
|
subDevice();
|
|
|
|
|
}
|
2022-11-16 14:53:22 +08:00
|
|
|
|
$("#floDevList").append(strHtml);
|
2022-12-26 18:32:21 +08:00
|
|
|
|
initPopover(pageAct.sysMainTag == "LT" ? "light" : null);
|
2022-11-16 14:53:22 +08:00
|
|
|
|
}
|
|
|
|
|
}, null, "POST").send();
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-26 18:32:21 +08:00
|
|
|
|
// 取得根據棟別顯示左右區塊資訊
|
2022-12-23 16:17:22 +08:00
|
|
|
|
function getBuildMenu(callback = null) {
|
|
|
|
|
let url = baseApiUrl + "/api/Device/GetBuildMenu";
|
|
|
|
|
let sendData = {
|
|
|
|
|
main_system_tag: pageAct.sysMainTag,
|
|
|
|
|
sub_system_tag: pageAct.sysSubTag,
|
|
|
|
|
building_tag: pageAct.buiTag,
|
|
|
|
|
};
|
|
|
|
|
objSendData.Data = sendData;
|
|
|
|
|
ytAjax = new YourTeam.Ajax(url, objSendData, function (res) {
|
|
|
|
|
if (!res || res.code != "0000" || !res.data) {
|
2022-11-23 17:19:28 +08:00
|
|
|
|
|
2022-12-23 16:17:22 +08:00
|
|
|
|
} else {
|
|
|
|
|
let leftData = {}, rightData = {};
|
2022-12-26 18:32:21 +08:00
|
|
|
|
|
2022-12-23 16:17:22 +08:00
|
|
|
|
for (var key in res.data) {
|
|
|
|
|
if (key.startsWith("left")) {
|
|
|
|
|
leftData[key.split("left_")[1]] = res.data[key];
|
|
|
|
|
} else if (key.startsWith("right")) {
|
|
|
|
|
rightData[key.split("right_")[1]] = res.data[key];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (res.data.left_drawing != null) {
|
|
|
|
|
$("#leftDiv").html(getHtmlByType(res.data.left_drawing, leftData));
|
|
|
|
|
} else {
|
2022-12-26 18:32:21 +08:00
|
|
|
|
$("#leftDiv").html(getHtmlByType(0, leftData));
|
2022-12-23 16:17:22 +08:00
|
|
|
|
}
|
|
|
|
|
if (res.data.right_drawing != null) {
|
|
|
|
|
$("#rightDiv").html(getHtmlByType(res.data.right_drawing), rightData);
|
|
|
|
|
} else {
|
2022-12-26 18:32:21 +08:00
|
|
|
|
$("#rightDiv").html(getHtmlByType(0, rightData));
|
2022-12-23 16:17:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-12-26 18:32:21 +08:00
|
|
|
|
callback ? callback([res.data.left_drawing, res.data.right_drawing], res.data) : "";
|
2022-12-23 16:17:22 +08:00
|
|
|
|
}
|
|
|
|
|
}, null, "POST").send();
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-27 15:17:52 +08:00
|
|
|
|
// Card 即時狀態
|
|
|
|
|
function drawStateTabBlo() {
|
|
|
|
|
let strHtml = `<div style="height:15rem">
|
|
|
|
|
<iframe src="/ord?station:%7Cslot:/TPE/B1/EE/E4/R2F/NA/WHT/N1|view:?fullScreen=true" width="100%" height="100%"></iframe>
|
|
|
|
|
</div>`
|
|
|
|
|
return strHtml;
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-23 16:17:22 +08:00
|
|
|
|
function show3DModel(urn) {
|
2022-12-26 18:20:32 +08:00
|
|
|
|
launchViewerForHotspot(urn, (viewer, nodeIds) => {
|
2022-12-27 18:44:22 +08:00
|
|
|
|
|
2022-12-27 15:17:52 +08:00
|
|
|
|
},"[name=forgeViewer]");
|
2022-12-26 18:32:21 +08:00
|
|
|
|
}
|
2022-12-23 16:17:22 +08:00
|
|
|
|
|
2022-12-27 18:44:22 +08:00
|
|
|
|
function getHotspotPoint(callback = null) {
|
2022-12-26 18:20:32 +08:00
|
|
|
|
let url = baseApiUrl + "/api/GetDevForCor";
|
2022-12-27 18:44:22 +08:00
|
|
|
|
let sendData = {
|
2022-12-27 15:17:52 +08:00
|
|
|
|
"device_area_tag": pageAct.AreaTag,
|
|
|
|
|
"device_building_tag": pageAct.buiTag,
|
|
|
|
|
"device_system_tag": pageAct.sysMainTag,
|
|
|
|
|
"device_name_tag": pageAct.sysSubTag,
|
2022-12-27 18:44:22 +08:00
|
|
|
|
};
|
2022-12-26 18:20:32 +08:00
|
|
|
|
objSendData.Data = sendData;
|
2022-12-27 15:17:52 +08:00
|
|
|
|
ytAjax = new YourTeam.Ajax(url, objSendData, function (res) {
|
|
|
|
|
if (!res || res.code != "0000" || !res.data) {
|
|
|
|
|
|
|
|
|
|
} else {
|
2022-12-27 18:44:22 +08:00
|
|
|
|
let myDataList = res.data?.filter(x => x.device_coordinate_3d != null && isJSON(x.device_coordinate_3d)).map(x => { return { position: JSON.parse(x.device_coordinate_3d) } });
|
|
|
|
|
setHotspotPoint(myDataList);
|
|
|
|
|
callback ? callback() : "";
|
2022-12-26 18:20:32 +08:00
|
|
|
|
}
|
2022-12-27 15:17:52 +08:00
|
|
|
|
}, null, "POST").send();
|
|
|
|
|
|
2022-12-26 18:20:32 +08:00
|
|
|
|
}
|
2022-12-26 18:32:21 +08:00
|
|
|
|
|
2022-12-27 18:44:22 +08:00
|
|
|
|
function setHotspotPoint(myDataList = []) {
|
|
|
|
|
console.log(myDataList)
|
|
|
|
|
getHopspotPoint(myDataList);
|
2022-12-23 13:22:50 +08:00
|
|
|
|
}
|
2022-12-26 18:20:32 +08:00
|
|
|
|
|
2022-12-27 18:44:22 +08:00
|
|
|
|
onEvent("autodesk:click:sprite", "[name=forgeViewer]", function (e, obj) {
|
|
|
|
|
console.log(e, obj)
|
|
|
|
|
})
|
2022-12-26 18:20:32 +08:00
|
|
|
|
|
2022-11-15 18:47:16 +08:00
|
|
|
|
</script>
|