From d6e6f8b5b31e132e4597eb531168d3e88f3bda72 Mon Sep 17 00:00:00 2001 From: riku <risaku@163.com> Date: 星期五, 04 七月 2025 17:26:49 +0800 Subject: [PATCH] 2025.7.4 动态溯源 --- src/views/sourcetrace/SourceTrace.vue | 211 ++++++++++++++++++++++++---------------------------- 1 files changed, 99 insertions(+), 112 deletions(-) diff --git a/src/views/sourcetrace/SourceTrace.vue b/src/views/sourcetrace/SourceTrace.vue index 0145b9a..19012f9 100644 --- a/src/views/sourcetrace/SourceTrace.vue +++ b/src/views/sourcetrace/SourceTrace.vue @@ -1,11 +1,11 @@ <template> <el-row> - <el-col span="2" class="flex-col"> + <el-col v-if="direction == 'right'" span="2" class="flex-col"> <el-row justify="end"> <CardButton direction="left" name="鍔ㄦ�佹函婧�" - @click="() => (show = !show)" + @click="handleDisplayChange" ></CardButton> </el-row> <el-row class="flex-col"> @@ -57,6 +57,21 @@ </template> </BaseCard> </el-col> + <el-col v-if="direction == 'left'" span="2" class="flex-col"> + <el-row justify="start"> + <CardButton + direction="right" + name="鍔ㄦ�佹函婧�" + @click="handleDisplayChange" + ></CardButton> + </el-row> + <el-row class="flex-col"> + <PollutedExceptionItem + :item="selectedException" + @showMarksAndPolygon="showMarksAndPolygon" + ></PollutedExceptionItem> + </el-row> + </el-col> <PollutedClueItem v-model="clueDialog" :item="selectedClue" @@ -72,6 +87,7 @@ import moment from 'moment'; import websocket from '@/api/websocket'; +import dataAnalysisApi from '@/api/dataAnalysisApi'; import sector from '@/utils/map/sector'; import mapUtil from '@/utils/map/util'; import { sceneTypes, sceneIcon } from '@/constant/scene-types'; @@ -88,14 +104,25 @@ const NO_SCENE = 'no_scene'; +const MODE_REALTIME = 'realtime'; +const MODE_HISTORY = 'history'; + const props = defineProps({ - factorType: String + direction: { + type: String, + default: 'left' + }, + factorType: String, + // 妯″紡锛宺ealtime锛氬疄鏃舵ā寮忥紱history锛氬巻鍙叉暟鎹ā寮� + mode: { + type: String, + default: 'realtime' + }, + missionCode: String, + deviceCode: String }); const emits = defineEmits(['update:factorType']); - -const height = `30vh`; -const width = `60vh`; const show = ref(false); const clueDialog = ref(false); @@ -110,6 +137,17 @@ const selectedSceneTypes = ref([]); const sceneOptions = ref([]); +function handleDisplayChange() { + show.value = !show.value; + if ( + !show.value && + selectedException.value && + selectedException.value.showMore + ) { + showMarksAndPolygon(selectedException.value); + } +} + function scrollToBottom() { const h1 = scrollContentRef.value.clientHeight + 100; setTimeout(() => { @@ -123,9 +161,9 @@ }, 100); } -const streams = reactive([]); +const streams = ref([]); const filterStreams = computed(() => { - return streams.filter((v) => { + return streams.value.filter((v) => { // 鍒ゆ柇娑堟伅绫诲瀷鏄惁閫変腑 const b1 = selectedMsgTypes.value.indexOf(v._type) != -1; let b2, b3; @@ -163,7 +201,7 @@ type2: 0, type3: 0 }; - streams.forEach((v) => { + streams.value.forEach((v) => { switch (v._type) { case '1': count.type1++; @@ -187,10 +225,15 @@ function dealMsg(data) { const { type, content } = websocketMsgParser.parseMsg(data); const obj = reactive(JSON.parse(content)); - obj._type = type; + if (obj.deviceCode == props.deviceCode) { + obj._type = type; + dealObj(obj); + } +} +function dealObj(obj) { // 姹℃煋绾跨储 PollutedClue - if (type == '1') { + if (obj._type == '1') { obj.showMore = false; console.log('姹℃煋寮傚父鍒囩墖: ', obj); @@ -201,13 +244,13 @@ // scrollToTop(); // drawPolygon(obj.pollutedArea); parseChartData(obj); - } else if (type == '2') { + } else if (obj._type == '2') { // const obj = JSON.parse(content); // obj._type = type; console.log('姹℃煋绾跨储缁撴灉: ', obj); obj._timestr = timeFormatter(obj.time); addNewMsg(obj); - } else if (type == '3') { + } else if (obj._type == '3') { console.log('姹℃煋鎻愰啋鍒囩墖: ', obj); addNewMsg(obj); parseChartData(obj); @@ -264,7 +307,7 @@ const leftMsgList = []; function addNewMsg(msg, inside) { if (!addNewMsgTask && (leftMsgList.length == 0 || inside)) { - streams.splice(0, 0, msg); + streams.value.splice(0, 0, msg); addNewMsgTask = setTimeout(() => { clearTimeout(addNewMsgTask); addNewMsgTask = undefined; @@ -278,8 +321,32 @@ } } +function fetchPollutionTraceHistory() { + dataAnalysisApi.fetchPollutionTraceHistory(props.missionCode).then((res) => { + const objList = JSON.parse(res.data); + objList.forEach((obj) => { + obj._type = obj.msgType + ''; + if (obj._type == '1') { + obj.showMore = false; + show.value = true; + parseChartData(obj); + } else if (obj._type == '2') { + obj._timestr = timeFormatter(obj.time); + } else if (obj._type == '3') { + parseChartData(obj); + } + optionsFilte(obj); + }); + streams.value = objList; + }); +} + onMounted(() => { - websocket.registerReceiveEvent(dealMsg); + if (props.mode == MODE_REALTIME) { + websocket.registerReceiveEvent(dealMsg); + } else if (props.missionCode) { + fetchPollutionTraceHistory(); + } }); onUnmounted(() => { websocket.removeReceiveEvent(dealMsg); @@ -296,6 +363,15 @@ selectedClue.value._selected = false; } }); + +watch( + () => props.missionCode, + (nV, oV) => { + if (nV != oV) { + fetchPollutionTraceHistory(); + } + } +); function handleOpen(item) { switch (item._type) { @@ -319,7 +395,7 @@ } function hideAll() { - streams.forEach((s) => { + streams.value.forEach((s) => { if (polygonMap.has(s.guid)) { s.showMore = false; map.remove(polygonMap.get(s.guid)); @@ -368,6 +444,12 @@ function parseChartData(obj) { // console.log('鎶樼嚎鍥撅細start'); + obj.pollutedData._startTime = moment(obj.pollutedData.startTime).format( + 'HH:mm:ss' + ); + obj.pollutedData._endTime = moment(obj.pollutedData.endTime).format( + 'HH:mm:ss' + ); const factorDatas = new FactorDatas(); factorDatas.setData(obj.pollutedData.historyDataList, 0, () => { obj._chartOptions = factorDataParser.parseData(factorDatas, [ @@ -383,101 +465,6 @@ function timeFormatter(time) { return moment(time).format('YYYY-MM-DD HH:mm:ss'); -} - -/******************************************************************************************************************** */ - -/** - * 娣诲姞涓�鏉″伐浣滄祦淇℃伅 - * @param {*} data - */ -const putWorkStream = (data) => { - data.substring(); - const obj = JSON.parse(data); - console.log('sourcetrace: ', obj); - - obj._statusStr = exceptionStatus(obj.status); - - if (streams.length == 0) { - streams.push(obj); - } else { - const index = streams.findIndex((v) => { - return v.guid == obj.guid; - }); - if (index != -1) { - const old = streams[index]; - obj.showMore = old.showMore; - old.relatedSceneList.forEach((s) => { - const index = obj.relatedSceneList.findIndex((v) => { - return v.guid == s.guid; - }); - if (index == -1) { - obj.relatedSceneList.push(s); - } - }); - streams.splice(index, 1, obj); - } else { - streams.unshift(obj); - } - - show.value = true; - } - - // scrollToBottom(); - scrollToTop(); - - const excObj = streams.find((v) => { - return v.factorId + '' == props.factorType; - }); - if (excObj) { - drawSector(excObj); - } -}; - -function exceptionStatus(value) { - switch (value) { - case 1: - return '寮傚父鍙戠敓涓�'; - case 2: - return '寮傚父宸茬粨鏉�'; - default: - return '寮傚父宸茬粨鏉�'; - } -} - -let lastDrawObjGuid; -function drawSector(exceptionObj) { - emits('update:factorType', exceptionObj.factorId + ''); - setTimeout(() => { - if (exceptionObj.guid != lastDrawObjGuid) { - sector.clearSectorPt(); - lastDrawObjGuid = exceptionObj.guid; - } - // 1. 缁樺埗鏂版墖褰㈠尯鍩� - const datavo = exceptionObj.midData; - const factorDatas = new FactorDatas(); - factorDatas.setData([datavo], 0, () => { - const pr = sector.drawSectorPt(factorDatas, 0); - // 璋冩暣瑙嗚灞呬腑鏄剧ず - // mapUtil.setCenter(pr.p); - drawMarks(exceptionObj.relatedSceneList); - }); - }, 1000); -} - -let layer = undefined; -function drawMarks(sceneList) { - if (layer != undefined) { - mapUtil.removeViews(layer); - // layer = undefined; - } - if (sceneList.length != 0) { - const icons = []; - sceneList.forEach((s) => { - icons.push(sceneIcon(s.typeId)); - }); - layer = marks.createLabelMarks(icons, sceneList, true); - } } </script> <style scoped> @@ -512,7 +499,7 @@ .scrollbar { width: 400px; /* max-width: 60vw; */ - height: 45vh; + height: 65vh; /* color: #02ffea; */ padding-right: 10px; } -- Gitblit v1.9.3