Newer
Older
ganzhou-feidu / src / pages / ywts / cszl / gd / index.vue
liyaguang 3 days ago 12 KB 页面初始图层功能
<template>
  <div>
    <div class="video-menu">
      <common-btn id="gdBtn" :select="selectIndex === 'gdBtn'" :bg="gd" :bg-hover="gdHover" width="5" height="5"
        text-hover="工地" @click="btnClick" />
      <!-- <layer-manager-mix title="工地设备" :menu-tab="menuTab" :menus="menus" :select="selectIndex==='layerBtn'" @btnClick="btnClick" @menuClick="layer"/> -->
      <common-btn id="personBtn" :select="selectIndex === 'personBtn'" :bg="personBg" :bg-hover="personHover" width="5"
        height="5" text-hover="人员热力" @click="btnClick" />
      <common-btn id="scoreBtn" :select="selectIndex === 'scoreBtn'" :bg="scoreBg" :bg-hover="scoreHover" width="5"
        height="5" text-hover="综合得分" @click="btnClick" />
      <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'" :select="ktSelect === 'timeBtn'"
        @handleTimeRange="handleTimeRange" @click="ktSelect = 'timeBtn'" />
      <keyword-manager :resultList="keywordList" :select="selectIndex === 'keywordBtn'" @handleKeyword="handleKeyword"
        @click="selectIndex = 'keywordBtn'" @localPoint="localPoint" />
    </div>
    <gd-pop ref="gdPop" v-if="isShow" @close="isShow = false" />
    <list-page ref="caseListPage" title="工地事件" :list="caseList" :query="caseListQuery" :total="caseTotal"
      @change="changePage" v-show="isListPage" @close="isListPage = false" info-url="jxhsj-jxhsjsttj/jxhsjst/lczzxq" />
  </div>
</template>

<script>
import CommonBtn from "@/components/CommonBtn";
import LayerManagerMix from "@/components/LayerManagerMix";
import TimeManager from "@/components/TimeManager";
import GdPop from "./gdPop";
import { heat } from '@/utils/freedo/heat'
import { clearUpMap, clearResetMap, AddLabelPoint, initPosition } from '@/utils/freedo'
import {
  getHeat,
  getArea,
  getMonthGdScore,
  getDevList,
  getStatistics,
  getCasePointList, getCaseInfo
} from "../../../../api/ywts/cszl/gd";
import { AddDivPointCase, AddDivPointHighlight, AddLabel, focusPoint } from "../../../../utils/freedo";
import ListPage from "@/components/ListPage";
import KeywordManager from "../../../../components/KeywordManager";
import gridJson from "@/assets/mapJson/grid.json";
import mapJson from "@/assets/mapJson/map.json";
import { eventBus } from "../../../../main";


