Newer
Older
ganzhou-feidu / src / pages / csdz / videoCloud / index.vue
liyaguang 3 days ago 22 KB 清屏功能修复
<template>
  <div>
    <div class="video-menu">
      <layer-manager :menu-tab="menuTab" :menus="menus" :select="selectIndex === 'layerBtn'" @btnClick="btnClick"
        @menuClick="menuClick" @childrenClick="childrenClick" @changeSelect="changeSelect" />
      <common-btn id="caseBtn" :select="selectIndex === 'caseBtn'" :bg="caseBg" :bg-hover="caseHover" width="5"
        height="5" text-hover="监测事件" @click="btnClick" />
      <common-btn id="offlineBtn" :select="selectIndex === 'offlineBtn'" :bg="offline" :bg-hover="offlineHover"
        width="5" height="5" text-hover="离线视频" @click="btnClick" />
      <common-btn id="energyBtn" :select="selectIndex === 'energyBtn'" :bg="energy" :bg-hover="energyHover" width="5"
        height="5" text-hover="赋能视频" @click="btnClick" />
      <keyword-manager :select="ktSelect === 'keywordBtn'" @changeState="changeState" @handleKeyword="handleKeyword"
        @localPoint="localPoint" :resultList="resultList" />
      <time-manager :select="ktSelect === 'timeBtn'" v-if="selectIndex === 'caseBtn'" @changeState="changeState" />
    </div>
    <!-- 视频弹窗 -->
    <videoPop ref="videopop" v-if="isShowPop" @close="isShowPop = false" />
    <!-- 离线视频 -->
    <offline-video v-if="selectIndex === 'offlineBtn'" :list="markerList" @menuClick="offlineClick" />
    <!-- 赋能视频 -->
    <offline-video v-if="selectIndex === 'energyBtn'" :list="markerList" @menuClick="energyClick" />
    <!-- 监测事件 -->
    <!-- <event-list1 v-if="selectIndex === 'caseBtn' && isShowEvent" :list="eventList" :total="eventTotal"  @menuClick="menuEventClick"
      @close="closeEvent" @changePage="changePage" /> -->
      <list-page
      ref="caseListPage"
      title="监测事件"
      :list="eventList"
      :query="eventParams"
      :total="eventTotal"
      @change="changePage"
      v-show="selectIndex === 'caseBtn' && isShowEvent"
      @close="closeEvent"
      @menuClick="menuEventClick"
      info-url="spy-gktj/spy/spysjlb"/>
    <!-- 事件弹窗 -->
    <eventPop ref="eventpop" v-if="isShowEventPop" @close="isShowEventPop = false" />
  </div>
</template>

<script>
import CommonBtn from "@/components/CommonBtn";
import LayerManager from "@/components/LayerManager";
import KeywordManager from "@/components/KeywordManager";
import TimeManager from "@/components/TimeManager";
import offlineVideo from "./components/offlineVideo.vue";
import eventList1 from "./components/eventList.vue";
import eventPop from "./eventPop.vue";
import ListPage from "@/components/ListPage";
import { showPositin } from '@/utils/freedo/index'
import { getStatistics, getEventList } from '@/api/csdz/videoCloud'
import { clearUpMap, clearResetMap, AddLabelPoint } from '@/utils/freedo'

