From 0dbf19e9f92f5cb1d5ca9a06fd268d3b16e466e3 Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期三, 07 十二月 2022 15:22:01 +0800
Subject: [PATCH] 完善断流监控,集群和设备详情的查询

---
 src/components/giantTree/index.vue |  399 ++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 258 insertions(+), 141 deletions(-)

diff --git a/src/components/giantTree/index.vue b/src/components/giantTree/index.vue
index ab602d2..1f2ba05 100644
--- a/src/components/giantTree/index.vue
+++ b/src/components/giantTree/index.vue
@@ -1,5 +1,24 @@
 <template>
   <div class="tree-menu" :style="`max-height:${height - 200}px;`">
+    <div class="devArea" v-if="showDevArea">
+      <swiper :options="swiperOption">
+        <swiper-slide v-for="item in nodeList" :key="item.devId" :class="{ active: activeTabObj.devId === item.devId }">
+          <div class="tab" @click="chooseTab(item)">
+            {{ item.devName }}
+          </div>
+        </swiper-slide>
+      </swiper>
+      <div class="swiper-pre-border" v-if="showDevArea">
+        <div class="icon-btn" slot="button-prev">
+          <i class="iconfont">&#xe618;</i>
+        </div>
+      </div>
+      <div class="swiper-next-border" v-if="showDevArea">
+        <div class="icon-btn" slot="button-next">
+          <i class="iconfont">&#xe623;</i>
+        </div>
+      </div>
+    </div>
     <z-tree
       :nodes="node"
       :show-checkbox="TreeDataPool.multiple"
@@ -18,31 +37,18 @@
       @onExpand="itemExpand"
       @onCollapse="itemCollapse"
       @onShowPic="showCameraPic"
+      :search="search"
     />
+    <div class="empty" v-if="!node.length">鏆傛棤鎽勫儚鏈烘暟鎹�,璇锋坊鍔犳憚鍍忔満!</div>
     <div class="dialog-box-bg" v-show="showDialog" @click="hideDialogBox"></div>
-    <div
-      class="dialog-box"
-      v-show="showDialog"
-      :style="{ left: clientX + 'px', top: clientY + 'px' }"
-    >
-      <el-card :body-style="{ padding: '10px' }">
-        <el-form
-          :model="dialogForm"
-          size="mini"
-          :rules="rules"
-          ref="dialogForm"
-          label-width="70px"
-        >
+    <div class="dialog-box" v-show="showDialog">
+      <el-card :body-style="{ padding: '5px' }">
+        <el-form :model="dialogForm" size="mini" :rules="rules" ref="dialogForm" label-width="70px">
           <el-form-item label="鍚嶇О锛�" prop="name">
-            <el-input
-              v-model="dialogForm.text"
-              oninput="if(value.length>10)value=value.slice(0,10)"
-            ></el-input>
+            <el-input v-model="dialogForm.text" oninput="if(value.length>20)value=value.slice(0,20)"></el-input>
           </el-form-item>
           <div class="text-center pb-2">
-            <el-button size="mini" type="primary" @click="submitForm"
-              >淇濆瓨</el-button
-            >
+            <el-button size="mini" type="primary" @click="submitForm">淇濆瓨</el-button>
             <el-button size="mini" @click="hideDialogBox">鍙栨秷</el-button>
           </div>
         </el-form>
@@ -52,40 +58,49 @@
 </template>
 
 <script>
