refactor: 删除 CreateSSData 函数并更新 GetScore 函数以处理数据插入和更新逻辑,同时修改 PlayerDataLite 的表名为 blRecordData

This commit is contained in:
lixiangwuxian 2025-07-19 18:06:13 +08:00
parent 527766ebd6
commit 95b319ad15
4 changed files with 84 additions and 49 deletions

View File

@ -1,7 +1,6 @@
package beatleader package beatleader
import ( import (
"database/sql"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
@ -114,62 +113,97 @@ func (bl *blQuery) GetScore(qqId string) (currentData *PlayerDataLite, lastData
// 构建 PlayerDataLite 结构体 // 构建 PlayerDataLite 结构体
dataLite := data.ToDataLite() dataLite := data.ToDataLite()
newBLData := service.BLData{
ID: dataLite.ID,
Name: dataLite.Name,
Country: dataLite.Country,
PP: dataLite.PP,
Rank: dataLite.Rank,
CountryRank: dataLite.CountryRank,
TotalScore: dataLite.TotalScore,
TotalRankedScore: dataLite.TotalRankedScore,
AverageRankedAccuracy: dataLite.AverageRankedAccuracy,
TotalPlayCount: dataLite.TotalPlayCount,
RankedPlayCount: dataLite.RankedPlayCount,
ReplaysWatched: dataLite.ReplaysWatched,
GeneratedTime: time.Now(),
}
// 查询最近的玩家数据 // 查询最近的玩家数据
var lastDataLite PlayerDataLite lastBLData, err := service.GetLatestBLData(dataLite.ID)
err = tx.Select("*").Where("id = ?", dataLite.ID).Order("generated_time DESC").Limit(1).Find(&lastDataLite).Error if err != nil {
if err != nil && err != sql.ErrNoRows {
log.Print(err) log.Print(err)
return nil, nil, err return nil, nil, err
} }
currentDataLite := PlayerDataLite{
ID: dataLite.ID,
Name: dataLite.Name,
Country: dataLite.Country,
PP: dataLite.PP,
Rank: dataLite.Rank,
CountryRank: dataLite.CountryRank,
TotalScore: dataLite.TotalScore,
TotalRankedScore: dataLite.TotalRankedScore,
AverageRankedAccuracy: dataLite.AverageRankedAccuracy,
TotalPlayCount: dataLite.TotalPlayCount,
RankedPlayCount: dataLite.RankedPlayCount,
ReplaysWatched: dataLite.ReplaysWatched,
GeneratedTime: time.Now().Format("2006-01-02 15:04:05.999999999-07:00"),
}
if lastBLData == nil || hasDataChanged(lastBLData, &newBLData) {
err = tx.Create(&newBLData).Error
if err != nil {
log.Print(err)
return nil, nil, err
}
err = tx.Delete(&service.BLData{ID: dataLite.ID}).Error
if err != nil {
log.Print(err)
return nil, nil, err
}
}
// 如果有新的数据,则插入 // 如果有新的数据,则插入
if lastDataLite.IsDiffFrom(dataLite) { if lastBLData == nil || hasDataChanged(lastBLData, &newBLData) {
//删掉旧数据 //删掉旧数据
err = tx.Delete(&PlayerDataLite{ID: dataLite.ID}).Error err = tx.Delete(&PlayerDataLite{ID: dataLite.ID}).Error
if err != nil { if err != nil {
log.Print(err) log.Print(err)
return nil, nil, err return nil, nil, err
} }
err = tx.Create(&PlayerDataLite{ err = tx.Create(&newBLData).Error
ID: dataLite.ID,
Name: dataLite.Name,
Country: dataLite.Country,
PP: dataLite.PP,
Rank: dataLite.Rank,
CountryRank: dataLite.CountryRank,
TotalScore: dataLite.TotalScore,
TotalRankedScore: dataLite.TotalRankedScore,
AverageRankedAccuracy: dataLite.AverageRankedAccuracy,
TotalPlayCount: dataLite.TotalPlayCount,
RankedPlayCount: dataLite.RankedPlayCount,
ReplaysWatched: dataLite.ReplaysWatched,
GeneratedTime: time.Now().Format("2006-01-02 15:04:05.999999999-07:00"),
}).Error
if err != nil { if err != nil {
log.Print(err) log.Print(err)
return nil, nil, err return nil, nil, err
} }
if lastBLData != nil {
// 提交事务 lastDataLite := PlayerDataLite{
err = tx.Commit().Error ID: lastBLData.ID,
if err != nil { Name: lastBLData.Name,
log.Print(err) Country: lastBLData.Country,
return nil, nil, err PP: lastBLData.PP,
Rank: lastBLData.Rank,
CountryRank: lastBLData.CountryRank,
TotalScore: lastBLData.TotalScore,
TotalRankedScore: lastBLData.TotalRankedScore,
AverageRankedAccuracy: lastBLData.AverageRankedAccuracy,
TotalPlayCount: lastBLData.TotalPlayCount,
RankedPlayCount: lastBLData.RankedPlayCount,
ReplaysWatched: lastBLData.ReplaysWatched,
GeneratedTime: lastBLData.GeneratedTime.Format("2006-01-02 15:04:05.999999999-07:00"),
}
// 返回差异信息
return &currentDataLite, &lastDataLite, tx.Commit().Error
} }
// 返回差异信息
return &dataLite, &lastDataLite, nil
} }
return &dataLite, nil, tx.Commit().Error
}
// 如果没有新数据,直接提交事务 func hasDataChanged(old *service.BLData, new *service.BLData) bool {
err = tx.Commit().Error return old.PP != new.PP || old.Rank != new.Rank || old.CountryRank != new.CountryRank ||
if err != nil { old.TotalScore != new.TotalScore || old.TotalRankedScore != new.TotalRankedScore
log.Print(err)
return nil, nil, err
}
// 返回当前数据的字符串表示
return &dataLite, nil, nil
} }
func (bl *blQuery) GetScoreWithoutUpdate(qqId string) (currentData *PlayerDataLite, err error) { func (bl *blQuery) GetScoreWithoutUpdate(qqId string) (currentData *PlayerDataLite, err error) {

View File

@ -425,7 +425,7 @@ type PlayerDataLite struct {
} }
func (p PlayerDataLite) TableName() string { func (p PlayerDataLite) TableName() string {
return "blData" return "blRecordData"
} }
func (p PlayerDataLite) IsDiffFrom(p2 PlayerDataLite) bool { func (p PlayerDataLite) IsDiffFrom(p2 PlayerDataLite) bool {

View File

@ -57,11 +57,6 @@ func GetLatestSSData(id string) (*SSData, error) {
return &data, err return &data, err
} }
func CreateSSData(data SSData) error {
db := sqlite3.GetGormDB()
return db.Create(&data).Error
}
// BLData相关的GORM辅助函数 // BLData相关的GORM辅助函数
func GetLatestBLData(id string) (*BLData, error) { func GetLatestBLData(id string) (*BLData, error) {

View File

@ -96,6 +96,9 @@ func (ss *ssQuery) UnbindSS(qqId string) (reply string) {
} }
func (ss *ssQuery) GetScore(qqId string) (currentData *PlayerDataLite, lastData *PlayerDataLite, err error) { func (ss *ssQuery) GetScore(qqId string) (currentData *PlayerDataLite, lastData *PlayerDataLite, err error) {
tx := sqlite3.GetGormDB().Begin()
defer tx.Rollback()
ssId, err := GetSSID(qqId) ssId, err := GetSSID(qqId)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@ -155,7 +158,12 @@ func (ss *ssQuery) GetScore(qqId string) (currentData *PlayerDataLite, lastData
// 如果有新的数据且与上次不同,则插入 // 如果有新的数据且与上次不同,则插入
if lastSSData == nil || hasDataChanged(lastSSData, &newSSData) { if lastSSData == nil || hasDataChanged(lastSSData, &newSSData) {
err = service.CreateSSData(newSSData) err = tx.Delete(&service.SSData{ID: data.ID}).Error
if err != nil {
log.Print(err)
return nil, nil, err
}
err = tx.Create(&newSSData).Error
if err != nil { if err != nil {
log.Print(err) log.Print(err)
return nil, nil, err return nil, nil, err
@ -178,12 +186,10 @@ func (ss *ssQuery) GetScore(qqId string) (currentData *PlayerDataLite, lastData
ReplaysWatched: lastSSData.ReplaysWatched, ReplaysWatched: lastSSData.ReplaysWatched,
GeneratedTime: lastSSData.GeneratedTime.Format("2006-01-02 15:04:05.999999999-07:00"), GeneratedTime: lastSSData.GeneratedTime.Format("2006-01-02 15:04:05.999999999-07:00"),
} }
return &currentDataLite, &lastDataLite, nil return &currentDataLite, &lastDataLite, tx.Commit().Error
} }
return &currentDataLite, nil, nil
} }
return &currentDataLite, nil, tx.Commit().Error
return &currentDataLite, nil, nil
} }
// 辅助函数:检查数据是否有变化 // 辅助函数:检查数据是否有变化