ZZJ
2021-11-09 ccee429d379e0108b7445f72ade8d97c110a6fb3
src/Pool/TreeData.ts
@@ -1,235 +1,278 @@
import {
  getLocalCameraTree,
  getGB28181CameraTree,
  getClusterTree,
  addAreaTreeData,
  delAreaTreeData,
  updateAreaTreeData,
  getGb28181Pool,
  refreshGB28181Tree,
  updateCameraArea
} from "@/api/area";
import {
  findAllFile,
  show,
  changeEnable
} from "@/api/localVedio";
  updateCameraArea,
  getCameraBaseImage
} from '@/api/area'
export default class TreeDataPool {
  public openeds: Array<boolean>;
  public treeData: Array<object>;
  public gb28181Data: Array<object>;
  public treeDataPure: Array<object>;
  public gb28181DataPure: Array<object>;
  public videoArr: Array<string | undefined | object>;
  public searchCamType: number;
  public searchInput: string;
  public activeVideoIndex: number | string;
  public activeVideoId: number | string;
  public activeForceChoose: boolean;
  public readonly: boolean;
  public gbReadonly: boolean;
  public multiple: boolean;
  public showTreeBox: boolean;
  public selectedNodes: Array<string>;
  public selectedNode: any;
  public openeds: Array<boolean>
  public activeTreeData: Array<object>
  public treeData: Array<object>
  public clusterData: Array<object>
  public gb28181Data: Array<object>
  public treeDataPure: Array<object>
  public gb28181DataPure: Array<object>
  public clusterDataPure: Array<object>
  public videoArr: Array<string | undefined | object>
  public searchCamType: number
  public searchInput: string
  public activeVideoIndex: number | string
  public activeVideoId: number | string
  public activeForceChoose: boolean
  public readonly: boolean
  public gbReadonly: boolean
  public multiple: boolean
  public searchFrom: string = ''
  public showTreeBox: boolean
  public selectedNodes: Array<string>
  public selectedNode: any
  // 记录当前操作的树
  public treeType: string;
  public treeType: string
  // 记录收起的节点
  public foldNodeList: object;
  public foldNodeList: object
  //记录左侧tab:activeName
  public treeActiveName: string;
  //本地视频:视频分析处理
  public vedioAnaliyseSwitch: boolean;
  //本地视频列表
  public localVedioList: Array<any>;
  //本地视频当前页
  public localCurrentPage: number;
  //本地视频每页查询20条
  public localPageSize: number;
  //本地视频总条数
  public localTotal: number;
  //勾选的本地视频
  public checkedLocalVedio: Array<any>;
  //当前选中的本地视频
  public clickLocalVideo: object;
  public treeActiveName: string
  //控制开始、暂停按钮显示状态
  public btnStaus: string;
  public btnStaus: string
  //本地视频类型
  public searchLocalType: number;
  public searchLocalType: number
  //记录复制的摄像机id
  public ctrlCameraId: string;
  public ctrlCameraId: string
  //记录复制的摄像机name
  public ctrlCameraName: string;
  public ctrlCameraName: string
  // 是否使用ztree
  public zTree: boolean
  public checkedTreeNode: Array<object>
  // 选中的摄像机个数
  public gb28181CheckedCount: number
  // 总摄像机个数
  public gb28181ChildNodeCount: number
  // 国标摄像机池的底图
  public cameraNameForBaseImage: string
  public gb28181CameraBaseImage: string
  public baseImageLoading: boolean
  constructor() {
    this.openeds = [true, true, false];
    this.treeData = [];
    this.gb28181Data = [];
    this.treeDataPure = [];
    this.gb28181DataPure = [];
    this.videoArr = [""];
    this.searchCamType = 0;
    this.searchInput = "";
    this.activeVideoIndex = "";
    this.activeVideoId = "";
    this.activeForceChoose = false;
    this.showTreeBox = true;
    this.readonly = true;
    this.gbReadonly = true;
    this.multiple = false;
    this.selectedNodes = [];
    this.selectedNode = {};
    this.treeType = "";
    this.foldNodeList = {};
    this.vedioAnaliyseSwitch = false;
    this.treeActiveName = "camera";
    this.searchLocalType = 0;
    this.localVedioList = [];
    this.checkedLocalVedio = [];
    this.clickLocalVideo = {};
    this.openeds = [true, true, false]
    this.activeTreeData = []
    this.treeData = []
    this.gb28181Data = []
    this.clusterData = []
    this.treeDataPure = []
    this.gb28181DataPure = []
    this.clusterDataPure = []
    this.videoArr = ['']
    this.searchCamType = 0
    this.searchInput = ''
    this.activeVideoIndex = ''
    this.activeVideoId = ''
    this.activeForceChoose = false
    this.showTreeBox = true
    this.readonly = true
    this.gbReadonly = true
    this.multiple = false
    this.selectedNodes = []
    this.selectedNode = {}
    this.treeType = ''
    this.foldNodeList = {}
    this.treeActiveName = 'camera'
    this.searchLocalType = 0
    //1:暂停状态;2:等待状态;3:置灰
    this.btnStaus = "3";
    this.localCurrentPage = 1;
    this.localPageSize = 20;
    this.localTotal = 0;
    this.ctrlCameraId = "";
    this.ctrlCameraName = "";
    this.btnStaus = '3'
    this.ctrlCameraId = ''
    this.ctrlCameraName = ''
    this.zTree = false
    this.checkedTreeNode = []
    this.gb28181CheckedCount = 0
    this.gb28181ChildNodeCount = 0
    this.cameraNameForBaseImage = ""
    this.gb28181CameraBaseImage = ""
    this.baseImageLoading = false
  }
  setVideoArr(index: number, value: object, vue: any): void {
    vue.$set(this.videoArr, index, value);
    this.activeForceChoose = false;
    vue.$set(this.videoArr, index, value)
    this.activeForceChoose = false
  }
  updateSelectedNodes() {
    this.selectedNodes = [];
    this.selectedNodes = []
    if (!this.multiple) {
      this.selectedNodes = [this.selectedNode.id];
      return;
      this.selectedNodes = [this.selectedNode.id]
      return
    }
    let _selected = this.selectedNodes;
    let _selected = this.selectedNodes
    function nodeFilter(node: any) {
      if (node.type === "4" && node.selected) {
        _selected.push(node.id);
      if (node.type === '4' && node.selected) {
        _selected.push(node.id)
      }
      if (node.children) {
        node.children.forEach((n: any) => {
          nodeFilter(n);
        });
          nodeFilter(n)
        })
      }
    }
    if (this.selectedNode.cameraType === 0) {
      this.treeData.forEach((n: any) => {
        nodeFilter(n);
      });
      //摄像机树
      if (this.treeActiveName == 'camera') {
        this.treeData.forEach((n: any) => {
          nodeFilter(n)
        })
      } else if (this.treeActiveName == 'cluster') {
        //集群树
        this.clusterData.forEach((n: any) => {
          nodeFilter(n)
        })
      }
    }
    if (this.selectedNode.cameraType === 1) {
      this.gb28181Data.forEach((n: any) => {
        nodeFilter(n);
      });
        nodeFilter(n)
      })
    }
    // if (this.selectedNode.cameraType === -1) {
    //   this.clusterData.forEach((n: any) => {
    //     nodeFilter(n);
    //   });
    // }
  }
  updateZTreeCheckNodes(checkedNodes) {
    let _this = this
    _this.selectedNodes = []
    if (!_this.multiple) {
      _this.selectedNodes = [checkedNodes.id]
      return
    }
    function nodeFilter(node: any) {
      if (node.type === '4' && (node.selected || node.checked)) {
        _this.selectedNodes.push(node.id)
      }
      if (node.children) {
        node.children.forEach((n: any) => {
          nodeFilter(n)
        })
      }
    }
    checkedNodes.forEach((n: any) => {
      nodeFilter(n)
    })
  }
  getCameraInfoByIp(ipaddr) {
    let camera = null;
    let camera = null
    function nodeFilter(node: any) {
      if (node.rtsp && node.rtsp.indexOf(ipaddr) != -1) {
        camera = node;
        return;
        camera = node
        return
      }
      if (node.children) {
        node.children.forEach((n: any) => {
          nodeFilter(n);
        });
          nodeFilter(n)
        })
      }
    }
    this.treeData.forEach((n: any) => {
      nodeFilter(n);
    });
      nodeFilter(n)
    })
    if (!camera) {
      this.gb28181Data.forEach((n: any) => {
        nodeFilter(n);
      });
        nodeFilter(n)
      })
    }
    return camera;
    return camera
  }
  getCameraInfoById(id) {
    let camera = null;
    let camera = null
    function nodeFilter(node: any) {
      if (node.id === id) {
        camera = node;
        return;
        camera = node
        return
      }
      if (node.children) {
        node.children.forEach((n: any) => {
          nodeFilter(n);
        });
          nodeFilter(n)
        })
      }
    }
    this.treeData.forEach((n: any) => {
      nodeFilter(n);
    });
      nodeFilter(n)
    })
    if (!camera) {
      this.gb28181Data.forEach((n: any) => {
        nodeFilter(n);
      });
        nodeFilter(n)
      })
    }
    return camera;
    return camera
  }
  getParent(id: string, isGB: boolean): string {
    let parent = "0";
    let parent = '0'
    function nodeFilter(node: Array<any>): any {
      for (let i = 0; i < node.length; i++) {
        if (node[i].id == id) {
          return true;
          return true
        }
        if (node[i].children && node[i].children.length > 0) {
          if (nodeFilter(node[i].children)) {
            parent = node[i].id;
            parent = node[i].id
          }
        }
      }
      return false;
      return false
    }
    if (isGB) {
      nodeFilter(this.gb28181Data);
      nodeFilter(this.gb28181Data)
    } else {
      nodeFilter(this.treeData);
      nodeFilter(this.treeData)
    }
    return parent;
    return parent
  }
  clean() {
    this.treeData = JSON.parse(JSON.stringify(this.treeDataPure));
    this.gb28181Data = JSON.parse(JSON.stringify(this.gb28181DataPure));
    this.treeData = JSON.parse(JSON.stringify(this.treeDataPure))
    this.gb28181Data = JSON.parse(JSON.stringify(this.gb28181DataPure))
    this.isFold(this.treeData)
    this.isFold(this.gb28181Data)
    this.selectedNodes = [];
    this.selectedNode = {};
    this.cleanLocalVedio();
    this.selectedNodes = []
    this.selectedNode = {}
  }
  cleanTree(tree) {
    if (tree === "localTree") {
      this.treeData = JSON.parse(JSON.stringify(this.treeDataPure));
    if (tree === 'localTree') {
      this.treeData = JSON.parse(JSON.stringify(this.treeDataPure))
    }
    if (tree === "gb28182Tree") {
      this.gb28181Data = JSON.parse(JSON.stringify(this.gb28181DataPure));
    if (tree === 'gb28182Tree') {
      this.gb28181Data = JSON.parse(JSON.stringify(this.gb28181DataPure))
    }
  }
@@ -238,8 +281,13 @@
      return
    }
    node.forEach(n => {
      // vue-js-tree 默认展开,控制部分折叠. z-tree 默认折叠, 控制部分展开
      if (this.foldNodeList[n.id]) {
        n.opened = false;
        if (this.zTree) {
          n.open = false
        } else {
          n.opened = false
        }
      }
      if (n.children && n.children.length > 0) {
        this.isFold(n.children)
@@ -255,39 +303,75 @@
      if (n.children && n.children.length > 0) {
        this.setDropDisable(n.children)
      } else {
        if (n.type === "4") {
          n.dropDisabled = true;
        if (n.type === '4') {
          n.dropDisabled = true
        }
      }
    })
  }
  sortTreeData(node) {
    if (!node) {
      return
    }
    node.sort(function (obj1: any, obj2: any) {
      var val1 = obj1.name
      var val2 = obj2.name
      if (val1 < val2) {
        return -1
      } else if (val1 > val2) {
        return 1
      } else {
        return 0
      }
    })
    node.forEach(n => {
      if (n.children && n.children.length > 0) {
        if (this.zTree) {
          n.open = true
        }
        this.sortTreeData(n.children)
      }
    })
  }
  async fetchLocalTree() {
    const rsp: any = await getLocalCameraTree({
    let params: any = {
      searchType: this.searchCamType,
      cameraName: this.searchInput
    });
      //isPlatform: 1
    }
    if (this.searchFrom == 'cluster') {
      params.isPlatform = 1
    }
    const rsp: any = await getLocalCameraTree(params)
    if (rsp && rsp.success) {
      this.treeData = rsp.data ? rsp.data : []
      if (this.treeData && this.treeData.length > 0) {
        this.treeData.sort(function (obj1: any, obj2: any) {
          var val1 = obj1.id;
          var val2 = obj2.id;
          if (val1 < val2) {
            return -1;
          } else if (val1 > val2) {
            return 1;
          } else {
            return 0;
          }
        });
        this.sortTreeData(this.treeData)
      }
      // 设置禁止拖拽摄像机到摄像机节点
      this.setDropDisable(this.treeData)
      this.treeDataPure = JSON.parse(JSON.stringify(this.treeData));
      this.treeDataPure = JSON.parse(JSON.stringify(this.treeData))
      this.isFold(this.treeData)
    }
  }
  async fetchClusterTree() {
    const rsp: any = await getClusterTree({
      searchType: this.searchCamType,
      cameraName: this.searchInput
    })
    if (rsp && rsp.success) {
      this.clusterData = rsp.data ? rsp.data : []
      if (this.clusterData && this.clusterData.length > 0) {
        this.sortTreeData(this.clusterData)
      }
      this.clusterDataPure = JSON.parse(JSON.stringify(this.clusterData))
      this.isFold(this.clusterData)
    }
  }
@@ -295,25 +379,15 @@
    const rsp: any = await getGB28181CameraTree({
      searchType: this.searchCamType,
      cameraName: this.searchInput
    });
    })
    if (rsp && rsp.success) {
      this.gb28181Data = rsp.data ? rsp.data : []
      if (this.gb28181Data && this.gb28181Data.length > 0) {
        this.gb28181Data.sort(function (obj1: any, obj2: any) {
          var val1 = obj1.id;
          var val2 = obj2.id;
          if (val1 < val2) {
            return -1;
          } else if (val1 > val2) {
            return 1;
          } else {
            return 0;
          }
        });
        this.sortTreeData(this.gb28181Data)
      }
      this.gb28181DataPure = JSON.parse(JSON.stringify(this.gb28181Data));
      this.gb28181DataPure = JSON.parse(JSON.stringify(this.gb28181Data))
      this.isFold(this.gb28181Data)
    }
  }
