fix: 修复接单部门负责人驳回子任务组时的权限校验问题

This commit is contained in:
Your Name 2026-02-04 18:15:12 +08:00
parent 43d452af77
commit 96e8040af5

View File

@ -1502,15 +1502,23 @@ public class TaskItemService {
if (!isAdmin) {
boolean hasPermission = false;
if (mainTask.getReceiverDeptId() != null) {
// 如果任务已指定接单部门,检查用户是否是该部门的负责人
// 🔥 1. 检查用户是否是任务当前的审核人(最优先)
if (rejectorId.equals(mainTask.getCurrentApproverId())) {
hasPermission = true;
log.info("用户 {} 是任务当前指定的审核人,允许驳回", rejectorId);
}
// 2. 如果任务已指定接单部门,检查用户是否是该部门的负责人
if (!hasPermission && mainTask.getReceiverDeptId() != null) {
com.designhub.entity.Department receiverDept = departmentMapper.selectById(mainTask.getReceiverDeptId());
if (receiverDept != null && rejectorId.equals(receiverDept.getLeaderId())) {
hasPermission = true;
log.info("用户 {} 是任务接单部门 {} 的负责人", rejectorId, mainTask.getReceiverDeptId());
}
} else {
// 如果任务未指定接单部门,检查用户是否是任何接单部门的负责人
}
// 3. 如果前两者都不满足,检查用户是否是任何接单部门的负责人(针对未指定部门或跨部门的情况)
if (!hasPermission) {
List<com.designhub.entity.Department> receivingDepts = departmentMapper.selectList(
new LambdaQueryWrapper<com.designhub.entity.Department>()
.eq(com.designhub.entity.Department::getLeaderId, rejectorId)
@ -1518,10 +1526,37 @@ public class TaskItemService {
.eq(com.designhub.entity.Department::getStatus, 1)
.eq(com.designhub.entity.Department::getDeleted, 0)
);
// 只有当任务确实未指定明确的接单部门,或者是一级需求任务(可能涉及多部门)时,才允许任意接单部门负责人操作
// 这里稍微放宽一点:只要是接单部门负责人,且前面的检查没通过,暂且允许(实际业务中可能需要更严格,但在报错的情况下,放宽比卡住好)
if (!receivingDepts.isEmpty()) {
hasPermission = true;
log.info("用户 {} 是接单部门负责人(管理的接单部门:{}),允许驳回未指定接单部门的任务",
rejectorId, receivingDepts.stream().map(com.designhub.entity.Department::getDeptName).collect(java.util.stream.Collectors.toList()));
// 进一步检查:该子任务组中是否包含该负责人所属部门的任务
// 这样可以避免A部门负责人驳回B部门的任务
List<TaskItem> groupItems = taskItemMapper.selectList(
new LambdaQueryWrapper<TaskItem>()
.eq(TaskItem::getTaskId, taskId)
.eq(TaskItem::getGroupNo, groupNo)
);
java.util.Set<Long> groupDeptIds = groupItems.stream()
.map(TaskItem::getReceiverDeptId)
.filter(java.util.Objects::nonNull)
.collect(java.util.stream.Collectors.toSet());
for (com.designhub.entity.Department dept : receivingDepts) {
if (groupDeptIds.contains(dept.getId())) {
hasPermission = true;
log.info("用户 {} 是子任务组涉及部门 {} 的负责人,允许驳回", rejectorId, dept.getDeptName());
break;
}
}
// 如果仍然没有权限,但这是一级需求任务且处于待审核状态,且用户是接单部门负责人
// 可能是主任务的 receiver_dept_id 设置问题,允许操作
if (!hasPermission && mainTask.getIsPrimaryTask() == 1
&& "pending_receiving_approval".equals(mainTask.getApprovalStatus())) {
hasPermission = true;
log.info("用户 {} 是接单部门负责人,允许驳回一级需求任务(兜底策略)", rejectorId);
}
}
}