From 33af5dd764af153bd8fe8fc9fb3b0a5affccab2d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 22 Nov 2025 11:16:27 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=A4=8D=E5=88=B6?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E6=97=B6=E5=AD=97=E6=AE=B5=20ID=20=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=96=B0=E7=9A=84=E5=AD=97=E6=AE=B5=20ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FormCreate/src/useFormCreateDesigner.ts | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/components/FormCreate/src/useFormCreateDesigner.ts b/src/components/FormCreate/src/useFormCreateDesigner.ts index dff1333b..6682004e 100644 --- a/src/components/FormCreate/src/useFormCreateDesigner.ts +++ b/src/components/FormCreate/src/useFormCreateDesigner.ts @@ -9,6 +9,7 @@ import { import { Ref } from 'vue' import { Menu } from '@/components/FormCreate/src/type' import { apiSelectRule } from '@/components/FormCreate/src/config/selectRule' +import { generateUUID } from '@/utils' /** * 表单设计器增强 hook @@ -93,9 +94,60 @@ export const useFormCreateDesigner = async (designer: Ref) => { designer.value?.addMenu(menu) } + /** + * 修复重复的字段 ID 问题 + * 当复制组件时,自动为新组件生成新的字段 ID + * + * 对应 issue:https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues/ICM22X + */ + const fixDuplicateFields = () => { + // 获取当前所有规则 + const rules = designer.value?.getRule() || [] + const fieldIds = new Set() + let hasChanges = false + + // 遍历所有规则,检测并修复重复的字段 ID + rules.forEach((rule: any) => { + if (rule.field) { + if (fieldIds.has(rule.field)) { + // 发现重复,生成新的ID + const oldField = rule.field + const newField = generateUUID() + console.log(`[FormCreate] 检测到重复字段ID: ${oldField}, 已自动更新为: ${newField}`) + rule.field = newField + hasChanges = true + } else { + fieldIds.add(rule.field) + } + } + }) + + // 如果有重复字段被修复,更新设计器 + if (hasChanges) { + designer.value?.setRule(rules) + } + + return hasChanges + } + onMounted(async () => { await nextTick() buildFormComponents() buildSystemMenu() + + // 监听设计器内容变化,自动修复重复字段ID + let isFixing = false // 防止无限循环 + watch( + () => designer.value?.getRule(), + async () => { + if (!isFixing) { + isFixing = true + await nextTick() + fixDuplicateFields() + isFixing = false + } + }, + { deep: true } + ) }) }