#AI
zhou zhou
4 小时以前 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
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 javax.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;
    }
 
}