feat: 支持发起人撤回审批
- 在我发起和审批详情中提供申请人撤回操作并恢复资源状态 - 补齐审批说明列表展示、动作权限校验和防重复提交 - 为审批决策增加行锁并补充撤回权限回归测试
This commit is contained in:
@@ -34,6 +34,7 @@ import java.util.Date;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@@ -184,8 +185,11 @@ public class ApprovalInstanceServiceImpl implements ApprovalInstanceService {
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void revoke(BigInteger instanceId, String comment, BigInteger operatorId) {
|
||||
ApprovalInstance instance = requireActiveInstance(instanceId);
|
||||
// 撤回属于发起人的自助操作,不能沿用审批任务处理人的授权口径。
|
||||
if (!Objects.equals(instance.getApplicantId(), operatorId)) {
|
||||
throw new BusinessException(403, 403, "仅审批申请人可以撤回该请求");
|
||||
}
|
||||
ApprovalTask currentTask = requireCurrentTask(instanceId, instance.getCurrentStepNo());
|
||||
assertTaskOperable(currentTask, operatorId);
|
||||
Date now = new Date();
|
||||
finishTask(currentTask, ApprovalTaskStatus.REVOKED.getCode(), comment, operatorId, now);
|
||||
instance.setStatus(ApprovalInstanceStatus.REVOKED.getCode());
|
||||
@@ -344,7 +348,9 @@ public class ApprovalInstanceServiceImpl implements ApprovalInstanceService {
|
||||
if (instanceId == null) {
|
||||
throw new BusinessException("审批实例ID不能为空");
|
||||
}
|
||||
ApprovalInstance instance = approvalInstanceMapper.selectOneById(instanceId);
|
||||
ApprovalInstance instance = approvalInstanceMapper.selectOneByQuery(
|
||||
QueryWrapper.create().eq(ApprovalInstance::getId, instanceId).forUpdate()
|
||||
);
|
||||
if (instance == null) {
|
||||
throw new BusinessException("审批实例不存在");
|
||||
}
|
||||
@@ -358,7 +364,8 @@ public class ApprovalInstanceServiceImpl implements ApprovalInstanceService {
|
||||
QueryWrapper queryWrapper = QueryWrapper.create()
|
||||
.eq(ApprovalTask::getInstanceId, instanceId)
|
||||
.eq(ApprovalTask::getStepNo, stepNo)
|
||||
.eq(ApprovalTask::getStatus, ApprovalTaskStatus.PENDING.getCode());
|
||||
.eq(ApprovalTask::getStatus, ApprovalTaskStatus.PENDING.getCode())
|
||||
.forUpdate();
|
||||
ApprovalTask task = approvalTaskMapper.selectOneByQuery(queryWrapper);
|
||||
if (task == null) {
|
||||
throw new BusinessException("当前审批任务不存在");
|
||||
|
||||
@@ -39,6 +39,7 @@ import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -202,13 +203,14 @@ public class ApprovalQueryServiceImpl implements ApprovalQueryService {
|
||||
|
||||
LoginAccount account = requireLoginAccount();
|
||||
Set<BigInteger> roleIds = approvalAssigneeService.getAvailableRoleIds(account.getId());
|
||||
boolean canOperate = !ApprovalInstanceStatus.from(instance.getStatus()).isFinished()
|
||||
boolean active = !ApprovalInstanceStatus.from(instance.getStatus()).isFinished();
|
||||
boolean canReview = active
|
||||
&& tasks.stream().anyMatch(item -> item.getStepNo().equals(instance.getCurrentStepNo())
|
||||
&& ApprovalTaskStatus.PENDING.getCode().equals(item.getStatus())
|
||||
&& approvalAssigneeService.canHandleTask(item, account.getId(), roleIds));
|
||||
detail.setCanApprove(canOperate);
|
||||
detail.setCanReject(canOperate);
|
||||
detail.setCanRevoke(canOperate);
|
||||
detail.setCanApprove(canReview);
|
||||
detail.setCanReject(canReview);
|
||||
detail.setCanRevoke(active && Objects.equals(account.getId(), instance.getApplicantId()));
|
||||
return detail;
|
||||
}
|
||||
|
||||
@@ -315,12 +317,13 @@ public class ApprovalQueryServiceImpl implements ApprovalQueryService {
|
||||
item.setApplicantId(record.getApplicantId());
|
||||
item.setSubmittedAt(record.getSubmittedAt());
|
||||
item.setFinishedAt(record.getFinishedAt());
|
||||
boolean canOperate = pendingMode
|
||||
boolean active = !ApprovalInstanceStatus.from(record.getStatus()).isFinished();
|
||||
boolean canReview = pendingMode
|
||||
&& pendingTaskInstanceIds.contains(record.getId())
|
||||
&& !ApprovalInstanceStatus.from(record.getStatus()).isFinished();
|
||||
item.setCanApprove(canOperate);
|
||||
item.setCanReject(canOperate);
|
||||
item.setCanRevoke(canOperate);
|
||||
&& active;
|
||||
item.setCanApprove(canReview);
|
||||
item.setCanReject(canReview);
|
||||
item.setCanRevoke(active && Objects.equals(account.getId(), record.getApplicantId()));
|
||||
result.add(item);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user