From e895212fa4215c50ce79ce4b448e064caf394776 Mon Sep 17 00:00:00 2001 From: riku <risaku@163.com> Date: 星期四, 03 七月 2025 17:35:46 +0800 Subject: [PATCH] 2025.7.3 动态溯源(待完成) --- src/views/sourcetrace/SourceTrace.vue | 171 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 135 insertions(+), 36 deletions(-) diff --git a/src/views/sourcetrace/SourceTrace.vue b/src/views/sourcetrace/SourceTrace.vue index d4c97a6..0145b9a 100644 --- a/src/views/sourcetrace/SourceTrace.vue +++ b/src/views/sourcetrace/SourceTrace.vue @@ -18,17 +18,30 @@ <el-col v-show="show" span="10"> <BaseCard> <template #content> - <el-checkbox-group v-model="selectedMsgTypes" size="default" :min="1"> - <el-space> - <el-checkbox value="1">寮傚父鍒囩墖</el-checkbox> - <el-checkbox value="2">姹℃煋绾跨储</el-checkbox> - </el-space> - </el-checkbox-group> + <el-row + justify="space-between" + align="middle" + style="border-bottom: 1px solid white" + > + <!-- 鏁版嵁鍒囩墖绛涢�夋潯浠� --> + <SourceTraceFilter + v-model:data-slice="selectedMsgTypes" + v-model:factor-type="selectedFactorTypes" + :factor-options="factorOptions" + v-model:scene-type="selectedSceneTypes" + :scene-options="sceneOptions" + ></SourceTraceFilter> + <!-- <el-divider direction="vertical"></el-divider> --> + <!-- 鏁版嵁鍒囩墖缁熻 --> + <div style="border-left: 1px solid white" class="p-l-8"> + <el-space direction="vertical"> + <el-text type="primary">婧簮锛歿{ countMsg1.type1 }}鏉�</el-text> + <el-text type="primary">绾跨储锛歿{ countMsg1.type2 }}鏉�</el-text> + <el-text type="primary">鎻愰啋锛歿{ countMsg1.type3 }}鏉�</el-text> + </el-space> + </div> + </el-row> <el-scrollbar ref="scrollbarRef" class="scrollbar"> - <!-- <div - ref="scrollContentRef" - style="display: flex; width: fit-content" - > --> <TransitionGroup name="list"> <div v-for="item in filterStreams" @@ -40,7 +53,6 @@ ></ClueRecordItem> </div> </TransitionGroup> - <!-- </div> --> </el-scrollbar> </template> </BaseCard> @@ -72,6 +84,9 @@ import PollutedExceptionItem from './component/PollutedExceptionItem.vue'; import ClueRecordItem from './component/ClueRecordItem.vue'; import PollutedClueItem from '@/views/sourcetrace/component/PollutedClueItem.vue'; +import SourceTraceFilter from '@/views/sourcetrace/component/SourceTraceFilter.vue'; + +const NO_SCENE = 'no_scene'; const props = defineProps({ factorType: String @@ -89,7 +104,11 @@ const selectedException = ref(); const selectedClue = ref(); -const selectedMsgTypes = ref(['1', '2']); +const selectedMsgTypes = ref(['1', '2', '3']); +const selectedFactorTypes = ref([]); +const factorOptions = ref([]); +const selectedSceneTypes = ref([]); +const sceneOptions = ref([]); function scrollToBottom() { const h1 = scrollContentRef.value.clientHeight + 100; @@ -107,8 +126,57 @@ const streams = reactive([]); const filterStreams = computed(() => { return streams.filter((v) => { - return selectedMsgTypes.value.indexOf(v._type) != -1; + // 鍒ゆ柇娑堟伅绫诲瀷鏄惁閫変腑 + const b1 = selectedMsgTypes.value.indexOf(v._type) != -1; + let b2, b3; + switch (v._type) { + case '1': + case '3': + // 鍒ゆ柇鐩戞祴鍥犲瓙绫诲瀷鏄惁閫変腑 + b2 = selectedFactorTypes.value.indexOf(v.pollutedData.factorId) != -1; + // 鍒ゆ柇鍦烘櫙绫诲瀷鏄惁閫変腑 + if (v.pollutedSource.sceneList.length == 0) { + b3 = selectedSceneTypes.value.indexOf(NO_SCENE) != -1; + } else { + b3 = + v.pollutedSource.sceneList.findIndex( + (v) => selectedSceneTypes.value.indexOf(v.typeId) != -1 + ) != -1; + } + break; + case '2': + b2 = true; + b3 = + v.sortedSceneList.findIndex( + (v) => selectedSceneTypes.value.indexOf(v.first.typeId) != -1 + ) != -1; + break; + } + + return b1 && b2 && b3; }); +}); +// 缁熻鍚勭被鍨嬫秷鎭殑鏁伴噺 +const countMsg1 = computed(() => { + const count = { + type1: 0, + type2: 0, + type3: 0 + }; + streams.forEach((v) => { + switch (v._type) { + case '1': + count.type1++; + break; + case '2': + count.type2++; + break; + case '3': + count.type3++; + break; + } + }); + return count; }); const inputVal = ref(''); @@ -116,27 +184,16 @@ websocket.send(inputVal.value); }; -let showFirstClueTask; function dealMsg(data) { const { type, content } = websocketMsgParser.parseMsg(data); + const obj = reactive(JSON.parse(content)); + obj._type = type; // 姹℃煋绾跨储 PollutedClue if (type == '1') { - const obj = reactive(JSON.parse(content)); - obj._type = type; - // obj.showMore = true; obj.showMore = false; console.log('姹℃煋寮傚父鍒囩墖: ', obj); - // if (streams.length == 0) { - // streams.push(obj); - // } else { - // // streams.forEach((s) => { - // // showMarksAndPolygon(s); - // // }); - // // hideAll(); - // streams.unshift(obj); - // } addNewMsg(obj); show.value = true; @@ -144,20 +201,61 @@ // scrollToTop(); // drawPolygon(obj.pollutedArea); parseChartData(obj); - - // if (showFirstClueTask) { - // clearTimeout(showFirstClueTask); - // } - // showFirstClueTask = setTimeout(() => { - // showMarksAndPolygon(obj); - // }, 1000); } else if (type == '2') { - const obj = JSON.parse(content); - obj._type = type; + // const obj = JSON.parse(content); + // obj._type = type; console.log('姹℃煋绾跨储缁撴灉: ', obj); obj._timestr = timeFormatter(obj.time); - // streams.unshift(obj); addNewMsg(obj); + } else if (type == '3') { + console.log('姹℃煋鎻愰啋鍒囩墖: ', obj); + addNewMsg(obj); + parseChartData(obj); + } + + optionsFilte(obj); +} + +// 瀵规暟鎹繘琛岀瓫閫夛紝鍖呮嫭鐩戞祴鍥犲瓙鍜屽満鏅被鍨� +function optionsFilte(objData) { + switch (objData._type) { + case '1': + case '3': + // 绛涢�夌洃娴嬪洜瀛愮被鍨� + if ( + factorOptions.value.findIndex( + (v) => v.value == objData.pollutedData.factorId + ) == -1 + ) { + factorOptions.value.push({ + label: objData.pollutedData.factorName, + value: objData.pollutedData.factorId + }); + selectedFactorTypes.value.push(objData.pollutedData.factorId); + } + // 绛涢�夊満鏅被鍨� + if (objData.pollutedSource.sceneList.length == 0) { + // 鑻ユ病鏈夋壘鍒伴闄╂簮鏃讹紝灏嗚鍒嗙被璁惧畾涓簄ull + if (sceneOptions.value.findIndex((v) => v.value == NO_SCENE) == -1) { + sceneOptions.value.push({ + label: '鏃�', + value: NO_SCENE + }); + selectedSceneTypes.value.push(NO_SCENE); + } + } else { + objData.pollutedSource.sceneList.forEach((s) => { + if (sceneOptions.value.findIndex((v) => v.value == s.typeId) == -1) { + sceneOptions.value.push({ + label: s.type, + value: s.typeId + }); + selectedSceneTypes.value.push(s.typeId); + } + }); + } + // case '2': + // break; } } @@ -202,6 +300,7 @@ function handleOpen(item) { switch (item._type) { case '1': + case '3': if (selectedException.value) { selectedException.value._selected = false; } -- Gitblit v1.9.3