From 6b59a711b9af0825858c408cdba95102b8b51cb3 Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期五, 13 十二月 2024 15:46:44 +0800
Subject: [PATCH] 结果表增加联合唯一索引,防止重复报警

---
 service/task_results.go |   14 ++++++-
 models/gather_model.go  |   27 ++++++++-----
 db/task_results.go      |   55 ++++++++++++++++++++++-----
 3 files changed, 72 insertions(+), 24 deletions(-)

diff --git a/db/task_results.go b/db/task_results.go
index e94c98a..ae4367d 100644
--- a/db/task_results.go
+++ b/db/task_results.go
@@ -8,17 +8,19 @@
 
 type ModelTaskResults struct {
 	BaseModel
-	Title       string `json:"name" gorm:"type:varchar(255)"`                                            //棰勮鍚嶇О,鏆傛椂鐢ㄤ换鍔″悕绉�
-	Event       string `json:"event" gorm:"type:varchar(255)"`                                           //棰勮浜嬩欢
-	ModelID     string `json:"modelID" gorm:"type:varchar(255)"`                                         //妯″瀷ID
-	ModelTaskID string `json:"modelTaskID" gorm:"type:varchar(255)"`                                     //妯″瀷浠诲姟ID
-	OrgID       string `json:"orgID" gorm:"index;column:org_id;type:varchar(299);not null;"`             //娲惧嚭鎵� domain unit ID
-	CommunityId string `json:"communityID" gorm:"index;column:community_id;type:varchar(299);not null;"` //灏忓尯ID
-	ObjectIds   string `json:"objectIds" gorm:"type:text"`                                               //浜嬩欢瀵硅薄锛屽彲浠ユ槸浜猴紝澶氫釜鐢ㄩ�楀彿鍒嗛殧
-	Location    string `json:"location" gorm:"type:varchar(255)"`                                        //鍙戠敓鍦扮偣
-	Building    string `json:"building" gorm:"type:varchar(255);"`                                       //妤兼爧
-	Floor       string `json:"floor"       gorm:"type:varchar(255);"`                                    //妤煎眰
-	PicDate     string `json:"picDate"       gorm:"type:varchar(255);"`                                  //鎶撴媿鏃堕棿
+	Title         string `json:"name" gorm:"type:varchar(255)"`                                                //棰勮鍚嶇О,鏆傛椂鐢ㄤ换鍔″悕绉�
+	Event         string `json:"event" gorm:"type:varchar(255)"`                                               //棰勮浜嬩欢
+	ModelID       string `json:"modelID" gorm:"type:varchar(255)"`                                             //妯″瀷ID
+	ModelTaskID   string `json:"modelTaskID" gorm:"type:varchar(255)"`                                         //妯″瀷浠诲姟ID
+	OrgID         string `json:"orgID" gorm:"index;column:org_id;type:varchar(299);not null;"`                 //娲惧嚭鎵� domain unit ID
+	CommunityId   string `json:"communityID" gorm:"index;column:community_id;type:varchar(299);not null;"`     //灏忓尯ID
+	PicDate       string `json:"picDate"       gorm:"uniqueIndex:pic_date_first_person_id;type:varchar(255);"` //鎶撴媿鏃堕棿
+	FirstPersonID string `json:"-" gorm:"uniqueIndex:pic_date_first_person_id;type:varchar(255);"`             //绗竴涓汉鐨処D
+	ObjectIds     string `json:"objectIds" gorm:"type:text"`                                                   //浜嬩欢瀵硅薄锛屽彲浠ユ槸浜猴紝澶氫釜鐢ㄩ�楀彿鍒嗛殧
+	Location      string `json:"location" gorm:"type:varchar(255)"`                                            //鍙戠敓鍦扮偣
+	Building      string `json:"building" gorm:"type:varchar(255);"`                                           //妤兼爧
+	Floor         string `json:"floor"       gorm:"type:varchar(255);"`                                        //妤煎眰
+
 }
 
 func (m *ModelTaskResults) TableName() string {
@@ -67,6 +69,16 @@
 	return slf
 }
 
