From 821c3bf22c6c4b7d20849962c6a019b860f19c95 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 30 Mar 2026 16:20:45 +0800 Subject: [PATCH] fix: allow leaders to publish for managed demand departments --- .../designhub/service/DepartmentService.java | 53 +++++++++++++++++++ .../com/designhub/service/TaskService.java | 9 ++++ frontend/src/views/CreateTask.vue | 13 +++++ 3 files changed, 75 insertions(+) diff --git a/backend/src/main/java/com/designhub/service/DepartmentService.java b/backend/src/main/java/com/designhub/service/DepartmentService.java index 5eef5e1..c35779d 100644 --- a/backend/src/main/java/com/designhub/service/DepartmentService.java +++ b/backend/src/main/java/com/designhub/service/DepartmentService.java @@ -840,4 +840,57 @@ public class DepartmentService { return count != null && count > 0; } + + /** + * 获取用户可管理的需求侧发起部门 + * - 直接负责的 demand / primary_demand 部门 + * - 如果负责的是一级需求部门,则其子需求部门也视为可发起部门 + */ + public List getUserManagedPublishingDepartments(Long userId) { + if (userId == null) { + return Collections.emptyList(); + } + + List leadingDepts = departmentMapper.selectList( + new LambdaQueryWrapper() + .eq(Department::getLeaderId, userId) + .eq(Department::getStatus, 1) + .eq(Department::getDeleted, 0) + ); + + if (CollectionUtils.isEmpty(leadingDepts)) { + return Collections.emptyList(); + } + + List result = new ArrayList<>(); + for (Department dept : leadingDepts) { + if (dept == null) { + continue; + } + + if ("demand".equals(dept.getDeptType()) || "primary_demand".equals(dept.getDeptType())) { + result.add(dept); + } + + if ("primary_demand".equals(dept.getDeptType())) { + List childDepts = departmentMapper.selectList( + new LambdaQueryWrapper() + .eq(Department::getParentId, dept.getId()) + .eq(Department::getStatus, 1) + .eq(Department::getDeleted, 0) + ); + + childDepts.stream() + .filter(child -> "demand".equals(child.getDeptType()) || "primary_demand".equals(child.getDeptType())) + .forEach(result::add); + } + } + + return result.stream() + .filter(Objects::nonNull) + .collect(Collectors.collectingAndThen( + Collectors.toMap(Department::getId, dept -> dept, (left, right) -> left, java.util.LinkedHashMap::new), + map -> new ArrayList<>(map.values()) + )); + } } diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index c9e2892..cf941d0 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -1336,6 +1336,15 @@ public class TaskService { .distinct() .collect(Collectors.toList()); + // 需求部门负责人可以按其管理的需求部门发起任务,不要求必须挂在 sys_user_department + List managedPublishingDepartments = departmentService.getUserManagedPublishingDepartments(user.getId()); + if (!managedPublishingDepartments.isEmpty()) { + java.util.LinkedHashMap publishingDeptMap = new java.util.LinkedHashMap<>(); + publishingDepartments.forEach(dept -> publishingDeptMap.put(dept.getId(), dept)); + managedPublishingDepartments.forEach(dept -> publishingDeptMap.put(dept.getId(), dept)); + publishingDepartments = new java.util.ArrayList<>(publishingDeptMap.values()); + } + if (requestedDeptId != null) { Department requestedDept = departmentService.getDepartmentById(requestedDeptId); if (requestedDept == null) { diff --git a/frontend/src/views/CreateTask.vue b/frontend/src/views/CreateTask.vue index cf05e2f..091fa9a 100644 --- a/frontend/src/views/CreateTask.vue +++ b/frontend/src/views/CreateTask.vue @@ -706,6 +706,19 @@ const availablePublishingDepartments = computed(() seen.add(dept.deptId) }) + const managedDepartments = Array.isArray(userInfo.managedDepartments) ? userInfo.managedDepartments : [] + managedDepartments.forEach((dept) => { + if (!dept?.deptId || seen.has(dept.deptId)) return + if (dept.deptType !== 'demand' && dept.deptType !== 'primary_demand') return + result.push({ + deptId: dept.deptId, + deptName: dept.deptName, + deptType: dept.deptType, + isPrimary: 0 + }) + seen.add(dept.deptId) + }) + if ( userInfo.deptId && !seen.has(userInfo.deptId) &&