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

View File

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

View File

@ -57,11 +57,6 @@ func GetLatestSSData(id string) (*SSData, error) {
return &data, err
}
func CreateSSData(data SSData) error {
db := sqlite3.GetGormDB()
return db.Create(&data).Error
}
// BLData相关的GORM辅助函数
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) {
tx := sqlite3.GetGormDB().Begin()
defer tx.Rollback()
ssId, err := GetSSID(qqId)
if err != nil {
return nil, nil, err
@ -155,7 +158,12 @@ func (ss *ssQuery) GetScore(qqId string) (currentData *PlayerDataLite, lastData
// 如果有新的数据且与上次不同,则插入
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 {
log.Print(err)
return nil, nil, err
@ -178,12 +186,10 @@ func (ss *ssQuery) GetScore(qqId string) (currentData *PlayerDataLite, lastData
ReplaysWatched: lastSSData.ReplaysWatched,
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, nil
return &currentDataLite, nil, tx.Commit().Error
}
// 辅助函数:检查数据是否有变化