Commit e491f16a9ef8a551ff8372e6f1d708f0e809ca61

Authored by ww
1 parent ac53e460

fix: device location not refresh infor window after device detail

  1 +import { onUnmounted, ref } from 'vue';
  2 +
  3 +interface ScriptOptions {
  4 + src: string;
  5 +}
  6 +
  7 +export function useAsyncScript(opts: ScriptOptions) {
  8 + const isLoading = ref(false);
  9 + const error = ref(false);
  10 + const success = ref(false);
  11 + let script: HTMLScriptElement;
  12 +
  13 + const toPromise = () => {
  14 + return new Promise((resolve, reject) => {
  15 + script = document.createElement('script');
  16 + script.type = 'text/javascript';
  17 + script.onload = function () {
  18 + isLoading.value = false;
  19 + success.value = true;
  20 + error.value = false;
  21 + resolve('');
  22 + };
  23 +
  24 + script.onerror = function (err) {
  25 + isLoading.value = false;
  26 + success.value = false;
  27 + error.value = true;
  28 + reject(err);
  29 + };
  30 +
  31 + script.src = opts.src;
  32 + document.head.appendChild(script);
  33 + });
  34 + };
  35 +
  36 + onUnmounted(() => {
  37 + script && script.remove();
  38 + });
  39 +
  40 + return {
  41 + isLoading,
  42 + error,
  43 + success,
  44 + toPromise,
  45 + };
  46 +}
@@ -65,7 +65,6 @@ @@ -65,7 +65,6 @@
65 setDrawerProps({ confirmLoading: true }); 65 setDrawerProps({ confirmLoading: true });
66 let saveMessage = '添加成功'; 66 let saveMessage = '添加成功';
67 let updateMessage = '修改成功'; 67 let updateMessage = '修改成功';
68 - console.log(values);  
69 await saveOrUpdateConfigurationCenter(values, unref(isUpdate)); 68 await saveOrUpdateConfigurationCenter(values, unref(isUpdate));
70 closeDrawer(); 69 closeDrawer();
71 emit('success'); 70 emit('success');
@@ -57,7 +57,7 @@ @@ -57,7 +57,7 @@
57 </div> 57 </div>
58 <div v-if="deviceDetail?.deviceInfo?.address" class="mt-4"> 58 <div v-if="deviceDetail?.deviceInfo?.address" class="mt-4">
59 <p>设备位置</p> 59 <p>设备位置</p>
60 - <div ref="wrapRef" style="height: 550px; width: 100%"></div> 60 + <div ref="mapWrapRef" style="height: 550px; width: 100%"></div>
61 </div> 61 </div>
62 </div> 62 </div>
63 </template> 63 </template>
@@ -65,7 +65,7 @@ @@ -65,7 +65,7 @@
65 import { defineComponent, ref, unref, nextTick } from 'vue'; 65 import { defineComponent, ref, unref, nextTick } from 'vue';
66 import { Image, Tooltip } from 'ant-design-vue'; 66 import { Image, Tooltip } from 'ant-design-vue';
67 import { descSchema } from '../../config/detail.config'; 67 import { descSchema } from '../../config/detail.config';
68 - import { useScript } from '/@/hooks/web/useScript'; 68 + import { useAsyncScript } from '/@/hooks/web/useAsyncScript';
69 import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard'; 69 import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';
70 import { useMessage } from '/@/hooks/web/useMessage'; 70 import { useMessage } from '/@/hooks/web/useMessage';
71 import { BAI_DU_MAP_URL } from '/@/utils/fnUtils'; 71 import { BAI_DU_MAP_URL } from '/@/utils/fnUtils';
@@ -77,6 +77,7 @@ @@ -77,6 +77,7 @@
77 import { DeviceTypeEnum } from '/@/api/device/model/deviceModel'; 77 import { DeviceTypeEnum } from '/@/api/device/model/deviceModel';
78 78
79 import wz from '/@/assets/images/wz.png'; 79 import wz from '/@/assets/images/wz.png';
  80 + import { useAsyncQueue } from '../../../localtion/useAsyncQueue';
