fix: 修复部门负责人看任务卡片逻辑 - 通过leader_id查找负责的部门

1. 通过sys_dept.leader_id查找用户负责的所有部门
2. 支持一个人是多个部门的负责人
3. 支持同时是需求部门和接单部门的负责人
This commit is contained in:
Your Name 2026-01-07 15:19:09 +08:00
parent 0ef762baa4
commit 552c9900f0
3 changed files with 117 additions and 25 deletions

View File

@ -64,25 +64,25 @@ public class TaskItemController {
com.designhub.entity.User user = userMapper.selectById(userId);
boolean isAdmin = user != null && Integer.valueOf(1).equals(user.getIsAdmin());
// 检查用户是否是部门负责人
boolean isDeptLeader = false;
Long userDeptId = null;
if (user != null && user.getDeptId() != null) {
userDeptId = user.getDeptId();
// 查询该部门,检查当前用户是否是负责人
com.designhub.entity.Department dept = departmentMapper.selectById(userDeptId);
if (dept != null && userId.equals(dept.getLeaderId())) {
isDeptLeader = true;
}
}
// 检查用户是否是某个部门的负责人(通过leader_id查找)
List<com.designhub.entity.Department> leadingDepts = departmentMapper.selectList(
new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<com.designhub.entity.Department>()
.eq(com.designhub.entity.Department::getLeaderId, userId)
.eq(com.designhub.entity.Department::getStatus, 1)
);
boolean isDeptLeader = !leadingDepts.isEmpty();
IPage<TaskItem> items;
if (isAdmin) {
// 管理员:看到所有进行中的子任务
items = taskItemService.getInProgressItems(page, pageSize, null, null);
} else if (isDeptLeader) {
// 部门负责人:看到本部门所有成员的子任务
items = taskItemService.getInProgressItems(page, pageSize, null, userDeptId);
// 部门负责人:看到自己负责的所有部门的子任务
// 获取所有负责的部门ID
List<Long> leadingDeptIds = leadingDepts.stream()
.map(com.designhub.entity.Department::getId)
.collect(java.util.stream.Collectors.toList());
items = taskItemService.getInProgressItemsByDeptIds(page, pageSize, leadingDeptIds);
} else {
// 普通设计师:只看自己的子任务
items = taskItemService.getInProgressItems(page, pageSize, userId, null);
@ -110,24 +110,24 @@ public class TaskItemController {
com.designhub.entity.User user = userMapper.selectById(userId);
boolean isAdmin = user != null && Integer.valueOf(1).equals(user.getIsAdmin());
// 检查用户是否是部门负责人
boolean isDeptLeader = false;
Long userDeptId = null;
if (user != null && user.getDeptId() != null) {
userDeptId = user.getDeptId();
com.designhub.entity.Department dept = departmentMapper.selectById(userDeptId);
if (dept != null && userId.equals(dept.getLeaderId())) {
isDeptLeader = true;
}
}
// 检查用户是否是某个部门的负责人(通过leader_id查找)
List<com.designhub.entity.Department> leadingDepts = departmentMapper.selectList(
new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<com.designhub.entity.Department>()
.eq(com.designhub.entity.Department::getLeaderId, userId)
.eq(com.designhub.entity.Department::getStatus, 1)
);
boolean isDeptLeader = !leadingDepts.isEmpty();
IPage<TaskItem> items;
if (isAdmin) {
// 管理员:看到所有已完成的子任务
items = taskItemService.getCompletedItems(page, pageSize, null, null);
} else if (isDeptLeader) {
// 部门负责人:看到本部门所有成员的子任务
items = taskItemService.getCompletedItems(page, pageSize, null, userDeptId);
// 部门负责人:看到自己负责的所有部门的子任务
List<Long> leadingDeptIds = leadingDepts.stream()
.map(com.designhub.entity.Department::getId)
.collect(java.util.stream.Collectors.toList());
items = taskItemService.getCompletedItemsByDeptIds(page, pageSize, leadingDeptIds);
} else {
// 普通设计师:只看自己的子任务
items = taskItemService.getCompletedItems(page, pageSize, userId, null);

View File

@ -134,6 +134,80 @@ public interface TaskItemMapper extends BaseMapper<TaskItem> {
@Param("receiverId") Long receiverId,
@Param("deptId") Long deptId);
/**
* 查询进行中的子任务列表(按多个部门ID过滤,用于部门负责人)
*/
@Select("<script>" +
"SELECT ti.*, " +
" t.title AS mainTaskTitle, " +
" t.pipeline_mode AS pipelineMode, " +
" t.spu_info AS spuInfo, " +
" t.task_sub_type AS taskSubType, " +
" t.attachment_url AS attachmentUrl, " +
" t.preview_image AS previewImage, " +
" b.brand_name AS brandName, " +
" c.category_name AS categoryName, " +
" p.platform_name AS platformName, " +
" dt.type_name AS taskTypeName, " +
" u.real_name AS publisherName, " +
" r.real_name AS receiverName, " +
" (SELECT COUNT(*) FROM task_item WHERE task_id = ti.task_id) AS totalItems " +
"FROM task_item ti " +
"LEFT JOIN task t ON ti.task_id = t.id " +
"LEFT JOIN brand b ON t.brand_id = b.id " +
"LEFT JOIN category c ON t.category_id = c.id " +
"LEFT JOIN platform p ON t.platform_id = p.id " +
"LEFT JOIN task_type dt ON ti.task_type_id = dt.id " +
"LEFT JOIN sys_user u ON t.publisher_id = u.id " +
"LEFT JOIN sys_user r ON ti.receiver_id = r.id " +
"WHERE ti.status = 'in_progress' " +
" AND t.deleted = 0 " +
" AND ti.receiver_dept_id IN " +
" <foreach collection='deptIds' item='deptId' open='(' separator=',' close=')'>" +
" #{deptId}" +
" </foreach> " +
"ORDER BY ti.update_time DESC" +
"</script>")
IPage<TaskItem> selectInProgressItemsByDeptIds(Page<TaskItem> page,
@Param("deptIds") List<Long> deptIds);
/**
* 查询已完成的子任务列表(按多个部门ID过滤,用于部门负责人)
*/
@Select("<script>" +
"SELECT ti.*, " +
" t.title AS mainTaskTitle, " +
" t.pipeline_mode AS pipelineMode, " +
" t.spu_info AS spuInfo, " +
" t.task_sub_type AS taskSubType, " +
" t.attachment_url AS attachmentUrl, " +
" t.preview_image AS previewImage, " +
" b.brand_name AS brandName, " +
" c.category_name AS categoryName, " +
" p.platform_name AS platformName, " +
" dt.type_name AS taskTypeName, " +
" u.real_name AS publisherName, " +
" r.real_name AS receiverName, " +
" (SELECT COUNT(*) FROM task_item WHERE task_id = ti.task_id) AS totalItems " +
"FROM task_item ti " +
"LEFT JOIN task t ON ti.task_id = t.id " +
"LEFT JOIN brand b ON t.brand_id = b.id " +
"LEFT JOIN category c ON t.category_id = c.id " +
"LEFT JOIN platform p ON t.platform_id = p.id " +
"LEFT JOIN task_type dt ON ti.task_type_id = dt.id " +
"LEFT JOIN sys_user u ON t.publisher_id = u.id " +
"LEFT JOIN sys_user r ON ti.receiver_id = r.id " +
"WHERE ti.status = 'completed' " +
" AND t.deleted = 0 " +
" AND ti.receiver_dept_id IN " +
" <foreach collection='deptIds' item='deptId' open='(' separator=',' close=')'>" +
" #{deptId}" +
" </foreach> " +
"ORDER BY ti.complete_time DESC" +
"</script>")
IPage<TaskItem> selectCompletedItemsByDeptIds(Page<TaskItem> page,
@Param("deptIds") List<Long> deptIds);
/**
* 根据任务ID查询所有子任务
*/

View File

@ -62,6 +62,15 @@ public class TaskItemService {
public IPage<TaskItem> getInProgressItems(Integer page, Integer pageSize, Long receiverId) {
return getInProgressItems(page, pageSize, receiverId, null);
}
/**
* 获取进行中的子任务列表(部门负责人:按多个部门ID过滤)
* @param deptIds 部门ID列表
*/
public IPage<TaskItem> getInProgressItemsByDeptIds(Integer page, Integer pageSize, List<Long> deptIds) {
Page<TaskItem> pageParam = new Page<>(page, pageSize);
return taskItemMapper.selectInProgressItemsByDeptIds(pageParam, deptIds);
}
/**
* 获取已完成的子任务列表
@ -79,6 +88,15 @@ public class TaskItemService {
public IPage<TaskItem> getCompletedItems(Integer page, Integer pageSize, Long receiverId) {
return getCompletedItems(page, pageSize, receiverId, null);
}
/**
* 获取已完成的子任务列表(部门负责人:按多个部门ID过滤)
* @param deptIds 部门ID列表
*/
public IPage<TaskItem> getCompletedItemsByDeptIds(Integer page, Integer pageSize, List<Long> deptIds) {
Page<TaskItem> pageParam = new Page<>(page, pageSize);
return taskItemMapper.selectCompletedItemsByDeptIds(pageParam, deptIds);
}
/**
* 根据任务ID获取所有子任务