Commit 7b57c7d056135737c4090dcfe3600a3b27633e3b
1 parent
6700267a
【代码优化】工作流:将 SimpleModelConstants 删除
【代码优化】工作流:将 BpmUserTaskApproveMethodEnum 增加 completionCondition
Showing
4 changed files
with
32 additions
and
87 deletions
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 { | @@ -28,11 +28,9 @@ public enum BpmSimpleModelNodeType implements IntArrayValuable { | ||
| 28 | 28 | ||
| 29 | // 50 ~ 条件分支 | 29 | // 50 ~ 条件分支 |
| 30 | CONDITION_NODE(50, "sequenceFlow", "条件节点"), // 用于构建流转条件的表达式 | 30 | CONDITION_NODE(50, "sequenceFlow", "条件节点"), // 用于构建流转条件的表达式 |
| 31 | - CONDITION_BRANCH_NODE(51, " “parallelGateway”", "条件分支节点"), // TODO @jason:是不是改成叫 条件分支? | ||
| 32 | - PARALLEL_BRANCH_NODE(52, "exclusiveGateway", "并行分支节点"), // TODO @jason:是不是一个 并行分支 ?就可以啦? 后面是否去掉并行网关。只用包容网关 | 31 | + CONDITION_BRANCH_NODE(51, "parallelGateway", "条件分支节点"), |
| 32 | + PARALLEL_BRANCH_NODE(52, "exclusiveGateway", "并行分支节点"), | ||
| 33 | INCLUSIVE_BRANCH_NODE(53, "inclusiveGateway", "包容分支节点"), | 33 | INCLUSIVE_BRANCH_NODE(53, "inclusiveGateway", "包容分支节点"), |
| 34 | - // TODO @jason:建议整合 join,最终只有 条件分支、并行分支、包容分支,三种~ | ||
| 35 | - // TODO @芋艿。 感觉还是分开好理解一点,也好处理一点。前端结构中把聚合节点显示并传过来。 | ||
| 36 | ; | 34 | ; |
| 37 | 35 | ||
| 38 | public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmSimpleModelNodeType::getType).toArray(); | 36 | public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmSimpleModelNodeType::getType).toArray(); |
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; | @@ -16,20 +16,23 @@ import java.util.Arrays; | ||
| 16 | @AllArgsConstructor | 16 | @AllArgsConstructor |
| 17 | public enum BpmUserTaskApproveMethodEnum implements IntArrayValuable { | 17 | public enum BpmUserTaskApproveMethodEnum implements IntArrayValuable { |
| 18 | 18 | ||
| 19 | - RANDOM(1, "随机挑选一人审批"), | ||
| 20 | - RATIO(2, "多人会签(按通过比例)"), // 会签(按通过比例) | ||
| 21 | - ANY(3, "多人或签(一人通过或拒绝)"), // 或签(通过只需一人,拒绝只需一人) | ||
| 22 | - SEQUENTIAL(4, "依次审批"); // 依次审批 | 19 | + RANDOM(1, "随机挑选一人审批", null), |
| 20 | + RATIO(2, "多人会签(按通过比例)", "${ nrOfCompletedInstances >= nrOfInstances }"), // 会签(按通过比例) | ||
| 21 | + ANY(3, "多人或签(一人通过或拒绝)", "${ nrOfCompletedInstances > 0 }"), // 或签(通过只需一人,拒绝只需一人) | ||
| 22 | + SEQUENTIAL(4, "依次审批", "${ nrOfCompletedInstances/nrOfInstances >= %s}"); // 依次审批 | ||
| 23 | 23 | ||
| 24 | /** | 24 | /** |
| 25 | * 审批方式 | 25 | * 审批方式 |
| 26 | */ | 26 | */ |
| 27 | private final Integer method; | 27 | private final Integer method; |
| 28 | - | ||
| 29 | /** | 28 | /** |
| 30 | * 名字 | 29 | * 名字 |
| 31 | */ | 30 | */ |
| 32 | private final String name; | 31 | private final String name; |
| 32 | + /** | ||
| 33 | + * 完成表达式 | ||
| 34 | + */ | ||
| 35 | + private final String completionCondition; | ||
| 33 | 36 | ||
| 34 | public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmUserTaskApproveMethodEnum::getMethod).toArray(); | 37 | public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmUserTaskApproveMethodEnum::getMethod).toArray(); |
| 35 | 38 |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/SimpleModelConstants.java deleted
| 1 | -package cn.iocoder.yudao.module.bpm.framework.flowable.core.enums; | ||
| 2 | - | ||
| 3 | -// TODO @jason:要不合并到 BpmnModelConstants 那 | ||
| 4 | -/** | ||
| 5 | - * 仿钉钉快搭 JSON 常量信息 | ||
| 6 | - * | ||
| 7 | - * @author jason | ||
| 8 | - */ | ||
| 9 | -public interface SimpleModelConstants { | ||
| 10 | - | ||
| 11 | - // TODO @芋艿:条件表达式的字段名 | ||
| 12 | - | ||
| 13 | - /** | ||
| 14 | - * 网关节点默认序列流属性 | ||
| 15 | - */ | ||
| 16 | - String DEFAULT_FLOW_ATTRIBUTE = "defaultFlow"; | ||
| 17 | - | ||
| 18 | - /** | ||
| 19 | - * 条件节点的条件类型属性 | ||
| 20 | - */ | ||
| 21 | - String CONDITION_TYPE_ATTRIBUTE = "conditionType"; | ||
| 22 | - | ||
| 23 | - /** | ||
| 24 | - * 条件节点条件表达式属性 | ||
| 25 | - */ | ||
| 26 | - String CONDITION_EXPRESSION_ATTRIBUTE = "conditionExpression"; | ||
| 27 | - | ||
| 28 | - /** | ||
| 29 | - * 条件规则的条件组属性 | ||
| 30 | - */ | ||
| 31 | - String CONDITION_GROUPS_ATTRIBUTE = "conditionGroups"; | ||
| 32 | - | ||
| 33 | -} |
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 | @@ -35,7 +35,7 @@ import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnMode | ||
| 35 | import static org.flowable.bpmn.constants.BpmnXMLConstants.*; | 35 | import static org.flowable.bpmn.constants.BpmnXMLConstants.*; |
| 36 | 36 | ||
| 37 | /** | 37 | /** |
| 38 | - * 仿钉钉快搭模型相关的工具方法 | 38 | + * 仿钉钉/飞书的模型相关的工具方法 |
| 39 | * | 39 | * |
| 40 | * @author jason | 40 | * @author jason |
| 41 | */ | 41 | */ |
| @@ -47,24 +47,7 @@ public class SimpleModelUtils { | @@ -47,24 +47,7 @@ public class SimpleModelUtils { | ||
| 47 | public static final String JOIN_GATE_WAY_NODE_ID_SUFFIX = "_join"; | 47 | public static final String JOIN_GATE_WAY_NODE_ID_SUFFIX = "_join"; |
| 48 | 48 | ||
| 49 | /** | 49 | /** |
| 50 | - * 所有审批人同意的表达式 | ||
| 51 | - */ | ||
| 52 | - public static final String ALL_APPROVE_COMPLETE_EXPRESSION = "${ nrOfCompletedInstances >= nrOfInstances }"; | ||
| 53 | - | ||
| 54 | - /** | ||
| 55 | - * 任一一名审批人同意的表达式 | ||
| 56 | - */ | ||
| 57 | - public static final String ANY_OF_APPROVE_COMPLETE_EXPRESSION = "${ nrOfCompletedInstances > 0 }"; | ||
| 58 | - | ||
| 59 | - /** | ||
| 60 | - * 按通过比例完成表达式 | ||
| 61 | - */ | ||
| 62 | - public static final String APPROVE_BY_RATIO_COMPLETE_EXPRESSION = "${ nrOfCompletedInstances/nrOfInstances >= %s}"; | ||
| 63 | - | ||
| 64 | - // TODO @yunai:注释需要完善下; | ||
| 65 | - | ||
| 66 | - /** | ||
| 67 | - * 仿钉钉流程设计模型数据结构(json) 转换成 Bpmn Model (待完善) | 50 | + * 仿钉钉流程设计模型数据结构(json) 转换成 Bpmn Model |
| 68 | * | 51 | * |
| 69 | * @param processId 流程标识 | 52 | * @param processId 流程标识 |
| 70 | * @param processName 流程名称 | 53 | * @param processName 流程名称 |
| @@ -72,20 +55,19 @@ public class SimpleModelUtils { | @@ -72,20 +55,19 @@ public class SimpleModelUtils { | ||
| 72 | * @return Bpmn Model | 55 | * @return Bpmn Model |
| 73 | */ | 56 | */ |
| 74 | public static BpmnModel buildBpmnModel(String processId, String processName, BpmSimpleModelNodeVO simpleModelNode) { | 57 | public static BpmnModel buildBpmnModel(String processId, String processName, BpmSimpleModelNodeVO simpleModelNode) { |
| 58 | + // 1. 创建 BpmnModel | ||
| 75 | BpmnModel bpmnModel = new BpmnModel(); | 59 | BpmnModel bpmnModel = new BpmnModel(); |
| 76 | - // 不加这个 解析 Message 会报 NPE 异常 . | ||
| 77 | - bpmnModel.setTargetNamespace(BPMN2_NAMESPACE); // TODO @jason:待定:是不是搞个自定义的 namespace; | ||
| 78 | - // TODO 芋艿:后续在 review | ||
| 79 | - | 60 | + bpmnModel.setTargetNamespace(BPMN2_NAMESPACE); // 设置命名空间。不加这个,解析 Message 会报 NPE 异常 |
| 61 | + // 创建 Process 对象 | ||
| 80 | Process process = new Process(); | 62 | Process process = new Process(); |
| 81 | process.setId(processId); | 63 | process.setId(processId); |
| 82 | process.setName(processName); | 64 | process.setName(processName); |
| 83 | - process.setExecutable(Boolean.TRUE); // TODO @jason:这个是必须设置的么? | 65 | + process.setExecutable(Boolean.TRUE); |
| 84 | bpmnModel.addProcess(process); | 66 | bpmnModel.addProcess(process); |
| 85 | 67 | ||
| 86 | - // TODO 芋艿:这里可能纠结下,到底前端传递,还是后端创建出来。 | ||
| 87 | - // 目前前端的第一个节点是“发起人节点”。这里构建一个 StartNode,用于创建 Bpmn 的 StartEvent 节点 | ||
| 88 | - BpmSimpleModelNodeVO startNode = buildStartSimpleModelNode(); | 68 | + // 2.1 创建 StartNode 节点 |
| 69 | + // 原因是:目前前端的第一个节点是“发起人节点”,所以这里构建一个 StartNode,用于创建 Bpmn 的 StartEvent 节点 | ||
| 70 | + BpmSimpleModelNodeVO startNode = buildStartNode(); | ||
| 89 | startNode.setChildNode(simpleModelNode); | 71 | startNode.setChildNode(simpleModelNode); |
| 90 | // 从 前端模型数据结构 SimpleModel 构建 FlowNode 并添加到 Main Process | 72 | // 从 前端模型数据结构 SimpleModel 构建 FlowNode 并添加到 Main Process |
| 91 | traverseNodeToBuildFlowNode(startNode, process); | 73 | traverseNodeToBuildFlowNode(startNode, process); |
| @@ -99,12 +81,8 @@ public class SimpleModelUtils { | @@ -99,12 +81,8 @@ public class SimpleModelUtils { | ||
| 99 | return bpmnModel; | 81 | return bpmnModel; |
| 100 | } | 82 | } |
| 101 | 83 | ||
| 102 | - private static BpmSimpleModelNodeVO buildStartSimpleModelNode() { | ||
| 103 | - BpmSimpleModelNodeVO startNode = new BpmSimpleModelNodeVO(); | ||
| 104 | - startNode.setId(START_EVENT_NODE_ID); | ||
| 105 | - startNode.setName(START_EVENT_NODE_NAME); | ||
| 106 | - startNode.setType(START_NODE.getType()); | ||
| 107 | - return startNode; | 84 | + private static BpmSimpleModelNodeVO buildStartNode() { |
| 85 | + return new BpmSimpleModelNodeVO().setId(START_EVENT_NODE_ID).setName(START_EVENT_NODE_NAME).setType(START_NODE.getType()); | ||
| 108 | } | 86 | } |
| 109 | 87 | ||
| 110 | // TODO @芋艿:在优化下这个注释 | 88 | // TODO @芋艿:在优化下这个注释 |
| @@ -329,7 +307,6 @@ public class SimpleModelUtils { | @@ -329,7 +307,6 @@ public class SimpleModelUtils { | ||
| 329 | list.addAll(parallelGateways); | 307 | list.addAll(parallelGateways); |
| 330 | break; | 308 | break; |
| 331 | } | 309 | } |
| 332 | - | ||
| 333 | case INCLUSIVE_BRANCH_NODE: { | 310 | case INCLUSIVE_BRANCH_NODE: { |
| 334 | // TODO jason 待实现 | 311 | // TODO jason 待实现 |
| 335 | break; | 312 | break; |
| @@ -512,29 +489,29 @@ public class SimpleModelUtils { | @@ -512,29 +489,29 @@ public class SimpleModelUtils { | ||
| 512 | 489 | ||
| 513 | private static void processMultiInstanceLoopCharacteristics(Integer approveMethod, Integer approveRatio, UserTask userTask) { | 490 | private static void processMultiInstanceLoopCharacteristics(Integer approveMethod, Integer approveRatio, UserTask userTask) { |
| 514 | BpmUserTaskApproveMethodEnum approveMethodEnum = BpmUserTaskApproveMethodEnum.valueOf(approveMethod); | 491 | BpmUserTaskApproveMethodEnum approveMethodEnum = BpmUserTaskApproveMethodEnum.valueOf(approveMethod); |
| 515 | - // TODO @jason:这种枚举,最终不要去掉哈 BpmUserTaskApproveMethodEnum。因为容易不经意重叠 | ||
| 516 | - if (approveMethodEnum == null || approveMethodEnum == RANDOM) { | 492 | + Assert.notNull(approveMethodEnum, "审批方式({})不能为空", approveMethodEnum); |
| 493 | + // 添加审批方式的扩展属性 | ||
| 494 | + addExtensionElement(userTask, BpmnModelConstants.USER_TASK_APPROVE_METHOD, approveMethod.toString()); | ||
| 495 | + if (approveMethodEnum == RANDOM) { | ||
| 496 | + // 随机审批,不需要设置多实例属性 | ||
| 517 | return; | 497 | return; |
| 518 | } | 498 | } |
| 519 | - // 添加审批方式的扩展属性 | ||
| 520 | - addExtensionElement(userTask, BpmnModelConstants.USER_TASK_APPROVE_METHOD, | ||
| 521 | - approveMethod == null ? null : approveMethod.toString()); | 499 | + |
| 500 | + // 处理多实例审批方式 | ||
| 522 | MultiInstanceLoopCharacteristics multiInstanceCharacteristics = new MultiInstanceLoopCharacteristics(); | 501 | MultiInstanceLoopCharacteristics multiInstanceCharacteristics = new MultiInstanceLoopCharacteristics(); |
| 523 | - // 设置 collectionVariable。本系统用不到。仅仅为了 Flowable 校验不报错。 | 502 | + // 设置 collectionVariable。本系统用不到,仅仅为了 Flowable 校验不报错 |
| 524 | multiInstanceCharacteristics.setInputDataItem("${coll_userList}"); | 503 | multiInstanceCharacteristics.setInputDataItem("${coll_userList}"); |
| 525 | if (approveMethodEnum == BpmUserTaskApproveMethodEnum.ANY) { | 504 | if (approveMethodEnum == BpmUserTaskApproveMethodEnum.ANY) { |
| 526 | - multiInstanceCharacteristics.setCompletionCondition(ANY_OF_APPROVE_COMPLETE_EXPRESSION); | 505 | + multiInstanceCharacteristics.setCompletionCondition(approveMethodEnum.getCompletionCondition()); |
| 527 | multiInstanceCharacteristics.setSequential(false); | 506 | multiInstanceCharacteristics.setSequential(false); |
| 528 | - userTask.setLoopCharacteristics(multiInstanceCharacteristics); | ||
| 529 | } else if (approveMethodEnum == SEQUENTIAL) { | 507 | } else if (approveMethodEnum == SEQUENTIAL) { |
| 530 | - multiInstanceCharacteristics.setCompletionCondition(ALL_APPROVE_COMPLETE_EXPRESSION); | 508 | + multiInstanceCharacteristics.setCompletionCondition(approveMethodEnum.getCompletionCondition()); |
| 531 | multiInstanceCharacteristics.setSequential(true); | 509 | multiInstanceCharacteristics.setSequential(true); |
| 532 | multiInstanceCharacteristics.setLoopCardinality("1"); | 510 | multiInstanceCharacteristics.setLoopCardinality("1"); |
| 533 | - userTask.setLoopCharacteristics(multiInstanceCharacteristics); | ||
| 534 | } else if (approveMethodEnum == RATIO) { | 511 | } else if (approveMethodEnum == RATIO) { |
| 535 | Assert.notNull(approveRatio, "通过比例不能为空"); | 512 | Assert.notNull(approveRatio, "通过比例不能为空"); |
| 536 | multiInstanceCharacteristics.setCompletionCondition( | 513 | multiInstanceCharacteristics.setCompletionCondition( |
| 537 | - String.format(APPROVE_BY_RATIO_COMPLETE_EXPRESSION, String.format("%.2f", approveRatio / (double) 100))); | 514 | + String.format(approveMethodEnum.getCompletionCondition(), String.format("%.2f", approveRatio / 100D))); |
| 538 | multiInstanceCharacteristics.setSequential(false); | 515 | multiInstanceCharacteristics.setSequential(false); |
| 539 | } | 516 | } |
| 540 | userTask.setLoopCharacteristics(multiInstanceCharacteristics); | 517 | userTask.setLoopCharacteristics(multiInstanceCharacteristics); |