From 1bb8f20c880833c2a8f4663b81b5a5901df363cf Mon Sep 17 00:00:00 2001 From: Sean Du Date: Sun, 28 Jun 2026 01:19:40 +0800 Subject: [PATCH] Fix legacy unit schema migration Signed-off-by: Sean Du --- internal/handler/live/reward.go | 3 +++ internal/session/live.go | 16 +++++++++++++++- internal/session/unit.go | 4 ++++ internal/startup/database.go | 6 ++++++ internal/startup/startup.go | 1 + 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/internal/handler/live/reward.go b/internal/handler/live/reward.go index 1b6c0ab..bc7db2c 100644 --- a/internal/handler/live/reward.go +++ b/internal/handler/live/reward.go @@ -49,6 +49,9 @@ func BuildRewardResp(ss *session.Session, playRewardReq liveschema.RewardReq, is return liveschema.RewardResp{}, errors.New("live progress not found") } _, deckInfo := ss.GetDeckInfo(progress.DeckID) + if deckInfo == nil { + return liveschema.RewardResp{}, errors.New("deck info not found") + } deckInfo.LiveDifficultyID = difficultyID unitsList := []liveschema.PlayRewardUnitList{} diff --git a/internal/session/live.go b/internal/session/live.go index 2c26400..7d29c94 100644 --- a/internal/session/live.go +++ b/internal/session/live.go @@ -188,12 +188,20 @@ func (ss *Session) GetLiveInfo(LiveDifficultyID int) (bool, *liveschema.LiveInfo } func (ss *Session) GetDeckInfo(deckID int) (bool, *liverecordschema.DeckInfo) { + if ss.UserEng == nil { + return false, nil + } + // 卡片信息 totalHp, totalSmile, totalCute, totalCool := 0, 0, 0, 0 unitData := []liverecordschema.UnitList{} units := ss.GetUserDeckUnit(deckID) for _, u := range units { - _, uData := ss.GetUnitInfo(u.UnitID) + has, uData := ss.GetUnitInfo(u.UnitID) + if !has || uData == nil { + return false, nil + } + tempUnitData := liverecordschema.UnitList{ UnitID: u.UnitID, Position: u.Position, @@ -225,10 +233,16 @@ func (ss *Session) GetDeckInfo(deckID int) (bool, *liverecordschema.DeckInfo) { // 技能宝石信息 skillData := ss.GetUserUnitSkillEquipID(u.UnitOwningUserID) + if ss.UserEng == nil { + return false, nil + } tempUnitData.RemovableSkillIds = skillData // 饰品信息 has, accessoryData := ss.GetUserAccessoryInfoByUnitOwningUserID(u.UnitOwningUserID) + if ss.UserEng == nil { + return false, nil + } if has { tempUnitData.AccessoryInfo = accessoryData } diff --git a/internal/session/unit.go b/internal/session/unit.go index d91ac76..8d23d97 100644 --- a/internal/session/unit.go +++ b/internal/session/unit.go @@ -19,6 +19,10 @@ func (ss *Session) GetBasicUnitInfo() *xorm.Session { } func (ss *Session) GetUnitInfo(unitID int) (bool, *unitmodel.CommonUnitData) { + if ss.UserEng == nil { + return false, nil + } + unitInfo := unitmodel.CommonUnitData{} has, err := ss.UserEng.Table(new(unitmodel.CommonUnitData)). Where("unit_id = ?", unitID).Get(&unitInfo) diff --git a/internal/startup/database.go b/internal/startup/database.go index 3f618ea..5c717e7 100644 --- a/internal/startup/database.go +++ b/internal/startup/database.go @@ -78,6 +78,12 @@ func ForceAllUsersRelogin() { } } +func MigrateLegacyUnitTables() { + if err := db.UserEng.Sync2(new(unitmodel.CommonUnitData), new(usermodel.UserUnitData)); err != nil { + log.Fatalln("迁移卡片历史数据表失败:", err.Error()) + } +} + type accessoryOwningMapRow struct { AccessoryOwningUserID int `xorm:"accessory_owning_user_id"` AccessoryID int `xorm:"accessory_id"` diff --git a/internal/startup/startup.go b/internal/startup/startup.go index a247f0c..fe13ef4 100644 --- a/internal/startup/startup.go +++ b/internal/startup/startup.go @@ -3,6 +3,7 @@ package startup func StartUp() { CreateTables() LoadUnitData() + MigrateLegacyUnitTables() CreateDefaultUser() EnsureDefaultFriends() }