@@ -325,24 +399,23 @@
    if (this.openeds[1]) {
      this.fetchGbTree()
    }
    this.findAllFile({})
  }
  async add(name: string, parent: string) {
    await addAreaTreeData({
      name: name,
      parentId: parent
    });
    })
    this.fetchTreeData();
    this.fetchTreeData()
  }
  async del(id: string) {
    await delAreaTreeData({
      id: id
    });
    })
    this.fetchTreeData();
    this.fetchTreeData()
  }
  async update(name: string, id: string, alias: string, isGb: boolean) {
@@ -351,9 +424,9 @@
      name: name,
      parentId: this.getParent(id, isGb),
      alias: alias
    });
    })
    this.fetchTreeData();
    this.fetchTreeData()
  }
  async refreshGB28181() {
@@ -361,109 +434,106 @@
    // this.fetchGbTree()
  }
  async findAllFile(params: any) {
    params.fileName = this.searchInput,
      params.type = this.searchLocalType
    params.page = this.localCurrentPage
    params.size = this.localPageSize
    let res: any = await findAllFile(params)
    if (res && res.success) {
      let list = res.data.dataList.map(i => {
        let obj: any = {}
        Object.assign(obj, i)
        if (i.ruleType == 0) {
          obj.iconStatus2 = '0'
        } else {
          obj.iconStatus2 = '1'
        }
        if (!i.snapshot_url) {
          obj.snapshot_url = require('@/assets/nobody.png')
        } else {
          obj.snapshot_url = '/httpImage/' + obj.snapshot_url
        }
        if (i.is_running) {
          obj.iconStatus1 = '1'
        } else if (i.progress == 100) {
          obj.iconStatus1 = '2'
        } else if (i.status == 1 && i.progress == 0 && i.hasRule) {
          obj.iconStatus1 = '3'
        } else if (!i.hasRule && i.progress == 0) {
          obj.iconStatus1 = '4'
        }
        obj.checkStatus = false
        obj.clickStatus = false
        obj.showCheckBox = false
        return obj
      })
      this.localVedioList = list
      this.localTotal = res.data.total
      // console.log(this.localVedioList,this.searchInput,'本地视频列表')
    }
  }
  async show() {
    let res: any = await show()
    if (res && res.success) {
      this.vedioAnaliyseSwitch = res.data.videoEnable
    }
  }
  async changeEnable() {
    let res: any = await changeEnable({
      enable: this.vedioAnaliyseSwitch
    })
  }
  getCheckedFiles() {
    this.checkedLocalVedio = this.localVedioList.filter(i => {
      return i.checkStatus
    })
    this.clickLocalVideo = this.localVedioList.filter(i => {
      return i.clickStatus
    })[0]
    if (this.checkedLocalVedio.length === 0) {
      this.btnStaus = '3'
      return false;
    }
    this.checkedLocalVedio.every((i, index) => {
      let t = ''
      if (i.status == 0 && i.hasRule) {
        t = '1'
      } else if (i.status == 1 && i.hasRule && !i.is_running) {
        t = '2'
      } else {
        t = '3'
      }
      if (index == 0) {
        this.btnStaus = t
      } else {
        if (this.btnStaus !== t) {
          this.btnStaus = '3'
          return false
        }
      }
    })
  }
  filterLocalVideoWell() {
    if (this.localVedioList.length !== 0) {
      this.localVedioList = this.localVedioList.filter(i => {
        return i.progress == 100
      })
    }
  }
  cleanLocalVedio() {
    this.localVedioList.map(i => {
      i.checkStatus = false
      i.clickStatus = false
    })
    this.checkedLocalVedio = []
    this.btnStaus = "3"
  }
  async dropNode(cameraId, areaId) {
  async dropNode(cameraId: string, areaId: string) {
    await updateCameraArea({ cameraId: cameraId, areaId: areaId })
  }
  getAllChildrenNodes(treeNode, arr) {
    for (var i = 0; i < treeNode.length; i++) {
      var sonList = treeNode[i].children;
      if (!sonList) {
        if (treeNode[i].type == "camera") {
          arr.push(treeNode[i]);
          if (treeNode[i].checked) {
            this.gb28181CheckedCount += 1;
          }
        }
      } else {
        this.getAllChildrenNodes(sonList, arr);
      }
    }
    return arr;
  }
  countChildrenNodes(treeNode) {
    let arry = []
    this.getAllChildrenNodes(treeNode, arry)
    return arry.length
  }
  async fetchVideosvrCameras(update: Boolean) {
    let fn = getGb28181Pool
    if (update) {
      fn = refreshGB28181Tree
    }
    const rsp: any = await fn()
    if (rsp && rsp.success) {
      this.selectedNode = {}
      this.treeData = rsp.data ? rsp.data : []
      if (this.treeData && this.treeData.length > 0) {
        this.sortTreeData(this.treeData)
      }
      // 设置禁止拖拽摄像机到摄像机节点
      this.setDropDisable(this.treeData)
      this.isFold(this.treeData)
      this.activeTreeData = this.treeData
      this.gb28181CheckedCount = 0;
      this.gb28181ChildNodeCount = this.countChildrenNodes(this.treeData)
    }
  }
  removeNoCheckedNode(nodes: Array<any>) {
    for (let i = 0; i < nodes.length;) {
      if (!nodes[i].checked) {
        nodes.splice(i, 1)
        continue
      }
      if (nodes[i].children && nodes[i].children.length) {
        this.removeNoCheckedNode(nodes[i].children)
      }
      i++
    }
  }
  countCheckedNodes(nodes: Array<any>) {
    let count = 0
    nodes.forEach(n => {
      if (n.type == "camera") {
        count++
      }
    })
    this.gb28181CheckedCount = count
  }
  newTreeByChecked(nodes: Array<object>) {
    let newTree = JSON.parse(JSON.stringify(nodes))
    this.removeNoCheckedNode(newTree)
    return newTree
  }
  async showBaseImage(node: any) {
    this.baseImageLoading = true
    this.gb28181CameraBaseImage = ""
    this.cameraNameForBaseImage = node.name
    try {
      const rsp: any = await getCameraBaseImage({ id: node.id })
      if (rsp && rsp.data) {
        this.gb28181CameraBaseImage = rsp.data
      }
    } catch (error) {
      console.log(error)
    }
    this.baseImageLoading = false
  }
}