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 records = operationRecordService.list(new LambdaQueryWrapper() .eq(OperationRecord::getTenantId, context.getTenantId()) .eq(OperationRecord::getResult, 0) .ge(OperationRecord::getCreateTime, start) .orderByDesc(OperationRecord::getCreateTime) .last("limit 10")); Map 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 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); } }