Commit 58a2e3d5d42a8f89c9f3497b0a89ca1cc6eada8f

Authored by YunaiV
1 parent 40db4cf7

【代码重构】将审批超时的 action 统一换成 handlerType,保持一致

yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskAssignStartUserHandlerTypeEnum.java
... ... @@ -15,7 +15,7 @@ public enum BpmUserTaskAssignStartUserHandlerTypeEnum implements IntArrayValuabl
15 15  
16 16 START_USER_AUDIT(1), // 由发起人对自己审批
17 17 SKIP(2), // 自动跳过【参考飞书】:1)如果当前节点还有其他审批人,则交由其他审批人进行审批;2)如果当前节点没有其他审批人,则该节点自动通过
18   - ASSIGN_DEPT_LEADER(3); // 转交给部门负责人审批【参考飞书】:若部门负责人为空,则自动通过
  18 + TRANSFER_DEPT_LEADER(3); // 转交给部门负责人审批【参考飞书】:若部门负责人为空,则自动通过
19 19  
20 20 private final Integer type;
21 21  
... ...
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskTimeoutHandlerType.java renamed to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmUserTaskTimeoutHandlerTypeEnum.java
1 1 package cn.iocoder.yudao.module.bpm.enums.definition;
2 2  
3   -import cn.hutool.core.util.ArrayUtil;
4 3 import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
5 4 import lombok.AllArgsConstructor;
6 5 import lombok.Getter;
... ... @@ -14,24 +13,20 @@ import java.util.Arrays;
14 13 */
15 14 @Getter
16 15 @AllArgsConstructor
17   -public enum BpmUserTaskTimeoutHandlerType implements IntArrayValuable {
  16 +public enum BpmUserTaskTimeoutHandlerTypeEnum implements IntArrayValuable {
18 17  
19 18 REMINDER(1,"自动提醒"),
20 19 APPROVE(2, "自动同意"),
21 20 REJECT(3, "自动拒绝");
22 21  
23   - // TODO @jason:type 是不是更合适哈;
24   - private final Integer action;
  22 + private final Integer type;
25 23 private final String name;
26 24  
27   - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmUserTaskTimeoutHandlerType::getAction).toArray();
28   -
29   - public static BpmUserTaskTimeoutHandlerType typeOf(Integer type) {
30   - return ArrayUtil.firstMatch(item -> item.getAction().equals(type), values());
31   - }
  25 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(BpmUserTaskTimeoutHandlerTypeEnum::getType).toArray();
32 26  
33 27 @Override
34 28 public int[] array() {
35 29 return ARRAYS;
36 30 }
  31 +
37 32 }
... ...
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmReasonEnum.java
... ... @@ -22,6 +22,12 @@ public enum BpmReasonEnum {
22 22 // ========== 流程任务的独有原因 ==========
23 23  
24 24 CANCEL_BY_SYSTEM("系统自动取消"), // 场景:非常多,比如说:1)多任务审批已经满足条件,无需审批该任务;2)流程实例被取消,无需审批该任务;等等
  25 + TIMEOUT_APPROVE("审批超时,系统自动通过"),
  26 + TIMEOUT_REJECT("审批超时,系统自动不通过"),
  27 + ASSIGN_START_USER_APPROVE("审批人与提交人为同一人时,自动通过"),
  28 + ASSIGN_START_USER_APPROVE_WHEN_SKIP("审批人与提交人为同一人时,自动通过"),
  29 + ASSIGN_START_USER_APPROVE_WHEN_DEPT_LEADER_NOT_FOUND("审批人与提交人为同一人时,找不到部门负责人,自动通过"),
  30 + ASSIGN_START_USER_TRANSFER_DEPT_LEADER("审批人与提交人为同一人时,转交给部门负责人审批"),
25 31 ;
26 32  
27 33 private final String reason;
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/simple/BpmSimpleModelNodeVO.java
... ... @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidat
6 6 import com.fasterxml.jackson.annotation.JsonIgnore;
7 7 import com.fasterxml.jackson.annotation.JsonInclude;
8 8 import io.swagger.v3.oas.annotations.media.Schema;
  9 +import jakarta.validation.Valid;
9 10 import jakarta.validation.constraints.NotEmpty;
10 11 import jakarta.validation.constraints.NotNull;
11 12 import lombok.Data;
... ... @@ -97,20 +98,22 @@ public class BpmSimpleModelNodeVO {
97 98 private String returnNodeId;
98 99 }
99 100  
100   - // TODO @芋艿:参数校验
101 101 @Data
102 102 @Schema(description = "审批节点超时处理策略")
  103 + @Valid
103 104 public static class TimeoutHandler {
104 105  
105   - @Schema(description = "是否开启超时处理", example = "false")
  106 + @Schema(description = "是否开启超时处理", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
  107 + @NotNull(message = "是否开启超时处理不能为空")
106 108 private Boolean enable;
107 109  
108   - // TODO @jason:type 是不是更合适哈;
109   - @Schema(description = "任务超时未处理的行为", example = "1")
110   - @InEnum(BpmUserTaskTimeoutHandlerType.class)
111   - private Integer action;
  110 + @Schema(description = "任务超时未处理的行为", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  111 + @NotNull(message = "任务超时未处理的行为不能为空")
  112 + @InEnum(BpmUserTaskTimeoutHandlerTypeEnum.class)
  113 + private Integer type;
112 114  
113   - @Schema(description = "超时时间", example = "PT6H")
  115 + @Schema(description = "超时时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "PT6H")
  116 + @NotEmpty(message = "超时时间不能为空")
114 117 private String timeDuration;
115 118  
116 119 @Schema(description = "最大提醒次数", example = "1")
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/enums/BpmnModelConstants.java
... ... @@ -28,12 +28,10 @@ public interface BpmnModelConstants {
28 28 */
29 29 String BOUNDARY_EVENT_TYPE = "boundaryEventType";
30 30  
31   - // TODO @jason:这个命名,应该也要改哈
32   - // TODO @jason:1)是不是上面的 timeoutAction 改成 timeoutHandler;
33 31 /**
34 32 * BPMN ExtensionElement 的扩展属性,用于标记用户任务超时执行动作
35 33 */
36   - String USER_TASK_TIMEOUT_HANDLER_ACTION = "timeoutAction";
  34 + String USER_TASK_TIMEOUT_HANDLER_TYPE = "timeoutHandlerType";
37 35  
38 36 /**
39 37 * BPMN ExtensionElement 的扩展属性,用于标记用户任务的审批人与发起人相同时,对应的处理类型
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java
... ... @@ -106,10 +106,10 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener {
106 106 }
107 107  
108 108 // 2. 处理超时
109   - String timeoutAction = BpmnModelUtils.parseBoundaryEventExtensionElement(boundaryEvent,
110   - BpmnModelConstants.USER_TASK_TIMEOUT_HANDLER_ACTION);
  109 + String timeoutHandlerType = BpmnModelUtils.parseBoundaryEventExtensionElement(boundaryEvent,
  110 + BpmnModelConstants.USER_TASK_TIMEOUT_HANDLER_TYPE);
111 111 String taskKey = boundaryEvent.getAttachedToRefId();
112   - taskService.processTaskTimeout(event.getProcessInstanceId(), taskKey, NumberUtils.parseInt(timeoutAction));
  112 + taskService.processTaskTimeout(event.getProcessInstanceId(), taskKey, NumberUtils.parseInt(timeoutHandlerType));
113 113 }
114 114  
115 115 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java
... ... @@ -27,7 +27,7 @@ import java.util.Objects;
27 27 import static cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.OperationButtonSetting;
28 28 import static cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO.TimeoutHandler;
29 29 import static cn.iocoder.yudao.module.bpm.enums.definition.BpmSimpleModelNodeType.*;
30   -import static cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskTimeoutHandlerType.REMINDER;
  30 +import static cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskTimeoutHandlerTypeEnum.REMINDER;
31 31 import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants.*;
32 32 import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.SimpleModelConstants.*;
33 33 import static org.flowable.bpmn.constants.BpmnXMLConstants.*;
... ... @@ -341,7 +341,7 @@ public class SimpleModelUtils {
341 341  
342 342 // 添加用户任务的 Timer Boundary Event, 用于任务的审批超时处理
343 343 if (node.getTimeoutHandler() != null && node.getTimeoutHandler().getEnable()) {
344   - BoundaryEvent boundaryEvent = buildUserTaskTimerBoundaryEvent(userTask, node.getTimeoutHandler());
  344 + BoundaryEvent boundaryEvent = buildUserTaskTimeoutBoundaryEvent(userTask, node.getTimeoutHandler());
345 345 flowElements.add(boundaryEvent);
346 346 }
347 347 return flowElements;
... ... @@ -354,7 +354,7 @@ public class SimpleModelUtils {
354 354 * @param timeoutHandler 超时处理器
355 355 * @return BoundaryEvent 超时事件
356 356 */
357   - private static BoundaryEvent buildUserTaskTimerBoundaryEvent(UserTask userTask, TimeoutHandler timeoutHandler) {
  357 + private static BoundaryEvent buildUserTaskTimeoutBoundaryEvent(UserTask userTask, TimeoutHandler timeoutHandler) {
358 358 // 1.1 定时器边界事件
359 359 BoundaryEvent boundaryEvent = new BoundaryEvent();
360 360 boundaryEvent.setId("Event-" + IdUtil.fastUUID());
... ... @@ -363,7 +363,7 @@ public class SimpleModelUtils {
363 363 // 1.2 定义超时时间、最大提醒次数
364 364 TimerEventDefinition eventDefinition = new TimerEventDefinition();
365 365 eventDefinition.setTimeDuration(timeoutHandler.getTimeDuration());
366   - if (Objects.equals(REMINDER.getAction(), timeoutHandler.getAction()) &&
  366 + if (Objects.equals(REMINDER.getType(), timeoutHandler.getType()) &&
367 367 timeoutHandler.getMaxRemindCount() != null && timeoutHandler.getMaxRemindCount() > 1) {
368 368 eventDefinition.setTimeCycle(String.format("R%d/%s",
369 369 timeoutHandler.getMaxRemindCount(), timeoutHandler.getTimeDuration()));
... ... @@ -373,7 +373,7 @@ public class SimpleModelUtils {
373 373 // 2.1 添加定时器边界事件类型
374 374 addExtensionElement(boundaryEvent, BOUNDARY_EVENT_TYPE, BpmBoundaryEventType.USER_TASK_TIMEOUT.getType().toString());
375 375 // 2.2 添加超时执行动作元素
376   - addExtensionElement(boundaryEvent, USER_TASK_TIMEOUT_HANDLER_ACTION, StrUtil.toStringOrNull(timeoutHandler.getAction()));
  376 + addExtensionElement(boundaryEvent, USER_TASK_TIMEOUT_HANDLER_TYPE, StrUtil.toStringOrNull(timeoutHandler.getType()));
377 377 return boundaryEvent;
378 378 }
379 379  
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
... ... @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.bpm.service.task;
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
  6 +import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskTimeoutHandlerTypeEnum;
6 7 import jakarta.validation.Valid;
7 8 import org.flowable.bpmn.model.UserTask;
8 9 import org.flowable.task.api.Task;
... ... @@ -212,8 +213,8 @@ public interface BpmTaskService {
212 213 *
213 214 * @param processInstanceId 流程示例编号
214 215 * @param taskDefineKey 任务 Key
215   - * @param taskAction 处理类型
  216 + * @param handlerType 处理类型,参见 {@link BpmUserTaskTimeoutHandlerTypeEnum}
216 217 */
217   - void processTaskTimeout(String processInstanceId, String taskDefineKey, Integer taskAction);
  218 + void processTaskTimeout(String processInstanceId, String taskDefineKey, Integer handlerType);
218 219  
219 220 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
... ... @@ -14,7 +14,7 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
14 14 import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
15 15 import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskAssignStartUserHandlerTypeEnum;
16 16 import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskRejectHandlerType;
17   -import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskTimeoutHandlerType;
  17 +import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskTimeoutHandlerTypeEnum;
18 18 import cn.iocoder.yudao.module.bpm.enums.task.BpmCommentTypeEnum;
19 19 import cn.iocoder.yudao.module.bpm.enums.task.BpmReasonEnum;
20 20 import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskSignTypeEnum;
... ... @@ -944,13 +944,13 @@ public class BpmTaskServiceImpl implements BpmTaskService {
944 944 // 情况一:自动跳过
945 945 if (ObjectUtils.equalsAny(assignStartUserHandlerType,
946 946 BpmUserTaskAssignStartUserHandlerTypeEnum.SKIP.getType())) {
947   - getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO()
948   - .setId(task.getId()).setReason("审批人与提交人为同一人时,自动通过"));
  947 + getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId())
  948 + .setReason(BpmReasonEnum.ASSIGN_START_USER_APPROVE_WHEN_SKIP.getReason()));
949 949 return;
950 950 }
951 951 // 情况二:转交给部门负责人审批
952 952 if (ObjectUtils.equalsAny(assignStartUserHandlerType,
953   - BpmUserTaskAssignStartUserHandlerTypeEnum.ASSIGN_DEPT_LEADER.getType())) {
  953 + BpmUserTaskAssignStartUserHandlerTypeEnum.TRANSFER_DEPT_LEADER.getType())) {
954 954 AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(processInstance.getStartUserId()));
955 955 Assert.notNull(startUser, "提交人({})信息为空", processInstance.getStartUserId());
956 956 DeptRespDTO dept = startUser.getDeptId() != null ? deptApi.getDept(startUser.getDeptId()) : null;
... ... @@ -958,15 +958,15 @@ public class BpmTaskServiceImpl implements BpmTaskService {
958 958 // 找不到部门负责人的情况下,自动审批通过
959 959 // noinspection DataFlowIssue
960 960 if (dept.getLeaderUserId() == null) {
961   - getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO()
962   - .setId(task.getId()).setReason("审批人与提交人为同一人时,找不到部门负责人,自动通过"));
  961 + getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId())
  962 + .setReason(BpmReasonEnum.ASSIGN_START_USER_APPROVE_WHEN_DEPT_LEADER_NOT_FOUND.getReason()));
963 963 return;
964 964 }
965 965 // 找得到部门负责人的情况下,修改负责人
966 966 if (ObjectUtil.notEqual(dept.getLeaderUserId(), startUser.getId())) {
967 967 getSelf().transferTask(Long.valueOf(task.getAssignee()), new BpmTaskTransferReqVO()
968 968 .setId(task.getId()).setAssigneeUserId(dept.getLeaderUserId())
969   - .setReason("审批人与提交人为同一人时,转交给部门负责人审批"));
  969 + .setReason(BpmReasonEnum.ASSIGN_START_USER_TRANSFER_DEPT_LEADER.getReason()));
970 970 return;
971 971 }
972 972 // 如果部门负责人是自己,还是自己审批吧~
... ... @@ -982,7 +982,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
982 982  
983 983 @Override
984 984 @Transactional(rollbackFor = Exception.class)
985   - public void processTaskTimeout(String processInstanceId, String taskDefineKey, Integer taskAction) {
  985 + public void processTaskTimeout(String processInstanceId, String taskDefineKey, Integer handlerType) {
986 986 ProcessInstance processInstance = processInstanceService.getProcessInstance(processInstanceId);
987 987 if (processInstance == null) {
988 988 log.error("[processTaskTimeout][processInstanceId({}) 没有找到流程实例]", processInstanceId);
... ... @@ -997,7 +997,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
997 997  
998 998 taskList.forEach(task -> FlowableUtils.execute(task.getTenantId(), () -> {
999 999 // 情况一:自动提醒
1000   - if (Objects.equals(taskAction, BpmUserTaskTimeoutHandlerType.REMINDER.getAction())) {
  1000 + if (Objects.equals(handlerType, BpmUserTaskTimeoutHandlerTypeEnum.REMINDER.getType())) {
1001 1001 messageService.sendMessageWhenTaskTimeout(new BpmMessageSendWhenTaskTimeoutReqDTO()
1002 1002 .setProcessInstanceId(processInstanceId).setProcessInstanceName(processInstance.getName())
1003 1003 .setTaskId(task.getId()).setTaskName(task.getName()).setAssigneeUserId(Long.parseLong(task.getAssignee())));
... ... @@ -1005,16 +1005,16 @@ public class BpmTaskServiceImpl implements BpmTaskService {
1005 1005 }
1006 1006  
1007 1007 // 情况二:自动同意
1008   - if (Objects.equals(taskAction, BpmUserTaskTimeoutHandlerType.APPROVE.getAction())) {
  1008 + if (Objects.equals(handlerType, BpmUserTaskTimeoutHandlerTypeEnum.APPROVE.getType())) {
1009 1009 approveTask(Long.parseLong(task.getAssignee()),
1010   - new BpmTaskApproveReqVO().setId(task.getId()).setReason("超时系统自动同意"));
  1010 + new BpmTaskApproveReqVO().setId(task.getId()).setReason(BpmReasonEnum.TIMEOUT_APPROVE.getReason()));
1011 1011 return;
1012 1012 }
1013 1013  
1014 1014 // 情况三:自动拒绝
1015   - if (Objects.equals(taskAction, BpmUserTaskTimeoutHandlerType.REJECT.getAction())) {
  1015 + if (Objects.equals(handlerType, BpmUserTaskTimeoutHandlerTypeEnum.REJECT.getType())) {
1016 1016 rejectTask(Long.parseLong(task.getAssignee()),
1017   - new BpmTaskRejectReqVO().setId(task.getId()).setReason("超时系统自动拒绝"));
  1017 + new BpmTaskRejectReqVO().setId(task.getId()).setReason(BpmReasonEnum.REJECT_TASK.getReason()));
1018 1018 }
1019 1019 }));
1020 1020 }
... ...