diff --git a/backend/src/main/java/com/designhub/service/TaskItemService.java b/backend/src/main/java/com/designhub/service/TaskItemService.java index 46554b0..aa24c58 100644 --- a/backend/src/main/java/com/designhub/service/TaskItemService.java +++ b/backend/src/main/java/com/designhub/service/TaskItemService.java @@ -37,6 +37,7 @@ public class TaskItemService { private final ConfigService configService; private final ExternalAssetService externalAssetService; private final SystemConfigService systemConfigService; + private final com.designhub.mapper.TaskTypeMapper taskTypeMapper; /** * 获取可接单的子任务列表 @@ -504,27 +505,38 @@ public class TaskItemService { result.put("unlockedCount", nextGroupItems.size()); // 发送通知给接单部门负责人 - if (mainTask.getReceiverDeptId() != null) { - com.designhub.entity.Department receiverDept = departmentMapper.selectById(mainTask.getReceiverDeptId()); - if (receiverDept != null && receiverDept.getLeaderId() != null) { - Notification notification = new Notification(); - notification.setReceiverId(receiverDept.getLeaderId()); - notification.setNotificationType("task_approval"); - notification.setTitle("新子任务组待审核"); - notification.setContent("任务《" + mainTask.getTitle() + "》第 " + nextGroupNo + " 组共 " + - nextGroupItems.size() + " 个子任务已解锁,请审核并分配!"); - notification.setRelatedId(item.getTaskId()); - notification.setRelatedType("task"); - notification.setPriority(2); // 重要 - notification.setPushDingtalk(1); // 推送到钉钉 - notificationService.sendNotification(notification); - - log.info("已通知接单部门负责人(ID: {})审核第 {} 组子任务", - receiverDept.getLeaderId(), nextGroupNo); + // 从子任务的任务类型配置中获取allowed_dept_ids + Set notifiedLeaderIds = new java.util.HashSet<>(); + for (TaskItem nextItem : nextGroupItems) { + Long targetDeptId = getTargetDeptIdFromTaskType(nextItem.getTaskTypeId()); + if (targetDeptId != null) { + com.designhub.entity.Department receiverDept = departmentMapper.selectById(targetDeptId); + if (receiverDept != null && receiverDept.getLeaderId() != null + && !notifiedLeaderIds.contains(receiverDept.getLeaderId())) { + notifiedLeaderIds.add(receiverDept.getLeaderId()); + + Notification notification = new Notification(); + notification.setReceiverId(receiverDept.getLeaderId()); + notification.setNotificationType("task_approval"); + notification.setTitle("新子任务组待审核"); + notification.setContent("任务《" + mainTask.getTitle() + "》第 " + nextGroupNo + " 组共 " + + nextGroupItems.size() + " 个子任务已解锁,请审核并分配!"); + notification.setRelatedId(item.getTaskId()); + notification.setRelatedType("task"); + notification.setPriority(2); // 重要 + notification.setPushDingtalk(1); // 推送到钉钉 + notificationService.sendNotification(notification); + + log.info("已通知接单部门负责人(部门: {}, 负责人ID: {})审核第 {} 组子任务", + receiverDept.getDeptName(), receiverDept.getLeaderId(), nextGroupNo); + } + } else { + log.warn("子任务 {} 的任务类型未配置接单部门", nextItem.getItemNo()); } } - log.info("第 {} 组 {} 个子任务已解锁,等待接单部门负责人审核", nextGroupNo, nextGroupItems.size()); + log.info("第 {} 组 {} 个子任务已解锁,等待接单部门负责人审核,已通知 {} 个部门负责人", + nextGroupNo, nextGroupItems.size(), notifiedLeaderIds.size()); } else { log.info("没有更多子任务组需要解锁"); } @@ -998,4 +1010,39 @@ public class TaskItemService { return new java.util.ArrayList<>(groupMap.values()); } + + /** + * 从任务类型配置中获取目标接单部门ID + * 如果当前类型未配置,则递归向上查找父级类型的配置 + */ + private Long getTargetDeptIdFromTaskType(Long taskTypeId) { + if (taskTypeId == null) { + return null; + } + + com.designhub.entity.TaskType taskType = taskTypeMapper.selectById(taskTypeId); + if (taskType == null) { + return null; + } + + // 如果当前类型配置了allowed_dept_ids,返回第一个部门ID + String allowedDeptIds = taskType.getAllowedDeptIds(); + if (allowedDeptIds != null && !allowedDeptIds.isEmpty()) { + try { + String[] deptIds = allowedDeptIds.split(","); + if (deptIds.length > 0) { + return Long.parseLong(deptIds[0].trim()); + } + } catch (NumberFormatException e) { + log.warn("解析allowed_dept_ids失败: {}", allowedDeptIds, e); + } + } + + // 如果当前类型未配置,递归查找父级 + if (taskType.getParentId() != null) { + return getTargetDeptIdFromTaskType(taskType.getParentId()); + } + + return null; + } }