diff --git a/backend/src/main/java/com/designhub/controller/TaskController.java b/backend/src/main/java/com/designhub/controller/TaskController.java index 94939ce..77fa39b 100644 --- a/backend/src/main/java/com/designhub/controller/TaskController.java +++ b/backend/src/main/java/com/designhub/controller/TaskController.java @@ -7,6 +7,7 @@ import com.designhub.dto.TaskAuditRequest; import com.designhub.entity.Task; import com.designhub.service.TaskApprovalService; import com.designhub.service.TaskService; +import com.designhub.service.UserService; import com.designhub.util.JwtUtil; import com.designhub.vo.DashboardStatsVO; import io.swagger.v3.oas.annotations.Operation; @@ -33,6 +34,7 @@ public class TaskController { private final TaskService taskService; private final TaskApprovalService taskApprovalService; + private final UserService userService; private final JwtUtil jwtUtil; @Operation(summary = "创建任务", description = "发起新的设计任务") @@ -213,11 +215,13 @@ public class TaskController { @Operation(summary = "抢单", description = "设计师抢单") @PostMapping("/{id}/grab") - public Result grabTask(@PathVariable Long id, @RequestHeader("Authorization") String authHeader) { + public Result grabTask(@PathVariable Long id, + @RequestHeader("Authorization") String authHeader, + @RequestHeader(value = "X-Dept-Id", required = false) Long actingDeptId) { log.info("抢单: {}", id); String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); - taskService.grabTask(id, userId); + taskService.grabTask(id, userId, actingDeptId); return Result.success("抢单成功"); } @@ -318,18 +322,22 @@ public class TaskController { @Parameter(description = "筛选可接单部门ID") @RequestParam(required = false) Long filterDeptId, @Parameter(description = "页码") @RequestParam(defaultValue = "1") Integer page, @Parameter(description = "每页数量") @RequestParam(defaultValue = "20") Integer pageSize, - @RequestHeader("Authorization") String authHeader) { + @RequestHeader("Authorization") String authHeader, + @RequestHeader(value = "X-Dept-Id", required = false) Long actingDeptId) { // 获取当前用户的部门ID String token = jwtUtil.extractTokenFromHeader(authHeader); Long userId = jwtUtil.getUserIdFromToken(token); Long userDeptId = taskService.getUserDeptId(userId); + if (actingDeptId != null) { + userDeptId = userService.resolveAccessibleDepartmentForView(userId, actingDeptId).getId(); + } log.info("查询任务大厅: taskTypeId={}, demandTypeId={}, brandId={}, categoryId={}, platformId={}, " + "taskSubType={}, minScore={}, maxScore={}, keyword={}, publisherName={}, timeRange={}, " + - "sortBy={}, filterDeptId={}, page={}, pageSize={}, userDeptId={}", + "sortBy={}, filterDeptId={}, page={}, pageSize={}, userDeptId={}, actingDeptId={}", taskTypeId, demandTypeId, brandId, categoryId, platformId, taskSubType, - minScore, maxScore, keyword, publisherName, timeRange, sortBy, filterDeptId, page, pageSize, userDeptId); + minScore, maxScore, keyword, publisherName, timeRange, sortBy, filterDeptId, page, pageSize, userDeptId, actingDeptId); IPage taskPage = taskService.getTaskHall(page, pageSize, taskTypeId, demandTypeId, brandId, categoryId, platformId, taskSubType, minScore, maxScore, keyword, diff --git a/backend/src/main/java/com/designhub/controller/TaskItemController.java b/backend/src/main/java/com/designhub/controller/TaskItemController.java index df11083..ab6485b 100644 --- a/backend/src/main/java/com/designhub/controller/TaskItemController.java +++ b/backend/src/main/java/com/designhub/controller/TaskItemController.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.designhub.common.Result; import com.designhub.entity.TaskItem; import com.designhub.service.TaskItemService; +import com.designhub.service.UserService; import com.designhub.mapper.UserMapper; import com.designhub.mapper.DepartmentMapper; import com.designhub.util.JwtUtil; @@ -43,6 +44,7 @@ public class TaskItemController { private final TaskItemMapper taskItemMapper; private final JwtUtil jwtUtil; private final WorkHoursCalculator workHoursCalculator; + private final UserService userService; /** * 获取可接单的子任务列表 @@ -62,19 +64,20 @@ public class TaskItemController { @Parameter(description = "类目ID") @RequestParam(required = false) Long categoryId, @Parameter(description = "平台ID") @RequestParam(required = false) Long platformId, @Parameter(description = "需求类型") @RequestParam(required = false) String taskSubType, - @RequestHeader(value = "Authorization", required = false) String token) { + @RequestHeader(value = "Authorization", required = false) String token, + @RequestHeader(value = "X-Dept-Id", required = false) Long actingDeptId) { Long viewerDeptId = null; if (token != null && !token.trim().isEmpty()) { - try { - String actualToken = jwtUtil.extractTokenFromHeader(token); - Long userId = jwtUtil.getUserIdFromToken(actualToken); - com.designhub.entity.User user = userMapper.selectById(userId); - if (user != null) { + String actualToken = jwtUtil.extractTokenFromHeader(token); + Long userId = jwtUtil.getUserIdFromToken(actualToken); + com.designhub.entity.User user = userMapper.selectById(userId); + if (user != null) { + if (actingDeptId != null) { + viewerDeptId = userService.resolveAccessibleDepartmentForView(userId, actingDeptId).getId(); + } else { viewerDeptId = user.getDeptId(); } - } catch (Exception e) { - log.debug("解析任务大厅用户部门失败,继续使用默认口径: {}", e.getMessage()); } } @@ -347,11 +350,12 @@ public class TaskItemController { @PostMapping("/{itemId}/grab") public Result grabItem( @Parameter(description = "子任务ID") @PathVariable Long itemId, - @RequestHeader("Authorization") String token) { + @RequestHeader("Authorization") String token, + @RequestHeader(value = "X-Dept-Id", required = false) Long actingDeptId) { String actualToken = token.replace("Bearer ", ""); Long userId = jwtUtil.getUserIdFromToken(actualToken); - taskItemService.grabItem(itemId, userId); + taskItemService.grabItem(itemId, userId, actingDeptId); return Result.success("抢单成功"); } diff --git a/backend/src/main/java/com/designhub/mapper/TaskItemMapper.java b/backend/src/main/java/com/designhub/mapper/TaskItemMapper.java index b230c8d..c1aa105 100644 --- a/backend/src/main/java/com/designhub/mapper/TaskItemMapper.java +++ b/backend/src/main/java/com/designhub/mapper/TaskItemMapper.java @@ -203,6 +203,12 @@ public interface TaskItemMapper extends BaseMapper { " #{typeId}" + " " + " " + + " " + + " AND (ti.receiver_dept_id IS NULL OR ti.receiver_dept_id IN " + + " " + + " #{deptId}" + + " ) " + + " " + "ORDER BY ti.create_time DESC" + "") IPage selectAvailableItemsWithFilters(Page page, @@ -212,7 +218,8 @@ public interface TaskItemMapper extends BaseMapper { @Param("categoryId") Long categoryId, @Param("platformId") Long platformId, @Param("taskSubType") String taskSubType, - @Param("allowedTaskTypeIds") List allowedTaskTypeIds); + @Param("allowedTaskTypeIds") List allowedTaskTypeIds, + @Param("visibleReceiverDeptIds") List visibleReceiverDeptIds); /** * 查询进行中的子任务列表 diff --git a/backend/src/main/java/com/designhub/service/TaskItemService.java b/backend/src/main/java/com/designhub/service/TaskItemService.java index ce018e9..956b912 100644 --- a/backend/src/main/java/com/designhub/service/TaskItemService.java +++ b/backend/src/main/java/com/designhub/service/TaskItemService.java @@ -106,21 +106,17 @@ public class TaskItemService { Long brandId, Long categoryId, Long platformId, String taskSubType, Long viewerDeptId) { Page pageParam = new Page<>(page, pageSize); - IPage result; - - // 如果没有指定筛选部门,直接查询 - if (filterDeptId == null) { - result = taskItemMapper.selectAvailableItemsWithFilters(pageParam, taskTypeId, keyword, brandId, categoryId, platformId, taskSubType, null); - } else { - // 🔥 获取筛选部门及其所有子部门的ID列表 + List allDemandTypes = demandTypeMapper.selectList(null); + Map demandTypeMap = allDemandTypes.stream() + .collect(java.util.stream.Collectors.toMap(com.designhub.entity.DemandType::getId, dt -> dt)); + + List viewerAllowedTaskTypeIds = resolveViewerAllowedTaskTypeIds(viewerDeptId, allDemandTypes, demandTypeMap); + List effectiveTaskTypeIds = viewerAllowedTaskTypeIds; + + if (filterDeptId != null) { Set filterDeptAndChildIds = getDeptAndChildIds(filterDeptId); log.debug("筛选部门ID: {}, 包含子部门: {}", filterDeptId, filterDeptAndChildIds); - - // 获取该部门可接单的任务类型ID列表 - List allDemandTypes = demandTypeMapper.selectList(null); - Map demandTypeMap = allDemandTypes.stream() - .collect(java.util.stream.Collectors.toMap(com.designhub.entity.DemandType::getId, dt -> dt)); - + List filterDeptAllowedTypeIds = allDemandTypes.stream() .filter(dt -> { String allowedDepts = dt.getAllowedDeptIds(); @@ -130,7 +126,6 @@ public class TaskItemService { allowedDepts = parentType.getAllowedDeptIds(); } } - // 只筛选明确指定了该部门(或其子部门)的任务类型 if (allowedDepts == null || allowedDepts.isEmpty()) { return false; } @@ -138,17 +133,41 @@ public class TaskItemService { }) .map(com.designhub.entity.DemandType::getId) .collect(java.util.stream.Collectors.toList()); - + log.debug("匹配的任务类型ID: {}", filterDeptAllowedTypeIds); - - // 如果没有找到匹配的任务类型,返回空结果 + if (filterDeptAllowedTypeIds.isEmpty()) { return new Page<>(page, pageSize); } - - // 查询并筛选 - result = taskItemMapper.selectAvailableItemsWithFilters(pageParam, taskTypeId, keyword, brandId, categoryId, platformId, taskSubType, filterDeptAllowedTypeIds); + + if (effectiveTaskTypeIds != null) { + effectiveTaskTypeIds = effectiveTaskTypeIds.stream() + .filter(filterDeptAllowedTypeIds::contains) + .collect(java.util.stream.Collectors.toList()); + } else { + effectiveTaskTypeIds = filterDeptAllowedTypeIds; + } } + + if (effectiveTaskTypeIds != null && effectiveTaskTypeIds.isEmpty()) { + return new Page<>(page, pageSize); + } + + List visibleReceiverDeptIds = viewerDeptId != null + ? getVisibleReceiverDeptIds(viewerDeptId) + : (filterDeptId != null ? getVisibleReceiverDeptIds(filterDeptId) : null); + + IPage result = taskItemMapper.selectAvailableItemsWithFilters( + pageParam, + taskTypeId, + keyword, + brandId, + categoryId, + platformId, + taskSubType, + effectiveTaskTypeIds, + visibleReceiverDeptIds + ); // 🔥 填充排队状态信息 if (result.getRecords() != null && !result.getRecords().isEmpty()) { @@ -256,6 +275,57 @@ public class TaskItemService { } } + private List resolveViewerAllowedTaskTypeIds(Long viewerDeptId, + List allDemandTypes, + Map demandTypeMap) { + if (viewerDeptId == null) { + return null; + } + + return allDemandTypes.stream() + .filter(dt -> { + String allowedDepts = dt.getAllowedDeptIds(); + if ((allowedDepts == null || allowedDepts.isEmpty()) && dt.getParentId() != null) { + com.designhub.entity.DemandType parentType = demandTypeMap.get(dt.getParentId()); + if (parentType != null) { + allowedDepts = parentType.getAllowedDeptIds(); + } + } + + if (allowedDepts == null || allowedDepts.isEmpty()) { + return true; + } + + return expandAllowedDeptIds(allowedDepts).contains(viewerDeptId); + }) + .map(com.designhub.entity.DemandType::getId) + .collect(java.util.stream.Collectors.toList()); + } + + private List getVisibleReceiverDeptIds(Long viewerDeptId) { + if (viewerDeptId == null) { + return null; + } + + java.util.LinkedHashSet visibleDeptIds = new java.util.LinkedHashSet<>(); + Long currentDeptId = viewerDeptId; + while (currentDeptId != null) { + visibleDeptIds.add(currentDeptId); + com.designhub.entity.Department currentDept = departmentMapper.selectById(currentDeptId); + if (currentDept == null || currentDept.getParentId() == null + || currentDeptId.equals(currentDept.getParentId())) { + break; + } + currentDeptId = currentDept.getParentId(); + } + + if (isSharedGrabDept(viewerDeptId, GRAPHIC_VISUAL_DEPT_ID)) { + visibleDeptIds.add(GRAPHIC_VISUAL_DEPT_ID); + } + + return new java.util.ArrayList<>(visibleDeptIds); + } + /** * 判断用户部门是否属于目标部门(含目标部门的子部门) */ @@ -515,8 +585,8 @@ public class TaskItemService { * 抢单子任务 */ @Transactional(rollbackFor = Exception.class) - public void grabItem(Long itemId, Long userId) { - log.info("设计师 {} 抢单子任务 {}", userId, itemId); + public void grabItem(Long itemId, Long userId, Long actingDeptId) { + log.info("设计师 {} 抢单子任务 {},当前切换部门: {}", userId, itemId, actingDeptId); // 获取用户信息 var user = userService.getUserById(userId); @@ -532,15 +602,20 @@ public class TaskItemService { // 检查是否是管理员(管理员可以抢单,绕过所有限制) boolean isAdmin = user.getIsAdmin() != null && user.getIsAdmin() == 1; + Long deptId = user.getDeptId(); + if (actingDeptId != null && !isAdmin) { + com.designhub.entity.Department actingDepartment = userService.resolveReceivingDepartmentForAction(userId, actingDeptId); + deptId = actingDepartment.getId(); + } // 非管理员需要进行权限验证 if (!isAdmin) { // 验证用户部门权限 - if (user.getDeptId() == null) { + if (deptId == null) { throw new BusinessException(ResultCode.FORBIDDEN, "您未分配部门,无法接单"); } - com.designhub.entity.Department department = departmentMapper.selectById(user.getDeptId()); + com.designhub.entity.Department department = departmentMapper.selectById(deptId); if (department == null) { throw new BusinessException(ResultCode.FORBIDDEN, "未找到用户所属部门,请联系管理员"); } @@ -557,7 +632,7 @@ public class TaskItemService { // 检查3:如果子任务已指定接单部门,则仅允许该部门(含子部门)成员接单 if (item.getReceiverDeptId() != null - && !isDeptMatchedOrInherited(user.getDeptId(), item.getReceiverDeptId())) { + && !isDeptMatchedOrInherited(deptId, item.getReceiverDeptId())) { throw new BusinessException(ResultCode.FORBIDDEN, "该任务仅允许指定接单部门成员接单"); } @@ -579,7 +654,7 @@ public class TaskItemService { // 检查用户部门或其父部门是否在允许列表中(子部门继承父部门权限) String[] allowedIds = allowedDeptIds.split(","); Set allowedDeptIdSet = new HashSet<>(); - for (String allowedId : allowedIds) { + for (String allowedId : allowedIds) { try { allowedDeptIdSet.add(Long.parseLong(allowedId.trim())); } catch (NumberFormatException e) { @@ -589,12 +664,12 @@ public class TaskItemService { // 获取用户部门及其所有父部门ID boolean isAllowed = false; - Long currentDeptId = user.getDeptId(); + Long currentDeptId = deptId; while (currentDeptId != null) { if (allowedDeptIdSet.contains(currentDeptId)) { - isAllowed = true; - break; - } + isAllowed = true; + break; + } // 向上查找父部门 com.designhub.entity.Department currentDept = departmentMapper.selectById(currentDeptId); if (currentDept != null && currentDept.getParentId() != null) { @@ -604,8 +679,8 @@ public class TaskItemService { } } - if (!isAllowed) { - throw new BusinessException(ResultCode.FORBIDDEN, "您的部门无权接收此类型的任务"); + if (!isAllowed) { + throw new BusinessException(ResultCode.FORBIDDEN, "您的部门无权接收此类型的任务"); } } } @@ -629,9 +704,9 @@ public class TaskItemService { if (!"assigned".equals(releaseType)) { // 非指定任务,检查是否可抢单 - Long targetDeptId = resolveApplicableQueueDeptId(item, user.getDeptId()); + Long targetDeptId = resolveApplicableQueueDeptId(item, deptId); if (targetDeptId == null) { - targetDeptId = item.getReceiverDeptId() != null ? item.getReceiverDeptId() : user.getDeptId(); + targetDeptId = item.getReceiverDeptId() != null ? item.getReceiverDeptId() : deptId; } if (!taskUnlockService.canGrab(itemId, targetDeptId, releaseType)) { throw new BusinessException(ResultCode.TASK_STATUS_ERROR, "该任务正在排队中,暂不可接单"); @@ -675,7 +750,7 @@ public class TaskItemService { result = taskItemMapper.grabAssignedItem(itemId, userId, user.getRealName(), deadline); } else { // 普通任务:乐观锁抢单(同时设置接单部门ID和deadline) - result = taskItemMapper.grabItem(itemId, userId, user.getRealName(), user.getDeptId(), deadline); + result = taskItemMapper.grabItem(itemId, userId, user.getRealName(), deptId, deadline); } if (result == 0) { @@ -728,9 +803,9 @@ public class TaskItemService { } // 🔥 任务被抢单后,检查并补充解锁下一批任务 - Long grabberDeptId = user.getDeptId(); + Long grabberDeptId = deptId; if (!isAssignedItem && !"assigned".equals(releaseType)) { - Long queueDeptId = resolveApplicableQueueDeptId(item, user.getDeptId()); + Long queueDeptId = resolveApplicableQueueDeptId(item, deptId); if (queueDeptId != null) { grabberDeptId = queueDeptId; } diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index bd22641..99b3963 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -2437,8 +2437,8 @@ public class TaskService { * 抢单 */ @Transactional(rollbackFor = Exception.class) - public void grabTask(Long taskId, Long userId) { - log.info("用户 {} 抢单任务 {}", userId, taskId); + public void grabTask(Long taskId, Long userId, Long actingDeptId) { + log.info("用户 {} 抢单任务 {},当前切换部门: {}", userId, taskId, actingDeptId); Task task = getTaskById(taskId); @@ -2462,6 +2462,10 @@ public class TaskService { boolean isAdmin = isAdminUser(userId); Long deptId = user.getDeptId(); + if (actingDeptId != null && !isAdmin) { + Department actingDepartment = userService.resolveReceivingDepartmentForAction(userId, actingDeptId); + deptId = actingDepartment.getId(); + } // 非管理员需要进行权限验证 if (!isAdmin) { diff --git a/backend/src/main/java/com/designhub/service/UserService.java b/backend/src/main/java/com/designhub/service/UserService.java index 692aa77..e7b3bf4 100644 --- a/backend/src/main/java/com/designhub/service/UserService.java +++ b/backend/src/main/java/com/designhub/service/UserService.java @@ -1351,6 +1351,108 @@ public class UserService { } return departmentMapper.selectBatchIds(deptIds); } + + /** + * 获取用户当前可切换的部门视角 + * - 用户挂载的全部部门 + * - 用户主部门 + * - 负责人管理的部门 + * - 一级需求负责人可切换其子需求部门 + */ + public List getUserAccessibleDepartments(Long userId) { + if (userId == null) { + return Collections.emptyList(); + } + + java.util.LinkedHashMap departmentMap = new java.util.LinkedHashMap<>(); + + User user = getUserById(userId); + if (user != null && user.getDeptId() != null) { + Department primaryDept = departmentMapper.selectById(user.getDeptId()); + if (isActiveDepartment(primaryDept)) { + departmentMap.put(primaryDept.getId(), primaryDept); + } + } + + for (Department department : getUserDepartments(userId)) { + if (isActiveDepartment(department)) { + departmentMap.put(department.getId(), department); + } + } + + List leadingDepts = departmentMapper.selectList( + new LambdaQueryWrapper() + .eq(Department::getLeaderId, userId) + .eq(Department::getStatus, 1) + .eq(Department::getDeleted, 0) + ); + + for (Department department : leadingDepts) { + if (!isActiveDepartment(department)) { + continue; + } + + departmentMap.put(department.getId(), department); + + if ("primary_demand".equals(department.getDeptType())) { + List childDepartments = departmentMapper.selectList( + new LambdaQueryWrapper() + .eq(Department::getParentId, department.getId()) + .eq(Department::getStatus, 1) + .eq(Department::getDeleted, 0) + ); + + for (Department childDepartment : childDepartments) { + if (!isActiveDepartment(childDepartment)) { + continue; + } + if (!"demand".equals(childDepartment.getDeptType()) + && !"primary_demand".equals(childDepartment.getDeptType())) { + continue; + } + departmentMap.put(childDepartment.getId(), childDepartment); + } + } + } + + return new ArrayList<>(departmentMap.values()); + } + + /** + * 校验当前切换的部门是否属于用户可访问范围 + */ + public Department resolveAccessibleDepartmentForView(Long userId, Long requestedDeptId) { + if (requestedDeptId == null) { + return null; + } + + return getUserAccessibleDepartments(userId).stream() + .filter(department -> requestedDeptId.equals(department.getId())) + .findFirst() + .orElseThrow(() -> new BusinessException(ResultCode.FORBIDDEN, "当前切换的部门不属于您,无法执行该操作")); + } + + /** + * 校验当前切换的部门是否可用于接单 + */ + public Department resolveReceivingDepartmentForAction(Long userId, Long requestedDeptId) { + if (requestedDeptId == null) { + return null; + } + + Department department = resolveAccessibleDepartmentForView(userId, requestedDeptId); + if (!"receiving".equals(department.getDeptType())) { + throw new BusinessException(ResultCode.FORBIDDEN, "当前切换的部门不是接单部门,无法执行该操作"); + } + return department; + } + + private boolean isActiveDepartment(Department department) { + return department != null + && (department.getStatus() == null || department.getStatus() == 1) + && (department.getDeleted() == null || department.getDeleted() == 0) + && departmentService.isDepartmentActiveWithAncestors(department.getId()); + } /** * 添加用户到部门(如果不存在则添加) diff --git a/frontend/src/api/task.ts b/frontend/src/api/task.ts index 0629fe5..fe2a10d 100644 --- a/frontend/src/api/task.ts +++ b/frontend/src/api/task.ts @@ -194,6 +194,16 @@ export interface MyTasksParams { sortBy?: string } +const buildActingDeptHeaders = (actingDeptId?: number) => { + if (actingDeptId === undefined) { + return undefined + } + + return { + 'X-Dept-Id': String(actingDeptId) + } +} + /** * 创建任务 */ @@ -225,8 +235,10 @@ export const updateTask = (id: number, data: Partial) => { /** * 抢单 */ -export const grabTask = (id: number) => { - return request.post(`/tasks/${id}/grab`) +export const grabTask = (id: number, actingDeptId?: number) => { + return request.post(`/tasks/${id}/grab`, null, { + headers: buildActingDeptHeaders(actingDeptId) + }) } /** @@ -273,8 +285,11 @@ export const rateTask = (id: number, rating: number, comment?: string) => { /** * 获取任务大厅 */ -export const getTaskHall = (params: TaskHallParams) => { - return request.get('/tasks/hall', { params }) +export const getTaskHall = (params: TaskHallParams, actingDeptId?: number) => { + return request.get('/tasks/hall', { + params, + headers: buildActingDeptHeaders(actingDeptId) + }) } /** @@ -426,8 +441,11 @@ export const getAvailableTaskItems = (params: { taskSubType?: string filterDeptId?: number sortBy?: string -}) => { - return request.get('/tasks/items/available', { params }) +}, actingDeptId?: number) => { + return request.get('/tasks/items/available', { + params, + headers: buildActingDeptHeaders(actingDeptId) + }) } /** @@ -471,8 +489,10 @@ export const getTaskItemById = (itemId: number) => { /** * 抢单子任务 */ -export const grabTaskItem = (itemId: number) => { - return request.post(`/tasks/items/${itemId}/grab`) +export const grabTaskItem = (itemId: number, actingDeptId?: number) => { + return request.post(`/tasks/items/${itemId}/grab`, null, { + headers: buildActingDeptHeaders(actingDeptId) + }) } /** diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue index 1a1ec41..c2128af 100644 --- a/frontend/src/views/TaskHall.vue +++ b/frontend/src/views/TaskHall.vue @@ -3747,8 +3747,14 @@ const loadTasks = async (forceReload = false) => { // 同时加载普通任务和子任务(流水线任务) const [taskResponse, itemResponse] = await Promise.all([ - taskApi.getTaskHall(params), - taskApi.getAvailableTaskItems(params) + taskApi.getTaskHall( + params, + currentDeptView.value !== undefined ? currentDeptView.value : undefined + ), + taskApi.getAvailableTaskItems( + params, + currentDeptView.value !== undefined ? currentDeptView.value : undefined + ) ]) // 处理普通任务(非流水线任务) @@ -6265,7 +6271,7 @@ const canGrabTask = (task: TaskOrSubTask) => { } // 检查2:需求部门不能抢单 - if (currentDeptType === 'demand') { + if (currentDeptType === 'demand' || currentDeptType === 'primary_demand') { return { canGrab: false, reason: '需求部门成员不能接单' } } @@ -6315,10 +6321,16 @@ const handleGrab = async (task: TaskOrSubTask) => { let response if (isSubTask) { // 抢子任务 - response = await taskApi.grabTaskItem(task.itemId || task.id!) + response = await taskApi.grabTaskItem( + task.itemId || task.id!, + currentDeptView.value !== undefined ? currentDeptView.value : undefined + ) } else { // 抢普通任务 - response = await taskApi.grabTask(task.id!) + response = await taskApi.grabTask( + task.id!, + currentDeptView.value !== undefined ? currentDeptView.value : undefined + ) } if (response.code === 200) { @@ -6367,9 +6379,15 @@ const handleGrabTask = async (task: TaskOrSubTask) => { try { let response if (isSubTask) { - response = await taskApi.grabTaskItem(task.itemId || task.id!) + response = await taskApi.grabTaskItem( + task.itemId || task.id!, + currentDeptView.value !== undefined ? currentDeptView.value : undefined + ) } else { - response = await taskApi.grabTask(task.id!) + response = await taskApi.grabTask( + task.id!, + currentDeptView.value !== undefined ? currentDeptView.value : undefined + ) } if (response.code === 200) { @@ -6650,7 +6668,10 @@ const loadAllTabCounts = async () => { // 1. 可接任务数量 promises.push( - taskApi.getTaskHall({ page: 1, pageSize: 1 }).then(res => { + taskApi.getTaskHall( + { page: 1, pageSize: 1 }, + currentDeptView.value !== undefined ? currentDeptView.value : undefined + ).then(res => { if (res.data && res.data.total !== undefined) { total.value = res.data.total }