|
@@ -1,17 +1,37 @@
|
|
|
<template>
|
|
|
<div class="page page-full">
|
|
|
+ <el-select
|
|
|
+ v-model="productKey"
|
|
|
+ style="position: absolute; top: 20px; left: 20px; width: 200px; z-index: 1000"
|
|
|
+ filterable
|
|
|
+ clearable
|
|
|
+ :loading="loading"
|
|
|
+ placeholder="选择产品"
|
|
|
+ @change="handleProductChange"
|
|
|
+ >
|
|
|
+ <el-option v-for="item in productData" :key="item.key" :label="item.name" :value="item.key" value-key="id"> </el-option>
|
|
|
+ </el-select>
|
|
|
<div class="map" id="device-map"></div>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
import { initMap, MapStyleJson } from '/@/utils/map'
|
|
|
-import { onMounted } from 'vue'
|
|
|
+import { onMounted, ref } from 'vue'
|
|
|
import api from '/@/api/device'
|
|
|
+import { ElMessage } from 'element-plus'
|
|
|
|
|
|
let BMapGL: any = null
|
|
|
let map: any = null
|
|
|
|
|
|
+const productKey = ref('')
|
|
|
+const productData = ref<any[]>([])
|
|
|
+const loading = ref(false)
|
|
|
+
|
|
|
+api.product.getLists().then((res: any) => {
|
|
|
+ productData.value = res.product
|
|
|
+})
|
|
|
+
|
|
|
onMounted(async () => {
|
|
|
const { BMapGL: theBMapGL } = await initMap()
|
|
|
|
|
@@ -32,85 +52,106 @@ onMounted(async () => {
|
|
|
})
|
|
|
})
|
|
|
|
|
|
+// 监听产品变化
|
|
|
+const handleProductChange = () => {
|
|
|
+ setMarker()
|
|
|
+}
|
|
|
+
|
|
|
async function setMarker() {
|
|
|
- const { device: list } = await api.device.allList({})
|
|
|
+ console.log('setMarker')
|
|
|
+ loading.value = true
|
|
|
+ try {
|
|
|
+ const { device } = await api.device.allList({ productKey: productKey.value })
|
|
|
|
|
|
- const points: any[] = []
|
|
|
- const markers: any[] = []
|
|
|
+ // 清除现有标记
|
|
|
+ map.clearOverlays()
|
|
|
|
|
|
- list.map((row: any) => {
|
|
|
- if (!row.lat || !row.lng) return
|
|
|
+ const list = (device || []).filter((row: any) => row.lat && row.lng)
|
|
|
|
|
|
- const point = new BMapGL.Point(row.lng, row.lat)
|
|
|
- const marker = new BMapGL.Marker(point, {
|
|
|
- icon: new BMapGL.Icon('/imgs/device.png', new BMapGL.Size(146, 85)),
|
|
|
- // offset: new BMapGL.Size(-73, -42.5),
|
|
|
- })
|
|
|
- points.push(point)
|
|
|
- markers.push(marker)
|
|
|
- map.addOverlay(marker)
|
|
|
-
|
|
|
- marker.addEventListener('click', function () {
|
|
|
- const deviceType = row.product.deviceType === '网关' ? '网关' : '设备'
|
|
|
- // api.screen.alarmCount(row.key).then(({ handled, number, unhandled }: any) => {
|
|
|
- const number = 0
|
|
|
- const unhandled = 0
|
|
|
- const handled = 0
|
|
|
- const infoWindow = new BMapGL.InfoWindow(
|
|
|
- `
|
|
|
- <div class="map-hover-box">
|
|
|
- <div class="map-hover-title">${row.name}</div>
|
|
|
- ${
|
|
|
- false
|
|
|
- ? `
|
|
|
- <div class="map-hover-nums">
|
|
|
- <div class="map-hover-nums-item">
|
|
|
- <div class="map-hover-nums-label">今日报警总数</div>
|
|
|
- <div class="map-hover-nums-value">${number}</div>
|
|
|
- </div>
|
|
|
- <div class="map-hover-nums-item">
|
|
|
- <div class="map-hover-nums-label">今日未处理报警</div>
|
|
|
- <div class="map-hover-nums-value">${unhandled}</div>
|
|
|
- </div>
|
|
|
- <div class="map-hover-nums-item">
|
|
|
- <div class="map-hover-nums-label">今日已处理报警</div>
|
|
|
- <div class="map-hover-nums-value">${handled}</div>
|
|
|
+ if (!list.length) {
|
|
|
+ ElMessage.warning('改产品在不存在有坐标的设备!')
|
|
|
+ return map.centerAndZoom('四川', 5)
|
|
|
+ }
|
|
|
+
|
|
|
+ const points: any[] = []
|
|
|
+ const markers: any[] = []
|
|
|
+
|
|
|
+ list?.map((row: any) => {
|
|
|
+ if (!row.lat || !row.lng) return
|
|
|
+
|
|
|
+ const point = new BMapGL.Point(row.lng, row.lat)
|
|
|
+ const marker = new BMapGL.Marker(point, {
|
|
|
+ icon: new BMapGL.Icon('/imgs/device.png', new BMapGL.Size(146, 85)),
|
|
|
+ // offset: new BMapGL.Size(-73, -42.5),
|
|
|
+ })
|
|
|
+ points.push(point)
|
|
|
+ markers.push(marker)
|
|
|
+ map.addOverlay(marker)
|
|
|
+
|
|
|
+ marker.addEventListener('click', function () {
|
|
|
+ const deviceType = row.product.deviceType === '网关' ? '网关' : '设备'
|
|
|
+ // api.screen.alarmCount(row.key).then(({ handled, number, unhandled }: any) => {
|
|
|
+ const number = 0
|
|
|
+ const unhandled = 0
|
|
|
+ const handled = 0
|
|
|
+ const infoWindow = new BMapGL.InfoWindow(
|
|
|
+ `
|
|
|
+ <div class="map-hover-box">
|
|
|
+ <div class="map-hover-title">${row.name}</div>
|
|
|
+ ${
|
|
|
+ false
|
|
|
+ ? `
|
|
|
+ <div class="map-hover-nums">
|
|
|
+ <div class="map-hover-nums-item">
|
|
|
+ <div class="map-hover-nums-label">今日报警总数</div>
|
|
|
+ <div class="map-hover-nums-value">${number}</div>
|
|
|
+ </div>
|
|
|
+ <div class="map-hover-nums-item">
|
|
|
+ <div class="map-hover-nums-label">今日未处理报警</div>
|
|
|
+ <div class="map-hover-nums-value">${unhandled}</div>
|
|
|
+ </div>
|
|
|
+ <div class="map-hover-nums-item">
|
|
|
+ <div class="map-hover-nums-label">今日已处理报警</div>
|
|
|
+ <div class="map-hover-nums-value">${handled}</div>
|
|
|
+ </div>
|
|
|
+ </div>`
|
|
|
+ : ''
|
|
|
+ }
|
|
|
+ <div class="map-hover-row-item">
|
|
|
+ <div class="map-hover-label">编号:</div>
|
|
|
+ <div class="map-hover-value">${row.key}</div>
|
|
|
+ </div>
|
|
|
+ <div class="map-hover-row-item">
|
|
|
+ <div class="map-hover-label">最后在线时间:</div>
|
|
|
+ <div class="map-hover-value">${row.lastOnlineTime || '-'}</div>
|
|
|
+ </div>
|
|
|
+ <div class="map-hover-row-item">
|
|
|
+ <div class="map-hover-label">${deviceType}地址:</div>
|
|
|
+ <div class="map-hover-value">${row.address || '-'}</div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </div>`
|
|
|
- : ''
|
|
|
- }
|
|
|
- <div class="map-hover-row-item">
|
|
|
- <div class="map-hover-label">编号:</div>
|
|
|
- <div class="map-hover-value">${row.key}</div>
|
|
|
- </div>
|
|
|
- <div class="map-hover-row-item">
|
|
|
- <div class="map-hover-label">最后在线时间:</div>
|
|
|
- <div class="map-hover-value">${row.lastOnlineTime || '-'}</div>
|
|
|
- </div>
|
|
|
- <div class="map-hover-row-item">
|
|
|
- <div class="map-hover-label">${deviceType}地址:</div>
|
|
|
- <div class="map-hover-value">${row.address || '-'}</div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- `,
|
|
|
- {
|
|
|
- width: 268 * 1.2, // 信息窗口宽度 268 * 193
|
|
|
- // height: 120 * 1.2, // 信息窗口高度
|
|
|
- title: '',
|
|
|
- }
|
|
|
- )
|
|
|
- map.openInfoWindow(infoWindow, point) //开启信息窗口
|
|
|
- // })
|
|
|
+ `,
|
|
|
+ {
|
|
|
+ width: 268 * 1.2, // 信息窗口宽度 268 * 193
|
|
|
+ // height: 120 * 1.2, // 信息窗口高度
|
|
|
+ title: '',
|
|
|
+ }
|
|
|
+ )
|
|
|
+ map.openInfoWindow(infoWindow, point) //开启信息窗口
|
|
|
+ // })
|
|
|
+ })
|
|
|
})
|
|
|
- })
|
|
|
|
|
|
- if (!markers.length) return
|
|
|
+ if (!markers.length) return
|
|
|
|
|
|
- // 设置地图显示范围
|
|
|
- map.setViewport(points, {
|
|
|
- enableAnimation: true, // 启用动画过渡
|
|
|
- margins: [30, 30, 30, 30], // 设置四个边界的边距
|
|
|
- })
|
|
|
+ // 设置地图显示范围
|
|
|
+ map.setViewport(points, {
|
|
|
+ enableAnimation: true, // 启用动画过渡
|
|
|
+ margins: [30, 30, 30, 30], // 设置四个边界的边距
|
|
|
+ })
|
|
|
+ } finally {
|
|
|
+ loading.value = false
|
|
|
+ }
|
|
|
}
|
|
|
</script>
|
|
|
<style scoped lang="scss">
|