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 28  
29 29 // 50 ~ 条件分支
30 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 33 INCLUSIVE_BRANCH_NODE(53, "inclusiveGateway", "包容分支节点"),
34   - // TODO @jason:建议整合 join,最终只有 条件分支、并行分支、包容分支,三种~
35   - // TODO @芋艿。 感觉还是分开好理解一点,也好处理一点。前端结构中把聚合节点显示并传过来。
36 34 ;
37 35  
38 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 16 @AllArgsConstructor
17 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 27 private final Integer method;
28   -
29 28 /**
30 29 * 名字
31 30 */
32 31 private final String name;
  32 + /**
  33 + * 完成表达式
  34 + */
  35 + private final String completionCondition;
33 36  
34 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 35 import static org.flowable.bpmn.constants.BpmnXMLConstants.*;
36 36  
37 37 /**
38   - * 仿钉钉快搭模型相关的工具方法
  38 + * 仿钉钉/飞书的模型相关的工具方法
39 39 *
40 40 * @author jason
41 41 */
... ... @@ -47,24 +47,7 @@ public class SimpleModelUtils {
47 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 52 * @param processId 流程标识
70 53 * @param processName 流程名称
... ... @@ -72,20 +55,19 @@ public class SimpleModelUtils {
72 55 * @return Bpmn Model
73 56 */
74 57 public static BpmnModel buildBpmnModel(String processId, String processName, BpmSimpleModelNodeVO simpleModelNode) {
  58 + // 1. 创建 BpmnModel
75 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 62 Process process = new Process();
81 63 process.setId(processId);
82 64 process.setName(processName);
83   - process.setExecutable(Boolean.TRUE); // TODO @jason:这个是必须设置的么?
  65 + process.setExecutable(Boolean.TRUE);
84 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 71 startNode.setChildNode(simpleModelNode);
90 72 // 从 前端模型数据结构 SimpleModel 构建 FlowNode 并添加到 Main Process
91 73 traverseNodeToBuildFlowNode(startNode, process);
... ... @@ -99,12 +81,8 @@ public class SimpleModelUtils {
99 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 88 // TODO @芋艿:在优化下这个注释
... ... @@ -329,7 +307,6 @@ public class SimpleModelUtils {
329 307 list.addAll(parallelGateways);
330 308 break;
331 309 }
332   -
333 310 case INCLUSIVE_BRANCH_NODE: {
334 311 // TODO jason 待实现
335 312 break;
... ... @@ -512,29 +489,29 @@ public class SimpleModelUtils {
512 489  
513 490 private static void processMultiInstanceLoopCharacteristics(Integer approveMethod, Integer approveRatio, UserTask userTask) {
514 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 497 return;
518 498 }
519   - // 添加审批方式的扩展属性
520   - addExtensionElement(userTask, BpmnModelConstants.USER_TASK_APPROVE_METHOD,
521   - approveMethod == null ? null : approveMethod.toString());
  499 +
  500 + // 处理多实例审批方式
522 501 MultiInstanceLoopCharacteristics multiInstanceCharacteristics = new MultiInstanceLoopCharacteristics();
523   - // 设置 collectionVariable。本系统用不到。仅仅为了 Flowable 校验不报错。
  502 + // 设置 collectionVariable。本系统用不到,仅仅为了 Flowable 校验不报错
524 503 multiInstanceCharacteristics.setInputDataItem("${coll_userList}");
525 504 if (approveMethodEnum == BpmUserTaskApproveMethodEnum.ANY) {
526   - multiInstanceCharacteristics.setCompletionCondition(ANY_OF_APPROVE_COMPLETE_EXPRESSION);
  505 + multiInstanceCharacteristics.setCompletionCondition(approveMethodEnum.getCompletionCondition());
527 506 multiInstanceCharacteristics.setSequential(false);
528   - userTask.setLoopCharacteristics(multiInstanceCharacteristics);
529 507 } else if (approveMethodEnum == SEQUENTIAL) {
530   - multiInstanceCharacteristics.setCompletionCondition(ALL_APPROVE_COMPLETE_EXPRESSION);
  508 + multiInstanceCharacteristics.setCompletionCondition(approveMethodEnum.getCompletionCondition());
531 509 multiInstanceCharacteristics.setSequential(true);
532 510 multiInstanceCharacteristics.setLoopCardinality("1");
533   - userTask.setLoopCharacteristics(multiInstanceCharacteristics);
534 511 } else if (approveMethodEnum == RATIO) {
535 512 Assert.notNull(approveRatio, "通过比例不能为空");
536 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 515 multiInstanceCharacteristics.setSequential(false);
539 516 }
540 517 userTask.setLoopCharacteristics(multiInstanceCharacteristics);
... ...