You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

68 lines
2.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
}