From 5679cbbb630092a197d991cb41997a2d953261e9 Mon Sep 17 00:00:00 2001 From: Riku <risaku@163.com> Date: 星期三, 11 六月 2025 22:49:07 +0800 Subject: [PATCH] 动态溯源(待完成) --- src/components/map/MapScene.vue | 2 src/views/sourcetrace/SourceTrace.vue | 50 ++++++----- src/api/index.js | 8 +- src/views/sourcetrace/component/PollutedClueItem.vue | 38 +++++++++ src/components.d.ts | 2 src/utils/map/line.js | 5 src/views/realtimemode/RealtimeMode.vue | 8 + src/views/sourcetrace/UnderwayAdvice.vue | 71 +++++++++++++++++ 8 files changed, 149 insertions(+), 35 deletions(-) diff --git a/src/api/index.js b/src/api/index.js index efcd5a1..1792861 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -13,10 +13,10 @@ } if (debug) { - ip1 = 'http://192.168.0.103:8084/'; - // ip1 = 'http://localhost:8084/'; - ws = `192.168.0.103:9031`; - // ws = `localhost:9031`; + // ip1 = 'http://192.168.0.103:8084/'; + ip1 = 'http://localhost:8084/'; + // ws = `192.168.0.103:9031`; + ws = `localhost:9031`; } const $http = axios.create({ diff --git a/src/components.d.ts b/src/components.d.ts index 12774c6..4fb05dd 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -39,7 +39,6 @@ ElFormItem: typeof import('element-plus/es')['ElFormItem'] ElIcon: typeof import('element-plus/es')['ElIcon'] ElInput: typeof import('element-plus/es')['ElInput'] - ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] ElLink: typeof import('element-plus/es')['ElLink'] ElOption: typeof import('element-plus/es')['ElOption'] ElPagination: typeof import('element-plus/es')['ElPagination'] @@ -57,6 +56,7 @@ ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] ElTabPane: typeof import('element-plus/es')['ElTabPane'] ElTabs: typeof import('element-plus/es')['ElTabs'] + ElTag: typeof import('element-plus/es')['ElTag'] ElText: typeof import('element-plus/es')['ElText'] FactorCheckbox: typeof import('./components/monitor/FactorCheckbox.vue')['default'] FactorLegend: typeof import('./components/monitor/FactorLegend.vue')['default'] diff --git a/src/components/map/MapScene.vue b/src/components/map/MapScene.vue index 4482623..9e0fb06 100644 --- a/src/components/map/MapScene.vue +++ b/src/components/map/MapScene.vue @@ -105,7 +105,7 @@ sceneIcon(t), res, false, - false + true ); lableMarkMap.set(key, { show: true, layer }); }); diff --git a/src/utils/map/line.js b/src/utils/map/line.js index 195e797..a4395dd 100644 --- a/src/utils/map/line.js +++ b/src/utils/map/line.js @@ -9,7 +9,8 @@ // eslint-disable-next-line no-undef return new AMap.Polyline({ path: path, - strokeStyle: 'solid', + // strokeStyle: 'solid', + strokeStyle: 'dashed', isOutline: true, borderWeight: 1, outlineColor: 'white', @@ -21,7 +22,7 @@ } function drawDirection(path) { - const polyline = newPolyline(path, '#02ffea'); + const polyline = newPolyline(path, '#ffd82a'); map.add(polyline); return polyline; } diff --git a/src/views/realtimemode/RealtimeMode.vue b/src/views/realtimemode/RealtimeMode.vue index 5691c14..c72f699 100644 --- a/src/views/realtimemode/RealtimeMode.vue +++ b/src/views/realtimemode/RealtimeMode.vue @@ -137,7 +137,13 @@ deviceCode: this.deviceCode, // startTime: '2025-01-16 11:34:00', // endTime: '2025-01-16 11:35:00', - startTime: '2024-11-27 11:50:41', + // startTime: '2025-01-20 12:40:00', + // startTime: '2024-12-27 08:30:00', + // startTime: '2024-12-13 16:35:00', + // startTime: '2024-11-27 11:50:41', // Pm, 涓窛绂诲伐鍦� + // startTime: '2024-08-30 15:28:00', // voc 杩戣窛绂绘苯淇� + startTime: '2024-07-23 15:22:00', + // startTime: '2024-07-23 14:39:00', endTime: '2025-01-16 11:51:41', page, perPage: 10 diff --git a/src/views/sourcetrace/SourceTrace.vue b/src/views/sourcetrace/SourceTrace.vue index 5286e19..0a122c8 100644 --- a/src/views/sourcetrace/SourceTrace.vue +++ b/src/views/sourcetrace/SourceTrace.vue @@ -15,9 +15,14 @@ ref="scrollContentRef" style="display: flex; width: fit-content" > - <template v-for="(item, index) in streams" :key="index"> - <PollutedClueItem :item="item"></PollutedClueItem> - </template> + <TransitionGroup name="list"> + <div v-for="(item, index) in streams" :key="index"> + <PollutedClueItem + :item="item" + @showMarksAndPolygon="showMarksAndPolygon" + ></PollutedClueItem> + </div> + </TransitionGroup> </div> </el-scrollbar> </template> @@ -187,26 +192,6 @@ }); } -function formatPercentage(value) { - return Math.round(value * 100) + '%'; -} - -function formatDistanceType(value) { - switch (value) { - case 'TYPE1': - return '50绫�'; - case 'TYPE2': - return '50绫� - 500绫�'; - case 'TYPE3': - return '50绫� - 1鍏噷'; - case 'TYPE4': - return '50绫� - 2鍏噷'; - - default: - break; - } -} - /******************************************************************************************************************** */ /** @@ -339,3 +324,22 @@ margin-bottom: 4px; } </style> +<style> +.list-move, /* 瀵圭Щ鍔ㄤ腑鐨勫厓绱犲簲鐢ㄧ殑杩囨浮 */ +.list-enter-active, +.list-leave-active { + transition: all 0.5s ease; +} + +.list-enter-from, +.list-leave-to { + opacity: 0; + transform: translateX(30px); +} + +/* 纭繚灏嗙寮�鐨勫厓绱犱粠甯冨眬娴佷腑鍒犻櫎 + 浠ヤ究鑳藉姝g‘鍦拌绠楃Щ鍔ㄧ殑鍔ㄧ敾銆� */ +.list-leave-active { + position: absolute; +} +</style> \ No newline at end of file diff --git a/src/views/sourcetrace/UnderwayAdvice.vue b/src/views/sourcetrace/UnderwayAdvice.vue index 183ba28..b8eaf03 100644 --- a/src/views/sourcetrace/UnderwayAdvice.vue +++ b/src/views/sourcetrace/UnderwayAdvice.vue @@ -7,7 +7,7 @@ width="400px" > <template #default> - <template v-if="latestResult"> + <!-- <template v-if="latestResult"> <el-row> <el-text size="small">{{ latestResult._timestr }}</el-text> </el-row> @@ -25,7 +25,54 @@ 鎺ㄨ崘璺嚎鎬婚暱{{ latestResult.direction.distance }}绫� </el-text> </el-row> - </template> + </template> --> + <TransitionGroup name="list"> + <div v-for="(item, index) in analysisResultList" :key="index"> + <template v-if="index == 0"> + <el-row justify="space-between"> + <el-text size="small">{{ item._timestr }}</el-text> + <el-tag type="danger" effect="dark">鏈�鏂扮嚎绱�</el-tag> + </el-row> + <el-space> + <el-icon color="#F56C6C" :size="40" + ><WarnTriangleFilled + /></el-icon> + <el-text> + {{ item.advice }} + </el-text> + </el-space> + <el-row justify="space-between"> + <el-link type="primary" :underline="true" @click="showPolyline"> + {{ lineShow ? '鏀惰捣璺嚎' : '瀹氫綅璺嚎' }} + </el-link> + <el-text size="small"> + 鎺ㄨ崘璺嚎鎬婚暱{{ item.direction.distance }}绫� + </el-text> + </el-row> + <el-divider>鍘嗗彶绾跨储</el-divider> + </template> + <template v-else> + <el-row> + <el-text size="small">{{ item._timestr }}</el-text> + </el-row> + <el-space> + <!-- <el-icon color="#F56C6C" :size="40"><WarnTriangleFilled /></el-icon> --> + <el-text> + {{ item.advice }} + </el-text> + </el-space> + <!-- <el-row justify="space-between"> + <el-link type="primary" :underline="true" @click="showPolyline"> + {{ lineShow ? '鏀惰捣璺嚎' : '瀹氫綅璺嚎' }} + </el-link> + <el-text size="small"> + 鎺ㄨ崘璺嚎鎬婚暱{{ item.direction.distance }}绫� + </el-text> + </el-row> --> + <el-divider></el-divider> + </template> + </div> + </TransitionGroup> </template> <template #footer> </template> </CardDialog> @@ -105,5 +152,25 @@ :deep(.el-link) { --el-link-text-color: #23dad1; + /* color: #ffd82a; */ +} +</style> +<style> +.list-move, /* 瀵圭Щ鍔ㄤ腑鐨勫厓绱犲簲鐢ㄧ殑杩囨浮 */ +.list-enter-active, +.list-leave-active { + transition: all 0.5s ease; +} + +.list-enter-from, +.list-leave-to { + opacity: 0; + transform: translateX(30px); +} + +/* 纭繚灏嗙寮�鐨勫厓绱犱粠甯冨眬娴佷腑鍒犻櫎 + 浠ヤ究鑳藉姝g‘鍦拌绠楃Щ鍔ㄧ殑鍔ㄧ敾銆� */ +.list-leave-active { + position: absolute; } </style> diff --git a/src/views/sourcetrace/component/PollutedClueItem.vue b/src/views/sourcetrace/component/PollutedClueItem.vue index 392d271..0bf7086 100644 --- a/src/views/sourcetrace/component/PollutedClueItem.vue +++ b/src/views/sourcetrace/component/PollutedClueItem.vue @@ -5,7 +5,7 @@ <el-row justify="space-between"> <!-- <el-tag v-if="index == 0" type="danger">鏈�鏂�</el-tag> --> <el-text type="primary">{{ - '绾跨储鏃堕棿锛�' + + '鍒囩墖鏃堕棿锛�' + item.pollutedData.startTime + ' - ' + item.pollutedData.endTime @@ -39,7 +39,13 @@ </el-col> <el-col :span="6"> <el-statistic + v-if="item.pollutedData.exceptionType == 4" title="鍙樺寲骞呭害" + :value="formatPercentage(item.pollutedData.avgPer)" + /> + <el-statistic + v-else-if="item.pollutedData.exceptionType == 9" + title="鍙樺寲閫熺巼" :value="formatPercentage(item.pollutedData.avgPer)" /> </el-col> @@ -146,6 +152,36 @@ const props = defineProps({ item: Object }); + +const emits = defineEmits(['showMarksAndPolygon']); + +function showMarksAndPolygon(item) { + emits('showMarksAndPolygon', item); +} + +function formatPercentage(value) { + return Math.round(value * 100) + '%'; +} + +function formatDistanceType(value) { + switch (value) { + case 'TYPE1': + return '50绫�'; + case 'TYPE2': + return '50绫� - 500绫�'; + case 'TYPE3': + return '50绫� - 1鍏噷'; + case 'TYPE4': + return '50绫� - 2鍏噷'; + + default: + break; + } +} + +function formatChangeRate() { + +} </script> <style scoped> :deep(.el-statistic) { -- Gitblit v1.9.3