Newer
Older
ganzhou-feidu / src / pages / ywts / cszl / yj / index.vue
liyaguang 3 days ago 22 KB 页面初始图层功能
<template>
  <div>
    <div class="video-menu">
      <layer-manager-mix ref="layerPlace" :isNeedIcon="false" title="重点防护" :layer="place" :layer-hover="placeHover"
        :menu-tab="menuTab" :menus="menus" :select="selectIndex === 'placeBtn'" id="placeBtn" @btnClick="btnClick"
        @menuClick="menuClickPlace" />
      <layer-manager-mix ref="layerResource" :isNeedIcon="false" title="应急资源" :layer="assetBg" :layer-hover="assetHover"
        :menu-tab="menuTab" :menus="menus" :select="selectIndex === 'assetBtn'" id="assetBtn" @btnClick="btnClick"
        @menuClick="menuClickPlace" />
      <layer-manager-mix ref="layerDevice" :isNeedIcon="false" title="感知设备" :layer="device" :layer-hover="deviceHover"
        :menu-tab="menuTab" :menus="menus" :select="selectIndex === 'deviceBtn'" id="deviceBtn" @btnClick="btnClick"
        @menuClick="menuClickPlace" />
      <layer-manager-mix ref="layerPerson" :isNeedIcon="false" title="应急人员" :layer="person" :layer-hover="personHover"
        :menu-tab="menuTab" :menus="menus" :select="selectIndex === 'personBtn'" id="personBtn" @btnClick="btnClick"
        @menuClick="menuClickPlace" />
      <layer-manager-mix ref="layerCar" :isNeedIcon="false" title="应急车辆" :layer="carBg" :layer-hover="carHover"
        :menu-tab="menuTab" :menus="menus" :select="selectIndex === 'carBtn'" id="carBtn" @btnClick="btnClick"
        @menuClick="menuClickPlace" />
      <common-btn id="caseBtn" :select="selectIndex === 'caseBtn'" :bg="caseBg" :bg-hover="caseHover" width="5"
        height="5" text-hover="应急事件" @click="btnClick" />
      <time-manager v-show="selectIndex === 'caseBtn'" @handleTimeRange="handleTimeRange" />
    </div>
    <list-page title="监测事件" :list="caseList" :query="caseListQuery" :total="caseTotal" @change="changePage"
      v-show="isListPage" @close="isListPage = false" />
    <!-- 信息窗体 -->
    <Pop ref="pop" v-if="showPop" @close="showPop = false" />
  </div>
</template>

