package model import ( "fmt" "time" "go.uber.org/zap" "gorm.io/gorm" ) type DocumentScore struct { Id int64 `form:"id" json:"id,omitempty" gorm:"primaryKey;autoIncrement;column:id;comment:;"` DocumentId int64 `form:"document_id" json:"document_id,omitempty" gorm:"column:document_id;type:bigint(20);size:20;default:0;comment:文档ID;index:idx_document_user,unique"` UserId int64 `form:"user_id" json:"user_id,omitempty" gorm:"column:user_id;type:bigint(20);size:20;default:0;comment:用户ID;index:idx_document_user,unique"` Score int `form:"score" json:"score,omitempty" gorm:"column:score;type:int(11);size:11;default:0;comment:文档评分值,3位数,如500表示5分;"` CreatedAt *time.Time `form:"created_at" json:"created_at,omitempty" gorm:"column:created_at;type:datetime;comment:创建时间;"` UpdatedAt *time.Time `form:"updated_at" json:"updated_at,omitempty" gorm:"column:updated_at;type:datetime;comment:更新时间;"` } func (DocumentScore) TableName() string { return tablePrefix + "document_score" } // CreateDocumentScore 创建DocumentScore func (m *DBModel) CreateDocumentScore(documentScore *DocumentScore) (err error) { doc, _ := m.GetDocument(documentScore.DocumentId, "id", "score_count", "score") if doc.Id == 0 { err = fmt.Errorf("文档不存在") return } tx := m.db.Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() // 创建评分记录 err = tx.Create(documentScore).Error if err != nil { m.logger.Error("CreateDocumentScore", zap.Error(err)) return } score := (documentScore.Score + doc.Score*doc.ScoreCount) / (doc.ScoreCount + 1) // 对应文档,评分总数+1,评分总值+score err = tx.Model(&Document{}).Where("id = ?", documentScore.DocumentId).Updates( map[string]interface{}{ "score_count": gorm.Expr("score_count + ?", 1), "score": score, }, ).Error if err != nil { m.logger.Error("CreateDocumentScore", zap.Error(err)) return } return } // GetDocumentScore 获取DocumentScore func (m *DBModel) GetDocumentScore(userId, documentId int64) (documentScore DocumentScore, err error) { err = m.db.Where("user_id = ? and document_id = ?", userId, documentId).Find(&documentScore).Error return }