<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>