| | |
| | | const loading = ref(false) |
| | | const saving = ref(false) |
| | | const error = ref('') |
| | | // 共享字段以定义 ID 区分;控制台详情只有名称,不能与同名共享字段合并。 |
| | | const identity = (field: SpliceField) => field.fieldDefinitionId ? `id:${field.fieldDefinitionId}` : `name:${field.name}` |
| | | const identity = (field: SpliceField) => field.name |
| | | const fieldName = (field: SpliceField) => field.name |
| | | function openSettings() { |
| | | const available: SpliceField[] = props.segments.flatMap(segment => (segment.businessFields || []).map(field => ({ |
| | |
| | | function applyTemplate() { |
| | | const template = templates.value.find(item => item.id === selectedTemplate.value) |
| | | if (!template) { ElMessage.warning('请选择字段模板'); return } |
| | | const consoleFields: SpliceField[] = [...props.segments.flatMap(segment => (segment.consoleDetail?.batteryFields || []).map(name => ({ name, displayName: name, unit: '', category: 'battery' as const }))), ...props.segments.flatMap(segment => (segment.consoleDetail?.specialFields || []).map(name => ({ name, displayName: name, unit: '', category: 'special' as const })))] |
| | | const selected = template.fields.map(field => ({ ...field })) |
| | | // 模板只替换结构;来源控制台字段仍保留为独立详情行,除非模板明确选择了同一身份。 |
| | | for (const field of consoleFields) if (!selected.some(item => item.name === field.name && !item.fieldDefinitionId)) selected.push(field) |
| | | emit('apply', selected) |
| | | // 来源详情独立于模板结构维护,不参与模板字段身份、单位和唯一性校验。 |
| | | emit('apply', template.fields.map(field => ({ ...field }))) |
| | | templatesVisible.value = false; ElMessage.success('字段模板已应用') |
| | | } |
| | | async function saveTemplate() { |