From 2cffd9c7db5c3191cf172641c800e5a328d6f3af Mon Sep 17 00:00:00 2001 From: riku <risaku@163.com> Date: 星期四, 10 七月 2025 17:30:57 +0800 Subject: [PATCH] 2025.7.10 修改动态溯源模块 --- src/views/realtimemode/RealtimeMode.vue | 225 ++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 154 insertions(+), 71 deletions(-) diff --git a/src/views/realtimemode/RealtimeMode.vue b/src/views/realtimemode/RealtimeMode.vue index 6cc8bfd..1a571b1 100644 --- a/src/views/realtimemode/RealtimeMode.vue +++ b/src/views/realtimemode/RealtimeMode.vue @@ -1,42 +1,77 @@ <template> <div class="p-events-none m-t-2"> - <el-row justify="center" align="middle" class="top-wrap"> </el-row> - <el-row class="m-t-2"> - <FactorRadio - :device-type="deviceType" - @change="(e) => (factorType = e)" - ></FactorRadio> + <el-row justify="center" align="middle" class="top-wrap"> + <DeviceChange @change="onDeviceChange"></DeviceChange> + <el-button + type="primary" + class="p-events-auto el-button-custom" + @click="pauseTask" + > + {{ pause ? '缁х画' : '鏆傚仠' }} + </el-button> </el-row> <el-row class="m-t-2"> - <FactorLegend - class="m-t-2" - :factor="factorDatas.factor[factorType]" - ></FactorLegend> + <FactorRadio :device-type="deviceType" v-model="factorType"></FactorRadio> </el-row> - <el-row class="m-t-2" justify="start"> - <DashBoard :factor-datas="factorDatas"></DashBoard> + <el-row class="m-t-2"> + <el-col span="1"> + <FactorLegend :factor="factorDatas.factor[factorType]"></FactorLegend> + </el-col> + <el-col span="1"> </el-col> </el-row> + <!-- <DashBoard class="dash-board" :factor-datas="factorDatas"></DashBoard> --> <RealTimeTrend class="real-time-trend" :factor-datas="factorDatas" :device-type="deviceType" ></RealTimeTrend> + <SourceTrace + class="source-trace" + v-model:factorType="factorType" + :deviceCode="deviceCode" + ></SourceTrace> + <!-- <PollutedClueItem></PollutedClueItem> --> </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 monitorDataApi from '@/api/monitorDataApi'; import DashBoard from './component/DashBoard.vue'; import RealTimeTrend from './component/RealTimeTrend.vue'; -import { MapAnimation } from '@/utils/map/animation'; +import DeviceChange from './component/DeviceChange.vue'; +import SourceTrace from '@/views/sourcetrace/SourceTrace.vue'; +import UnderwayAdvice from '@/views/sourcetrace/UnderwayAdvice.vue'; +import PollutedClueItem from '@/views/sourcetrace/component/PollutedClueItem.vue'; +import { realTimeMapAnimation } from '@/utils/map/animation'; +import { + fetchHistoryData, + startLoopFetchRealTimeData, + clearFetchingTask, + pauseTask +} from '@/utils/factor/data'; +import thirdPartyDataApi from '@/api/thirdPartyDataApi'; +import websocket from '@/api/websocket'; -const mapAnimation = new MapAnimation(); +// const mapAnimation = new MapAnimation(); + +// 璋冭瘯妯″紡 +const mode = 'debug'; +// const mode = 'product'; export default { - components: { DashBoard, RealTimeTrend }, + components: { + DashBoard, + RealTimeTrend, + DeviceChange, + SourceTrace, + UnderwayAdvice, + PollutedClueItem + }, setup() { const { loading, fetchData } = useFetchData(10000); return { loading, fetchData }; @@ -45,25 +80,45 @@ return { // 鐩戞祴璁惧绫诲瀷 deviceType: TYPE0, - deviceCode: '0a0000000001', + deviceCode: '', // 鐩戞祴鍥犲瓙鐨勭被鍨嬬紪鍙� - factorType: '1', + factorType: defaultOptions(TYPE0).value, // 鏂拌幏鍙栫殑鐩戞祴鏁版嵁 factorDatas: new FactorDatas(), // 鍏ㄩ儴鐩戞祴鏁版嵁 - allFactorDatas: new FactorDatas() + allFactorDatas: new FactorDatas(), + pause: false }; }, + watch: { + factorType(nV, oV) { + if (nV != oV) { + realTimeMapAnimation.setFactorType(nV); + } + } + }, computed: { + // 鏁版嵁鏈�鏂版椂闂达紙鏈�鏂版暟鎹殑閲囨牱鏃堕棿鍔�1绉掞紱娌℃湁鏁版嵁鏃讹紝閲囩敤褰撳墠鏃堕棿鐨勫墠6鍒嗛挓锛� latestTime() { if (this.factorDatas.times.length == 0) { - return '----/--/-- --:--:--'; + return moment().subtract(6, 'm').format('YYYY-MM-DD HH:mm:ss'); } else { - return this.factorDatas.times[this.factorDatas.times.length - 1]; + 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; @@ -73,51 +128,64 @@ // this.draw(); this.factorDatas = fDatas; }); - }, - fetchRealTimeData() { - // fixme 2024.5.3 姝ゅ鍒濆鑾峰彇鐨勬暟鎹紝鍙傛暟搴旇鐢眘earchbar鍐冲畾锛屽悗缁慨鏀� - this.fetchData((page) => { - return monitorDataApi - .fetchHistroyData({ - deviceCode: this.deviceCode, - startTime: '2021-11-04 09:53:35', - page, - perPage: 100 - }) - .then((res) => { - this.onFetchData(res.data); - this.onMapData(res.data); - this.fetchNextData(); - }); - }); - }, - clearFetchingTask() { - if (this.fetchingTask) { - clearInterval(this.fetchingTask); + if (mode == 'debug') { + websocket.send(JSON.stringify(data)); } }, - fetchNextData() { - this.clearFetchingTask(); - this.fetchingTask = setInterval(() => { - if (this.isFetching) { - return; - } - - this.isFetching = true; - this.fetchData(() => { - return monitorDataApi - .fetchNextData({ - deviceCode: this.deviceCode, - updateTime: this.latestTime, - perPage: 2 - }) - .then((res) => { - this.onFetchData(res.data); - this.onMapData(res.data); - }) - .finally(() => (this.isFetching = false)); + fetchRealTimeData() { + this.fetchData((page) => { + const param = + mode == 'debug' + ? { + deviceCode: this.deviceCode, + // startTime: '2025-01-16 11:34:00', + // endTime: '2025-01-16 11:35:00', + // startTime: '2025-01-20 12:40:00', + // startTime: '2024-12-27 08:30:00', + // startTime: '2024-12-13 16:35:00', + // startTime: '2024-11-27 11:50:41', // Pm, 涓窛绂诲伐鍦� + // startTime: '2024-08-30 15:27:00', // voc 杩戣窛绂绘苯淇� + startTime: '2024-07-23 15:21:30', + // startTime: '2024-07-23 14:39:00', + endTime: '2025-01-16 11:51:41', + page, + perPage: 10 + } + : { + deviceCode: this.deviceCode, + page, + perPage: 100 + }; + return fetchHistoryData(param, false).then((res) => { + this.onFetchData(res.data); + this.onMapData(res.data); + this.fetchNextData(); + thirdPartyDataApi.fetchLatestData(this.deviceType, this.deviceCode); }); - }, 10000); + }); + }, + pauseTask() { + this.pause = pauseTask(); + }, + clearFetchingTask() { + clearFetchingTask(); + }, + fetchNextData() { + startLoopFetchRealTimeData( + () => { + return { + deviceCode: this.deviceCode, + updateTime: this.latestTime, + perPage: mode == 'debug' ? 1 : 10 + }; + }, + (res) => { + this.onFetchData(res.data); + this.onMapData(res.data); + thirdPartyDataApi.fetchLatestData(this.deviceType, this.deviceCode); + }, + mode == 'debug' ? 4000 : undefined + ); }, onMapData(dataList) { let startIndex = this.allFactorDatas.length() - 1; @@ -126,28 +194,43 @@ this.notFirstFetch = true; } startIndex = startIndex < 0 ? 0 : startIndex; - this.allFactorDatas.addData(dataList, this.drawMode, () => { - mapAnimation.moveAnimation( - this.allFactorDatas, - this.factorType, - startIndex - ); + return new Promise(() => { + this.allFactorDatas.addData(dataList, this.drawMode, () => { + realTimeMapAnimation.moveAnimation( + this.allFactorDatas, + this.factorType, + startIndex + ); + }); }); } }, mounted() { - this.fetchRealTimeData(); + if (mode == 'debug') { + websocket.send('start'); + } }, unmounted() { this.clearFetchingTask(); - mapAnimation.stop(); + realTimeMapAnimation.stop(); + mapUtil.clearMap(); } }; </script> <style scoped> +.dash-board { + position: absolute; + right: 0; + bottom: 0px; +} .real-time-trend { position: absolute; right: 0; top: 0; } +.source-trace { + position: absolute; + left: 0; + bottom: 0px; +} </style> -- Gitblit v1.9.3