fix: scope pending approval groups by dept view

This commit is contained in:
Your Name 2026-03-31 10:24:05 +08:00
parent b6aa49580a
commit bf13d13ba0
3 changed files with 77 additions and 29 deletions

View File

@ -485,11 +485,13 @@ public class TaskItemController {
return Result.success(groups);
}
// 查找用户作为负责人的所有部门
// 查找用户作为负责人的所有接单部门
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::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<Map<String, Object>> groups = taskItemService.getPendingApprovalGroups(deptId);
log.info("指定部门 {} 返回 {} 个子任务组", deptId, groups.size());
return Result.success(groups);
}
// 合并所有负责部门的待审核子任务组
List<Map<String, Object>> allGroups = new java.util.ArrayList<>();

View File

@ -613,8 +613,10 @@ export interface TaskGroup {
/**
* 获取待审核的子任务组列表
*/
export const getPendingApprovalTaskGroups = () => {
return request.get<TaskGroup[]>('/tasks/items/groups/pending-approval')
export const getPendingApprovalTaskGroups = (deptId?: number) => {
return request.get<TaskGroup[]>('/tasks/items/groups/pending-approval', {
params: deptId ? { deptId } : {}
})
}
/**

View File

@ -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<number | undefined>(() => {
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<any>[] = [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(