Commit 02370d5ef05e735c211a9bec784b919a2c9787c1

Authored by 王家文
1 parent e29f5b42
Exists in master and in 1 other branch dev-wjw

feat✨:获取新卡功能

configs/confbase/external.go
@@ -84,25 +84,23 @@ func GetCurrent[T1 IConfData, T2 IConfRawData](gameId string, obj T1) bool { @@ -84,25 +84,23 @@ func GetCurrent[T1 IConfData, T2 IConfRawData](gameId string, obj T1) bool {
84 currentKey := info.CacheCurrent 84 currentKey := info.CacheCurrent
85 currentId := zredis.GetString(currentKey) 85 currentId := zredis.GetString(currentKey)
86 confRaw := new(T2) 86 confRaw := new(T2)
87 - hasFind := false  
88 - if currentId == "" {  
89 - hasFind = FindDuringTime[T1, T2](obj, confRaw, gameId)  
90 - } else { 87 + if currentId != "" {
91 has = GetConfig[T1, T2](gameId, currentId, obj) 88 has = GetConfig[T1, T2](gameId, currentId, obj)
92 if has { 89 if has {
93 if !obj.CheckCurrent() { 90 if !obj.CheckCurrent() {
94 - hasFind = FindDuringTime[T1, T2](obj, confRaw, gameId) 91 + has = false
95 } 92 }
96 - } else {  
97 - hasFind = FindDuringTime[T1, T2](obj, confRaw, gameId)  
98 } 93 }
99 } 94 }
100 - if hasFind {  
101 - obj.Decode(gameId, confRaw)  
102 - SaveCache(gameId, obj)  
103 - has = true  
104 - currentId = obj.GetUid()  
105 - _ = zredis.Set(currentKey, currentId) 95 + if !has {
  96 + has = FindDuringTime[T1, T2](obj, confRaw, gameId)
  97 + if has {
  98 + obj.Decode(gameId, confRaw)
  99 + SaveCache(gameId, obj)
  100 + has = true
  101 + currentId = obj.GetUid()
  102 + _ = zredis.Set(currentKey, currentId)
  103 + }
106 } 104 }
107 return has 105 return has
108 } 106 }
controllers/cardholder.go
@@ -47,6 +47,18 @@ func (c *CardHolderController) Open() { @@ -47,6 +47,18 @@ func (c *CardHolderController) Open() {
47 c.RetRspCodeData(code, rsp) 47 c.RetRspCodeData(code, rsp)
48 } 48 }
49 49
  50 +// CardAdd 获取新卡
  51 +func (c *CardHolderController) CardAdd() {
  52 + req := new(models.ReqCardAdd)
  53 + if !c.GetPostData(req) {
  54 + return
  55 + }
  56 +
  57 + code, rsp := cardholder.HandleCardAdd(req)
  58 +
  59 + c.RetRspCodeData(code, rsp)
  60 +}
  61 +
