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);
|
}
|
|
}
|