diff --git a/backend/src/main/java/com/designhub/service/TaskItemService.java b/backend/src/main/java/com/designhub/service/TaskItemService.java index 56240ed..d7f5dbb 100644 --- a/backend/src/main/java/com/designhub/service/TaskItemService.java +++ b/backend/src/main/java/com/designhub/service/TaskItemService.java @@ -22,6 +22,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import com.fasterxml.jackson.databind.ObjectMapper; /** * 任务子项服务类(流水线任务) @@ -42,6 +43,7 @@ public class TaskItemService { private final SystemConfigService systemConfigService; private final DemandTypeMapper demandTypeMapper; private final com.designhub.mapper.UserMapper userMapper; + private final ObjectMapper objectMapper; /** * 获取可接单的子任务列表 @@ -809,85 +811,104 @@ public class TaskItemService { taskItemMapper.updateById(item); } - // 发送钉钉群机器人通知 - // 注意:钉钉Markdown换行需要两个空格+换行符 + // 发送钉钉群机器人通知(与第一轮格式一致) try { - String title = "新子任务组发布"; + String title = "新任务发布"; StringBuilder content = new StringBuilder(); - content.append("-------------------------------- \n"); - content.append(" 【 新 子 任 务 组 发 布 】 \n"); - content.append("-------------------------------- \n\n"); - // 主任务信息 - content.append("主任务:").append(mainTask.getTitle()).append(" \n"); - content.append("任务编号:").append(mainTask.getTaskNo()).append(" \n"); - content.append("任务组:第 ").append(groupNo).append(" 组 \n"); - content.append("子任务数量:").append(groupItems.size()).append(" 个 \n"); - - // 计算总积分 - int totalScore = groupItems.stream().mapToInt(item -> item.getTotalScore() != null ? item.getTotalScore() : 0).sum(); - content.append("总积分:").append(totalScore).append(" 分 \n"); - - // 任务需求类型 - if (mainTask.getTaskTypeIds() != null && !mainTask.getTaskTypeIds().isEmpty()) { - StringBuilder typeNames = new StringBuilder(); - String[] typeIds = mainTask.getTaskTypeIds().split(","); - for (String typeIdStr : typeIds) { - try { - Long typeId = Long.parseLong(typeIdStr.trim()); - com.designhub.entity.DemandType demandType = configService.getDemandTypeById(typeId); - if (demandType != null) { - if (typeNames.length() > 0) { - typeNames.append("、"); - } - typeNames.append(demandType.getName()); - } - } catch (NumberFormatException e) { - log.warn("解析任务类型ID失败:{}", typeIdStr); - } - } - if (typeNames.length() > 0) { - content.append("需求类型:").append(typeNames.toString()).append(" \n"); - } - } - - content.append(" \n"); + // 基本信息 + content.append("**任务名称**:").append(mainTask.getTitle()).append("(第").append(groupNo).append("组) \n"); + content.append("**任务编号**:").append(mainTask.getTaskNo()).append(" \n"); // 任务详情 if (mainTask.getBrandName() != null && !mainTask.getBrandName().isEmpty()) { - content.append("品牌:").append(mainTask.getBrandName()).append(" \n"); - } - if (mainTask.getCategoryName() != null && !mainTask.getCategoryName().isEmpty()) { - content.append("类目:").append(mainTask.getCategoryName()).append(" \n"); + content.append("**品牌**:").append(mainTask.getBrandName()).append(" \n"); } if (mainTask.getPlatformName() != null && !mainTask.getPlatformName().isEmpty()) { - content.append("平台:").append(mainTask.getPlatformName()).append(" \n"); + content.append("**平台**:").append(mainTask.getPlatformName()).append(" \n"); } if (mainTask.getSpuInfo() != null && !mainTask.getSpuInfo().isEmpty()) { - content.append("SPU:").append(mainTask.getSpuInfo()).append(" \n"); + content.append("**SPU**:").append(mainTask.getSpuInfo()).append(" \n"); + } + if (mainTask.getTaskSubType() != null && !mainTask.getTaskSubType().isEmpty()) { + String taskSubTypeName = convertTaskSubTypeToName(mainTask.getTaskSubType()); + content.append("**任务类型**:").append(taskSubTypeName).append(" \n"); } content.append(" \n"); - // 列出子任务详情 - content.append("子任务列表: \n"); + // 任务明细(与第一轮格式一致) + content.append("**任务明细**: \n"); for (TaskItem item : groupItems) { - content.append(" - ").append(item.getItemNo()) - .append("(").append(item.getTotalScore() != null ? item.getTotalScore() : 0).append("分) \n"); + // 通过任务类型ID获取接单部门名称 + String deptName = "未指定"; + if (item.getTaskTypeId() != null) { + try { + com.designhub.entity.DemandType demandType = configService.getDemandTypeById(item.getTaskTypeId()); + if (demandType != null && demandType.getAllowedDeptIds() != null && !demandType.getAllowedDeptIds().isEmpty()) { + String[] deptIds = demandType.getAllowedDeptIds().split(","); + Long firstDeptId = Long.parseLong(deptIds[0].trim()); + com.designhub.entity.Department dept = departmentMapper.selectById(firstDeptId); + if (dept != null) { + deptName = dept.getDeptName(); + } + } + } catch (Exception e) { + log.warn("获取部门名称失败: {}", e.getMessage()); + } + } + + // 格式化工时显示 + String hoursDisplay = "未知"; + if (item.getEstimatedHours() != null) { + java.math.BigDecimal hours = item.getEstimatedHours(); + if (hours.compareTo(java.math.BigDecimal.ONE) >= 0) { + hoursDisplay = hours.intValue() + "小时"; + } else { + int minutes = hours.multiply(java.math.BigDecimal.valueOf(60)).intValue(); + hoursDisplay = minutes + "分钟"; + } + } + + content.append(" \n"); + content.append("▸ **").append(deptName).append("** | ") + .append(item.getTotalScore() != null ? item.getTotalScore() : 0).append("分 | ") + .append(hoursDisplay).append(" \n"); + + // 解析并显示任务类型明细 + if (item.getTypeDetails() != null && !item.getTypeDetails().isEmpty()) { + try { + @SuppressWarnings("unchecked") + java.util.List> typeDetails = + objectMapper.readValue(item.getTypeDetails(), java.util.List.class); + for (java.util.Map detail : typeDetails) { + String typeName = String.valueOf(detail.get("typeName")); + Object qtyObj = detail.get("quantity"); + Object scoreObj = detail.get("totalScore"); + int qty = qtyObj instanceof Number ? ((Number) qtyObj).intValue() : 1; + String score = scoreObj != null ? String.valueOf(scoreObj) : "0"; + content.append("  └ ").append(typeName) + .append(" ×").append(qty) + .append(" = ").append(score).append("分 \n"); + } + } catch (Exception e) { + log.warn("解析任务类型明细失败: {}", e.getMessage()); + } + } } + content.append(" \n"); + // 发起人信息 if (mainTask.getPublisherName() != null && !mainTask.getPublisherName().isEmpty()) { - content.append("发起人:").append(mainTask.getPublisherName()).append(" \n"); + content.append("**发起人**:").append(mainTask.getPublisherName()).append(" \n"); } if (mainTask.getPublisherDeptName() != null && !mainTask.getPublisherDeptName().isEmpty()) { - content.append("发起部门:").append(mainTask.getPublisherDeptName()).append(" \n"); + content.append("**发起部门**:").append(mainTask.getPublisherDeptName()).append(" \n"); } content.append(" \n"); - content.append("-------------------------------- \n"); - content.append("前往抢单:qd.yydd.ai \n"); - content.append("--------------------------------"); + content.append("点击下方按钮查看详情"); dingTalkService.sendRobotMessage(title, content.toString()); log.info("第 {} 组 {} 个子任务已发布到任务大厅,已发送钉钉群通知", groupNo, groupItems.size());