#AI
zhou zhou
7 小时以前 51877df13075ad10ef51107f15bcd21f1661febe
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
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;
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 AiDiagnosticDataProvider {
 
    private static final String TOOL_CODE = "task_summary";
    private static final String TOOL_NAME = "任务摘要";
 
    @Resource
    private TaskMapper taskMapper;
 
    /**
     * 返回任务工具默认顺序。
     */
    @Override
    public int getOrder() {
        return 20;
    }
 
    /**
     * 返回任务工具编码。
     */
    @Override
    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));
 
        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;
    }
}