package com.vincent.rsf.server.ai.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.server.ai.model.AiPromptContext; import com.vincent.rsf.server.manager.entity.Task; import com.vincent.rsf.server.manager.enums.TaskStsType; import com.vincent.rsf.server.manager.enums.TaskType; import com.vincent.rsf.server.manager.mapper.TaskMapper; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; @Service public class AiTaskSummaryService implements AiPromptContextProvider { @Resource private TaskMapper taskMapper; @Override public boolean supports(AiPromptContext context) { if (context == null || context.getQuestion() == null) { return false; } String normalized = context.getQuestion().toLowerCase(Locale.ROOT); return normalized.contains("task") || normalized.contains("任务") || normalized.contains("出库任务") || normalized.contains("入库任务") || normalized.contains("移库任务") || normalized.contains("备货任务"); } @Override public String buildContext(AiPromptContext context) { List activeTasks = taskMapper.selectList(new LambdaQueryWrapper() .select(Task::getTaskCode, Task::getTaskStatus, Task::getTaskType, Task::getOrgLoc, Task::getTargLoc, Task::getUpdateTime) .eq(Task::getStatus, 1)); Map statusCounters = new LinkedHashMap<>(); Map typeCounters = new LinkedHashMap<>(); for (Task task : activeTasks) { Integer taskStatus = task.getTaskStatus(); Integer taskType = task.getTaskType(); statusCounters.put(taskStatus, statusCounters.getOrDefault(taskStatus, 0L) + 1); typeCounters.put(taskType, typeCounters.getOrDefault(taskType, 0L) + 1); } List latestTasks = taskMapper.selectList(new LambdaQueryWrapper() .select(Task::getTaskCode, Task::getTaskStatus, Task::getTaskType, Task::getOrgLoc, Task::getTargLoc, Task::getUpdateTime) .eq(Task::getStatus, 1) .orderByDesc(Task::getUpdateTime) .last("limit 5")); StringBuilder summary = new StringBuilder(); summary.append("以下是基于 man_task 的实时汇总,请优先依据这些任务数据回答;如果用户问题超出任务表范围,请明确说明。"); summary.append("\n任务总览:共 ") .append(activeTasks.size()) .append(" 条有效任务。"); if (!statusCounters.isEmpty()) { summary.append("\n任务状态分布:") .append(formatStatuses(statusCounters)) .append("。"); } if (!typeCounters.isEmpty()) { summary.append("\n任务类型分布:") .append(formatTypes(typeCounters)) .append("。"); } if (!latestTasks.isEmpty()) { summary.append("\n最近更新任务 TOP5:") .append(formatLatestTasks(latestTasks)) .append("。"); } return summary.toString(); } private String formatStatuses(Map rows) { List parts = new ArrayList<>(); for (Map.Entry row : rows.entrySet()) { parts.add(resolveTaskStatus(row.getKey()) + " " + row.getValue() + " 条"); } return String.join(",", parts); } private String formatTypes(Map rows) { List parts = new ArrayList<>(); for (Map.Entry row : rows.entrySet()) { parts.add(resolveTaskType(row.getKey()) + " " + row.getValue() + " 条"); } return String.join(",", parts); } private String formatLatestTasks(List tasks) { List parts = new ArrayList<>(); for (Task task : tasks) { parts.add((task.getTaskCode() == null ? "未命名任务" : task.getTaskCode()) + "(" + resolveTaskType(task.getTaskType()) + "," + resolveTaskStatus(task.getTaskStatus()) + ",源库位 " + emptyToDash(task.getOrgLoc()) + ",目标库位 " + emptyToDash(task.getTargLoc()) + ")"); } return String.join(";", parts); } private String resolveTaskStatus(Integer taskStatus) { if (taskStatus == null) { return "未知状态"; } for (TaskStsType item : TaskStsType.values()) { if (item.id.equals(taskStatus)) { return item.desc; } } return "状态" + taskStatus; } private String resolveTaskType(Integer taskType) { if (taskType == null) { return "未知类型"; } for (TaskType item : TaskType.values()) { if (item.type.equals(taskType)) { return item.desc; } } return "类型" + taskType; } private String emptyToDash(String value) { return value == null || value.trim().isEmpty() ? "-" : value; } }