feat(server-go): 风险评分引擎(#9,公式/分级/阶段与环境系数)接入巡检
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user