diff --git a/backend/src/main/java/com/designhub/controller/TaskItemController.java b/backend/src/main/java/com/designhub/controller/TaskItemController.java index f27d717..df11083 100644 --- a/backend/src/main/java/com/designhub/controller/TaskItemController.java +++ b/backend/src/main/java/com/designhub/controller/TaskItemController.java @@ -485,11 +485,13 @@ public class TaskItemController { return Result.success(groups); } - // 查找用户作为负责人的所有部门 + // 查找用户作为负责人的所有接单部门 List leadingDepts = departmentMapper.selectList( new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() .eq(com.designhub.entity.Department::getLeaderId, userId) + .eq(com.designhub.entity.Department::getDeptType, "receiving") .eq(com.designhub.entity.Department::getStatus, 1) + .eq(com.designhub.entity.Department::getDeleted, 0) ); log.info("用户 {} 负责的部门数量: {}", userId, leadingDepts.size()); @@ -502,6 +504,19 @@ public class TaskItemController { log.info("用户不是任何部门的负责人,返回空列表"); return Result.success(new java.util.ArrayList<>()); } + + if (deptId != null) { + boolean canAccessDept = leadingDepts.stream().anyMatch(dept -> deptId.equals(dept.getId())); + if (!canAccessDept) { + log.warn("用户 {} 试图查询无权限的接单部门待审核子任务组: deptId={}", userId, deptId); + return Result.fail("无权查看该接单部门的待审核任务"); + } + + log.info("按指定接单部门过滤待审核子任务组: deptId={}", deptId); + List> groups = taskItemService.getPendingApprovalGroups(deptId); + log.info("指定部门 {} 返回 {} 个子任务组", deptId, groups.size()); + return Result.success(groups); + } // 合并所有负责部门的待审核子任务组 List> allGroups = new java.util.ArrayList<>(); diff --git a/frontend/src/api/task.ts b/frontend/src/api/task.ts index 1409141..0629fe5 100644 --- a/frontend/src/api/task.ts +++ b/frontend/src/api/task.ts @@ -613,8 +613,10 @@ export interface TaskGroup { /** * 获取待审核的子任务组列表 */ -export const getPendingApprovalTaskGroups = () => { - return request.get('/tasks/items/groups/pending-approval') +export const getPendingApprovalTaskGroups = (deptId?: number) => { + return request.get('/tasks/items/groups/pending-approval', { + params: deptId ? { deptId } : {} + }) } /** diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue index 47ee132..dbdb1ad 100644 --- a/frontend/src/views/TaskHall.vue +++ b/frontend/src/views/TaskHall.vue @@ -2624,6 +2624,24 @@ const effectiveDeptId = computed(() => { return currentDeptView.value !== undefined ? currentDeptView.value : userDeptId.value }) +const isCurrentUserAdmin = computed(() => { + const user = currentUserInfo.value || {} + return user?.isAdmin === 1 || user?.isAdmin === true || user?.role === 'admin' +}) + +const shouldLoadPendingApprovalGroups = computed(() => { + return isCurrentUserAdmin.value || (isDepartmentLeader.value && effectiveDeptType.value === 'receiving') +}) + +const pendingApprovalGroupDeptId = computed(() => { + if (effectiveDeptType.value !== 'receiving') { + return undefined + } + + const deptId = effectiveDeptId.value + return typeof deptId === 'number' ? deptId : undefined +}) + // 计算是否有导出权限(部门负责人或管理员) const canExportTaskHall = computed(() => { const userInfo = currentUserInfo.value || {} @@ -3907,12 +3925,14 @@ const handleTabChange = (key: string) => { const loadPendingApprovalTasks = async () => { try { loading.value = true - - // 并行加载主任务和子任务组 - const [tasksResponse, groupsResponse] = await Promise.all([ - taskApi.getPendingApprovalTasks(), - taskApi.getPendingApprovalTaskGroups() - ]) + + const shouldLoadGroups = shouldLoadPendingApprovalGroups.value + const promises: Promise[] = [taskApi.getPendingApprovalTasks()] + if (shouldLoadGroups) { + promises.push(taskApi.getPendingApprovalTaskGroups(pendingApprovalGroupDeptId.value)) + } + + const [tasksResponse, groupsResponse] = await Promise.all(promises) const approvalItems: ApprovalItem[] = [] @@ -3939,7 +3959,7 @@ const loadPendingApprovalTasks = async () => { } // 转换子任务组为ApprovalItem - if (groupsResponse && groupsResponse.data) { + if (shouldLoadGroups && groupsResponse && groupsResponse.data) { const groups = groupsResponse.data as taskApi.TaskGroup[] groups.forEach(group => { approvalItems.push({ @@ -5278,8 +5298,9 @@ const loadReviewTasks = async (newFilters?: any) => { ] // 如果是部门负责人,还要加载待审核的子任务组 - if (isDepartmentLeader.value) { - promises.push(taskApi.getPendingApprovalTaskGroups()) + const shouldLoadGroups = shouldLoadPendingApprovalGroups.value + if (shouldLoadGroups) { + promises.push(taskApi.getPendingApprovalTaskGroups(pendingApprovalGroupDeptId.value)) } const [tasksResponse, groupsResponse] = await Promise.all(promises) @@ -5296,7 +5317,7 @@ const loadReviewTasks = async (newFilters?: any) => { } // 处理子任务组(如果有)- 使用与主任务相同的数据结构 - if (groupsResponse && groupsResponse.code === 200 && groupsResponse.data) { + if (shouldLoadGroups && groupsResponse && groupsResponse.code === 200 && groupsResponse.data) { for (const group of groupsResponse.data) { allItems.push({ id: `group-${group.taskId}-${group.groupNo}`, @@ -6655,22 +6676,32 @@ const loadAllTabCounts = async () => { // 3. 待审核任务数量(主任务 + 子任务组) if (isDepartmentLeader.value) { - // 部门负责人:同时计算主任务和子任务组 - promises.push( - Promise.all([ - taskApi.getAllPendingApprovalTasks({ page: 1, pageSize: 1 }), - taskApi.getPendingApprovalTaskGroups() - ]).then(([tasksRes, groupsRes]) => { - let count = 0 - if (tasksRes.data && tasksRes.data.total !== undefined) { - count += tasksRes.data.total - } - if (groupsRes.code === 200 && groupsRes.data) { - count += groupsRes.data.length - } - reviewTotal.value = count - }).catch(() => {}) - ) + const shouldLoadGroups = shouldLoadPendingApprovalGroups.value + + if (!shouldLoadGroups) { + promises.push( + taskApi.getAllPendingApprovalTasks({ page: 1, pageSize: 1 }).then((tasksRes) => { + reviewTotal.value = tasksRes.data?.total || 0 + }).catch(() => {}) + ) + } else { + // 部门负责人:在接单部门视角下同时计算主任务和子任务组 + promises.push( + Promise.all([ + taskApi.getAllPendingApprovalTasks({ page: 1, pageSize: 1 }), + taskApi.getPendingApprovalTaskGroups(pendingApprovalGroupDeptId.value) + ]).then(([tasksRes, groupsRes]) => { + let count = 0 + if (tasksRes.data && tasksRes.data.total !== undefined) { + count += tasksRes.data.total + } + if (groupsRes.code === 200 && groupsRes.data) { + count += groupsRes.data.length + } + reviewTotal.value = count + }).catch(() => {}) + ) + } } else { // 普通用户:只计算主任务 promises.push(