Commit 764a242d07e855ef3238323f1ddd310e264b407e

Authored by YunaiV
1 parent 8b93a71f

【代码优化】BPM:增加一个默认的发起人节点

yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmSimpleModelNodeType.java
@@ -17,15 +17,13 @@ import java.util.Objects; @@ -17,15 +17,13 @@ import java.util.Objects;
17 @AllArgsConstructor 17 @AllArgsConstructor
18 public enum BpmSimpleModelNodeType implements IntArrayValuable { 18 public enum BpmSimpleModelNodeType implements IntArrayValuable {
19 19
20 - // TODO @jaosn:-1、0、1、4、-2 是前端已经定义好的么?感觉未来可以考虑搞成和 BPMN 尽量一致的单词哈;类似 usertask 用户审批;  
21 - // @芋艿 感觉还是用 START_NODE . END_NODE 比较好.  
22 - // 0 1 开始和结束 20 + // 0 ~ 1 开始和结束
23 START_NODE(0, "开始节点"), 21 START_NODE(0, "开始节点"),
24 - END_NODE(1, "结束节点"), // TODO @jaosn:挪到 START_EVENT_NODE 后; 22 + END_NODE(1, "结束节点"),
25 23
26 // 10 ~ 49 各种节点 24 // 10 ~ 49 各种节点
27 START_USER_NODE(10, "发起人节点"), // 发起人节点。前端的开始节点,Id 固定 25 START_USER_NODE(10, "发起人节点"), // 发起人节点。前端的开始节点,Id 固定
28 - APPROVE_NODE(11, "审批人节点"), // TODO @jaosn:是不是这里从 10 开始好点;相当于说,0-9 给开始和结束;10-19 给各种节点;20-29 给各种条件; TODO 后面改改 26 + APPROVE_NODE(11, "审批人节点"),
29 COPY_NODE(12, "抄送人节点"), 27 COPY_NODE(12, "抄送人节点"),
30 28
31 // 50 ~ 条件分支 29 // 50 ~ 条件分支
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java
@@ -103,7 +103,6 @@ public interface BpmnModelConstants { @@ -103,7 +103,6 @@ public interface BpmnModelConstants {
103 * BPMN Start Event Node Id 103 * BPMN Start Event Node Id
104 */ 104 */
105 String START_EVENT_NODE_ID = "StartEvent"; 105 String START_EVENT_NODE_ID = "StartEvent";
106 -  
107 /** 106 /**
108 * BPMN Start Event Node Name 107 * BPMN Start Event Node Name
109 */ 108 */
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnVariableConstants.java
@@ -30,12 +30,14 @@ public class BpmnVariableConstants { @@ -30,12 +30,14 @@ public class BpmnVariableConstants {
30 */ 30 */
31 public static final String PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES = "PROCESS_START_USER_SELECT_ASSIGNEES"; 31 public static final String PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES = "PROCESS_START_USER_SELECT_ASSIGNEES";
32 32
  33 + // TODO @芋艿:用于处理,驳回到发起人时,如果被自动通过的逻辑
33 /** 34 /**
34 * 流程实例的变量 - 用于判断流程实例变量节点是否驳回. 格式 RETURN_FLAG_{节点 id} 35 * 流程实例的变量 - 用于判断流程实例变量节点是否驳回. 格式 RETURN_FLAG_{节点 id}
35 * 36 *
36 * @see ProcessInstance#getProcessVariables() 37 * @see ProcessInstance#getProcessVariables()
37 */ 38 */
38 - public static final String PROCESS_INSTANCE_VARIABLE_RETURN_FLAG = "RETURN_FLAG_%s"; 39 + public static final String PROCESS_INSTANCE_VARIABLE_RETURN_FLAG = "RETURN_FLAG_%s";
  40 +
39 /** 41 /**
40 * 任务的变量 - 状态 42 * 任务的变量 - 状态
41 * 43 *
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java
@@ -9,10 +9,7 @@ import cn.hutool.core.util.*; @@ -9,10 +9,7 @@ import cn.hutool.core.util.*;
9 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 9 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
10 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; 10 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO;
11 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.RejectHandler; 11 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.RejectHandler;
12 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmBoundaryEventType;  
13 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmSimpleModeConditionType;  
14 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmSimpleModelNodeType;  
15 -import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskApproveMethodEnum; 12 +import cn.iocoder.yudao.module.bpm.enums.definition.*;
16 import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants; 13 import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants;
17 import cn.iocoder.yudao.module.bpm.framework.flowable.core.listener.BpmCopyTaskDelegate; 14 import cn.iocoder.yudao.module.bpm.framework.flowable.core.listener.BpmCopyTaskDelegate;
18 import cn.iocoder.yudao.module.bpm.framework.flowable.core.simplemodel.SimpleModelConditionGroups; 15 import cn.iocoder.yudao.module.bpm.framework.flowable.core.simplemodel.SimpleModelConditionGroups;
@@ -28,7 +25,6 @@ import java.util.Objects; @@ -28,7 +25,6 @@ import java.util.Objects;
28 import static cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.OperationButtonSetting; 25 import static cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.OperationButtonSetting;
29 import static cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.TimeoutHandler; 26 import static cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.TimeoutHandler;
30 import static cn.iocoder.yudao.module.bpm.enums.definition.BpmSimpleModelNodeType.*; 27 import static cn.iocoder.yudao.module.bpm.enums.definition.BpmSimpleModelNodeType.*;
31 -import static cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskApproveTypeEnum.USER;  
32 import static cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskAssignStartUserHandlerTypeEnum.SKIP; 28 import static cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskAssignStartUserHandlerTypeEnum.SKIP;
33 import static cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskTimeoutHandlerTypeEnum.REMINDER; 29 import static cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskTimeoutHandlerTypeEnum.REMINDER;
34 import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum.START_USER; 30 import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum.START_USER;
@@ -85,7 +81,8 @@ public class SimpleModelUtils { @@ -85,7 +81,8 @@ public class SimpleModelUtils {
85 process.setExecutable(Boolean.TRUE); // TODO @jason:这个是必须设置的么? 81 process.setExecutable(Boolean.TRUE); // TODO @jason:这个是必须设置的么?
86 bpmnModel.addProcess(process); 82 bpmnModel.addProcess(process);
87 83
88 - // 目前前端的第一个节点是 发起人节点。这里构建一个StartNode. 用于创建 Bpmn 的 StartEvent 节点 84 + // TODO 芋艿:这里可能纠结下,到底前端传递,还是后端创建出来。
  85 + // 目前前端的第一个节点是“发起人节点”。这里构建一个 StartNode,用于创建 Bpmn 的 StartEvent 节点
89 BpmSimpleModelNodeVO startNode = buildStartSimpleModelNode(); 86 BpmSimpleModelNodeVO startNode = buildStartSimpleModelNode();
90 startNode.setChildNode(simpleModelNode); 87 startNode.setChildNode(simpleModelNode);
91 // 从 前端模型数据结构 SimpleModel 构建 FlowNode 并添加到 Main Process 88 // 从 前端模型数据结构 SimpleModel 构建 FlowNode 并添加到 Main Process
@@ -348,7 +345,6 @@ public class SimpleModelUtils { @@ -348,7 +345,6 @@ public class SimpleModelUtils {
348 return buildBpmnStartUserTask(node); 345 return buildBpmnStartUserTask(node);
349 } 346 }
350 347
351 -  
352 private static List<FlowElement> convertApproveNode(BpmSimpleModelNodeVO node) { 348 private static List<FlowElement> convertApproveNode(BpmSimpleModelNodeVO node) {
353 List<FlowElement> flowElements = new ArrayList<>(); 349 List<FlowElement> flowElements = new ArrayList<>();
354 UserTask userTask = buildBpmnUserTask(node); 350 UserTask userTask = buildBpmnUserTask(node);
@@ -467,7 +463,7 @@ public class SimpleModelUtils { @@ -467,7 +463,7 @@ public class SimpleModelUtils {
467 463
468 // 如果不是审批人节点,则直接返回 464 // 如果不是审批人节点,则直接返回
469 addExtensionElement(userTask, USER_TASK_APPROVE_TYPE, StrUtil.toStringOrNull(node.getApproveType())); 465 addExtensionElement(userTask, USER_TASK_APPROVE_TYPE, StrUtil.toStringOrNull(node.getApproveType()));
470 - if (ObjectUtil.notEqual(node.getApproveType(), USER.getType())) { 466 + if (ObjectUtil.notEqual(node.getApproveType(), BpmUserTaskApproveTypeEnum.USER.getType())) {
471 return userTask; 467 return userTask;
472 } 468 }
473 469
@@ -599,12 +595,10 @@ public class SimpleModelUtils { @@ -599,12 +595,10 @@ public class SimpleModelUtils {
599 595
600 // ========== 各种 build 节点的方法 ========== 596 // ========== 各种 build 节点的方法 ==========
601 597
602 - private static StartEvent convertStartNode(BpmSimpleModelNodeVO node) { 598 + private static StartEvent convertStartNode(BpmSimpleModelNodeVO node) {
603 StartEvent startEvent = new StartEvent(); 599 StartEvent startEvent = new StartEvent();
604 startEvent.setId(node.getId()); 600 startEvent.setId(node.getId());
605 startEvent.setName(node.getName()); 601 startEvent.setName(node.getName());
606 - // TODO 芋艿 + jason:要不要在开启节点后面,加一个“发起人”任务节点,然后自动审批通过  
607 - // @芋艿 这个是不是由前端来实现。 默认开始节点后面跟一个 “发起人”的审批节点(审批人是发起人自己)。  
608 return startEvent; 602 return startEvent;
609 } 603 }
610 604
@@ -613,18 +607,18 @@ public class SimpleModelUtils { @@ -613,18 +607,18 @@ public class SimpleModelUtils {
613 userTask.setId(node.getId()); 607 userTask.setId(node.getId());
614 userTask.setName(node.getName()); 608 userTask.setName(node.getName());
615 // 人工审批 609 // 人工审批
616 - addExtensionElement(userTask, USER_TASK_APPROVE_TYPE, USER.getType().toString()); 610 + addExtensionElement(userTask, USER_TASK_APPROVE_TYPE, BpmUserTaskApproveTypeEnum.USER.getType().toString());
617 // 候选人策略为发起人自己 611 // 候选人策略为发起人自己
618 addCandidateElements(START_USER.getStrategy(),null, userTask); 612 addCandidateElements(START_USER.getStrategy(),null, userTask);
619 // 添加表单字段权限属性元素 613 // 添加表单字段权限属性元素
620 addFormFieldsPermission(node.getFieldsPermission(), userTask); 614 addFormFieldsPermission(node.getFieldsPermission(), userTask);
621 - // 添加操作按钮配置属性元素. 615 + // 添加操作按钮配置属性元素
622 addButtonsSetting(node.getButtonsSetting(), userTask); 616 addButtonsSetting(node.getButtonsSetting(), userTask);
623 - // 使用自动通过策略。TODO @芋艿 复用了SKIP, 是否需要新加一个策略 617 + // 使用自动通过策略 TODO @芋艿 复用了SKIP, 是否需要新加一个策略;TODO @芋艿:【回复】是不是应该类似飞书,搞个草稿状态。待定;还有一种策略,不标记自动通过,而是首次发起后,第一个节点,自动通过;
624 addAssignStartUserHandlerType(SKIP.getType(), userTask); 618 addAssignStartUserHandlerType(SKIP.getType(), userTask);
625 -  
626 return userTask; 619 return userTask;
627 } 620 }
  621 +
628 private static EndEvent convertEndNode(BpmSimpleModelNodeVO node) { 622 private static EndEvent convertEndNode(BpmSimpleModelNodeVO node) {
629 EndEvent endEvent = new EndEvent(); 623 EndEvent endEvent = new EndEvent();
630 endEvent.setId(node.getId()); 624 endEvent.setId(node.getId());