diff --git a/.env.development b/.env.development index 2a08ab2..98dc148 100644 --- a/.env.development +++ b/.env.development @@ -5,7 +5,7 @@ VITE_BACKEND_BASE_URL=http://localhost:8081 START_PORT=81 # geoserver地址 -VITE_GEOSERVER_BASE_URL=http://47.92.216.173:4019/geoserver/xian +VITE_GEOSERVER_BASE_URL=http://47.92.216.173:4020/geoserver/xian # WebSocket地址 VITE_WEBSOCKET_URL=http://localhost:8081/websocket diff --git a/src/api/api.ts b/src/api/api.ts index ddeca55..6e2d4da 100644 --- a/src/api/api.ts +++ b/src/api/api.ts @@ -55,6 +55,9 @@ import type { XianSchool } from '@/types/base/XianSchool'; import type { XianBridge } from '@/types/base/XianBridge.ts'; import type { XianReservoirList } from '@/types/base/XianReservoirList'; import type { XianSubwayStations } from '@/types/base/XianSubwayStations'; +import { modelDeduction as rainfallModelDeduction } from './rainfall'; +import type { RainPredictResponse } from '@/types/rainstorm/RainPredictResponse'; +import type { RainPredictRequest } from '@/types/rainstorm/RainPredictRequest'; /** * API接口统一导出对象 @@ -84,12 +87,14 @@ export const $api = { /** * 根据id获取隐患点详情 * @param id - 隐患点id + * @param simulationId - 模拟id * @returns 隐患点详情 */ getPointDetailById: ( - id: number + id: number, + simulationId: number ): Promise> => - getHiddenDangerPointDetailById(id), + getHiddenDangerPointDetailById(id, simulationId), }, // 风险点信息 @@ -104,10 +109,14 @@ export const $api = { /** * 根据id获取风险点详情 * @param id - 风险点id + * @param simulationId - 模拟id * @returns 风险点详情 */ - getPointDetailById: (id: number): Promise> => - getRiskPointDetailById(id), + getPointDetailById: ( + id: number, + simulationId: number + ): Promise> => + getRiskPointDetailById(id, simulationId), }, // 医院信息 @@ -277,4 +286,16 @@ export const $api = { ): Promise> => getSubwayStationsPointDetailById(id), }, + + // 暴雨推演 + rainfall: { + /** + * 进行模型推演 + * @param req 请求体 + * @returns 推演点的概率 + */ + modelDeduction: ( + req: RainPredictRequest + ): Promise> => rainfallModelDeduction(req), + }, }; diff --git a/src/api/hidden-danger-spots.ts b/src/api/hidden-danger-spots.ts index 8002aba..6840c00 100644 --- a/src/api/hidden-danger-spots.ts +++ b/src/api/hidden-danger-spots.ts @@ -1,25 +1,33 @@ -import type { ApiResponse } from "@/types/ApiResponse" -import type { XianHiddenDangerSpots } from "@/types/base/XianHiddenDangerSpots" -import httpInstance from "@/utils/request/http" +import type { ApiResponse } from '@/types/ApiResponse'; +import type { XianHiddenDangerSpots } from '@/types/base/XianHiddenDangerSpots'; +import httpInstance from '@/utils/request/http'; /** * 获取隐患点基础数据 * @param disasterType - 灾害类型(landslide, debris_flow, water_logging, flash_flood) * @returns 隐患点数据数组 */ -export const getBasePoints = (disasterType: string): Promise> => { - return httpInstance.get('/hidden-danger-spots/base-points', { - params: { - disasterType - } - }) -} +export const getBasePoints = ( + disasterType: string +): Promise> => { + return httpInstance.get('/hidden-danger-spots/base-points', { + params: { + disasterType, + }, + }); +}; /** * 根据id获取隐患点详情 * @param id - 隐患点id + * @param simulationId - 模拟id * @returns 隐患点详情 */ -export const getPointDetailById = (id: number): Promise> => { - return httpInstance.get(`/hidden-danger-spots/point-detail/${id}`) -} \ No newline at end of file +export const getPointDetailById = ( + id: number, + simulationId: number +): Promise> => { + return httpInstance.get( + `/hidden-danger-spots/point-detail/${id}/${simulationId}` + ); +}; diff --git a/src/api/rainfall.ts b/src/api/rainfall.ts new file mode 100644 index 0000000..60462c2 --- /dev/null +++ b/src/api/rainfall.ts @@ -0,0 +1,15 @@ +import type { ApiResponse } from '@/types/ApiResponse'; +import type { RainPredictRequest } from '@/types/rainstorm/RainPredictRequest'; +import type { RainPredictResponse } from '@/types/rainstorm/RainPredictResponse'; +import httpInstance from '@/utils/request/http'; + +/** + * 进行模型推演 + * @param req 请求体 + * @returns 推演点的概率 + */ +export const modelDeduction = ( + req: RainPredictRequest +): Promise> => { + return httpInstance.post('/algorithm-api/rainfall/predict', req); +}; diff --git a/src/api/risk-spots.ts b/src/api/risk-spots.ts index d451ee6..f4848ae 100644 --- a/src/api/risk-spots.ts +++ b/src/api/risk-spots.ts @@ -1,20 +1,24 @@ -import type { ApiResponse } from "@/types/ApiResponse" -import type { XianRiskSpots } from "@/types/base/XianRiskSpots" -import httpInstance from "@/utils/request/http" +import type { ApiResponse } from '@/types/ApiResponse'; +import type { XianRiskSpots } from '@/types/base/XianRiskSpots'; +import httpInstance from '@/utils/request/http'; /** * 获取风险点基础数据 * @returns 风险点数据数组 */ export const getBasePoints = (): Promise> => { - return httpInstance.get('/risk-spots/base-points') -} + return httpInstance.get('/risk-spots/base-points'); +}; /** * 根据id获取风险点详情 * @param id - 风险点id + * @param simulationId - 模拟id * @returns 风险点详情 */ -export const getPointDetailById = (id: number): Promise> => { - return httpInstance.get(`/risk-spots/point-detail/${id}`) -} \ No newline at end of file +export const getPointDetailById = ( + id: number, + simulationId: number +): Promise> => { + return httpInstance.get(`/risk-spots/point-detail/${id}/${simulationId}`); +}; diff --git a/src/assets/images/icon/collapse.png b/src/assets/images/icon/collapse.png new file mode 100644 index 0000000..a2155ee Binary files /dev/null and b/src/assets/images/icon/collapse.png differ diff --git a/src/assets/index.ts b/src/assets/index.ts index 5af5201..6d65e8d 100644 --- a/src/assets/index.ts +++ b/src/assets/index.ts @@ -2,6 +2,7 @@ // 图标 export { default as landslideIcon } from '@/assets/images/icon/landslide.png'; +export { default as collapseIcon } from '@/assets/images/icon/collapse.png'; export { default as waterLoggingIcon } from '@/assets/images/icon/waterlogging.png'; export { default as debrisFlowIcon } from '@/assets/images/icon/debris-flow.png'; export { default as flashFloodIcon } from '@/assets/images/icon/flash-flood.png'; diff --git a/src/component/common/InformationBox.vue b/src/component/common/InformationBox.vue index c23bc06..28f4a37 100644 --- a/src/component/common/InformationBox.vue +++ b/src/component/common/InformationBox.vue @@ -16,7 +16,11 @@
- + @@ -33,6 +37,7 @@ title: string; data: Record; field: Record; + style?: Record>; offsetX: number; offsetY: number; }>(); @@ -43,7 +48,8 @@ const newOffsetX = ref(props.offsetX); const newOffsetY = ref(props.offsetY); - const tableDatas: Ref<{ title: string; content: string }[]> = ref([]); + const tableDatas: Ref<{ title: string; content: string; styles?: Record }[]> = + ref([]); onMounted(() => { // 判断是否超出屏幕,超出就重新定位 @@ -58,10 +64,14 @@ Object.entries(props.data).forEach(([key, value]) => { // 判断key是不是存在field中,存在就添加到表格数据,不存在则不添加 if (Object.hasOwn(props.field, key) && value) { - tableDatas.value.push({ + const rowData: { title: string; content: string; styles?: Record } = { title: props.field[key], content: value, - }); + }; + if (props.style && Object.hasOwn(props.style, key)) { + rowData.styles = props.style[key]; + } + tableDatas.value.push(rowData); } }); }); diff --git a/src/component/map/AdministrativeDivision.vue b/src/component/map/AdministrativeDivision.vue index 63720ab..e081c8f 100644 --- a/src/component/map/AdministrativeDivision.vue +++ b/src/component/map/AdministrativeDivision.vue @@ -40,7 +40,9 @@ polygonStyle: { fill: true, fillColor: areasColor[index].withAlpha(areaTransparency), - outline: false, + outline: true, + outlineColor: Color.WHITE, + outlineWidth: 3, }, }, })); diff --git a/src/component/rain-earthquake/BasicComponent.vue b/src/component/rain-earthquake/BasicComponent.vue index 34373d1..293c55d 100644 --- a/src/component/rain-earthquake/BasicComponent.vue +++ b/src/component/rain-earthquake/BasicComponent.vue @@ -14,6 +14,14 @@ " /> + + + + + + 0" + :base-points="collapsePoints" + :get-disaster-icon="getDisasterIcon" + :prefix="config.prefix.collapseHiddenPointId" + :is-default="true" + :loading-resource-field="LoadingResource.COLLAPSE_HIDDEN_POINT" + /> + + + + + + + + + diff --git a/src/component/rain-earthquake/basic/DebrisFlowComponent.vue b/src/component/rain-earthquake/basic/DebrisFlowComponent.vue index ea5bdb1..6f51155 100644 --- a/src/component/rain-earthquake/basic/DebrisFlowComponent.vue +++ b/src/component/rain-earthquake/basic/DebrisFlowComponent.vue @@ -15,6 +15,7 @@ ([]); const statusStore = useStatusStore(); const loadingInformationStore = useLoadingInformationStore(); const loadingResourceStore = useLoadingResourceStore(); + const simulationIdStore = useSimulationIdStore(); - const { field, getDisasterIcon } = useHiddenPoint(); + const { field, style, getDisasterIcon } = useHiddenPoint(); // 信息框相关配置 const offsetX = ref(0); @@ -79,7 +82,8 @@ } const res = await $api.hiddenDangerSpots.getPointDetailById( - loadingInformationStore.debrisFlowHiddenPoint.id + loadingInformationStore.debrisFlowHiddenPoint.id, + simulationIdStore.status ? simulationIdStore.id : -1 ); // 更新数据 diff --git a/src/component/rain-earthquake/basic/FlashFloodComponent.vue b/src/component/rain-earthquake/basic/FlashFloodComponent.vue index d4a183e..0f20c37 100644 --- a/src/component/rain-earthquake/basic/FlashFloodComponent.vue +++ b/src/component/rain-earthquake/basic/FlashFloodComponent.vue @@ -15,6 +15,7 @@ ([]); const statusStore = useStatusStore(); const loadingInformationStore = useLoadingInformationStore(); const loadingResourceStore = useLoadingResourceStore(); + const simulationIdStore = useSimulationIdStore(); - const { field, getDisasterIcon } = useHiddenPoint(); + const { field, style, getDisasterIcon } = useHiddenPoint(); // 信息框相关配置 const offsetX = ref(0); @@ -79,7 +82,8 @@ } const res = await $api.hiddenDangerSpots.getPointDetailById( - loadingInformationStore.flashFloodHiddenPoint.id + loadingInformationStore.flashFloodHiddenPoint.id, + simulationIdStore.status ? simulationIdStore.id : -1 ); // 更新数据 diff --git a/src/component/rain-earthquake/basic/LandslideComponent.vue b/src/component/rain-earthquake/basic/LandslideComponent.vue index b16e3e6..4a00b51 100644 --- a/src/component/rain-earthquake/basic/LandslideComponent.vue +++ b/src/component/rain-earthquake/basic/LandslideComponent.vue @@ -15,6 +15,7 @@ ([]); const statusStore = useStatusStore(); const loadingInformationStore = useLoadingInformationStore(); const loadingResourceStore = useLoadingResourceStore(); + const simulationIdStore = useSimulationIdStore(); - const { field, getDisasterIcon } = useHiddenPoint(); + const { field, style, getDisasterIcon } = useHiddenPoint(); // 信息框相关配置 const offsetX = ref(0); @@ -79,7 +82,8 @@ } const res = await $api.hiddenDangerSpots.getPointDetailById( - loadingInformationStore.landslideHiddenPoint.id + loadingInformationStore.landslideHiddenPoint.id, + simulationIdStore.status ? simulationIdStore.id : -1 ); // 更新数据 diff --git a/src/component/rain-earthquake/basic/RiskPointComponent.vue b/src/component/rain-earthquake/basic/RiskPointComponent.vue index 49fed58..95c2e17 100644 --- a/src/component/rain-earthquake/basic/RiskPointComponent.vue +++ b/src/component/rain-earthquake/basic/RiskPointComponent.vue @@ -15,6 +15,7 @@ ([]); const statusStore = useStatusStore(); const loadingInformationStore = useLoadingInformationStore(); const loadingResourceStore = useLoadingResourceStore(); + const simulationIdStore = useSimulationIdStore(); // 信息框相关配置 const offsetX = ref(0); @@ -50,7 +53,7 @@ const riskPointDetail = ref(); // 获取钩子函数 - const { informationBoxTitle, field, getDisasterIcon } = useRiskPoint(); + const { informationBoxTitle, field, style, getDisasterIcon } = useRiskPoint(); $api.riskSpots.getBasePoints().then((res) => { riskPoints.value = res.data; @@ -72,7 +75,8 @@ } const res = await $api.riskSpots.getPointDetailById( - loadingInformationStore.riskPoint.id + loadingInformationStore.riskPoint.id, + simulationIdStore.status ? simulationIdStore.id : -1 ); // 更新数据 @@ -100,15 +104,13 @@ (newValue: boolean) => { if (newValue) { CesiumUtilsSingleton.batchShowPrimitives( - loadingResourceStore.getLoadingResource( - LoadingResource.RISK_POINT - ).ids + loadingResourceStore.getLoadingResource(LoadingResource.RISK_POINT) + .ids ); } else { CesiumUtilsSingleton.batchHidePrimitives( - loadingResourceStore.getLoadingResource( - LoadingResource.RISK_POINT - ).ids + loadingResourceStore.getLoadingResource(LoadingResource.RISK_POINT) + .ids ); } } diff --git a/src/component/rain-earthquake/basic/WaterLoggingComponent.vue b/src/component/rain-earthquake/basic/WaterLoggingComponent.vue index 16d19ae..c6f0874 100644 --- a/src/component/rain-earthquake/basic/WaterLoggingComponent.vue +++ b/src/component/rain-earthquake/basic/WaterLoggingComponent.vue @@ -3,9 +3,7 @@
([]); const statusStore = useStatusStore(); const loadingInformationStore = useLoadingInformationStore(); const loadingResourceStore = useLoadingResourceStore(); + const simulationIdStore = useSimulationIdStore(); - const { field, getDisasterIcon } = useHiddenPoint(); + const { field, style, getDisasterIcon } = useHiddenPoint(); // 信息框相关配置 const offsetX = ref(0); @@ -81,7 +82,8 @@ } const res = await $api.hiddenDangerSpots.getPointDetailById( - loadingInformationStore.waterLoggingHiddenPoint.id + loadingInformationStore.waterLoggingHiddenPoint.id, + simulationIdStore.status ? simulationIdStore.id : -1 ); // 更新数据 diff --git a/src/component/rain-earthquake/detail-panels/BridgeComponent.vue b/src/component/rain-earthquake/detail-panels/BridgeComponent.vue index 76b756f..74daf8e 100644 --- a/src/component/rain-earthquake/detail-panels/BridgeComponent.vue +++ b/src/component/rain-earthquake/detail-panels/BridgeComponent.vue @@ -15,6 +15,7 @@
{{ tableData.title }} {{ tableData.content }}