From d0f07e25103d7c7845c3b9534e8c66b5905447c0 Mon Sep 17 00:00:00 2001
From: Riku <risaku@163.com>
Date: 星期三, 04 六月 2025 23:27:55 +0800
Subject: [PATCH] 动态溯源(待完成)

---
 src/views/sourcetrace/SourceTrace.vue       |   29 +++++---------
 src/api/index.js                            |    8 ++--
 src/views/sourcetrace/websocketMsgParser.js |   13 ++++++
 src/components.d.ts                         |    4 --
 src/components/scene/SceneSearch.vue        |    1 
 src/utils/map/line.js                       |    9 ++++
 src/components/CardDialog.vue               |    4 +-
 src/views/realtimemode/RealtimeMode.vue     |    4 +
 src/views/sourcetrace/UnderwayAdvice.vue    |   44 ++++++++++++++++++++++
 9 files changed, 85 insertions(+), 31 deletions(-)

diff --git a/src/api/index.js b/src/api/index.js
index c83bec6..73e7919 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -13,10 +13,10 @@
 }
 
 if (debug) {
-  ip1 = 'http://192.168.0.110:8084/';
-  // ip1 = 'http://localhost:8084/';
-  ws = `192.168.0.110:9031`;
-  // ws = `localhost:9031`;
+  // ip1 = 'http://192.168.0.110:8084/';
+  ip1 = 'http://localhost:8084/';
+  // ws = `192.168.0.110:9031`;
+  ws = `localhost:9031`;
 }
 
 const $http = axios.create({
diff --git a/src/components.d.ts b/src/components.d.ts
index d85f428..75ed0a7 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -31,7 +31,6 @@
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
     ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
     ElDialog: typeof import('element-plus/es')['ElDialog']
-    ElDivider: typeof import('element-plus/es')['ElDivider']
     ElDropdown: typeof import('element-plus/es')['ElDropdown']
     ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
     ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
@@ -39,7 +38,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']
@@ -50,14 +48,12 @@
     ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
     ElSelect: typeof import('element-plus/es')['ElSelect']
     ElSlider: typeof import('element-plus/es')['ElSlider']
-    ElSpace: typeof import('element-plus/es')['ElSpace']
     ElStatistic: typeof import('element-plus/es')['ElStatistic']
     ElSwitch: typeof import('element-plus/es')['ElSwitch']
     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']
-    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/CardDialog.vue b/src/components/CardDialog.vue
index 0d9a0d8..56cb935 100644
--- a/src/components/CardDialog.vue
+++ b/src/components/CardDialog.vue
@@ -25,7 +25,7 @@
         </template>
       </BaseCard>
     </template>
-    <BaseCard size="medium">
+    <BaseCard v-bind="$attrs">
       <template #content>
         <slot></slot>
       </template>
@@ -53,7 +53,7 @@
     modal: {
       type: Boolean,
       default: true
-    }
+    },
   },
   // emits: ['update:modelValue', 'changed'],
   methods: {
diff --git a/src/components/scene/SceneSearch.vue b/src/components/scene/SceneSearch.vue
index a7644ac..fcf7c57 100644
--- a/src/components/scene/SceneSearch.vue
+++ b/src/components/scene/SceneSearch.vue
@@ -13,6 +13,7 @@
     draggable
     :modal="false"
     width="400px"
+    size="medium"
   >
     <template #default>
       <el-row class="scene-table">
diff --git a/src/utils/map/line.js b/src/utils/map/line.js
index 6245983..bb32b78 100644
--- a/src/utils/map/line.js
+++ b/src/utils/map/line.js
@@ -20,6 +20,11 @@
   });
 }
 
+function drawDirection(path) {
+  const polyline = newPolyline(path, '#02ffea');
+  map.add(polyline)
+}
+
 export default {
   drawLine(fDatas, factor) {
     if (defaultPolylineArr.length > 0) {
@@ -105,5 +110,7 @@
         map.remove(v);
       });
     }
-  }
+  },
+
+  drawDirection
 };
diff --git a/src/views/realtimemode/RealtimeMode.vue b/src/views/realtimemode/RealtimeMode.vue
index b18b4a6..7ebb66b 100644
--- a/src/views/realtimemode/RealtimeMode.vue
+++ b/src/views/realtimemode/RealtimeMode.vue
@@ -29,6 +29,7 @@
       class="source-trace"
       v-model:factorType="factorType"
     ></SourceTrace>
+    <UnderwayAdvice></UnderwayAdvice>
   </div>
 </template>
 
@@ -43,6 +44,7 @@
 import RealTimeTrend from './component/RealTimeTrend.vue';
 import DeviceChange from './component/DeviceChange.vue';
 import SourceTrace from '@/views/sourcetrace/SourceTrace.vue';
