From b7d300e1e96ee825eff9e2f81b7fa6c445eb376e Mon Sep 17 00:00:00 2001 From: wzy-warehouse <18135009705@163.com> Date: Sat, 18 Apr 2026 20:10:54 +0800 Subject: [PATCH] =?UTF-8?q?=E9=81=BF=E9=9A=BE=E6=89=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/api.ts | 18 +++ src/api/emergency-shelter.ts | 20 +++ src/assets/images/icon/emergency-shelter.png | Bin 0 -> 4300 bytes src/assets/index.ts | 1 + .../ControlShowDetailComponent.vue | 9 ++ .../EmergencyShelterComponent.vue | 121 ++++++++++++++++++ src/config/config.json | 3 +- src/hooks/map/useMap.ts | 7 + .../useEmergencyShelterPoint.ts | 30 +++++ src/hooks/rainstorm/useRainDisasterChain.ts | 4 +- src/hooks/useLayerControl.ts | 15 ++- src/stores/useLoadingInformation.ts | 13 ++ src/types/base/XianEmergencyShelter.ts | 31 +++++ src/types/common/LoadingResourceType.ts | 3 + 14 files changed, 270 insertions(+), 5 deletions(-) create mode 100644 src/api/emergency-shelter.ts create mode 100644 src/assets/images/icon/emergency-shelter.png create mode 100644 src/component/rain-earthquake/EmergencyShelterComponent.vue create mode 100644 src/hooks/rain-earthquake/useEmergencyShelterPoint.ts create mode 100644 src/types/base/XianEmergencyShelter.ts diff --git a/src/api/api.ts b/src/api/api.ts index 7ad30b8..911d39a 100644 --- a/src/api/api.ts +++ b/src/api/api.ts @@ -4,11 +4,13 @@ import { getBasePoins as getHiddenDangerBasePoints, getPointDetailById as getHid import { getBasePoins as getRiskBasePoints, getPointDetailById as getRiskPointDetailById} from './risk-spots' import { getBasePoins as getHospitalsBasePoints, getPointDetailById as getHospitalsPointDetailById} from './hospitals' import { getBasePoints as getDangerousSourceBasePoints, getPointDetailById as getDangerousSourcePointDetailById} from './dangerous-source' +import { getBasePoints as getEmergencyShelterBasePoints, getPointDetailById as getEmergencyShelterPointDetailById} from './emergency-shelter' import type { ApiResponse } from '@/types/ApiResponse' import type { XianHiddenDangerSpots } from '@/types/base/XianHiddenDangerSpots' import type { XianRiskSpots } from '@/types/base/XianRiskSpots' import type { XianHospitals } from '@/types/base/XianHospitals' import type { XianDangerousSource } from '@/types/base/XianDangerousSource' +import type { XianEmergencyShelter } from '@/types/base/XianEmergencyShelter' /** * API接口统一导出对象 @@ -88,4 +90,20 @@ export const $api = { */ getPointDetailById: (id: number): Promise> => getDangerousSourcePointDetailById(id), }, + + // 避难所信息 + emergencyShelter: { + /** + * 获取所有基础避难所 + * @returns 避难所数据数组 + */ + getBasePoints: (): Promise> => getEmergencyShelterBasePoints(), + + /** + * 根据id获取避难所详情 + * @param id - 避难所id + * @returns 避难所详情 + */ + getPointDetailById: (id: number): Promise> => getEmergencyShelterPointDetailById(id), + }, } diff --git a/src/api/emergency-shelter.ts b/src/api/emergency-shelter.ts new file mode 100644 index 0000000..65190ba --- /dev/null +++ b/src/api/emergency-shelter.ts @@ -0,0 +1,20 @@ +import type { ApiResponse } from "@/types/ApiResponse" +import type { XianEmergencyShelter } from "@/types/base/XianEmergencyShelter" +import httpInstance from "@/utils/request/http" + +/** + * 获取避难所基础数据 + * @returns 避难所数据数组 + */ +export const getBasePoints = (): Promise> => { + return httpInstance.get('/emergency-shelter/base-points') +} + +/** + * 根据id获取避难所详情 + * @param id - 避难所id + * @returns 避难所详情 + */ +export const getPointDetailById = (id: number): Promise> => { + return httpInstance.get(`/emergency-shelter/point-detail/${id}`) +} diff --git a/src/assets/images/icon/emergency-shelter.png b/src/assets/images/icon/emergency-shelter.png new file mode 100644 index 0000000000000000000000000000000000000000..a50876a0e50ca595623e5a061eb6e4d1daee095a GIT binary patch literal 4300 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 literal 0 HcmV?d00001 diff --git a/src/assets/index.ts b/src/assets/index.ts index a65d6df..aca4399 100644 --- a/src/assets/index.ts +++ b/src/assets/index.ts @@ -8,6 +8,7 @@ export { default as flashFloodIcon } from '@/assets/images/icon/flash-flood.png' export { default as riskAreaIcon } from '@/assets/images/icon/risk-area.png'; export { default as hospitalIcon } from '@/assets/images/icon/hospital.png'; export { default as dangerousSourceIcon } from '@/assets/images/icon/dangerous-source.png'; +export { default as emergencyShelterIcon } from '@/assets/images/icon/emergency-shelter.png'; // 图片 export { default as backgroundImage } from '@/assets/images/background-image.png'; diff --git a/src/component/rain-earthquake/ControlShowDetailComponent.vue b/src/component/rain-earthquake/ControlShowDetailComponent.vue index 86a7980..53425ad 100644 --- a/src/component/rain-earthquake/ControlShowDetailComponent.vue +++ b/src/component/rain-earthquake/ControlShowDetailComponent.vue @@ -14,12 +14,21 @@ useStatusStore().poiLayers.showDangerSource.loading " /> + + + diff --git a/src/component/rain-earthquake/EmergencyShelterComponent.vue b/src/component/rain-earthquake/EmergencyShelterComponent.vue new file mode 100644 index 0000000..e1e182d --- /dev/null +++ b/src/component/rain-earthquake/EmergencyShelterComponent.vue @@ -0,0 +1,121 @@ + + + + + + diff --git a/src/config/config.json b/src/config/config.json index 165865f..8c0e550 100644 --- a/src/config/config.json +++ b/src/config/config.json @@ -37,6 +37,7 @@ "hiddenDangerPointId": "hidden-danger-point-", "riskPointId": "risk-point-", "hospitalPointId": "hospital-point-", - "dangerousSourcePointId": "dangerous-source-point-" + "dangerousSourcePointId": "dangerous-source-point-", + "emergencyShelterPointId": "emergency-shelter-point-" } } \ No newline at end of file diff --git a/src/hooks/map/useMap.ts b/src/hooks/map/useMap.ts index cf680f5..0f57250 100644 --- a/src/hooks/map/useMap.ts +++ b/src/hooks/map/useMap.ts @@ -57,6 +57,13 @@ export const useMap = () => { useLoadingInformationStore().dangerousSource.id = id; } + // 避难所 + else if ( + pickedObject.id.startsWith(config.prefix.emergencyShelterPointId) + ) { + useLoadingInformationStore().emergencyShelter.id = id; + } + // 其他 else { // 重置状态 diff --git a/src/hooks/rain-earthquake/useEmergencyShelterPoint.ts b/src/hooks/rain-earthquake/useEmergencyShelterPoint.ts new file mode 100644 index 0000000..7b56a2d --- /dev/null +++ b/src/hooks/rain-earthquake/useEmergencyShelterPoint.ts @@ -0,0 +1,30 @@ +import { emergencyShelterIcon } from '@/assets'; + +/** + * 危险源相关钩子函数 + * @returns + */ +export const useEmergencyShelterPoint = () => { + /** + * 字段映射配置 + */ + const field = { + name: '避难所名称', + type: '避难所类型', + address: '地理位置', + enterpriseType: '危险源类型', + lon: '经度', + lat: '纬度', + effectiveNumberOfRefugees: '避难所最大容纳人数', + }; + + /** + * 获取避难所图标 + * @returns 图标路径 + */ + function getDisasterIcon(): string { + return emergencyShelterIcon; + } + + return { field, getDisasterIcon }; +}; diff --git a/src/hooks/rainstorm/useRainDisasterChain.ts b/src/hooks/rainstorm/useRainDisasterChain.ts index b90bbe5..fbdcccc 100644 --- a/src/hooks/rainstorm/useRainDisasterChain.ts +++ b/src/hooks/rainstorm/useRainDisasterChain.ts @@ -229,9 +229,7 @@ export const useRainDisasterChain = () => { name: '显示避难所', statusStore: statusStore.poiLayers, statusKey: 'showRefugeeShelter' as const, - callback: (status: unknown) => { - console.log('显示避难所', status); - }, + callback: layerControl.clickEmergencyShelter, }, { name: '显示消防站', diff --git a/src/hooks/useLayerControl.ts b/src/hooks/useLayerControl.ts index 8e88a9f..6b9787f 100644 --- a/src/hooks/useLayerControl.ts +++ b/src/hooks/useLayerControl.ts @@ -29,5 +29,18 @@ export const useLayerControl = () => { useStatusStore().poiLayers.showDangerSource.loading = true; }; - return { clickHiddenDangerPoint, clickHospital, clickDangerousSource }; + /** + * 点击显示避难所 + */ + const clickEmergencyShelter = () => { + // 加载状态为true + useStatusStore().poiLayers.showRefugeeShelter.loading = true; + }; + + return { + clickHiddenDangerPoint, + clickHospital, + clickDangerousSource, + clickEmergencyShelter, + }; }; diff --git a/src/stores/useLoadingInformation.ts b/src/stores/useLoadingInformation.ts index defc85c..2981022 100644 --- a/src/stores/useLoadingInformation.ts +++ b/src/stores/useLoadingInformation.ts @@ -60,6 +60,14 @@ export const useLoadingInformationStore = defineStore( id: -1, }); + // ============================== 避难所状态 ================================ + const emergencyShelter = reactive({ + /** 加载状态 */ + loading: false, + /** 避难所ID */ + id: -1, + }); + /** * 重置所有状态 */ @@ -83,6 +91,10 @@ export const useLoadingInformationStore = defineStore( // 危险源状态重置 dangerousSource.loading = false; dangerousSource.id = -1; + + // 避难所状态重置 + emergencyShelter.loading = false; + emergencyShelter.id = -1; }; return { @@ -91,6 +103,7 @@ export const useLoadingInformationStore = defineStore( riskPoint, hospital, dangerousSource, + emergencyShelter, resetStatue, }; } diff --git a/src/types/base/XianEmergencyShelter.ts b/src/types/base/XianEmergencyShelter.ts new file mode 100644 index 0000000..de0f699 --- /dev/null +++ b/src/types/base/XianEmergencyShelter.ts @@ -0,0 +1,31 @@ +import type { Point } from './Point'; + +/** + * 西安市应急避难所数据接口 + */ +export interface XianEmergencyShelter extends Point { + /** 避难所时间 */ + year?: string; + /** 避难所区县 */ + district?: string; + /** 避难所名字 */ + name?: string; + /** 避难所地址 */ + address?: string; + /** 避难所类型 */ + type?: string; + /** 避难所性质 */ + constructionCategory?: string; + /** 占地面积 */ + coverArea?: string; + /** 有效占地面积 */ + effectiveRefugeArea?: string; + /** 有效容纳人数 */ + effectiveNumberOfRefugees?: string; + /** 经度 */ + lon?: number; + /** 纬度 */ + lat?: number; + /** 逻辑删除标识,0未删除,1已删除 */ + isDelete?: number; +} diff --git a/src/types/common/LoadingResourceType.ts b/src/types/common/LoadingResourceType.ts index 5ff5db3..2ebf3b3 100644 --- a/src/types/common/LoadingResourceType.ts +++ b/src/types/common/LoadingResourceType.ts @@ -19,4 +19,7 @@ export enum LoadingResource { /** 危险源 */ DANGEROUS_SOURCE = 'DANGEROUS_SOURCE', + + /** 避难所 */ + EMERGENCY_SHELTER = 'EMERGENCY_SHELTER', }