From db10830bbbdffb40ce5ef626691f07ad97f795bc Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Wed, 4 Jun 2025 09:48:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20[BPM=20=E5=B7=A5=E4=BD=9C=E6=B5=81]=20S?= =?UTF-8?q?imple=20=E6=A8=A1=E5=9E=8B=20-=20=E6=B5=81=E7=A8=8B=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/simple-process-designer.vue | 72 +++++++++---------- .../styles/simple-process-designer.scss | 3 +- .../src/views/bpm/model/form/index.vue | 42 ++++------- .../bpm/model/form/modules/process-design.vue | 16 +++-- .../form/modules/simple-model-design.vue | 7 +- 5 files changed, 69 insertions(+), 71 deletions(-) diff --git a/apps/web-antd/src/components/simple-process-design/components/simple-process-designer.vue b/apps/web-antd/src/components/simple-process-design/components/simple-process-designer.vue index 7f2762ca1..be8770d12 100644 --- a/apps/web-antd/src/components/simple-process-design/components/simple-process-designer.vue +++ b/apps/web-antd/src/components/simple-process-design/components/simple-process-designer.vue @@ -11,9 +11,10 @@ import type { SystemUserApi } from '#/api/system/user'; import { inject, onMounted, provide, ref, watch } from 'vue'; +import { useVbenModal } from '@vben/common-ui'; import { handleTree } from '@vben/utils'; -import { Button, Modal } from 'ant-design-vue'; +import { Button } from 'ant-design-vue'; import { getFormDetail } from '#/api/bpm/form'; import { getUserGroupSimpleList } from '#/api/bpm/userGroup'; @@ -112,8 +113,11 @@ provide('tasks', []); provide('processInstance', {}); const processNodeTree = ref(); provide('processNodeTree', processNodeTree); -const errorDialogVisible = ref(false); -const errorNodes: SimpleFlowNode[] = []; + +// 创建错误提示弹窗 +const [ErrorModal, errorModalApi] = useVbenModal({ + fullscreenButton: false, +}); // 添加更新模型的方法 const updateModel = () => { @@ -122,6 +126,7 @@ const updateModel = () => { name: '发起人', type: NodeType.START_USER_NODE, id: NodeId.START_USER_NODE_ID, + showText: '默认配置', childNode: { id: NodeId.END_EVENT_NODE_ID, name: '结束', @@ -151,7 +156,7 @@ const saveSimpleFlowModel = async ( /** * 校验节点设置。 暂时以 showText 为空 未节点错误配置 */ -// eslint-disable-next-line unused-imports/no-unused-vars, no-unused-vars + const validateNode = ( node: SimpleFlowNode | undefined, errorNodes: SimpleFlowNode[], @@ -161,34 +166,23 @@ const validateNode = ( if (type === NodeType.END_EVENT_NODE) { return; } - if (type === NodeType.START_USER_NODE) { - // 发起人节点暂时不用校验,直接校验孩子节点 - validateNode(node.childNode, errorNodes); - } - - if ( - type === NodeType.USER_TASK_NODE || - type === NodeType.COPY_TASK_NODE || - type === NodeType.CONDITION_NODE - ) { - if (!showText) { - errorNodes.push(node); - } - validateNode(node.childNode, errorNodes); - } if ( type === NodeType.CONDITION_BRANCH_NODE || type === NodeType.PARALLEL_BRANCH_NODE || type === NodeType.INCLUSIVE_BRANCH_NODE ) { - // 分支节点 - // 1. 先校验各个分支 + // 1. 分支节点, 先校验各个分支 conditionNodes?.forEach((item) => { validateNode(item, errorNodes); }); // 2. 校验孩子节点 validateNode(node.childNode, errorNodes); + } else { + if (!showText) { + errorNodes.push(node); + } + validateNode(node.childNode, errorNodes); } } }; @@ -220,38 +214,40 @@ onMounted(async () => { } }); -const simpleProcessModelRef = ref(); - -defineExpose({}); +const validate = async () => { + const errorNodes: SimpleFlowNode[] = []; + validateNode(processNodeTree.value, errorNodes); + if (errorNodes.length === 0) { + return true; + } else { + // 设置错误节点数据并打开弹窗 + errorModalApi.setData(errorNodes); + errorModalApi.open(); + return false; + } +}; +defineExpose({ validate }); diff --git a/apps/web-antd/src/components/simple-process-design/styles/simple-process-designer.scss b/apps/web-antd/src/components/simple-process-design/styles/simple-process-designer.scss index b4ff3ab28..a36f96986 100644 --- a/apps/web-antd/src/components/simple-process-design/styles/simple-process-designer.scss +++ b/apps/web-antd/src/components/simple-process-design/styles/simple-process-designer.scss @@ -648,7 +648,8 @@ width: 80px; height: 36px; color: #212121; - border: 2px solid #fafafa; + background-color: #fff; + border: 2px solid transparent; border-radius: 30px; box-shadow: 0 1px 5px 0 rgb(10 30 65 / 8%); diff --git a/apps/web-antd/src/views/bpm/model/form/index.vue b/apps/web-antd/src/views/bpm/model/form/index.vue index 79a698c8e..e3418da4e 100644 --- a/apps/web-antd/src/views/bpm/model/form/index.vue +++ b/apps/web-antd/src/views/bpm/model/form/index.vue @@ -216,7 +216,8 @@ const validateAllSteps = async () => { await validateBasic(); } catch { currentStep.value = 0; - throw new Error('请完善基本信息'); + message.warning('请完善基本信息'); + return false; } // 表单设计校验 @@ -224,25 +225,19 @@ const validateAllSteps = async () => { await validateForm(); } catch { currentStep.value = 1; - throw new Error('请完善自定义表单信息'); + message.warning('请完善自定义表单信息'); + return false; } - // 流程设计校验 TODO - + // 流程设计校验 try { await validateProcess(); } catch { currentStep.value = 2; - throw new Error('请设计流程'); + return false; } - // 表单设计校验 - try { - await validateProcess(); - } catch { - currentStep.value = 2; - throw new Error('请设计流程'); - } + // TODO 更多设置校验 return true; }; @@ -251,7 +246,10 @@ const validateAllSteps = async () => { const handleSave = async () => { try { // 保存前校验所有步骤的数据 - await validateAllSteps(); + const result = await validateAllSteps(); + if (!result) { + return; + } // 更新表单数据 const modelData = { @@ -297,7 +295,7 @@ const handleSave = async () => { } } catch (error: any) { console.error('保存失败:', error); - message.warning(error.message || '请完善所有步骤的必填信息'); + // message.warning(error.msg || '请完善所有步骤的必填信息'); } }; @@ -347,23 +345,13 @@ const handleStepClick = async (index: number) => { if (index !== 2) { await validateProcess(); } - // 切换步骤 currentStep.value = index; - - // 如果切换到流程设计步骤,等待组件渲染完成后刷新设计器 - if (index === 2) { - // TODO 后续加 - // await nextTick(); - // // 等待更长时间确保组件完全初始化 - // await new Promise((resolve) => setTimeout(resolve, 200)); - // if (processDesignRef.value?.refresh) { - // await processDesignRef.value.refresh(); - // } - } } catch (error) { console.error('步骤切换失败:', error); - message.warning('请先完善当前步骤必填信息'); + if (currentStep.value !== 2) { + message.warning('请先完善当前步骤必填信息'); + } } }; diff --git a/apps/web-antd/src/views/bpm/model/form/modules/process-design.vue b/apps/web-antd/src/views/bpm/model/form/modules/process-design.vue index f9fb07543..8824de4a2 100644 --- a/apps/web-antd/src/views/bpm/model/form/modules/process-design.vue +++ b/apps/web-antd/src/views/bpm/model/form/modules/process-design.vue @@ -1,7 +1,7 @@ diff --git a/apps/web-antd/src/views/bpm/model/form/modules/simple-model-design.vue b/apps/web-antd/src/views/bpm/model/form/modules/simple-model-design.vue index d503f2de6..bf31f74dd 100644 --- a/apps/web-antd/src/views/bpm/model/form/modules/simple-model-design.vue +++ b/apps/web-antd/src/views/bpm/model/form/modules/simple-model-design.vue @@ -17,12 +17,17 @@ defineProps<{ const emit = defineEmits(['success']); const designerRef = ref(); -// 修改成功回调 +/** 保存成功回调 */ const handleSuccess = (data?: any) => { if (data) { emit('success', data); } }; +/** 设计器配置校验 */ +const validateConfig = async () => { + return await designerRef.value.validate(); +}; +defineExpose({ validateConfig });