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 = "&#xe642;";
+          _vue.$emit("onAddDevice", treeNode.id)
+        })
+        btn.innerHTML = "&#xe642;"
 
-        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 = "&#xe643;";
+          _vue.$emit("onImport", treeNode.id)
+        })
+        btn.innerHTML = "&#xe643;"
 
-        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')">&#xe60f;</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