#AI
zhou zhou
6 小时以前 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
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.system.entity.OperationRecord;
import com.vincent.rsf.server.system.service.OperationRecordService;
import org.springframework.stereotype.Service;
 
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
 
@Service
public class AiOperationRecordSummaryService implements AiDiagnosticDataProvider {
 
    private static final String TOOL_CODE = "operation_record";
    private static final String TOOL_NAME = "异常操作日志";
 
    @Resource
    private OperationRecordService operationRecordService;
    @Resource
    private com.vincent.rsf.server.ai.config.AiProperties aiProperties;
 
    /**
     * 返回异常操作日志工具默认顺序。
     */
    @Override
    public int getOrder() {
        return 40;
    }
 
    /**
     * 返回异常操作日志工具编码。
     */
    @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) {
        Date start = new Date(System.currentTimeMillis() - aiProperties.getDiagnosticLogWindowHours() * 3600_000L);
        List<OperationRecord> records = operationRecordService.list(new LambdaQueryWrapper<OperationRecord>()
                .eq(OperationRecord::getTenantId, context.getTenantId())
                .eq(OperationRecord::getResult, 0)
                .ge(OperationRecord::getCreateTime, start)
                .orderByDesc(OperationRecord::getCreateTime)
                .last("limit 10"));
        Map<String, Object> meta = new LinkedHashMap<>();
        meta.put("count", records.size());
        if (records.isEmpty()) {
            return new AiDiagnosticToolResult()
                    .setToolCode(getToolCode())
                    .setToolName(getToolName())
                    .setSeverity("INFO")
                    .setSummaryText("最近 " + aiProperties.getDiagnosticLogWindowHours() + " 小时未发现操作日志失败记录。")
                    .setRawMeta(meta);
        }
        List<String> parts = new ArrayList<>();
        for (OperationRecord item : records) {
            parts.add((item.getNamespace() == null ? "未知操作" : item.getNamespace())
                    + "("
                    + (item.getErr() == null ? "无异常描述" : item.getErr())
                    + ")");
        }
        meta.put("latestErrors", parts);
        return new AiDiagnosticToolResult()
                .setToolCode(getToolCode())
                .setToolName(getToolName())
                .setSeverity("WARN")
                .setSummaryText("最近 " + aiProperties.getDiagnosticLogWindowHours() + " 小时发现 " + records.size() + " 条失败操作记录,最近异常包括:" + String.join(";", parts))
                .setRawMeta(meta);
    }
 
}