+func (slf *ModelTaskResultsSearch) SetFirstPersonId(firstId string) *ModelTaskResultsSearch {
+	slf.FirstPersonID = firstId
+	return slf
+}
+
+func (slf *ModelTaskResultsSearch) SetPicDate(picDate string) *ModelTaskResultsSearch {
+	slf.PicDate = picDate
+	return slf
+}
+
 func (slf *ModelTaskResultsSearch) build() *gorm.DB {
 	var db = slf.Orm.Table(slf.TableName())
 	if slf.Order != "" {
@@ -75,6 +87,14 @@
 
 	if slf.ID != "" {
 		db = db.Where("id = ?", slf.ID)
+	}
+
+	if slf.PicDate != "" {
+		db = db.Where("pic_date = ?", slf.PicDate)
+	}
+
+	if slf.FirstPersonID != "" {
+		db = db.Where("first_person_id = ?", slf.FirstPersonID)
 	}
 
 	if slf.Keyword != "" {
@@ -163,6 +183,19 @@
 	return nil
 }
 
+func (slf *ModelTaskResultsSearch) FirstOrCreate(record *ModelTaskResults) error {
+	var db = slf.build()
+	var exists ModelTaskResults
+	if err := db.First(&exists).Error; err == nil {
+		return nil
+	}
+	if err2 := slf.Orm.Table(slf.TableName()).Create(record).Error; err2 != nil {
+		return fmt.Errorf("FirstOrCreate err: %v, record: %+v", err2, record)
+	}
+
+	return nil
+}
+
 func (slf *ModelTaskResultsSearch) Save(record *ModelTaskResults) error {
 	var db = slf.build()
 	record.UpdatedAt = time.Now()
diff --git a/models/gather_model.go b/models/gather_model.go
index 050065d..59187ce 100644
--- a/models/gather_model.go
+++ b/models/gather_model.go
@@ -133,18 +133,23 @@
 	}
 	event := strings.Join(typeNames, ",")
 	for lt, persons := range aggregation {
+		if persons.Size() == 0 {
+			continue
+		}
+		personIds := persons.Elements()
 		result := &db.ModelTaskResults{
-			Title:       m.Task.Name,
-			Event:       fmt.Sprintf("%s/%d浜�", event, len(persons)),
-			ModelID:     m.Task.ModelID,
-			ModelTaskID: m.Task.ID,
-			CommunityId: lt.CommunityId,
-			OrgID:       lt.OrgId,
-			ObjectIds:   strings.Join(persons.Elements(), ","),
-			Location:    lt.Location,
-			Building:    lt.Building,
-			Floor:       lt.Floor,
-			PicDate:     lt.Time,
+			Title:         m.Task.Name,
+			Event:         fmt.Sprintf("%s/%d浜�", event, len(persons)),
+			ModelID:       m.Task.ModelID,
+			ModelTaskID:   m.Task.ID,
+			CommunityId:   lt.CommunityId,
+			OrgID:         lt.OrgId,
+			ObjectIds:     strings.Join(personIds, ","),
+			Location:      lt.Location,
+			Building:      lt.Building,
+			Floor:         lt.Floor,
+			PicDate:       lt.Time,
+			FirstPersonID: personIds[0],
 		}
 		results = append(results, result)
 	}
diff --git a/service/task_results.go b/service/task_results.go
index bdeef8f..56e3ce8 100644
--- a/service/task_results.go
+++ b/service/task_results.go
@@ -1,7 +1,17 @@
 package service
 
-import "model-engine/db"
+import (
+	"model-engine/db"
+	"model-engine/pkg/logger"
+)
 
 func SaveTaskResults(results []*db.ModelTaskResults) error {
-	return db.NewModelTaskResultsSearch().BatchCreate(results)
+	for _, v := range results {
+		err := db.NewModelTaskResultsSearch().SetPicDate(v.PicDate).SetFirstPersonId(v.FirstPersonID).FirstOrCreate(v)
+		if err != nil {
+			logger.Errorf("save task result err:%v", err)
+			return err
+		}
+	}
+	return nil
 }

--
Gitblit v1.8.0