From aa75a9d46ee325f0a92e42f733aabb1f92103aeb Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期五, 28 三月 2025 17:44:29 +0800
Subject: [PATCH] 走航融合模块完成

---
 src/views/realtimemode/RealtimeMode.vue |  187 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 185 insertions(+), 2 deletions(-)

diff --git a/src/views/realtimemode/RealtimeMode.vue b/src/views/realtimemode/RealtimeMode.vue
index b991977..240930d 100644
--- a/src/views/realtimemode/RealtimeMode.vue
+++ b/src/views/realtimemode/RealtimeMode.vue
@@ -1,9 +1,192 @@
 <template>
-  <div>RealtimeMode</div>
+  <div class="p-events-none m-t-2">
+    <el-row justify="center" align="middle" class="top-wrap">
+      <DeviceChange @change="onDeviceChange"></DeviceChange>
+    </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]"
+      ></FactorLegend>
+    </el-row>
+    <DashBoard class="dash-board" :factor-datas="factorDatas"></DashBoard>
+    <RealTimeTrend
+      class="real-time-trend"
+      :factor-datas="factorDatas"
+      :device-type="deviceType"
+    ></RealTimeTrend>
+  </div>
 </template>
 
 <script>
+import moment from 'moment';
+import mapUtil from '@/utils/map/util';
+import { useFetchData } from '@/composables/fetchData';
+import { TYPE0 } from '@/constant/device-type';
+import { defaultOptions } from '@/constant/radio-options';
+import { FactorDatas } from '@/model/FactorDatas';
+import DashBoard from './component/DashBoard.vue';
+import RealTimeTrend from './component/RealTimeTrend.vue';
+import DeviceChange from './component/DeviceChange.vue';
+import { realTimeMapAnimation } from '@/utils/map/animation';
+import {
+  fetchHistoryData,
+  startLoopFetchRealTimeData,
+  clearFetchingTask
+} from '@/utils/factor/data';
+import thirdPartyDataApi from '@/api/thirdPartyDataApi';
+
+// const mapAnimation = new MapAnimation();
+
 export default {
-  name: 'HistoryPage'
+  components: { DashBoard, RealTimeTrend, DeviceChange },
+  setup() {
+    const { loading, fetchData } = useFetchData(10000);
+    return { loading, fetchData };
+  },
+  data() {
+    return {
+      // 鐩戞祴璁惧绫诲瀷
+      deviceType: TYPE0,
+      deviceCode: '',
+      // 鐩戞祴鍥犲瓙鐨勭被鍨嬬紪鍙�
+      factorType: defaultOptions(TYPE0).value,
+      // 鏂拌幏鍙栫殑鐩戞祴鏁版嵁
+      factorDatas: new FactorDatas(),
+      // 鍏ㄩ儴鐩戞祴鏁版嵁
+      allFactorDatas: new FactorDatas()
+    };
+  },
+  watch: {
+    factorType(nV, oV) {
+      if (nV != oV) {
+        realTimeMapAnimation.setFactorType(nV);
+      }
+    }
+  },
+  computed: {
+    // 鏁版嵁鏈�鏂版椂闂达紙鏈�鏂版暟鎹殑閲囨牱鏃堕棿鍔�1绉掞紱娌℃湁鏁版嵁鏃讹紝閲囩敤褰撳墠鏃堕棿鐨勫墠6鍒嗛挓锛�
+    latestTime() {
+      if (this.factorDatas.times.length == 0) {
+        return moment().subtract(6, 'm').format('YYYY-MM-DD HH:mm:ss');
+      } else {
+        const _time = this.factorDatas.times[this.factorDatas.times.length - 1];
+        return moment(_time).add(1, 's').format('YYYY-MM-DD HH:mm:ss');
+      }
+    }
+  },
+  methods: {
+    onDeviceChange({ type, deviceCode }) {
+      this.deviceType = type;
+      this.deviceCode = deviceCode;
+      this.clearFetchingTask();
+      realTimeMapAnimation.stop();
+      this.allFactorDatas.clearData();
+      this.factorDatas.clearData();
+      this.notFirstFetch = false;
+      this.fetchRealTimeData();
+    },
+    onFetchData(data) {
+      // todo 鏍规嵁璁惧绫诲瀷鍒囨崲鍦板浘鐩戞祴鍥犲瓙灞曠ず鍗曢�夋銆佹姌绾垮浘澶嶉�夋銆佹暟鎹〃鏍煎閫夋鐨勫洜瀛愮被鍨�
+      // this.deviceType = type;
+      const fDatas = new FactorDatas();
+      fDatas.setData(data, this.drawMode, () => {
+        fDatas.refreshHeight(this.factorType);
+        // this.draw();
+        this.factorDatas = fDatas;
+      });
+    },
+    fetchRealTimeData() {
+      this.fetchData((page) => {
+        return fetchHistoryData(
+          {
+            deviceCode: this.deviceCode,
+            // startTime: '2024-08-20 06:00:00',
+            // endTime: '2024-08-20 06:02:00',
+            page,
+            perPage: 100
+          },
+          false
+        ).then((res) => {
+          this.onFetchData(res.data);
+          this.onMapData(res.data);
+          // if (res.data.length > 0) {
+          //   this.fetchNextData(res.data[res.data.length - 1].time);
+          // }
+          this.fetchNextData();
+          thirdPartyDataApi.fetchLatestData(this.deviceType, this.deviceCode);
+        });
+      });
+    },
+    clearFetchingTask() {
+      clearFetchingTask();
+    },
+    fetchNextData() {
+      startLoopFetchRealTimeData(
+        () => {
+          return {
+            deviceCode: this.deviceCode,
+            updateTime: this.latestTime,
+            perPage: 10
+          };
+        },
+        (res) => {
+          this.onFetchData(res.data);
+          this.onMapData(res.data);
+          thirdPartyDataApi.fetchLatestData(this.deviceType, this.deviceCode);
+        }
+      );
+    },
+    onMapData(dataList) {
+      let startIndex = this.allFactorDatas.length() - 1;
+      if (!this.notFirstFetch) {
+        startIndex = dataList.length - 2;
+        this.notFirstFetch = true;
+      }
+      startIndex = startIndex < 0 ? 0 : startIndex;
+      return new Promise(() => {
+        this.allFactorDatas.addData(dataList, this.drawMode, () => {
+          realTimeMapAnimation.moveAnimation(
+            this.allFactorDatas,
+            this.factorType,
+            startIndex
+          );
+        });
+      });
+    }
+  },
+  mounted() {
+    // this.fetchRealTimeData();
+    // startLoopFetchRealTimeData({
+    //   compUser: 'user1',
+    //   compPassword: 'User1@jingan',
+    //   mn: 'TX105',
+    //   dtFrom: '2024-08-07 10:00:00',
+    //   dtTo: '2024-08-07 10:00:59'
+    // });
+  },
+  unmounted() {
+    this.clearFetchingTask();
+    realTimeMapAnimation.stop();
+    mapUtil.clearMap();
+  }
 };
 </script>
+<style scoped>
+.dash-board {
+  position: absolute;
+  left: 0;
+  bottom: 2px;
+}
+.real-time-trend {
+  position: absolute;
+  right: 0;
+  top: 0;
+}
+</style>

--
Gitblit v1.9.3