refactor: 删除 CreateSSData 函数并更新 GetScore 函数以处理数据插入和更新逻辑,同时修改 PlayerDataLite 的表名为 blRecordData
This commit is contained in:
parent
527766ebd6
commit
95b319ad15
@ -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 ¤tDataLite, &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) {
|
||||||
|
@ -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 {
|
||||||
|
@ -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) {
|
||||||
|
@ -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 ¤tDataLite, &lastDataLite, nil
|
return ¤tDataLite, &lastDataLite, tx.Commit().Error
|
||||||
}
|
}
|
||||||
return ¤tDataLite, nil, nil
|
|
||||||
}
|
}
|
||||||
|
return ¤tDataLite, nil, tx.Commit().Error
|
||||||
return ¤tDataLite, nil, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 辅助函数:检查数据是否有变化
|
// 辅助函数:检查数据是否有变化
|
||||||
|
Loading…
x
Reference in New Issue
Block a user