From efb537e966c24d2e0b1b3a17830a9c6bdcb14df4 Mon Sep 17 00:00:00 2001 From: zty Date: Fri, 12 Jun 2026 10:34:54 +0800 Subject: [PATCH] =?UTF-8?q?feat(phase4):=20=E4=B8=93=E4=B8=9A=E7=AB=AF?= =?UTF-8?q?=E7=A9=BA=E9=97=B4=E6=B1=A1=E6=9F=93=E6=BA=90=E6=BA=AF=E6=BA=90?= =?UTF-8?q?=E8=A7=86=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ProjectConfig 每个空间加"溯源"入口 → SpaceTracingModal: 5项污染物分tab,各显示预测浓度vs限值、达标/超标、各材料贡献率排序条、 超标时标红污染源材料(累计贡献>50%)并给整改建议。复用 generate 落库的 contributionRate,污染源前端按累计>50%算。 Co-Authored-By: Claude Opus 4.8 (1M context) --- apps/web/src/components/SpaceTracingModal.vue | 96 +++++++++++++++++++ apps/web/src/pages/ProjectConfig.vue | 8 ++ 2 files changed, 104 insertions(+) create mode 100644 apps/web/src/components/SpaceTracingModal.vue diff --git a/apps/web/src/components/SpaceTracingModal.vue b/apps/web/src/components/SpaceTracingModal.vue new file mode 100644 index 0000000..b26381f --- /dev/null +++ b/apps/web/src/components/SpaceTracingModal.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/apps/web/src/pages/ProjectConfig.vue b/apps/web/src/pages/ProjectConfig.vue index f47af7a..4b2c308 100644 --- a/apps/web/src/pages/ProjectConfig.vue +++ b/apps/web/src/pages/ProjectConfig.vue @@ -43,6 +43,8 @@ @@ -77,6 +80,7 @@ import { getProject, generateReport, type ProjectDetail, type SpaceRow } from '. import { deleteSpace } from '../api/spaces'; import NewProjectModal from '../components/NewProjectModal.vue'; import SpaceDrawer from '../components/SpaceDrawer.vue'; +import SpaceTracingModal from '../components/SpaceTracingModal.vue'; const route = useRoute(); const router = useRouter(); @@ -116,6 +120,10 @@ async function load() { function openAddSpace() { editingSpace.value = null; drawerOpen.value = true; } function openEditSpace(s: SpaceRow) { editingSpace.value = s; drawerOpen.value = true; } + +const tracingOpen = ref(false); +const tracingSpace = ref(null); +function openTracing(s: SpaceRow) { tracingSpace.value = s; tracingOpen.value = true; } function onSpaceSaved() { drawerOpen.value = false; load(); } function onEdited() { editOpen.value = false; load(); } async function onDeleteSpace(s: SpaceRow) { await deleteSpace(s.id); message.success('已删除'); load(); }