From fac3e813d205f000125eb8f7b2dd4976f4166edf Mon Sep 17 00:00:00 2001 From: Riku <risaku@163.com> Date: 星期四, 15 五月 2025 00:25:09 +0800 Subject: [PATCH] 动态溯源功能调试中 --- src/views/realtimemode/RealtimeMode.vue | 199 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 197 insertions(+), 2 deletions(-) diff --git a/src/views/realtimemode/RealtimeMode.vue b/src/views/realtimemode/RealtimeMode.vue index b991977..eb4cb1f 100644 --- a/src/views/realtimemode/RealtimeMode.vue +++ b/src/views/realtimemode/RealtimeMode.vue @@ -1,9 +1,204 @@ <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> + <SourceTrace></SourceTrace> + </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 SourceTrace from '@/views/sourcetrace/SourceTrace.vue'; +import { realTimeMapAnimation } from '@/utils/map/animation'; +import { + fetchHistoryData, + startLoopFetchRealTimeData, + clearFetchingTask +} from '@/utils/factor/data'; +import thirdPartyDataApi from '@/api/thirdPartyDataApi'; +import websocket from '@/api/websocket'; + +// const mapAnimation = new MapAnimation(); + +// 璋冭瘯妯″紡 +const mode = 'debug'; + export default { - name: 'HistoryPage' + components: { DashBoard, RealTimeTrend, DeviceChange, SourceTrace }, + 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; + }); + if (mode == 'debug') { + websocket.send(JSON.stringify(data)); + } + }, + 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', + page, + perPage: 100 + } + : { + 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); + }); + }); + }, + 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; + 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