| | |
| | | <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 : ['额定容量', '电流', '内阻', '质量', '材料批次']), |
| | |
| | | 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 |
| | |
| | | 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)) |
| | |
| | | </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> |