Commit 21c44a9b5e734e326a0f4ba23dc2537b24f3140e
1 parent
f6f46ada
【缺陷修复】 当有修复连续自动通过节点,只有第一个节点自动通过
Showing
1 changed file
with
22 additions
and
8 deletions
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; | ... | ... |