From 7b57c7d056135737c4090dcfe3600a3b27633e3b Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 17 Oct 2024 22:49:31 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E3=80=91=E5=B7=A5=E4=BD=9C=E6=B5=81=EF=BC=9A=E5=B0=86=20Simple?= =?UTF-8?q?ModelConstants=20=E5=88=A0=E9=99=A4=20=E3=80=90=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BC=98=E5=8C=96=E3=80=91=E5=B7=A5=E4=BD=9C=E6=B5=81?= =?UTF-8?q?=EF=BC=9A=E5=B0=86=20BpmUserTaskApproveMethodEnum=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20completionCondition?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../definition/BpmSimpleModelNodeType.java | 6 +- .../BpmUserTaskApproveMethodEnum.java | 13 ++-- .../core/enums/SimpleModelConstants.java | 33 --------- .../flowable/core/util/SimpleModelUtils.java | 67 ++++++------------- 4 files changed, 32 insertions(+), 87 deletions(-) delete mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/SimpleModelConstants.java diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java index 36ad0e5ee..59545d08a 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java @@ -28,11 +28,9 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable { // 50 ~ 条件分支 CONDITION_NODE(50, "sequenceFlow", "条件节点"), // 用于构建流转条件的表达式 - CONDITION_BRANCH_NODE(51, " “parallelGateway”", "条件分支节点"), // TODO @jason:是不是改成叫 条件分支? - PARALLEL_BRANCH_NODE(52, "exclusiveGateway", "并行分支节点"), // TODO @jason:是不是一个 并行分支 ?就可以啦? 后面是否去掉并行网关。只用包容网关 + CONDITION_BRANCH_NODE(51, "parallelGateway", "条件分支节点"), + PARALLEL_BRANCH_NODE(52, "exclusiveGateway", "并行分支节点"), INCLUSIVE_BRANCH_NODE(53, "inclusiveGateway", "包容分支节点"), - // TODO @jason:建议整合 join,最终只有 条件分支、并行分支、包容分支,三种~ - // TODO @芋艿。 感觉还是分开好理解一点,也好处理一点。前端结构中把聚合节点显示并传过来。 ; public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmSimpleModelNodeType::getType).toArray(); diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskApproveMethodEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskApproveMethodEnum.java index 9d4dd63af..01b19f2fa 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskApproveMethodEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskApproveMethodEnum.java @@ -16,20 +16,23 @@ import java.util.Arrays; @AllArgsConstructor public enum BpmUserTaskApproveMethodEnum implements IntArrayValuable { - RANDOM(1, "随机挑选一人审批"), - RATIO(2, "多人会签(按通过比例)"), // 会签(按通过比例) - ANY(3, "多人或签(一人通过或拒绝)"), // 或签(通过只需一人,拒绝只需一人) - SEQUENTIAL(4, "依次审批"); // 依次审批 + RANDOM(1, "随机挑选一人审批", null), + RATIO(2, "多人会签(按通过比例)", "${ nrOfCompletedInstances >= nrOfInstances }"), // 会签(按通过比例) + ANY(3, "多人或签(一人通过或拒绝)", "${ nrOfCompletedInstances > 0 }"), // 或签(通过只需一人,拒绝只需一人) + SEQUENTIAL(4, "依次审批", "${ nrOfCompletedInstances/nrOfInstances >= %s}"); // 依次审批 /** * 审批方式 */ private final Integer method; - /** * 名字 */ private final String name; + /** + * 完成表达式 + */ + private final String completionCondition; public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmUserTaskApproveMethodEnum::getMethod).toArray(); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/SimpleModelConstants.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/SimpleModelConstants.java deleted file mode 100644 index 2275f0c12..000000000 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/SimpleModelConstants.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.yudao.module.bpm.framework.flowable.core.enums; - -// TODO @jason:要不合并到 BpmnModelConstants 那 -/** - * 仿钉钉快搭 JSON 常量信息 - * - * @author jason - */ -public interface SimpleModelConstants { - - // TODO @芋艿:条件表达式的字段名 - - /** - * 网关节点默认序列流属性 - */ - String DEFAULT_FLOW_ATTRIBUTE = "defaultFlow"; - - /** - * 条件节点的条件类型属性 - */ - String CONDITION_TYPE_ATTRIBUTE = "conditionType"; - - /** - * 条件节点条件表达式属性 - */ - String CONDITION_EXPRESSION_ATTRIBUTE = "conditionExpression"; - - /** - * 条件规则的条件组属性 - */ - String CONDITION_GROUPS_ATTRIBUTE = "conditionGroups"; - -} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java index f9e74e981..8481bdacc 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java @@ -35,7 +35,7 @@ import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnMode import static org.flowable.bpmn.constants.BpmnXMLConstants.*; /** - * 仿钉钉快搭模型相关的工具方法 + * 仿钉钉/飞书的模型相关的工具方法 * * @author jason */ @@ -47,24 +47,7 @@ public class SimpleModelUtils { public static final String JOIN_GATE_WAY_NODE_ID_SUFFIX = "_join"; /** - * 所有审批人同意的表达式 - */ - public static final String ALL_APPROVE_COMPLETE_EXPRESSION = "${ nrOfCompletedInstances >= nrOfInstances }"; - - /** - * 任一一名审批人同意的表达式 - */ - public static final String ANY_OF_APPROVE_COMPLETE_EXPRESSION = "${ nrOfCompletedInstances > 0 }"; - - /** - * 按通过比例完成表达式 - */ - public static final String APPROVE_BY_RATIO_COMPLETE_EXPRESSION = "${ nrOfCompletedInstances/nrOfInstances >= %s}"; - - // TODO @yunai:注释需要完善下; - - /** - * 仿钉钉流程设计模型数据结构(json) 转换成 Bpmn Model (待完善) + * 仿钉钉流程设计模型数据结构(json) 转换成 Bpmn Model * * @param processId 流程标识 * @param processName 流程名称 @@ -72,20 +55,19 @@ public class SimpleModelUtils { * @return Bpmn Model */ public static BpmnModel buildBpmnModel(String processId, String processName, BpmSimpleModelNodeVO simpleModelNode) { + // 1. 创建 BpmnModel BpmnModel bpmnModel = new BpmnModel(); - // 不加这个 解析 Message 会报 NPE 异常 . - bpmnModel.setTargetNamespace(BPMN2_NAMESPACE); // TODO @jason:待定:是不是搞个自定义的 namespace; - // TODO 芋艿:后续在 review - + bpmnModel.setTargetNamespace(BPMN2_NAMESPACE); // 设置命名空间。不加这个,解析 Message 会报 NPE 异常 + // 创建 Process 对象 Process process = new Process(); process.setId(processId); process.setName(processName); - process.setExecutable(Boolean.TRUE); // TODO @jason:这个是必须设置的么? + process.setExecutable(Boolean.TRUE); bpmnModel.addProcess(process); - // TODO 芋艿:这里可能纠结下,到底前端传递,还是后端创建出来。 - // 目前前端的第一个节点是“发起人节点”。这里构建一个 StartNode,用于创建 Bpmn 的 StartEvent 节点 - BpmSimpleModelNodeVO startNode = buildStartSimpleModelNode(); + // 2.1 创建 StartNode 节点 + // 原因是:目前前端的第一个节点是“发起人节点”,所以这里构建一个 StartNode,用于创建 Bpmn 的 StartEvent 节点 + BpmSimpleModelNodeVO startNode = buildStartNode(); startNode.setChildNode(simpleModelNode); // 从 前端模型数据结构 SimpleModel 构建 FlowNode 并添加到 Main Process traverseNodeToBuildFlowNode(startNode, process); @@ -99,12 +81,8 @@ public class SimpleModelUtils { return bpmnModel; } - private static BpmSimpleModelNodeVO buildStartSimpleModelNode() { - BpmSimpleModelNodeVO startNode = new BpmSimpleModelNodeVO(); - startNode.setId(START_EVENT_NODE_ID); - startNode.setName(START_EVENT_NODE_NAME); - startNode.setType(START_NODE.getType()); - return startNode; + private static BpmSimpleModelNodeVO buildStartNode() { + return new BpmSimpleModelNodeVO().setId(START_EVENT_NODE_ID).setName(START_EVENT_NODE_NAME).setType(START_NODE.getType()); } // TODO @芋艿:在优化下这个注释 @@ -329,7 +307,6 @@ public class SimpleModelUtils { list.addAll(parallelGateways); break; } - case INCLUSIVE_BRANCH_NODE: { // TODO jason 待实现 break; @@ -512,29 +489,29 @@ public class SimpleModelUtils { private static void processMultiInstanceLoopCharacteristics(Integer approveMethod, Integer approveRatio, UserTask userTask) { BpmUserTaskApproveMethodEnum approveMethodEnum = BpmUserTaskApproveMethodEnum.valueOf(approveMethod); - // TODO @jason:这种枚举,最终不要去掉哈 BpmUserTaskApproveMethodEnum。因为容易不经意重叠 - if (approveMethodEnum == null || approveMethodEnum == RANDOM) { + Assert.notNull(approveMethodEnum, "审批方式({})不能为空", approveMethodEnum); + // 添加审批方式的扩展属性 + addExtensionElement(userTask, BpmnModelConstants.USER_TASK_APPROVE_METHOD, approveMethod.toString()); + if (approveMethodEnum == RANDOM) { + // 随机审批,不需要设置多实例属性 return; } - // 添加审批方式的扩展属性 - addExtensionElement(userTask, BpmnModelConstants.USER_TASK_APPROVE_METHOD, - approveMethod == null ? null : approveMethod.toString()); + + // 处理多实例审批方式 MultiInstanceLoopCharacteristics multiInstanceCharacteristics = new MultiInstanceLoopCharacteristics(); - // 设置 collectionVariable。本系统用不到。仅仅为了 Flowable 校验不报错。 + // 设置 collectionVariable。本系统用不到,仅仅为了 Flowable 校验不报错 multiInstanceCharacteristics.setInputDataItem("${coll_userList}"); if (approveMethodEnum == BpmUserTaskApproveMethodEnum.ANY) { - multiInstanceCharacteristics.setCompletionCondition(ANY_OF_APPROVE_COMPLETE_EXPRESSION); + multiInstanceCharacteristics.setCompletionCondition(approveMethodEnum.getCompletionCondition()); multiInstanceCharacteristics.setSequential(false); - userTask.setLoopCharacteristics(multiInstanceCharacteristics); } else if (approveMethodEnum == SEQUENTIAL) { - multiInstanceCharacteristics.setCompletionCondition(ALL_APPROVE_COMPLETE_EXPRESSION); + multiInstanceCharacteristics.setCompletionCondition(approveMethodEnum.getCompletionCondition()); multiInstanceCharacteristics.setSequential(true); multiInstanceCharacteristics.setLoopCardinality("1"); - userTask.setLoopCharacteristics(multiInstanceCharacteristics); } else if (approveMethodEnum == RATIO) { Assert.notNull(approveRatio, "通过比例不能为空"); multiInstanceCharacteristics.setCompletionCondition( - String.format(APPROVE_BY_RATIO_COMPLETE_EXPRESSION, String.format("%.2f", approveRatio / (double) 100))); + String.format(approveMethodEnum.getCompletionCondition(), String.format("%.2f", approveRatio / 100D))); multiInstanceCharacteristics.setSequential(false); } userTask.setLoopCharacteristics(multiInstanceCharacteristics);