50 // ShopExchange 星星商店兑换 62 // ShopExchange 星星商店兑换
51 func (c *CardHolderController) ShopExchange() { 63 func (c *CardHolderController) ShopExchange() {
52 req := new(models.ReqStarShopExchange) 64 req := new(models.ReqStarShopExchange)
models/cardholder.go
@@ -52,6 +52,21 @@ type RspCardHolderOpen struct { @@ -52,6 +52,21 @@ type RspCardHolderOpen struct {
52 AwardRound string `form:"award_round" json:"award_round"` // 触发的轮次奖励列表 空字符串未触发 52 AwardRound string `form:"award_round" json:"award_round"` // 触发的轮次奖励列表 空字符串未触发
53 } 53 }
54 54
  55 +// ReqCardAdd 请求 获取新卡
  56 +type ReqCardAdd struct {
  57 + BaseLoginInfo
  58 + BaseSign
  59 + CardId int `form:"card_id" json:"card_id" valid:"Required"` // 获取的新卡ID
  60 +}
  61 +
  62 +// RspCardAdd 返回 获取新卡
  63 +type RspCardAdd struct {
  64 + CardHolderInfo
  65 + CardId int `form:"card_id" json:"card_id" valid:"Required"` // 获取的新卡ID
  66 + AwardAlbum map[int]string `form:"award_album" json:"award_album"` // 触发的卡组奖励列表 k=出发的卡组ID v=对应奖励
  67 + AwardRound string `form:"award_round" json:"award_round"` // 触发的轮次奖励列表 空字符串未触发
  68 +}
  69 +
55 // ReqStarShopExchange 请求 星星商店兑换 70 // ReqStarShopExchange 请求 星星商店兑换
56 type ReqStarShopExchange struct { 71 type ReqStarShopExchange struct {
57 BaseLoginInfo 72 BaseLoginInfo
routers/router.go
@@ -29,6 +29,8 @@ func init() { @@ -29,6 +29,8 @@ func init() {
29 beego.Router(prefix+"/cardholder/info", &controllers.CardHolderController{}, "post:Info") 29 beego.Router(prefix+"/cardholder/info", &controllers.CardHolderController{}, "post:Info")
30 // 卡包打开 30 // 卡包打开
31 beego.Router(prefix+"/cardholder/open", &controllers.CardHolderController{}, "post:Open") 31 beego.Router(prefix+"/cardholder/open", &controllers.CardHolderController{}, "post:Open")
  32 + // 获取新卡
  33 + beego.Router(prefix+"/cardholder/cardadd", &controllers.CardHolderController{}, "post:CardAdd")
32 // 星星商店兑换 34 // 星星商店兑换
33 beego.Router(prefix+"/cardholder/shopexchange", &controllers.CardHolderController{}, "post:ShopExchange") 35 beego.Router(prefix+"/cardholder/shopexchange", &controllers.CardHolderController{}, "post:ShopExchange")
34 // 上期剩余星星自动兑换信息 36 // 上期剩余星星自动兑换信息
service-common/svconst/mysql.go
@@ -14,6 +14,7 @@ const ( @@ -14,6 +14,7 @@ const (
14 MYSQL_TABLE_S_CARDHOLDER_CONFIG = "s_card_activity" // 开卡包活动配置 14 MYSQL_TABLE_S_CARDHOLDER_CONFIG = "s_card_activity" // 开卡包活动配置
15 MYSQL_TABLE_S_CARDHOLDER_DATA = "s_game_cardholder_data" // 开卡包活动数据 15 MYSQL_TABLE_S_CARDHOLDER_DATA = "s_game_cardholder_data" // 开卡包活动数据
16 MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN = "s_game_cardholder_record_open" // 开卡包活动日志开卡包 16 MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN = "s_game_cardholder_record_open" // 开卡包活动日志开卡包
  17 + MYSQL_TABLE_S_CARDHOLDER_RECORD_CARDADD = "s_game_cardholder_record_cardadd" // 开卡包活动日志获取新卡
17 MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM = "s_game_cardholder_record_rewardalbum" // 开卡包活动日志领取卡组奖励 18 MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM = "s_game_cardholder_record_rewardalbum" // 开卡包活动日志领取卡组奖励
18 MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND = "s_game_cardholder_record_rewardround" // 开卡包活动日志领取轮次奖励 19 MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND = "s_game_cardholder_record_rewardround" // 开卡包活动日志领取轮次奖励
19 20
service/cardholder/dto-record.go
@@ -58,6 +58,28 @@ func NewRecordOpen(recordBase RecordBase, @@ -58,6 +58,28 @@ func NewRecordOpen(recordBase RecordBase,
58 } 58 }
59 } 59 }
60 60
  61 +// RecordCardAdd 获取新卡
  62 +type RecordCardAdd struct {
  63 + RecordBase
  64 + CardId int `gorm:"comment:卡牌ID"`
  65 +}
  66 +
  67 +func (d *RecordCardAdd) MysqlInfo(suffix string) *svmysql.MysqlInfo {
  68 + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_RECORD_CARDADD
  69 + return &svmysql.MysqlInfo{
  70 + DbMysql: svconst.DbCommon,
  71 + TableName: fmt.Sprintf("%s_%s", tableName, suffix),
  72 + }
  73 +}
  74 +
  75 +func NewRecordCardAdd(recordBase RecordBase,
  76 + cardId int) *RecordCardAdd {
  77 + return &RecordCardAdd{
  78 + RecordBase: recordBase,
  79 + CardId: cardId,
  80 + }
  81 +}
  82 +
61 // RecordRewardAlbum 领取卡组奖励 83 // RecordRewardAlbum 领取卡组奖励
62 type RecordRewardAlbum struct { 84 type RecordRewardAlbum struct {
63 RecordBase 85 RecordBase
service/cardholder/handle.go
@@ -3,6 +3,7 @@ package cardholder @@ -3,6 +3,7 @@ package cardholder
3 import ( 3 import (
4 "apigame/configs/confcardholder" 4 "apigame/configs/confcardholder"
5 "apigame/models" 5 "apigame/models"
  6 + "apigame/service-common/svmysql"
6 "apigame/service/code-msg" 7 "apigame/service/code-msg"
7 "apigame/util/util-lx/lxalilog" 8 "apigame/util/util-lx/lxalilog"
8 "apigame/util/util-lx/lxtime" 9 "apigame/util/util-lx/lxtime"
@@ -17,14 +18,16 @@ func HandleGetConfig(req *models.ReqCardHolderGetConfig) (code string, rsp model @@ -17,14 +18,16 @@ func HandleGetConfig(req *models.ReqCardHolderGetConfig) (code string, rsp model
17 gameId := req.GameID 18 gameId := req.GameID
18 19
19 // 尝试更新配置 20 // 尝试更新配置
20 - config, _ := confcardholder.GetCurrent(gameId)  
21 - rsp.ActivityId = config.Id  
22 - rsp.PrepareTime = config.PreviewTime  
23 - rsp.StartTime = config.StartTime  
24 - rsp.EndTime = config.EndTime  
25 - rsp.OpenLevel = config.OpenLevel  
26 -  
27 - rsp.Config = config.Client 21 + config, hasConfig := confcardholder.GetCurrent(gameId)
  22 + if hasConfig {
  23 + rsp.ActivityId = config.Id
  24 + rsp.PrepareTime = config.PreviewTime
  25 + rsp.StartTime = config.StartTime
  26 + rsp.EndTime = config.EndTime
  27 + rsp.OpenLevel = config.OpenLevel
  28 +
  29 + rsp.Config = config.Client
  30 + }
28 31
29 return 32 return
30 } 33 }
@@ -135,6 +138,79 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH @@ -135,6 +138,79 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH
135 return 138 return
136 } 139 }
137 140
  141 +// HandleCardAdd 获取新卡
  142 +func HandleCardAdd(req *models.ReqCardAdd) (code string, rsp models.RspCardAdd) {
  143 + rsp = models.RspCardAdd{
  144 + CardId: req.CardId,
  145 + AwardAlbum: make(map[int]string),
  146 + }
  147 + code = code_msg.RECODE_OK
  148 + gameId := req.GameID
  149 + playerUid := req.UID
  150 +
  151 + // 尝试更新配置
  152 + config, hasConfig := confcardholder.GetCurrent(gameId)
  153 + if !hasConfig {
  154 + code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR
  155 + return
  156 + }
  157 +
  158 + // 检查活动状态
  159 + code = CheckStatus(config)
  160 + if code != code_msg.RECODE_OK {
  161 + return
  162 + }
  163 + // 检查牌ID
  164 + _, okCard := config.CardConfig[req.CardId]
  165 + if !okCard {
  166 + code = code_msg.RECODE_MERGE_CARDHOLDER_CARDID_ERROR
  167 + return
  168 + }
  169 +
  170 + // 读取游戏数据
  171 + player := LoadPlayer(gameId, playerUid, config)
  172 + // 检查游戏数据 轮次等
  173 + code = CheckGameData(player, config)
  174 + if code != code_msg.RECODE_OK {
  175 + return
  176 + }
  177 +
  178 + // 增加卡牌
  179 + player.Details.Cards[req.CardId] += 1
  180 +
  181 + // 剩余检查处理
  182 + openMode := 0
  183 + sequenceId, cohort := GetUserSequenceIdAndCohort(player.Uid)
  184 + allNewCards := []int{req.CardId}
  185 +
  186 + // 记录日志
  187 + {
  188 + recordBase := NewRecordBase(player.Uid, sequenceId, cohort, config.Id, player.Details.Round)
  189 + _ = svmysql.Create(NewRecordCardAdd(recordBase,
  190 + req.CardId),
  191 + gameId)
  192 + }
  193 +
  194 + awardAlbum, awardRound := DoOpenCheckAward(gameId,
  195 + player, config,
  196 + sequenceId, cohort,
  197 + allNewCards,
  198 + openMode)
  199 + rsp.AwardAlbum = awardAlbum
  200 + rsp.AwardRound = awardRound
  201 +
  202 + // 计算星星点数
  203 + CalculateStarCount(player, config)
  204 +
  205 + // 存档
  206 + SavePlayer(gameId, player)
  207 +
  208 + // 返回信息
  209 + rsp.CardHolderInfo = GetInfo(player, config)
  210 +
  211 + return
  212 +}
  213 +
138 // HandleShopExchange 星星商店兑换 214 // HandleShopExchange 星星商店兑换
139 func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp models.RspStarShopExchange) { 215 func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp models.RspStarShopExchange) {
140 rsp = models.RspStarShopExchange{ 216 rsp = models.RspStarShopExchange{
service/code-msg/code-msg.go
@@ -48,6 +48,7 @@ const ( @@ -48,6 +48,7 @@ const (
48 RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR = "2105" 48 RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR = "2105"
49 RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR = "2106" 49 RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR = "2106"
50 RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR = "2107" 50 RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR = "2107"
  51 + RECODE_MERGE_CARDHOLDER_CARDID_ERROR = "2108"
51 52
52 RECODE_MERGE_ROOMRANK_NOTOPEN_ERROR = "2200" 53 RECODE_MERGE_ROOMRANK_NOTOPEN_ERROR = "2200"
53 RECODE_MERGE_ROOMRANK_LEVEL_ERROR = "2201" 54 RECODE_MERGE_ROOMRANK_LEVEL_ERROR = "2201"
@@ -102,6 +103,7 @@ var recodeText = map[string]string{ @@ -102,6 +103,7 @@ var recodeText = map[string]string{
102 RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR: "商店ID错误", 103 RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR: "商店ID错误",
103 RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR: "星星商店星星不足", 104 RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR: "星星商店星星不足",
104 RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR: "没有星星商店自动兑换信息", 105 RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR: "没有星星商店自动兑换信息",
  106 + RECODE_MERGE_CARDHOLDER_CARDID_ERROR: "卡牌ID错误",
105 107
106 RECODE_MERGE_ROOMRANK_NOTOPEN_ERROR: "活动未开放", 108 RECODE_MERGE_ROOMRANK_NOTOPEN_ERROR: "活动未开放",
107 RECODE_MERGE_ROOMRANK_LEVEL_ERROR: "参与等级不足", 109 RECODE_MERGE_ROOMRANK_LEVEL_ERROR: "参与等级不足",
service/init.go
@@ -13,6 +13,7 @@ func Init() { @@ -13,6 +13,7 @@ func Init() {
13 for _, gameId := range svconst.GameListCardHolder { 13 for _, gameId := range svconst.GameListCardHolder {
14 svmysql.InitTable(new(cardholder.Player), gameId, true) 14 svmysql.InitTable(new(cardholder.Player), gameId, true)
15 svmysql.InitTable(new(cardholder.RecordOpen), gameId, true) 15 svmysql.InitTable(new(cardholder.RecordOpen), gameId, true)
  16 + svmysql.InitTable(new(cardholder.RecordCardAdd), gameId, true)
16 svmysql.InitTable(new(cardholder.RecordRewardAlbum), gameId, true) 17 svmysql.InitTable(new(cardholder.RecordRewardAlbum), gameId, true)
17 svmysql.InitTable(new(cardholder.RecordRewardRound), gameId, true) 18 svmysql.InitTable(new(cardholder.RecordRewardRound), gameId, true)
18 } 19 }