From 306ef09707d6bcf9ffa67de55f86ab6f4362deee Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期五, 18 七月 2025 10:04:01 +0800
Subject: [PATCH] 2025.7.18 动态溯源-测试版本

---
 src/views/historymode/HistoryMode.vue |  173 +++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 129 insertions(+), 44 deletions(-)

diff --git a/src/views/historymode/HistoryMode.vue b/src/views/historymode/HistoryMode.vue
index d75c5b2..452fc0d 100644
--- a/src/views/historymode/HistoryMode.vue
+++ b/src/views/historymode/HistoryMode.vue
@@ -4,10 +4,17 @@
       <SearchBar
         v-show="status == 0"
         :search-time="searchTime"
-        :loading="loading"
-        @search="fetchHistroyData"
+        :loading="loading || thirdPartyLoading"
+        @search="onSearch"
       ></SearchBar>
       <TrajectoryState v-show="status != 0" :status="status"></TrajectoryState>
+      <!-- <el-button
+        type="primary"
+        class="p-events-auto el-button-custom"
+        @click="handleClick"
+      >
+        鍒嗘瀽
+      </el-button> -->
     </el-row>
     <el-row class="m-t-2">
       <FactorRadio
@@ -19,6 +26,7 @@
       <FactorLegend
         class="m-t-2"
         :factor="factorDatas.factor[factorType]"
+        @change="handleLegendTypeChange"
       ></FactorLegend>
     </el-row>
     <el-row class="historical" justify="center">
@@ -42,12 +50,21 @@
       @table-click="handelIndexChange"
       :factor-datas="factorDatas"
       :device-type="deviceType"
+      :device-code="deviceCode"
     ></DataSheet>
+    <SourceTrace
+      class="source-trace"
+      v-model:factorType="factorType"
+      direction="left"
+      mode="history"
+      :mission-code="missionCode"
+    ></SourceTrace>
   </div>
 </template>
 
 <script>
 import Layer from '@/utils/map/3dLayer';
+import mapLine from '@/utils/map/line';
 import marks from '@/utils/map/marks';
 import sector from '@/utils/map/sector';
 import mapUtil from '@/utils/map/util';
@@ -55,29 +72,38 @@
 import { useFetchData } from '@/composables/fetchData';
 import moment from 'moment';
 import { TYPE0 } from '@/constant/device-type';
-import { radioOptions } from '@/constant/radio-options';
+import { defaultOptions } from '@/constant/radio-options';
 import { FactorDatas } from '@/model/FactorDatas';
 import TrendAnalysis from './component/TrendAnalysis.vue';
 import DataSheet from './component/DataSheet.vue';
+import SourceTrace from '@/views/sourcetrace/SourceTrace.vue';
 import { ElMessage } from 'element-plus';
 import { fetchHistoryData } from '@/utils/factor/data';