import videoPop from './videoPop'
export default {
  name: 'VideoCloud',
  components: { TimeManager, KeywordManager, LayerManager, CommonBtn, videoPop, offlineVideo, eventList1, eventPop, ListPage },
  data() {
    return {
      isShowPop: false, // 是否展示点位弹窗
      resultList: [], // 点位搜索列表
      markerList: [], // 点位列表
      showMarker: 'scene', // 当前展示点位
      offlineVideo: [], //离线视频
      eventList: [], // 监测事件
      isShowEvent: false, // 展示监测事件
      isShowEventPop: false, // 是否展示事件弹窗
      ktSelect: '',
      eventParams: {
         pageNo: 1,
         pageSize: 5,
         keywords: '',
      }, // 事件列表查询条件
      eventTotal: 0, // 事件列表条数
      selectIndex: 'layerBtn',
      caseBg: require('@/assets/images/function/视频云/视频检测事件未选中.png'),
      caseHover: require('@/assets/images/function/视频云/视频检测事件选中.png'),
      offline: require('@/assets/images/function/视频云/离线视频点位未选中.png'),
      offlineHover: require('@/assets/images/function/视频云/离线视频点位选中.png'),
      energy: require('@/assets/images/function/视频云/赋能视频点位未选中.png'),
      energyHover: require('@/assets/images/function/视频云/赋能视频点位选中.png'),
      menuTab: [{
        name: '视频场景',
        value: 'scene'
      }, {
        name: '视频类型',
        value: 'type'
      }],
      menus: {
        scene: [
          {
            type: "1", typename: "道路卡口", total: "111",
            children: [
              {
                typename: '道路卡口',
                name: '111道路卡口',
                lng: '114.817018',
                lat: '25.863392',
              },
              {
                typename: '道路卡口',
                name: '222道路卡口',
                lng: '115.083274',
                lat: '25.738548',
              },
              {
                typename: '道路卡口',
                name: '333道路卡口',
                lng: '114.770822',
                lat: '25.805374',
              },
            ]
          },
          {
            type: "2", typename: "工地", total: "111",
            children: [
              {
                typename: "工地",
                name: '111工地',
                lng: '114.928116',
                lat: '25.80921',
              },
              {
                typename: "工地",
                name: '222工地',
                lng: '114.891245',
                lat: '25.809243',
              },
            ]
          },
          {
            type: "3", typename: "园林", total: "111",
            children: [
              {
                typename: "园林",
                name: '111园林',
                lng: '114.767957',
                lat: '25.797636',
              },
            ]
          },
          {
            type: "4", typename: "学校", total: "111",
            children: [
              {
                typename: "学校",
                name: '111学校',
                lng: '114.824897',
                lat: '25.780224',
              },
            ]
          },
          {
            type: "5", typename: "环保", total: "111",
            children: [
              {
                typename: "环保",
                name: '111环保',
                lng: '114.736085',
                lat: '25.809565',
              },
            ]
          },
          {
            type: "6", typename: "车场", total: "111",
            children: [
              {
                typename: "车场",
                name: '111车场',
                lng: '114.764734',
                lat: '25.806341',
              },
            ]
          }
        ],
        type: [
          {
            type: "1", typename: "球机", total: "111",
            children: [
              {
                typename: '球机',
                name: '111球机',
                lng: '114.864044',
                lat: '25.764514',
              },
            ]
          },
          {
            type: "2", typename: "枪机", total: "111",
            children: [
              {
                typename: '枪机',
                name: '111枪机',
                lng: '114.85176',
                lat: '25.765165',
              },
              {
                typename: '枪机',
                name: '222枪机',
                lng: '114.851473',
                lat: '25.76742',
              },
            ]
          },
          {
            type: "3", typename: "半球", total: "111",
            children: [
              {
                typename: '半球',
                name: '半球1',
                lng: '114.844932',
                lat: '25.76742',
              },
              {
                typename: '半球',
                name: '半球2',
                lng: '114.854725',
                lat: '25.772985',
              },
            ]
          },
          {
            type: "4", typename: "AR高点", total: "111",
            children: [
              {
                typename: 'AR高点',
                name: 'AR高点1',
                lng: '114.864405',
                lat: '25.773041',
              },
              {
                typename: 'AR高点',
                name: 'AR高点2',
                lng: '114.869638',
                lat: '25.7769',
              },
            ]
          },
          {
            type: "5", typename: "无人机视频", total: "111",
            children: [
              {
                typename: '无人机视频',
                name: '无人机视频1',
                lng: '114.865548',
                lat: '25.780058',
              },
            ]
          }
        ]
      }
    }
  },
  methods: {
    // 切换展示
    btnClick(e) {
      console.log(e, '123')
      this.isShowPop = false
      this.isShowEvent = false
      this.isShowEventPop = false
      this.selectIndex = e.target.id
      console.log(e.target.id, 'e.target.id')
      if (this.selectIndex !== 'keywordBtn' && this.selectIndex !== 'timeBtn') {
        clearResetMap()
      }
      // 展示点位
      if (this.selectIndex === 'layerBtn') {
        if (this.showMarker === 'scene') {
          this.drawSence()
        }
        else {
          this.drawType()
        }
      }
      else if (this.selectIndex === 'offlineBtn') {
        // 离线视频
        this.drawOffline()
      }
      else if (this.selectIndex === 'energyBtn') {
        // 赋能视频
        this.drawEnable()
      }
      else if (this.selectIndex === 'caseBtn') {
        // 监测事件
        this.isShowEvent = true
        this.fetchEventList(this.eventParams)
      }
    },
    changeState(v) {
      console.log(v, '1111')
      this.ktSelect = v
    },
    // 点击菜单
    menuClick(e) {
      console.log(e, '456')
    },
    // 点击列表二级弹窗
    childrenClick(e) {
      console.log(e)
      //  掉起弹窗
      this.clickIcon({
        _data: {
          data: e
        }
      })
    },
    // 点击点位弹窗
    clickIcon(e) {
      const showPop = (e) => {
        const item = e._data.data
        this.isShowPop = true
        this.$nextTick(() => {
          this.$refs.videopop.initData(item)
        })
      }
      if (this.isShowPop) {
        this.isShowPop = false
        setTimeout(() => {
          showPop(e)
        }, 100);
      }
      else {
        showPop(e)
      }
    },
    // 绘制视频场景
    drawSence() {
      const iconKakou = require('@/assets/images/icon/物联网/卡口在线.png')
      const iconGongdi = require('@/assets/images/icon/工地地图点位/工地已完成.png')
      const iconYuanlin = require('@/assets/images/icon/物联网/环境监测在线.png')
      const iconXuexiao = require('@/assets/images/icon/教育地图点位/学校.png')
      const iconChechang = require('@/assets/images/icon/视频云/停车场.png')
      const icondict = {
        道路卡口: iconKakou,
        工地: iconGongdi,
        园林: iconYuanlin,
        学校: iconXuexiao,
        环保: iconYuanlin,
        车场: iconChechang,
      }
      // getStatistics().then(res => {
      //   console.log(res.data, '视频云')
      // })
      // 绘制所有点位
      const markerList = []
      this.menus.scene.forEach((item) => {
        if (item.children) {
          item.children.forEach(citem => {
            markerList.push(citem)
          })
        }
      })
      markerList.forEach(item => {
        AddLabelPoint(
          item.id || new Date().getTime(),
          item.name,
          icondict[item.typename],
          [item.lng, item.lat, 0], 'gd', item,
          this.clickIcon
        )
      })
      this.markerList = markerList
    },
    // 绘制视频类型
    drawType() {
      const iconQiuji = require('@/assets/images/icon/视频云/球机未赋能在线.png')
      const iconQiangji = require('@/assets/images/icon/视频云/枪机未赋能在线.png')
      const iconBanqiu = require('@/assets/images/icon/视频云/半球机未赋能在线.png')
      const iconAR = require('@/assets/images/icon/视频云/AR未赋能在线.png')
      const iconWurenji = require('@/assets/images/icon/视频云/无人机未赋能在线.png')
      const icondict = {
        球机: iconQiuji,
        枪机: iconQiangji,
        半球: iconBanqiu,
        AR高点: iconAR,
        无人机视频: iconWurenji,
      }
      // 绘制所有点位
      const markerList = []
      this.menus.type.forEach((item) => {
        if (item.children) {
          item.children.forEach(citem => {
            markerList.push(citem)
          })
        }
      })
      markerList.forEach(item => {
        AddLabelPoint(
          item.id || new Date().getTime(),
          item.name,
          icondict[item.typename],
          [item.lng, item.lat, 0], 'gd', item,
          this.clickIcon
        )
      })
      this.markerList = markerList
    },
    // 选中菜单切换
    changeSelect(e) {
      this.showMarker = e
      clearResetMap()
      this.isShowPop = false
      if (e === 'scene') {
        this.drawSence()
      }
      else {
        this.drawType()
      }
    },
    // 点维搜索
    handleKeyword(e) {
      console.log(e, '点位搜索')
      clearResetMap()
      this.resultList = this.markerList.filter((item) => item.name.includes(e))
      const iconQiuji = require('@/assets/images/icon/视频云/球机未赋能在线.png')
      const iconQiangji = require('@/assets/images/icon/视频云/枪机未赋能在线.png')
      const iconBanqiu = require('@/assets/images/icon/视频云/半球机未赋能在线.png')
      const iconAR = require('@/assets/images/icon/视频云/AR未赋能在线.png')
      const iconWurenji = require('@/assets/images/icon/视频云/无人机未赋能在线.png')
      const iconKakou = require('@/assets/images/icon/物联网/卡口在线.png')
      const iconGongdi = require('@/assets/images/icon/工地地图点位/工地已完成.png')
      const iconYuanlin = require('@/assets/images/icon/物联网/环境监测在线.png')
      const iconXuexiao = require('@/assets/images/icon/教育地图点位/学校.png')
      const iconChechang = require('@/assets/images/icon/视频云/停车场.png')
      const icondict = {
        球机: iconQiuji,
        枪机: iconQiangji,
        半球: iconBanqiu,
        AR高点: iconAR,
        无人机视频: iconWurenji,
        道路卡口: iconKakou,
        工地: iconGongdi,
        园林: iconYuanlin,
        学校: iconXuexiao,
        环保: iconYuanlin,
        车场: iconChechang,
      }
      this.resultList.forEach(item => {
        AddLabelPoint(
          item.id || new Date().getTime(),
          item.name,
          icondict[item.typename],
          [item.lng, item.lat, 0], 'gd', item,
          this.clickIcon
        )
      })
    },
    // 搜索点位点击
    localPoint(e) {
      this.childrenClick(e)
    },
    // 绘制离线视频
    drawOffline() {
      this.markerList = []
      const iconQiuji = require('@/assets/images/icon/视频云/球机未赋能离线.png')
      const iconQiangji = require('@/assets/images/icon/视频云/枪机未赋能离线.png')
      const iconBanqiu = require('@/assets/images/icon/视频云/半球机未赋能离线.png')
      const iconAR = require('@/assets/images/icon/视频云/AR未赋能离线.png')
      const iconWurenji = require('@/assets/images/icon/视频云/无人机未赋能离线.png')
      const iconKakou = require('@/assets/images/icon/物联网/卡口离线.png')
      const iconGongdi = require('@/assets/images/icon/工地地图点位/工地已完成.png')
      const iconYuanlin = require('@/assets/images/icon/物联网/环境监测离线.png')
      const iconXuexiao = require('@/assets/images/icon/教育地图点位/教育设备-摄像机离线.png')
      const iconChechang = require('@/assets/images/icon/视频云/停车场离线.png')
      const icondict = {
        球机: iconQiuji,
        枪机: iconQiangji,
        半球: iconBanqiu,
        AR高点: iconAR,
        无人机视频: iconWurenji,
        道路卡口: iconKakou,
        工地: iconGongdi,
        园林: iconYuanlin,
        学校: iconXuexiao,
        环保: iconYuanlin,
        车场: iconChechang,
      }
      const markerList = [
        {
          typename: '无人机视频',
          name: '222无人机',
          lng: '114.865548',
          lat: '25.780058',
        },
        {
          typename: '无人机视频',
          name: '无人机1',
          lng: '114.865528',
          lat: '25.780258',
        },
        {
          typename: '道路卡口',
          name: '222道路卡口',
          lng: '115.083274',
          lat: '25.738548',
        },
        {
          typename: '枪机',
          name: '111枪机',
          lng: '114.853962',
          lat: '25.725462',
        },
        {
          typename: '球机',
          name: '111球机',
          lng: '114.790806',
          lat: '25.734629',
        },

      ]
      this.markerList = markerList
      this.markerList.forEach(item => {
        AddLabelPoint(
          item.id || new Date().getTime(),
          item.name,
          icondict[item.typename],
          [item.lng, item.lat, 0], 'gd', item,
          this.offlineClick
        )
      })
    },
    // 离线视频点击
    offlineClick(e) {
      this.childrenClick({...e._data.data, status: 'offline'})
    },
    // 绘制赋能视频
    drawEnable() {
      this.markerList = []
      const iconQiuji = require('@/assets/images/icon/视频云/球机赋能在线.png')
      const iconQiangji = require('@/assets/images/icon/视频云/枪机赋能在线.png')
      const iconBanqiu = require('@/assets/images/icon/视频云/半球机赋能在线.png')
      const iconAR = require('@/assets/images/icon/视频云/AR赋能在线.png')
      const iconWurenji = require('@/assets/images/icon/视频云/无人机赋能在线.png')
      const iconKakou = require('@/assets/images/icon/物联网/卡口在线.png')
      const iconGongdi = require('@/assets/images/icon/工地地图点位/工地已完成.png')
      const iconYuanlin = require('@/assets/images/icon/物联网/环境监测在线.png')
      const iconXuexiao = require('@/assets/images/icon/教育地图点位/学校.png')
      const iconChechang = require('@/assets/images/icon/视频云/停车场.png')
      const icondict = {
        球机: iconQiuji,
        枪机: iconQiangji,
        半球: iconBanqiu,
        AR高点: iconAR,
        无人机视频: iconWurenji,
        道路卡口: iconKakou,
        工地: iconGongdi,
        园林: iconYuanlin,
        学校: iconXuexiao,
        环保: iconYuanlin,
        车场: iconChechang,
      }
      let markerList = [
        {
          typename: '球机',
          name: '111球机',
          lng: '114.790806',
          lat: '25.734629',
        },
        {
          typename: 'AR高点',
          name: '111AR高点',
          lng: '114.839667',
          lat: '25.744501',
        },
        {
          typename: '车场',
          name: '111AR车场',
          lng: '114.894542',
          lat: '25.731066',
        },
        {
          typename: '工地',
          name: '工地1',
          lng: '114.771855',
          lat: '25.747618',
        },
      ]
      this.markerList = markerList
      this.markerList.forEach(item => {
        AddLabelPoint(
          item.id || new Date().getTime(),
          item.name,
          icondict[item.typename],
          [item.lng, item.lat, 0], 'gd', item,
          this.clickIcon
        )
      })
    },
    // 赋能视频点击
    energyClick(e) {
      this.childrenClick(e)
    },
    // 获取事件列表
    fetchEventList(params) {
      const icon = require('@/assets/images/icon/视频云/坐标.png')
      this.$refs.caseListPage.initDialog()
      getEventList(params).then((res) => {
         this.eventTotal = res.data.valueSize
         this.eventList= res.data.value
        // this.eventList = [
        //   {
        //     id: new Date().getTime(),
        //     deviceId: new Date().getTime(),
        //     alarmId: new Date().getTime(),
        //     lon: '114.818903',
        //     lat: '25.743833',
        //     code: new Date().getTime(),
        //     deviceName: '111球机',
        //     eventName: '突发事件',
        //     urgencyName: '紧急高',
        //     eventSource: '视频识别',
        //     dutyDeptName: 'xxx部门',
        //     evenTypeName: '市容市貌',
        //     eventStatusName: '待立案',
        //     location: '村头新村北100米',
        //     imgUrl: 'https://img1.baidu.com/it/u=1696860963,3804811236&fm=253&fmt=auto&app=138&f=JPEG?w=667&h=500',
        //     createTime: '2024-22-19 09:30:11',
        //     report: '自动上报',
        //     cover: '',
        //   },
        //   {
        //     id: new Date().getTime(),
        //     deviceId: new Date().getTime(),
        //     alarmId: new Date().getTime(),
        //     lon: '114.866776',
        //     lat: '25.764915',
        //     code: new Date().getTime(),
        //     deviceName: '枪机2',
        //     eventName: '突发事件',
        //     urgencyName: '紧急',
        //     eventSource: '视频识别',
        //     dutyDeptName: 'xxx部门',
        //     evenTypeName: '市容市貌',
        //     eventStatusName: '待立案',
        //     location: '宋溏村委会',
        //     imgUrl: 'https://img2.baidu.com/it/u=1889999577,862790646&fm=253&fmt=auto&app=120&f=JPEG?w=750&h=500',
        //     createTime: '2024-22-17 10:44:14',
        //     report: '自动上报',
        //     cover: '',
        //   },
        // ]
        this.eventList.forEach((item) => {
          AddLabelPoint(
            item.id || new Date().getTime(),
            item.eventName || item.eventname,
            icon,
            [item.lon, item.lat, 0], 'gd', item,
            this.clickCaseIncon
          )
        })
      })
    },
    // 点击事件坐标
    clickCaseIncon(e) {
      const showPop = (e) => {
        const item = e._data.data
        this.isShowEventPop = true
        this.$nextTick(() => {
          this.$refs.eventpop.initData(item)
        })
      }
      if (this.isShowEventPop) {
        this.isShowEventPop = false
        setTimeout(() => {
          showPop(e)
        }, 100);
      }
      else {
        showPop(e)
      }
    },
    // 事件列表点击
    menuEventClick(e) {
      console.log(e, 'e')
      // this.clickCaseIncon({
      //   _data: {
      //     data: e
      //   }
      // })
      if(e.lon && e.lat) {
        showPositin(e.lon, e.lat)
      }

    },
    // 关闭事件列表
    closeEvent() {
      this.isShowEvent = false
    },
    // 事件列表页面条数变化
    changePage(val) {
      this.eventParams.pageNo = val.page
      this.fetchEventList(this.eventParams)
    }

  },
  mounted() {
    this.drawSence()
    this.$bus.$on('clear', () => {
      this.isShowPop = false
      this.isShowEvent = false
      this.isShowEventPop = false
    })
  }
}
</script>

<style scoped>
.video-menu {
  display: flex;
  z-index: 111;
  width: 40rem;
  height: 5rem;
  position: absolute;
  left: 20px;
  top: 1rem;
}
</style>