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 @@ - 接单人: {{ task.receiverName || '--' }} + 处理人: {{ task.receiverName || '待接单' }} + + +
+ + + + + 子任务: + 已完成 {{ task.subTaskCompleted || 0 }} + 进行中 {{ task.subTaskInProgress || 0 }} + 待接单 {{ task.subTaskPending || 0 }} + / 共 {{ task.subTaskTotal }} +
@@ -4072,6 +4085,48 @@ onUnmounted(() => { text-overflow: clip; } } + + // 子任务进度样式 + &.subtask-progress { + grid-column: 1 / -1; + + .subtask-stats { + display: flex; + align-items: center; + gap: 8px; + flex-wrap: wrap; + white-space: normal; + overflow: visible; + + .stat { + padding: 2px 8px; + border-radius: 4px; + font-size: 12px; + font-weight: 500; + white-space: nowrap; + + &.completed { + background: rgba(82, 196, 26, 0.1); + color: #52c41a; + } + + &.in-progress { + background: rgba(24, 144, 255, 0.1); + color: #1890ff; + } + + &.pending { + background: rgba(250, 173, 20, 0.1); + color: #faad14; + } + + &.total { + color: #999; + padding: 0; + } + } + } + } } // 任务操作