From 3f30e0c8d7c4586a9a0578b2a097c0d878d67ad7 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期二, 08 九月 2026 14:15:27 +0800
Subject: [PATCH] 依据隔离复现修正详情页签缓存并补齐验收

---
 src/components/ConsoleChartPanel.vue |   22 +++++++++-------------
 1 files changed, 9 insertions(+), 13 deletions(-)

diff --git a/src/components/ConsoleChartPanel.vue b/src/components/ConsoleChartPanel.vue
index c005c64..11b3ba1 100644
--- a/src/components/ConsoleChartPanel.vue
+++ b/src/components/ConsoleChartPanel.vue
@@ -45,6 +45,8 @@
   consoleDetail: null,
 })
 
+const emit = defineEmits<{ detailSaved: [testId: number, detail: TestConsoleDetail] }>()
+
 use([CanvasRenderer, LineChart, GridComponent, LegendComponent, TooltipComponent])
 
 const palette = ['#3978f6', '#7d42d8', '#f08a3e', '#23a983', '#e15268', '#1b9ac8', '#b5892f', '#6957c8', '#4f8d44', '#d264a3', '#46748e', '#a95d37']
@@ -172,9 +174,8 @@
 
 ensureDetailFieldValues()
 
-// 测试名称只用于初始占位;详情已读回后不能覆盖用户保存的实验名称。
 watch(() => props.testName, value => {
-  if (value && !props.consoleDetail && !experimentName.value) experimentName.value = value
+  if (value) experimentName.value = value
 })
 
 watch(() => props.consoleDetail, value => applyConsoleDetail(value), { immediate: true, deep: true })
@@ -235,13 +236,6 @@
   delete detailFieldValues[field]
 }
 
-function pruneDetailValues() {
-  const allowed = new Set(detailFields.value)
-  Object.keys(detailFieldValues).forEach(field => {
-    if (!allowed.has(field)) delete detailFieldValues[field]
-  })
-}
-
 async function saveConsoleDetail() {
   detailSaving.value = true
   try {
@@ -249,12 +243,14 @@
       experimentName: experimentName.value.trim() || null,
       batteryFields: [...batteryFields.value],
       specialFields: [...specialFields.value],
-      fieldValues: Object.fromEntries(detailFields.value
-        .filter(field => detailFieldValues[field] != null)
-        .map(field => [field, { ...detailFieldValues[field] }])) as Record<string, Record<string, string>>,
+      // 模板移除的字段不再提交,仍选中的字段保留全部电池填写值和空字符串。
+      fieldValues: Object.fromEntries(detailFields.value.map(field => [field, { ...detailFieldValues[field] }])),
     }
     const saved = await saveTestConsoleDetail(props.testId, detail)
+    if (!saved.consoleDetail) throw new Error('保存后未能读取测试详情')
     applyConsoleDetail(saved.consoleDetail)
+    // 父页持有正式详情缓存;切换页签重新挂载时必须使用这次保存结果。
+    emit('detailSaved', props.testId, saved.consoleDetail)
     ElMessage.success('测试详情已保存')
   } catch (error) {
     ElMessage.error(error instanceof Error ? error.message : '测试详情保存失败')
@@ -274,7 +270,6 @@
   } else {
     specialFields.value = [...specialTemplates[selectedSpecialTemplate.value]].filter(field => !batteryFields.value.includes(field))
   }
-  pruneDetailValues()
   ensureDetailFieldValues()
   templateDialogVisible.value = false
   ElMessage.success('字段模板已应用')
@@ -487,6 +482,7 @@
   <div class="report-chart-page">
     <section class="detail-panel">
       <header class="panel-heading"><div><strong>测试详情</strong><el-icon><ArrowUp /></el-icon></div></header>
+      <p v-if="!consoleDetail" class="detail-meta" role="status">暂无已保存的测试详情</p>
       <div class="detail-meta"><label><span>实验</span><el-input v-model="experimentName" /></label></div>
       <div class="field-table-wrap">
         <table class="field-table" :style="{ minWidth: `${Math.max(900, detailCells.length * 220 + 214)}px` }">

--
Gitblit v1.7.1