yeg
2026-09-08 0c7ab59fe6f7c91280665533cdaa57530a70dc6b
src/components/SpliceFieldControls.vue
@@ -14,8 +14,7 @@
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 => ({
@@ -53,11 +52,8 @@
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() {