| | |
| | | return approveAndMoveNext(instance, currentNode, approvalInstanceDto, now); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public R autoApprove(Long instanceId) { |
| | | if (instanceId == null) { |
| | | return R.fail("审批实例 ID 不能为空"); |
| | | } |
| | | |
| | | ApprovalInstance instance = getPendingApprovalInstance(instanceId); |
| | | if (instance == null) { |
| | | return R.fail("审批实例不存在"); |
| | | } |
| | | if ("REJECTED".equals(instance.getStatus())) { |
| | | return R.fail("审批已驳回,无法自动通过"); |
| | | } |
| | | if ("APPROVED".equals(instance.getStatus())) { |
| | | return R.ok("审批已完成"); |
| | | } |
| | | |
| | | ApprovalInstanceDto autoApproveDto = new ApprovalInstanceDto(); |
| | | autoApproveDto.setId(instanceId); |
| | | autoApproveDto.setApproveComment("系统自动审批"); |
| | | |
| | | int loopCount = 0; |
| | | while (loopCount++ < 20) { |
| | | ApprovalInstance currentInstance = getPendingApprovalInstance(instanceId); |
| | | if (currentInstance == null) { |
| | | return R.fail("审批实例不存在"); |
| | | } |
| | | if ("APPROVED".equals(currentInstance.getStatus())) { |
| | | return R.ok("审批已完成"); |
| | | } |
| | | if ("REJECTED".equals(currentInstance.getStatus())) { |
| | | return R.fail("审批已驳回,无法自动通过"); |
| | | } |
| | | |
| | | ApprovalInstanceNode currentNode = approveProcessConfigNodeUtils.getCurrentNode(currentInstance.getId()); |
| | | if (currentNode == null) { |
| | | currentInstance.setStatus("APPROVED"); |
| | | currentInstance.setFinishTime(LocalDateTime.now()); |
| | | this.updateById(currentInstance); |
| | | handleBusinessAfterApprovalFinished(currentInstance); |
| | | return R.ok("审批已完成"); |
| | | } |
| | | |
| | | List<ApprovalTask> pendingTasks = approvalTaskService.list( |
| | | Wrappers.<ApprovalTask>lambdaQuery() |
| | | .eq(ApprovalTask::getInstanceId, currentInstance.getId()) |
| | | .eq(ApprovalTask::getNodeId, currentNode.getId()) |
| | | .eq(ApprovalTask::getTaskStatus, "PENDING") |
| | | .eq(ApprovalTask::getDeleted, 0) |
| | | ); |
| | | |
| | | LocalDateTime now = LocalDateTime.now(); |
| | | for (ApprovalTask currentTask : pendingTasks) { |
| | | if (!updateCurrentTask(autoApproveDto, "APPROVED", currentTask, now)) { |
| | | return R.fail("当前任务已被处理,请刷新后重试"); |
| | | } |
| | | saveApprovalRecord( |
| | | currentInstance.getId(), |
| | | currentNode.getId(), |
| | | currentTask.getId(), |
| | | 0L, |
| | | "系统自动审批", |
| | | "APPROVED", |
| | | autoApproveDto.getApproveComment() |
| | | ); |
| | | } |
| | | |
| | | if (!approveProcessConfigNodeUtils.canProceedToNextLevel(currentInstance.getId(), currentNode.getApproveType())) { |
| | | return R.ok("审批成功,等待其他审批人处理"); |
| | | } |
| | | |
| | | R moveResult = moveToNextLevel(currentInstance, currentNode, autoApproveDto, now, false); |
| | | if (!R.isSuccess(moveResult)) { |
| | | return moveResult; |
| | | } |
| | | } |
| | | |
| | | return R.fail("自动审批循环次数超限"); |
| | | } |
| | | |
| | | private String normalizeApproveAction(String approveAction) { |
| | | if (!StringUtils.hasText(approveAction)) { |
| | | return null; |
| | |
| | | ApprovalInstanceNode currentNode, |
| | | ApprovalInstanceDto approvalInstanceDto, |
| | | LocalDateTime now) { |
| | | return moveToNextLevel(instance, currentNode, approvalInstanceDto, now, true); |
| | | } |
| | | |
| | | private R moveToNextLevel(ApprovalInstance instance, |
| | | ApprovalInstanceNode currentNode, |
| | | ApprovalInstanceDto approvalInstanceDto, |
| | | LocalDateTime now, |
| | | boolean notifyNextNode) { |
| | | if (!updateCurrentNodeStatus(currentNode.getId(), "APPROVED", now)) { |
| | | return R.ok("当前节点已处理完成"); |
| | | } |
| | |
| | | instance.setCurrentLevel(nextLevel); |
| | | instance.setStatus("PENDING"); |
| | | this.updateById(instance); |
| | | if (notifyNextNode) { |
| | | List<ApprovalTask> nextTasks = approvalTaskService.list( |
| | | Wrappers.<ApprovalTask>lambdaQuery() |
| | | .eq(ApprovalTask::getInstanceId, instance.getId()) |
| | |
| | | .eq(ApprovalTask::getDeleted, 0) |
| | | ); |
| | | sendApproveNotice(instance, nextTasks); |
| | | } |
| | | return R.ok("审批成功,已流转到下一节点"); |
| | | } |
| | | |
| | |
| | | instance.setStatus("PENDING"); |
| | | this.updateById(instance); |
| | | approveProcessConfigNodeUtils.createCurrentNodeAndTasks(instance, false); |
| | | if (notifyNextNode) { |
| | | sendApproveNotice(instance, approveProcessConfigNodeUtils.getCurrentPendingTasks(approvalInstanceDto.getId())); |
| | | } |
| | | return R.ok("审批成功,已流转到下一节点"); |
| | | } |
| | | |