Commit 21c44a9b5e734e326a0f4ba23dc2537b24f3140e

Authored by jason
1 parent f6f46ada

【缺陷修复】 当有修复连续自动通过节点,只有第一个节点自动通过

yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
... ... @@ -1047,10 +1047,14 @@ public class BpmTaskServiceImpl implements BpmTaskService {
1047 1047 public void afterCompletion(int transactionStatus) {
1048 1048 // 特殊情况:部分情况下,TransactionSynchronizationManager 注册 afterCommit 监听时,不会被调用,但是 afterCompletion 可以
1049 1049 // 例如说:第一个 task 就是配置【自动通过】或者【自动拒绝】时
1050   - if (ObjectUtil.notEqual(transactionStatus, TransactionSynchronization.STATUS_COMMITTED)) {
  1050 + if (ObjectUtil.equal(transactionStatus, TransactionSynchronization.STATUS_ROLLED_BACK)) {
  1051 + return;
  1052 + }
  1053 + // 特殊情况:第一个 task 【自动通过】时,第二个任务创建事件时 transactionStatus 会为 STATUS_UNKNOWN,不知道啥原因
  1054 + if (ObjectUtil.equal(transactionStatus, TransactionSynchronization.STATUS_UNKNOWN)
  1055 + && getTask(task.getId()) == null) {
1051 1056 return;
1052 1057 }
1053   - // TODO 芋艿:可以后续优化成 getSelf();
1054 1058 // 特殊情况一:【人工审核】审批人为空,根据配置是否要自动通过、自动拒绝
1055 1059 if (ObjectUtil.equal(approveType, BpmUserTaskApproveTypeEnum.USER.getType())) {
1056 1060 // 如果有审批人、或者拥有人,则说明不满足情况一,不自动通过、不自动拒绝
... ... @@ -1058,19 +1062,19 @@ public class BpmTaskServiceImpl implements BpmTaskService {
1058 1062 return;
1059 1063 }
1060 1064 if (ObjectUtil.equal(assignEmptyHandlerType, BpmUserTaskAssignEmptyHandlerTypeEnum.APPROVE.getType())) {
1061   - SpringUtil.getBean(BpmTaskService.class).approveTask(null, new BpmTaskApproveReqVO()
  1065 + getSelf().approveTask(null, new BpmTaskApproveReqVO()
1062 1066 .setId(task.getId()).setReason(BpmReasonEnum.ASSIGN_EMPTY_APPROVE.getReason()));
1063 1067 } else if (ObjectUtil.equal(assignEmptyHandlerType, BpmUserTaskAssignEmptyHandlerTypeEnum.REJECT.getType())) {
1064   - SpringUtil.getBean(BpmTaskService.class).rejectTask(null, new BpmTaskRejectReqVO()
  1068 + getSelf().rejectTask(null, new BpmTaskRejectReqVO()
1065 1069 .setId(task.getId()).setReason(BpmReasonEnum.ASSIGN_EMPTY_REJECT.getReason()));
1066 1070 }
1067 1071 // 特殊情况二:【自动审核】审批类型为自动通过、不通过
1068 1072 } else {
1069 1073 if (ObjectUtil.equal(approveType, BpmUserTaskApproveTypeEnum.AUTO_APPROVE.getType())) {
1070   - SpringUtil.getBean(BpmTaskService.class).approveTask(null, new BpmTaskApproveReqVO()
  1074 + getSelf().approveTask(null, new BpmTaskApproveReqVO()
1071 1075 .setId(task.getId()).setReason(BpmReasonEnum.APPROVE_TYPE_AUTO_APPROVE.getReason()));
1072 1076 } else if (ObjectUtil.equal(approveType, BpmUserTaskApproveTypeEnum.AUTO_REJECT.getType())) {
1073   - SpringUtil.getBean(BpmTaskService.class).rejectTask(null, new BpmTaskRejectReqVO()
  1077 + getSelf().rejectTask(null, new BpmTaskRejectReqVO()
1074 1078 .setId(task.getId()).setReason(BpmReasonEnum.APPROVE_TYPE_AUTO_REJECT.getReason()));
1075 1079 }
1076 1080 }
... ... @@ -1108,9 +1112,19 @@ public class BpmTaskServiceImpl implements BpmTaskService {
1108 1112 public void processTaskAssigned(Task task) {
1109 1113 // 发送通知。在事务提交时,批量执行操作,所以直接查询会无法查询到 ProcessInstance,所以这里是通过监听事务的提交来实现。
1110 1114 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
1111   -
  1115 + // 特殊情况:部分情况下,TransactionSynchronizationManager 注册 afterCommit 监听时,不会被调用,但是 afterCompletion 可以
  1116 + // 例如说:第一个 task 就是配置【自动通过】或者【自动拒绝】时
1112 1117 @Override
1113   - public void afterCommit() {
  1118 + public void afterCompletion(int transactionStatus) {
  1119 + // 回滚情况,直接返回
  1120 + if (ObjectUtil.equal(transactionStatus, TransactionSynchronization.STATUS_ROLLED_BACK)) {
  1121 + return;
  1122 + }
  1123 + // 特殊情况:第一个 task 【自动通过】时,第二个任务设置审批人时 transactionStatus 会为 STATUS_UNKNOWN,不知道啥原因
  1124 + if (ObjectUtil.equal(transactionStatus, TransactionSynchronization.STATUS_UNKNOWN)
  1125 + && getTask(task.getId()) == null) {
  1126 + return;
  1127 + }
1114 1128 if (StrUtil.isEmpty(task.getAssignee())) {
1115 1129 log.error("[processTaskAssigned][taskId({}) 没有分配到负责人]", task.getId());
1116 1130 return;
... ...