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

---
 src/views/bpm/form/editor/index.vue |  174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 174 insertions(+), 0 deletions(-)

diff --git a/src/views/bpm/form/editor/index.vue b/src/views/bpm/form/editor/index.vue
new file mode 100644
index 0000000..4165fcc
--- /dev/null
+++ b/src/views/bpm/form/editor/index.vue
@@ -0,0 +1,174 @@
+<template>
+  <ContentWrap :body-style="{ padding: '0px' }" class="!mb-0">
+    <!-- 琛ㄥ崟璁捐鍣� -->
+    <div
+      class="h-[calc(100vh-var(--top-tool-height)-var(--tags-view-height)-var(--app-content-padding)-var(--app-content-padding)-2px)]"
+    >
+      <fc-designer class="my-designer" ref="designer" :config="designerConfig">
+        <template #handle>
+          <el-button size="small" type="success" plain @click="handleSave">
+            <Icon class="mr-5px" icon="ep:plus" />
+            淇濆瓨
+          </el-button>
+        </template>
+      </fc-designer>
+    </div>
+  </ContentWrap>
+
+  <!-- 琛ㄥ崟淇濆瓨鐨勫脊绐� -->
+  <Dialog v-model="dialogVisible" title="淇濆瓨琛ㄥ崟" width="600">
+    <el-form ref="formRef" :model="formData" :rules="formRules" label-width="80px">
+      <el-form-item label="琛ㄥ崟鍚�" prop="name">
+        <el-input v-model="formData.name" placeholder="璇疯緭鍏ヨ〃鍗曞悕" />
+      </el-form-item>
+      <el-form-item label="鐘舵��" prop="status">
+        <el-radio-group v-model="formData.status">
+          <el-radio
+            v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
+            :key="dict.value"
+            :value="dict.value"
+          >
+            {{ dict.label }}
+          </el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="澶囨敞" prop="remark">
+        <el-input v-model="formData.remark" placeholder="璇疯緭鍏ュ娉�" type="textarea" />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button :disabled="formLoading" type="primary" @click="submitForm">纭� 瀹�</el-button>
+      <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+    </template>
+  </Dialog>
+</template>
+<script lang="ts" setup>
+import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
+import { CommonStatusEnum } from '@/utils/constants'
+import * as FormApi from '@/api/bpm/form'
+import FcDesigner from '@form-create/designer'
+import { encodeConf, encodeFields, setConfAndFields } from '@/utils/formCreate'
+import { useTagsViewStore } from '@/store/modules/tagsView'
+import { useFormCreateDesigner } from '@/components/FormCreate'
+import { useRoute } from 'vue-router'
+
+defineOptions({ name: 'BpmFormEditor' })
+
+const { t } = useI18n() // 鍥介檯鍖�
+const message = useMessage() // 娑堟伅
+const route = useRoute() // 璺敱
+const { push, currentRoute } = useRouter() // 璺敱
+const { query } = useRoute() // 璺敱淇℃伅
+const { delView } = useTagsViewStore() // 瑙嗗浘鎿嶄綔
+
+// 琛ㄥ崟璁捐鍣ㄩ厤缃�
+const designerConfig = ref({
+  switchType: [], // 鏄惁鍙互鍒囨崲缁勪欢绫诲瀷,鎴栬�呭彲浠ョ浉浜掑垏鎹㈢殑瀛楁
+  autoActive: true, // 鏄惁鑷姩閫変腑鎷栧叆鐨勭粍浠�
+  useTemplate: false, // 鏄惁鐢熸垚vue2璇硶鐨勬ā鏉跨粍浠�
+  formOptions: {
+    form: {
+      labelWidth: '100px' // 璁剧疆榛樿鐨� label 瀹藉害涓� 100px
+    }
+  }, // 瀹氫箟琛ㄥ崟閰嶇疆榛樿鍊�
+  fieldReadonly: false, // 閰嶇疆field鏄惁鍙互缂栬緫
+  hiddenDragMenu: false, // 闅愯棌鎷栨嫿鎿嶄綔鎸夐挳
+  hiddenDragBtn: false, // 闅愯棌鎷栨嫿鎸夐挳
+  hiddenMenu: [], // 闅愯棌閮ㄥ垎鑿滃崟
+  hiddenItem: [], // 闅愯棌閮ㄥ垎缁勪欢
+  hiddenItemConfig: {}, // 闅愯棌缁勪欢鐨勯儴鍒嗛厤缃」
+  disabledItemConfig: {}, // 绂佺敤缁勪欢鐨勯儴鍒嗛厤缃」
+  showSaveBtn: false, // 鏄惁鏄剧ず淇濆瓨鎸夐挳
+  showConfig: true, // 鏄惁鏄剧ず鍙充晶鐨勯厤缃晫闈�
+  showBaseForm: true, // 鏄惁鏄剧ず缁勪欢鐨勫熀纭�閰嶇疆琛ㄥ崟
+  showControl: true, // 鏄惁鏄剧ず缁勪欢鑱斿姩
+  showPropsForm: true, // 鏄惁鏄剧ず缁勪欢鐨勫睘鎬ч厤缃〃鍗�
+  showEventForm: true, // 鏄惁鏄剧ず缁勪欢鐨勪簨浠堕厤缃〃鍗�
+  showValidateForm: true, // 鏄惁鏄剧ず缁勪欢鐨勯獙璇侀厤缃〃鍗�
+  showFormConfig: true, // 鏄惁鏄剧ず琛ㄥ崟閰嶇疆
+  showInputData: true, // 鏄惁鏄剧ず褰曞叆鎸夐挳
+  showDevice: true, // 鏄惁鏄剧ず澶氱閫傞厤閫夐」
+  appendConfigData: [] // 瀹氫箟娓叉煋瑙勫垯鎵�闇�鐨刦ormData
+})
+const designer = ref() // 琛ㄥ崟璁捐鍣�
+useFormCreateDesigner(designer) // 琛ㄥ崟璁捐鍣ㄥ寮�
+const dialogVisible = ref(false) // 寮圭獥鏄惁灞曠ず
+const formLoading = ref(false) // 琛ㄥ崟鐨勫姞杞戒腑锛氭彁浜ょ殑鎸夐挳绂佺敤
+const formData = ref({
+  name: '',
+  status: CommonStatusEnum.ENABLE,
+  remark: ''
+})
+const formRules = reactive({
+  name: [{ required: true, message: '琛ㄥ崟鍚嶄笉鑳戒负绌�', trigger: 'blur' }],
+  status: [{ required: true, message: '寮�鍚姸鎬佷笉鑳戒负绌�', trigger: 'blur' }]
+})
+const formRef = ref() // 琛ㄥ崟 Ref
+
+/** 澶勭悊淇濆瓨鎸夐挳 */
+const handleSave = () => {
+  dialogVisible.value = true
+}
+
+/** 鎻愪氦琛ㄥ崟 */
+const submitForm = async () => {
+  // 鏍¢獙琛ㄥ崟
+  if (!formRef) return
+  const valid = await formRef.value.validate()
+  if (!valid) return
+  // 鎻愪氦璇锋眰
+  formLoading.value = true
+  try {
+    const data = formData.value as FormApi.FormVO
+    data.conf = encodeConf(designer) // 琛ㄥ崟閰嶇疆
+    data.fields = encodeFields(designer) // 琛ㄥ崟瀛楁
+    if (!data.id) {
+      await FormApi.createForm(data)
+      message.success(t('common.createSuccess'))
+    } else {
+      await FormApi.updateForm(data)
+      message.success(t('common.updateSuccess'))
+    }
+    dialogVisible.value = false
+    close()
+  } finally {
+    formLoading.value = false
+  }
+}
+/** 鍏抽棴鎸夐挳 */
+const close = () => {
+  delView(unref(currentRoute))
+  push('/bpm/manager/form')
+}
+
+/** 鍒濆鍖� **/
+onMounted(async () => {
+  // 鍦烘櫙涓�锛氭柊澧炶〃鍗�
+  const id = query.id as unknown as number
+  if (!id) {
+    return
+  }
+  // 鍦烘櫙浜岋細淇敼琛ㄥ崟
+  const data = await FormApi.getForm(id)
+  formData.value = data
+  setConfAndFields(designer, data.conf, data.fields)
+
+  if (route.query.type !== 'copy') {
+    return
+  }
+  // 鍦烘櫙涓夛細 澶嶅埗琛ㄥ崟
+  const { id: foo, ...copied } = data
+  formData.value = copied
+  formData.value.name += '_copy'
+})
+</script>
+
+<style>
+.my-designer {
+  ._fc-l,
+  ._fc-m,
+  ._fc-r {
+    border-top: none;
+  }
+}
+</style>

--
Gitblit v1.8.0