-import ZTree from "./zTree/ztree";
+import ZTree from "./zTree/ztree"
 
 export default {
   name: "GiantTreeMenu",
   components: {
-    ZTree,
+    ZTree
   },
   props: {
     app: {
       type: String,
-      default: "Video",
+      default: "Video"
     },
     node: {
-      type: Array,
+      type: Array
     },
     treeName: {
       type: String,
-      default: "",
+      default: ""
     },
     gb28181: {
       type: Boolean,
-      default: false,
+      default: false
     },
     height: {
       type: Number,
-      default: 0,
+      default: 0
     },
     setting: {
       type: Object,
       require: false,
-      default: function () {
-        return {};
-      },
+      default: function() {
+        return {}
+      }
     },
+    search: {
+      type: Boolean,
+      default: false
+    },
+    showDevArea: {
+      type: Boolean,
+      default: false
+    },
+    nodeList: {}
   },
   data() {
     return {
@@ -93,154 +108,154 @@
       clientX: 0,
       clientY: 0,
       dialogForm: {
-        text: "",
+        text: ""
       },
       rules: {
         text: [
           { required: true, message: "璇疯緭鍏ヨ妭鐐瑰悕绉�", trigger: "change" },
-          { min: 2, max: 10, message: "闀垮害鍦�2鍒�10涓瓧", trigger: "change" },
-        ],
+          { min: 2, max: 10, message: "闀垮害鍦�2鍒�10涓瓧", trigger: "change" }
+        ]
       },
       curNodeTid: "",
-    };
+
+      activeTabObj: {},
+      swiperOption: {
+        slidesPerView: 3,
+        spaceBetween: 0,
+        pagination: {
+          el: ".swiper-pagination",
+          clickable: true
+        },
+        navigation: {
+          nextEl: ".swiper-next-border",
+          prevEl: ".swiper-pre-border"
+        },
+        observer: true, //淇敼swiper鑷繁鎴栧瓙鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiper
+        observeParents: true //淇敼swiper鐨勭埗鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiper
+      }
+    }
   },
   created() {
-    this.TreeDataPool.zTree = true;
+    this.activeTabObj = this.nodeList && this.nodeList.length > 0 ? this.nodeList[0] : ""
+    this.TreeDataPool.zTree = true
     this.TreeDataPool.activeVideoIndex = sessionStorage.activeIndexVideo
       ? Number(sessionStorage.activeIndexVideo)
-      : this.TreeDataPool.activeVideoIndex;
+      : this.TreeDataPool.activeVideoIndex
   },
   watch: {
-    "TreeDataPool.treeType": function (newValue) {
+    "TreeDataPool.treeType": function(newValue) {
       if (newValue !== this.treeName) {
-        this.TreeDataPool.cleanTree(this.treeName);
+        this.TreeDataPool.cleanTree(this.treeName)
       }
     },
+    showDevArea: function() {
+      this.$forceUpdate()
+    }
   },
   methods: {
-    handleCreated: function (ztreeObj) {
-      let _this = this;
-      this.ztreeObj = ztreeObj;
-      ztreeObj.expandAll(true);
+    handleCreated: function(ztreeObj) {
+      let _this = this
+      this.ztreeObj = ztreeObj
+      ztreeObj.expandAll(true)
       // onCreated 涓搷浣渮treeObj瀵硅薄灞曞紑绗竴涓妭鐐�
       // ztreeObj.expandNode(ztreeObj.getNodes()[0], true);
 
       // 鎽勫儚鏈洪厤缃垏鎹㈡椂, 璁剧疆閫変腑鐘舵��
       if (this.TreeDataPool.selectedNode.id) {
         // 鍙栨秷鎵�鏈夊閫夌殑鑺傜偣,浠呬繚鐣欏綋鍓嶅崟閫夌殑鑺傜偣
-        this.TreeDataPool.selectedNodes = [this.TreeDataPool.selectedNode.id];
-        this.curNodeTid = this.TreeDataPool.selectedNode.tId;
+        this.TreeDataPool.selectedNodes = [this.TreeDataPool.selectedNode.id]
+        this.curNodeTid = this.TreeDataPool.selectedNode.tId
         //鎽勫儚鏈轰俊鎭洿鏂颁俊鎭悗锛屽鏋滆妭鐐逛綅缃湁鍙榯Id灏变笉鍑嗕簡,this.TreeDataPool.selectedNode姝ゆ椂杩樻槸鏃х殑淇℃伅
-        let ztreeNodes = ztreeObj.getNodes();
+        let ztreeNodes = ztreeObj.getNodes()
         //var curNodeTid = '';
-        _this.findTidByIdFromArr(ztreeNodes);
-        this.TreeDataPool.selectedNode.tId = _this.curNodeTid;
-        let node = this.ztreeObj.getNodeByTId(
-          this.TreeDataPool.selectedNode.tId
-        );
+        _this.findTidByIdFromArr(ztreeNodes)
+        this.TreeDataPool.selectedNode.tId = _this.curNodeTid
+        let node = this.ztreeObj.getNodeByTId(this.TreeDataPool.selectedNode.tId)
 
         // 澶氶�夋椂, 閫変腑鍗曢�夊崟鍑荤殑鑺傜偣
         if (this.TreeDataPool.multiple) {
-          this.ztreeObj.checkAllNodes(false);
-          this.ztreeObj.checkNode(node, true, false, false);
+          this.ztreeObj.checkAllNodes(false)
+          this.ztreeObj.checkNode(node, true, false, false)
         }
 
-        this.ztreeObj.selectNode(node, false, true);
+        this.ztreeObj.selectNode(node, false, true)
       }
+    },
+    chooseTab(item) {
+      this.$emit("saveTree", this.activeTabObj)
+      setTimeout(() => {
+        this.activeTabObj = item
+      }, 100)
     },
 
     findTidByIdFromArr(arr) {
-      let len = arr.length;
-      let _this = this;
+      let len = arr.length
+      let _this = this
       for (var i = 0; i < len; i++) {
         if (arr[i].id == this.TreeDataPool.selectedNode.id) {
-          _this.curNodeTid = arr[i].tId;
-          break;
+          _this.curNodeTid = arr[i].tId
+          break
         }
         if (arr[i].children) {
-          this.findTidByIdFromArr(arr[i].children);
+          this.findTidByIdFromArr(arr[i].children)
         }
       }
     },
     onDblClick(evt, treeId, item) {
       if (item.type !== "4" || this.app !== "Camera") {
-        return;
+        return
       }
-      this.TreeDataPool.activeVideoId = item.id;
-      let videoArr = this.TreeDataPool.videoArr;
-      let nullVideoIndex = "";
+      this.TreeDataPool.activeVideoId = item.id
+      let videoArr = this.TreeDataPool.videoArr
+      let nullVideoIndex = ""
 
       if (
         this.TreeDataPool.activeForceChoose &&
         this.TreeDataPool.activeVideoIndex !== "" &&
         this.TreeDataPool.activeVideoIndex <= videoArr.length - 1
       ) {
-        this.TreeDataPool.setVideoArr(
-          this.TreeDataPool.activeVideoIndex,
-          undefined,
-          this
-        );
+        this.TreeDataPool.setVideoArr(this.TreeDataPool.activeVideoIndex, undefined, this)
         this.$nextTick(() => {
-          this.TreeDataPool.setVideoArr(
-            this.TreeDataPool.activeVideoIndex,
-            item,
-            this
-          );
-        });
-        return;
+          this.TreeDataPool.setVideoArr(this.TreeDataPool.activeVideoIndex, item, this)
+        })
+        return
       }
 
       for (let i = 0; i < videoArr.length; i++) {
         // eslint-disable-next-line
-        if (
-          videoArr[i] === "" ||
-          videoArr[i] === undefined ||
-          videoArr[i] === null
-        ) {
-          nullVideoIndex = i;
-          break;
+        if (videoArr[i] === "" || videoArr[i] === undefined || videoArr[i] === null) {
+          nullVideoIndex = i
+          break
         } else {
-          nullVideoIndex = "";
+          nullVideoIndex = ""
         }
       }
       if (nullVideoIndex === "") {
-        this.TreeDataPool.setVideoArr(
-          this.TreeDataPool.activeVideoIndex,
-          undefined,
-          this
-        );
+        this.TreeDataPool.setVideoArr(this.TreeDataPool.activeVideoIndex, undefined, this)
         this.$nextTick(() => {
-          this.TreeDataPool.setVideoArr(
-            this.TreeDataPool.activeVideoIndex,
-            item,
-            this
-          );
-        });
+          this.TreeDataPool.setVideoArr(this.TreeDataPool.activeVideoIndex, item, this)
+        })
       } else {
         // this.TreeDataPool.setVideoArr(this.TreeDataPool.activeVideoIndex, undefined, this);
         this.$nextTick(() => {
-          this.TreeDataPool.setVideoArr(
-            this.TreeDataPool.activeVideoIndex,
-            item,
-            this
-          );
-        });
-        this.TreeDataPool.activeVideoIndex = nullVideoIndex;
+          this.TreeDataPool.setVideoArr(this.TreeDataPool.activeVideoIndex, item, this)
+        })
+        this.TreeDataPool.activeVideoIndex = nullVideoIndex
       }
     },
     addCamera(node) {
-      this.$emit("addDevice", node);
+      this.$emit("addDevice", node)
     },
     importCameras(node) {
-      this.$emit("import", node);
+      this.$emit("import", node)
     },
     addNode(node) {
       this.dialogForm = {
         text: "",
         method: "add",
-        node: node.id,
-      };
-      this.showDialogBox(event);
+        node: node.id
+      }
+      this.showDialogBox(event)
     },
     editNode(node) {
       this.dialogForm = {
@@ -248,56 +263,57 @@
         method: "edit",
         node: node.id,
         alias: node.alias,
-        gb28181: this.gb28181,
-      };
-      this.showDialogBox(event);
+        gb28181: this.gb28181
+      }
+      this.showDialogBox(event)
     },
     delNode(node) {
-      this.TreeDataPool.del(node.id);
+      this.TreeDataPool.del(node.id)
     },
     submitForm() {
       // 鎻愪氦鏂板鎴栬�呯紪杈戝尯鍩熻妭鐐硅〃鍗�
       this.$refs.dialogForm.validate((valid) => {
         if (valid) {
           if (this.dialogForm.method == "add") {
-            this.TreeDataPool.add(this.dialogForm.text, this.dialogForm.node);
+            this.TreeDataPool.add(this.dialogForm.text, this.dialogForm.node)
           } else if (this.dialogForm.method == "edit") {
             this.TreeDataPool.update(
               this.dialogForm.text,
               this.dialogForm.node,
               this.gb28181 ? this.dialogForm.text : "",
               this.dialogForm.gb28181
-            );
+            )
           }
         } else {
-          return false;
+          return false
         }
-      });
-      this.hideDialogBox();
+      })
+      this.hideDialogBox()
     },
     hideDialogBox() {
-      this.showDialog = false;
-      this.dialogForm = { text: "" };
+      this.showDialog = false
+      this.dialogForm = { text: "" }
     },
     showDialogBox(event) {
-      let { clientX = 0, offsetY = 0 } = event;
+      let { clientX = 0, offsetY = 0 } = event
       // this.clientX = clientX - 120;
-      this.clientX = 50;
-      this.clientY = offsetY;
-      this.showDialog = true;
+      this.clientX = 50
+      this.clientY = offsetY
+      this.showDialog = true
     },
     itemClick(evt, treeId, treeNode) {
-      this.TreeDataPool.selectedNode = treeNode;
-      this.TreeDataPool.treeType = this.treeName;
+      this.TreeDataPool.selectedNode = treeNode
+      this.TreeDataPool.activeNode = treeNode
+      this.TreeDataPool.treeType = this.treeName
 
       // 澶氶��
       if (this.TreeDataPool.multiple) {
         // 鍗曞嚮鏌愪竴涓妭鐐规枃瀛楁椂 鍙栨秷鎵�鏈夊嬀閫夌姸鎬� 鐒跺悗閫変腑鑷韩
-        this.ztreeObj.checkAllNodes(false);
-        this.ztreeObj.checkNode(treeNode, true, false, false);
+        this.ztreeObj.checkAllNodes(false)
+        this.ztreeObj.checkNode(treeNode, true, false, false)
       }
 
-      this.TreeDataPool.updateZTreeCheckNodes([treeNode]);
+      this.TreeDataPool.updateZTreeCheckNodes([treeNode])
     },
     // itemClick(treeNode) {
     //   this.TreeDataPool.selectedNode = treeNode;
