From 45fe54604ce65b3b7f8ca01b1b96c6896afe3b48 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 7 Jan 2026 20:30:45 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AE=A1=E6=A0=B8=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E4=BB=BB=E5=8A=A1=E7=B1=BB=E5=9E=8B=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E7=9A=84=E6=8E=A5=E5=8D=95=E9=83=A8=E9=97=A8=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E8=AE=BE=E8=AE=A1=E5=B8=88=E5=88=97=E8=A1=A8=EF=BC=88?= =?UTF-8?q?=E5=8C=85=E5=90=AB=E5=AD=90=E9=83=A8=E9=97=A8=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designhub/controller/UserController.java | 7 ++ .../com/designhub/service/UserService.java | 114 ++++++++++++++++++ frontend/src/api/user.ts | 7 +- frontend/src/views/TaskHall.vue | 36 +++--- 4 files changed, 142 insertions(+), 22 deletions(-) diff --git a/backend/src/main/java/com/designhub/controller/UserController.java b/backend/src/main/java/com/designhub/controller/UserController.java index 90d8769..3076b5f 100644 --- a/backend/src/main/java/com/designhub/controller/UserController.java +++ b/backend/src/main/java/com/designhub/controller/UserController.java @@ -132,8 +132,15 @@ public class UserController { @GetMapping("/designers-with-workload") public Result>> getDesignersWithWorkload( @RequestParam(required = false) Long deptId, + @RequestParam(required = false) Long taskTypeId, @RequestHeader("Authorization") String authHeader ) { + // 如果传入了 taskTypeId,则根据任务类型配置的接单部门来获取设计师 + if (taskTypeId != null) { + log.info("根据任务类型获取设计师列表: taskTypeId={}", taskTypeId); + return Result.success(userService.getDesignersByTaskType(taskTypeId)); + } + // 如果没有传入deptId,则默认为当前用户的部门 if (deptId == null) { String token = jwtUtil.extractTokenFromHeader(authHeader); diff --git a/backend/src/main/java/com/designhub/service/UserService.java b/backend/src/main/java/com/designhub/service/UserService.java index ae02fa9..f981d74 100644 --- a/backend/src/main/java/com/designhub/service/UserService.java +++ b/backend/src/main/java/com/designhub/service/UserService.java @@ -53,6 +53,9 @@ public class UserService { @Autowired(required = false) private com.designhub.mapper.TaskMapper taskMapper; + + @Autowired(required = false) + private com.designhub.mapper.DemandTypeMapper demandTypeMapper; private Department getDepartmentOrThrow(Long deptId) { if (deptId == null) { @@ -1472,6 +1475,117 @@ public class UserService { return deptIds; } + /** + * 根据任务类型获取对应接单部门的设计师列表 + * @param taskTypeId 任务类型ID + * @return 设计师列表,包含每个设计师的进行中任务数量 + */ + public List> getDesignersByTaskType(Long taskTypeId) { + log.info("根据任务类型获取设计师列表: taskTypeId={}", taskTypeId); + + if (demandTypeMapper == null) { + log.warn("demandTypeMapper 未注入,返回空列表"); + return new ArrayList<>(); + } + + // 获取任务类型配置 + com.designhub.entity.DemandType taskType = demandTypeMapper.selectById(taskTypeId); + if (taskType == null) { + log.warn("未找到任务类型: taskTypeId={}", taskTypeId); + return new ArrayList<>(); + } + + // 如果当前任务类型没有配置接单部门,递归查找父级 + String allowedDeptIds = taskType.getAllowedDeptIds(); + Long currentTypeId = taskTypeId; + while ((allowedDeptIds == null || allowedDeptIds.trim().isEmpty()) && taskType.getParentId() != null) { + log.info("任务类型{}没有配置接单部门,向上查找父级{}", currentTypeId, taskType.getParentId()); + taskType = demandTypeMapper.selectById(taskType.getParentId()); + if (taskType != null) { + allowedDeptIds = taskType.getAllowedDeptIds(); + currentTypeId = taskType.getId(); + } else { + break; + } + } + + if (allowedDeptIds == null || allowedDeptIds.trim().isEmpty()) { + log.warn("任务类型{}及其父级都没有配置接单部门", taskTypeId); + return new ArrayList<>(); + } + + log.info("找到接单部门配置: taskTypeId={}, allowedDeptIds={}", currentTypeId, allowedDeptIds); + + // 解析接单部门ID列表 + List targetDeptIds = new ArrayList<>(); + for (String deptIdStr : allowedDeptIds.split(",")) { + String trimmed = deptIdStr.trim(); + if (!trimmed.isEmpty()) { + try { + Long deptId = Long.parseLong(trimmed); + // 递归获取该部门及其所有子部门 + targetDeptIds.addAll(getAllSubDepartmentIds(deptId)); + } catch (NumberFormatException e) { + log.warn("无效的部门ID: {}", trimmed); + } + } + } + + if (targetDeptIds.isEmpty()) { + log.warn("解析后的部门列表为空"); + return new ArrayList<>(); + } + + log.info("目标部门ID列表(含子部门): {}", targetDeptIds); + + // 查询这些部门的设计师 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(User::getStatus, 1); + queryWrapper.eq(User::getDeleted, 0); + queryWrapper.in(User::getDeptId, targetDeptIds); + queryWrapper.orderByAsc(User::getRealName); + + List users = userMapper.selectList(queryWrapper); + log.info("找到{}个设计师", users.size()); + + // 构建返回结果 + List> result = new ArrayList<>(); + for (User user : users) { + Map designerInfo = new HashMap<>(); + designerInfo.put("id", user.getId()); + designerInfo.put("username", user.getUsername()); + designerInfo.put("realName", user.getRealName()); + designerInfo.put("deptId", user.getDeptId()); + + // 查询进行中的任务数量 + int inProgressCount = 0; + if (taskMapper != null) { + Long normalTaskCount = taskMapper.selectCount( + new LambdaQueryWrapper() + .eq(com.designhub.entity.Task::getReceiverId, user.getId()) + .eq(com.designhub.entity.Task::getStatus, "in_progress") + .eq(com.designhub.entity.Task::getDeleted, 0) + ); + Long subTaskCount = taskMapper.countSubTasksByReceiverId(user.getId()); + inProgressCount = (normalTaskCount != null ? normalTaskCount.intValue() : 0) + + (subTaskCount != null ? subTaskCount.intValue() : 0); + } + designerInfo.put("inProgressCount", inProgressCount); + + // 获取部门名称 + if (user.getDeptId() != null) { + Department dept = departmentMapper.selectById(user.getDeptId()); + if (dept != null) { + designerInfo.put("deptName", dept.getDeptName()); + } + } + + result.add(designerInfo); + } + + return result; + } + /** * 设置/取消管理员 */ diff --git a/frontend/src/api/user.ts b/frontend/src/api/user.ts index da60e78..cf21a95 100644 --- a/frontend/src/api/user.ts +++ b/frontend/src/api/user.ts @@ -155,10 +155,13 @@ export interface DesignerWithWorkload { /** * 获取设计师列表及工作量 + * @param deptId 部门ID(可选) + * @param taskTypeId 任务类型ID(可选,优先根据任务类型配置的接单部门获取设计师) */ -export const getDesignersWithWorkload = async (deptId?: number): Promise => { +export const getDesignersWithWorkload = async (deptId?: number, taskTypeId?: number): Promise => { const params: any = {}; - if (deptId) params.deptId = deptId; + if (taskTypeId) params.taskTypeId = taskTypeId; // 优先使用 taskTypeId + else if (deptId) params.deptId = deptId; const response = await request.get('/users/designers-with-workload', { params }); return response.data || []; }; diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue index 5e02dbf..cd19db9 100644 --- a/frontend/src/views/TaskHall.vue +++ b/frontend/src/views/TaskHall.vue @@ -3078,16 +3078,12 @@ const formatDeadlineRelative = (deadline: string) => { // 显示指定设计师弹窗(接单部门审核时) const showAssignDesignerModal = async (task: Task) => { try { - // 获取当前部门的设计师列表 - const userInfo = localStorage.getItem('userInfo') - let deptId: number | undefined - if (userInfo) { - const user = JSON.parse(userInfo) - deptId = user.deptId - } - - // 加载设计师列表及工作量 - const designers = await userApi.getDesignersWithWorkload(deptId) + // 根据任务类型配置的接单部门获取设计师列表 + // 优先使用 taskTypeId 来获取对应接单部门的设计师 + const taskTypeId = task.taskTypeId + + // 加载设计师列表及工作量(根据任务类型的接单部门配置) + const designers = await userApi.getDesignersWithWorkload(undefined, taskTypeId) if (designers.length === 0) { message.warning('当前部门没有可用的设计师') @@ -3165,16 +3161,16 @@ const handleApproveConfirm = async () => { }) } else { // 主任务审核 - const approvalData: TaskApprovalDTO = { - comment: approveAssignType.value === 'manual' ? - `指定设计师接单` : '审核通过,发布到任务大厅', - assignedReceiverId: approveAssignType.value === 'manual' ? approveDesignerId.value : undefined, - taskUpdates: { - taskTypes: approveTaskTypes.value.map(t => ({ - taskTypeId: t.typeId, - quantity: t.quantity - })) - } + const approvalData: TaskApprovalDTO = { + comment: approveAssignType.value === 'manual' ? + `指定设计师接单` : '审核通过,发布到任务大厅', + assignedReceiverId: approveAssignType.value === 'manual' ? approveDesignerId.value : undefined, + taskUpdates: { + taskTypes: approveTaskTypes.value.map(t => ({ + taskTypeId: t.typeId, + quantity: t.quantity + })) + } } await taskApi.approveReceivingLevel(taskData.id!, approvalData) }