1
3 天以前 29e065d613bba9acba303f82eacffcc9002860ed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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<Task> activeTasks = taskMapper.selectList(new LambdaQueryWrapper<Task>()
                .select(Task::getTaskCode, Task::getTaskStatus, Task::getTaskType, Task::getOrgLoc, Task::getTargLoc, Task::getUpdateTime)
                .eq(Task::getStatus, 1));
 
        Map<Integer, Long> statusCounters = new LinkedHashMap<>();
        Map<Integer, Long> 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<Task> latestTasks = taskMapper.selectList(new LambdaQueryWrapper<Task>()
                .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<Integer, Long> rows) {
        List<String> parts = new ArrayList<>();
        for (Map.Entry<Integer, Long> row : rows.entrySet()) {
            parts.add(resolveTaskStatus(row.getKey()) + " " + row.getValue() + " 条");
        }
        return String.join(",", parts);
    }
 
    private String formatTypes(Map<Integer, Long> rows) {
        List<String> parts = new ArrayList<>();
        for (Map.Entry<Integer, Long> row : rows.entrySet()) {
            parts.add(resolveTaskType(row.getKey()) + " " + row.getValue() + " 条");
        }
        return String.join(",", parts);
    }
 
    private String formatLatestTasks(List<Task> tasks) {
        List<String> 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;
    }
}