diff --git a/backend/src/main/java/com/designhub/service/TaskItemService.java b/backend/src/main/java/com/designhub/service/TaskItemService.java index c53b2b7..e9111dc 100644 --- a/backend/src/main/java/com/designhub/service/TaskItemService.java +++ b/backend/src/main/java/com/designhub/service/TaskItemService.java @@ -65,6 +65,10 @@ public class TaskItemService { return taskItemMapper.selectAvailableItems(pageParam, taskTypeId, keyword); } + // 🔥 获取筛选部门及其所有子部门的ID列表 + Set filterDeptAndChildIds = getDeptAndChildIds(filterDeptId); + log.info("筛选部门ID: {}, 包含子部门: {}", filterDeptId, filterDeptAndChildIds); + // 获取该部门可接单的任务类型ID列表 List allDemandTypes = demandTypeMapper.selectList(null); Map demandTypeMap = allDemandTypes.stream() @@ -79,14 +83,20 @@ public class TaskItemService { allowedDepts = parentType.getAllowedDeptIds(); } } - // 只筛选明确指定了该部门的任务类型 + // 只筛选明确指定了该部门(或其子部门)的任务类型 if (allowedDepts == null || allowedDepts.isEmpty()) { return false; } String[] deptIds = allowedDepts.split(","); - for (String deptId : deptIds) { - if (deptId.trim().equals(String.valueOf(filterDeptId))) { - return true; + for (String deptIdStr : deptIds) { + try { + Long deptId = Long.parseLong(deptIdStr.trim()); + // 🔥 检查是否匹配筛选部门或其子部门 + if (filterDeptAndChildIds.contains(deptId)) { + return true; + } + } catch (NumberFormatException e) { + // 忽略无效的部门ID } } return false; @@ -94,6 +104,8 @@ public class TaskItemService { .map(com.designhub.entity.DemandType::getId) .collect(java.util.stream.Collectors.toList()); + log.info("匹配的任务类型ID: {}", filterDeptAllowedTypeIds); + // 如果没有找到匹配的任务类型,返回空结果 if (filterDeptAllowedTypeIds.isEmpty()) { return new Page<>(page, pageSize); @@ -102,6 +114,35 @@ public class TaskItemService { // 查询并筛选 return taskItemMapper.selectAvailableItemsByTaskTypes(pageParam, taskTypeId, keyword, filterDeptAllowedTypeIds); } + + /** + * 获取指定部门及其所有子部门的ID集合 + */ + private Set getDeptAndChildIds(Long deptId) { + Set result = new HashSet<>(); + result.add(deptId); + + // 获取所有部门 + List allDepts = departmentMapper.selectList(null); + + // 递归获取子部门 + addChildDeptIds(result, deptId, allDepts); + + return result; + } + + /** + * 递归添加子部门ID + */ + private void addChildDeptIds(Set result, Long parentId, List allDepts) { + for (com.designhub.entity.Department dept : allDepts) { + if (parentId.equals(dept.getParentId())) { + result.add(dept.getId()); + // 递归获取子部门的子部门 + addChildDeptIds(result, dept.getId(), allDepts); + } + } + } /** * 获取进行中的子任务列表 diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index a4eb834..6b1f275 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -1070,6 +1070,11 @@ public class TaskService { // 🔥 如果指定了筛选部门,进一步过滤只显示该部门可接单的任务类型 List filteredTaskTypeIds = allowedTaskTypeIds; if (filterDeptId != null) { + // 🔥 获取筛选部门及其所有子部门的ID列表 + List filterDeptAndChildIds = getDeptAndChildIds(filterDeptId); + Set filterDeptAndChildSet = new HashSet<>(filterDeptAndChildIds); + log.info("筛选部门ID: {}, 包含子部门: {}", filterDeptId, filterDeptAndChildIds); + List filterDeptAllowedIds = allDemandTypes.stream() .filter(dt -> { String allowedDepts = dt.getAllowedDeptIds(); @@ -1079,14 +1084,20 @@ public class TaskService { allowedDepts = parentType.getAllowedDeptIds(); } } - // 只筛选明确指定了该部门的任务类型(不包括所有部门可接单的) + // 只筛选明确指定了该部门(或其子部门)的任务类型(不包括所有部门可接单的) if (allowedDepts == null || allowedDepts.isEmpty()) { return false; // 所有部门都可接单的不纳入筛选结果 } String[] deptIds = allowedDepts.split(","); - for (String deptId : deptIds) { - if (deptId.trim().equals(String.valueOf(filterDeptId))) { - return true; + for (String deptIdStr : deptIds) { + try { + Long deptId = Long.parseLong(deptIdStr.trim()); + // 🔥 检查是否匹配筛选部门或其子部门 + if (filterDeptAndChildSet.contains(deptId)) { + return true; + } + } catch (NumberFormatException e) { + // 忽略无效的部门ID } } return false; @@ -1094,6 +1105,8 @@ public class TaskService { .map(DemandType::getId) .collect(Collectors.toList()); + log.info("匹配的任务类型ID: {}", filterDeptAllowedIds); + // 取交集:用户可接单的 ∩ 筛选部门可接单的 if (allowedTaskTypeIds != null) { filteredTaskTypeIds = allowedTaskTypeIds.stream()