Commit 0ad040a4b62e9ec4b87e89baa5560f875cdc9cd2

Authored by fengwotao
1 parent 540a0ebf

feat(src/packages): 图表地图 高德地图新增标注物点击弹窗

@@ -5,6 +5,12 @@ import { chartInitConfig } from '@/settings/designSetting' @@ -5,6 +5,12 @@ import { chartInitConfig } from '@/settings/designSetting'
5 import cloneDeep from 'lodash/cloneDeep' 5 import cloneDeep from 'lodash/cloneDeep'
6 import dataJson from './data.json' 6 import dataJson from './data.json'
7 7
  8 +export type dataExtraInfoType = typeof dataJson.markers[number]['extraInfo'] //data.json下的extraInfo类型
  9 +
  10 +export type dataJsonType = typeof dataJson //data.json类型
  11 +
  12 +export type dataJsonMarkersType = typeof dataJson.markers[number] //data.json markers类型
  13 +
8 export enum ThemeEnum { 14 export enum ThemeEnum {
9 NORMAL = 'normal', 15 NORMAL = 'normal',
10 DARK = 'dark', 16 DARK = 'dark',
1 { 1 {
2 "markers": [ 2 "markers": [
3 { 3 {
4 - "name": "x", 4 + "name": "模拟1",
5 "value": 20, 5 "value": 20,
6 "position": [103.856504, 30.687278], 6 "position": [103.856504, 30.687278],
7 "extraInfo": { 7 "extraInfo": {
8 - "tbDeviceId": "xxxxxxxxxxx",  
9 - "name": "xx",  
10 - "alias": "xx", 8 + "tbDeviceId": "@xxxxxxxxxxx",
  9 + "name": "模拟1",
  10 + "alias": "模拟1",
11 "organizationDTO": { 11 "organizationDTO": {
12 - "name": "xx" 12 + "name": "模拟1"
13 }, 13 },
14 "deviceState": "INACTIVE", 14 "deviceState": "INACTIVE",
15 "deviceProfile": { 15 "deviceProfile": {
@@ -23,15 +23,15 @@ @@ -23,15 +23,15 @@
23 } 23 }
24 }, 24 },
25 { 25 {
26 - "name": "xx", 26 + "name": "模拟2",
27 "value": 30, 27 "value": 30,
28 "position": [104.095368, 30.716787], 28 "position": [104.095368, 30.716787],
29 "extraInfo": { 29 "extraInfo": {
30 - "tbDeviceId": "xxxxxxxxxxxxxxx",  
31 - "name": "xxx",  
32 - "alias": "xx", 30 + "tbDeviceId": "@xxxxxxxxxxxxxxx",
  31 + "name": "模拟2",
  32 + "alias": "模拟2",
33 "organizationDTO": { 33 "organizationDTO": {
34 - "name": "xx" 34 + "name": "模拟2"
35 }, 35 },
36 "deviceState": "INACTIVE", 36 "deviceState": "INACTIVE",
37 "deviceProfile": { 37 "deviceProfile": {
src/packages/components/external/Charts/Maps/OverrideMapAmap/images/online.png renamed from src/packages/components/external/Charts/Maps/OverrideMapAmap/images/online1.png

514 Bytes

@@ -8,10 +8,10 @@ import AMapLoader from '@amap/amap-jsapi-loader' @@ -8,10 +8,10 @@ import AMapLoader from '@amap/amap-jsapi-loader'
8 import { CreateComponentType } from '@/packages/index.d' 8 import { CreateComponentType } from '@/packages/index.d'
9 import { useChartDataFetch } from '@/hooks' 9 import { useChartDataFetch } from '@/hooks'
10 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' 10 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
11 -import { MarkerEnum, ThemeEnum } from './config' 11 +import { MarkerEnum, ThemeEnum, dataExtraInfoType, dataJsonType, dataJsonMarkersType } from './config'
12 import { isArray } from '@/utils' 12 import { isArray } from '@/utils'
13 import djh from './images/djh.png' 13 import djh from './images/djh.png'
14 -import online from './images/online1.png' 14 +import online from './images/online.png'
15 import lx1 from './images/lx1.png' 15 import lx1 from './images/lx1.png'
16 import { getDeviceActiveTime } from '@/api/external/common/index' 16 import { getDeviceActiveTime } from '@/api/external/common/index'
17 import dayjs from 'dayjs' 17 import dayjs from 'dayjs'
@@ -39,6 +39,7 @@ let { @@ -39,6 +39,7 @@ let {
39 marker 39 marker
40 } = toRefs(props.chartConfig.option.mapOptions) 40 } = toRefs(props.chartConfig.option.mapOptions)
41 41
  42 +//官方没有高德地图api的ts,所以类型全用的any
42 let mapIns: any = null 43 let mapIns: any = null
43 let markers: any = [] 44 let markers: any = []
44 let AMapIns: any = null 45 let AMapIns: any = null
@@ -64,7 +65,7 @@ const initMap = (newData: any) => { @@ -64,7 +65,7 @@ const initMap = (newData: any) => {
64 viewMode: viewMode.value, // 地图模式 65 viewMode: viewMode.value, // 地图模式
65 willReadFrequently: true 66 willReadFrequently: true
66 }) 67 })
67 - dataHandle(props.chartConfig.option.dataset) 68 + dataHandle(props.chartConfig.option.dataset) //处理地图标点
68 let satellite = new AMap.TileLayer.Satellite() 69 let satellite = new AMap.TileLayer.Satellite()
69 let roadNet = new AMap.TileLayer.RoadNet() 70 let roadNet = new AMap.TileLayer.RoadNet()
70 if (newData.amapStyleKey === ThemeEnum.WEIXIN) { 71 if (newData.amapStyleKey === ThemeEnum.WEIXIN) {
@@ -85,12 +86,14 @@ const initMap = (newData: any) => { @@ -85,12 +86,14 @@ const initMap = (newData: any) => {
85 }) 86 })
86 } 87 }
87 88
88 -const createInfoWindow = async (extraInfo: any) => { 89 +//创建信息弹窗
  90 +const createInfoWindow = async (extraInfo: dataExtraInfoType) => {
89 try { 91 try {
90 const { name, alias, organizationDTO, deviceState, deviceProfile, deviceInfo, tbDeviceId } = extraInfo 92 const { name, alias, organizationDTO, deviceState, deviceProfile, deviceInfo, tbDeviceId } = extraInfo
91 - const res = await getDeviceActiveTime(tbDeviceId) 93 + if (tbDeviceId.startsWith('@')) return //假的模拟数据则终止
  94 + const res = await getDeviceActiveTime(tbDeviceId) //查询设备最后离线时间
92 let { lastUpdateTs } = res[0] 95 let { lastUpdateTs } = res[0]
93 - lastUpdateTs = dayjs(lastUpdateTs).format('YYYY-MM-DD HH:mm:ss') 96 + const lastUpdateFormatTs = dayjs(lastUpdateTs).format('YYYY-MM-DD HH:mm:ss')
94 return ` 97 return `
95 <div style="width:15vw;height:18vh;background-color:white;"> 98 <div style="width:15vw;height:18vh;background-color:white;">
96 <div style="margin:0px 10px"> 99 <div style="margin:0px 10px">
@@ -111,7 +114,9 @@ const createInfoWindow = async (extraInfo: any) => { @@ -111,7 +114,9 @@ const createInfoWindow = async (extraInfo: any) => {
111 设备位置:${!deviceInfo.address ? '该设备暂无地理位置' : deviceInfo.address} 114 设备位置:${!deviceInfo.address ? '该设备暂无地理位置' : deviceInfo.address}
112 </div> 115 </div>
113 <div style="margin-top:6px;"> 116 <div style="margin-top:6px;">
114 - ${deviceState === 'ONLINE' ? '在线' : deviceState === 'INACTIVE' ? '创建' : '离线'}时间:${lastUpdateTs} 117 + ${
  118 + deviceState === 'ONLINE' ? '在线' : deviceState === 'INACTIVE' ? '创建' : '离线'
  119 + }时间:${lastUpdateFormatTs}
115 </div> 120 </div>
116 </div> 121 </div>
117 </div> 122 </div>
@@ -121,7 +126,26 @@ const createInfoWindow = async (extraInfo: any) => { @@ -121,7 +126,26 @@ const createInfoWindow = async (extraInfo: any) => {
121 } 126 }
122 } 127 }
123 128
124 -const dataHandle = (newData: any) => { 129 +//地图点击
  130 +const mapClick = (markerInstance: any, markerItem: dataJsonMarkersType) => {
  131 + markerInstance.setExtData({
  132 + extraInfo: markerItem.extraInfo
  133 + })
  134 + mapIns.add(markerInstance)
  135 + markerInstance.setLabel({
  136 + content: markerItem.extraInfo.alias || markerItem.extraInfo.name
  137 + })
  138 + markerInstance.on('click', async (e: any) => {
  139 + const { extraInfo } = e.target.getExtData()
  140 + let infoWindow = new AMapIns.InfoWindow({
  141 + content: await createInfoWindow(extraInfo),
  142 + offset: new AMapIns.Pixel(0, -50)
  143 + })
  144 + infoWindow.open(mapIns, e.target.getPosition())
  145 + })
  146 +}
  147 +
  148 +const dataHandle = (newData: dataJsonType) => {
125 if (!mapIns && !AMapIns) { 149 if (!mapIns && !AMapIns) {
126 initMap(props.chartConfig.option) 150 initMap(props.chartConfig.option)
127 return 151 return
@@ -132,54 +156,28 @@ const dataHandle = (newData: any) => { @@ -132,54 +156,28 @@ const dataHandle = (newData: any) => {
132 markers = [] 156 markers = []
133 // 记录新标记 157 // 记录新标记
134 if (mapMarkerType.value === MarkerEnum.MARKER) { 158 if (mapMarkerType.value === MarkerEnum.MARKER) {
135 - newData.markers.forEach((markerItem: any) => { 159 + newData.markers.forEach((markerItem: dataJsonMarkersType) => {
136 const markerInstance = new AMapIns.Marker({ 160 const markerInstance = new AMapIns.Marker({
137 position: [markerItem.position[0], markerItem.position[1]], 161 position: [markerItem.position[0], markerItem.position[1]],
138 offset: new AMapIns.Pixel(-13, -30) 162 offset: new AMapIns.Pixel(-13, -30)
139 }) 163 })
140 - // markers.push(markerInstance) 原作者这种方式添加,地图标注获取不到当前点击对象 164 + // markers.push(markerInstance) 原作者这种方式添加,属于1.4.8版本的
141 // markerInstance.setMap(mapIns) 165 // markerInstance.setMap(mapIns)
142 - markerInstance.setExtData({  
143 - extraInfo: markerItem.extraInfo  
144 - })  
145 - mapIns.add(markerInstance)  
146 - markerInstance.setLabel({  
147 - content: markerItem.extraInfo.alias || markerItem.extraInfo.name  
148 - })  
149 - markerInstance.on('click', async (e: any) => {  
150 - const { extraInfo } = e.target.getExtData()  
151 - let infoWindow = new AMapIns.InfoWindow({  
152 - content: await createInfoWindow(extraInfo),  
153 - offset: new AMapIns.Pixel(0, -50)  
154 - })  
155 - infoWindow.open(mapIns, e.target.getPosition())  
156 - }) 166 + mapClick(markerInstance, markerItem)
157 }) 167 })
158 } else if (mapMarkerType.value === MarkerEnum.CIRCLE_MARKER) { 168 } else if (mapMarkerType.value === MarkerEnum.CIRCLE_MARKER) {
159 - newData.markers.forEach((markerItem: any) => { 169 + newData.markers.forEach((markerItem: dataJsonMarkersType) => {
160 const markerInstance = new AMapIns.CircleMarker({ 170 const markerInstance = new AMapIns.CircleMarker({
161 center: [ 171 center: [
162 !markerItem.position[0] ? 0 : markerItem.position[0], 172 !markerItem.position[0] ? 0 : markerItem.position[0],
163 !markerItem.position[1] ? 0 : markerItem.position[1] 173 !markerItem.position[1] ? 0 : markerItem.position[1]
164 ], 174 ],
165 - radius: markerItem.value,  
166 - ...marker.value, 175 + radius: markerItem.value, //圆圈半径大小
  176 + ...marker.value
167 }) 177 })
168 - // markers.push(markerInstance) //原作者这种方式添加,地图标注获取不到当前点击对象 178 + // markers.push(markerInstance) //原作者这种方式添加,属于1.4.8版本的
169 // markerInstance.setMap(mapIns) 179 // markerInstance.setMap(mapIns)
170 - markerInstance.setExtData({  
171 - extraInfo: markerItem.extraInfo  
172 - })  
173 - mapIns.add(markerInstance)  
174 - markerInstance.on('click', async (e: any) => {  
175 - console.log(e)  
176 - const { extraInfo } = e.target.getExtData()  
177 - let infoWindow = new AMapIns.InfoWindow({  
178 - content: await createInfoWindow(extraInfo),  
179 - offset: new AMapIns.Pixel(0, -50)  
180 - })  
181 - infoWindow.open(mapIns, e.target.getPosition())  
182 - }) 180 + mapClick(markerInstance, markerItem)
183 }) 181 })
184 } 182 }
185 } 183 }