From a96e571b174fa30697f3aa6fdb22b3cf93d21b71 Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期三, 14 五月 2025 17:32:06 +0800
Subject: [PATCH] 动态溯源 1. 添加websocket逻辑

---
 src/views/historymode/HistoryMode.vue |  269 ++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 243 insertions(+), 26 deletions(-)

diff --git a/src/views/historymode/HistoryMode.vue b/src/views/historymode/HistoryMode.vue
index 1c71387..dc4a863 100644
--- a/src/views/historymode/HistoryMode.vue
+++ b/src/views/historymode/HistoryMode.vue
@@ -1,65 +1,282 @@
 <template>
-  <div class="fy-container">
-    <FactorRadio @change="(e) => (factorType = e)"></FactorRadio>
-    <SearchBar></SearchBar>
+  <div class="p-events-none m-t-2">
+    <el-row justify="center" align="middle" class="top-wrap">
+      <SearchBar
+        v-show="status == 0"
+        :search-time="searchTime"
+        :loading="loading"
+        @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
+        :device-type="deviceType"
+        @change="(e) => (factorType = e)"
+      ></FactorRadio>
+    </el-row>
+    <el-row class="m-t-2">
+      <FactorLegend
+        class="m-t-2"
+        :factor="factorDatas.factor[factorType]"
+        @change="handleLegendTypeChange"
+      ></FactorLegend>
+      <!-- <SourceTrace></SourceTrace> -->
+    </el-row>
+    <el-row class="historical" justify="center">
+      <HistoricalTrajectory
+        :factor-datas="factorDatas"
+        :factor-type="factorType"
+        @change="(e) => (status = e)"
+        @stop="draw"
+      ></HistoricalTrajectory>
+    </el-row>
+    <TrendAnalysis
+      class="trend-analysis"
+      :locate-index="locateIndex"
+      @chart-click="handelIndexChange"
+      :factor-datas="factorDatas"
+      :device-type="deviceType"
+    ></TrendAnalysis>
+    <DataSheet
+      class="data-sheet"
+      :locate-index="locateIndex"
+      @table-click="handelIndexChange"
+      :factor-datas="factorDatas"
+      :device-type="deviceType"
+      :device-code="deviceCode"
+    ></DataSheet>
   </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';