@@ -313,43 +329,68 @@
     //   this.TreeDataPool.updateZTreeCheckNodes([treeNode]);
     // },
     itemCheck(evt, treeId, treeNode) {
-      this.TreeDataPool.selectedNode = treeNode;
-      this.TreeDataPool.treeType = this.treeName;
-      debugger;
+      if (treeNode) {
+        this.TreeDataPool.selectedNode = treeNode
+      }
+      this.TreeDataPool.treeType = this.treeName
+
       // 澶氶��
       // this.ztreeObj.checkNode(treeNode, true, false, false);
-      let checkedNodes = this.ztreeObj.getCheckedNodes(true);
-      this.TreeDataPool.updateZTreeCheckNodes(checkedNodes);
+      let checkedNodes = this.ztreeObj.getCheckedNodes(true)
+      this.TreeDataPool.updateZTreeCheckNodes(checkedNodes)
 
       // 瀹炴椂缁熻閫変腑涓暟
-      this.TreeDataPool.countCheckedNodes(checkedNodes);
+      this.TreeDataPool.countCheckedNodes(checkedNodes)
 
       // 淇濆瓨涓�浠芥暟鎹�
-      this.TreeDataPool.activeTreeData = this.ztreeObj.getNodes();
+      this.TreeDataPool.activeTreeData = this.ztreeObj.getNodes()
+      this.$emit("itemChecked", treeNode)
     },
     //灞曞紑
     itemExpand(e, id, node) {
-      delete this.TreeDataPool.foldNodeList[node.id];
+      delete this.TreeDataPool.foldNodeList[node.id]
     },
     // 鎶樺彔
     itemCollapse(e, id, node) {
-      this.TreeDataPool.foldNodeList[node.id] = true;
+      this.TreeDataPool.foldNodeList[node.id] = true
     },
     dropNode(node, item, draggedItem, e) {
       // console.log('dropNode', node, item, draggedItem);
-      this.TreeDataPool.dropNode(draggedItem.id, item.id);
+      this.TreeDataPool.dropNode(draggedItem.id, item.id)
     },
     showCameraPic(nodeId) {
-      this.TreeDataPool.showBaseImage(nodeId);
+      this.TreeDataPool.showBaseImage(nodeId)
     },
