From 1f767c5090471ff15305356a17c718dc4856c9a5 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sun, 2 Nov 2025 09:29:46 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20[antd][bpm]=20=E5=8F=91=E8=B5=B7?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D,=20todo?= =?UTF-8?q?=20=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../processInstance/create/modules/form.vue | 43 ++++++++++++------- .../detail/modules/operation-button.vue | 3 -- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue b/apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue index d94df581a..6eddd7a4c 100644 --- a/apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue +++ b/apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue @@ -51,7 +51,6 @@ const props = defineProps({ const emit = defineEmits(['cancel']); const { closeCurrentTab } = useTabs(); -const isFormReady = ref(false); // 表单就绪状态变量:表单就绪后再渲染 form-create const getTitle = computed(() => { return `流程表单 - ${props.selectProcessDefinition.name}`; }); @@ -122,21 +121,32 @@ async function initProcessInfo(row: any, formVariables?: any) { // 注意:需要从 formVariables 中,移除不在 row.formFields 的值。 // 原因是:后端返回的 formVariables 里面,会有一些非表单的信息。例如说,某个流程节点的审批人。 // 这样,就可能导致一个流程被审批不通过后,重新发起时,会直接后端报错!!! - const formApi = formCreate.create(decodeFields(row.formFields)); - const allowedFields = formApi.fields(); - for (const key in formVariables) { - if (!allowedFields.includes(key)) { - delete formVariables[key]; + + // 解析表单字段列表(不创建实例,避免重复渲染) + const decodedFields = decodeFields(row.formFields); + const allowedFields = new Set( + decodedFields.map((field: any) => field.field).filter(Boolean), + ); + + // 过滤掉不允许的字段 + if (formVariables) { + for (const key in formVariables) { + if (!allowedFields.has(key)) { + delete formVariables[key]; + } } } + setConfAndFields2(detailForm, row.formConf, row.formFields, formVariables); - // 设置表单就绪状态 - // TODO @jason:这个变量是必须的,有没可能简化掉? - isFormReady.value = true; + // 在配置中禁用 form-create 自带的提交和重置按钮 + detailForm.value.option = { + ...detailForm.value.option, + submitBtn: false, + resetBtn: false, + }; await nextTick(); - fApi.value?.btn.show(false); // 隐藏提交按钮 // 获取流程审批信息,当再次发起时,流程审批节点要根据原始表单参数预测出来 await getApprovalDetail({ @@ -153,30 +163,32 @@ async function initProcessInfo(row: any, formVariables?: any) { } // 情况二:业务表单 } else if (row.formCustomCreatePath) { + // 这里暂时无需加载流程图,因为跳出到另外个 Tab; await router.push({ path: row.formCustomCreatePath, }); - // 这里暂时无需加载流程图,因为跳出到另外个 Tab; + // 返回选择流程 + emit('cancel'); } } /** 预测流程节点会因为输入的参数值而产生新的预测结果值,所以需重新预测一次 */ watch( - detailForm.value, + () => detailForm.value.value, (newValue) => { - if (newValue && Object.keys(newValue.value).length > 0) { + if (newValue && Object.keys(newValue).length > 0) { // 记录之前的节点审批人 tempStartUserSelectAssignees.value = startUserSelectAssignees.value; startUserSelectAssignees.value = {}; // 加载最新的审批详情 getApprovalDetail({ id: props.selectProcessDefinition.id, - processVariablesStr: JSON.stringify(newValue.value), // 解决 GET 无法传递对象的问题,后端 String 再转 JSON + processVariablesStr: JSON.stringify(newValue), // 解决 GET 无法传递对象的问题,后端 String 再转 JSON }); } }, { - immediate: true, + deep: true, }, ); @@ -283,7 +295,6 @@ defineExpose({ initProcessInfo }); class="flex-1 overflow-auto" > { if (popOverVisible.value[item]) popOverVisible.value[item] = item === type; }); - // TODO @jason:下面这 2 行,要删除么? - // await nextTick() - // formRef.value.resetFields() } /** 关闭气泡卡 */ From 60190fc94f8bc12571fa2c90f36006ec87508e74 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Mon, 3 Nov 2025 09:11:49 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20[antd][bpm]=20bpmn=20=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E5=9B=BE=E6=9F=A5=E7=9C=8B=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../processInstance/create/modules/form.vue | 10 +++- .../detail/modules/bpm-viewer.vue | 55 ++++++++++++++++++- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue b/apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue index 6eddd7a4c..4973fc4b5 100644 --- a/apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue +++ b/apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue @@ -24,6 +24,7 @@ import { } from '#/api/bpm/processInstance'; import { decodeFields, setConfAndFields2 } from '#/components/form-create'; import { router } from '#/router'; +import ProcessInstanceBpmnViewer from '#/views/bpm/processInstance/detail/modules/bpm-viewer.vue'; import ProcessInstanceSimpleViewer from '#/views/bpm/processInstance/detail/modules/simple-bpm-viewer.vue'; import ProcessInstanceTimeline from '#/views/bpm/processInstance/detail/modules/time-line.vue'; @@ -318,10 +319,15 @@ defineExpose({ initProcessInfo }); class="flex flex-1 overflow-hidden" :force-render="true" > -
+
+ +
diff --git a/apps/web-antd/src/views/bpm/processInstance/detail/modules/bpm-viewer.vue b/apps/web-antd/src/views/bpm/processInstance/detail/modules/bpm-viewer.vue index 585f731a4..0055df174 100644 --- a/apps/web-antd/src/views/bpm/processInstance/detail/modules/bpm-viewer.vue +++ b/apps/web-antd/src/views/bpm/processInstance/detail/modules/bpm-viewer.vue @@ -1,10 +1,59 @@