+import { DialogUtil } from '@/utils/map/dialog';
+import { useFetchData } from '@/composables/fetchData';
+import moment from 'moment';
+import { TYPE0 } from '@/constant/device-type';
+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 { mapStores } from 'pinia';
+import { useSceneStore } from '@/stores/scene';
 
 export default {
-  name: 'HistoryPage',
+  components: { TrendAnalysis, DataSheet, SourceTrace },
+  setup() {
+    // 闄愬畾鍒嗛〉鏁版嵁閲忎负10000
+    const { loading, fetchData } = useFetchData(10000);
+    return { loading, fetchData };
+  },
   data() {
     return {
-      factorType: '',
-      factorDatas: [],
+      // 鐩戞祴璁惧绫诲瀷
+      deviceType: TYPE0,
+      // 鐩戞祴璁惧缂栧彿
+      deviceCode: '',
+      // 鐩戞祴鍥犲瓙鐨勭被鍨嬬紪鍙�
+      factorType: defaultOptions(TYPE0).value,
+      // 鐩戞祴鏁版嵁
+      factorDatas: new FactorDatas(),
+      // 姹℃煋婧簮缁撴灉
+      pollutionData: undefined,
+      // 鍐冲畾缁樺埗3D鍥惧舰鏃舵槸鍚︿笌鍘熷浘鍍忓悎骞�
       merge: false,
-      setCenter: true
+      // 鍐冲畾缁樺埗瀹�3D鍥惧舰鍚庡湴鍥捐瑙掓槸鍚﹁嚜鍔ㄥ洖涓�
+      setCenter: true,
+      // 缁樺埗妯″紡锛�0锛氳嚜鍔ㄦā寮忥紝鑷姩璁$畻褰撳墠鏁版嵁鐨勮寖鍥达紝缁樺埗鍚堥�傜殑姣斾緥锛�1锛氭墜鍔ㄦā寮忥紝鏍规嵁椤甸潰璁剧疆鐨勭粯鍥捐寖鍥磋繘琛岀粯鍒�
+      drawMode: 0,
+      searchTime: [],
+      // 褰撳墠閫変腑楂樹寒鐨勬暟鎹偣绱㈠紩
+      locateIndex: undefined,
+      // 杞ㄨ抗鍔ㄧ敾鐘舵��
+      status: 0,
+      // 鏄惁椤甸潰宸茶烦杞�
+      isUnmounted: false
     };
   },
   watch: {
     factorType(nValue, oValue) {
-      if (nValue != oValue) {
+      if (nValue != oValue && this.status == 0) {
+        Layer.clear();
         this.draw();
+        this.drawHighlightPollution();
       }
     }
   },
+  computed: {
+    ...mapStores(useSceneStore)
+  },
   methods: {
+    // 妫�鏌ユ暟鎹粡绾害鏄惁鍚堟硶
+    checkDataIsValid(index) {
+      const lnglats_GD = this.factorDatas.lnglats_GD[index];
+      const time = this.factorDatas.times[index];
+      if (lnglats_GD[0] == 0 && lnglats_GD[1] == 0) {
+        ElMessage({
+          message: `${time}鐨勬暟鎹粡绾害鏃犳晥`,
+          type: 'warning'
+        });
+        return false;
+      } else {
+        this.locateIndex = index;
+        return true;
+      }
+    },
+    // 鐩戝惉鎶樼嚎鍥惧拰琛ㄦ牸鐨勭偣鍑讳簨浠�
+    handelIndexChange(index) {
+      if (this.checkDataIsValid(index)) {
+        // 缁樺埗婧簮鎵囧舰
+        this.drawSector(index);
+        // 鏌ヨ鑼冨洿鍐呯殑鐩戞祴绔欑偣
+        const [lng, lat] = this.factorDatas.lnglats_GD[index];
+        this.sceneStore.searchScene(lng, lat);
+      }
+    },
+    handleLegendTypeChange(value, done) {
+      if (value) {
+        this.factorDatas.resetRange();
+      } else {
+        this.factorDatas.standardRange();
+      }
+      done();
+      this.draw();
+    },
     draw() {
+      // 鍒锋柊鍥句緥
       const factor = this.factorDatas.factor[this.factorType];
+      sector.clearSector();
+      // this.drawRoadLine(factor);
       this.drawRoadMap(factor);
       this.drawMassMarks(factor);
     },
     // 缁樺埗3D璧拌璺嚎鍥�
     drawRoadMap(e) {
-      //   this.factorMode = factorMode;
-      // this.factorType = factorType;
-      // this.factorName = factorName;
-      // this.factorDatas.refreshHeight(this.factorType + 1 + '');
-      // this.refreshLegend(this.factorDatas);
-      // this.mapMaker.setFactorType(factorType);
-      // if (!this.mapMaker.runStatus()) {
-
+      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, () => {
-        // 鏌ヨ鑼冨洿鍐呯殑鐩戞祴绔欑偣
-        // SceneUtil.searchByCoordinate(lnglat[0], lnglat[1], distance);
-        // 3. 瓒嬪娍鍥捐烦杞畾浣�
-        // const progress = FChart.locate(lineChart.chart, lineChart.option, i, _factor.factorName);
-        // 4. 琛ㄦ牸鏁版嵁璺宠浆瀹氫綅
-        // Table.locate(i);
+      marks.drawMassMarks(this.factorDatas, e, (index) => {
+        this.handelIndexChange(index);
+      });
+      // 璋冩暣鍦板浘瑙嗚
+      mapUtil.setBound(this.factorDatas.lnglats_GD);
+    },
+    drawSector(index) {
+      // 1. 缁樺埗鏂版墖褰㈠尯鍩�
+      const pr = sector.drawSector(this.factorDatas, index);
+      // 璋冩暣瑙嗚灞呬腑鏄剧ず
+      mapUtil.setCenter(pr.p);
+      // mapUtil.setFitSector(pr);
+      // 2. 缁樺埗瀵硅瘽妗�
+      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();
+      });
+    },
+    onSearch(option) {
+      const { deviceType, deviceCode, timeArray, mission } = option;
+      this.deviceType = deviceType;
+      this.deviceCode = deviceCode;
+      this.mission = mission;
+      let startTime, endTime;
+      if (timeArray && timeArray.length == 2) {
+        startTime = moment(timeArray[0]).format('YYYY-MM-DD HH:mm:ss');
+        endTime = moment(timeArray[1]).format('YYYY-MM-DD HH:mm:ss');
+      }
+      this.fetchData((page, pageSize) => {
+        return fetchHistoryData({
+          deviceType,
+          deviceCode,
+          startTime,
+          endTime,
+          page,
+          perPage: pageSize
+        }).then((res) => this.onFetchData(deviceType, res.data));
+      });
+    },
+    handleClick() {
+      const { missionCode } = this.mission;
+      dataAnalysisApi.pollutionTrace(missionCode).then((res) => {
+        this.pollutionData = res.data;
+        this.drawHighlightPollution();
       });
     }
+  },
+  mounted() {
+    this.isUnmounted = false;
+  },
+  unmounted() {
+    mapUtil.clearMap();
+    this.isUnmounted = true;
   }
 };
 </script>
 <style scoped>
-.fy-container {
-  background-color: antiquewhite;
+.top-wrap {
+  height: 40px;
+}
+
+.trend-analysis {
+  position: absolute;
+  left: 0;
+  bottom: 2px;
+}
+
+.data-sheet {
+  position: absolute;
+  right: 0;
+  top: 0;
+}
+
+.historical {
+  position: absolute;
+  bottom: 10px;
+  left: 0;
+  right: 0;
 }
 </style>

--
Gitblit v1.9.3