feat(server-go): 风险评分引擎(#9,公式/分级/阶段与环境系数)接入巡检

This commit is contained in:
weijuesen
2026-08-12 17:02:06 +08:00
parent 971e1546f0
commit 93301f0bf3
3 changed files with 209 additions and 0 deletions
+55
View File
@@ -112,6 +112,23 @@ func createInspection(db *gorm.DB, s3 *service.S3Service, ai *service.AIClient,
} else {
raw, _ := json.Marshal(detRes.Detections)
rec.Detections = raw
// 风险评分(#9):AI 置信度取检测结果最大值;环境/阶段系数在有 roomId 时按房间数据计算
aiConf := 0.0
for _, d := range detRes.Detections {
if d.Confidence > aiConf {
aiConf = d.Confidence
}
}
stageCoef, envCoef := loadRoomRisk(db, roomID)
score := service.ComputeRiskScore(service.RiskInput{
AI: aiConf,
Env: envCoef,
Stage: stageCoef,
})
rec.RiskScore = &score
level := service.RiskLevel(score)
rec.RiskLevel = &level
}
if err := db.Create(&rec).Error; err != nil {
@@ -130,6 +147,44 @@ func createInspection(db *gorm.DB, s3 *service.S3Service, ai *service.AIClient,
}
}
// loadRoomRisk 加载房间阶段系数与环境系数(无房间/无数据时返回 0)
func loadRoomRisk(db *gorm.DB, roomID string) (stageCoef, envCoef float64) {
if roomID == "" {
return 0, 0
}
var room model.Room
if db.Where("id = ?", roomID).First(&room).Error != nil {
return 0, 0
}
if room.Stage != nil {
stageCoef = service.StageCoefficient(*room.Stage)
}
var humidity, temperature *float64
var h model.Telemetry
if err := db.Table("telemetry").
Select("telemetry.value").
Joins("JOIN devices ON devices.device_key = telemetry.device_key AND devices.room_id = ?", roomID).
Where("telemetry.metric = ?", "humidity").
Order("telemetry.timestamp DESC").
Limit(1).
First(&h).Error; err == nil {
humidity = &h.Value
}
var t model.Telemetry
if err := db.Table("telemetry").
Select("telemetry.value").
Joins("JOIN devices ON devices.device_key = telemetry.device_key AND devices.room_id = ?", roomID).
Where("telemetry.metric = ?", "temperature").
Order("telemetry.timestamp DESC").
Limit(1).
First(&t).Error; err == nil {
temperature = &t.Value
}
envCoef = service.EnvCoefficient(temperature, humidity)
return stageCoef, envCoef
}
// listInspections 巡检记录列表(roomId/limit 过滤)
func listInspections(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {