yeg
2026-09-08 e46cafc5d359de8a66d3deac15f7911bf6007ce4
src/components/ReportTestDetail.vue
@@ -1,14 +1,16 @@
<script setup lang="ts">
import { computed, ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useBatteryGroupFields } from '@/stores/batteryGroupFields'
import { getBatteryGroupFields, type BatteryGroupField } from '@/api/batteryGroupFields'
import { reportDetailFields, snapshotReportDetails, type ReportDetailColumn, type ReportTestDetails } from '@/utils/reportTestDetails'
const props = defineProps<{ columns: ReportDetailColumn[]; modelValue?: ReportTestDetails; readonly?: boolean; disabled?: boolean }>()
const emit = defineEmits<{ 'update:modelValue': [ReportTestDetails] }>()
const details = computed(() => snapshotReportDetails(props.columns, props.modelValue))
const fields = computed(() => reportDetailFields(details.value))
const { fields: managedFields } = useBatteryGroupFields()
const managedFields = ref<BatteryGroupField[]>([])
const fieldsLoading = ref(false)
const fieldsError = ref('')
const batteryOptions = computed(() => {
  const enabled = managedFields.value.filter(field => field.status === '启用').map(field => field.name)
  return [...new Set([...(enabled.length ? enabled : ['额定容量', '电流', '内阻', '质量', '材料批次']),
@@ -23,6 +25,7 @@
const selectedBatteryFields = ref<string[]>([])
const selectedSpecialTemplate = ref('循环寿命模板')
const locked = computed(() => props.readonly || props.disabled || !props.columns.length)
const templateLocked = computed(() => locked.value || (templateMode.value === 'battery' && (fieldsLoading.value || Boolean(fieldsError.value))))
function updateValue(column: ReportDetailColumn, field: typeof fields.value[number], value: string) {
  if (locked.value) return
@@ -64,13 +67,27 @@
  templateMode.value = mode
  selectedBatteryFields.value = fields.value.filter(field => field.category === 'battery').map(field => field.name)
  templateVisible.value = true
  if (mode === 'battery') void loadBatteryFields()
}
async function loadBatteryFields() {
  fieldsLoading.value = true
  fieldsError.value = ''
  try { managedFields.value = await getBatteryGroupFields() }
  catch (error) { fieldsError.value = error instanceof Error ? error.message : '电池组字段加载失败' }
  finally { fieldsLoading.value = false }
}
function applyTemplate() {
  if (locked.value) return
  if (templateLocked.value) return
  const next = snapshotReportDetails(props.columns, details.value)
  for (const detail of Object.values(next)) {
    if (templateMode.value === 'battery') {
      // 与控制台一致:同名特殊字段转为电池组字段时,保留本列原值及明确空字符串。
      for (const name of selectedBatteryFields.value) {
        const value = detail.fieldValues![`special|${name}`]
        if (!detail.batteryFields!.includes(name) && value !== undefined) detail.fieldValues![`battery|${name}`] = value
      }
      detail.batteryFields = [...selectedBatteryFields.value]
      detail.specialFields = detail.specialFields!.filter(name => !detail.batteryFields!.includes(name))
    } else detail.specialFields = [...specialTemplates[selectedSpecialTemplate.value]!].filter(name => !detail.batteryFields!.includes(name))
@@ -102,9 +119,13 @@
    </div>
    <div v-if="!readonly" class="detail-actions"><button class="secondary-button" type="button" :disabled="locked" @click="addField"><el-icon><Plus /></el-icon>添加项</button><button class="secondary-button" type="button" :disabled="locked" @click="openTemplate('battery')">电池组字段模板</button><button class="secondary-button" type="button" :disabled="locked" @click="openTemplate('special')">选择特殊字段模板</button></div>
    <el-dialog v-model="templateVisible" :title="templateMode === 'battery' ? '选择电池组字段模板' : '选择特殊字段模板'" width="620px" align-center>
      <el-checkbox-group v-if="templateMode === 'battery'" v-model="selectedBatteryFields" class="template-field-options"><el-checkbox v-for="field in batteryOptions" :key="field" :value="field">{{ field }}</el-checkbox></el-checkbox-group>
      <template v-if="templateMode === 'battery'">
        <p v-if="fieldsLoading" role="status">正在加载电池组字段</p>
        <div v-else-if="fieldsError" role="alert">{{ fieldsError }}<button class="secondary-button" type="button" @click="loadBatteryFields">重试</button></div>
        <el-checkbox-group v-else v-model="selectedBatteryFields" class="template-field-options"><el-checkbox v-for="field in batteryOptions" :key="field" :value="field">{{ field }}</el-checkbox></el-checkbox-group>
      </template>
      <el-radio-group v-else v-model="selectedSpecialTemplate" class="template-field-options"><el-radio v-for="(names, name) in specialTemplates" :key="name" :value="name" border>{{ name }}({{ names.join('、') }})</el-radio></el-radio-group>
      <template #footer><button class="secondary-button" type="button" @click="templateVisible=false">取消</button><button class="primary-button" type="button" :disabled="locked" @click="applyTemplate"><el-icon><Check /></el-icon>应用模板</button></template>
      <template #footer><button class="secondary-button" type="button" @click="templateVisible=false">取消</button><button class="primary-button" type="button" :disabled="templateLocked" @click="applyTemplate"><el-icon><Check /></el-icon>应用模板</button></template>
    </el-dialog>
  </section>
</template>