From a41553fe883e5380fd6e5d4509f857142096c9ad Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 24 Jan 2026 11:34:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E7=BA=A7=E9=9C=80=E6=B1=82=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=EF=BC=9A=E8=A1=A5=E5=85=85=E5=90=84=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E5=AF=B9=E4=B8=80=E7=BA=A7=E5=8F=91=E8=B5=B7=E4=BA=BA=E7=9A=84?= =?UTF-8?q?=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充以下节点的一级发起人通知: 1. 子任务被接单 - 同时通知一级发起人 2. 子任务进度更新 - 同时通知一级发起人 3. 流水线任务全部完成 - 同时通知一级发起人 4. 子任务组审核通过并指派 - 通知一级发起人 5. 需求部门审批通过 - 通知一级发起人审核进度 6. 需求部门审批驳回 - 同时通知一级发起人 7. 接单部门审批通过 - 通知一级发起人任务已发布 8. 接单部门审批驳回 - 同时通知一级发起人 确保一级需求发起人能够全程跟踪任务状态变化 --- .../service/TaskApprovalService.java | 53 ++++++++++++++- .../designhub/service/TaskItemService.java | 65 +++++++++++++++++++ 2 files changed, 116 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/designhub/service/TaskApprovalService.java b/backend/src/main/java/com/designhub/service/TaskApprovalService.java index 913ee22..3ae710a 100644 --- a/backend/src/main/java/com/designhub/service/TaskApprovalService.java +++ b/backend/src/main/java/com/designhub/service/TaskApprovalService.java @@ -350,6 +350,17 @@ public class TaskApprovalService { taskId ); } + + // 🔥 一级需求任务:通知一级发起人需求部门审核已通过 + if (task.getPrimaryPublisherId() != null) { + notificationService.sendNotification( + task.getPrimaryPublisherId(), + "任务审核进度更新", + String.format("您发起的任务【%s】已通过需求部门审核,进入接单部门审核阶段", task.getTitle()), + "task_approval_progress", + taskId + ); + } log.info("需求部门负责人审核通过,任务ID:{},审核人:{},发布类型:{},等待接单部门负责人审核", taskId, approverId, releaseType); } @@ -371,7 +382,7 @@ public class TaskApprovalService { logApproval(taskId, approverId, 1, "reject", reason); - // 通知发起人 + // 通知发起人(明细完善人) notificationService.sendNotification( task.getPublisherId(), "任务已被驳回", @@ -380,6 +391,18 @@ public class TaskApprovalService { taskId ); + // 🔥 一级需求任务:同时通知一级发起人 + if (task.getPrimaryPublisherId() != null + && !task.getPrimaryPublisherId().equals(task.getPublisherId())) { + notificationService.sendNotification( + task.getPrimaryPublisherId(), + "任务已被驳回", + String.format("您发起的任务【%s】被需求部门负责人驳回,原因:%s", task.getTitle(), reason), + "task_reject", + taskId + ); + } + // 如果任务有指定的处理人,发送群通知告知驳回 if (task.getReceiverId() != null) { try { @@ -514,6 +537,19 @@ public class TaskApprovalService { "已指定给设计师" + assignNote + ":" + (receiver != null ? receiver.getRealName() : finalReceiverId); } logApproval(taskId, approverId, 2, "approve", logComment); + + // 🔥 一级需求任务:通知一级发起人任务已通过审核并发布 + if (task.getPrimaryPublisherId() != null) { + String statusDesc = finalReceiverId != null ? "已指派给设计师" : "已发布到任务大厅"; + notificationService.sendNotification( + task.getPrimaryPublisherId(), + "任务审核通过", + String.format("您发起的任务【%s】已通过全部审核,%s", task.getTitle(), statusDesc), + "task_approved", + taskId + ); + log.info("已通知一级发起人 {} 任务审核通过", task.getPrimaryPublisherId()); + } // 发送钉钉通知 // 对于流水线任务,需要给第一个部门的所有子任务设计师发送通知 @@ -714,7 +750,7 @@ public class TaskApprovalService { logApproval(taskId, approverId, 2, "reject", reason); - // 1. 通知任务发起人 + // 1. 通知任务发起人(明细完善人) notificationService.sendNotification( task.getPublisherId(), "任务已被驳回", @@ -724,6 +760,19 @@ public class TaskApprovalService { ); log.info("已通知任务发起人: publisherId={}", task.getPublisherId()); + // 🔥 1.5 一级需求任务:同时通知一级发起人 + if (task.getPrimaryPublisherId() != null + && !task.getPrimaryPublisherId().equals(task.getPublisherId())) { + notificationService.sendNotification( + task.getPrimaryPublisherId(), + "任务已被驳回", + String.format("您发起的任务【%s】被接单部门负责人驳回,原因:%s", task.getTitle(), reason), + "task_reject", + taskId + ); + log.info("已通知一级发起人: primaryPublisherId={}", task.getPrimaryPublisherId()); + } + // 2. 如果需求部门负责人存在且不是发起人,也通知需求部门负责人 if (demandDept != null && demandDept.getLeaderId() != null && !demandDept.getLeaderId().equals(task.getPublisherId())) { notificationService.sendNotification( diff --git a/backend/src/main/java/com/designhub/service/TaskItemService.java b/backend/src/main/java/com/designhub/service/TaskItemService.java index 7d4588a..c3c4fa0 100644 --- a/backend/src/main/java/com/designhub/service/TaskItemService.java +++ b/backend/src/main/java/com/designhub/service/TaskItemService.java @@ -429,6 +429,22 @@ public class TaskItemService { notification.setPushDingtalk(1); // 推送到钉钉 notificationService.sendNotification(notification); } + + // 🔥 一级需求任务:同时通知一级发起人 + if (mainTask.getPrimaryPublisherId() != null + && !mainTask.getPrimaryPublisherId().equals(mainTask.getPublisherId())) { + Notification notification2 = new Notification(); + notification2.setReceiverId(mainTask.getPrimaryPublisherId()); + notification2.setNotificationType("task"); + notification2.setTitle("子任务已被接单"); + notification2.setContent(user.getRealName() + " 接单了子任务:" + item.getItemNo()); + notification2.setRelatedId(itemId); + notification2.setRelatedType("task_item"); + notification2.setPriority(1); + notification2.setPushDingtalk(1); + notificationService.sendNotification(notification2); + log.info("已通知一级发起人 {} 子任务被接单", mainTask.getPrimaryPublisherId()); + } } } @@ -509,6 +525,21 @@ public class TaskItemService { log.info("已通知需求者 {} 任务进度更新: 子任务={}, 进度={}%", mainTask.getPublisherId(), item.getItemNo(), progress); + + // 🔥 一级需求任务:同时通知一级发起人 + if (mainTask.getPrimaryPublisherId() != null + && !mainTask.getPrimaryPublisherId().equals(mainTask.getPublisherId())) { + notificationService.sendNotification( + mainTask.getPrimaryPublisherId(), + "任务进度已更新", + content.toString(), + "PROGRESS_UPDATE", + "task_item", + itemId + ); + log.info("已通知一级发起人 {} 任务进度更新: 子任务={}, 进度={}%", + mainTask.getPrimaryPublisherId(), item.getItemNo(), progress); + } } } catch (Exception e) { // 通知失败不影响主流程 @@ -760,6 +791,22 @@ public class TaskItemService { notification.setPushDingtalk(1); // 推送到钉钉 notificationService.sendNotification(notification); } + + // 🔥 一级需求任务:同时通知一级发起人 + if (mainTask.getPrimaryPublisherId() != null + && !mainTask.getPrimaryPublisherId().equals(mainTask.getPublisherId())) { + Notification notification2 = new Notification(); + notification2.setReceiverId(mainTask.getPrimaryPublisherId()); + notification2.setNotificationType("task"); + notification2.setTitle("流水线任务已完成"); + notification2.setContent("您发起的任务《" + mainTask.getTitle() + "》所有子任务已完成!"); + notification2.setRelatedId(mainTask.getId()); + notification2.setRelatedType("task"); + notification2.setPriority(1); + notification2.setPushDingtalk(1); + notificationService.sendNotification(notification2); + log.info("已通知一级发起人 {} 任务全部完成", mainTask.getPrimaryPublisherId()); + } result.put("mainTaskCompleted", true); } else { @@ -980,6 +1027,24 @@ public class TaskItemService { notification.setPushDingtalk(1); // 推送到钉钉 notificationService.sendNotification(notification); + // 🔥 一级需求任务:通知一级发起人子任务已指派 + if (mainTask.getPrimaryPublisherId() != null) { + com.designhub.entity.User designer = userService.getUserById(assignedReceiverId); + String designerName = designer != null ? designer.getRealName() : "未知"; + Notification notification2 = new Notification(); + notification2.setReceiverId(mainTask.getPrimaryPublisherId()); + notification2.setNotificationType("task"); + notification2.setTitle("子任务已指派"); + notification2.setContent("任务《" + mainTask.getTitle() + "》的第 " + groupNo + + " 组已指派给设计师 " + designerName); + notification2.setRelatedId(taskId); + notification2.setRelatedType("task"); + notification2.setPriority(1); + notification2.setPushDingtalk(1); + notificationService.sendNotification(notification2); + log.info("已通知一级发起人 {} 子任务组已指派", mainTask.getPrimaryPublisherId()); + } + // 发送钉钉群通知并@指定的设计师 try { java.math.BigDecimal totalScore = groupItems.stream()