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