+import UnderwayAdvice from '@/views/sourcetrace/UnderwayAdvice.vue';
 import { realTimeMapAnimation } from '@/utils/map/animation';
 import {
   fetchHistoryData,
@@ -59,7 +61,7 @@
 // const mode = 'product';
 
 export default {
-  components: { DashBoard, RealTimeTrend, DeviceChange, SourceTrace },
+  components: { DashBoard, RealTimeTrend, DeviceChange, SourceTrace, UnderwayAdvice },
   setup() {
     const { loading, fetchData } = useFetchData(10000);
     return { loading, fetchData };
diff --git a/src/views/sourcetrace/SourceTrace.vue b/src/views/sourcetrace/SourceTrace.vue
index b0760b3..0ce544e 100644
--- a/src/views/sourcetrace/SourceTrace.vue
+++ b/src/views/sourcetrace/SourceTrace.vue
@@ -74,7 +74,7 @@
                   </el-col>
                 </el-row>
                 <el-row justify="space-between">
-                  <el-link
+                  <!-- <el-link
                     type="primary"
                     underline
                     @click="showMarksAndPolygon(item)"
@@ -85,16 +85,16 @@
                       item.pollutedSource.sceneList.length +
                       '锛�'
                     }}
-                  </el-link>
-                  <!-- <el-link
+                  </el-link> -->
+                  <el-link
                     type="primary"
                     underline
-                    @click="drawPolygon(item.pollutedArea)"
+                    @click="showMarksAndPolygon(item)"
                   >
-                    瀹氫綅寮傚父
-                  </el-link> -->
+                    {{ item.showMore ? '鏀惰捣寮傚父' : '瀹氫綅寮傚父' }}
+                  </el-link>
                 </el-row>
-                <div v-show="item.showMore" style="width: 320px; height: 140px">
+                <div style="width: 320px; height: 140px">
                   <RealTimeLineChart
                     v-for="(item1, index1) in item._chartOptions"
                     :key="index1"
@@ -102,7 +102,6 @@
                   ></RealTimeLineChart>
                 </div>
                 <SceneTable
-                  v-show="item.showMore"
                   :show-marks="item.showMore"
                   :scene-list="item.pollutedSource.sceneList"
                 ></SceneTable>
@@ -179,10 +178,9 @@
 import { map, onMapMounted } from '@/utils/map/index_old';
 import { FactorDatas } from '@/model/FactorDatas';
 import factorDataParser from '@/utils/chart/factor-data-parser';
+import websocketMsgParser from "@/views/sourcetrace/websocketMsgParser.js";
 
-const START_STR = '##';
-const SPLIT_STR = '&&';
-const END_STR = '%%';
+
 
 const props = defineProps({
   factorType: String
@@ -219,9 +217,7 @@
 
 let showFirstClueTask;
 function dealMsg(data) {
-  const [type, content] = data
-    .substring(START_STR.length, data.length - END_STR.length)
-    .split(SPLIT_STR);
+  const {type, content} = websocketMsgParser.parseMsg(data)
 
   // 姹℃煋绾跨储 PollutedClue
   if (type == '1') {
@@ -251,11 +247,6 @@
     showFirstClueTask = setTimeout(() => {
       showMarksAndPolygon(obj);
     }, 1000);
-  }
-  // 姹℃煋鍒嗘瀽缁撴灉 AnalysisResult
-  else if (type == '2') {
-    const obj = JSON.parse(content);
-    console.log('姹℃煋鍒嗘瀽缁撴灉: ', obj);
   }
 }
 
diff --git a/src/views/sourcetrace/UnderwayAdvice.vue b/src/views/sourcetrace/UnderwayAdvice.vue
new file mode 100644
index 0000000..8c2b68d
--- /dev/null
+++ b/src/views/sourcetrace/UnderwayAdvice.vue
@@ -0,0 +1,44 @@
+<template>
+  <CardDialog
+    v-model="dialogVisible"
+    title="璧拌埅璺嚎鎺ㄨ崘"
+    draggable
+    :modal="false"
+    width="400px"
+  >
+    <template #default> </template>
+    <template #footer> </template>
+  </CardDialog>
+</template>
+
+<script setup>
+import { ref, onMounted, onUnmounted } from 'vue';
+import websocket from '@/api/websocket';
+import websocketMsgParser from '@/views/sourcetrace/websocketMsgParser.js';
+import mapLine from '@/utils/map/line';
+
+const dialogVisible = ref(true);
+
+onMounted(() => {
+  websocket.registerReceiveEvent(dealMsg);
+});
+onUnmounted(() => {
+  websocket.removeReceiveEvent(dealMsg);
+});
+
+function dealMsg(data) {
+  const { type, content } = websocketMsgParser.parseMsg(data);
+  // 姹℃煋鍒嗘瀽缁撴灉 AnalysisResult
+  if (type == '2') {
+    const obj = JSON.parse(content);
+    console.log('姹℃煋鍒嗘瀽缁撴灉: ', obj);
+
+    obj.sortedSceneList;
+    obj.time;
+    obj.advice;
+    obj.direction;
+
+    mapLine.drawDirection(obj.direction.paths.map((v) => [v.first, v.second]));
+  }
+}
+</script>
diff --git a/src/views/sourcetrace/websocketMsgParser.js b/src/views/sourcetrace/websocketMsgParser.js
new file mode 100644
index 0000000..89372c4
--- /dev/null
+++ b/src/views/sourcetrace/websocketMsgParser.js
@@ -0,0 +1,13 @@
+const START_STR = '##';
+const SPLIT_STR = '&&';
+const END_STR = '%%';
+
+export default {
+  parseMsg(data) {
+    const [type, content] = data
+      .substring(START_STR.length, data.length - END_STR.length)
+      .split(SPLIT_STR);
+
+    return { type, content };
+  }
+};

--
Gitblit v1.9.3