+import dataAnalysisApi from '@/api/dataAnalysisApi';
+import thirdPartyDataApi from '@/api/thirdPartyDataApi';
+import { mapStores } from 'pinia';
+import { useSceneStore } from '@/stores/scene';
 
 export default {
-  components: { TrendAnalysis, DataSheet },
+  components: { TrendAnalysis, DataSheet, SourceTrace },
   setup() {
+    // 闄愬畾鍒嗛〉鏁版嵁閲忎负10000
     const { loading, fetchData } = useFetchData(10000);
     return { loading, fetchData };
   },
   data() {
     return {
+      missionCode: undefined,
       // 鐩戞祴璁惧绫诲瀷
       deviceType: TYPE0,
       // 鐩戞祴璁惧缂栧彿
       deviceCode: '',
       // 鐩戞祴鍥犲瓙鐨勭被鍨嬬紪鍙�
-      factorType: radioOptions(TYPE0)[0].value,
+      factorType: defaultOptions(TYPE0).value,
       // 鐩戞祴鏁版嵁
       factorDatas: new FactorDatas(),
+      // 姹℃煋婧簮缁撴灉
+      pollutionData: undefined,
       // 鍐冲畾缁樺埗3D鍥惧舰鏃舵槸鍚︿笌鍘熷浘鍍忓悎骞�
       merge: false,
       // 鍐冲畾缁樺埗瀹�3D鍥惧舰鍚庡湴鍥捐瑙掓槸鍚﹁嚜鍔ㄥ洖涓�
@@ -88,15 +114,25 @@
       // 褰撳墠閫変腑楂樹寒鐨勬暟鎹偣绱㈠紩
       locateIndex: undefined,
       // 杞ㄨ抗鍔ㄧ敾鐘舵��
-      status: 0
+      status: 0,
+      // 鏄惁椤甸潰宸茶烦杞�
+      isUnmounted: false,
+      // 绗笁鏂规暟鎹幏鍙栨槸鍚﹀皾璇�
+      isFetchThirdParty: false,
+      thirdPartyLoading: false
     };
   },
   watch: {
     factorType(nValue, oValue) {
       if (nValue != oValue && this.status == 0) {
-        this.draw();
+        Layer.clear();
+        this.draw(true);
+        // this.drawHighlightPollution();
       }
     }
+  },
+  computed: {
+    ...mapStores(useSceneStore)
   },
   methods: {
     // 妫�鏌ユ暟鎹粡绾害鏄惁鍚堟硶
@@ -117,33 +153,47 @@
     // 鐩戝惉鎶樼嚎鍥惧拰琛ㄦ牸鐨勭偣鍑讳簨浠�
     handelIndexChange(index) {
       if (this.checkDataIsValid(index)) {
+        // 缁樺埗婧簮鎵囧舰
         this.drawSector(index);
+        // 鏌ヨ鑼冨洿鍐呯殑鐩戞祴绔欑偣
+        const [lng, lat] = this.factorDatas.lnglats_GD[index];
+        this.sceneStore.searchScene(lng, lat);
       }
     },
-    draw() {
+    handleLegendTypeChange(value, done) {
+      if (value) {
+        this.factorDatas.resetRange();
+      } else {
+        this.factorDatas.standardRange();
+      }
+      done();
+      this.draw();
+    },
+    draw(notSetBound) {
       // 鍒锋柊鍥句緥
       const factor = this.factorDatas.factor[this.factorType];
       sector.clearSector();
+      // this.drawRoadLine(factor);
       this.drawRoadMap(factor);
       this.drawMassMarks(factor);
+      // 璋冩暣鍦板浘瑙嗚
+      if (!notSetBound) {
+        mapUtil.setBound(this.factorDatas.lnglats_GD);
+      }
     },
     // 缁樺埗3D璧拌璺嚎鍥�
     drawRoadMap(e) {
       this.factorDatas.refreshHeight(this.factorType);
-
       Layer.drawRoadMap(this.factorDatas, e, this.merge, this.setCenter);
-      // }
+    },
+    drawRoadLine(e) {
+      this.factorDatas.refreshHeight(this.factorType);
+      mapLine.drawLine(this.factorDatas, e);
     },
     drawMassMarks(e) {
       marks.drawMassMarks(this.factorDatas, e, (index) => {
-        // 鏌ヨ鑼冨洿鍐呯殑鐩戞祴绔欑偣
-        // SceneUtil.searchByCoordinate(lnglat[0], lnglat[1], distance);
-        if (this.checkDataIsValid(index)) {
-          this.drawSector(index);
-        }
+        this.handelIndexChange(index);
       });
-      // 璋冩暣鍦板浘瑙嗚
-      mapUtil.setBound(this.factorDatas.lnglats_GD);
     },
     drawSector(index) {
       // 1. 缁樺埗鏂版墖褰㈠尯鍩�
@@ -152,23 +202,41 @@
       mapUtil.setCenter(pr.p);
       // mapUtil.setFitSector(pr);
       // 2. 缁樺埗瀵硅瘽妗�
-      DialogUtil.openNewWindow(this.deviceCode, this.factorDatas, index, () => {
-        // 绉婚櫎鎵囧舰鍖哄煙
-        sector.clearSector();
+      DialogUtil.openNewWindow(
+        this.deviceType,
+        this.deviceCode,
+        this.factorDatas,
+        index,
+        () => {
+          // 绉婚櫎鎵囧舰鍖哄煙
+          sector.clearSector();
+        }
+      );
+    },
+    drawHighlightPollution() {
+      this.pollutionData.forEach((e) => {
+        if (this.factorType == e.factorId + '') {
+          const fDatas = this.factorDatas.getByDate(e.startDate, e.endDate);
+          Layer.drawHighLight3DLayer(fDatas, fDatas.factor[this.factorType]);
+        }
       });
     },
     onFetchData(deviceType, data) {
+      if (this.isUnmounted) return;
       // todo 鏍规嵁璁惧绫诲瀷鍒囨崲鍦板浘鐩戞祴鍥犲瓙灞曠ず鍗曢�夋銆佹姌绾垮浘澶嶉�夋銆佹暟鎹〃鏍煎閫夋鐨勫洜瀛愮被鍨�
       this.deviceType = deviceType;
       this.factorDatas.setData(data, this.drawMode, () => {
         this.factorDatas.refreshHeight(this.factorType);
+        Layer.clear();
         this.draw();
       });
     },
-    fetchHistroyData(option) {
-      const { deviceType, deviceCode, timeArray } = option;
+    onSearch(option) {
+      const { deviceType, deviceCode, timeArray, mission } = option;
       this.deviceType = deviceType;
       this.deviceCode = deviceCode;
+      this.mission = mission;
+      this.missionCode = mission.missionCode;
       let startTime, endTime;
       if (timeArray && timeArray.length == 2) {
         startTime = moment(timeArray[0]).format('YYYY-MM-DD HH:mm:ss');
@@ -182,35 +250,47 @@
           endTime,
           page,
           perPage: pageSize
-        }).then((res) => this.onFetchData(deviceType, res.data));
+        }).then((res) => {
+          this.onFetchData(deviceType, res.data);
+          if (
+            res.data.length == 0 &&
+            this.isFetchThirdParty != mission.missionCode
+          ) {
+            this.onThirdPartyFetch(option);
+          }
+        });
+      });
+    },
+    onThirdPartyFetch(option) {
+      const { mission } = option;
+      if (import.meta.env.VITE_DATA_MODE == 'jingan') {
+        this.thirdPartyLoading = true;
+        this.isFetchThirdParty = mission.missionCode;
+        // 閫氱煡鏈嶅姟绔惎鍔ㄤ换鍔¤寖鍥村唴鐨勭涓夋柟鏁版嵁鑾峰彇浠诲姟
+        thirdPartyDataApi
+          .fetchMissionData(mission.missionCode)
+          .then((res) => {
+            if (res.data) {
+              this.onSearch(option);
+            }
+          })
+          .finally(() => (this.thirdPartyLoading = false));
+      }
+    },
+    handleClick() {
+      const { missionCode } = this.mission;
+      dataAnalysisApi.pollutionTrace(missionCode).then((res) => {
+        this.pollutionData = res.data;
+        this.drawHighlightPollution();
       });
     }
-    // fetchRealTimeData() {
-    //   // fixme 2024.5.3 姝ゅ鍒濆鑾峰彇鐨勬暟鎹紝鍙傛暟搴旇鐢眘earchbar鍐冲畾锛屽悗缁慨鏀�
-    //   this.fetchData((page) => {
-    //     return fetchHistoryData({
-    //       deviceCode: '0a0000000001',
-    //       // type: TYPE0,
-    //       page,
-    //       perPage: 100
-    //     }).then((res) => {
-    //       if (res.data.length > 0) {
-    //         const s = new Date(res.data[0].time.replace(' ', 'T'));
-    //         const e = new Date(
-    //           res.data[res.data.length - 1].time.replace(' ', 'T')
-    //         );
-    //         this.searchTime = [s, e];
-    //       }
-    //       this.onFetchData(TYPE0, res.data);
-    //     });
-    //   });
-    // }
   },
   mounted() {
-    // this.fetchRealTimeData();
+    this.isUnmounted = false;
   },
   unmounted() {
     mapUtil.clearMap();
+    this.isUnmounted = true;
   }
 };
 </script>
@@ -237,4 +317,9 @@
   left: 0;
   right: 0;
 }
+.source-trace {
+  position: absolute;
+  right: 0;
+  bottom: 0px;
+}
 </style>

--
Gitblit v1.9.3