From 937e7093db1fe85048864a65fd2ab393556561ca Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期二, 08 九月 2026 16:15:52 +0800
Subject: [PATCH] 化成报表带入来源详情并修正字段名称

---
 src/views/FormationReportForm.vue |   21 ++++++++++++++++++---
 1 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/views/FormationReportForm.vue b/src/views/FormationReportForm.vue
index 3808b15..664cbed 100644
--- a/src/views/FormationReportForm.vue
+++ b/src/views/FormationReportForm.vue
@@ -14,6 +14,8 @@
 import type { ReportMetricKey } from '@/utils/reportMeasurementChart'
 import { openFormationSavedReportPrint } from '@/utils/formationSavedReportPrint'
 import FormationFieldControls from '@/components/FormationFieldControls.vue'
+import { formationSourceKey, formationSourceFields, formationDetailValue } from '@/utils/formationSourceDetails'
+import type { FormationSettings } from '@/api/formationReports'
 import { createFormationReport, getFormationReport, editFormationReport, refreshFormationSource, listFormationVersions,
   type SavedFormationReport, type FormationVersion } from '@/api/formationReports'
 
@@ -47,6 +49,13 @@
 const cycleNos = ref<number[]>([])
 const fields = ref<FormationField[]>(structuredClone(defaultFormationFields))
 const values = ref<Record<string, string>>({})
+const sourceDetailOverrides = ref<NonNullable<FormationSettings['sourceDetailOverrides']>>({})
+const sourceFields = computed(() => formationSourceFields(reportItems.value.map(item => item.source), sourceDetailOverrides.value))
+function setDetail(source: FormationCandidate, value: string, field?: typeof sourceFields.value[number]) {
+  const key = formationSourceKey(source)
+  const current = sourceDetailOverrides.value[key] ?? {}
+  sourceDetailOverrides.value[key] = field ? { ...current, fieldValues: { ...current.fieldValues, [field.key]: value } } : { ...current, experimentName: value }
+}
 const chargeStepSelections = ref<Record<string, number>>({})
 const metrics = ref<ReportMetricKey[]>(formationCurveMetrics.map(metric => metric.key))
 const seriesColors = ref<Record<string, string>>({})
@@ -74,11 +83,12 @@
 }
 function chargeKey(item: FormationItem, cycle: number) { return `${item.source.selection.testId}|${item.source.selection.testBatteryId}|${cycle}` }
 function updateSeriesColor(item: FormationItem, color: string | null) { if (color) seriesColors.value[formationSeriesKey(item)] = color }
-function formContent() { return JSON.stringify({ name: reportName.value, description: description.value, fields: fields.value, values: values.value, chargeStepSelections: chargeStepSelections.value, metrics: metrics.value, seriesColors: seriesColors.value }) }
+function formContent() { return JSON.stringify({ name: reportName.value, description: description.value, fields: fields.value, values: values.value, sourceDetailOverrides: sourceDetailOverrides.value, chargeStepSelections: chargeStepSelections.value, metrics: metrics.value, seriesColors: seriesColors.value }) }
 function restore(record: SavedFormationReport) {
   saved.value = record; reportName.value = record.name; description.value = record.description || ''
   items.value = record.items; cycleNos.value = record.cycleNos
   fields.value = record.settings.fields; values.value = record.settings.values; chargeStepSelections.value = record.settings.chargeStepSelections || {}
+  sourceDetailOverrides.value = record.settings.sourceDetailOverrides ?? {}
   metrics.value = record.settings.metrics ?? formationCurveMetrics.map(metric => metric.key)
   seriesColors.value = record.settings.seriesColors ?? {}
   changeSummary.value = ''; savedContent.value = formContent()
@@ -88,6 +98,7 @@
     (field.scope === 'detail' ? [0] : item.cycleNos).map(cycle => formationValueKey(item, cycle, field)))))
   values.value = Object.fromEntries(Object.entries(values.value).filter(([key]) => allowed.has(key)))
   const sourceKeys = new Set(items.value.map(formationSeriesKey))
