fix: 统一第二轮子任务组发布的钉钉通知模板与第一轮格式一致

This commit is contained in:
Your Name 2026-01-07 20:47:09 +08:00
parent 6fc888458a
commit b42a0f51fa

View File

@ -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<java.util.Map<String, Object>> typeDetails =
objectMapper.readValue(item.getTypeDetails(), java.util.List.class);
for (java.util.Map<String, Object> 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());