diff --git a/backend/src/main/java/com/designhub/service/TaskApprovalService.java b/backend/src/main/java/com/designhub/service/TaskApprovalService.java index 8628503..f28f829 100644 --- a/backend/src/main/java/com/designhub/service/TaskApprovalService.java +++ b/backend/src/main/java/com/designhub/service/TaskApprovalService.java @@ -630,10 +630,45 @@ public class TaskApprovalService { /** * 确定接单部门负责人(支持三级分类继承二级分类的配置) + * 🔥 优先使用子任务上设置的接单部门 */ private Long determineReceivingLeader(Task task) { - // 根据任务类型的allowedDeptIds确定接单部门 - // 简化版本:取第一个任务类型的第一个允许部门 + // 🔥 步骤1:优先从子任务获取接单部门 + // 流水线任务:查找第一个子任务的 receiver_dept_id + if (task.getIsPipeline() != null && task.getIsPipeline() == 1) { + List taskItems = taskItemMapper.selectList( + new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(TaskItem::getTaskId, task.getId()) + .orderByAsc(TaskItem::getSortOrder) + ); + + if (taskItems != null && !taskItems.isEmpty()) { + // 查找第一个有 receiver_dept_id 的子任务 + for (TaskItem item : taskItems) { + if (item.getReceiverDeptId() != null) { + Department dept = departmentMapper.selectById(item.getReceiverDeptId()); + if (dept != null && dept.getLeaderId() != null) { + log.info("从子任务 {} 获取接单部门负责人: 部门={}, 负责人ID={}", + item.getItemNo(), dept.getDeptName(), dept.getLeaderId()); + return dept.getLeaderId(); + } + } + } + } + } + + // 🔥 步骤2:如果主任务有 receiver_dept_id,使用它 + if (task.getReceiverDeptId() != null) { + Department dept = departmentMapper.selectById(task.getReceiverDeptId()); + if (dept != null && dept.getLeaderId() != null) { + log.info("从主任务获取接单部门负责人: 部门={}, 负责人ID={}", + dept.getDeptName(), dept.getLeaderId()); + return dept.getLeaderId(); + } + } + + // 🔥 步骤3:降级方案 - 根据任务类型的allowedDeptIds确定接单部门 + // 取第一个任务类型的第一个允许部门 String taskTypeIds = task.getTaskTypeIds(); if (taskTypeIds == null || taskTypeIds.isEmpty()) { return null; @@ -657,11 +692,13 @@ public class TaskApprovalService { if (allowedDeptIds != null && !allowedDeptIds.isEmpty()) { String[] deptIds = allowedDeptIds.split(","); - if (deptIds.length > 0) { - Long deptId = Long.parseLong(deptIds[0].trim()); - Department dept = departmentMapper.selectById(deptId); - if (dept != null && dept.getLeaderId() != null) { - return dept.getLeaderId(); + if (deptIds.length > 0) { + Long deptId = Long.parseLong(deptIds[0].trim()); + Department dept = departmentMapper.selectById(deptId); + if (dept != null && dept.getLeaderId() != null) { + log.info("从任务类型配置获取接单部门负责人(降级方案): 部门={}, 负责人ID={}", + dept.getDeptName(), dept.getLeaderId()); + return dept.getLeaderId(); } } } diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index 7037c16..3224d66 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -574,6 +574,26 @@ public class TaskService { item.setSortOrder(itemIndex); item.setProgress(0); + // 🔥 设置子任务的接单部门(无论什么模式都要设置) + // 优先使用用户选择的部门,否则尝试从任务类型配置获取 + if (!groupItems.isEmpty()) { + Long selectedDeptId = groupItems.get(0).getSelectedDeptId(); + if (selectedDeptId != null) { + // 用户明确选择了接单部门 + item.setReceiverDeptId(selectedDeptId); + log.info("子任务 {} 设置用户选择的接单部门: {}", item.getItemNo(), selectedDeptId); + } else if (deptKey != null && !deptKey.equals("null") && !deptKey.contains(",")) { + // 任务类型只配置了一个部门,自动设置 + try { + Long singleDeptId = Long.parseLong(deptKey.trim()); + item.setReceiverDeptId(singleDeptId); + log.info("子任务 {} 自动设置唯一的接单部门: {}", item.getItemNo(), singleDeptId); + } catch (NumberFormatException e) { + log.warn("无法解析部门ID: {}", deptKey); + } + } + } + // 如果是assigned模式,设置子任务的接收人(从该组的第一个任务项获取) if ("assigned".equals(dto.getReleaseType()) && !groupItems.isEmpty()) { Long itemReceiverId = groupItems.get(0).getReceiverId(); @@ -582,7 +602,8 @@ public class TaskService { User itemReceiver = userService.getUserById(itemReceiverId); if (itemReceiver != null) { item.setReceiverName(itemReceiver.getRealName()); - if (itemReceiver.getDeptId() != null) { + // 如果还没有设置接单部门,从设计师信息获取 + if (item.getReceiverDeptId() == null && itemReceiver.getDeptId() != null) { item.setReceiverDeptId(itemReceiver.getDeptId()); } } @@ -1660,6 +1681,26 @@ public class TaskService { item.setSortOrder(itemIndex); item.setProgress(0); + // 🔥 设置子任务的接单部门(无论什么模式都要设置) + String deptKeyForItem = groupToDeptKey.get(groupNo); + if (!groupItems.isEmpty()) { + Long selectedDeptIdForItem = groupItems.get(0).getSelectedDeptId(); + if (selectedDeptIdForItem != null) { + // 用户明确选择了接单部门 + item.setReceiverDeptId(selectedDeptIdForItem); + log.info("子任务 {} 设置用户选择的接单部门: {}", item.getItemNo(), selectedDeptIdForItem); + } else if (deptKeyForItem != null && !deptKeyForItem.equals("null") && !deptKeyForItem.contains(",")) { + // 任务类型只配置了一个部门,自动设置 + try { + Long singleDeptIdForItem = Long.parseLong(deptKeyForItem.trim()); + item.setReceiverDeptId(singleDeptIdForItem); + log.info("子任务 {} 自动设置唯一的接单部门: {}", item.getItemNo(), singleDeptIdForItem); + } catch (NumberFormatException e) { + log.warn("无法解析部门ID: {}", deptKeyForItem); + } + } + } + // 如果是assigned模式,设置子任务的接收人 if ("assigned".equals(dto.getReleaseType()) && !groupItems.isEmpty()) { Long itemReceiverId = groupItems.get(0).getReceiverId(); @@ -1668,7 +1709,8 @@ public class TaskService { User itemReceiver = userService.getUserById(itemReceiverId); if (itemReceiver != null) { item.setReceiverName(itemReceiver.getRealName()); - if (itemReceiver.getDeptId() != null) { + // 如果还没有设置接单部门,从设计师信息获取 + if (item.getReceiverDeptId() == null && itemReceiver.getDeptId() != null) { item.setReceiverDeptId(itemReceiver.getDeptId()); } } @@ -1693,8 +1735,8 @@ public class TaskService { } taskItemMapper.insert(item); - log.info("子任务创建成功,ID: {}, 编号: {}, 部门序号: {}, 部门内序号: {}", - item.getId(), item.getItemNo(), currentDeptIndex, subIndex); + log.info("子任务创建成功,ID: {}, 编号: {}, 部门序号: {}, 部门内序号: {}, 接单部门: {}", + item.getId(), item.getItemNo(), currentDeptIndex, subIndex, item.getReceiverDeptId()); itemIndex++; }