feat: 建立统一检测任务、样本链与发病事件
This commit is contained in:
@@ -14,6 +14,7 @@ import (
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
)
|
||||
|
||||
// RegisterLampRoutes 注册 LAMP 检测路由
|
||||
@@ -79,6 +80,10 @@ func createLampTest(db *gorm.DB) gin.HandlerFunc {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "batchId 不是合法的 UUID"})
|
||||
return
|
||||
}
|
||||
if t.DetectionTaskID != nil && !isUUID(*t.DetectionTaskID) {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "detectionTaskId 不是合法的 UUID"})
|
||||
return
|
||||
}
|
||||
if t.Status == "" {
|
||||
t.Status = "pending"
|
||||
}
|
||||
@@ -127,6 +132,8 @@ func judgeQPCR(db *gorm.DB) gin.HandlerFunc {
|
||||
db.Model(&model.LampTest{}).Where("id = ?", id).Updates(map[string]interface{}{
|
||||
"extra_data": raw, "result": result, "status": "resulted", "resulted_at": now,
|
||||
})
|
||||
_ = syncDetectionTaskFromLamp(db, id)
|
||||
_ = ensureDiseaseEventForLamp(db, id)
|
||||
_ = runCrossValidation(db, id, result)
|
||||
db.Where("id = ?", id).First(&t)
|
||||
c.JSON(http.StatusOK, t)
|
||||
@@ -312,12 +319,81 @@ func updateLampTest(db *gorm.DB) gin.HandlerFunc {
|
||||
// 交叉验证:结果落库后与同房间最近巡检比对
|
||||
if resultSet && resultValue != "" {
|
||||
_ = runCrossValidation(db, id, resultValue)
|
||||
_ = syncDetectionTaskFromLamp(db, id)
|
||||
_ = ensureDiseaseEventForLamp(db, id)
|
||||
}
|
||||
db.Where("id = ?", id).First(&t)
|
||||
c.JSON(http.StatusOK, t)
|
||||
}
|
||||
}
|
||||
|
||||
// syncDetectionTaskFromLamp LAMP 结果同步到统一检测任务。
|
||||
func syncDetectionTaskFromLamp(db *gorm.DB, lampID string) error {
|
||||
var t model.LampTest
|
||||
if err := db.Where("id = ?", lampID).First(&t).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if t.DetectionTaskID == nil || t.Result == nil {
|
||||
return nil
|
||||
}
|
||||
return db.Model(&model.DetectionTask{}).Where("id = ?", *t.DetectionTaskID).
|
||||
Updates(map[string]interface{}{
|
||||
"result": *t.Result,
|
||||
"status": "completed",
|
||||
"resulted_at": t.ResultedAt,
|
||||
}).Error
|
||||
}
|
||||
|
||||
// ensureDiseaseEventForLamp 有效阳性结果创建发病事件,重复结果不重复建单。
|
||||
func ensureDiseaseEventForLamp(db *gorm.DB, lampID string) error {
|
||||
var t model.LampTest
|
||||
if err := db.Where("id = ?", lampID).First(&t).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if t.Result == nil || *t.Result != "positive" {
|
||||
return nil
|
||||
}
|
||||
disease := "待确认"
|
||||
var diseases []string
|
||||
if len(t.Diseases) > 0 {
|
||||
_ = json.Unmarshal(t.Diseases, &diseases)
|
||||
if len(diseases) > 0 {
|
||||
disease = diseases[0]
|
||||
}
|
||||
}
|
||||
now := time.Now()
|
||||
evidence, _ := json.Marshal(map[string]interface{}{
|
||||
"result": *t.Result,
|
||||
"method": t.Method,
|
||||
"resultedAt": t.ResultedAt,
|
||||
"lampTestId": t.ID,
|
||||
"operatorId": t.OperatorID,
|
||||
})
|
||||
sourceKey := "lamp-" + t.ID
|
||||
event := model.DiseaseEvent{
|
||||
SourceKey: sourceKey,
|
||||
RoomID: t.RoomID,
|
||||
BatchID: t.BatchID,
|
||||
DetectionTaskID: t.DetectionTaskID,
|
||||
LampTestID: &t.ID,
|
||||
Disease: disease,
|
||||
Status: "confirmed",
|
||||
Evidence: evidence,
|
||||
ConfirmedAt: &now,
|
||||
ConfirmedBy: t.OperatorID,
|
||||
}
|
||||
if err := db.Clauses(clause.OnConflict{
|
||||
Columns: []clause.Column{{Name: "source_key"}},
|
||||
DoNothing: true,
|
||||
}).Create(&event).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if event.ID == "" {
|
||||
_ = db.Where("source_key = ?", sourceKey).First(&event).Error
|
||||
}
|
||||
return ensureTraceForDiseaseEvent(db, event)
|
||||
}
|
||||
|
||||
// runCrossValidation 用同房间最近的巡检记录做交叉验证,并回写 cross_status/cross_reason
|
||||
func runCrossValidation(db *gorm.DB, lampTestID, lampResult string) error {
|
||||
var t model.LampTest
|
||||
@@ -376,8 +452,8 @@ func getLampCrossValidation(db *gorm.DB) gin.HandlerFunc {
|
||||
}
|
||||
}
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"crossStatus": t.CrossStatus,
|
||||
"crossReason": t.CrossReason,
|
||||
"crossStatus": t.CrossStatus,
|
||||
"crossReason": t.CrossReason,
|
||||
"relatedInspection": related,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user