+  sourceDetailOverrides.value = Object.fromEntries(Object.entries(sourceDetailOverrides.value).filter(([key]) => sourceKeys.has(key)))
   seriesColors.value = Object.fromEntries(Object.entries(seriesColors.value).filter(([key]) => sourceKeys.has(key)))
 }
 function applyFields(next: FormationField[]) {
@@ -108,7 +119,7 @@
   saving.value = true
   try {
     pruneValues()
-    const content = { name: reportName.value.trim(), description: description.value, settings: { fields: fields.value, values: values.value, chargeStepSelections: chargeStepSelections.value, metrics: metrics.value, seriesColors: seriesColors.value } }
+    const content = { name: reportName.value.trim(), description: description.value, settings: { fields: fields.value, values: values.value, sourceDetailOverrides: sourceDetailOverrides.value, chargeStepSelections: chargeStepSelections.value, metrics: metrics.value, seriesColors: seriesColors.value } }
     const result = editingId.value && saved.value
       ? await editFormationReport(editingId.value, { ...content, baseVersionNo: saved.value.versionNo, changeSummary: changeSummary.value.trim() })
       : await createFormationReport({ ...content, selections: items.value.map(item => item.source.selection) })
@@ -185,6 +196,7 @@
   loading.value = true; loadError.value = ''
   previewSequence++; previewLoading.value = false; previewError.value = ''
   saved.value = null; items.value = []; cycleNos.value = []; values.value = {}; chargeStepSelections.value = {}; selectedKeys.value = []
+  sourceDetailOverrides.value = {}
   try {
     const permissions = (await getUserInfo()).permissions || []
     const has = (action: string) => permissions.includes('*:*:*') || permissions.includes(`system:formation-report:${action}`)
@@ -227,7 +239,10 @@
           <div class="report-data-table-wrap"><table class="report-data-table" :style="tableStyle">
             <thead><tr><th>测试</th><th v-for="column in reportColumns" :key="column.id" :colspan="column.items.length">{{ column.name }}</th></tr>
               <tr><th>电池组 / 电池号</th><th v-for="item in reportItems" :key="selectionKey(item.source)">{{ item.source.batteryGroup }} / {{ item.source.batteryNo }}</th></tr></thead>
-            <tbody><tr v-for="field in detailFields" :key="field.key"><td>{{ formationFieldLabel(field) }}</td><td v-for="item in reportItems" :key="selectionKey(item.source)">
+            <tbody>
+              <tr><td>实验名称</td><td v-for="item in reportItems" :key="selectionKey(item.source)"><el-input :model-value="formationDetailValue(item.source, sourceDetailOverrides)" :disabled="readonly" :aria-label="`${item.source.name} ${item.source.batteryNo} 实验名称`" @update:model-value="setDetail(item.source, $event)" /></td></tr>
+              <tr v-for="field in sourceFields" :key="`console:${field.key}`"><td>{{ field.name }}({{ field.category === 'battery' ? '电池字段' : '特殊字段' }})</td><td v-for="item in reportItems" :key="selectionKey(item.source)"><el-input :model-value="formationDetailValue(item.source, sourceDetailOverrides, field)" :disabled="readonly" :aria-label="`${item.source.name} ${item.source.batteryNo} 详情 ${field.name}`" @update:model-value="setDetail(item.source, $event, field)" /></td></tr>
+              <tr v-for="field in detailFields" :key="field.key"><td>{{ formationFieldLabel(field) }}</td><td v-for="item in reportItems" :key="selectionKey(item.source)">
               <el-input :model-value="inputValue(item, 0, field)" @update:model-value="setValue(item, 0, field, $event)" :disabled="readonly" :aria-label="`${item.source.name} ${item.source.batteryNo} ${field.displayName}`" :placeholder="field.kind === 'manual' ? '人工填写' : '指标缺失'" size="small" />
             </td></tr></tbody>
           </table></div>

--
Gitblit v1.7.1