-  },
-};
+    updateNodes(ids) {
+      // 鍙栨秷鎵�鏈夐�変腑鐘舵��
+      this.ztreeObj.checkAllNodes(false)
+
+      // nodes 杞暟缁�
+      let treeNodes = this.ztreeObj.getNodes()
+      let nodeArry = this.ztreeObj.transformToArray(treeNodes)
+
+      // 鍒ゆ柇鏄惁琚�変腑
+      for (let i = 0; i < nodeArry.length; i++) {
+        if (ids.indexOf(nodeArry[i].id) > -1) {
+          this.ztreeObj.checkNode(nodeArry[i], true, false, false)
+        }
+      }
+      let checkedNodes = this.ztreeObj.getCheckedNodes(true)
+      this.TreeDataPool.updateZTreeCheckNodes(checkedNodes)
+    }
+  }
+}
 </script>
 <style lang="scss" scoped>
+.devArea {
+}
+
 .dialog-box {
-  position: absolute;
-  width: 220px;
-  z-index: 1;
+  top: 415px;
+  left: 43px;
+  position: fixed;
+  width: 260px;
+  z-index: 3;
 }
 .dialog-box-bg {
   position: absolute;
@@ -403,9 +444,14 @@
 }
 .tree-menu {
   // max-width: 350px;
+  min-height: 92px;
   overflow-x: auto;
   overflow-y: hidden;
   margin-bottom: 4px;
+  max-height: 70vh;
+}
+.empty {
+  line-height: 76px;
 }
 .tree-menu::-webkit-scrollbar {
   /*婊氬姩鏉℃暣浣撴牱寮�*/
@@ -430,4 +476,75 @@
 .tree-menu:hover {
   overflow-y: auto;
 }
+
+.devArea {
+  position: relative;
+  margin: 20px;
+  background: #f0f5fa;
+  padding: 0 40px;
+
+  .swiper-slide {
+    display: flex;
+    align-items: center;
+    height: 46px;
+
+    &.active {
+      .tab {
+        color: #0064ff;
+      }
+      border-bottom: 2px solid #0064ff;
+    }
+
+    .tab {
+      margin: 0 12px 0 24px;
+      font-size: 14px;
+      color: #666;
+      cursor: pointer;
+    }
+
+    .iconfont {
+      font-size: 12px;
+      color: #dbdbdb;
+    }
+  }
+
+  .swiper-pre-border {
+    position: absolute;
+    padding-bottom: 13px;
+    padding-right: 18px;
+    top: 12px;
+    left: 10px;
+    cursor: pointer;
+
+    i {
+      font-size: 16px;
+      color: #999;
+    }
+  }
+
+  .swiper-next-border {
+    position: absolute;
+    top: 12px;
+    right: 10px;
+    padding-bottom: 13px;
+    padding-left: 18px;
+    cursor: pointer;
+
+    i {
+      font-size: 16px;
+      color: #999;
+    }
+  }
+
+  .swiper-button-disabled {
+    cursor: not-allowed;
+    i {
+      color: #dbdbdb;
+    }
+  }
+
+  .del {
+    cursor: pointer;
+  }
+}
 </style>

--
Gitblit v1.8.0