yeg
2026-09-08 479d2fbf4dca85eadda72b886a24422ba64b6e46
src/components/ConsoleChartPanel.vue
@@ -172,8 +172,9 @@
ensureDetailFieldValues()
// 测试名称只用于初始占位;详情已读回后不能覆盖用户保存的实验名称。
watch(() => props.testName, value => {
  if (value) experimentName.value = value
  if (value && !props.consoleDetail && !experimentName.value) experimentName.value = value
})
watch(() => props.consoleDetail, value => applyConsoleDetail(value), { immediate: true, deep: true })
@@ -234,6 +235,13 @@
  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 {
@@ -241,7 +249,9 @@
      experimentName: experimentName.value.trim() || null,
      batteryFields: [...batteryFields.value],
      specialFields: [...specialFields.value],
      fieldValues: JSON.parse(JSON.stringify(detailFieldValues)) as Record<string, Record<string, string>>,
      fieldValues: Object.fromEntries(detailFields.value
        .filter(field => detailFieldValues[field] != null)
        .map(field => [field, { ...detailFieldValues[field] }])) as Record<string, Record<string, string>>,
    }
    const saved = await saveTestConsoleDetail(props.testId, detail)
    applyConsoleDetail(saved.consoleDetail)
@@ -264,6 +274,7 @@
  } else {
    specialFields.value = [...specialTemplates[selectedSpecialTemplate.value]].filter(field => !batteryFields.value.includes(field))
  }
  pruneDetailValues()
  ensureDetailFieldValues()
  templateDialogVisible.value = false
  ElMessage.success('字段模板已应用')