From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目

---
 src/components/FormCreate/src/useFormCreateDesigner.ts |  165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 165 insertions(+), 0 deletions(-)

diff --git a/src/components/FormCreate/src/useFormCreateDesigner.ts b/src/components/FormCreate/src/useFormCreateDesigner.ts
new file mode 100644
index 0000000..4e87e43
--- /dev/null
+++ b/src/components/FormCreate/src/useFormCreateDesigner.ts
@@ -0,0 +1,165 @@
+import {
+  useDictSelectRule,
+  useEditorRule,
+  useSelectRule,
+  useUploadFileRule,
+  useUploadImgRule,
+  useUploadImgsRule
+} from './config'
+import { Ref } from 'vue'
+import { Menu } from '@/components/FormCreate/src/type'
+import { apiSelectRule } from '@/components/FormCreate/src/config/selectRule'
+import { generateUUID } from '@/utils'
+
+/**
+ * 琛ㄥ崟璁捐鍣ㄥ寮� hook
+ * 鏂板
+ * - 鏂囦欢涓婁紶
+ * - 鍗曞浘涓婁紶
+ * - 澶氬浘涓婁紶
+ * - 瀛楀吀閫夋嫨鍣�
+ * - 鐢ㄦ埛閫夋嫨鍣�
+ * - 閮ㄩ棬閫夋嫨鍣�
+ * - 瀵屾枃鏈�
+ */
+export const useFormCreateDesigner = async (designer: Ref) => {
+  const editorRule = useEditorRule()
+  const uploadFileRule = useUploadFileRule()
+  const uploadImgRule = useUploadImgRule()
+  const uploadImgsRule = useUploadImgsRule()
+
+  /**
+   * 鏋勫缓琛ㄥ崟缁勪欢
+   */
+  const buildFormComponents = () => {
+    // 绉婚櫎鑷甫鐨勪笂浼犵粍浠惰鍒欙紝浣跨敤 uploadFileRule銆乽ploadImgRule銆乽ploadImgsRule 鏇夸唬
+    designer.value?.removeMenuItem('upload')
+    // 绉婚櫎鑷甫鐨勫瘜鏂囨湰缁勪欢瑙勫垯锛屼娇鐢� editorRule 鏇夸唬
+    designer.value?.removeMenuItem('fcEditor')
+    const components = [editorRule, uploadFileRule, uploadImgRule, uploadImgsRule]
+    components.forEach((component) => {
+      // 鎻掑叆缁勪欢瑙勫垯
+      designer.value?.addComponent(component)
+      // 鎻掑叆鎷栨嫿鎸夐挳鍒� `main` 鍒嗙被涓�
+      designer.value?.appendMenuItem('main', {
+        icon: component.icon,
+        name: component.name,
+        label: component.label
+      })
+    })
+  }
+
+  const userSelectRule = useSelectRule({
+    name: 'UserSelect',
+    label: '鐢ㄦ埛閫夋嫨鍣�',
+    icon: 'icon-user-o'
+  })
+  const deptSelectRule = useSelectRule({
+    name: 'DeptSelect',
+    label: '閮ㄩ棬閫夋嫨鍣�',
+    icon: 'icon-address-card-o',
+    props: [
+      {
+        type: 'select',
+        field: 'returnType',
+        title: '杩斿洖鍊肩被鍨�',
+        value: 'id',
+        options: [
+          { label: '閮ㄩ棬缂栧彿', value: 'id' },
+          { label: '閮ㄩ棬鍚嶇О', value: 'name' }
+        ]
+      }
+    ]
+  })
+  const dictSelectRule = useDictSelectRule()
+  const apiSelectRule0 = useSelectRule({
+    name: 'ApiSelect',
+    label: '鎺ュ彛閫夋嫨鍣�',
+    icon: 'icon-server',
+    props: [...apiSelectRule],
+    event: ['click', 'change', 'visibleChange', 'clear', 'blur', 'focus']
+  })
+
+  /**
+   * 鏋勫缓绯荤粺瀛楁鑿滃崟
+   */
+  const buildSystemMenu = () => {
+    // 绉婚櫎鑷甫鐨勪笅鎷夐�夋嫨鍣ㄧ粍浠讹紝浣跨敤 currencySelectRule 鏇夸唬
+    // designer.value?.removeMenuItem('select')
+    // designer.value?.removeMenuItem('radio')
+    // designer.value?.removeMenuItem('checkbox')
+    const components = [userSelectRule, deptSelectRule, dictSelectRule, apiSelectRule0]
+    const menu: Menu = {
+      name: 'system',
+      title: '绯荤粺瀛楁',
+      list: components.map((component) => {
+        // 鎻掑叆缁勪欢瑙勫垯
+        designer.value?.addComponent(component)
+        // 鎻掑叆鎷栨嫿鎸夐挳鍒� `system` 鍒嗙被涓�
+        return {
+          icon: component.icon,
+          name: component.name,
+          label: component.label
+        }
+      })
+    }
+    designer.value?.addMenu(menu)
+  }
+
+  /**
+   * 淇閲嶅鐨勫瓧娈� ID 闂
+   * 褰撳鍒剁粍浠舵椂锛岃嚜鍔ㄤ负鏂扮粍浠剁敓鎴愭柊鐨勫瓧娈� ID
+   *
+   * 瀵瑰簲 issue锛歨ttps://gitee.com/yudaocode/yudao-ui-admin-vue3/issues/ICM22X
+   */
+  const fixDuplicateFields = () => {
+    // 鑾峰彇褰撳墠鎵�鏈夎鍒�
+    const rules = designer.value?.getRule() || []
+    const fieldIds = new Set<string>()
+    let hasChanges = false
+
+    // 閬嶅巻鎵�鏈夎鍒欙紝妫�娴嬪苟淇閲嶅鐨勫瓧娈� ID
+    rules.forEach((rule: any) => {
+      if (rule.field) {
+        if (fieldIds.has(rule.field)) {
+          // 鍙戠幇閲嶅锛岀敓鎴愭柊鐨処D
+          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 }
+    )
+  })
+}

--
Gitblit v1.8.0