From e018e23189eb9520f6f28ae515b17333351267ff Mon Sep 17 00:00:00 2001 From: zhangzengfei <zhangzengfei@smartai.com> Date: 星期六, 06 八月 2022 05:30:21 +0800 Subject: [PATCH] 完善推送管理功能 --- src/views/report/components/FormArea.vue | 301 ++++++++--------- src/views/report/components/DevList.vue | 153 +++++--- src/views/report/components/SettingBox.vue | 17 src/api/report.ts | 57 +++ src/components/giantTree/zTree/ztree.vue | 429 +++++++++++------------- src/views/report/index.vue | 4 src/api/event.ts | 58 -- 7 files changed, 518 insertions(+), 501 deletions(-) diff --git a/src/api/event.ts b/src/api/event.ts index 90b86b9..f2d6694 100644 --- a/src/api/event.ts +++ b/src/api/event.ts @@ -1,18 +1,5 @@ -import request from "@/scripts/httpRequest"; -import qs from "qs"; - -/** - * 浜嬩欢鎺ㄩ�佷繚瀛� - */ -export const eventPushsSave = (query: any) => { - return request({ - url: "/data/api-v/eventPush/save", - method: "post", - data: query - }); -}; - - +import request from "@/scripts/httpRequest" +import qs from "qs" /** * 鏍规嵁浜嬩欢鎺ㄩ�佷富棰樼殑涓�绾у拰浜岀骇閫夐」鑾峰彇鏈�鍚庝笅鎷夎彍鍗曞垪琛� */ @@ -21,19 +8,8 @@ url: "/data/api-v/eventPush/findByEventTopic", method: "get", params: query - }); -}; - -/** - * 鏌ヨ浜嬩欢鍒楄〃 - */ -export const findAll = (query: any) => { - return request({ - url: "/data/api-v/eventPush/findAll", - method: "get", - params: query - }); -}; + }) +} /** * 鏀瑰彉enable鐘舵�� @@ -43,9 +19,8 @@ url: "/data/api-v/eventPush/changeStatus", method: "post", data: query - }); -}; - + }) +} /** * 鏍规嵁浜嬩欢id鑾峰彇浜嬩欢璇︽儏 @@ -55,8 +30,8 @@ url: "/data/api-v/eventPush/getById", method: "get", params: query - }); -}; + }) +} /** * 鏍规嵁id鍒犻櫎 @@ -66,18 +41,16 @@ url: "/data/api-v/eventPush/delete", method: "post", data: qs.stringify(query) - }); -}; + }) +} //鑾峰彇浜嬩欢澹伴煶鍒楄〃 export const getSoundList = () => { return request({ url: "/saas/api-s/voice/findAll", method: "get" - }) } - export const uploadSound = (data: any) => { return request({ @@ -87,19 +60,18 @@ }) } - //鑾峰彇鎵�鏈夌殑鎺ㄩ�佸瓧娈甸厤缃� -export const getPushSet = ()=>{ +export const getPushSet = () => { return request({ - url:'/data/api-v/eventPush/getPushSet', - method:'get' + url: "/data/api-v/eventPush/getPushSet", + method: "get" }) } -export const deleteSound = (q:any) => { +export const deleteSound = (q: any) => { return request({ url: "/data/api-v/voice/del", method: "get", - params:q + params: q }) } diff --git a/src/api/report.ts b/src/api/report.ts new file mode 100644 index 0000000..741dd64 --- /dev/null +++ b/src/api/report.ts @@ -0,0 +1,57 @@ +import request from "@/scripts/httpRequest" +import qs from "qs" + +/** + * 鏌ヨ浠诲姟鍒楄〃 + */ +export const findAllTask = (query: any) => { + return request({ + url: "/api-a/v1/task/list", + method: "get", + params: query + }) +} + +/** + * 浜嬩欢鎺ㄩ�佹柊澧� + */ +export const createTask = (query: any) => { + return request({ + url: "/api-a/v1/task/create", + method: "post", + data: query + }) +} + +/** + * 浜嬩欢鎺ㄩ�佷慨鏀� + */ +export const updateTask = (query: any) => { + return request({ + url: "/api-a/v1/task/update", + method: "post", + data: query + }) +} + +/** + * 浜嬩欢鎺ㄩ�佷慨鏀� + */ +export const deleteTask = (query: any) => { + return request({ + url: "/api-a/v1/task/delete", + method: "get", + params: query + }) +} + +/** + * 鎺ㄩ�佸巻鍙叉煡璇� + */ +export const findTaskLogs = (query: any) => { + return request({ + url: "/api-a/v1/log/list", + method: "get", + params: query + }) +} diff --git a/src/components/giantTree/zTree/ztree.vue b/src/components/giantTree/zTree/ztree.vue index cac4b59..b4a20f6 100644 --- a/src/components/giantTree/zTree/ztree.vue +++ b/src/components/giantTree/zTree/ztree.vue @@ -1,17 +1,8 @@ <template> <div> <div class="searchTree"> - <el-input - placeholder="鎼滅储" - v-model="keyWord" - size="mini" - v-show="search" - > - <i - slot="suffix" - class="el-input__icon el-icon-search" - :id="searchBtnId" - ></i> + <el-input placeholder="鎼滅储" v-model="keyWord" size="mini" v-show="search"> + <i slot="suffix" class="el-input__icon el-icon-search" :id="searchBtnId"></i> </el-input> </div> <div class="ztree" :id="ztreeId"></div> @@ -19,16 +10,16 @@ </template> <script> -import * as $ from "jquery"; -import { Loading } from "element-ui"; +import * as $ from "jquery" +import { Loading } from "element-ui" if (!window.jQuery) { - window.jQuery = $; + window.jQuery = $ } // require("@ztree/ztree_v3/js/jquery.ztree.all"); -require("./ztree_v3/jquery.ztree.all"); -require("./ztree_v3/jquery.ztree.exhide"); +require("./ztree_v3/jquery.ztree.all") +require("./ztree_v3/jquery.ztree.exhide") export default { props: { @@ -39,17 +30,17 @@ setting: { type: Object, require: false, - default: function () { - return {}; - }, + default: function() { + return {} + } }, nodes: { type: Array, require: true, - default: function () { - return []; - }, - }, + default: function() { + return [] + } + } }, data() { return { @@ -63,120 +54,120 @@ showLine: true, showIcon: true, // default to hide icon addHoverDom: this.addHoverDom, - removeHoverDom: this.removeHoverDom, + removeHoverDom: this.removeHoverDom }, check: { - chkboxType: { Y: "", N: "" }, - enable: this.showCheckbox, + chkboxType: { Y: "ps", N: "ps" }, + enable: this.showCheckbox }, callback: { onAsyncError: (...arg) => { - this.$emit("onAsyncError", ...arg); + this.$emit("onAsyncError", ...arg) }, onAsyncSuccess: (...arg) => { - this.$emit("onAsyncSuccess", ...arg); + this.$emit("onAsyncSuccess", ...arg) }, onCheck: (...arg) => { - this.$emit("onCheck", ...arg); + this.$emit("onCheck", ...arg) }, onClick: (...arg) => { - this.$emit("onClick", ...arg); - this.removeHoverIcon(...arg); + this.$emit("onClick", ...arg) + this.removeHoverIcon(...arg) }, onCollapse: (...arg) => { - this.$emit("onCollapse", ...arg); + this.$emit("onCollapse", ...arg) }, onDblClick: (...arg) => { - this.$emit("onDblClick", ...arg); + this.$emit("onDblClick", ...arg) }, onDrag: (...arg) => { - this.$emit("onDrag", ...arg); + this.$emit("onDrag", ...arg) }, onDragMove: (...arg) => { - this.$emit("onDragMove", ...arg); + this.$emit("onDragMove", ...arg) }, onDrop: (...arg) => { - this.$emit("onDrop", ...arg); + this.$emit("onDrop", ...arg) }, onExpand: (...arg) => { - this.$emit("onExpand", ...arg); + this.$emit("onExpand", ...arg) }, onMouseDown: (...arg) => { - this.$emit("onMouseDown", ...arg); + this.$emit("onMouseDown", ...arg) }, onMouseUp: (...arg) => { - this.$emit("onMouseUp", ...arg); + this.$emit("onMouseUp", ...arg) }, onRemove: (...arg) => { - this.$emit("onRemove", ...arg); + this.$emit("onRemove", ...arg) }, onRename: (...arg) => { - this.$emit("onRename", ...arg); + this.$emit("onRename", ...arg) }, onRightClick: (...arg) => { - this.$emit("onRightClick", ...arg); - }, - }, + this.$emit("onRightClick", ...arg) + } + } }, keyWord: "", options: { - target: "", - }, - }; + target: "" + } + } }, watch: { nodes: { - handler: function (nodes) { - this.list = nodes; + handler: function(nodes) { + this.list = nodes // update tree if (this.ztreeObj) { - this.ztreeObj.destroy(); + this.ztreeObj.destroy() } this.$nextTick(() => { this.ztreeObj = $.fn.zTree.init( $("#" + this.ztreeId), Object.assign({}, this.ztreeSetting, this.setting), this.list - ); - this.fuzzySearch(this.ztreeObj, this.searchBtnId, false, true); //鍒濆鍖栨ā绯婃悳绱㈡柟娉� - this.$emit("onCreated", this.ztreeObj); - }); + ) + this.fuzzySearch(this.ztreeObj, this.searchBtnId, false, true) //鍒濆鍖栨ā绯婃悳绱㈡柟娉� + this.$emit("onCreated", this.ztreeObj) + }) }, deep: true, - immediate: true, + immediate: true }, showCheckbox: { - handler: function () { + handler: function() { let top = $("#" + this.ztreeId) .parent() - .scrollTop(); + .scrollTop() - this.ztreeSetting.check.enable = this.showCheckbox; + this.ztreeSetting.check.enable = this.showCheckbox if (this.ztreeObj) { - this.list = this.ztreeObj.getNodes(); - this.ztreeObj.destroy(); + this.list = this.ztreeObj.getNodes() + this.ztreeObj.destroy() } this.$nextTick(() => { this.ztreeObj = $.fn.zTree.init( $("#" + this.ztreeId), Object.assign({}, this.ztreeSetting, this.setting), this.list - ); + ) $("#" + this.ztreeId) .parent() - .scrollTop(top); - this.$emit("onCreated", this.ztreeObj); - }); + .scrollTop(top) + this.$emit("onCreated", this.ztreeObj) + }) }, - immediate: true, - }, + immediate: true + } }, methods: { addHoverDom(treeid, treeNode) { - let _vue = this; - const item = document.getElementById(`${treeNode.tId}_a`); + let _vue = this + const item = document.getElementById(`${treeNode.tId}_a`) // 鏂囦欢澶规柊澧炴寜閽� if ( @@ -186,18 +177,18 @@ !this.readonly && !this.gb28181 ) { - const btn = document.createElement("i"); - btn.id = `${treeid}_${treeNode.id}_btn`; - btn.classList.add("el-icon-circle-plus-outline"); - btn.classList.add("primary"); + const btn = document.createElement("i") + btn.id = `${treeid}_${treeNode.id}_btn` + btn.classList.add("el-icon-circle-plus-outline") + btn.classList.add("primary") // btn.innerText = '鍒犻櫎'; btn.addEventListener("click", (e) => { - e.stopPropagation(); + e.stopPropagation() // this.clickRemove(treeNode) - _vue.$emit("onAddNode", treeNode); - }); + _vue.$emit("onAddNode", treeNode) + }) - item.appendChild(btn); + item.appendChild(btn) } // 鏂囦欢澶瑰垹闄ゆ寜閽� @@ -209,223 +200,194 @@ !treeNode.children && !this.gb28181 ) { - const btn = document.createElement("i"); - btn.id = `${treeid}_${treeNode.id}_btn`; - btn.classList.add("el-icon-remove-outline"); - btn.classList.add("danger"); + const btn = document.createElement("i") + btn.id = `${treeid}_${treeNode.id}_btn` + btn.classList.add("el-icon-remove-outline") + btn.classList.add("danger") // btn.innerText = '鍒犻櫎'; btn.addEventListener("click", (e) => { - e.stopPropagation(); + e.stopPropagation() // this.clickRemove(treeNode) - _vue.$emit("onRemoveNode", treeNode); - }); + _vue.$emit("onRemoveNode", treeNode) + }) - item.appendChild(btn); + item.appendChild(btn) } // 鏂囦欢澶圭紪杈戞寜閽� - if ( - item && - !item.querySelector(".el-icon-edit") && - treeNode.isParent && - !this.readonly - ) { - const btn = document.createElement("i"); - btn.id = `${treeid}_${treeNode.id}_btn`; - btn.classList.add("el-icon-edit"); - btn.classList.add("primary"); + if (item && !item.querySelector(".el-icon-edit") && treeNode.isParent && !this.readonly) { + const btn = document.createElement("i") + btn.id = `${treeid}_${treeNode.id}_btn` + btn.classList.add("el-icon-edit") + btn.classList.add("primary") // btn.innerText = '鍒犻櫎'; btn.addEventListener("click", (e) => { - e.stopPropagation(); + e.stopPropagation() // this.clickRemove(treeNode) - _vue.$emit("onRenameNode", treeNode); - }); + _vue.$emit("onRenameNode", treeNode) + }) - item.appendChild(btn); + item.appendChild(btn) } // 娣诲姞鎽勫儚鏈烘寜閽� - if ( - item && - !item.querySelector(".iconshishishipin") && - treeNode.isParent && - !this.readonly && - !this.gb28181 - ) { - const btn = document.createElement("i"); - btn.id = `${treeid}_${treeNode.id}_btn`; - btn.classList.add("iconfont"); - btn.classList.add("iconshishishipin"); - btn.classList.add("primary"); - btn.classList.add("icon-fix"); + if (item && !item.querySelector(".iconshishishipin") && treeNode.isParent && !this.readonly && !this.gb28181) { + const btn = document.createElement("i") + btn.id = `${treeid}_${treeNode.id}_btn` + btn.classList.add("iconfont") + btn.classList.add("iconshishishipin") + btn.classList.add("primary") + btn.classList.add("icon-fix") // btn.innerText = '鍒犻櫎'; btn.addEventListener("click", (e) => { - e.stopPropagation(); + e.stopPropagation() // this.clickRemove(treeNode) - _vue.$emit("onAddDevice", treeNode.id); - }); - btn.innerHTML = ""; + _vue.$emit("onAddDevice", treeNode.id) + }) + btn.innerHTML = "" - item.appendChild(btn); + item.appendChild(btn) } // 瀵煎叆鎽勫儚鏈烘寜閽� - if ( - item && - !item.querySelector(".icondaoru") && - treeNode.isParent && - !this.readonly && - !this.gb28181 - ) { - const btn = document.createElement("i"); - btn.id = `${treeid}_${treeNode.id}_btn`; - btn.classList.add("iconfont"); - btn.classList.add("icondaoru"); - btn.classList.add("primary"); - btn.classList.add("icon-fix"); + if (item && !item.querySelector(".icondaoru") && treeNode.isParent && !this.readonly && !this.gb28181) { + const btn = document.createElement("i") + btn.id = `${treeid}_${treeNode.id}_btn` + btn.classList.add("iconfont") + btn.classList.add("icondaoru") + btn.classList.add("primary") + btn.classList.add("icon-fix") // btn.innerText = '鍒犻櫎'; btn.addEventListener("click", (e) => { - e.stopPropagation(); + e.stopPropagation() // this.clickRemove(treeNode) - _vue.$emit("onImport", treeNode.id); - }); - btn.innerHTML = ""; + _vue.$emit("onImport", treeNode.id) + }) + btn.innerHTML = "" - item.appendChild(btn); + item.appendChild(btn) } // 鏌ョ湅搴曞浘鎸夐挳 - if ( - item && - !item.querySelector(".el-icon-picture") && - treeNode.type == "camera" - ) { - const btn = document.createElement("i"); - btn.id = `${treeid}_${treeNode.id}_btn`; - btn.classList.add("iconfont"); - btn.classList.add("el-icon-picture"); - btn.classList.add("primary"); - btn.classList.add("icon-fix"); + if (item && !item.querySelector(".el-icon-picture") && treeNode.type == "camera") { + const btn = document.createElement("i") + btn.id = `${treeid}_${treeNode.id}_btn` + btn.classList.add("iconfont") + btn.classList.add("el-icon-picture") + btn.classList.add("primary") + btn.classList.add("icon-fix") // btn.innerText = '鍒犻櫎'; btn.addEventListener("click", (e) => { - e.stopPropagation(); + e.stopPropagation() // this.clickRemove(treeNode) - _vue.$emit("onShowPic", treeNode); - }); + _vue.$emit("onShowPic", treeNode) + }) - item.appendChild(btn); + item.appendChild(btn) } }, removeHoverIcon(evt, treeId, item) { - this.removeHoverDom(treeId, item); + this.removeHoverDom(treeId, item) }, removeHoverDom(treeid, treeNode) { - const item = document.getElementById(`${treeNode.tId}_a`); + const item = document.getElementById(`${treeNode.tId}_a`) if (item) { - let btn = item.querySelector(".el-icon-circle-plus-outline"); + let btn = item.querySelector(".el-icon-circle-plus-outline") if (btn) { - item.removeChild(item.querySelector(".el-icon-circle-plus-outline")); + item.removeChild(item.querySelector(".el-icon-circle-plus-outline")) } - btn = item.querySelector(".el-icon-remove-outline"); + btn = item.querySelector(".el-icon-remove-outline") if (btn) { - item.removeChild(item.querySelector(".el-icon-remove-outline")); + item.removeChild(item.querySelector(".el-icon-remove-outline")) } - btn = item.querySelector(".el-icon-edit"); + btn = item.querySelector(".el-icon-edit") if (btn) { - item.removeChild(item.querySelector(".el-icon-edit")); + item.removeChild(item.querySelector(".el-icon-edit")) } - btn = item.querySelector(".iconshishishipin"); + btn = item.querySelector(".iconshishishipin") if (btn) { - item.removeChild(item.querySelector(".iconshishishipin")); + item.removeChild(item.querySelector(".iconshishishipin")) } - btn = item.querySelector(".icondaoru"); + btn = item.querySelector(".icondaoru") if (btn) { - item.removeChild(item.querySelector(".icondaoru")); + item.removeChild(item.querySelector(".icondaoru")) } - btn = item.querySelector(".el-icon-picture"); + btn = item.querySelector(".el-icon-picture") if (btn) { - item.removeChild(item.querySelector(".el-icon-picture")); + item.removeChild(item.querySelector(".el-icon-picture")) } } }, fuzzySearch(zTreeObj, searchField, isHighLight, isExpand) { - const _this = this; + const _this = this if (!zTreeObj) { - alert("fail to get ztree object"); + alert("fail to get ztree object") } - var nameKey = zTreeObj.setting.data.key.name; //get the key of the node name - isHighLight = isHighLight === false ? false : true; //default true, only use false to disable highlight - isExpand = isExpand ? true : false; // not to expand in default - zTreeObj.setting.view.nameIsHTML = isHighLight; //allow use html in node name for highlight use + var nameKey = zTreeObj.setting.data.key.name //get the key of the node name + isHighLight = isHighLight === false ? false : true //default true, only use false to disable highlight + isExpand = isExpand ? true : false // not to expand in default + zTreeObj.setting.view.nameIsHTML = isHighLight //allow use html in node name for highlight use - var metaChar = "[\\[\\]\\\\^\\$\\.\\|\\?\\*\\+\\(\\)]"; //js meta characters - var rexMeta = new RegExp(metaChar, "gi"); //regular expression to match meta characters + var metaChar = "[\\[\\]\\\\^\\$\\.\\|\\?\\*\\+\\(\\)]" //js meta characters + var rexMeta = new RegExp(metaChar, "gi") //regular expression to match meta characters // keywords filter function function ztreeFilter(zTreeObj, _keywords, callBackFunc) { if (!_keywords) { - _keywords = ""; //default blank for _keywords + _keywords = "" //default blank for _keywords } // function to find the matching node function filterFunc(node) { if (node && node.oldname && node.oldname.length > 0) { - node[nameKey] = node.oldname; //recover oldname of the node if exist + node[nameKey] = node.oldname //recover oldname of the node if exist } - zTreeObj.updateNode(node); //update node to for modifications take effect + zTreeObj.updateNode(node) //update node to for modifications take effect if (_keywords.length == 0) { //return true to show all nodes if the keyword is blank - zTreeObj.showNode(node); - zTreeObj.expandNode(node, isExpand); - return true; + zTreeObj.showNode(node) + zTreeObj.expandNode(node, isExpand) + return true } //transform node name and keywords to lowercase - if ( - node[nameKey] && - node[nameKey].toLowerCase().indexOf(_keywords.toLowerCase()) != -1 - ) { + if (node[nameKey] && node[nameKey].toLowerCase().indexOf(_keywords.toLowerCase()) != -1) { if (isHighLight) { //highlight process //a new variable 'newKeywords' created to store the keywords information //keep the parameter '_keywords' as initial and it will be used in next node //process the meta characters in _keywords thus the RegExp can be correctly used in str.replace - var newKeywords = _keywords.replace(rexMeta, function (matchStr) { + var newKeywords = _keywords.replace(rexMeta, function(matchStr) { //add escape character before meta characters - return "\\" + matchStr; - }); - node.oldname = node[nameKey]; //store the old name - var rexGlobal = new RegExp(newKeywords, "gi"); //'g' for global,'i' for ignore case + return "\\" + matchStr + }) + node.oldname = node[nameKey] //store the old name + var rexGlobal = new RegExp(newKeywords, "gi") //'g' for global,'i' for ignore case //use replace(RegExp,replacement) since replace(/substr/g,replacement) cannot be used here - node[nameKey] = node.oldname.replace( - rexGlobal, - function (originalText) { - //highlight the matching words in node name - var highLightText = - '<span style="color: whitesmoke;background-color: darkred;">' + - originalText + - "</span>"; - return highLightText; - } - ); - zTreeObj.updateNode(node); //update node for modifications take effect + node[nameKey] = node.oldname.replace(rexGlobal, function(originalText) { + //highlight the matching words in node name + var highLightText = + '<span style="color: whitesmoke;background-color: darkred;">' + originalText + "</span>" + return highLightText + }) + zTreeObj.updateNode(node) //update node for modifications take effect } - zTreeObj.showNode(node); //show node with matching keywords - return true; //return true and show this node + zTreeObj.showNode(node) //show node with matching keywords + return true //return true and show this node } - zTreeObj.hideNode(node); // hide node that not matched - return false; //return false for node not matched + zTreeObj.hideNode(node) // hide node that not matched + return false //return false for node not matched } - var nodesShow = zTreeObj.getNodesByFilter(filterFunc); //get all nodes that would be shown - processShowNodes(nodesShow, _keywords); //nodes should be reprocessed to show correctly - _this.$emit("onAfterSearch", null); + var nodesShow = zTreeObj.getNodesByFilter(filterFunc) //get all nodes that would be shown + processShowNodes(nodesShow, _keywords) //nodes should be reprocessed to show correctly + _this.$emit("onAfterSearch", null) } /** @@ -435,61 +397,61 @@ if (nodesShow && nodesShow.length > 0) { //process the ancient nodes if _keywords is not blank if (_keywords.length > 0) { - $.each(nodesShow, function (n, obj) { - var pathOfOne = obj.getPath(); //get all the ancient nodes including current node + $.each(nodesShow, function(n, obj) { + var pathOfOne = obj.getPath() //get all the ancient nodes including current node if (pathOfOne && pathOfOne.length > 0) { //i < pathOfOne.length-1 process every node in path except self for (var i = 0; i < pathOfOne.length - 1; i++) { - zTreeObj.showNode(pathOfOne[i]); //show node - zTreeObj.expandNode(pathOfOne[i], true); //expand node + zTreeObj.showNode(pathOfOne[i]) //show node + zTreeObj.expandNode(pathOfOne[i], true) //expand node } } - }); + }) } else { //show all nodes when _keywords is blank and expand the root nodes - var rootNodes = zTreeObj.getNodesByParam("level", "0"); //get all root nodes - $.each(rootNodes, function (n, obj) { - zTreeObj.expandNode(obj, true); //expand all root nodes - }); + var rootNodes = zTreeObj.getNodesByParam("level", "0") //get all root nodes + $.each(rootNodes, function(n, obj) { + zTreeObj.expandNode(obj, true) //expand all root nodes + }) } } } //listen to change in input element - $("#" + searchField).bind("click", function () { + $("#" + searchField).bind("click", function() { // _this.options.target = document.querySelector("#" + _this.ztreeId).parentNode.parentNode // console.log(_this.options.target); // let loadingInstance = Loading.service(_this.options) // console.log(_this.keyWord); // var _keywords = $(this).val(); - $("#" + searchField).removeClass("el-icon-search"); - $("#" + searchField).addClass("el-icon-loading"); - searchNodeLazy(_this.keyWord); //call lazy load + $("#" + searchField).removeClass("el-icon-search") + $("#" + searchField).addClass("el-icon-loading") + searchNodeLazy(_this.keyWord) //call lazy load // loadingInstance.close() setTimeout(() => { - $("#" + searchField).removeClass("el-icon-loading"); - $("#" + searchField).addClass("el-icon-search"); - }, 300); - }); + $("#" + searchField).removeClass("el-icon-loading") + $("#" + searchField).addClass("el-icon-search") + }, 300) + }) - var lastKeyword = ""; + var lastKeyword = "" // excute lazy load once after input change, the last pending task will be cancled function searchNodeLazy(_keywords) { if (lastKeyword === _keywords) { - return; + return } - ztreeFilter(zTreeObj, _keywords); //lazy load ztreeFilter function + ztreeFilter(zTreeObj, _keywords) //lazy load ztreeFilter function // $(searchField).focus();//focus input field again after filtering - lastKeyword = _keywords; + lastKeyword = _keywords } }, handleSearch() { - this.loading = true; - searchNodeLazy(this.keyWord); //call lazy load - this.loading = false; - }, - }, -}; + this.loading = true + searchNodeLazy(this.keyWord) //call lazy load + this.loading = false + } + } +} </script> <style lang="scss"> @@ -593,8 +555,7 @@ } .ztree li ul.line { /* background: url(/images/line_conn.gif) 0 0 repeat-y; */ - background: url(data:image/gif;base64,R0lGODlhCQACAIAAAMzMzP///yH5BAEAAAEALAAAAAAJAAIAAAIEjI9pUAA7) - 0 0 repeat-y; + background: url(data:image/gif;base64,R0lGODlhCQACAIAAAMzMzP///yH5BAEAAAEALAAAAAAJAAIAAAIEjI9pUAA7) 0 0 repeat-y; } .ztree li a { diff --git a/src/views/report/components/DevList.vue b/src/views/report/components/DevList.vue index ed9afd2..776aadb 100644 --- a/src/views/report/components/DevList.vue +++ b/src/views/report/components/DevList.vue @@ -1,21 +1,34 @@ <template> <div class="event-list"> - <div class="title">鍛婅鎺ㄩ�侀厤缃�</div> - <div class="empty" v-if="eventList.length === 0"> + <div class="title"> + <span>鍛婅鎺ㄩ�侀厤缃�</span> + <i + class="el-icon-circle-plus-outline" + style="cursor: pointer;margin-left:15px" + v-show="taskList.length > 0" + @click="handleAdd" + ></i> + </div> + <div class="empty" v-show="taskList.length == 0"> <img src="/images/search/1.png" alt="" /> <div class="des">鎮ㄨ繕鏈坊鍔犳坊鍔犲憡璀︿簨浠舵帹閫佷换鍔�</div> - <div class="button add" @click="showSettingBox = true"> + <div class="button add" @click="handleAdd"> 绔嬪嵆娣诲姞 </div> </div> <div class="list scroll"> - <el-table :data="eventList" style="width: 100%"> - <el-table-column label="搴忓彿" width="180"> </el-table-column> - <el-table-column label="浜嬩欢鍚嶇О" width="180"> </el-table-column> - <el-table-column label="浜嬩欢绛夌骇" width="180"> </el-table-column> - <el-table-column label="鍏宠仈鍖哄煙" width="180"> </el-table-column> - <el-table-column label="璐d换浜�" width="180"> </el-table-column> - <el-table-column label="鎺ㄩ�佹柟寮�" width="180"> </el-table-column> + <el-table :data="taskList" style="width: 100%"> + <el-table-column label="搴忓彿" type="index" width="50"> </el-table-column> + <el-table-column label="浜嬩欢鍚嶇О" width="180" prop="taskName"> </el-table-column> + <el-table-column label="浜嬩欢绛夌骇" width="120" prop="level"> </el-table-column> + <el-table-column label="鍏宠仈鍖哄煙" prop="org"> </el-table-column> + <el-table-column label="璐d换浜�" width="180" prop="person"> </el-table-column> + <el-table-column label="鎵嬫満鍙�" width="180" prop="tel"> </el-table-column> + <el-table-column label="鐘舵��" width="100" prop="enable"> + <template slot-scope="scope"> + <el-switch v-model="scope.row.enable" active-color="#13ce66" inactive-color="#bbbbbb"> </el-switch> + </template> + </el-table-column> <el-table-column label="鎿嶄綔"> <template slot-scope="scope"> <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">缂栬緫</el-button> @@ -23,77 +36,101 @@ </template> </el-table-column> </el-table> - <!-- <div class="devItem" v-for="(item, index) in clusterList" :key="index"> - <div class="mainInfo"> - <img src="/images/hashrate/cluster.png" alt="" /> - - <div class="right"> - <div class="name">{{ item.cluster_name }}</div> - <div class="ip">{{ item.virtual_ip }}</div> - <div class="number">璁惧鎬婚噺:{{ item.nodeNum }}</div> - </div> - - <div class="button set" @click="setting({ clusterId: item.cluster_id }, item.nodeList)"> - 閰嶇疆 - </div> - </div> - </div> - <div class="devItem" v-for="(item, index) in devList" :key="index + 'dev'"> - <div class="mainInfo"> - <img src="/images/hashrate/equipment.png" alt="" /> - - <div class="right"> - <div class="name">{{ item.devName }}</div> - <div class="ip">{{ item.devIp }}</div> - </div> - - <div class="button set" @click="setting({ devId: item.devId })"> - 閰嶇疆 - </div> - </div> - </div> --> </div> - <SettingBox v-if="showSettingBox" @close="showSettingBox = false" :id="idObj" :nodeList="nodeList"></SettingBox> + <SettingBox + v-if="showSettingBox" + @close="handleClose" + :id="idObj" + :node-list="editNode" + :camera="cameraTree" + :menu="menuTree" + ></SettingBox> </div> </template> <script> import SettingBox from "@/views/report/components/SettingBox" import { getClusterDevList } from "@/api/clusterManage" +import { findAllTask, deleteTask } from "@/api/report" +import { getLocalCameraTree } from "@/api/area" export default { components: { SettingBox }, - created() { - this.getClusterDevList() - }, data() { return { - eventList: [], - clusterList: [], - devList: [], + taskList: [], showSettingBox: false, idObj: {}, - nodeList: [] + editNode: {}, + cameraTree: [], + menuTree: [] } }, + mounted() { + this.getCameras() + this.getTaskList() + }, methods: { - async getClusterDevList() { - const res = await getClusterDevList() - if (res && res.success) { - this.clusterList = res.data.clusterList - this.devList = res.data.devList + async getCameras() { + let clusterId = "" + let clusterReq = await getClusterDevList() + if (clusterReq && clusterReq.success) { + if (clusterReq.data.clusterList.length > 0) { + clusterId = clusterReq.data.clusterList[0].cluster_id + } + } + let camereReq = await getLocalCameraTree({ clusterId: clusterId }) + if (camereReq && camereReq.success) { + this.cameraTree = camereReq.data.treeMenu + let tmpTree = JSON.parse(JSON.stringify(camereReq.data.treeMenu)) + for (let i = 0; i < tmpTree.length; i++) this.clearNode(tmpTree[i]) + this.menuTree = tmpTree } }, - setting(id, nodeList) { - this.idObj = id - this.nodeList = nodeList ? nodeList : [] + clearNode(tree) { + if (tree.children) { + tree.children = tree.children.filter((item) => { + return item.type == "MENU" + }) + } + if (tree.children && tree.children.length > 0) { + for (let i = 0; i < tree.children.length; i++) this.clearNode(tree.children[i]) + } else { + delete tree.children + } + }, + getTaskList() { + findAllTask().then((rsp) => { + if (rsp && rsp.success) { + this.taskList = rsp.data + } + }) + }, + handleAdd() { + this.idObj = "" + this.editNode = {} this.showSettingBox = true }, - handleEdit(idx, row) {}, - handleDelete(idx, row) {} + handleClose() { + this.showSettingBox = false + this.getTaskList() + }, + handleEdit(idx, row) { + console.log("edit", row) + this.idObj = row.id + this.editNode = row + this.showSettingBox = true + }, + handleDelete(idx, row) { + deleteTask({ id: row.id }).then((rsp) => { + if (rsp && rsp.success) { + this.getTaskList() + } + }) + } } } </script> @@ -104,7 +141,7 @@ box-sizing: border-box; padding: 20px; width: 1280px; - height: 770px; + height: 100%; background-color: #fff; margin: 0 auto; diff --git a/src/views/report/components/FormArea.vue b/src/views/report/components/FormArea.vue index 7957dda..b49a304 100644 --- a/src/views/report/components/FormArea.vue +++ b/src/views/report/components/FormArea.vue @@ -1,15 +1,8 @@ <template> <div class="FormArea"> - <el-form - :model="gb28181" - :rules="rules" - label-position="left" - label-width="90px" - class="alarmSetting" - ref="gb28181" - > + <el-form :model="reportTask" label-position="left" label-width="90px" class="alarmSetting" ref="report-task"> <el-form-item class="selectItem" label="浜嬩欢鍚嶇О"> - <el-select class="h32" v-model="locationCity.province" size="small" placeholder="璇烽�夋嫨浜嬩欢"> + <el-select class="h32" v-model="reportTask.taskName" size="small" placeholder="璇烽�夋嫨浜嬩欢" style="width: 400px"> <el-option v-for="item in eventsOptions" :key="item.value" @@ -20,13 +13,7 @@ </el-select> </el-form-item> <el-form-item class="selectItem" label="浜嬩欢绛夌骇"> - <el-select - class="h32" - v-model="locationCity.level" - size="small" - placeholder="璇烽�夋嫨" - :disabled="gb28181.idType === 0" - > + <el-select class="h32" v-model="reportTask.level" size="small" placeholder="璇烽�夋嫨" style="width: 400px"> <el-option v-for="item in levelOptions" :key="item.value" @@ -38,184 +25,178 @@ </el-form-item> <el-form-item label="鍏宠仈鍖哄煙"> + <el-cascader + size="mini" + style="width:400px" + v-model="tmpOrg" + :options="menu" + :props="{ value: 'id', label: 'name', checkStrictly: true }" + collapse-tags + clearable + @change="handleTreeChange" + ref="cascader" + ></el-cascader> + </el-form-item> + + <el-form-item label="璐d换浜�" prop="person"> <el-input class="h32" - v-model="gb28181.PublicId" + v-model="reportTask.person" placeholder="璇疯緭鍏�" size="small" - :disabled="gb28181.idType === 1" + style="width: 400px" + ></el-input> + </el-form-item> + <el-form-item label="鎵嬫満鍙�" prop="tel"> + <el-input + class="h32" + v-model="reportTask.tel" + placeholder="璇疯緭鍏�" + size="small" + style="width: 400px" ></el-input> </el-form-item> - <el-form-item label="璐d换浜�" prop="GbServerPort"> - <el-input - class="h32" - v-model.number="gb28181.GbServerPort" - placeholder="璇疯緭鍏�" - size="small" - style="width: 200px" - ></el-input> - </el-form-item> - <el-form-item label="鎵嬫満鍙�" prop="GbServerPort"> - <el-input - class="h32" - v-model.number="gb28181.GbServerPort" - placeholder="璇疯緭鍏�" - size="small" - style="width: 200px" - ></el-input> - </el-form-item> - - <el-form-item label="鎺ㄩ�佹柟寮�"> - <el-input - class="h32" - v-model="gb28181.Password" - placeholder="璇疯緭鍏�" - size="small" - :disabled="!gb28181.IsAuth" - ></el-input> + <!-- <el-form-item label="鎺ㄩ�佹柟寮�"> + <el-select v-model="pushType" placeholder="璇烽�夋嫨" style="width: 400px"> + <el-option label="鐭俊" value="msg"> </el-option> + </el-select> + </el-form-item> --> + <el-form-item label="寮�鍚换鍔�"> + <el-switch v-model="reportTask.enable" active-color="#13ce66" inactive-color="#bbbbbb"> </el-switch> </el-form-item> </el-form> <div class="btnArea"> <div class="button cancel" @click="$emit('close')">鍙栨秷</div> - <div class="button submit" @click="submitGB28281">淇濆瓨</div> + <div class="button submit" @click="submit">淇濆瓨</div> </div> </div> </template> <script> -import { getGB28181Config, saveGB28181Config, getGb28181AreaList, newGb28181ID } from "@/api/Gb28181" -import { isPort, isIPv4 } from "@/scripts/validate" +import { createTask, updateTask } from "@/api/report" export default { props: { - id: {} - }, - created() { - this.initGB28181Conf() + id: { + type: String, + default: "" + }, + node: {}, + camera: {}, + menu: {} }, data() { return { - gb28181: {}, - rules: { - ip: [ - { - required: true, - message: "璇疯緭鍏P鍦板潃", - trigger: "change" - }, - { validator: isIPv4, trigger: "change" } - ], - ServerIp: [ - { - required: true, - message: "璇疯緭鍏P鍦板潃", - trigger: "change" - }, - { validator: isIPv4, trigger: "change" } - ], - ServerPort: [ - { - required: true, - message: "璇疯緭鍏ョ鍙�", - trigger: "change" - }, - { validator: isPort, trigger: "change" } - ], - GbServerPort: [ - { - required: true, - message: "璇疯緭鍏ョ鍙�", - trigger: "change" - }, - { validator: isPort, trigger: "change" } - ] - }, - locationCity: { - province: "", - city: "", - county: "", - provinceOptions: [], - cityOptions: [], - countyOptions: [] - }, + reportTask: {}, eventsOptions: [ - { value: "fire", label: "鏄� 鐏�" }, - { value: "smoke", label: "鐑� 闆�" }, - { value: "work", label: "鏈┛宸ユ湇" }, - { value: "head", label: "鏈埓瀹夊叏甯�" }, - { value: "dowork", label: "绂诲矖" }, - { value: "juji", label: "浜哄憳鑱氶泦" } + { value: "鏄庣伀", label: "鏄庣伀" }, + { value: "鐑熼浘", label: "鐑熼浘" }, + { value: "绂诲矖", label: "绂诲矖" }, + { value: "浜哄憳鑱氶泦", label: "浜哄憳鑱氶泦" }, + { value: "鏈┛宸ヨ", label: "鏈┛宸ヨ" }, + { value: "鏈埓瀹夊叏甯�", label: "鏈埓瀹夊叏甯�" } ], levelOptions: [ - { value: "1", label: "涓�绾�" }, - { value: "2", label: "浜岀骇" }, - { value: "3", label: "涓夌骇" }, - { value: "4", label: "鍥涚骇" }, - { value: "5", label: "浜旂骇" } - ] + { value: "涓�绾�", label: "涓�绾�" }, + { value: "浜岀骇", label: "浜岀骇" }, + { value: "涓夌骇", label: "涓夌骇" }, + { value: "鍥涚骇", label: "鍥涚骇" }, + { value: "浜旂骇", label: "浜旂骇" } + ], + pushType: "msg", + selectedOrg: {}, + tmpOrg: [] } }, + mounted() { + this.reportTask = this.node + }, methods: { - initGB28181Conf() { - getGB28181Config(this.id).then((rsp) => { - if (rsp && rsp.success) { - this.gb28181 = rsp.data - //this.gb28181.idType = 0; - - this.$set(this.gb28181, "idType", 0) - this.$refs["gb28181"].resetFields() - } - }) - getGb28181AreaList().then((rsp) => { - if (rsp && rsp.success) { - this.locationCity.provinceOptions = rsp.data.list - } - }) + handleTreeChange(value) { + this.selectedOrg = value[value.length - 1] }, - submitGB28281() { - this.$refs["gb28181"].validate((valid) => { - if (valid) { - saveGB28181Config(this.gb28181).then((rsp) => { - if (rsp && rsp.success) { - console.log("1212112") - this.$notify({ - type: "success", - message: "GB28181璁剧疆淇濆瓨鎴愬姛" - }) - } + collSelectedNodes() { + let selectedNodeId = this.selectedOrg + let selectedNode = {} + let orgNodeIds = [] + + if (this.selectedOrg == "") { + return orgNodeIds + } + + function findNode(node) { + if (node.id == selectedNodeId) { + selectedNode = node + + return + } + + if (node.children) { + node.children.forEach((n) => { + findNode(n) }) + } + } + + function collNode(node) { + if (node.type != "MENU") { + orgNodeIds.push(node.id) + return + } + + if (node.children) { + node.children.forEach((n) => { + collNode(n) + }) + } + } + + this.camera.forEach((n) => { + findNode(n) + }) + + collNode(selectedNode) + + return orgNodeIds + }, + + submit() { + if (this.reportTask.tel.length != 11) { + this.$message.error("鎵嬫満鍙风爜涓嶆纭�") + return + } + this.$refs["report-task"].validate((valid) => { + if (valid) { + if (this.tmpOrg.length > 0) { + this.reportTask["cameraIds"] = this.collSelectedNodes().join(",") + this.reportTask.org = this.$refs["cascader"].getCheckedNodes()[0].pathLabels.join("/") + } + if (this.id == "") { + createTask(this.reportTask).then((rsp) => { + if (rsp && rsp.success) { + this.$notify({ + type: "success", + message: "淇濆瓨鎴愬姛" + }) + this.$emit("close") + } + }) + } else { + updateTask(this.reportTask).then((rsp) => { + if (rsp && rsp.success) { + this.$notify({ + type: "success", + message: "淇濆瓨鎴愬姛" + }) + this.$emit("close") + } + }) + } } else { console.log("error submit!!") return false - } - }) - }, - changeProvince() { - let pid = this.locationCity.province - getGb28181AreaList({ parentId: pid }).then((rsp) => { - if (rsp && rsp.success) { - this.locationCity.cityOptions = rsp.data.list - this.locationCity.city = this.locationCity.cityOptions[0].id - this.changeCity() - } - }) - }, - changeCity() { - let pid = this.locationCity.city - getGb28181AreaList({ parentId: pid }).then((rsp) => { - if (rsp && rsp.success) { - this.locationCity.countyOptions = rsp.data.list - this.locationCity.county = this.locationCity.countyOptions[0].id - } - }) - }, - newGBID() { - let cCode = this.locationCity.county + "" - newGb28181ID({ code: cCode }).then((rsp) => { - if (rsp && rsp.success) { - this.gb28181.PublicId = rsp.data.code } }) } diff --git a/src/views/report/components/SettingBox.vue b/src/views/report/components/SettingBox.vue index ffc3f54..6b65a4f 100644 --- a/src/views/report/components/SettingBox.vue +++ b/src/views/report/components/SettingBox.vue @@ -3,7 +3,14 @@ <div class="title">浜嬩欢鎺ㄩ�侀厤缃�</div> <div class="close iconfont" @click="$emit('close')"></div> <div class="content"> - <FormArea :id="id" @close="$emit('close')" v-if="activeTab === 0"></FormArea> + <FormArea + :id="id" + :node="nodeList" + :camera="camera" + :menu="menu" + @close="$emit('close')" + v-if="activeTab === 0" + ></FormArea> </div> </div> </template> @@ -17,7 +24,9 @@ }, props: { id: {}, - nodeList: {} + nodeList: {}, + camera: {}, + menu: {} }, data() { return { @@ -31,10 +40,10 @@ .SettingBox { position: fixed; top: 50%; - left: 50%; + left: 60%; margin-top: -354px; margin-left: -500px; - width: 1000px; + width: 700px; height: 708px; background-color: #fff; box-shadow: 0px 2px 16px 0px rgba(0, 43, 106, 0.25); diff --git a/src/views/report/index.vue b/src/views/report/index.vue index 82ff39c..d417d2e 100644 --- a/src/views/report/index.vue +++ b/src/views/report/index.vue @@ -6,7 +6,7 @@ <div class="heart"> <el-breadcrumb separator=">"> <el-breadcrumb-item :to="{ path: '/manageCenter' }">绠$悊涓績</el-breadcrumb-item> - <el-breadcrumb-item>鍛婅绠$悊</el-breadcrumb-item> + <el-breadcrumb-item>鎺ㄩ�佺鐞�</el-breadcrumb-item> </el-breadcrumb> </div> @@ -38,7 +38,7 @@ .GB28181 { background-color: rgb(243, 245, 248); position: relative; - min-height: 100vh; + min-height: 200vh; .el-breadcrumb { margin-top: 48px; -- Gitblit v1.8.0