<script>
import CommonBtn from "@/components/CommonBtn";
import LayerManagerMix from "@/components/LayerManagerMix";
import TimeManager from "@/components/TimeManager";
import { heat } from '@/utils/freedo/heat'
import { clearUpMap, clearResetMap, AddLabelPoint } from '@/utils/freedo'
import Pop from './Pop.vue'
import {
  getHeat,
  getArea,
  getDevList,
  getStatistics,
  getCasePointList, getCaseInfo
} from "../../../../api/ywts/cszl/gd";
import { getPlacePointList, getPersonPointList, getDevicePointList, getResourcePointList, getCarPointList, getEventList } from '@/api/ywts/cszl/yj'
import { AddDivPointHighlight, AddLabel } from "../../../../utils/freedo";
import { iconFilter, deviceList, caseList } from './data'
import ListPage from "@/components/ListPage";
import { eventBus } from "../../../../main";
export default {
  name: 'Yj',
  components: { TimeManager, LayerManagerMix, ListPage, CommonBtn, Pop },
  data() {
    return {
      isListPage: false,
      ktSelect: '',
      selectIndex: 'placeBtn',
      caseList: [],
      caseListQuery: {
        startTime: '',
        endTime: '',
        id: '',
        pageNo: 0,
        pageSize: 5
      },
      markerListBak: [],
      markerList: [],
      currentSelect: '',
      showPop: false,
      caseTotal: 0,
      caseIcon: {
        1: require('@/assets/images/icon/事件/已撤案.png'),
        2: require('@/assets/images/icon/事件/指派中.png'),
        3: require('@/assets/images/icon/事件/处置中.png'),
        4: require('@/assets/images/icon/事件/已办结.png'),
        5: require('@/assets/images/icon/事件/已结案.png'),
      },
      caseColor: {
        1: '#ffffff',
        2: '#fdeb56',
        3: '#85c8ff',
        4: '#ffba74',
        5: '#87f6b3',
      },
      time: {
        startTime: '',
        endTime: '',
      },
      preCase: null,
      place: require('@/assets/images/function/应急/危险设施未选中.png'),
      placeHover: require('@/assets/images/function/应急/危险设施选中.png'),
      device: require('@/assets/images/function/应急/感知设备未选中.png'),
      deviceHover: require('@/assets/images/function/应急/感知设备选中.png'),
      person: require('@/assets/images/function/应急/应急人员未选中.png'),
      personHover: require('@/assets/images/function/应急/应急人员选中.png'),
      assetBg: require('@/assets/images/function/应急/应急物资未选中.png'),
      assetHover: require('@/assets/images/function/应急/应急物资选中.png'),
      carBg: require('@/assets/images/function/应急/应急车辆未选中.png'),
      carHover: require('@/assets/images/function/应急/应急车辆选中.png'),
      caseBg: require('@/assets/images/function/应急/应急事件未选中.png'),
      caseHover: require('@/assets/images/function/应急/应急事件选中.png'),
      menuTab: [{
        name: '基础设施',
        value: 'place'
      }
        // , {
        //   name: '环监设备',
        //   value: 'others'
        // }
      ],
      menus: {
        place: [
        ],
        // others: [
        //   {type : "1", typename: "****设备", total: "111"},
        //   {type : "2", typename: "****设备", total: "111"}
        // ]
      }
    }
  },
  mounted() {
        // 设置默认选中图层
    eventBus.$emit('change-layer', { id: 41, checked: false });  // 智慧教育-手工模型
    eventBus.$emit('change-layer', { id: 42, checked: false });// 智慧停车云-手工模型
    eventBus.$emit('change-layer', { id: 43, checked: false });//智慧社区-手工模型
    eventBus.$emit('change-layer', { id: 44, checked: false });// 智慧工地-手工模型
    eventBus.$emit('change-layer', { id: 45, checked: false });// 智慧交通-手工模型
    eventBus.$emit('change-layer', { id: 46, checked: false });// 智慧园林-手工模型
    eventBus.$emit('change-layer', { id: 31, checked: false }); // 倾斜
    eventBus.$emit('change-layer', { id: 21, checked: false }); //CIM2建筑(带纹理)
    eventBus.$emit('change-layer', { id: 22, checked: false }); //CIM2建筑(纯白色)
    eventBus.$emit('change-layer', { id: 12, checked: true });  // 蓉江新区正射影像
    eventBus.$emit('change-layer', { id: 13, checked: true });  // 蓉江新区边界
    clearResetMap()
    this.searchPlace({})

    this.$bus.$on('clear', () => {
      this.isListPage = false
      this.showPop = false
    })
  },
  methods: {
    async btnClick(e) {
      console.log(e.target.id, 'e.target.id')
      clearResetMap()
      this.isListPage = false
      this.showPop = false
      this.selectIndex = e.target.id
      this.currentSelect = ''
      this.markerList = []
      this.markerListBak = []
      switch (this.selectIndex) {
        case "caseBtn":
          this.casePoint()
          break
        case "personBtn":
          // 人员
          this.searchPerson()
          break
        case "placeBtn":
          // 场所列表
          this.searchPlace({})
          break
        case "deviceBtn":
          // 设备
          this.searchDevice({})
          break
        case "assetBtn":
          // 设备
          this.searchResource({})
          break
        case "carBtn":
          // 车辆
          this.searchCar({})
          break
      }
    },
    // 设备图层控制
    layer(item) {
      // clearUpMap()
      const iconOnline = require('@/assets/images/icon/工地地图点位/' + item.typename.replace(/ /g, '') + '在线.png')
      const iconOffline = require('@/assets/images/icon/工地地图点位/' + item.typename.replace(/ /g, '') + '离线.png')
      getDevList({ type: item.type }).then(response => {
        if (response.code === 200) {
          clearUpMap()
          response.data.value.forEach(item => {
            AddLabelPoint(
              item.id,
              '',
              item.status === '1' ? iconOnline : iconOffline,
              [item.lon, item.lat, 0], 'gd-place', item,
              null)
          })
        }
      })
    },
    // 事件点位
    casePoint() {
      console.log(this.time)
      getEventList(this.time).then(response => {
        console.log(response.data, '事件列表')
        if (response.code === 200) {
          clearResetMap()
          const data = caseList
          // response.data.value.forEach(item => {
          //   if (!data.map(da => da.id).includes(item.id) && !data.map(da => da.lon).includes(item.lon) && item.id !== null) {
          //     data.push(item)
          //   }
          // })
          this.caseList = caseList
          console.log(caseList, 'caseList')
          // todo
          // this.caseTotal  = response.data.value.length
          this.caseTotal = caseList.length
          data.forEach(item => {
            AddLabelPoint(
              item.id,
              '',
              this.caseIcon[item.eventstatusnameid],
              [item.longitude, item.latitude, 0], 'gd-case', item,
              this.clickCase)
          })
        }
      })
    },
    // 查询工地点位
    search() {
      const iconDone = require('@/assets/images/icon/工地地图点位/工地已完成.png')
      const iconDoing = require('@/assets/images/icon/工地地图点位/工地进行中.png')
      getArea({}).then(response => {
        if (response.code === 200) {
          clearUpMap()
          response.data.value.forEach(item => {
            // console.log(item.areaboundary)
            // todo : 画范围
            AddLabelPoint(
              item.id,
              item.name,
              item.status === '2' ? iconDoing : iconDone,
              [item.lon, item.lat, 0], 'gd', item,
              this.clickHw)
          })
        }
      })
    },
    // 智慧工地-工地近1月综合得分
    score() {
      getArea({}).then(response => {
        if (response.code === 200) {
          response.data.value.forEach(item => {
            console.log(item.areaboundary)
            // todo : 画范围
          })
        }
      })
    },
    // 点击事件icon
    clickCase(eventArg) {
      const item = eventArg._data.data
      // 恢复上一个marker
      if (this.preCase !== null) {
        window.mmManager.removeById(this.preCase.id)
        AddLabelPoint(
          this.preCase.id,
          '',
          this.caseIcon[this.preCase.status],
          [this.preCase.lon, this.preCase.lat, 0], 'gd-case', this.preCase,
          this.clickCase)
      }
      // 保存当前marker
      this.preCase = item
      // 高亮当前marker
      window.mmManager.removeById(item.id)
      AddDivPointHighlight(item, this.caseColor[item.status])

      // 查询事件详情
      this.isListPage = true
      this.caseListQuery = {
        startTime: this.time.startTime,
        endTime: this.time.endTime,
        id: item.id,
        pageNo: 0,
        pageSize: 5
      }
      this.searchCaseMarkerList()
    },
    // 事件换页
    changePage(val) {
      if (val && val.page) {
        this.caseListQuery.pageNo = val.page
      }
      this.searchCaseMarkerList()
    },
    searchCaseMarkerList() {
      // getCaseInfo(this.caseListQuery).then(response => {
        getEventList(this.caseListQuery).then(response => {
        if (response.code === 200) {
          // console.log(response.data.value)
          // 右侧看板
          // this.caseList = response.data.value
          this.caseList = caseList
          // todo
          // this.caseTotal  = response.data.value.length
          this.caseTotal = caseList.length
        }
      })
    },
    changeState(v) {
      this.ktSelect = v
    },
    handleTimeRange(time) {
      this.isListPage = false
      if (this.time.startTime !== '') {
        this.time = time
        this.casePoint()
      } else {
        this.time = time
      }
    },
    // 获取场所列表
    searchPlace(params) {
      this.menuTab = [
        // {
        //   name: '危险设施',
        //   value: 'dangerous',
        // },
        {
          name: '重点防护',
          value: 'keynote',
        },
        // {
        //   name: '感知设备',
        //   value: 'device',
        // },
        // {
        //   name: '保障资源',
        //   value: 'resources',
        // },
      ]
      getPlacePointList(params).then(res => {
        const initData = res.data.value
        // 类型列表
        const typeList = [...new Map(res.data.value.map(item => item.typename).map(item => [item, item])).values()]
        const data = typeList.map((item) => {
          return {
            typename: item,
            total: initData.filter(citem => citem.typename === item).length,
            type: initData.filter(citem => citem.typename === item)[0].type,
            list: initData.filter(citem => citem.typename === item).map((item) => ({ ...item, showType: 'keynote' })),
            // icon: iconFilter(item)
          }
        })
        // const dangerous = ['加油站', '危化品', '易滑坡区域', '易崩塌区域']
        // this.menus.dangerous = data.filter(item => dangerous.some(citem => item.typename.includes(citem)))
        const keynote = ['学校', '医院', '危化品', '加油站', '易滑坡区域', '易崩塌区域']
        this.menus.keynote = data.filter(item => keynote.some(citem => item.typename === (citem))).map(item => ({ ...item, icon: iconFilter(item.typename) }))
        console.log(this.menus.keynote, 'this.menus.keynote')
        // const resources = ['医疗', '仓库', '避难', '应急']
        // this.menus.resources = data.filter(item => resources.some(citem => item.typename.includes(citem)))
        // const device = ['视频', '设备']
        // this.menus.device = data.filter(item => device.some(citem => item.typename.includes(citem)))
        this.$refs.layerPlace.refreshMenu(1)
        // 地图绘制点位
        let markerList = []
        // const marker = [...this.menus.dangerous, ...this.menus.keynote, ...this.menus.resources, ...this.menus.device]
        const marker = [...this.menus.keynote]
        marker.forEach((item) => {
          item.list.forEach(citem => {
            if (citem.lon && citem.lat) {
              markerList.push(citem)
            }
          })
        })
        markerList = markerList.filter(item => item.lon && item.lat)
          .map((item) => ({
            ...item,
            lon: item.lat,
            lat: item.lon,
          }))
        markerList.forEach(item => {
          AddLabelPoint(
            item.id || new Date().getTime(),
            item.name,
            iconFilter(item.typename),
            [item.lon, item.lat, 0], 'gd', item,
            this.clickMarker
          )
        })
        this.markerList = markerList
        this.markerListBak = JSON.parse(JSON.stringify(markerList))
      })
    },
    // 场所列表点击
    menuClickPlace(e) {
      console.log(e, '123')
      clearResetMap()
      this.showPop = false
      if (this.currentSelect === e.typename) {
        //  退出筛选
        this.markerList = this.markerListBak
        this.currentSelect = ''
      }
      else {
        this.markerList = this.markerListBak.filter((item) => item.typename === e.typename)
        this.currentSelect = e.typename
      }
      this.markerList.forEach(item => {
        AddLabelPoint(
          item.id || new Date().getTime(),
          item.name,
          iconFilter(item.typename),
          [item.lon, item.lat, 0], 'gd', item,
          this.clickMarker
        )
      })
    },
    // 点击点位
    clickMarker(eventArg) {
      const showPop = (e) => {
        const item = e._data.data
        this.showPop = true
        // console.log(this.$refs.popRef)
        this.$nextTick(() => {
          this.$refs.pop.initData(item)
        })
      }
      if (this.showPop) {
        this.showPop = false
        setTimeout(() => {
          showPop(eventArg)
        }, 100);
      }
      else {
        showPop(eventArg)
      }
    },
    // 获取人员
    searchPerson() {
      this.menuTab = [
        {
          name: '应急人员',
          value: 'person',
        },
      ]
      getPersonPointList({}).then(res => {
        console.log(res.data, '人员')
        const initData = res.data.value

        const typeList = [...new Map(res.data.value.map(item => item.typename).map(item => [item, item])).values()]
        const data = typeList.map((item) => {
          return {
            typename: item,
            total: initData.filter(citem => citem.typename === item).length,
            type: initData.filter(citem => citem.typename === item)[0].type,
            list: initData.filter(citem => citem.typename === item).map((item) => ({ ...item, showType: 'person' })),
          }
        })
        this.menus.person = data.map(item => ({ ...item, icon: iconFilter(item.typename) }))
        this.$refs.layerPerson.refreshMenu(1)
        let markerList = []
        const marker = [...this.menus.person]
        console.log(marker, 'marker')
        marker.forEach((item) => {
          item.list.forEach(citem => {
            if (citem.lon && citem.lat) {
              markerList.push(citem)
            }
          })
        })
        markerList = markerList.filter(item => item.lon && item.lat)
        markerList.forEach(item => {
          AddLabelPoint(
            item.id || new Date().getTime(),
            item.name,
            iconFilter(item.typename),
            [item.lon, item.lat, 0], 'gd', item,
            this.clickMarker
          )
        })
        this.markerList = markerList
        this.markerListBak = JSON.parse(JSON.stringify(markerList))
      })
    },
    // 获取设备
    searchDevice() {
      this.menuTab = [
        {
          name: '基础设备',
          value: 'device',
        },
      ]
      getDevicePointList({}).then(res => {
        console.log(res.data, '设备')
        const initData = deviceList

        const typeList = [...new Map(initData.map(item => item.typename).map(item => [item, item])).values()]
        const data = typeList.map((item) => {
          return {
            typename: item,
            total: initData.filter(citem => citem.typename === item).length,
            type: initData.filter(citem => citem.typename === item)[0].type,
            list: initData.filter(citem => citem.typename === item).map((item) => ({ ...item, showType: 'device' })),
          }
        })
        this.menus.device = data.map(item => ({ ...item, icon: iconFilter(item.typename) }))
        this.$refs.layerDevice.refreshMenu(1)
        let markerList = []
        const marker = [...this.menus.device]
        marker.forEach((item) => {
          item.list.forEach(citem => {
            if (citem.lon && citem.lat) {
              markerList.push(citem)
            }
          })
        })
        markerList = markerList.filter(item => item.lon && item.lat)
        markerList.forEach(item => {
          AddLabelPoint(
            item.id || new Date().getTime(),
            item.name,
            iconFilter(item.typename),
            [item.lon, item.lat, 0], 'gd', item,
            this.clickMarker
          )
        })
        this.markerList = markerList
        this.markerListBak = JSON.parse(JSON.stringify(markerList))
      })
    },
    // 获取资源
    searchResource() {
      this.menuTab = [
        {
          name: '应急资源',
          value: 'resource',
        },
      ]
      getResourcePointList({}).then((res) => {
        const initData = res.data.value
        console.log(initData, '资源')
        // 资源列表
        const typeList = [...new Map(initData.map(item => item.typename).map(item => [item, item])).values()]
        const data = typeList.map((item) => {
          return {
            typename: item,
            total: initData.filter(citem => citem.typename === item).length,
            type: initData.filter(citem => citem.typename === item)[0].type,
            list: initData.filter(citem => citem.typename === item).map((item) => ({ ...item, showType: 'resource' })),
          }
        })
        this.menus.resource = data.map(item => ({ ...item, icon: iconFilter(item.typename) }))
        this.$refs.layerResource.refreshMenu(1)
        // 地图绘制点位
        let markerList = []
        const marker = [...this.menus.resource]
        marker.forEach((item) => {
          item.list.forEach(citem => {
            if (citem.lon && citem.lat) {
              markerList.push(citem)
            }
          })
        })
        markerList = markerList.filter(item => item.lon && item.lat)
          .map((item) => ({
            ...item,
            lon: item.lat,
            lat: item.lon,
          }))
        markerList.forEach(item => {
          AddLabelPoint(
            item.id || new Date().getTime(),
            item.name,
            iconFilter(item.typename),
            [item.lon, item.lat, 0], 'gd', item,
            this.clickMarker
          )
        })
        this.markerList = markerList
        this.markerListBak = JSON.parse(JSON.stringify(markerList))

      })
    },
    // 车辆
    searchCar() {
      this.menuTab = [
        {
          name: '应急车辆',
          value: 'car',
        },
      ]
      getCarPointList({}).then((res) => {
        const initData = res.data.value
        console.log(initData, '车辆')
        const typeList = [...new Map(initData.map(item => item.typename).map(item => [item, item])).values()]
        const data = typeList.map((item) => {
          return {
            typename: item,
            total: initData.filter(citem => citem.typename === item).length,
            type: initData.filter(citem => citem.typename === item)[0].type,
            list: initData.filter(citem => citem.typename === item).map((item) => ({ ...item, showType: 'car' })),
          }
        })
        this.menus.car = data.map(item => ({ ...item, icon: iconFilter(item.typename) }))
        this.$refs.layerCar.refreshMenu(0)
        let markerList = []
        const marker = [...this.menus.car]
        marker.forEach((item) => {
          item.list.forEach(citem => {
            if (citem.lon && citem.lat) {
              markerList.push(citem)
            }
          })
        })
        markerList = markerList.filter(item => item.lon && item.lat)
        markerList.forEach(item => {
          AddLabelPoint(
            item.id || new Date().getTime(),
            item.name,
            iconFilter(item.typename),
            [item.lon, item.lat, 0], 'gd', item,
            this.clickMarker
          )
        })
        this.markerList = markerList
        this.markerListBak = JSON.parse(JSON.stringify(markerList))
      })
    }
  }
}
</script>

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