修复:流水线任务第二节点预先指定的设计师现在会收到解锁通知

问题:当流水线任务(如建模+美工)的第一个节点完成后,如果第二个节点已预先指定了设计师,
该设计师不会收到通知,导致不知道任务已解锁。

修复:在子任务解锁逻辑中,区分处理已预先指定设计师和未指定设计师的子任务:
1. 已预先指定设计师的子任务:直接设为待接单状态(pending),并立即通知该设计师
2. 未指定设计师的子任务:设为待审核状态(pending_approval),通知接单部门负责人审核分配
This commit is contained in:
Your Name 2026-01-24 11:45:24 +08:00
parent d20b5fc989
commit 93c1d58f7c

View File

@ -678,54 +678,109 @@ public class TaskItemService {
.collect(java.util.stream.Collectors.toList());
if (!nextDeptItems.isEmpty()) {
// 批量解锁下一个部门的所有子任务,状态设为待审核,并传递前置环节的下载链接
// 🔥 分类处理:已预先指定设计师的 vs 未指定的
List<TaskItem> preAssignedItems = new ArrayList<>(); // 已预先指定设计师的子任务
List<TaskItem> unassignedItems = new ArrayList<>(); // 未指定的子任务
for (TaskItem nextItem : nextDeptItems) {
nextItem.setStatus("pending_approval"); // 待接单部门负责人审核
if (nextItem.getReceiverId() != null) {
preAssignedItems.add(nextItem);
} else {
unassignedItems.add(nextItem);
}
}
LocalDateTime now = LocalDateTime.now();
// 🔥 处理已预先指定设计师的子任务:直接设为待接单状态,并通知设计师
Set<Long> notifiedDesignerIds = new HashSet<>();
for (TaskItem nextItem : preAssignedItems) {
nextItem.setStatus("pending"); // 待接单(设计师需要点击接单确认)
nextItem.setIsLocked(0);
nextItem.setPrevDownloadUrl(prevDownloadUrlStr); // 🔥 传递前置环节的下载链接
nextItem.setUpdateTime(LocalDateTime.now());
nextItem.setPrevDownloadUrl(prevDownloadUrlStr);
nextItem.setUpdateTime(now);
taskItemMapper.updateById(nextItem);
log.info("✅ 解锁子任务: {} (部门序号: {}, ID: {}),待接单部门负责人审核,已传递前置素材链接",
log.info("✅ 解锁预先指定的子任务: {} -> 设计师 {} (ID: {}),状态设为待接单",
nextItem.getItemNo(), nextItem.getReceiverName(), nextItem.getReceiverId());
// 通知预先指定的设计师
if (!notifiedDesignerIds.contains(nextItem.getReceiverId())) {
notifiedDesignerIds.add(nextItem.getReceiverId());
Notification notification = new Notification();
notification.setReceiverId(nextItem.getReceiverId());
notification.setNotificationType("task");
notification.setTitle("指派任务已解锁");
notification.setContent("任务《" + mainTask.getTitle() + "》的子任务 " + nextItem.getItemNo() +
" 已解锁,请尽快接单处理!");
notification.setRelatedId(nextItem.getId());
notification.setRelatedType("task_item");
notification.setPriority(2); // 重要
notification.setPushDingtalk(1); // 推送到钉钉
notificationService.sendNotification(notification);
log.info("已通知预先指定的设计师 {} (ID: {}) 子任务已解锁",
nextItem.getReceiverName(), nextItem.getReceiverId());
}
}
// 🔥 处理未指定设计师的子任务:设为待审核,通知接单部门负责人
for (TaskItem nextItem : unassignedItems) {
nextItem.setStatus("pending_approval"); // 待接单部门负责人审核
nextItem.setIsLocked(0);
nextItem.setPrevDownloadUrl(prevDownloadUrlStr);
nextItem.setUpdateTime(now);
taskItemMapper.updateById(nextItem);
log.info("✅ 解锁未指定的子任务: {} (部门序号: {}, ID: {}),待接单部门负责人审核",
nextItem.getItemNo(), nextDeptIndex, nextItem.getId());
}
result.put("unlockedDeptIndex", nextDeptIndex);
result.put("unlockedCount", nextDeptItems.size());
result.put("preAssignedCount", preAssignedItems.size());
result.put("unassignedCount", unassignedItems.size());
// 发送通知给接单部门负责人
// 从子任务的任务类型配置中获取allowed_dept_ids
Set<Long> notifiedLeaderIds = new HashSet<>();
for (TaskItem nextItem : nextDeptItems) {
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() + "》第 " + nextDeptIndex + " 个部门共 " +
nextDeptItems.size() + " 个子任务已解锁,请审核并分配!");
notification.setRelatedId(item.getTaskId());
notification.setRelatedType("task");
notification.setPriority(2); // 重要
notification.setPushDingtalk(1); // 推送到钉钉
notificationService.sendNotification(notification);
log.info("已通知接单部门负责人(部门: {}, 负责人ID: {})审核第 {} 个部门子任务",
receiverDept.getDeptName(), receiverDept.getLeaderId(), nextDeptIndex);
// 只有未指定设计师的子任务才需要通知接单部门负责人审核
if (!unassignedItems.isEmpty()) {
Set<Long> notifiedLeaderIds = new HashSet<>();
for (TaskItem nextItem : unassignedItems) {
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() + "》第 " + nextDeptIndex + " 个部门共 " +
unassignedItems.size() + " 个子任务已解锁,请审核并分配!");
notification.setRelatedId(item.getTaskId());
notification.setRelatedType("task");
notification.setPriority(2); // 重要
notification.setPushDingtalk(1); // 推送到钉钉
notificationService.sendNotification(notification);
log.info("已通知接单部门负责人(部门: {}, 负责人ID: {})审核第 {} 个部门子任务",
receiverDept.getDeptName(), receiverDept.getLeaderId(), nextDeptIndex);
}
} else {
log.warn("子任务 {} 的任务类型未配置接单部门", nextItem.getItemNo());
}
} else {
log.warn("子任务 {} 的任务类型未配置接单部门", nextItem.getItemNo());
}
log.info("第 {} 个部门 {} 个未指定子任务已解锁,等待接单部门负责人审核,已通知 {} 个部门负责人",
nextDeptIndex, unassignedItems.size(), notifiedLeaderIds.size());
}
log.info("第 {} 个部门 {} 个子任务已解锁,等待接单部门负责人审核,已通知 {} 个部门负责人",
nextDeptIndex, nextDeptItems.size(), notifiedLeaderIds.size());
if (!preAssignedItems.isEmpty()) {
log.info("第 {} 个部门 {} 个预先指定的子任务已解锁,已通知 {} 个设计师",
nextDeptIndex, preAssignedItems.size(), notifiedDesignerIds.size());
}
} else {
log.info("没有更多部门的子任务需要解锁");
}