#AI
zhou zhou
14 小时以前 51877df13075ad10ef51107f15bcd21f1661febe
rsf-server/src/main/java/com/vincent/rsf/server/ai/service/provider/AiTaskSummaryService.java
File was renamed from rsf-server/src/main/java/com/vincent/rsf/server/ai/service/AiTaskSummaryService.java
@@ -1,6 +1,7 @@
package com.vincent.rsf.server.ai.service;
package com.vincent.rsf.server.ai.service.provider;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.vincent.rsf.server.ai.model.AiDiagnosticToolResult;
import com.vincent.rsf.server.ai.model.AiPromptContext;
import com.vincent.rsf.server.manager.entity.Task;
import com.vincent.rsf.server.manager.enums.TaskStsType;
@@ -12,27 +13,62 @@
import java.util.*;
@Service
public class AiTaskSummaryService implements AiPromptContextProvider {
public class AiTaskSummaryService implements AiDiagnosticDataProvider {
    private static final String TOOL_CODE = "task_summary";
    private static final String TOOL_NAME = "任务摘要";
    @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("备货任务");
    public int getOrder() {
        return 20;
    }
    /**
     * 返回任务工具编码。
     */
    @Override
    public String buildContext(AiPromptContext context) {
    public String getToolCode() {
        return TOOL_CODE;
    }
    /**
     * 返回任务工具展示名。
     */
    @Override
    public String getToolName() {
        return TOOL_NAME;
    }
    /**
     * 返回任务工具默认说明。
     */
    @Override
    public String getDefaultToolPrompt() {
        return "结合任务摘要识别积压、异常状态和最近变更任务。";
    }
    /**
     * 汇总任务状态和最近变更任务,生成任务摘要工具结果。
     */
    @Override
    public AiDiagnosticToolResult buildDiagnosticData(AiPromptContext context) {
        return new AiDiagnosticToolResult()
                .setToolCode(getToolCode())
                .setToolName(getToolName())
                .setSeverity("INFO")
                .setSummaryText(buildTaskSummary());
    }
    /**
     * 基于 man_task 生成任务总览、状态分布、类型分布和最近任务摘要。
     */
    private String buildTaskSummary() {
        List<Task> activeTasks = taskMapper.selectList(new LambdaQueryWrapper<Task>()
                .select(Task::getTaskCode, Task::getTaskStatus, Task::getTaskType, Task::getOrgLoc, Task::getTargLoc, Task::getUpdateTime)
                .eq(Task::getStatus, 1));
@@ -75,6 +111,9 @@
        return summary.toString();
    }
    /**
     * 格式化任务状态统计。
     */
    private String formatStatuses(Map<Integer, Long> rows) {
        List<String> parts = new ArrayList<>();
        for (Map.Entry<Integer, Long> row : rows.entrySet()) {
@@ -83,6 +122,9 @@
        return String.join(",", parts);
    }
    /**
     * 格式化任务类型统计。
     */
    private String formatTypes(Map<Integer, Long> rows) {
        List<String> parts = new ArrayList<>();
        for (Map.Entry<Integer, Long> row : rows.entrySet()) {
@@ -91,6 +133,9 @@
        return String.join(",", parts);
    }
    /**
     * 格式化最近更新任务列表。
     */
    private String formatLatestTasks(List<Task> tasks) {
        List<String> parts = new ArrayList<>();
        for (Task task : tasks) {
@@ -106,6 +151,9 @@
        return String.join(";", parts);
    }
    /**
     * 将任务状态编码转换为可读文案。
     */
    private String resolveTaskStatus(Integer taskStatus) {
        if (taskStatus == null) {
            return "未知状态";
@@ -118,6 +166,9 @@
        return "状态" + taskStatus;
    }
    /**
     * 将任务类型编码转换为可读文案。
     */
    private String resolveTaskType(Integer taskType) {
        if (taskType == null) {
            return "未知类型";
@@ -130,7 +181,13 @@
        return "类型" + taskType;
    }
    /**
     * 统一处理空字符串显示。
     */
    private String emptyToDash(String value) {
        return value == null || value.trim().isEmpty() ? "-" : value;
    }
}