Commit 7b57c7d056135737c4090dcfe3600a3b27633e3b

Authored by YunaiV
1 parent 6700267a

【代码优化】工作流:将 SimpleModelConstants 删除

【代码优化】工作流:将 BpmUserTaskApproveMethodEnum 增加 completionCondition
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);