fix: 修复接单部门负责人驳回子任务组时的权限校验问题
This commit is contained in:
parent
43d452af77
commit
96e8040af5
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user