@@ -928,6 +952,27 @@
myBaja.setSubscribeDevicesByBql(subOrdPath);
myBaja.setSubscribeDevicesCallBack(function (data) {
try {
+ if (allDevList.length == 0) {
+ return false;
+ }
+
+ data.device_number = data.device_number_full;
+ let matchDevice = allDevList.filter(x => x.device_number == data.device_number)[0];
+ let master = matchDevice.device_number.split("_")[5];
+
+ //將訂閱值塞入 subSeviceData
+ if (subSeviceData.findIndex(x => x.device_number == matchDevice.device_number) == -1) {
+ let obj = {};
+ obj.device_number = matchDevice.device_number;
+ subSeviceData.push(obj)
+ }
+
+ let subData = subSeviceData.filter(x => x.device_number == matchDevice.device_number)[0];
+
+ if (subData) {
+ subData[data.point_name] = data.value;
+ }
+
function getValueByName(pointName) {
return data.point_name == pointName ? data.value : null;
}
@@ -943,26 +988,23 @@
}
function actLightByPoiEx(pointName1, selector, pointName2, exCond) {
- $(selector).removeClass("bg-orange").removeClass("bg-red");
- if (getValueByName(pointName2) == exCond) {
- if (pointName1 == "falseText") {
+ $(selector).removeClass("bg-orange").removeClass("bg-danger").removeClass("bg-secondary").removeClass("bg-success");
+ $(selector).parent("td").prev().find("label").text("未動作");
+ if (subData[pointName2] == exCond) {
+ if (subData[pointName1] == "falseText") {
$(selector).addClass("bg-secondary");
- $(selector).parent("div").prev().find("label").text("取消控制");
+ $(selector).parent("td").prev().find("label").text("取消控制");
} else {
- $(selector).addClass("bg-red");
- $(selector).parent("div").prev().find("label").text("控制");
+ $(selector).addClass("bg-danger");
+ $(selector).parent("td").prev().find("label").text("控制");
}
} else {
+ $(selector).parent("td").prev().find("label").text("休止");
$(selector).addClass("bg-success");
}
}
- if (allDevList.length == 0) {
- return false;
- }
- data.device_number = data.device_number_full;
- let matchDevice = allDevList.filter(x => x.device_number == data.device_number)[0];
- let master = matchDevice.device_number.split("_")[5];
+
//狀態
if (data.point_name == "ST") {
$(`#${matchDevice.device_number}_card [name=devStatus]`).text(data.value);
@@ -1002,6 +1044,7 @@
//地震管制
actLightByPoi("EER", "#earQuaCon");
if (data.point_name == "DNO" || data.point_name == "SP_RCS") {
+ debugger
//遠端休止
actLightByPoiEx("SP_RCS", "#disRes", "DNO", "trueText");
}
@@ -1011,18 +1054,7 @@
}
}
- //將訂閱值塞入 subSeviceData
- if (subSeviceData.findIndex(x => x.device_number == matchDevice.device_number) == -1) {
- let obj = {};
- obj.device_number = matchDevice.device_number;
- subSeviceData.push(obj)
- }
-
- let subData = subSeviceData.filter(x => x.device_number == matchDevice.device_number)[0];
-
- if (subData) {
- subData[data.point_name] = data.value;
- }
+
// 設置燈色、卡片閃爍
setLightColor();
// Card table 更新
@@ -1038,7 +1070,6 @@
}
});
myBaja.setSubscribeDeviceEndCallBack(function (data) {
-
let devNumArr = data.map(x => { return { devNum: x.device_number_full, priority: allDevList.filter(y => y.device_number == x.device_number_full)[0]?.priority } }).DistinctBy("devNum");
devNumArr = devNumArr.oSort("priority");
$.each(devNumArr, (idx, devObj) => {
@@ -1142,9 +1173,7 @@
// Card - 設置列表中訂閱內容
function subDeviceSetTable(devNum) {
- if (allDevList.filter(x => !x.device_number).length > 0) {
-
- }
+
let subData = subSeviceData.filter(x => x.device_number == devNum)[0]
let matchDevice = allDevList.filter(x => x.device_number == devNum)[0];
if (!subData) {
@@ -1171,8 +1200,6 @@
elevObj.setElevFloor(matchDevice.device_number, subData["CP"]);
}
-
-
if (elev3DObj.length != 0) {
let elevObj = elev3DObj.filter(x => x.nodeId == elev3DBind[devNum])[0];
if (elevObj && elevObj.id) {
diff --git a/Frontend/_sysMonFloor.html b/Frontend/_sysMonFloor.html
index fb1f7f0..c6ac13b 100644
--- a/Frontend/_sysMonFloor.html
+++ b/Frontend/_sysMonFloor.html
@@ -7,8 +7,19 @@
+
+
+
@@ -20,6 +31,7 @@
var global_emergency_alarm_device_number = [];
var zoomToggle = 3;
$(function () {
+ show3DModel();
initChart();
getFloData();
})
@@ -813,4 +825,10 @@
});
}
}
+
+ function show3DModel() {
+ launchViewer("dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnNjb2RlX2ZvcmdlX3Rlc3QvJUUzJTgwJTkwQVJDJUUzJTgwJTkxQjFGXzIwMjJfMTJfMDQubndj", (viewer, nodeIds) => {
+
+ });
+ }
\ No newline at end of file
diff --git a/Frontend/index.html b/Frontend/index.html
index 2705a6a..19ffc27 100644
--- a/Frontend/index.html
+++ b/Frontend/index.html
@@ -2281,7 +2281,13 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
})
endPageLoading();
- typeof timeOutor != "undefined" ? clearInterval(timeOutor) : ""; // dashboard 定時更新 baja 資料定時器關閉
+
+ if (typeof timeOuters != "undefined") {
+ $.each(timeOuters, (idx, timeOut) => {
+ clearInterval(timeOut);
+ })
+ timeOuters = [];
+ }
$("#app").load(`_${page}.html`, loadCallback);
})
diff --git a/Frontend/js/forge/forgemodel.js b/Frontend/js/forge/forgemodel.js
index f45d0fa..1e226b7 100644
--- a/Frontend/js/forge/forgemodel.js
+++ b/Frontend/js/forge/forgemodel.js
@@ -95,6 +95,26 @@ function launchViewer(urn, callback) {
});
}
+function launchViewerNoTools(urn, callback) {
+ var options = {
+ env: 'AutodeskProduction',
+ getAccessToken: getForgeToken
+ };
+
+ Autodesk.Viewing.Initializer(options, () => {
+ //viewer = new Autodesk.Viewing.GuiViewer3D(document.getElementById('forgeViewer'));
+ viewer = new Autodesk.Viewing.Viewer3D(document.getElementById('forgeViewer'));
+ viewer.start();
+ var documentId = 'urn:' + urn;
+
+ Autodesk.Viewing.Document.load(documentId, onDocumentLoadSuccess, onDocumentLoadFailure);
+
+ $("#forgeViewer").on("autodesk:loaded", function (e, nodeIds) {
+ callback ? callback(viewer, nodeIds) : "";
+ })
+ });
+}
+
function getAllLeafComponents(viewer, callback) {
var cbCount = 0;
var tree;
diff --git a/Frontend/js/n4js/alarmbaja.js b/Frontend/js/n4js/alarmbaja.js
index b64bf1a..9e1a2d2 100644
--- a/Frontend/js/n4js/alarmbaja.js
+++ b/Frontend/js/n4js/alarmbaja.js
@@ -12,6 +12,78 @@ function addzero(num) {
* @param {any} alarmClass
* @param {any} callback
*/
+// function getAlarmByBaja(startDate_millisecond, endDate_millisecond, isRecover, isAck, alarmClass, callback) {
+// let _sourceTmp;
+// var _result = "";
+// var _ss = "";
+// var _bfName = "";
+// var _sourceName = "";
+// var _index = 0;
+// var _recoverState = isRecover ? "!= null" : "= null";
+// var _ackState = isAck ? "= 1" : "!= 1";
+
+// require(['baja!'], function (baja) {
+// 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 from openAlarms where alarmClass = '" + alarmClass + "' and timestamp.millis > " + startDate_millisecond + " and timestamp.millis < " + endDate_millisecond + " and normalTime " + _recoverState + " order by timestamp asc").get()
+// .then(function (table) {
+// return table.cursor({
+// each: function (record) {
+// _sourceTmp = (record.get('alarmData').get('sourceName')).toString().split('_');
+// _bfName = _sourceTmp[1] + "-" + _sourceTmp[4];
+// _sourceName = _sourceTmp[7] + "-" + _sourceTmp[8];
+// _ss += ', "' + _index + '": {"buildingFloorName_zh":"' + _bfName + '", "uuid":"' + record.get('uuid') + '", "timestamp":"' + record.get('timestamp') + '", "alarmClass":"' + record.get('alarmClass') + '", "sourceName_zh":"' + _sourceName + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
+// _index++;
+// },
+// after: function () {
+// _result += '{' + '"count": ' + _index;
+// _result += _ss;
+// _result += '}';
+// if (typeof callback === 'function') {
+// callback(_result);
+// }
+// }
+// });
+// });
+// });
+// }
+// function getAlarmByBaja(startDate_millisecond, endDate_millisecond, isRecover, isAck, alarmClass, callback) {
+// let _sourceTmp;
+// var _result = "";
+// var _ss = "";
+// var _bfName = "";
+// var _sourceName = "";
+// var _index = 0;
+// var _recoverState = isRecover ? "!= null" : "= null"
+// var _ackState = isAck ? "= 1" : "!= 1";
+
+// require(['baja!'], function (baja) {
+// 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 from openAlarms where alarmClass = '" + alarmClass + "' and timestamp.millis > " + startDate_millisecond + " and timestamp.millis < " + endDate_millisecond + " and normalTime " + _recoverState + " order by timestamp asc").get()
+// .then(function (table) {
+// return table.cursor({
+// each: function (record) {
+// _sourceTmp = (record.get('alarmData').get('sourceName')).toString().split('_');
+// _bfName = _sourceTmp[1] + "-" + _sourceTmp[4];
+// _sourceName = _sourceTmp[7] + "-" + _sourceTmp[8];
+
+// if (_index == 0)
+// _ss += '{"buildingFloorName_zh":"' + _bfName + '", "uuid":"' + record.get('uuid') + '", "timestamp":"' + record.get('timestamp') + '", "alarmClass":"' + record.get('alarmClass') + '", "sourceName_zh":"' + _sourceName + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
+// else
+// _ss += ',{"buildingFloorName_zh":"' + _bfName + '", "uuid":"' + record.get('uuid') + '", "timestamp":"' + record.get('timestamp') + '", "alarmClass":"' + record.get('alarmClass') + '", "sourceName_zh":"' + _sourceName + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
+// _index++;
+// },
+// after: function () {
+// _result += '{' + '"count": ' + _index + ', "data":[';
+// _result += _ss;
+// _result += ']}';
+// if (typeof callback === 'function') {
+// callback(_result);
+// }
+// },
+// limit: -1,
+// offset: 0
+// });
+// });
+// });
+// }
function getAlarmByBaja(startDate_millisecond, endDate_millisecond, isRecover, isAck, alarmClass, callback) {
let _sourceTmp;
var _result = "";
@@ -52,59 +124,40 @@ function getAlarmByBaja(startDate_millisecond, endDate_millisecond, isRecover, i
});
}
-/**
- * 取得所有異常資料 by baja
- * @param {any} startDate_millisecond
- * @param {any} endDate_millisecond
- * @param {any} isRecover
- * @param {any} isAck
- * @param {any} callback
- */
-function getAllDeviceAlarmByBaja(startDate_millisecond, endDate_millisecond, isRecover, isAck, callback) {
- let _sourceTmp;
- var _result = "";
- var _ss = "";
- var _bfName = "";
- var _sourceName = "";
- var _index = 0;
- var _recoverState = isRecover ? "!= null" : "= null";
- var _ackState = isAck ? "= 'acked'" : "= 'unacked'";
-
- require(['baja!'], function (baja) {
- 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 from openAlarms where timestamp.millis >= " + startDate_millisecond + " and timestamp.millis <= " + endDate_millisecond + " and normalTime " + _recoverState + " and ackState " + _ackState + " 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 from openAlarms where timestamp.millis >= " + startDate_millisecond + " and timestamp.millis <= " + endDate_millisecond + " and normalTime " + _recoverState + " and ackState " + _ackState + " order by timestamp desc").get()
- .then(function (table) {
- return table.cursor({
- each: function (record) {
- _sourceTmp = (record.get('alarmData').get('sourceName')).toString().split('_');
- _bfName = _sourceTmp[1] + "-" + _sourceTmp[4];
- _sourceName = _sourceTmp[7] + "-" + _sourceTmp[8];
- if (_index == 0)
- _ss += '{"buildingFloorName_zh":"' + _bfName + '", "uuid":"' + record.get('uuid') + '", "timestamp":"' + record.get('timestamp') + '", "alarmClass":"' + record.get('alarmClass') + '", "sourceName_zh":"' + _sourceName + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
- else
- _ss += ',{"buildingFloorName_zh":"' + _bfName + '", "uuid":"' + record.get('uuid') + '", "timestamp":"' + record.get('timestamp') + '", "alarmClass":"' + record.get('alarmClass') + '", "sourceName_zh":"' + _sourceName + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
- _index++;
- },
- after: function () {
- _result += '{' + '"count": ' + _index + ', "data":[';
- _result += _ss + ']';
- _result += '}';
- if (typeof callback === 'function') {
- callback(_result);
- }
- },
- limit: -1,
- offset: 0
- });
- });
- });
-}
-
/**
* 取得單一設備最新10筆異常資料 by baja
* @param {any} devicePath
* @param {any} callback
*/
+// function getOneDeviceAlarmTop10ByBaja(devicePath, callback) {
+// var _result = "";
+// var _ss = "";
+// var _index = 0;
+// //{ "count":2,"data": [{ "time": "2022/11/14 15:00:00", "errId": "0001", "ackCheck": "未確認", "errReason": "燈泡故障" }, { "time": "2022/11/14 15:00:00", "errId": "0002", "ackCheck": "未確認", "errReason": "燈泡故障" }]}
+// 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").get()
+// .then(function (table) {
+// return table.cursor({
+// each: function (record) {
+// if (_index == 0)
+// _ss += '{"uuid":"' + record.get('uuid') + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "timestamp":"' + record.get('timestamp') + '"}';
+// else
+// _ss += ',{"uuid":"' + record.get('uuid') + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "timestamp":"' + record.get('timestamp') + '"}';
+// _index++;
+// },
+// after: function () {
+// _result += '{' + '"count": ' + _index +', "data":[';
+
+// _result += _ss+']';
+// _result += '}';
+// if (typeof callback === 'function') {
+// callback(_result);
+// }
+// }
+// });
+// });
+// });
+// }
function getOneDeviceAlarmTop10ByBaja(devicePath, callback) {
var _result = "";
var _ss = "";
@@ -152,103 +205,36 @@ function getOneDeviceAlarmTop10ByBaja(devicePath, callback) {
});
}
-/**
- * 取得單一設備異常
- * @param {any} devicePath
- * @param {any} callback
- */
-function getOneDeviceAlarmByBaja(devicePath, callback) {
- let _sourceTmp;
- var _result = "";
- var _ss = "";
- var _bfName = "";
- var _sourceName = "";
- var _index = 0;
-
- require(['baja!'], function (baja) {
- 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 from openAlarms 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 from openAlarms where alarmData.sourceName like '%" + devicePath + "%' order by timestamp desc").get()
- .then(function (table) {
- return table.cursor({
- each: function (record) {
- _sourceTmp = (record.get('alarmData').get('sourceName')).toString().split('_');
- _bfName = _sourceTmp[1] + "-" + _sourceTmp[4];
- _sourceName = _sourceTmp[7] + "-" + _sourceTmp[8];
- if (_index == 0)
- _ss += '{"buildingFloorName_zh":"' + _bfName + '", "uuid":"' + record.get('uuid') + '", "timestamp":"' + record.get('timestamp') + '", "alarmClass":"' + record.get('alarmClass') + '", "sourceName_zh":"' + _sourceName + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
- else
- _ss += ',{"buildingFloorName_zh":"' + _bfName + '", "uuid":"' + record.get('uuid') + '", "timestamp":"' + record.get('timestamp') + '", "alarmClass":"' + record.get('alarmClass') + '", "sourceName_zh":"' + _sourceName + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
- _index++;
- },
- after: function () {
- _result += '{' + '"count": ' + _index + ', "data":[';
- _result += _ss + ']';
- _result += '}';
- if (typeof callback === 'function') {
- callback(_result);
- }
- },
- limit: -1,
- offset: 0
- });
- });
- });
-}
-
-/**
- * 取得單一設備異常 有時間、確認、復歸條件
- * @param {any} devicePath
- * @param {any} startDate_millisecond
- * @param {any} endDate_millisecond
- * @param {any} isRecover
- * @param {any} isAck
- * @param {any} callback
- */
-function getOneDeviceAlarmWithTimeByBaja(devicePath, startDate_millisecond, endDate_millisecond, isRecover, isAck, callback) {
- let _sourceTmp;
- var _result = "";
- var _ss = "";
- var _bfName = "";
- var _sourceName = "";
- var _index = 0;
- var _recoverState = isRecover ? "!= null" : "= null";
- var _ackState = isAck ? "= 'acked'" : "= 'unacked'";
-
- require(['baja!'], function (baja) {
- 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 from openAlarms where alarmData.sourceName like '%" + devicePath + "%' and timestamp.millis >= " + startDate_millisecond + " and timestamp.millis <= " + endDate_millisecond + " and normalTime " + _recoverState + " and ackState " + _ackState + " 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 from openAlarms where alarmData.sourceName like '%" + devicePath + "%' and timestamp.millis >= " + startDate_millisecond + " and timestamp.millis <= " + endDate_millisecond + " and normalTime " + _recoverState + " and ackState " + _ackState + " order by timestamp desc").get()
- .then(function (table) {
- return table.cursor({
- each: function (record) {
- _sourceTmp = (record.get('alarmData').get('sourceName')).toString().split('_');
- _bfName = _sourceTmp[1] + "-" + _sourceTmp[4];
- _sourceName = _sourceTmp[7] + "-" + _sourceTmp[8];
- if (_index == 0)
- _ss += '{"buildingFloorName_zh":"' + _bfName + '", "uuid":"' + record.get('uuid') + '", "timestamp":"' + record.get('timestamp') + '", "alarmClass":"' + record.get('alarmClass') + '", "sourceName_zh":"' + _sourceName + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
- else
- _ss += ',{"buildingFloorName_zh":"' + _bfName + '", "uuid":"' + record.get('uuid') + '", "timestamp":"' + record.get('timestamp') + '", "alarmClass":"' + record.get('alarmClass') + '", "sourceName_zh":"' + _sourceName + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
- _index++;
- },
- after: function () {
- _result += '{' + '"count": ' + _index + ', "data":[';
- _result += _ss + ']';
- _result += '}';
- if (typeof callback === 'function') {
- callback(_result);
- }
- },
- limit: -1,
- offset: 0
- });
- });
- });
-}
-
/**
* 在單一系統下,取得各個設備的異常狀態
* @param {any} systemPath
* @param {any} callback
*/
+// function getOneSystemAlarmStateByBaja(systemPath, callback) {
+// var _result = "";
+// var _ss = "";
+// var _index = 0;
+
+// 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").get()
+// .then(function (table) {
+// return table.cursor({
+// each: function (record) {
+// _ss += ', "' + _index + '": {"uuid":"' + record.get('uuid') + '", "sourceName":"' + record.get('alarmData').get('sourceName') + '", "sourceState":"' + record.get('sourceState') + '"}';
+// _index++;
+// },
+// after: function () {
+// _result += '{' + '"count": ' + _index;
+// _result += _ss;
+// _result += '}';
+// if (typeof callback === 'function') {
+// callback(_result);
+// }
+// }
+// });
+// });
+// });
+// }
function getOneSystemAlarmStateByBaja(systemPath, callback) {
var _result = "";
var _ss = "";
@@ -295,6 +281,10 @@ function getOneSystemStateByBaja(systemPath, callback) {
.then(function (table) {
return table.cursor({
each: function (record) {
+ //if (_index == 0)
+ // _ss += '{"sourceState":"' + record.get('sourceState') + '"}';
+ //else
+ // _ss += '{"sourceState":"' + record.get('sourceState') + '"}';
_ss += '{"sourceState":"' + record.get('sourceState') + '"}';
_index++;
},
@@ -432,7 +422,7 @@ function getUnCheckedAckedCountByBaja(callback) {
function getSystemAlarmByBaja(callback) {
var _result = { count: 0, data: [] };
var _index = 0;
-
+
require(['baja!'], function (baja) {
//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:|alarm:|bql:select alarmClass where isAlarm").get()
@@ -441,7 +431,7 @@ function getSystemAlarmByBaja(callback) {
each: function (record) {
let main = {};
main.alarmClass = record.get('alarmClass');
-
+
_result.data.push(main);
_index++;
},
@@ -457,3 +447,193 @@ function getSystemAlarmByBaja(callback) {
});
});
}
+
+// /**
+// * 取得單一設備異常
+// * @param {any} callback
+// */
+// //(devicePath, callback)
+// function getOneDeviceAlarmByBaja(devicePath, startDate_millisecond, endDate_millisecond, isRecover, isAck, callback) {
+// // var _result = "";
+// // var _ss = "";
+// // var _occurrenceTime = "";
+// // var _normalTime = "";
+// // var _index = 0;
+
+// let _sourceTmp;
+// var _result = "";
+// var _ss = "";
+// var _bfName = "";
+// var _sourceName = "";
+// var _index = 0;
+// var _recoverState = isRecover ? "!= null" : "= null";
+// //local:|foxs:|alarm:|bql:select ackState from openAlarms where ackState ='acked'
+// var _ackState = isAck ? "= 'acked'" : "= 'unacked'";
+
+// //{ "count":2,"data": [{ "time": "2022/11/14 15:00:00", "errId": "0001", "ackCheck": "未確認", "errReason": "燈泡故障" }, { "time": "2022/11/14 15:00:00", "errId": "0002", "ackCheck": "未確認", "errReason": "燈泡故障" }]}
+// require(['baja!'], function (baja) {
+// 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 from openAlarms where alarmData.sourceName like '%" + devicePath + "%' and timestamp.millis >= " + startDate_millisecond + " and timestamp.millis <= " + endDate_millisecond + " and normalTime " + _recoverState + " and ackState " + _ackState + " 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 from openAlarms where alarmData.sourceName like '%" + devicePath + "%' and timestamp.millis >= " + startDate_millisecond + " and timestamp.millis <= " + endDate_millisecond + " and normalTime " + _recoverState + " and ackState " + _ackState + " order by timestamp desc").get()
+// // 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 from openAlarms where alarmData.sourceName like '%" + devicePath + "%' and alarmClass = '" + alarmClass + "' and timestamp.millis >= " + startDate_millisecond + " and timestamp.millis <= " + endDate_millisecond + " and normalTime " + _recoverState + " and ackState " + _ackState + " 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 from openAlarms where alarmData.sourceName like '%" + devicePath + "%' and alarmClass = '" + alarmClass + "' and timestamp.millis >= " + startDate_millisecond + " and timestamp.millis <= " + endDate_millisecond + " and normalTime " + _recoverState + " and ackState " + _ackState + " order by timestamp desc").get()
+// //baja.Ord.make("local:|foxs:|alarm:|bql:select timestamp, ackState, alarmClass, alarmData, alarmData.sourceName, sourceState, uuid, alarmData.msgText, normalTime where alarmData.sourceName like '%" + devicePath + "%' order by timestamp desc").get()
+// .then(function (table) {
+// return table.cursor({
+// each: function (record) {
+
+// _sourceTmp = (record.get('alarmData').get('sourceName')).toString().split('_');
+// _bfName = _sourceTmp[1] + "-" + _sourceTmp[4];
+// _sourceName = _sourceTmp[7] + "-" + _sourceTmp[8];
+// // _occurrenceTime = "";
+// // _normalTime = "";
+// //var _resultUuid = record.get('uuid').toString().split("-");//43dc7846-bd96-4be2-ab35-f11aec729c60
+
+// // var _timestampTemp = new Date(record.get('timestamp').toString());
+// // _occurrenceTime += _timestampTemp.getFullYear().toString() + "-" + addzero(_timestampTemp.getMonth() + 1).toString() + "-" + addzero(_timestampTemp.getDate()).toString() + " " + addzero(_timestampTemp.getHours()).toString() + ":" + addzero(_timestampTemp.getMinutes()).toString() + ":" + addzero(_timestampTemp.getSeconds()).toString();
+
+// // var _normaltime = new Date(record.get('normalTime').toString());
+// // _normalTime += _normaltime.getFullYear().toString() + "-" + addzero(_normaltime.getMonth() + 1).toString() + "-" + addzero(_normaltime.getDate()).toString() + " " + addzero(_normaltime.getHours()).toString() + ":" + addzero(_normaltime.getMinutes()).toString() + ":" + addzero(_normaltime.getSeconds()).toString();
+
+// // var _msgText = record.get('alarmData').get('msgText');// == 1 ? _occurrenceTime : "未確認";
+// // var _ackText = record.get('ackState') == 1 ? _occurrenceTime : "未確認";
+
+// //_ss += '{"buildingFloorName_zh":"' + _bfName + '", "uuid":"' + record.get('uuid') + '", "timestamp":"' + record.get('timestamp') + '", "alarmClass":"' + record.get('alarmClass') + '", "sourceName_zh":"' + _sourceName + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
+// if (_index == 0)
+// _ss += '{"buildingFloorName_zh":"' + _bfName + '", "uuid":"' + record.get('uuid') + '", "timestamp":"' + record.get('timestamp') + '", "alarmClass":"' + record.get('alarmClass') + '", "sourceName_zh":"' + _sourceName + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
+// //_ss += '{"uuid":"' + record.get('uuid') + '", "msgText":"' + _msgText + '", "ackState":"' + _ackText + '", "timestamp":"' + _occurrenceTime + '", "normalTime":"' + _normalTime + '"}';
+// else
+// _ss += ',{"buildingFloorName_zh":"' + _bfName + '", "uuid":"' + record.get('uuid') + '", "timestamp":"' + record.get('timestamp') + '", "alarmClass":"' + record.get('alarmClass') + '", "sourceName_zh":"' + _sourceName + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
+// _index++;
+// },
+// after: function () {
+// _result += '{' + '"count": ' + _index + ', "data":[';
+// _result += _ss + ']';
+// _result += '}';
+// if (typeof callback === 'function') {
+// callback(_result);
+// }
+// },
+// limit: -1,
+// offset: 0
+// });
+// });
+// });
+// }
+
+/**
+ * 取得單一設備異常
+ * @param {any} devicePath
+ * @param {any} callback
+ */
+ function getOneDeviceAlarmByBaja(devicePath, callback) {
+ let _sourceTmp;
+ var _result = "";
+ var _ss = "";
+ var _bfName = "";
+ var _sourceName = "";
+ var _index = 0;
+
+ require(['baja!'], function (baja) {
+ 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 from openAlarms 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 from openAlarms where alarmData.sourceName like '%" + devicePath + "%' order by timestamp desc").get()
+ .then(function (table) {
+ return table.cursor({
+ each: function (record) {
+ _sourceTmp = (record.get('alarmData').get('sourceName')).toString().split('_');
+ _bfName = _sourceTmp[1] + "-" + _sourceTmp[4];
+ _sourceName = _sourceTmp[7] + "-" + _sourceTmp[8];
+ if (_index == 0)
+ _ss += '{"buildingFloorName_zh":"' + _bfName + '", "uuid":"' + record.get('uuid') + '", "timestamp":"' + record.get('timestamp') + '", "alarmClass":"' + record.get('alarmClass') + '", "sourceName_zh":"' + _sourceName + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
+ else
+ _ss += ',{"buildingFloorName_zh":"' + _bfName + '", "uuid":"' + record.get('uuid') + '", "timestamp":"' + record.get('timestamp') + '", "alarmClass":"' + record.get('alarmClass') + '", "sourceName_zh":"' + _sourceName + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
+ _index++;
+ },
+ after: function () {
+ _result += '{' + '"count": ' + _index + ', "data":[';
+ _result += _ss + ']';
+ _result += '}';
+ if (typeof callback === 'function') {
+ callback(_result);
+ }
+ },
+ limit: -1,
+ offset: 0
+ });
+ });
+ });
+}
+
+function getAllDeviceAlarmByBaja(startDate_millisecond, endDate_millisecond, isRecover, isAck, callback) {
+ let _sourceTmp;
+ var _result = "";
+ var _ss = "";
+ var _bfName = "";
+ var _sourceName = "";
+ var _index = 0;
+ var _recoverState = isRecover ? "!= null" : "= null";
+ var _ackState = isAck ? "= 'acked'" : "= 'unacked'";
+
+ require(['baja!'], function (baja) {
+ 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 from openAlarms where timestamp.millis >= " + startDate_millisecond + " and timestamp.millis <= " + endDate_millisecond + " and normalTime " + _recoverState + " and ackState " + _ackState + " 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 from openAlarms where timestamp.millis >= " + startDate_millisecond + " and timestamp.millis <= " + endDate_millisecond + " and normalTime " + _recoverState + " and ackState " + _ackState + " order by timestamp desc").get()
+ .then(function (table) {
+ return table.cursor({
+ each: function (record) {
+ _sourceTmp = (record.get('alarmData').get('sourceName')).toString().split('_');
+ _bfName = _sourceTmp[1] + "-" + _sourceTmp[4];
+ _sourceName = _sourceTmp[7] + "-" + _sourceTmp[8];
+ if (_index == 0)
+ _ss += '{"buildingFloorName_zh":"' + _bfName + '", "uuid":"' + record.get('uuid') + '", "timestamp":"' + record.get('timestamp') + '", "alarmClass":"' + record.get('alarmClass') + '", "sourceName_zh":"' + _sourceName + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
+ else
+ _ss += ',{"buildingFloorName_zh":"' + _bfName + '", "uuid":"' + record.get('uuid') + '", "timestamp":"' + record.get('timestamp') + '", "alarmClass":"' + record.get('alarmClass') + '", "sourceName_zh":"' + _sourceName + '", "msgText":"' + record.get('alarmData').get('msgText') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
+ _index++;
+ },
+ after: function () {
+ _result += '{' + '"count": ' + _index + ', "data":[';
+ _result += _ss + ']';
+ _result += '}';
+ if (typeof callback === 'function') {
+ callback(_result);
+ }
+ },
+ limit: -1,
+ offset: 0
+ });
+ });
+ });
+}
+
+/**
+ * [首頁] 圓餅圖資料 - 全部的異常
+ * @param {any} callback
+ */
+ function getAlarmForChartDataByBaja(callback) {
+ var _result = "";
+ var _ss = "";
+ var _index = 0;
+
+ require(['baja!'], function (baja) {
+ baja.Ord.make("local:|foxs:|alarm:|bql:select alarmClass, ackState, normalTime where isAlarm").get()
+ .then(function (table) {
+ return table.cursor({
+ each: function (record) {
+ if (_index == 0)
+ _ss += '{"alarmClass":"' + record.get('alarmClass') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
+ else
+ _ss += ',{"alarmClass":"' + record.get('alarmClass') + '", "ackState":"' + record.get('ackState') + '", "normalTime":"' + record.get('normalTime') + '"}';
+ _index++;
+ },
+ after: function () {
+ _result += '{' + '"count": ' + _index + ', "data":[';
+ _result += _ss;
+ _result += ']}';
+ if (typeof callback === 'function') {
+ callback(_result);
+ }
+ },
+ limit: -1,
+ offset: 0
+ });
+ });
+ });
+}
\ No newline at end of file
diff --git a/Frontend/js/n4js/bajatest.js b/Frontend/js/n4js/bajatest.js
index 94492f0..ceea87c 100644
--- a/Frontend/js/n4js/bajatest.js
+++ b/Frontend/js/n4js/bajatest.js
@@ -6,6 +6,11 @@ var ordPath; //當前點選選單的tag,用來抓出設備路徑,例如:旅
let baja_subscribe_alarm_callback_func; //設定 alarm BQL訂閱之後要回傳的Function
let baja_subscribe_end_alarm_callback_func; //設定 alarm BQL訂閱結束之後要回傳的Function
var ordPathForAlarm; //當前點選選單的tag,用來抓出alarm路徑
+
+let baja_subscribe_electricmeter_callback_func;
+let baja_subscribe_end_electricmeter_callback_func;
+var ordPathForElectricmeter;
+
var startPageLoading; // 開始 loading
var endPageLoading; // 開始 loading
//window.baja = null;
@@ -57,6 +62,25 @@ function subscriptionAlarms() {
}
+function subscriptionElectricmeter() {
+ // 用BQL的方式去訂閱
+ this.setSubscribeElectricmeterByBql = function (tempOrdPath) {
+ BajaSubscribeElectricmeterByBql(tempOrdPath);
+ };
+ // BQL去訂閱回傳的Function
+ this.setSubscribeElectricmeterCallBack = function (callBackFunc) {
+ if (callBackFunc != undefined && callBackFunc != null) {
+ baja_subscribe_electricmeter_callback_func = callBackFunc;
+ }
+ }
+ // BQL訂閱結束回傳的Function
+ this.setSubscribeElectricmeterEndCallBack = function (callBackFunc) {
+ if (callBackFunc != undefined && callBackFunc != null) {
+ baja_subscribe_end_electricmeter_callback_func = callBackFunc;
+ }
+ }
+}
+
function MyBaja() {
// 取得使用者帳號
this.setMyUserAccount = function (callBackFunc = null) {
@@ -351,6 +375,154 @@ function BajaSubscribeAlarmsByBql(ordPathForAlarm) {
});
}
+/**
+ * 使用者透過BQL指定路徑去訂閱 electricmeter
+ */
+ function BajaSubscribeElectricmeterByBql(ordPathForElectricmeter) {
+
+
+ require(['baja!'], function (baja) {
+ console.log("進入Function 準備執行BQL訂閱");
+ startPageLoading ? startPageLoading() : ""
+ var init_start = new Date(Date.now());
+ var sub = new baja.Subscriber();
+
+ sub.attach('changed', function (prop) {
+ if (prop.getName() === 'out') {
+ var out_value = this.getOutDisplay();
+ var target_device_number = this.$parent.getDisplayName().split('_').slice(0, 5).join('_');
+ var point_name = this.getDisplayName();
+
+ //依據Facets判斷回傳的內容值為何
+ var facets_split = this.getFacets1().$cEncStr.split('|');
+ var facets_arr = [];
+ facets_split.forEach(function (item, index) {
+ facets_arr.push(item.split('=s:'));
+ });
+
+ var facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})
+
+ var point_out_split = this.getOutDisplay().split(' ');
+
+ let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);
+
+ if (key == undefined) {
+ key = point_out_split[0];
+ }
+
+ var modify_target_device = {
+ "device_number": target_device_number ? target_device_number : null,
+ //"device_number_full": this.$parent.getSlotPath().$names.join("_"),
+ "point_name": point_name ? point_name : null,
+ "value": key
+ }
+
+ if (baja_subscribe_electricmeter_callback_func != undefined && baja_subscribe_electricmeter_callback_func != null) {
+ baja_subscribe_electricmeter_callback_func(modify_target_device, true); //第2參數用在平面圖,刷新畫面
+ }
+ }
+ }, function (err) {
+ console.log(err)
+ });
+
+ //使用bql語法
+ console.log(`local:|foxs:|station:|slot:/${ordPathForElectricmeter.devicePath}|bql:select name, out, out.value, slotPath, facets from control:ControlPoint`);
+ baja.Ord.make(`local:|foxs:|station:|slot:/${ordPathForElectricmeter.devicePath}|bql:select name, out, out.value, slotPath, facets from control:ControlPoint`)
+ .get(
+ function (table) {
+ var tableStart, tableFinish;
+ var subStart, subFinish;
+ var component_index = 0;
+ var total_component_index = 0;
+ var totalTargetDevice = [];
+ var readBqlFinish = new Date(Date.now());
+ console.log("讀取路徑完成-花費時間", (readBqlFinish.getTime() - init_start.getTime()) / 1000 + "sec");
+ table.cursor({
+ before: function () {
+ totalTargetDevice = [];
+ tableStart = new Date(Date.now());
+ $("#table-start-timestamp").html(tableStart.toISOString());
+ render_start = new Date(Date.now());
+
+ },
+ each: function (item, index) {
+ if (index < 1) {
+ subStart = new Date(Date.now());
+ $("#sub-start").html(subStart.toISOString());
+ }
+ $("#sub-number").html(index + 1);
+ total_component_index = index;
+
+
+
+ var target_device_number_split = this.getDisplay("slotPath").split('/');
+ var target_device_number = target_device_number_split[8];
+ //console.log(target_device_number);
+ var point_name = this.getDisplay("name");
+ var facets = this.getDisplay("facets");
+
+ //依據Facets判斷回傳的內容值為何
+ var facets_split = facets.split(',');
+ var facets_arr = [];
+ facets_split.forEach(function (item, index) {
+ facets_arr.push(item.split('='));
+ });
+
+ facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})
+
+ var point_out_split = this.getDisplay("out").split(' ');
+
+ let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);
+
+ if (key == undefined) {
+ key = point_out_split[0];
+ }
+
+ var modify_target_device = {
+ "device_number": target_device_number ? target_device_number : null,
+ //"device_number_full": this.getDisplay("slotPath").split("slot:")[1].split('/').slice(1, -1).join("_"),
+ "point_name": point_name ? point_name : null,
+ "value": key
+ }
+ totalTargetDevice.push(modify_target_device);
+ //取得component當下就更新設備點位
+ if (baja_subscribe_electricmeter_callback_func != undefined && baja_subscribe_electricmeter_callback_func != null) {
+ baja_subscribe_electricmeter_callback_func(modify_target_device);
+ }
+
+
+ baja.Ord.make("local:|foxs:|station:|" + this.getDisplay("slotPath"))
+ .get()
+ .then(function (component) {
+ component_index++;
+ //var target_device_number = component.$parent.getDisplayName().split('_').slice(0, 5).join('_');
+ //var point_name = component.getDisplayName();
+
+ sub.subscribe({
+ comps: component,
+ });
+ tolSubList.push(sub);
+ subFinish = new Date(Date.now());
+ $("#sub-end").html(subFinish.toISOString());
+ $("#sub-time").html((subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
+ // console.log("訂閱完成時間", (subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
+ });
+ },
+ after: function () {
+ tableFinish = new Date(Date.now());
+ if (baja_subscribe_end_electricmeter_callback_func != undefined && baja_subscribe_end_electricmeter_callback_func != null) {
+ baja_subscribe_end_electricmeter_callback_func(totalTargetDevice);
+ }
+ endPageLoading ? endPageLoading() : ""
+ console.log("表格完成時間", (tableFinish.getTime() - tableStart.getTime()) / 1000 + "sec");
+ },
+ limit: -1,
+ offset: 0
+ });
+ });
+ })
+}
+
// function getAlarmCountByBaja(callback) {
// var _result = "";
// var _index = 0;
diff --git a/Frontend/js/site.js b/Frontend/js/site.js
index 35149a7..d9d3b38 100644
--- a/Frontend/js/site.js
+++ b/Frontend/js/site.js
@@ -171,6 +171,11 @@ function creOption(text = null, value = null, data = {}, attr = {}, cls = [], na
return creEle("option", text, id, name, cls, data, attr);
}
+function creImg(ele, text = null, id = null, name = null, cls = [], data = {}, attr = {}) {
+ let comp = eleBuild(text, id, name, cls, data, attr);
+ return $(`<${ele} ${comp.attrText}>${comp.text}`);
+}
+
/**
* 根據該棟建築底下的'所有'電梯執行緒物件
* */
@@ -348,3 +353,36 @@ class ElevatorHandler {
}
}
+
+// 從數字週數轉為中文週數
+function dayToChiDay(num) {
+ let chiDay = ["週日", "週一", "週二", "週三", "週四", "週五", "週六"];
+ return chiDay[num];
+}
+
+// 取得現在或前後時間,輸出單位依據 type
+function getTimeByType(type = null, cal = 0) {
+ let now = new Date();
+ return strToDate(now, type, cal);
+}
+
+// 取得某當下時間或前後時間,輸出單位依據 type
+function strToDate(text, type = null, cal = 0) {
+ let calDay = function (_d, _cal) {
+ return new Date(_d.getTime() + (cal * 24 * 60 * 60 * 1000));
+ }
+ let tarDate = new Date(text);
+ let result = 0;
+ if (type == "year") {
+ result = calDay(tarDate, cal).getFullYear();
+ } else if (type == "month") {
+ result = calDay(tarDate, cal).getMonth();
+ } else if (type == "date") {
+ result = calDay(tarDate, cal).getDate();
+ } else if (type == "day") {
+ result = calDay(tarDate, cal).getDay();
+ } else {
+ result = calDay(tarDate, cal);
+ }
+ return result;
+}
\ No newline at end of file
diff --git a/Frontend/js/style.js b/Frontend/js/style.js
index c7218b7..4817d3c 100644
--- a/Frontend/js/style.js
+++ b/Frontend/js/style.js
@@ -68,6 +68,12 @@ Array.prototype.oSort = function (key) {
}
return this.sort(compareNumbers);
}
+
+Array.prototype.sum = function () {
+ return this.reduce(function (a, b) {
+ return a + b;
+ }, 0);
+}
BigInt.prototype.toJSON = function () { return this.toString() }
$.fn.classList = function () { return this[0].className.split(/\s+/); };
diff --git a/Frontend/js/yourteam/plugins/yt-tab/yt-tab.js b/Frontend/js/yourteam/plugins/yt-tab/yt-tab.js
index e18c733..f51b490 100644
--- a/Frontend/js/yourteam/plugins/yt-tab/yt-tab.js
+++ b/Frontend/js/yourteam/plugins/yt-tab/yt-tab.js
@@ -20,7 +20,7 @@ $(function () {
* */
function initTabsByEle() {
/*_ytTabInited = [];*/
- $("[data-tabname][data-target]:not([data-tabrole=child])").each(function (index, value) {
+ $("[data-tabname]:not([data-tabrole=child])").each(function (index, value) {
let tabName = $(value).data("tabname");
if (_ytTabInited.indexOf(tabName) == -1) {
var ytTab = new YT.Tab({ tabName: tabName })
@@ -48,7 +48,7 @@ class YourTeamTab {
} else {
$(`[data-tabname=${this.tabName}][data-target].active`).first().trigger("click");
}
-
+
_ytTabInited.push(this.tabName);
}
@@ -56,22 +56,24 @@ class YourTeamTab {
let clsObj = this;
// Tab Item 按鈕 click
- $(`[data-tabname=${this.tabName}][data-target]`).off("click").on("click", function (e) {
+ $(`[data-tabname=${this.tabName}]`).off("click").on("click", function (e) {
let target = $(this).data("target");
let obj = this;
- $(`[data-tabname=${clsObj.tabName}][data-target]:not([data-tabrole=child])`).removeClass("active");
+ $(`[data-tabname=${clsObj.tabName}]:not([data-tabrole=child])`).removeClass("active");
$(obj).addClass("active");
// 觸發 yt:tab:change事件
$(obj).trigger("yt:tab:change");
- let tabName = $(target).data("tabname");
- if (tabName) {
- // 找出該觸發對象 block
- if ($(target).data("tabrole") == "child") {
- $(obj).trigger("yt:tab:show");
- $(`[data-tabname='${tabName}'][data-tabrole='child']`).css("opacity", 0).hide();
- $(target).show().animate({ opacity: 1 }, 200, function () {
- $(obj).trigger("yt:tab:shown");
- });
+ if (target) {
+ let tabName = $(target).data("tabname");
+ if (tabName) {
+ // 找出該觸發對象 block
+ if ($(target).data("tabrole") == "child") {
+ $(obj).trigger("yt:tab:show");
+ $(`[data-tabname='${tabName}'][data-tabrole='child']`).css("opacity", 0).hide();
+ $(target).show().animate({ opacity: 1 }, 200, function () {
+ $(obj).trigger("yt:tab:shown");
+ });
+ }
}
}
})
diff --git a/Frontend/js/yourteam/yourteam.ajax.class_bak.js b/Frontend/js/yourteam/yourteam.ajax.class_bak.js
new file mode 100644
index 0000000..95f70eb
--- /dev/null
+++ b/Frontend/js/yourteam/yourteam.ajax.class_bak.js
@@ -0,0 +1,267 @@
+var YourTeam = YourTeam || {};
+/**
+ * This is a description of the Ajax constructor function.
+ * @class Ajax
+ * @classdesc This is a description of the Ajax class.
+ * @author Darren Chen @2021/02/06
+ * @copyright Darren Chen @Your Team Co., Ltd. 2021
+ */
+class Ajax {
+ /**
+ * constructor
+ * @constructor
+ * @param {String} apiUrl API URL. def="".
+ * @param {String} sendData the data object which you will be send. def= null.
+ * @param {Fcnction} successFunction successFunction. def=null.(use def successFunction)
+ * @param {Fcnction} errorFunction errorFunction. def=null.(use def successFunction)
+ * @param {String} type HTTP METHOD. def="GET".
+ * @param {Object} conType content type
+ * @param {String} dataType data format. def="JSON".
+ * @param {String} isAsync the api synchronization. def=false.
+ * @return {Object} this
+ */
+ constructor(apiUrl = "", sendData = null, successFunction = null, errorFunction = null, type = "GET", isAsync = false, conType = this.contentType.Json, dataType = "JSON") {
+ this.conType = conType;
+ this.apiUrl = apiUrl;
+ this.isAsync = isAsync;
+ this.type = type;
+ this.dataType = dataType;
+ this.sendData = sendData;
+ this.extSuccessFunction = successFunction;
+ /*if (successFunction) this.successFunction = successFunction;*/
+ if (errorFunction) this.errorFunction = errorFunction;
+ return this;
+ }
+ /**
+ * dataToString
+ * @description convert the data object to string
+ * @param {Object} data API URL. def="".
+ * @return {String} strJsonData
+ */
+ dataToString = function (data) {
+ let strJsonData = data ? (data.Data ? JSON.stringify(data.Data) : null) : null;
+ return strJsonData;
+ }
+ /**
+ * beforeSendFunction
+ * @description beforeSendFunction
+ */
+ beforeSendFunction = function (xhr) {
+ let token = localStorage.getItem("JWT-Authorization");
+ xhr.setRequestHeader('Authorization', "Bearer " + token);
+ }
+ /**
+ * successFunction
+ * @description successFunction
+ * @param {Object} data the data object from the api return
+ * @return {Object} data
+ */
+ successFunction = function (data, callback) {
+ debugger
+ if (data && data.unauthorized == 401) {
+ let href = location.href;
+ localStorage.removeItem("JWT-Authorization");
+ if (href.indexOf("localhost:5966") == -1) {
+ location.href = "/login";
+ } else {
+ location.href = "login.html";
+ }
+ }
+ if (callback) {
+ callback(data);
+ }
+ return data;
+ }
+ /**
+ * errorFunction
+ * @description errorFunction
+ * @param {Object} xhr HTTP STATUS
+ * @param {Object} ajaxOptions the ajax option message
+ * @param {String} thrownError the error message
+ */
+ errorFunction = function (xhr, ajaxOptions, thrownError) {
+ if (xhr.status != "201" && xhr.status != "204") {
+ console.log(xhr.status);
+ console.log(thrownError);
+ window.alert("執行失敗,請聯絡客服人員。");
+ } else if (xhr.status == "401") {
+ window.alert("登入時間超時,請重新登入!");
+ localStorage.removeItem("JWT-Authorization");
+ location.href = "~/Login/Login";
+ }
+ }
+
+ /**
+ * completeFunction
+ * @description completeFunction
+ */
+ completeFunction = function () {
+
+ }
+ /**
+ * content type
+ * @description content type
+ */
+ contentType = {
+ Json: 1,
+ FormData : 2
+ }
+ /**
+ * enum
+ * @description enum
+ * @param {Object} eo object
+ * @return {Object} enum
+ */
+ enums(eo) {
+ var enums = function () { };
+ for (var key in eo) {
+ var enumObject = new enums();
+ enums[key] = eo[key];
+ }
+ return enums;
+ }
+ /**
+ * send
+ * @description send
+ * @param {Object} conType content type
+ * @param {Object} sendData send data
+ * @param {Function} successFunction the ajax success function
+ * @param {Function} errorFunction the ajax error function
+ * @return {Object} this
+ */
+ send = function (conType = this.contentType.Json, sendData = null, successFunction = null, errorFunction = null) {
+
+ //if (!CheckMultiSend(this.apiUrl, this.type, this.dataToString(this.sendData))) { //連點防呆
+ // return false;
+ //}
+ if (sendData) {
+ this.sendData = sendData;
+ }
+ if (successFunction) {
+ this.successFunction = successFunction;
+ }
+ if (errorFunction) {
+ this.errorFunction = errorFunction;
+ }
+ if (conType === this.contentType.Json) {
+ $.ajax({
+ url: this.apiUrl,
+ async: this.isAsync,
+ type: this.type,
+ dataType: this.dataType,
+ traditional: true,
+ contentType: "application/json; charset=utf-8",
+ data: this.dataToString(this.sendData),
+
+ //cache: false,
+ //processData: false,
+
+ beforeSend: this.beforeSendFunction,
+ success: (data) => this.successFunction(data, this.extSuccessFunction),
+ error: this.errorFunction,
+ complete: this.completeFunction,
+ statusCode: {
+ 201: (data) => this.successFunction(data, this.extSuccessFunction),
+ }
+ });
+ }
+ else if (conType === this.contentType.FormData) {
+ $.ajax({
+ url: this.apiUrl,
+ async: this.isAsync,
+ type: this.type,
+ dataType: this.dataType,
+
+ traditional: true,
+
+ contentType: false,
+ enctype: 'multipart/form-data',
+ data: this.sendData,
+ cache: false,
+ processData: false,
+ beforeSend: this.beforeSendFunction,
+ success: this.successFunction,
+ error: this.errorFunction,
+ complete: this.completeFunction
+ });
+ alert(conType);
+ }
+ else {
+ console.error("the content type is null.");
+ }
+ return this;
+ }
+}
+YourTeam.Ajax = YourTeam.Ajax || Ajax;
+
+var ckeckMultiSendArr = [];
+function CheckMultiSend(url, type, data) {
+ //根據 url type data
+ let text = String(url) + String(type);
+ if (type != "GET") {
+ if (ckeckMultiSendArr.indexOf(text) == -1) {
+ ckeckMultiSendArr.unshift(text);
+ let timer = setInterval(function () {
+ ckeckMultiSendArr.splice(0);
+ clearInterval(timer);
+ }, 500)
+ } else {
+ return false
+ }
+ }
+ return true;
+}
+//var YourTeamAjax = {
+// apiUrl: "",
+// isAsync: false,
+// type: "GET",
+// dataType: "JSON",
+// sendData: null,
+// dataToString: function (data) {
+// let strJsonData = data ? (data.Data ? JSON.stringify(data.Data) : null) : null;
+// return strJsonData;
+// },
+// beforeSendFunction: function () {
+// $.blockUI({ message: '
Loding...
' });
+// },
+// successFunction: function (data) {
+// return data;
+// },
+// errorFunction: function (xhr, ajaxOptions, thrownError) {
+// if (xhr.status != "201") {
+// console.log(xhr.status);
+// console.log(thrownError);
+// window.alert("執行失敗,請聯絡YourTeam客服人員。");
+// }
+// },
+// completeFunction: function () {
+// $.unblockUI();
+// },
+// send: function (sendData = null, successFunction = null, errorFunction = null) {
+// if (sendData) {
+// this.sendData = sendData;
+// }
+// if (successFunction) {
+// this.successFunction = successFunction;
+// }
+// if (errorFunction) {
+// this.errorFunction = errorFunction;
+// }
+// $.ajax({
+// url: this.apiUrl,
+// async: this.isAsync,
+// type: this.type,
+// dataType: this.dataType,
+// traditional: true,
+// contentType: "application/json; charset=utf-8",
+// data: this.dataToString(this.sendData),
+// beforeSend: this.beforeSendFunction,
+// success: this.successFunction,
+// error: this.errorFunction,
+// complete: this.completeFunction,
+// statusCode: {
+// 201: this.successFunction
+// }
+// });
+// }
+//};
diff --git a/Frontend/js/yourteam/yourteam.utility.class.js b/Frontend/js/yourteam/yourteam.utility.class.js
index afdcccb..5a8d547 100644
--- a/Frontend/js/yourteam/yourteam.utility.class.js
+++ b/Frontend/js/yourteam/yourteam.utility.class.js
@@ -491,9 +491,56 @@ class File {
let myMath = new YourTeam.Utility.Math();
let myFile = new YourTeam.Utility.File();
let strExtName = "", strOrgName = "";
-
- for (let i = 0; i < files.length; i++) {
- let file = files[i];
+
+ if (files.length > 0) {
+ for (let i = 0; i < files.length; i++) {
+ let file = files[i];
+ if (limitMaxSize != null) {
+ if (file.size / 1024 < limitMinSize || file.size / 1024 > limitMaxSize) {
+ limitFun ? limitFun() : "";
+ return false
+ }
+ }
+ htmlImg = "";
+ let guid = myMath.guid().replace(' ', '');
+ file.guid = guid;
+ if (/\.(jpe?g|png|gif)$/i.test(file.name)) {
+ let reader = new FileReader();
+ reader.addEventListener("load", function () {
+ let image = new Image();
+ let src = this.result;
+ image.src = this.result;
+ image.onload = function () {
+ strExtName = myFile.getFileExtension(file.name);
+ strOrgName = (strExtName === null || strExtName === "") ? file.name : file.name.replace('.' + strExtName, '');
+ htmlImg = frontHtml + '
'
+ + backHtml;
+
+ container.insertAdjacentHTML("afterBegin", htmlImg);
+ //$("[name=" + removeClickTagName + "]").on("click", function (e) {
+ // e.preventDefault();
+ // $(this).closest(removeTag).remove();
+ //});
+ if (i === files.length - 1 && funDoSomeThing) {
+ funDoSomeThing();
+ }
+ }
+ });
+ reader.readAsDataURL(file);
+ } else {
+ if (showAlert) {
+ showAlert("danger", "只支援圖片格式");
+ }
+ else {
+ alert("只支援圖片格式");
+ }
+ }
+ }
+
+ }
+ else {
+ let file = files;
if (limitMaxSize != null) {
if (file.size / 1024 < limitMinSize || file.size / 1024 > limitMaxSize) {
limitFun ? limitFun() : "";
@@ -504,7 +551,6 @@ class File {
let guid = myMath.guid().replace(' ', '');
file.guid = guid;
if (/\.(jpe?g|png|gif)$/i.test(file.name)) {
-
let reader = new FileReader();
reader.addEventListener("load", function () {
let image = new Image();
@@ -522,21 +568,21 @@ class File {
// e.preventDefault();
// $(this).closest(removeTag).remove();
//});
- if (i === files.length - 1 && funDoSomeThing) {
+ if (funDoSomeThing) {
funDoSomeThing();
}
}
});
reader.readAsDataURL(file);
} else {
- if (showAlert) {
+ if (showAlert) {
showAlert("danger", "只支援圖片格式");
}
else {
alert("只支援圖片格式");
}
}
- }
+ }
}
readAndPreviewFiles(files, containerId, imgWidth = null, imgHeight = null, frontHtml = null, backHtml = null, funDoSomeThing = null) {
@@ -547,37 +593,82 @@ class File {
let myMath = new YourTeam.Utility.Math();
let myFile = new YourTeam.Utility.File();
let strExtName = "", strOrgName = "", strSaveName = "";
-
- for (let i = 0; i < files.length; i++) {
- let file = files[i];
+
+ if (files.length) {
+ for (let i = 0; i < files.length; i++) {
+ let file = files[i];
+ htmlImg = "";
+
+ let guid = myMath.guid().replace(' ', '');
+ file.guid = guid;
+ //alert(/\.(xls?x|doc?x|ptt?x|pdf|zip|rar|7zip|txt|odt|xml|rtf|ods|odp|pps?x)$/i.test(file.name));
+ if (/\.(xls?x|doc?x|ptt?x|pdf|zip|rar|7zip|txt|odt|xml|rtf|ods|odp|pps?x)$/i.test(file.name)) {
+
+ if (file.size == 0) { //檔案大小為0時不會產生base64,需防呆
+ showAlert("danger", "無法上傳大小為0的檔案");
+ return false;
+ }
+
+ //先新增a標籤 在套上src 可能解決多檔案上傳時無法讀取到最後上傳檔案的問題
+ strSaveName = guid;
+ strExtName = myFile.getFileExtension(file.name);
+ strOrgName = (strExtName === null || strExtName === "") ? file.name : file.name.replace('.' + strExtName, '');
+
+ htmlImg = frontHtml + '
' + strOrgName + '.' + strExtName + ''
+ + backHtml;
+ container.insertAdjacentHTML("afterBegin", htmlImg);
+ let reader = new FileReader();
+
+ reader.addEventListener("load", function (event) {
+ $($(container).find("a")[i]).attr("href", this.result);
+ if (i === files.length - 1 && funDoSomeThing) {
+ funDoSomeThing();
+ }
+ });
+ reader.readAsDataURL(file);
+
+ } else {
+ if (showAlert) {
+ showAlert("danger", "只支援文件格式");
+ } else {
+ alert("只支援文件格式");
+ }
+ }
+ }
+ }
+ else {
+ let file = files;
htmlImg = "";
+
+ let guid = myMath.guid().replace(' ', '');
+ file.guid = guid;
//alert(/\.(xls?x|doc?x|ptt?x|pdf|zip|rar|7zip|txt|odt|xml|rtf|ods|odp|pps?x)$/i.test(file.name));
if (/\.(xls?x|doc?x|ptt?x|pdf|zip|rar|7zip|txt|odt|xml|rtf|ods|odp|pps?x)$/i.test(file.name)) {
-
if (file.size == 0) { //檔案大小為0時不會產生base64,需防呆
showAlert("danger", "無法上傳大小為0的檔案");
return false;
}
//先新增a標籤 在套上src 可能解決多檔案上傳時無法讀取到最後上傳檔案的問題
- strSaveName = myMath.guid().replace(' ', '');
+ strSaveName = guid;
strExtName = myFile.getFileExtension(file.name);
strOrgName = (strExtName === null || strExtName === "") ? file.name : file.name.replace('.' + strExtName, '');
-
- htmlImg = frontHtml + '
' + strOrgName + '.' + strExtName + ''
+
+ htmlImg = frontHtml + '
' + strOrgName + '.' + strExtName + ''
+ backHtml;
container.insertAdjacentHTML("afterBegin", htmlImg);
let reader = new FileReader();
reader.addEventListener("load", function (event) {
- $($(container).find("a")[i]).attr("href", this.result);
- if (i === files.length - 1 && funDoSomeThing) {
+ $($(container).find("a")).attr("href", this.result);
+ if (funDoSomeThing) {
funDoSomeThing();
}
});
reader.readAsDataURL(file);
-
+
} else {
if (showAlert) {
showAlert("danger", "只支援文件格式");
@@ -585,7 +676,7 @@ class File {
alert("只支援文件格式");
}
}
- }
+ }
}
async getBase64Image(path, callback) {
//生成canvas