export default {
  name: 'Gd',
  components: { KeywordManager, GdPop, TimeManager, LayerManagerMix, ListPage, CommonBtn },
  data() {
    return {
      isListPage: false,
      keyword: '',
      keywordList: [],
      isShow: false,
      selectIndex: 'gdBtn',
      ktSelect: '',
      caseList: [],
      caseListQuery: {
        startTime: '',
        endTime: '',
        id: '',
        pageNo: 0,
        pageSize: 5
      },
      caseTotal: 0,
      layerManager: null,
      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: '#ffffff88',
        2: '#fdeb5688',
        3: '#85c8ff88',
        4: '#ffba7488',
        5: '#87f6b388',
      },
      time: {
        startTime: '',
        endTime: '',
      },
      preCase: null,
      personBg: require('@/assets/images/function/精细化平台/热力图未选中.png'),
      personHover: require('@/assets/images/function/精细化平台/热力图选中.png'),
      gd: require('@/assets/images/function/工地/工地未选中.png'),
      gdHover: require('@/assets/images/function/工地/工地选中.png'),
      caseBg: require('@/assets/images/function/物联网/物联事件未选中.png'),
      caseHover: require('@/assets/images/function/物联网/物联事件选中.png'),
      scoreBg: require('@/assets/images/function/工地/工地得分未选中.png'),
      scoreHover: require('@/assets/images/function/工地/工地得分选中.png'),
      alarm: require('@/assets/images/function/物联网/物联告警未选中.png'),
      alarmHover: require('@/assets/images/function/物联网/物联告警选中.png'),
      menuTab: [{
        name: '工地设备',
        value: 'device'
      }
        // , {
        //   name: '环监设备',
        //   value: 'others'
        // }
      ],
      menus: {
        device: [
        ],
        // others: [
        //   {type : "1", typename: "****设备", total: "111"},
        //   {type : "2", typename: "****设备", total: "111"}
        // ]
      }
    }
  },
  mounted() {
    getStatistics().then(response => {
      if (response.code === 200) {
        this.menus.device = response.data.value
      }
    })
    this.search()

    // 工地网格
    window.imageryManager.addByPMTS({
      url: gridJson['智慧工地'],
      name: 'gd',
      autoFlyto: true,
    })

    // 设置默认选中图层
    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: true });// 智慧工地-手工模型
    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: true }); //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 });  // 蓉江新区边界

    //  清除弹窗展示
    this.$bus.$on('clear', () => {
      this.isListPage = false
      this.isShow = false
    })
  },
  methods: {
    async btnClick(e) {
      // clearUpMap(true)
      clearResetMap()
      initPosition()
      this.isListPage = false
      this.isShow = false
      this.selectIndex = e.target.id
      this.ktSelect = ''
      switch (this.selectIndex) {
        case "caseBtn":
          this.casePoint()
          break
        case "gdBtn":
          this.search()
          break
        case "scoreBtn":
          this.score()
          break
        case "personBtn":
          getHeat().then(res => {
            if (res.code === 200) {
              console.log(res.data, '热力')
              const arr = res.data.value.filter(item => item.lng !== "" && item.lng !== null)
              // arr.splice(0,1) // todo: 测试第一个错误数据
              heat(arr)
            }
          })
          break
      }
    },
    // 设备图层控制
    layer(item) {
      // clearUpMap(true)
      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(true)
          this.keywordList = response.data.value
          response.data.value.forEach(item => {
            AddLabelPoint(
              item.id,
              '',
              item.status === '1' ? iconOnline : iconOffline,
              [item.lon, item.lat, 0], 'gd-dev', item,
              null)
          })
        }
      })
    },
    // 事件点位
    casePoint() {
      const param = {
        ...this.time,
        // keywords: this.keyword
      }
      getCasePointList(param).then(response => {
        if (response.code === 200) {
          clearUpMap(true)
          const data = []
          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.keywordList = data
          data.forEach(item => {
            // if(item.total === '1') {
            AddLabelPoint(
              item.id,
              '',
              this.caseIcon[item.eventstatus],
              [item.lon, item.lat, 0], 'gd-case', item,
              this.clickCase)
            // } else {
            //   AddDivPointCase(item, this.caseColor[item.status], item.total, this.clickCase)
            // }
          })
        }
      })
    },
    // 查询工地点位
    search() {
      const iconDone = require('@/assets/images/icon/工地地图点位/工地已完成.png')
      const iconDoing = require('@/assets/images/icon/工地地图点位/工地进行中.png')
      getArea({ keywords: this.keyword }).then(response => {
        if (response.code === 200) {
          clearUpMap(true)
          this.keywordList = response.data.value
          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.clickGd)
          })
        }
      })
    },
    // 智慧工地-工地近1月综合得分
    score() {
      const iconDone = require('@/assets/images/icon/工地地图点位/工地已完成.png')
      const iconDoing = require('@/assets/images/icon/工地地图点位/工地进行中.png')
      getArea({ keywords: this.keyword }).then(response => {
        if (response.code === 200) {
          this.keywordList = response.data.value
          response.data.value.forEach(item => {
            // console.log(item,'321123')
            // todo : 画范围
            // AddLabelPoint(
            //   item.id,
            //   item.name,
            //   item.status === '2' ? iconDoing: iconDone,
            //   [item.lon, item.lat, 0], 'gd', item,
            //   this.clickGd)
          })
        }
      })
      getMonthGdScore({ keywords: this.keyword }).then(response => {
        if (response.code === 200) {
          response.data.value.filter(item => item.lng !== "" && item.lng !== null).forEach(item => {
            AddLabel(
              item.id,
              item.score,
              [item.lon, item.lat, 0], 'gdScore', item,
              this.clickGd)
          })
        }
      })
    },
    // 点击icon事件
    clickGd(eventArg) {
      const item = eventArg._data.data
      this.isShow = true
      this.$nextTick(() => {
        this.$refs.gdPop.initData(item)
      })
    },
    // 点击事件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)
      }
      if (item.total === '1') {
        // 保存当前marker
        this.preCase = item
        // 高亮当前marker
        window.mmManager.removeById(item.id)
        AddDivPointHighlight(item, this.caseColor[item.status])
      } else {
        this.preCase = null
      }
      // 查询事件详情
      this.caseTotal = Number(item.total)
      this.isListPage = true
      this.$refs.caseListPage.initDialog()
      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 => {
      getCaseInfo(this.caseListQuery).then(response => {
        if (response.code === 200) {
          console.log(response.data.value)
          // 右侧看板
          this.caseList = response.data.value
        }
      })
    },
    handleTimeRange(time) {
      this.isListPage = false
      if (this.time.startTime !== '') {
        this.time = time
        this.casePoint()
      } else {
        this.time = time
      }
    },
    handleKeyword(keyword) {
      this.keyword = keyword
      const item = {
        target: {
          id: this.selectIndex
        }
      }
      this.search()
      this.btnClick(item)
      this.ktSelect = 'keywordBtn'
    },
    localPoint(item) {
      focusPoint(item.lon, item.lat)
    }
  }
}
</script>

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