From 5679cbbb630092a197d991cb41997a2d953261e9 Mon Sep 17 00:00:00 2001
From: Riku <risaku@163.com>
Date: 星期三, 11 六月 2025 22:49:07 +0800
Subject: [PATCH] 动态溯源(待完成)

---
 src/views/sourcetrace/SourceTrace.vue |  201 +++++++------------------------------------------
 1 files changed, 30 insertions(+), 171 deletions(-)

diff --git a/src/views/sourcetrace/SourceTrace.vue b/src/views/sourcetrace/SourceTrace.vue
index 725f2d6..0a122c8 100644
--- a/src/views/sourcetrace/SourceTrace.vue
+++ b/src/views/sourcetrace/SourceTrace.vue
@@ -10,161 +10,19 @@
     <el-col v-show="show" span="10">
       <BaseCard>
         <template #content>
-          <!-- <div>
-        <el-input type="text" v-model="inputVal" />
-        <button @click="handleSend">send</button>
-        <button @click="handleLink">link</button>
-      </div> -->
-          <!-- <div>
-            <el-text type="primary" size="large" tag="b">鍔ㄦ�佹函婧�</el-text>
-          </div> -->
           <el-scrollbar ref="scrollbarRef" class="scrollbar">
             <div
               ref="scrollContentRef"
               style="display: flex; width: fit-content"
             >
-              <el-scrollbar
-                v-for="(item, index) in streams"
-                :key="index"
-                class="clue-card"
-              >
-                <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
-                  }}</el-text>
-                  <el-link
-                    type="primary"
-                    :underline="true"
-                    @click="showMarksAndPolygon(item)"
-                  >
-                    {{ item.showMore ? '鏀惰捣寮傚父' : '瀹氫綅寮傚父' }}
-                  </el-link>
-                </el-row>
-                <div>
-                  <el-text type="primary">
-                    姹℃煋鍖哄煙锛歿{ item.pollutedArea.address }}
-                  </el-text>
-                </div>
-                <div>
-                  <el-text type="primary">
-                    婧簮璺濈锛歿{
-                      formatDistanceType(item.pollutedArea.distanceType)
-                    }}
-                  </el-text>
-                </div>
-                <el-row style="border-top: 1px solid white">
-                  <el-col :span="6">
-                    <el-statistic
-                      title="绐佸彉鍥犲瓙"
-                      :value="item.pollutedData.factorName"
-                    />
-                  </el-col>
-                  <el-col :span="6">
-                    <el-statistic
-                      title="鍙樺寲骞呭害"
-                      :value="formatPercentage(item.pollutedData.avgPer)"
-                    />
-                  </el-col>
-                  <el-col :span="6">
-                    <el-statistic
-                      title="鍙戠敓娆℃暟"
-                      :value="item.pollutedData.times"
-                    />
-                  </el-col>
-                  <el-col :span="6">
-                    <el-statistic
-                      title="骞冲潎椋庨��"
-                      :value="item.pollutedData.windSpeed"
-                      suffix="m/s"
-                    />
-                  </el-col>
-                </el-row>
-                <el-row justify="space-between">
-                  <!-- <el-link
-                    type="primary"
-                    underline
-                    @click="showMarksAndPolygon(item)"
-                  >
-                    {{
-                      (item.showMore ? '鏀惰捣婧簮鍦烘櫙' : '鏌ョ湅婧簮鍦烘櫙') +
-                      '锛�' +
-                      item.pollutedSource.sceneList.length +
-                      '锛�'
-                    }}
-                  </el-link> -->
-                </el-row>
-                <div style="width: 320px; height: 140px">
-                  <RealTimeLineChart
-                    v-for="(item1, index1) in item._chartOptions"
-                    :key="index1"
-                    :model-value="item1"
-                  ></RealTimeLineChart>
-                </div>
-                <div class="border-dashed">
-                  <el-text type="" tag="mark">
-                    {{ item.pollutedSource.conclusion }}
-                  </el-text>
-                </div>
-                <SceneTable
-                  :show-marks="item.showMore"
-                  :scene-list="item.pollutedSource.sceneList"
-                ></SceneTable>
-
-                <!-- <el-space gap="4">
-                  <el-tag :type="item.status == 1 ? 'danger' : 'info'">{{
-                    item._statusStr
-                  }}</el-tag>
-                  <el-text type="default">{{ item.exception }}</el-text>
-                </el-space>
-                <el-row gap="4">
-                  <el-text type="primary">鍙戠敓鏃堕棿锛�</el-text>
-                  <el-text type="primary">{{
-                    item.startTime + ' 鑷� '
-                  }}</el-text>
-                  <el-text type="primary">{{
-                    item.status == 1 ? '褰撳墠' : item.endTime
-                  }}</el-text>
-                </el-row>
-                <el-row>
-                  <el-col :span="6">
-                    <el-statistic title="鍥犲瓙" :value="item.factorName" />
-                  </el-col>
-                  <el-col :span="6">
-                    <el-statistic title="鍧囧��" :value="item.avg" />
-                  </el-col>
-                  <el-col :span="6">
-                    <el-statistic title="宄板��" :value="item.max" />
-                  </el-col>
-                  <el-col :span="6">
-                    <el-statistic title="璋峰��" :value="item.min" />
-                  </el-col>
-                </el-row>
-                <el-row justify="space-between">
-                  <el-link
-                    type="primary"
-                    @click="item.showMore = !item.showMore"
-                  >
-                    {{
-                      (item.showMore ? '鏀惰捣婧簮鍦烘櫙' : '鏌ョ湅婧簮鍦烘櫙') +
-                      '锛�' +
-                      item.relatedSceneList.length +
-                      '锛�'
-                    }}
-                  </el-link>
-                  <el-link type="primary" @click="drawSector(item)">
-                    鏌ョ湅寮傚父
-                  </el-link>
-                </el-row>
-                <SceneTable
-                  v-show="item.showMore"
-                  :scene-list="item.relatedSceneList"
-                ></SceneTable>
-                <el-divider /> -->
-              </el-scrollbar>
+            <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,6 +45,8 @@
 import { FactorDatas } from '@/model/FactorDatas';
 import factorDataParser from '@/utils/chart/factor-data-parser';
 import websocketMsgParser from '@/views/sourcetrace/websocketMsgParser.js';
+
+import PollutedClueItem from './component/PollutedClueItem.vue';
 
 const props = defineProps({
   factorType: String
@@ -320,7 +180,7 @@
 function parseChartData(obj) {
   // console.log('鎶樼嚎鍥撅細start');
   const factorDatas = new FactorDatas();
-  factorDatas.setData(obj.pollutedData.dataVoList, 0, () => {
+  factorDatas.setData(obj.pollutedData.historyDataList, 0, () => {
     obj._chartOptions = factorDataParser.parseData(factorDatas, [
       {
         label: obj.pollutedData.factorName,
@@ -330,26 +190,6 @@
     ]);
     // console.log('鎶樼嚎鍥撅細', obj._chartOptions);
   });
-}
-
-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;
-  }
 }
 
 /******************************************************************************************************************** */
@@ -484,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

--
Gitblit v1.9.3