diff --git a/backend/src/main/java/com/designhub/service/TaskApprovalService.java b/backend/src/main/java/com/designhub/service/TaskApprovalService.java
index 9a323c9..6edc43c 100644
--- a/backend/src/main/java/com/designhub/service/TaskApprovalService.java
+++ b/backend/src/main/java/com/designhub/service/TaskApprovalService.java
@@ -41,6 +41,7 @@ public class TaskApprovalService {
private final TaskService taskService;
private final ConfigService configService;
private final ObjectMapper objectMapper;
+ private final DingTalkService dingTalkService;
/**
* 需求部门负责人审核通过
@@ -258,11 +259,36 @@ public class TaskApprovalService {
// 如果指定了接收人,发送通知
if (assignedReceiverId != null) {
- // TODO: 通知指定的设计师
log.info("任务【{}】已指定给设计师", task.getTitle());
} else {
- // TODO: 通知任务大厅(所有接单部门成员)
- log.info("任务【{}】已发布到任务大厅", task.getTitle());
+ // 任务发布到大厅,发送钉钉群机器人通知
+ try {
+ String title = "🎯 新任务发布";
+ StringBuilder content = new StringBuilder();
+ content.append("**任务标题:**").append(task.getTitle()).append("\n\n");
+ content.append("**任务编号:**").append(task.getTaskNo()).append("\n\n");
+ content.append("**积分:**").append(task.getScore()).append(" 分\n\n");
+
+ if (task.getBrandName() != null) {
+ content.append("**品牌:**").append(task.getBrandName()).append("\n\n");
+ }
+ if (task.getCategoryName() != null) {
+ content.append("**类目:**").append(task.getCategoryName()).append("\n\n");
+ }
+ if (task.getPlatformName() != null) {
+ content.append("**平台:**").append(task.getPlatformName()).append("\n\n");
+ }
+
+ content.append("**状态:**待接单\n\n");
+ content.append("---\n\n");
+ content.append("💡 赶快去任务大厅抢单吧!");
+
+ dingTalkService.sendRobotMessage(title, content.toString());
+ log.info("任务【{}】已发布到任务大厅,已发送钉钉群通知", task.getTitle());
+ } catch (Exception e) {
+ log.error("发送钉钉群通知失败:taskId={}", taskId, e);
+ // 通知发送失败不影响主流程
+ }
}
log.info("接单部门负责人审核通过,任务ID:{},审核人:{},指定接收人:{}",
diff --git a/backend/src/main/java/com/designhub/service/TaskItemService.java b/backend/src/main/java/com/designhub/service/TaskItemService.java
index 354dc2c..cdee138 100644
--- a/backend/src/main/java/com/designhub/service/TaskItemService.java
+++ b/backend/src/main/java/com/designhub/service/TaskItemService.java
@@ -33,6 +33,7 @@ public class TaskItemService {
private final DepartmentMapper departmentMapper;
private final UserService userService;
private final NotificationService notificationService;
+ private final DingTalkService dingTalkService;
/**
* 获取可接单的子任务列表
@@ -466,7 +467,31 @@ public class TaskItemService {
taskItemMapper.updateById(item);
}
- log.info("第 {} 组 {} 个子任务已发布到任务大厅", groupNo, groupItems.size());
+ // 发送钉钉群机器人通知
+ try {
+ String title = "🎯 新子任务组发布";
+ StringBuilder content = new StringBuilder();
+ content.append("**主任务:**").append(mainTask.getTitle()).append("\n\n");
+ content.append("**子任务组:**第 ").append(groupNo).append(" 组\n\n");
+ content.append("**子任务数量:**").append(groupItems.size()).append(" 个\n\n");
+
+ // 列出子任务类型
+ content.append("**任务类型:**\n\n");
+ for (TaskItem item : groupItems) {
+ content.append("- ").append(item.getItemNo())
+ .append("(积分:").append(item.getTotalScore()).append(")\n\n");
+ }
+
+ content.append("**状态:**待接单\n\n");
+ content.append("---\n\n");
+ content.append("💡 赶快去任务大厅抢单吧!");
+
+ dingTalkService.sendRobotMessage(title, content.toString());
+ log.info("第 {} 组 {} 个子任务已发布到任务大厅,已发送钉钉群通知", groupNo, groupItems.size());
+ } catch (Exception e) {
+ log.error("发送钉钉群通知失败:taskId={}, groupNo={}", taskId, groupNo, e);
+ // 通知发送失败不影响主流程
+ }
}
}
diff --git a/frontend/src/api/task.ts b/frontend/src/api/task.ts
index 27a4f2f..c641613 100644
--- a/frontend/src/api/task.ts
+++ b/frontend/src/api/task.ts
@@ -56,6 +56,14 @@ export interface Task {
platformName?: string
publisherName?: string
publisherDeptName?: string
+ // 子任务统计(流水线任务)
+ subTaskTotal?: number
+ subTaskCompleted?: number
+ subTaskInProgress?: number
+ subTaskPending?: number
+ subTasks?: TaskItem[]
+ // 标记字段(前端使用)
+ isSubTask?: boolean
}
// 任务子项(流水线任务)
diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue
index f43614c..224abab 100644
--- a/frontend/src/views/TaskHall.vue
+++ b/frontend/src/views/TaskHall.vue
@@ -1479,7 +1479,20 @@