diff --git a/package.json b/package.json index ab71b93..3eac5f7 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@turf/turf": "^6.5.0", "axios": "1.2.0", "crypto-js": "4.1.1", + "dayjs": "^1.11.13", "echarts": "5.3.3", "echarts-liquidfill": "^3.1.0", "element-plus": "2.3.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 42b0cfe..175cce9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ importers: crypto-js: specifier: 4.1.1 version: 4.1.1 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 echarts: specifier: 5.3.3 version: 5.3.3 diff --git a/src/api/reservoir/index.ts b/src/api/reservoir/index.ts new file mode 100644 index 0000000..c34017b --- /dev/null +++ b/src/api/reservoir/index.ts @@ -0,0 +1,210 @@ +import { request } from '../axios'; + +// 获取场景列表 +export const getSceneListData = async (data: any) => { + return request({ + url: `/map/scene/sceneList`, + method: 'post', + data: { + pageNum: 1, + pageSize: 10, + data: { + id: '', + name: data.name + }, + params: { + order: 'asc', + orderBy: 'pub_date' + } + } + }); +}; + +// 根据id获取图层树 +export const getLayerData = async (sceneId: any) => { + return request({ + url: `/map/scene/getLayerTree/${sceneId}`, + method: 'get' + }); +}; + +// 获取水库基础列表 +export const getReservoirBaseListData = (data: any) => { + return request({ + url: `/sk/base/list`, + method: 'post', + data: data + }); +}; + +// 获取水库测站基础列表 +export const getReservoirCZListData = (data: any) => { + return request({ + url: `/cz/base/list`, + method: 'post', + data: data + }); +}; + +// 获取测点列表 /cd/base/list +export const getReservoirCDListData = (data: any) => { + return request({ + url: `/cd/base/list`, + method: 'post', + data: data + }); +}; + + +// 获取水库测站提交告警详情 +export const getReservoirCZAlarmDetailsData = (id: string | number) => { + return request({ + url: `/cz/base/${id}`, + method: 'get' + }); +}; + +// 水库基础信息详情 +export const getReservoirBaseDetailData = (id: string | number) => { + return request({ + url: `/sk/base/${id}`, + method: 'get' + }); +}; +// 获取水库代表站信息详情 +export const getReservoirFlagCZData = (id: string | number) => { + return request({ + url: `/sk/base/stcd/${id}`, + method: 'get' + }); +}; +// 水库特征信息详情 +export const getReservoirRsppDetailData = (id: string | number) => { + return request({ + url: `/sk/rspp/${id}`, + method: 'get' + }); +}; + +// 水库测站详情 +export const getReservoirCZDetailData = (id: string | number) => { + return request({ + url: `/cz/base/${id}`, + method: 'get' + }); +}; + +// 测站要素详情 +export const getReservoirCZElementDetailData = (data: any) => { + return request({ + url: `/cz/monitor/water`, + method: 'post', + data + }); +}; + +// 获取测站测点指标 /cz/monitor/index +export const getReservoirMonitorIndexData = (data: any) => { + return request({ + url: `/cz/monitor/index`, + method: 'post', + data + }); +}; + +// 测站树结构 +export const getReservoirTreeDetailData = (data: any) => { + return request({ + url: `/cd/base/tree`, + method: 'get', + params: data + }); +}; + +// 获取测点列表 +export const getReservoirCZPointListData = (data: any) => { + return request({ + url: `/cd/base/list`, + method: 'post', + data + }); +}; + +// 获取水库测站echarts数据 +export const getReservoirCZEchartsData = (data: any) => { + return request({ + url: `/cz/monitor/chart`, + method: 'post', + data + }); +}; + +// 分页获取监测告警信息/cz/alarm/page +export const getReservoirCZAlarmPageData = (data: any) => { + return request({ + url: `/cz/alarm/page`, + method: 'post', + data + }); +}; + +// 保存监测预警表单信息 /cz/monitor/config +export const saveReservoirCZMonitorConfigData = (data: any) => { + return request({ + url: `/cz/monitor/config`, + method: 'post', + data + }); +}; + +// 获取监测预警表单信息 /cz/monitor/config/list/{stcd} +export const getReservoirCZMonitorConfigData = (stcd: any) => { + return request({ + url: `/cz/monitor/config/list/${stcd}`, + method: 'get' + }); +}; + +// 获取echart数据 /cz/monitor/chart +export const getReservoirCZMonitorEchartsData = (data: any) => { + return request({ + url: `/cz/monitor/chart`, + method: 'post', + data + }); +}; + +// 获取视频列表/safe/operation/Play +export const getOperationPlay = (data: any) => { + return request({ + url: `/safe/operation/play`, + method: 'post', + data + }); +}; + +export const getVideoDataList = (data: any) => { + return request({ + url: `/safe/operation/reservoirList`, + method: 'post', + data + }); +}; + +// 水库实时监测--监测站树数据 +export const getReservoirMonitorTreeData = (id: string | number) => { + return request({ + url: `/sk/??`, + method: 'get' + }); +}; + +// 水库实时监测--降雨量等详情 +export const getReservoirRainDetailData = (id: string | number) => { + return request({ + url: `/sk/??`, + method: 'get' + }); +} + + diff --git a/src/components.d.ts b/src/components.d.ts index d58ef46..10a0151 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -9,12 +9,22 @@ declare module 'vue' { export interface GlobalComponents { Card: typeof import('./components/Card/index.vue')['default'] Dialog: typeof import('./components/Dialog/index.vue')['default'] + ElButton: typeof import('element-plus/es')['ElButton'] + ElCascader: typeof import('element-plus/es')['ElCascader'] ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] + ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] + ElDescriptions: typeof import('element-plus/es')['ElDescriptions'] + ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem'] ElInput: typeof import('element-plus/es')['ElInput'] ElOption: typeof import('element-plus/es')['ElOption'] ElPopover: typeof import('element-plus/es')['ElPopover'] + ElRadioButton: typeof import('element-plus/es')['ElRadioButton'] + ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] ElSelect: typeof import('element-plus/es')['ElSelect'] - ElTag: typeof import('element-plus/es')['ElTag'] + ElTable: typeof import('element-plus/es')['ElTable'] + ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] + ElTabPane: typeof import('element-plus/es')['ElTabPane'] + ElTabs: typeof import('element-plus/es')['ElTabs'] ElTooltip: typeof import('element-plus/es')['ElTooltip'] ElTree: typeof import('element-plus/es')['ElTree'] ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect'] diff --git a/src/hooks/web/useProject.tsx b/src/hooks/web/useProject.tsx index 22c92e5..7c96cfe 100644 --- a/src/hooks/web/useProject.tsx +++ b/src/hooks/web/useProject.tsx @@ -4,6 +4,7 @@ import { LayerTypeEnum } from '@/enums/projectEnum'; import { queryLayersByPos } from "@/utils/mapUtils"; import axios from 'axios'; import { throttle } from "lodash-es"; +import { useProjectStore } from '@/store/modules/project'; const clustering = reactive({ enabled: true, pixelRange: 200, @@ -289,47 +290,48 @@ export function useLayer() { if (!layerType || !(action = layerActions[layerType as string])) return; let layer: any = await action(layerData); if (isNeedCluster === '1' && layerData.nameCn === "水库点") { - let baseUrl = import.meta.env.VITE_BASE_URL; - const data = await getFeatures(layerData); - if (data?.features?.[0]?.geometry?.type === 'Point') { - let layerConfig = {}; - switch (layerData.nameCn) { - case "水库点": - layerConfig = { - isUniqueRender: true, - field: "ENG_SCAL", - fieldOptions: [ - { name: "1.0", attr: "image", value: "reservoir_big.png" }, - { name: "2.0", attr: "image", value: "reservoir_big.png" }, - { name: "3.0", attr: "image", value: "reservoir_normal.png" }, - { name: "4.0", attr: "image", value: "reservoir_small.png" }, - { name: "5.0", attr: "image", value: "reservoir_small.png" }, - ], - image: "map-title-o.png", - }; - break; - } - layer = new SyCim.ClusterWfsLayer(layerData.id, { - data, - symbol: { - type: "billboardP", - imageProxy: `${baseUrl}/img/map/`, // 图片代理 - style: { - clampToGround: false, - image: "reservoir_small.png", - ...layerConfig, - }, - }, - clustering: { - enabled: clustering.enabled, - pixelRange: clustering.pixelRange, - minimumClusterSize: clustering.minimumClusterSize, - clusterEvent: undefined, - clusterColors: undefined, // 聚合点颜色 - getImage: undefined, // 获取聚合图片的函数 - }, - }); - } + // let baseUrl = import.meta.env.VITE_BASE_URL; + // const data = await getFeatures(layerData); + // if (data?.features?.[0]?.geometry?.type === 'Point') { + // let layerConfig = {}; + // switch (layerData.nameCn) { + // case "水库点": + // layerConfig = { + // isUniqueRender: true, + // field: "ENG_SCAL", + // fieldOptions: [ + // { name: "1.0", attr: "image", value: "reservoir_big.png" }, + // { name: "2.0", attr: "image", value: "reservoir_big.png" }, + // { name: "3.0", attr: "image", value: "reservoir_normal.png" }, + // { name: "4.0", attr: "image", value: "reservoir_small.png" }, + // { name: "5.0", attr: "image", value: "reservoir_small.png" }, + // ], + // image: "map-title-o.png", + // }; + // break; + // } + // layer = new SyCim.ClusterWfsLayer(layerData.id, { + // data, + // symbol: { + // type: "billboardP", + // imageProxy: `${baseUrl}/img/map/`, // 图片代理 + // style: { + // clampToGround: false, + // image: "reservoir_small.png", + // ...layerConfig, + // }, + // }, + // clustering: { + // enabled: clustering.enabled, + // pixelRange: clustering.pixelRange, + // minimumClusterSize: clustering.minimumClusterSize, + // clusterEvent: undefined, + // clusterColors: undefined, // 聚合点颜色 + // getImage: undefined, // 获取聚合图片的函数 + // }, + // }); + // } + addViewerClick(); } layer && window.viewer.addLayer(layer); if (['013000'].includes(layerType)) { @@ -366,21 +368,30 @@ export function useLayer() { const { layerType } = data; zoomToLayerActions[layerType as string]?.(data); }; - const viewerClick = throttle((e) => { - console.log(e); - }, 500); - const addViewerMouseClick = () => { - window.viewer?.on(SyCim.MouseEventType.MOUSE_MOVE, viewerClick); + const viewerClick = (e: any) => { + const projectStore = useProjectStore(); + const selectedLayers: any = projectStore.selectedLayers; + queryLayersByPos(e.wgs84SurfacePosition, selectedLayers, (res: any) => { + if (res?.attributes?.showCode) { + const { showCode, showName } = res?.attributes; + window.$bus.$emit("open-water-dialog", { + code: showCode, + name: showName + }); + } + }); + }; + const addViewerClick = () => { + window.viewer?.on(SyCim.MouseEventType.CLICK, viewerClick, window.viewer); }; - const removeViewerMouseClick = () => { - window.viewer?.off(SyCim.MouseEventType.MOUSE_MOVE, viewerClick); + const removeViewerClick = () => { + window.viewer?.off(SyCim.MouseEventType.CLICK, viewerClick, window.viewer); }; return { addLayer, removeLayer, zoomToLayer, - addViewerMouseClick, - removeViewerMouseClick + removeViewerClick }; } diff --git a/src/views/Main/Map/components/LayerTree.vue b/src/views/Main/Map/components/LayerTree.vue index 1845e93..39acc7f 100644 --- a/src/views/Main/Map/components/LayerTree.vue +++ b/src/views/Main/Map/components/LayerTree.vue @@ -43,7 +43,7 @@ import { useProjectStore } from "@/store/modules/project"; import { useLayer } from "@/hooks/web/useProject"; import { flattenTree } from "@/utils/index"; import Tree from "@/components/Tree/index.vue"; -const { zoomToLayer, addViewerMouseClick, removeViewerMouseClick } = useLayer(); +const { zoomToLayer, removeViewerClick } = useLayer(); const projectStore = useProjectStore(); defineOptions({ @@ -117,11 +117,7 @@ watch( }, ); -onMounted(() => { - addViewerMouseClick(); -}); - onBeforeUnmount(() => { - removeViewerMouseClick(); + removeViewerClick(); }); diff --git a/src/views/Main/ProjectOperation/components/BaseInfo.vue b/src/views/Main/ProjectOperation/components/BaseInfo.vue new file mode 100644 index 0000000..dcf4d17 --- /dev/null +++ b/src/views/Main/ProjectOperation/components/BaseInfo.vue @@ -0,0 +1,739 @@ + + + diff --git a/src/views/Main/ProjectOperation/components/DataStatistics.vue b/src/views/Main/ProjectOperation/components/DataStatistics.vue new file mode 100644 index 0000000..f49db0a --- /dev/null +++ b/src/views/Main/ProjectOperation/components/DataStatistics.vue @@ -0,0 +1,411 @@ + + + + diff --git a/src/views/Main/ProjectOperation/components/MonitorWarning.vue b/src/views/Main/ProjectOperation/components/MonitorWarning.vue new file mode 100644 index 0000000..aa19472 --- /dev/null +++ b/src/views/Main/ProjectOperation/components/MonitorWarning.vue @@ -0,0 +1,179 @@ + + + diff --git a/src/views/Main/ProjectOperation/components/VideoAnalysis.vue b/src/views/Main/ProjectOperation/components/VideoAnalysis.vue new file mode 100644 index 0000000..f57d984 --- /dev/null +++ b/src/views/Main/ProjectOperation/components/VideoAnalysis.vue @@ -0,0 +1,94 @@ + + + diff --git a/src/views/Main/ProjectOperation/index.vue b/src/views/Main/ProjectOperation/index.vue new file mode 100644 index 0000000..6e362b8 --- /dev/null +++ b/src/views/Main/ProjectOperation/index.vue @@ -0,0 +1,66 @@ + + + diff --git a/src/views/Main/index.vue b/src/views/Main/index.vue index 806e961..eab1d1c 100644 --- a/src/views/Main/index.vue +++ b/src/views/Main/index.vue @@ -24,6 +24,7 @@ +