80 export default defineComponent({ 81 export default defineComponent({
81 components: { 82 components: {
82 Image, 83 Image,
@@ -101,13 +102,30 @@ @@ -101,13 +102,30 @@
101 }); 102 });
102 103
103 // 地图 104 // 地图
104 - const wrapRef = ref<HTMLDivElement | null>(null);  
105 - const { toPromise } = useScript({ src: BAI_DU_MAP_URL }); 105 + const mapWrapRef = ref<HTMLDivElement>();
106 106
107 - async function initMap(longitude, latitude, address) {  
108 - await toPromise(); 107 + const { executeFlag, setTask } = useAsyncQueue();
  108 + const { toPromise } = useAsyncScript({ src: BAI_DU_MAP_URL });
  109 +
  110 + async function initMap(longitude: number, latitude: number, address: string) {
  111 + if (!(window as any).BMap) {
  112 + setTask(() => markerMap(longitude, latitude, address));
  113 + let interval: Nullable<NodeJS.Timer> = setInterval(() => {
  114 + if ((window as any).BMap) {
  115 + executeFlag.value = true;
  116 + clearInterval(interval!);
  117 + interval = null;
  118 + }
  119 + }, 300);
  120 + await toPromise();
  121 + return;
  122 + }
  123 + markerMap(longitude, latitude, address);
  124 + }
  125 +
  126 + async function markerMap(longitude: number, latitude: number, address: string) {
109 await nextTick(); 127 await nextTick();
110 - const wrapEl = unref(wrapRef); 128 + const wrapEl = unref(mapWrapRef);
111 const BMap = (window as any).BMap; 129 const BMap = (window as any).BMap;
112 if (!wrapEl) return; 130 if (!wrapEl) return;
113 const map = new BMap.Map(wrapEl); 131 const map = new BMap.Map(wrapEl);
@@ -132,6 +150,7 @@ @@ -132,6 +150,7 @@
132 map.enableScrollWheelZoom(true); 150 map.enableScrollWheelZoom(true);
133 map.addOverlay(marker); 151 map.addOverlay(marker);
134 } 152 }
  153 +
135 const { createMessage } = useMessage(); 154 const { createMessage } = useMessage();
136 const { clipboardRef } = useCopyToClipboard(); 155 const { clipboardRef } = useCopyToClipboard();
137 const copyTbDeviceId = () => { 156 const copyTbDeviceId = () => {
@@ -166,7 +185,7 @@ @@ -166,7 +185,7 @@
166 const remoteConnectiondGateway = () => {}; 185 const remoteConnectiondGateway = () => {};
167 186
168 return { 187 return {
169 - wrapRef, 188 + mapWrapRef,
170 copyTbDeviceId, 189 copyTbDeviceId,
171 copyDeviceToken, 190 copyDeviceToken,
172 initMap, 191 initMap,
@@ -22,6 +22,7 @@ export function useAsyncQueue() { @@ -22,6 +22,7 @@ export function useAsyncQueue() {
22 if (executeFlag.value) { 22 if (executeFlag.value) {
23 queue.forEach((item) => item()); 23 queue.forEach((item) => item());
24 executeFlag.value = false; 24 executeFlag.value = false;
  25 + clearTask();
25 } 26 }
26 }); 27 });
27 28
@@ -33,7 +33,9 @@ @@ -33,7 +33,9 @@
33 </Button> 33 </Button>
34 </Authority> 34 </Authority>
35 <Button type="primary" @click="handleOpenTsl"> 物模型TSL </Button> 35 <Button type="primary" @click="handleOpenTsl"> 物模型TSL </Button>
36 - <Button v-if="isShowBtn" type="primary" @click="handleImportModel">导入物模型</Button> 36 + <Button v-if="false && isShowBtn" type="primary" @click="handleImportModel"
  37 + >导入物模型</Button
  38 + >
37 </div> 39 </div>
38 <div class="flex gap-2"> 40 <div class="flex gap-2">
39 <Authority :value="ModelOfMatterPermission.RELEASE"> 41 <Authority :value="ModelOfMatterPermission.RELEASE">