diff --git a/configs/confbase/external.go b/configs/confbase/external.go index c225919..e204da0 100644 --- a/configs/confbase/external.go +++ b/configs/confbase/external.go @@ -84,25 +84,23 @@ func GetCurrent[T1 IConfData, T2 IConfRawData](gameId string, obj T1) bool { currentKey := info.CacheCurrent currentId := zredis.GetString(currentKey) confRaw := new(T2) - hasFind := false - if currentId == "" { - hasFind = FindDuringTime[T1, T2](obj, confRaw, gameId) - } else { + if currentId != "" { has = GetConfig[T1, T2](gameId, currentId, obj) if has { if !obj.CheckCurrent() { - hasFind = FindDuringTime[T1, T2](obj, confRaw, gameId) + has = false } - } else { - hasFind = FindDuringTime[T1, T2](obj, confRaw, gameId) } } - if hasFind { - obj.Decode(gameId, confRaw) - SaveCache(gameId, obj) - has = true - currentId = obj.GetUid() - _ = zredis.Set(currentKey, currentId) + if !has { + has = FindDuringTime[T1, T2](obj, confRaw, gameId) + if has { + obj.Decode(gameId, confRaw) + SaveCache(gameId, obj) + has = true + currentId = obj.GetUid() + _ = zredis.Set(currentKey, currentId) + } } return has } diff --git a/controllers/cardholder.go b/controllers/cardholder.go index 0b77013..90c5ebf 100644 --- a/controllers/cardholder.go +++ b/controllers/cardholder.go @@ -47,6 +47,18 @@ func (c *CardHolderController) Open() { c.RetRspCodeData(code, rsp) } +// CardAdd 获取新卡 +func (c *CardHolderController) CardAdd() { + req := new(models.ReqCardAdd) + if !c.GetPostData(req) { + return + } + + code, rsp := cardholder.HandleCardAdd(req) + + c.RetRspCodeData(code, rsp) +} + // ShopExchange 星星商店兑换 func (c *CardHolderController) ShopExchange() { req := new(models.ReqStarShopExchange) diff --git a/models/cardholder.go b/models/cardholder.go index 601c456..e5fc455 100644 --- a/models/cardholder.go +++ b/models/cardholder.go @@ -52,6 +52,21 @@ type RspCardHolderOpen struct { AwardRound string `form:"award_round" json:"award_round"` // 触发的轮次奖励列表 空字符串未触发 } +// ReqCardAdd 请求 获取新卡 +type ReqCardAdd struct { + BaseLoginInfo + BaseSign + CardId int `form:"card_id" json:"card_id" valid:"Required"` // 获取的新卡ID +} + +// RspCardAdd 返回 获取新卡 +type RspCardAdd struct { + CardHolderInfo + CardId int `form:"card_id" json:"card_id" valid:"Required"` // 获取的新卡ID + AwardAlbum map[int]string `form:"award_album" json:"award_album"` // 触发的卡组奖励列表 k=出发的卡组ID v=对应奖励 + AwardRound string `form:"award_round" json:"award_round"` // 触发的轮次奖励列表 空字符串未触发 +} + // ReqStarShopExchange 请求 星星商店兑换 type ReqStarShopExchange struct { BaseLoginInfo diff --git a/routers/router.go b/routers/router.go index de18bb3..b10d274 100644 --- a/routers/router.go +++ b/routers/router.go @@ -29,6 +29,8 @@ func init() { beego.Router(prefix+"/cardholder/info", &controllers.CardHolderController{}, "post:Info") // 卡包打开 beego.Router(prefix+"/cardholder/open", &controllers.CardHolderController{}, "post:Open") + // 获取新卡 + beego.Router(prefix+"/cardholder/cardadd", &controllers.CardHolderController{}, "post:CardAdd") // 星星商店兑换 beego.Router(prefix+"/cardholder/shopexchange", &controllers.CardHolderController{}, "post:ShopExchange") // 上期剩余星星自动兑换信息 diff --git a/service-common/svconst/mysql.go b/service-common/svconst/mysql.go index ecec2cf..61fce59 100644 --- a/service-common/svconst/mysql.go +++ b/service-common/svconst/mysql.go @@ -14,6 +14,7 @@ const ( MYSQL_TABLE_S_CARDHOLDER_CONFIG = "s_card_activity" // 开卡包活动配置 MYSQL_TABLE_S_CARDHOLDER_DATA = "s_game_cardholder_data" // 开卡包活动数据 MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN = "s_game_cardholder_record_open" // 开卡包活动日志开卡包 + MYSQL_TABLE_S_CARDHOLDER_RECORD_CARDADD = "s_game_cardholder_record_cardadd" // 开卡包活动日志获取新卡 MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM = "s_game_cardholder_record_rewardalbum" // 开卡包活动日志领取卡组奖励 MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND = "s_game_cardholder_record_rewardround" // 开卡包活动日志领取轮次奖励 diff --git a/service/cardholder/dto-record.go b/service/cardholder/dto-record.go index d94fa9f..c58a1c6 100644 --- a/service/cardholder/dto-record.go +++ b/service/cardholder/dto-record.go @@ -58,6 +58,28 @@ func NewRecordOpen(recordBase RecordBase, } } +// RecordCardAdd 获取新卡 +type RecordCardAdd struct { + RecordBase + CardId int `gorm:"comment:卡牌ID"` +} + +func (d *RecordCardAdd) MysqlInfo(suffix string) *svmysql.MysqlInfo { + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_RECORD_CARDADD + return &svmysql.MysqlInfo{ + DbMysql: svconst.DbCommon, + TableName: fmt.Sprintf("%s_%s", tableName, suffix), + } +} + +func NewRecordCardAdd(recordBase RecordBase, + cardId int) *RecordCardAdd { + return &RecordCardAdd{ + RecordBase: recordBase, + CardId: cardId, + } +} + // RecordRewardAlbum 领取卡组奖励 type RecordRewardAlbum struct { RecordBase diff --git a/service/cardholder/handle.go b/service/cardholder/handle.go index 35a0769..e352c7c 100644 --- a/service/cardholder/handle.go +++ b/service/cardholder/handle.go @@ -3,6 +3,7 @@ package cardholder import ( "apigame/configs/confcardholder" "apigame/models" + "apigame/service-common/svmysql" "apigame/service/code-msg" "apigame/util/util-lx/lxalilog" "apigame/util/util-lx/lxtime" @@ -17,14 +18,16 @@ func HandleGetConfig(req *models.ReqCardHolderGetConfig) (code string, rsp model gameId := req.GameID // 尝试更新配置 - config, _ := confcardholder.GetCurrent(gameId) - rsp.ActivityId = config.Id - rsp.PrepareTime = config.PreviewTime - rsp.StartTime = config.StartTime - rsp.EndTime = config.EndTime - rsp.OpenLevel = config.OpenLevel - - rsp.Config = config.Client + config, hasConfig := confcardholder.GetCurrent(gameId) + if hasConfig { + rsp.ActivityId = config.Id + rsp.PrepareTime = config.PreviewTime + rsp.StartTime = config.StartTime + rsp.EndTime = config.EndTime + rsp.OpenLevel = config.OpenLevel + + rsp.Config = config.Client + } return } @@ -135,6 +138,79 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH return } +// HandleCardAdd 获取新卡 +func HandleCardAdd(req *models.ReqCardAdd) (code string, rsp models.RspCardAdd) { + rsp = models.RspCardAdd{ + CardId: req.CardId, + AwardAlbum: make(map[int]string), + } + code = code_msg.RECODE_OK + gameId := req.GameID + playerUid := req.UID + + // 尝试更新配置 + config, hasConfig := confcardholder.GetCurrent(gameId) + if !hasConfig { + code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR + return + } + + // 检查活动状态 + code = CheckStatus(config) + if code != code_msg.RECODE_OK { + return + } + // 检查牌ID + _, okCard := config.CardConfig[req.CardId] + if !okCard { + code = code_msg.RECODE_MERGE_CARDHOLDER_CARDID_ERROR + return + } + + // 读取游戏数据 + player := LoadPlayer(gameId, playerUid, config) + // 检查游戏数据 轮次等 + code = CheckGameData(player, config) + if code != code_msg.RECODE_OK { + return + } + + // 增加卡牌 + player.Details.Cards[req.CardId] += 1 + + // 剩余检查处理 + openMode := 0 + sequenceId, cohort := GetUserSequenceIdAndCohort(player.Uid) + allNewCards := []int{req.CardId} + + // 记录日志 + { + recordBase := NewRecordBase(player.Uid, sequenceId, cohort, config.Id, player.Details.Round) + _ = svmysql.Create(NewRecordCardAdd(recordBase, + req.CardId), + gameId) + } + + awardAlbum, awardRound := DoOpenCheckAward(gameId, + player, config, + sequenceId, cohort, + allNewCards, + openMode) + rsp.AwardAlbum = awardAlbum + rsp.AwardRound = awardRound + + // 计算星星点数 + CalculateStarCount(player, config) + + // 存档 + SavePlayer(gameId, player) + + // 返回信息 + rsp.CardHolderInfo = GetInfo(player, config) + + return +} + // HandleShopExchange 星星商店兑换 func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp models.RspStarShopExchange) { rsp = models.RspStarShopExchange{ diff --git a/service/code-msg/code-msg.go b/service/code-msg/code-msg.go index d03289c..4a37973 100644 --- a/service/code-msg/code-msg.go +++ b/service/code-msg/code-msg.go @@ -48,6 +48,7 @@ const ( RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR = "2105" RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR = "2106" RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR = "2107" + RECODE_MERGE_CARDHOLDER_CARDID_ERROR = "2108" RECODE_MERGE_ROOMRANK_NOTOPEN_ERROR = "2200" RECODE_MERGE_ROOMRANK_LEVEL_ERROR = "2201" @@ -102,6 +103,7 @@ var recodeText = map[string]string{ RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR: "商店ID错误", RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR: "星星商店星星不足", RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR: "没有星星商店自动兑换信息", + RECODE_MERGE_CARDHOLDER_CARDID_ERROR: "卡牌ID错误", RECODE_MERGE_ROOMRANK_NOTOPEN_ERROR: "活动未开放", RECODE_MERGE_ROOMRANK_LEVEL_ERROR: "参与等级不足", diff --git a/service/init.go b/service/init.go index a807a18..2602ee6 100644 --- a/service/init.go +++ b/service/init.go @@ -13,6 +13,7 @@ func Init() { for _, gameId := range svconst.GameListCardHolder { svmysql.InitTable(new(cardholder.Player), gameId, true) svmysql.InitTable(new(cardholder.RecordOpen), gameId, true) + svmysql.InitTable(new(cardholder.RecordCardAdd), gameId, true) svmysql.InitTable(new(cardholder.RecordRewardAlbum), gameId, true) svmysql.InitTable(new(cardholder.RecordRewardRound), gameId, true) } -- libgit2 0.21.0