From b33e28bc2843555355ecad59a80c83e3c26445a3 Mon Sep 17 00:00:00 2001 From: riku <risaku@163.com> Date: 星期一, 01 九月 2025 17:29:36 +0800 Subject: [PATCH] 走航季度报告模块(待完成) --- src/views/sourcetrace/SourceTrace.vue | 222 ++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 144 insertions(+), 78 deletions(-) diff --git a/src/views/sourcetrace/SourceTrace.vue b/src/views/sourcetrace/SourceTrace.vue index 19012f9..73dcd07 100644 --- a/src/views/sourcetrace/SourceTrace.vue +++ b/src/views/sourcetrace/SourceTrace.vue @@ -1,18 +1,32 @@ <template> - <el-row> - <el-col v-if="direction == 'right'" span="2" class="flex-col"> - <el-row justify="end"> + <el-row + :style=" + direction == 'left' + ? 'flex-direction: row;' + : 'flex-direction: row-reverse' + " + > + <el-col span="2" class="flex-col"> + <el-row :justify="direction == 'left' ? 'end' : 'start'"> <CardButton - direction="left" + :direction="direction" name="鍔ㄦ�佹函婧�" @click="handleDisplayChange" ></CardButton> </el-row> <el-row class="flex-col"> + <PollutedWarnItem + :item="selectedWarning" + @showMarksAndPolygon="showMarksAndPolygon" + ></PollutedWarnItem> <PollutedExceptionItem :item="selectedException" @showMarksAndPolygon="showMarksAndPolygon" ></PollutedExceptionItem> + <PollutedClueItem + v-model="clueDialog" + :item="selectedClue" + ></PollutedClueItem> </el-row> </el-col> <el-col v-show="show" span="10"> @@ -27,21 +41,25 @@ <SourceTraceFilter v-model:data-slice="selectedMsgTypes" v-model:factor-type="selectedFactorTypes" - :factor-options="factorOptions" v-model:scene-type="selectedSceneTypes" + :factor-options="factorOptions" :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-text type="info">婧簮锛歿{ countMsg1.type1 }}鏉�</el-text> + <el-text type="info">绾跨储锛歿{ countMsg1.type2 }}鏉�</el-text> + <el-text type="info">鎻愰啋锛歿{ countMsg1.type3 }}鏉�</el-text> </el-space> </div> </el-row> - <el-scrollbar ref="scrollbarRef" class="scrollbar"> + <el-scrollbar + ref="scrollbarRef" + class="scrollbar" + v-loading="loading" + > <TransitionGroup name="list"> <div v-for="item in filterStreams" @@ -57,7 +75,7 @@ </template> </BaseCard> </el-col> - <el-col v-if="direction == 'left'" span="2" class="flex-col"> + <!-- <el-col v-if="direction == 'left'" span="2" class="flex-col"> <el-row justify="start"> <CardButton direction="right" @@ -70,12 +88,12 @@ :item="selectedException" @showMarksAndPolygon="showMarksAndPolygon" ></PollutedExceptionItem> + <PollutedClueItem + v-model="clueDialog" + :item="selectedClue" + ></PollutedClueItem> </el-row> - </el-col> - <PollutedClueItem - v-model="clueDialog" - :item="selectedClue" - ></PollutedClueItem> + </el-col> --> </el-row> </template> <script setup> @@ -101,6 +119,7 @@ import ClueRecordItem from './component/ClueRecordItem.vue'; import PollutedClueItem from '@/views/sourcetrace/component/PollutedClueItem.vue'; import SourceTraceFilter from '@/views/sourcetrace/component/SourceTraceFilter.vue'; +import PollutedWarnItem from './component/PollutedWarnItem.vue'; const NO_SCENE = 'no_scene'; @@ -110,7 +129,7 @@ const props = defineProps({ direction: { type: String, - default: 'left' + default: 'right' }, factorType: String, // 妯″紡锛宺ealtime锛氬疄鏃舵ā寮忥紱history锛氬巻鍙叉暟鎹ā寮� @@ -125,17 +144,21 @@ const emits = defineEmits(['update:factorType']); const show = ref(false); -const clueDialog = ref(false); const scrollContentRef = ref(); const scrollbarRef = ref(); +const selectedWarning = ref(); const selectedException = ref(); const selectedClue = ref(); +const clueDialog = ref(false); + const selectedMsgTypes = ref(['1', '2', '3']); const selectedFactorTypes = ref([]); const factorOptions = ref([]); const selectedSceneTypes = ref([]); const sceneOptions = ref([]); + +const loading = ref(false); function handleDisplayChange() { show.value = !show.value; @@ -171,9 +194,16 @@ case '1': case '3': // 鍒ゆ柇鐩戞祴鍥犲瓙绫诲瀷鏄惁閫変腑 - b2 = selectedFactorTypes.value.indexOf(v.pollutedData.factorId) != -1; + for (const key in v.pollutedData.statisticMap) { + const value = v.pollutedData.statisticMap[key]; + b2 = b2 || selectedFactorTypes.value.indexOf(value.factorId) != -1; + } + // 鍒ゆ柇鍦烘櫙绫诲瀷鏄惁閫変腑 - if (v.pollutedSource.sceneList.length == 0) { + if ( + v.pollutedSource == undefined || + v.pollutedSource.sceneList.length == 0 + ) { b3 = selectedSceneTypes.value.indexOf(NO_SCENE) != -1; } else { b3 = @@ -265,37 +295,43 @@ 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 + for (const key in objData.pollutedData.statisticMap) { + const value = objData.pollutedData.statisticMap[key]; + if ( + factorOptions.value.findIndex((v) => v.value == value.factorId) == -1 + ) { + factorOptions.value.push({ + label: value.factorName, + value: value.factorId }); - selectedSceneTypes.value.push(NO_SCENE); + selectedFactorTypes.value.push(value.factorId); } - } else { - objData.pollutedSource.sceneList.forEach((s) => { - if (sceneOptions.value.findIndex((v) => v.value == s.typeId) == -1) { + } + + // 绛涢�夊満鏅被鍨� + if (objData.pollutedSource != undefined) { + if (objData.pollutedSource.sceneList.length == 0) { + // 鑻ユ病鏈夋壘鍒伴闄╂簮鏃讹紝灏嗚鍒嗙被璁惧畾涓簄ull + if (sceneOptions.value.findIndex((v) => v.value == NO_SCENE) == -1) { sceneOptions.value.push({ - label: s.type, - value: s.typeId + label: '鏈煡', + value: NO_SCENE }); - selectedSceneTypes.value.push(s.typeId); + 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; @@ -322,23 +358,31 @@ } 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; - }); + loading.value = true; + dataAnalysisApi + .fetchPollutionTraceHistory(props.missionCode) + .then((res) => { + factorOptions.value = []; + selectedFactorTypes.value = []; + sceneOptions.value = []; + selectedSceneTypes.value = []; + 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; + }) + .finally(() => (loading.value = false)); } onMounted(() => { @@ -374,21 +418,33 @@ ); function handleOpen(item) { + // 鍘婚櫎涓婁竴涓�滄函婧愨�濆拰鈥滄彁閱掆�濇秷鎭殑閫変腑鏍囧織 + if (selectedWarning.value && selectedWarning.value._selected) { + selectedWarning.value._selected = false; + showMarksAndPolygon(selectedWarning.value); + } + if (selectedException.value && selectedException.value._selected) { + selectedException.value._selected = false; + showMarksAndPolygon(selectedException.value); + } + if (selectedClue.value && selectedClue.value._selected) { + selectedClue.value._selected = false; + clueDialog.value = false; + } switch (item._type) { case '1': - case '3': - if (selectedException.value) { - selectedException.value._selected = false; - } + // 鏄剧ず褰撳墠閫変腑鐨勭浉鍏冲湴鍥炬爣璁� showMarksAndPolygon(item); + // 鏇存柊閫変腑鐨勫璞� selectedException.value = item; break; case '2': - if (selectedClue.value) { - selectedClue.value._selected = false; - } selectedClue.value = item; clueDialog.value = true; + break; + case '3': + showMarksAndPolygon(item); + selectedWarning.value = item; break; } item._selected = true; @@ -412,7 +468,7 @@ } else { if (polygonMap.has(item.guid)) { map.remove(polygonMap.get(item.guid)); - selectedException.value._selected = false; + item._selected = false; } } } @@ -452,13 +508,23 @@ ); const factorDatas = new FactorDatas(); factorDatas.setData(obj.pollutedData.historyDataList, 0, () => { - obj._chartOptions = factorDataParser.parseData(factorDatas, [ - { - label: obj.pollutedData.factorName, - name: obj.pollutedData.factorName, - value: obj.pollutedData.factorId + '' - } - ]); + for (const key in obj.pollutedData.statisticMap) { + const value = obj.pollutedData.statisticMap[key]; + value._chartOptions = factorDataParser.parseData(factorDatas, [ + { + label: value.factorName, + name: value.factorName, + value: value.factorId + '' + } + ]); + } + // obj._chartOptions = factorDataParser.parseData(factorDatas, [ + // { + // label: obj.pollutedData.factorName, + // name: obj.pollutedData.factorName, + // value: obj.pollutedData.factorId + '' + // } + // ]); // console.log('鎶樼嚎鍥撅細', obj._chartOptions); }); } @@ -473,7 +539,7 @@ --el-statistic-content-color: white; } -:deep(.el-text.el-text--primary) { +:deep(.el-text.el-text--info) { --el-text-color: white; } -- Gitblit v1.9.3