package com.vincent.rsf.server.ai.service.diagnosis; import com.vincent.rsf.framework.common.SnowflakeIdWorker; import com.vincent.rsf.server.system.entity.AiCallLog; import com.vincent.rsf.server.system.entity.AiDiagnosisRecord; import com.vincent.rsf.server.system.service.AiCallLogService; import com.vincent.rsf.server.system.service.AiDiagnosisRecordService; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; import java.util.Date; @Service public class AiDiagnosisRuntimeService { @Resource private AiDiagnosisRecordService aiDiagnosisRecordService; @Resource private AiCallLogService aiCallLogService; @Resource private SnowflakeIdWorker snowflakeIdWorker; @Resource private AiDiagnosisReportService aiDiagnosisReportService; /** * 在诊断开始时创建一条诊断记录,并标记为“进行中”。 */ public AiDiagnosisRecord startDiagnosis(Long tenantId, Long userId, String sessionId, String sceneCode, String question) { AiDiagnosisRecord record = new AiDiagnosisRecord() .setDiagnosisNo(String.valueOf(snowflakeIdWorker.nextId()).substring(3)) .setTenantId(tenantId) .setUserId(userId) .setSessionId(sessionId) .setSceneCode(sceneCode) .setQuestion(question) .setResult(2) .setStatus(1) .setDeleted(0) .setStartTime(new Date()) .setCreateTime(new Date()) .setUpdateTime(new Date()); aiDiagnosisRecordService.save(record); return record; } /** * 将诊断记录标记为成功,并补齐报告内容、模型信息和耗时。 */ public void finishDiagnosisSuccess(AiDiagnosisRecord record, String conclusion, String modelCode, String toolSummary) { if (record == null) { return; } Date now = new Date(); record.setConclusion(conclusion); aiDiagnosisReportService.fillReport(record, conclusion, toolSummary); record.setModelCode(modelCode); record.setToolSummary(toolSummary); record.setResult(1); record.setEndTime(now); record.setSpendTime(now.getTime() - record.getStartTime().getTime()); record.setUpdateTime(now); aiDiagnosisRecordService.updateById(record); } /** * 将诊断记录标记为失败,并保留已有结论、错误信息和工具轨迹。 */ public void finishDiagnosisFailure(AiDiagnosisRecord record, String conclusion, String err, String toolSummary) { if (record == null) { return; } Date now = new Date(); record.setConclusion(conclusion); aiDiagnosisReportService.fillReport(record, conclusion, toolSummary); record.setToolSummary(toolSummary); record.setErr(err); record.setResult(0); record.setEndTime(now); record.setSpendTime(record.getStartTime() == null ? null : now.getTime() - record.getStartTime().getTime()); record.setUpdateTime(now); aiDiagnosisRecordService.updateById(record); } /** * 保存一次模型调用日志,供审计、统计和故障定位使用。 */ public AiCallLog saveCallLog(Long tenantId, Long userId, String sessionId, Long diagnosisId, String routeCode, String modelCode, Integer attemptNo, Date requestTime, Date responseTime, Integer result, String err) { AiCallLog log = new AiCallLog() .setTenantId(tenantId) .setUserId(userId) .setSessionId(sessionId) .setDiagnosisId(diagnosisId) .setRouteCode(routeCode) .setModelCode(modelCode) .setAttemptNo(attemptNo) .setRequestTime(requestTime) .setResponseTime(responseTime) .setSpendTime(requestTime == null || responseTime == null ? null : responseTime.getTime() - requestTime.getTime()) .setResult(result) .setErr(err) .setStatus(1) .setDeleted(0) .setCreateTime(responseTime == null ? new Date() : responseTime); aiCallLogService.save(log); return log; } }