From bb2b13bb01807ee51a8b721f4daa7fa4f91c28cd Mon Sep 17 00:00:00 2001 From: 王家文 Date: Wed, 10 Apr 2024 14:24:29 +0800 Subject: [PATCH] faet: 卡牌功能重构为支持多个游戏 --- README.md | 6 +++--- controllers/cardholder.go | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ controllers/ht-cardholder.go | 71 ----------------------------------------------------------------------- dto/cardholder-record.go | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ dto/cardholder.go | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ dto/ht-cardholder-record.go | 124 ---------------------------------------------------------------------------------------------------------------------------- dto/ht-cardholder.go | 104 -------------------------------------------------------------------------------------------------------- dto/inits.go | 2 +- main.go | 4 ++-- models/ht-cardholder.go | 54 +++++++++++++++++++++++++++--------------------------- routers/router.go | 10 +++++----- service/cardholder/config-registry.go | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ service/cardholder/config.go | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ service/cardholder/configs.go | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ service/cardholder/handle.go | 296 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ service/cardholder/logic.go | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ service/ht-cardholder/config-registry.go | 131 ----------------------------------------------------------------------------------------------------------------------------------- service/ht-cardholder/config.go | 89 ----------------------------------------------------------------------------------------- service/ht-cardholder/configs.go | 69 --------------------------------------------------------------------- service/ht-cardholder/handle.go | 296 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- service/ht-cardholder/logic.go | 137 ----------------------------------------------------------------------------------------------------------------------------------------- 21 files changed, 1059 insertions(+), 1059 deletions(-) create mode 100644 controllers/cardholder.go delete mode 100644 controllers/ht-cardholder.go create mode 100644 dto/cardholder-record.go create mode 100644 dto/cardholder.go delete mode 100644 dto/ht-cardholder-record.go delete mode 100644 dto/ht-cardholder.go create mode 100644 service/cardholder/config-registry.go create mode 100644 service/cardholder/config.go create mode 100644 service/cardholder/configs.go create mode 100644 service/cardholder/handle.go create mode 100644 service/cardholder/logic.go delete mode 100644 service/ht-cardholder/config-registry.go delete mode 100644 service/ht-cardholder/config.go delete mode 100644 service/ht-cardholder/configs.go delete mode 100644 service/ht-cardholder/handle.go delete mode 100644 service/ht-cardholder/logic.go diff --git a/README.md b/README.md index 96705f5..da77605 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,6 @@ ## 游戏和游戏功能列表 -| 功能模块名 | 所属游戏 | 所属功能 | 负责人 | -|---------------|------|------|-----| -| ht-cardholder | 海滩 | 卡包卡牌 | 王家文 | +| 功能模块名 | 所属功能 | 负责人 | +|---------------|------|-----| +| cardholder | 卡包卡牌 | 王家文 | diff --git a/controllers/cardholder.go b/controllers/cardholder.go new file mode 100644 index 0000000..a80880c --- /dev/null +++ b/controllers/cardholder.go @@ -0,0 +1,71 @@ +package controllers + +import ( + "apigame/models" + "apigame/service/cardholder" +) + +// CardHolderController 绑定控制器 +type CardHolderController struct { + BaseController +} + +// Info 卡包信息 +func (c *CardHolderController) Info() { + req := new(models.ReqCardHolderInfo) + if !c.GetPostData(req) { + return + } + + code, rsp := cardholder.HandleInfo(req) + + c.RetRspCodeData(code, rsp) +} + +// GetNew 获取卡包 +func (c *CardHolderController) GetNew() { + req := new(models.ReqCardHolderGetNew) + if !c.GetPostData(req) { + return + } + + code, rsp := cardholder.HandleGetNew(req) + + c.RetRspCodeData(code, rsp) +} + +// Open 卡包打开 +func (c *CardHolderController) Open() { + req := new(models.ReqCardHolderOpen) + if !c.GetPostData(req) { + return + } + + code, rsp := cardholder.HandleOpen(req) + + c.RetRspCodeData(code, rsp) +} + +// GetRewardAlbum 领取卡组奖励 +func (c *CardHolderController) GetRewardAlbum() { + req := new(models.ReqCardHolderGetRewardAlbum) + if !c.GetPostData(req) { + return + } + + code, rsp := cardholder.HandleGetRewardAlbum(req) + + c.RetRspCodeData(code, rsp) +} + +// GetRewardRound 领取轮次奖励 +func (c *CardHolderController) GetRewardRound() { + req := new(models.ReqCardHolderGetRewardRound) + if !c.GetPostData(req) { + return + } + + code, rsp := cardholder.HandleGetRewardRound(req) + + c.RetRspCodeData(code, rsp) +} diff --git a/controllers/ht-cardholder.go b/controllers/ht-cardholder.go deleted file mode 100644 index c2c3834..0000000 --- a/controllers/ht-cardholder.go +++ /dev/null @@ -1,71 +0,0 @@ -package controllers - -import ( - "apigame/models" - "apigame/service/ht-cardholder" -) - -// HtCardHolderController 绑定控制器 -type HtCardHolderController struct { - BaseController -} - -// Info 卡包信息 -func (c *HtCardHolderController) Info() { - req := new(models.ReqHtCardHolderInfo) - if !c.GetPostData(req) { - return - } - - code, rsp := ht_cardholder.HandleInfo(req) - - c.RetRspCodeData(code, rsp) -} - -// GetNew 获取卡包 -func (c *HtCardHolderController) GetNew() { - req := new(models.ReqHtCardHolderGetNew) - if !c.GetPostData(req) { - return - } - - code, rsp := ht_cardholder.HandleGetNew(req) - - c.RetRspCodeData(code, rsp) -} - -// Open 卡包打开 -func (c *HtCardHolderController) Open() { - req := new(models.ReqHtCardHolderOpen) - if !c.GetPostData(req) { - return - } - - code, rsp := ht_cardholder.HandleOpen(req) - - c.RetRspCodeData(code, rsp) -} - -// GetRewardAlbum 领取卡组奖励 -func (c *HtCardHolderController) GetRewardAlbum() { - req := new(models.ReqHtCardHolderGetRewardAlbum) - if !c.GetPostData(req) { - return - } - - code, rsp := ht_cardholder.HandleGetRewardAlbum(req) - - c.RetRspCodeData(code, rsp) -} - -// GetRewardRound 领取轮次奖励 -func (c *HtCardHolderController) GetRewardRound() { - req := new(models.ReqHtCardHolderGetRewardRound) - if !c.GetPostData(req) { - return - } - - code, rsp := ht_cardholder.HandleGetRewardRound(req) - - c.RetRspCodeData(code, rsp) -} diff --git a/dto/cardholder-record.go b/dto/cardholder-record.go new file mode 100644 index 0000000..a55ac30 --- /dev/null +++ b/dto/cardholder-record.go @@ -0,0 +1,124 @@ +package dto + +import ( + "apigame/service/constd" + "apigame/util/util-lx/lxtime" +) + +// CardHolderRecordGetNew 开卡包活动日志获得卡包 +type CardHolderRecordGetNew struct { + Id int64 `orm:"auto"` // 日志ID + Uid int64 // 玩家唯一ID + ActivityId int64 // 当前活动ID + Round int // 当前轮次 + CardholderId int // 卡包ID + CardholderCount int // 卡包数量 + CreateTime int64 // 创建时间戳 + UpdateTime int64 // 修改时间戳 +} + +func (d *CardHolderRecordGetNew) TableName() string { + return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_GETNEW + constd.GAME_ID_HT +} + +func NewCardHolderRecordGetNew(uid int64, activityId int64, round int, + cardholderId int, cardholderCount int) *CardHolderRecordGetNew { + secNow := lxtime.NowUninx() + return &CardHolderRecordGetNew{ + CreateTime: secNow, + UpdateTime: secNow, + Uid: uid, + ActivityId: activityId, + Round: round, + CardholderId: cardholderId, + CardholderCount: cardholderCount, + } +} + +// CardHolderRecordOpen 开卡包活动日志开卡包 +type CardHolderRecordOpen struct { + Id int64 `orm:"auto"` // 日志ID + Uid int64 // 玩家唯一ID + ActivityId int64 // 当前活动ID + Round int // 当前轮次 + CardholderId int // 卡包ID + CardList string // 开卡内容 + CreateTime int64 // 创建时间戳 + UpdateTime int64 // 修改时间戳 +} + +func (d *CardHolderRecordOpen) TableName() string { + return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN + constd.GAME_ID_HT +} + +func NewCardHolderRecordOpen(uid int64, activityId int64, round int, + cardholderId int, cardList string) *CardHolderRecordOpen { + secNow := lxtime.NowUninx() + return &CardHolderRecordOpen{ + CreateTime: secNow, + UpdateTime: secNow, + Uid: uid, + ActivityId: activityId, + Round: round, + CardholderId: cardholderId, + CardList: cardList, + } +} + +// CardHolderRecordRewardAlbum 开卡包活动日志领取卡组奖励 +type CardHolderRecordRewardAlbum struct { + Id int64 `orm:"auto"` // 日志ID + Uid int64 // 玩家唯一ID + ActivityId int64 // 当前活动ID + Round int // 当前轮次 + AlbumId int // 卡组ID + Award string // 奖励内容 + CreateTime int64 // 创建时间戳 + UpdateTime int64 // 修改时间戳 +} + +func (d *CardHolderRecordRewardAlbum) TableName() string { + return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM + constd.GAME_ID_HT +} + +func NewCardHolderRecordRewardAlbum(uid int64, activityId int64, round int, + albumId int, award string) *CardHolderRecordRewardAlbum { + secNow := lxtime.NowUninx() + return &CardHolderRecordRewardAlbum{ + CreateTime: secNow, + UpdateTime: secNow, + Uid: uid, + ActivityId: activityId, + Round: round, + AlbumId: albumId, + Award: award, + } +} + +// CardHolderRecordRewardRound 开卡包活动日志领取卡组奖励 +type CardHolderRecordRewardRound struct { + Id int64 `orm:"auto"` // 日志ID + Uid int64 // 玩家唯一ID + ActivityId int64 // 当前活动ID + Round int // 当前轮次 + Award string // 奖励内容 + CreateTime int64 // 创建时间戳 + UpdateTime int64 // 修改时间戳 +} + +func (d *CardHolderRecordRewardRound) TableName() string { + return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND + constd.GAME_ID_HT +} + +func NewCardHolderRecordRewardRound(uid int64, activityId int64, round int, + award string) *CardHolderRecordRewardRound { + secNow := lxtime.NowUninx() + return &CardHolderRecordRewardRound{ + CreateTime: secNow, + UpdateTime: secNow, + Uid: uid, + ActivityId: activityId, + Round: round, + Award: award, + } +} diff --git a/dto/cardholder.go b/dto/cardholder.go new file mode 100644 index 0000000..8d1a51d --- /dev/null +++ b/dto/cardholder.go @@ -0,0 +1,104 @@ +package dto + +import ( + "apigame/models" + "apigame/service/constd" + "apigame/util/util-lx/lxalilog" + "encoding/json" + "github.com/astaxie/beego/orm" +) + +func InitCardholder() { + + // register model + orm.RegisterModel(new(CardHolderData)) + orm.RegisterModel(new(CardHolderRecordGetNew)) + orm.RegisterModel(new(CardHolderRecordOpen)) + orm.RegisterModel(new(CardHolderRecordRewardAlbum)) + orm.RegisterModel(new(CardHolderRecordRewardRound)) + + // create table + orm.RunSyncdb("default", false, true) +} + +// CardHolderData 卡牌活动持久数据 +type CardHolderData struct { + Uid int64 `orm:"pk"` // 玩家唯一ID + ActivityId int64 // 活动ID + Details *CardHolderDataDetails `orm:"-"` // 活动详情 + DetailsText string `orm:"type(text)"` // 活动详情封装 + CreateTime int64 // 创建时间戳 + UpdateTime int64 // 修改时间戳 +} + +// CardHolderDataDetails 卡牌活动详情 +type CardHolderDataDetails struct { + Cardholder map[int]int // 卡包数量 k=卡包ID v=卡包数量 + Cards map[int]int // 每张卡集了多少张 k=卡牌ID v=数量 + Album map[string]int // 卡组奖励领取 k=卡组ID v=数量 + StarSequenceScales map[string]int // 星级序列刻度 k=ID_用户序列_用户分组 v=刻度 + CardSequenceScales map[string]int // 卡牌序列刻度 k=ID_用户序列_用户分组 v=刻度 + Round int // 卡册当前轮次 +} + +func NewCardHolderData(uid int64) *CardHolderData { + return &CardHolderData{ + Uid: uid, + Details: NewCardHolderDataDetails(), + } +} + +func NewCardHolderDataDetails() *CardHolderDataDetails { + return &CardHolderDataDetails{ + Cardholder: make(map[int]int), + Cards: make(map[int]int), + Album: make(map[string]int), + StarSequenceScales: make(map[string]int), + CardSequenceScales: make(map[string]int), + Round: 1, + } +} + +func (d *CardHolderData) TableName() string { + return constd.MYSQL_TABLE_S_CARDHOLDER_DATA + constd.GAME_ID_HT +} + +// Encode 打包数据 +func (d *CardHolderData) Encode() { + details, err := json.Marshal(d.Details) + if err != nil { + lxalilog.Errors(err, "CardHolderData Encode Error", d.Uid, d.ActivityId) + return + } + d.DetailsText = string(details) +} + +// Decode 分包数据 +func (d *CardHolderData) Decode() { + err := json.Unmarshal([]byte(d.DetailsText), d.Details) + if err != nil { + lxalilog.Errors(err, "CardHolderData Decode Error", d.Uid, d.ActivityId) + return + } +} + +// GetInfo 封装成返回数据 +func (d *CardHolderData) GetInfo() models.CardHolderInfo { + info := models.CardHolderInfo{ + Cardholder: make(map[int]int), + Cards: make(map[int]int), + Album: make(map[string]int), + Round: 0, + } + for i, i2 := range d.Details.Cardholder { + info.Cardholder[i] = i2 + } + for i, i2 := range d.Details.Cards { + info.Cards[i] = i2 + } + for i, i2 := range d.Details.Album { + info.Album[i] = i2 + } + info.Round = d.Details.Round + return info +} diff --git a/dto/ht-cardholder-record.go b/dto/ht-cardholder-record.go deleted file mode 100644 index 8f503d1..0000000 --- a/dto/ht-cardholder-record.go +++ /dev/null @@ -1,124 +0,0 @@ -package dto - -import ( - "apigame/service/constd" - "apigame/util/util-lx/lxtime" -) - -// HtCardHolderRecordGetNew 开卡包活动日志获得卡包 -type HtCardHolderRecordGetNew struct { - Id int64 `orm:"auto"` // 日志ID - Uid int64 // 玩家唯一ID - ActivityId int64 // 当前活动ID - Round int // 当前轮次 - CardholderId int // 卡包ID - CardholderCount int // 卡包数量 - CreateTime int64 // 创建时间戳 - UpdateTime int64 // 修改时间戳 -} - -func (d *HtCardHolderRecordGetNew) TableName() string { - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_GETNEW + constd.GAME_ID_HT -} - -func NewHtCardHolderRecordGetNew(uid int64, activityId int64, round int, - cardholderId int, cardholderCount int) *HtCardHolderRecordGetNew { - secNow := lxtime.NowUninx() - return &HtCardHolderRecordGetNew{ - CreateTime: secNow, - UpdateTime: secNow, - Uid: uid, - ActivityId: activityId, - Round: round, - CardholderId: cardholderId, - CardholderCount: cardholderCount, - } -} - -// HtCardHolderRecordOpen 开卡包活动日志开卡包 -type HtCardHolderRecordOpen struct { - Id int64 `orm:"auto"` // 日志ID - Uid int64 // 玩家唯一ID - ActivityId int64 // 当前活动ID - Round int // 当前轮次 - CardholderId int // 卡包ID - CardList string // 开卡内容 - CreateTime int64 // 创建时间戳 - UpdateTime int64 // 修改时间戳 -} - -func (d *HtCardHolderRecordOpen) TableName() string { - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN + constd.GAME_ID_HT -} - -func NewHtCardHolderRecordOpen(uid int64, activityId int64, round int, - cardholderId int, cardList string) *HtCardHolderRecordOpen { - secNow := lxtime.NowUninx() - return &HtCardHolderRecordOpen{ - CreateTime: secNow, - UpdateTime: secNow, - Uid: uid, - ActivityId: activityId, - Round: round, - CardholderId: cardholderId, - CardList: cardList, - } -} - -// HtCardHolderRecordRewardAlbum 开卡包活动日志领取卡组奖励 -type HtCardHolderRecordRewardAlbum struct { - Id int64 `orm:"auto"` // 日志ID - Uid int64 // 玩家唯一ID - ActivityId int64 // 当前活动ID - Round int // 当前轮次 - AlbumId int // 卡组ID - Award string // 奖励内容 - CreateTime int64 // 创建时间戳 - UpdateTime int64 // 修改时间戳 -} - -func (d *HtCardHolderRecordRewardAlbum) TableName() string { - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM + constd.GAME_ID_HT -} - -func NewHtCardHolderRecordRewardAlbum(uid int64, activityId int64, round int, - albumId int, award string) *HtCardHolderRecordRewardAlbum { - secNow := lxtime.NowUninx() - return &HtCardHolderRecordRewardAlbum{ - CreateTime: secNow, - UpdateTime: secNow, - Uid: uid, - ActivityId: activityId, - Round: round, - AlbumId: albumId, - Award: award, - } -} - -// HtCardHolderRecordRewardRound 开卡包活动日志领取卡组奖励 -type HtCardHolderRecordRewardRound struct { - Id int64 `orm:"auto"` // 日志ID - Uid int64 // 玩家唯一ID - ActivityId int64 // 当前活动ID - Round int // 当前轮次 - Award string // 奖励内容 - CreateTime int64 // 创建时间戳 - UpdateTime int64 // 修改时间戳 -} - -func (d *HtCardHolderRecordRewardRound) TableName() string { - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND + constd.GAME_ID_HT -} - -func NewHtCardHolderRecordRewardRound(uid int64, activityId int64, round int, - award string) *HtCardHolderRecordRewardRound { - secNow := lxtime.NowUninx() - return &HtCardHolderRecordRewardRound{ - CreateTime: secNow, - UpdateTime: secNow, - Uid: uid, - ActivityId: activityId, - Round: round, - Award: award, - } -} diff --git a/dto/ht-cardholder.go b/dto/ht-cardholder.go deleted file mode 100644 index 8e870ab..0000000 --- a/dto/ht-cardholder.go +++ /dev/null @@ -1,104 +0,0 @@ -package dto - -import ( - "apigame/models" - "apigame/service/constd" - "apigame/util/util-lx/lxalilog" - "encoding/json" - "github.com/astaxie/beego/orm" -) - -func InitHtCardholder() { - - // register model - orm.RegisterModel(new(HtCardHolderData)) - orm.RegisterModel(new(HtCardHolderRecordGetNew)) - orm.RegisterModel(new(HtCardHolderRecordOpen)) - orm.RegisterModel(new(HtCardHolderRecordRewardAlbum)) - orm.RegisterModel(new(HtCardHolderRecordRewardRound)) - - // create table - orm.RunSyncdb("default", false, true) -} - -// HtCardHolderData 卡牌活动持久数据 -type HtCardHolderData struct { - Uid int64 `orm:"pk"` // 玩家唯一ID - ActivityId int64 // 活动ID - Details *HtCardHolderDataDetails `orm:"-"` // 活动详情 - DetailsText string `orm:"type(text)"` // 活动详情封装 - CreateTime int64 // 创建时间戳 - UpdateTime int64 // 修改时间戳 -} - -// HtCardHolderDataDetails 卡牌活动详情 -type HtCardHolderDataDetails struct { - Cardholder map[int]int // 卡包数量 k=卡包ID v=卡包数量 - Cards map[int]int // 每张卡集了多少张 k=卡牌ID v=数量 - Album map[string]int // 卡组奖励领取 k=卡组ID v=数量 - StarSequenceScales map[string]int // 星级序列刻度 k=ID_用户序列_用户分组 v=刻度 - CardSequenceScales map[string]int // 卡牌序列刻度 k=ID_用户序列_用户分组 v=刻度 - Round int // 卡册当前轮次 -} - -func NewHtCardHolderData(uid int64) *HtCardHolderData { - return &HtCardHolderData{ - Uid: uid, - Details: NewHtCardHolderDataDetails(), - } -} - -func NewHtCardHolderDataDetails() *HtCardHolderDataDetails { - return &HtCardHolderDataDetails{ - Cardholder: make(map[int]int), - Cards: make(map[int]int), - Album: make(map[string]int), - StarSequenceScales: make(map[string]int), - CardSequenceScales: make(map[string]int), - Round: 1, - } -} - -func (d *HtCardHolderData) TableName() string { - return constd.MYSQL_TABLE_S_CARDHOLDER_DATA + constd.GAME_ID_HT -} - -// Encode 打包数据 -func (d *HtCardHolderData) Encode() { - details, err := json.Marshal(d.Details) - if err != nil { - lxalilog.Errors(err, "HtCardHolderData Encode Error", d.Uid, d.ActivityId) - return - } - d.DetailsText = string(details) -} - -// Decode 分包数据 -func (d *HtCardHolderData) Decode() { - err := json.Unmarshal([]byte(d.DetailsText), d.Details) - if err != nil { - lxalilog.Errors(err, "HtCardHolderData Decode Error", d.Uid, d.ActivityId) - return - } -} - -// GetInfo 封装成返回数据 -func (d *HtCardHolderData) GetInfo() models.HtCardHolderInfo { - info := models.HtCardHolderInfo{ - Cardholder: make(map[int]int), - Cards: make(map[int]int), - Album: make(map[string]int), - Round: 0, - } - for i, i2 := range d.Details.Cardholder { - info.Cardholder[i] = i2 - } - for i, i2 := range d.Details.Cards { - info.Cards[i] = i2 - } - for i, i2 := range d.Details.Album { - info.Album[i] = i2 - } - info.Round = d.Details.Round - return info -} diff --git a/dto/inits.go b/dto/inits.go index 222985f..ff36716 100644 --- a/dto/inits.go +++ b/dto/inits.go @@ -71,7 +71,7 @@ func Inits() (err error) { //_ = config.InitLxLimit() // 海滩卡包 - InitHtCardholder() + InitCardholder() return } diff --git a/main.go b/main.go index e1df5d9..2905266 100644 --- a/main.go +++ b/main.go @@ -3,7 +3,7 @@ package main import ( "apigame/dto" _ "apigame/routers" - "apigame/service/ht-cardholder" + "apigame/service/cardholder" "github.com/astaxie/beego" "github.com/astaxie/beego/logs" "github.com/astaxie/beego/plugins/cors" @@ -30,7 +30,7 @@ func main() { _ = dto.Inits() // 初始化配置 - ht_cardholder.Init() + cardholder.Init() beego.Run() } diff --git a/models/ht-cardholder.go b/models/ht-cardholder.go index 97d1835..995a644 100644 --- a/models/ht-cardholder.go +++ b/models/ht-cardholder.go @@ -2,72 +2,72 @@ package models // 海滩卡包 -// HtCardHolderInfo 卡包信息 -type HtCardHolderInfo struct { +// CardHolderInfo 卡包信息 +type CardHolderInfo struct { Cardholder map[int]int `form:"cardholder" json:"cardholder"` // 卡包数量 k=卡包ID v=卡包数量 Cards map[int]int `form:"cards" json:"cards"` // 每张卡集了多少张 k=卡牌ID v=数量 Album map[string]int `form:"album" json:"album"` // 卡组奖励领取 k=卡组ID v=数量 Round int `form:"round" json:"round"` // 卡册当前轮次 } -// ReqHtCardHolderInfo 请求 卡包信息 -type ReqHtCardHolderInfo struct { +// ReqCardHolderInfo 请求 卡包信息 +type ReqCardHolderInfo struct { BaseLoginInfo BaseSign } -// RspHtCardHolderInfo 返回 卡包信息 -type RspHtCardHolderInfo struct { - HtCardHolderInfo +// RspCardHolderInfo 返回 卡包信息 +type RspCardHolderInfo struct { + CardHolderInfo } -// ReqHtCardHolderGetNew 请求 获取卡包 -type ReqHtCardHolderGetNew struct { +// ReqCardHolderGetNew 请求 获取卡包 +type ReqCardHolderGetNew struct { BaseLoginInfo BaseSign Id int `form:"id" json:"id" valid:"Required"` // 卡包ID Count int `form:"count" json:"count" valid:"Required"` // 卡包数量 } -// RspHtCardHolderGetNew 返回 获取卡包 -type RspHtCardHolderGetNew struct { - HtCardHolderInfo +// RspCardHolderGetNew 返回 获取卡包 +type RspCardHolderGetNew struct { + CardHolderInfo } -// ReqHtCardHolderOpen 请求 打开卡包 -type ReqHtCardHolderOpen struct { +// ReqCardHolderOpen 请求 打开卡包 +type ReqCardHolderOpen struct { BaseLoginInfo BaseSign Id int `form:"id" json:"id" valid:"Required"` // 卡包ID } -// RspHtCardHolderOpen 返回 打开卡包 -type RspHtCardHolderOpen struct { - HtCardHolderInfo +// RspCardHolderOpen 返回 打开卡包 +type RspCardHolderOpen struct { + CardHolderInfo NewCards []int `form:"new_cards" json:"new_cards"` // 新获得的卡牌列表 } -// ReqHtCardHolderGetRewardAlbum 请求 领取卡组奖励 -type ReqHtCardHolderGetRewardAlbum struct { +// ReqCardHolderGetRewardAlbum 请求 领取卡组奖励 +type ReqCardHolderGetRewardAlbum struct { BaseLoginInfo BaseSign Id int `form:"id" json:"id" valid:"Required"` // 卡组ID } -// RspHtCardHolderGetRewardAlbum 返回 领取卡组奖励 -type RspHtCardHolderGetRewardAlbum struct { - HtCardHolderInfo +// RspCardHolderGetRewardAlbum 返回 领取卡组奖励 +type RspCardHolderGetRewardAlbum struct { + CardHolderInfo Award string `form:"award" json:"award"` // 奖励字符串 } -// ReqHtCardHolderGetRewardRound 请求 领取轮次奖励 -type ReqHtCardHolderGetRewardRound struct { +// ReqCardHolderGetRewardRound 请求 领取轮次奖励 +type ReqCardHolderGetRewardRound struct { BaseLoginInfo BaseSign } -// RspHtCardHolderGetRewardRound 返回 领取轮次奖励 -type RspHtCardHolderGetRewardRound struct { - HtCardHolderInfo +// RspCardHolderGetRewardRound 返回 领取轮次奖励 +type RspCardHolderGetRewardRound struct { + CardHolderInfo Award string `form:"award" json:"award"` // 奖励字符串 } diff --git a/routers/router.go b/routers/router.go index 886f852..c9c1eed 100644 --- a/routers/router.go +++ b/routers/router.go @@ -12,15 +12,15 @@ func init() { // 海滩项目 // 卡包信息 - beego.Router(prefix+"/ht/cardholder/info", &controllers.HtCardHolderController{}, "post:Info") + beego.Router(prefix+"/cardholder/info", &controllers.CardHolderController{}, "post:Info") // 获取卡包 - beego.Router(prefix+"/ht/cardholder/getnew", &controllers.HtCardHolderController{}, "post:GetNew") + beego.Router(prefix+"/cardholder/getnew", &controllers.CardHolderController{}, "post:GetNew") // 卡包打开 - beego.Router(prefix+"/ht/cardholder/open", &controllers.HtCardHolderController{}, "post:Open") + beego.Router(prefix+"/cardholder/open", &controllers.CardHolderController{}, "post:Open") // 领取卡组奖励 - beego.Router(prefix+"/ht/cardholder/getrewardalbum", &controllers.HtCardHolderController{}, "post:GetRewardAlbum") + beego.Router(prefix+"/cardholder/getrewardalbum", &controllers.CardHolderController{}, "post:GetRewardAlbum") // 领取轮次奖励 - beego.Router(prefix+"/ht/cardholder/getrewardround", &controllers.HtCardHolderController{}, "post:GetRewardRound") + beego.Router(prefix+"/cardholder/getrewardround", &controllers.CardHolderController{}, "post:GetRewardRound") beego.ErrorController(&controllers.ErrorController{}) } diff --git a/service/cardholder/config-registry.go b/service/cardholder/config-registry.go new file mode 100644 index 0000000..30e4322 --- /dev/null +++ b/service/cardholder/config-registry.go @@ -0,0 +1,131 @@ +package cardholder + +import ( + "apigame/service/constd" + "apigame/util/util-lx/lxalilog" + "encoding/json" + "errors" + "fmt" + "strings" +) + +var ( + ConfigRaws CardActivityConfigRaw // 活动配置 原始数据 + Config CardActivityConfig // 活动配置 分析后数据 +) + +func NewConfigs() { + ConfigRaws = CardActivityConfigRaw{} + Config = CardActivityConfig{} +} + +// ConfigDecode 解析配置原始数据 +func ConfigDecode() { + Config = CardActivityConfig{ + Raw: ConfigRaws, + Id: ConfigRaws.Id, + Awards: make(map[string]string), + AlbumConfig: make(map[string]AlbumConfig), + CardConfig: make(map[int]CardConfig), + CardholderConfig: make(map[string]CardholderConfig), + NormalCardStarConfig: make(map[string]NormalCardStarConfig), + CardSequenceConfig: make(map[string]CardSequenceConfig), + } + // 解析奖励 + { + err := json.Unmarshal([]byte(ConfigRaws.Awards), &Config.Awards) + if err != nil { + lxalilog.Errors(err, ConfigRaws.Awards, constd.GAME_ID_HT, ConfigRaws.Id) + return + } + } + // 卡组配置 + { + configs := make([]AlbumConfig, 0) + err := json.Unmarshal([]byte(ConfigRaws.AlbumConfig), &configs) + if err != nil { + lxalilog.Errors(err, ConfigRaws.AlbumConfig, constd.GAME_ID_HT, ConfigRaws.Id) + return + } + for _, i2 := range configs { + Config.AlbumConfig[i2.SetId] = i2 + } + } + // 卡牌配置 + { + configs := make([]CardConfig, 0) + err := json.Unmarshal([]byte(ConfigRaws.CardConfig), &configs) + if err != nil { + lxalilog.Errors(err, ConfigRaws.CardConfig, constd.GAME_ID_HT, ConfigRaws.Id) + return + } + for _, i2 := range configs { + Config.CardConfig[i2.Id] = i2 + } + } + // 卡包开卡规则 + { + configs := make([]CardholderConfig, 0) + err := json.Unmarshal([]byte(ConfigRaws.CardHolderConfig), &configs) + if err != nil { + lxalilog.Errors(err, ConfigRaws.CardHolderConfig, constd.GAME_ID_HT, ConfigRaws.Id) + return + } + for _, i2 := range configs { + Config.CardholderConfig[i2.Id] = i2 + } + } + // 卡片星级配置 + { + configs := make([]NormalCardStarConfig, 0) + err := json.Unmarshal([]byte(ConfigRaws.NormalCardStarSequence), &configs) + if err != nil { + lxalilog.Errors(err, ConfigRaws.NormalCardStarSequence, constd.GAME_ID_HT, ConfigRaws.Id) + return + } + for _, i2 := range configs { + i2.NormalCardSequenceIds = strings.Split(i2.NormalCardSequenceId, ",") + combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) + Config.NormalCardStarConfig[combineId] = i2 + } + } + // 卡片星级对应卡牌配置 + { + configs := make([]CardSequenceConfig, 0) + err := json.Unmarshal([]byte(ConfigRaws.CardSequenceConfig), &configs) + if err != nil { + lxalilog.Errors(err, ConfigRaws.CardSequenceConfig, constd.GAME_ID_HT, ConfigRaws.Id) + return + } + for _, i2 := range configs { + i2.CardIdLists = strings.Split(i2.CardIdList, ",") + combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) + Config.CardSequenceConfig[combineId] = i2 + } + } +} + +// CombineIdSequenceIdCohort 组合ID k=ID_用户序列_用户分组 +func CombineIdSequenceIdCohort(id, sequenceId, cohort string) string { + return fmt.Sprintf("%s_%s_%s", id, sequenceId, cohort) +} + +// FindNormalCardStarConfig 查找配置 非保底卡星级ID +func FindNormalCardStarConfig(id, sequenceId, cohort string) (conf NormalCardStarConfig, has bool) { + combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort) + conf, has = Config.NormalCardStarConfig[combineId] + if !has { + lxalilog.Errors(errors.New("ht_cardholder NormalCardStarConfig error"), id, sequenceId, cohort) + } + return +} + +// FindCardSequenceConfig 查找配置 星级ID对应的卡片 +func FindCardSequenceConfig(id, sequenceId, cohort string) (conf CardSequenceConfig, has bool) { + combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort) + conf, has = Config.CardSequenceConfig[combineId] + if !has { + lxalilog.Errors(errors.New("ht_cardholder CardSequenceConfig error"), id, sequenceId, cohort) + } + return +} diff --git a/service/cardholder/config.go b/service/cardholder/config.go new file mode 100644 index 0000000..fe0f78d --- /dev/null +++ b/service/cardholder/config.go @@ -0,0 +1,89 @@ +package cardholder + +import "apigame/service/constd" + +// CardActivityUpdateConfig 卡牌活动更新配置 +type CardActivityUpdateConfig struct { + Id int64 // ID + Status int // 状态 0=关闭 1=开启 + UpdateTime int64 // 修改时间戳 +} + +// CardActivityConfig 卡牌活动配置 分析后数据 +type CardActivityConfig struct { + Raw CardActivityConfigRaw + Id int64 // ID + Awards map[string]string // 奖励配置 + AlbumConfig map[string]AlbumConfig // 卡组配置 + CardConfig map[int]CardConfig // 卡牌配置 + CardholderConfig map[string]CardholderConfig // 卡包开卡规则 + NormalCardStarConfig map[string]NormalCardStarConfig // k=ID_用户序列_用户分组 卡片星级配置 + CardSequenceConfig map[string]CardSequenceConfig // k=ID_用户序列_用户分组 卡片星级对应卡牌配置 +} + +func (c *CardActivityConfig) TableName() string { + return constd.MYSQL_TABLE_S_CARD_ACTIVITY + constd.GAME_ID_HT +} + +// CardActivityConfigRaw 卡牌活动配置 原始数据 +type CardActivityConfigRaw struct { + Id int64 // ID + OpenLevel int // 开启等级 + PreviewTime int64 // 预告时间 + StartTime int64 // 开始时间 + EndTime int64 // 结束时间 + Round int // 轮数 + Awards string // 奖励配置 + AlbumConfig string // 卡组配置 + CardConfig string // 卡牌配置 + CardHolderConfig string // 卡包开卡规则 + NormalCardStarSequence string // 卡片星级配置 + CardSequenceConfig string // 卡片星级对应卡牌配置 + Ver string // 版本号 + Status int // 状态 0=关闭 1=开启 + UpdateTime int64 // 修改时间戳 +} + +// AlbumConfig 卡组表 +type AlbumConfig struct { + SetId string `json:"set_id"` // 卡组id + Rewards map[string]string `json:"rewards"` // 集齐奖励 k=轮次 + StartTime int64 `json:"start_time"` // 开始时间 + EndTime int64 `json:"end_time"` // 结束时间 +} + +// CardConfig 卡牌表 +type CardConfig struct { + Id int `json:"id"` // ID + SetId string `json:"album_setid"` // 卡组id + IsGold int `json:"is_gold"` // 是否是金卡 + Star int `json:"star"` // 星级 +} + +// CardholderConfig 卡包开卡规则表 +type CardholderConfig struct { + Id string `json:"id"` // ID + IsGoldCardholder int `json:"is_gold_card_holder"` // 是否是金卡包 + IsNew int `json:"is_new"` // 是否是新卡包 + GuaranteedStarCardId string `json:"guaranteed_star_card_id"` // 保底卡星级序列ID + NormalCardNumber int `json:"normal_card_number"` // 非保底卡数量 + MinimumGuaranteeCardId string `json:"minimum_guarantee_card_id"` // 非保底卡牌序列ID +} + +// NormalCardStarConfig 非保底卡星级ID +type NormalCardStarConfig struct { + Id string `json:"id"` // ID + SequenceId string `json:"user_sequence_id"` // 用户序列组ID + Cohort string `json:"cohort"` // 用户分组 + NormalCardSequenceId string `json:"normal_card_sequence_id"` // 非保底星级序列 + NormalCardSequenceIds []string `json:"-"` // 非保底星级序列 +} + +// CardSequenceConfig 星级ID对应的卡片 +type CardSequenceConfig struct { + Id string `json:"id"` // SequenceId 用户序列组ID + SequenceId string `json:"user_sequence_id"` // 用户序列组ID + Cohort string `json:"cohort"` // 用户分组 + CardIdList string `json:"card_id_list"` // 卡牌抽取序列 + CardIdLists []string `json:"-"` // 卡牌抽取序列 +} diff --git a/service/cardholder/configs.go b/service/cardholder/configs.go new file mode 100644 index 0000000..2c57b52 --- /dev/null +++ b/service/cardholder/configs.go @@ -0,0 +1,69 @@ +package cardholder + +import ( + "apigame/service/constd" + "apigame/util/util-lx/lxalilog" + "apigame/util/utmysql" + "fmt" + "github.com/astaxie/beego/logs" +) + +// Init 初始化 +func Init() { + + NewConfigs() + + TryUpdateConfigs() + + //DumpConfigs() +} + +// TryUpdateConfigs 尝试更新配置表 +func TryUpdateConfigs() { + LoadConfigs() +} + +// LoadConfigs 读取mysql配置 +func LoadConfigs() { + configTableName := new(CardActivityConfig).TableName() + // 找到当前开放的活动 + configOpen := CardActivityUpdateConfig{Id: 0} + { + conf := make([]CardActivityUpdateConfig, 0) + sql := fmt.Sprintf("select id,status,update_time from %s", configTableName) + err := utmysql.FindSql(constd.MYSQL_MERGECONFIG, sql, &conf) + if err != nil { + lxalilog.Errors(err, sql, constd.GAME_ID_HT) + return + } + for _, config := range conf { + if config.Status != 0 { + configOpen = config + continue + } + } + fmt.Println(configOpen) + } + // 没有开放的活动 + if configOpen.Id == 0 { + return + } + // 更新数据 + if configOpen.Id != Config.Raw.Id || configOpen.UpdateTime != Config.Raw.UpdateTime { + logs.Debug("__________________尝试更新活动条目ID:", configOpen.Id) + confNew := CardActivityConfigRaw{} + sql := fmt.Sprintf("select * from %s where id=%d limit 1", configTableName, configOpen.Id) + err := utmysql.FindOneSql(constd.MYSQL_MERGECONFIG, sql, &confNew) + if err != nil { + lxalilog.Errors(err, sql, constd.GAME_ID_HT, configOpen.Id) + return + } + logs.Debug("__________________更新活动条目ID:", confNew.Id) + ConfigRaws = confNew + ConfigDecode() + } +} + +func DumpConfigs() { + +} diff --git a/service/cardholder/handle.go b/service/cardholder/handle.go new file mode 100644 index 0000000..76bc8ad --- /dev/null +++ b/service/cardholder/handle.go @@ -0,0 +1,296 @@ +package cardholder + +import ( + "apigame/dto" + "apigame/models" + "apigame/service/constd" + game_record "apigame/service/game-record" + "apigame/util/utjson" + "apigame/util/uttype" + "strconv" +) + +// HandleInfo 卡包信息 +func HandleInfo(req *models.ReqCardHolderInfo) (code string, rsp models.RspCardHolderInfo) { + rsp = models.RspCardHolderInfo{} + code = constd.RECODE_OK + + // 尝试更新配置 + TryUpdateConfigs() + + // 读取游戏数据 + gameData := LoadData(req.UID) + + rsp.CardHolderInfo = gameData.GetInfo() + + return +} + +// HandleGetNew 获取卡包 +func HandleGetNew(req *models.ReqCardHolderGetNew) (code string, rsp models.RspCardHolderGetNew) { + rsp = models.RspCardHolderGetNew{} + code = constd.RECODE_OK + + // 尝试更新配置 + TryUpdateConfigs() + + // 检查活动状态 + code = CheckStatus() + if code != constd.RECODE_OK { + return + } + // 检查卡包ID + _, okCardholderConfig := Config.CardholderConfig[strconv.Itoa(req.Id)] + if !okCardholderConfig { + code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR + return + } + // 检查卡包数量 + if req.Count < 1 { + code = constd.RECODE_MERGE_CARDHOLDER_COUNTILLEGAL_ERROR + return + } + + // 读取游戏数据 + gameData := LoadData(req.UID) + // 检查游戏数据 轮次等 + code = CheckGameData(gameData) + if code != constd.RECODE_OK { + return + } + + gameData.Details.Cardholder[req.Id] += req.Count + SaveData(gameData) + + // 返回信息 + rsp.CardHolderInfo = gameData.GetInfo() + + // 记录日志 + game_record.Save(dto.NewCardHolderRecordGetNew(gameData.Uid, Config.Id, gameData.Details.Round, + req.Id, req.Count)) + + return +} + +// HandleOpen 打开卡包 +func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardHolderOpen) { + rsp = models.RspCardHolderOpen{} + code = constd.RECODE_OK + + // 尝试更新配置 + TryUpdateConfigs() + + // 检查活动状态 + code = CheckStatus() + if code != constd.RECODE_OK { + return + } + // 检查卡包ID + confCardholder, okCardholderConfig := Config.CardholderConfig[strconv.Itoa(req.Id)] + if !okCardholderConfig { + code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR + return + } + + // 读取游戏数据 + gameData := LoadData(req.UID) + // 检查游戏数据 轮次等 + code = CheckGameData(gameData) + if code != constd.RECODE_OK { + return + } + + // 判断卡包数目 + countOld, _ := gameData.Details.Cardholder[req.Id] + if countOld < 1 { + code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDER_NOTENOUGH_ERROR + return + } + + // 开始处理抽卡 + sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID) + //logs.Debug("wjwdbg 用户序列组IDsequenceId", sequenceId) + //logs.Debug("wjwdbg 用户分组IDcohort:", cohort) + if confCardholder.IsNew != 0 { + // 如果是新卡包 按顺序查找数目最少的一张卡抽取 + cardId := GetNewCard(gameData) + //logs.Debug("wjwdbg 抽取新卡ID:", cardId) + // 增加卡牌 + gameData.Details.Cards[cardId] += 1 + rsp.NewCards = append(rsp.NewCards, cardId) + } else { + getCardFunc := func(cardConfigId string) { + confCardSequence, hasCardSequence := FindCardSequenceConfig(cardConfigId, sequenceId, cohort) + if hasCardSequence { + combineId := CombineIdSequenceIdCohort(cardConfigId, sequenceId, cohort) + scale := gameData.Details.CardSequenceScales[combineId] + cardId := GetOneFromArray(confCardSequence.CardIdLists, scale) + cardIdInt := uttype.StringToInt(cardId) + // 增加刻度 + gameData.Details.CardSequenceScales[combineId] = scale + 1 + // 增加卡牌 + gameData.Details.Cards[cardIdInt] += 1 + //logs.Debug("wjwdbg😊 抽取卡牌ID:", cardIdInt) + rsp.NewCards = append(rsp.NewCards, cardIdInt) + } + } + // 正常抽卡 + // 先抽保底卡 + if confCardholder.GuaranteedStarCardId != "0" { + getCardFunc(confCardholder.GuaranteedStarCardId) + //logs.Debug("wjwdbg 保底卡牌配置ID:", confCardholder.GuaranteedStarCardId) + } + // 非保底卡 + if confCardholder.NormalCardNumber > 0 { + count := confCardholder.NormalCardNumber + confNormalCardStar, hasNormalCardStar := FindNormalCardStarConfig(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort) + if hasNormalCardStar { + combineIdStar := CombineIdSequenceIdCohort(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort) + scaleStar := gameData.Details.StarSequenceScales[combineIdStar] + starIds := GetListFromArray(confNormalCardStar.NormalCardSequenceIds, scaleStar, count) + // 增加星级刻度 + gameData.Details.StarSequenceScales[combineIdStar] = scaleStar + count + //logs.Debug("wjwdbg 非保底卡星级ID:", confCardholder.MinimumGuaranteeCardId) + //logs.Debug("wjwdbg 非保底卡星级抽取序列:", starIds) + // 遍历星级刻度抽取n张卡牌 + for _, id := range starIds { + getCardFunc(id) + } + } + } + } + + // 删除一个卡包 + gameData.Details.Cardholder[req.Id] = countOld - 1 + + // 存档 + SaveData(gameData) + + // 记录日志 + game_record.Save(dto.NewCardHolderRecordOpen(gameData.Uid, Config.Id, gameData.Details.Round, + req.Id, utjson.JsonString(rsp.NewCards))) + + //logs.Debug("wjwdbg 获取卡牌列表:", rsp.NewCards) + uttype.Shuffle(rsp.NewCards) + //logs.Debug("wjwdbg 获取卡牌列表打乱:", rsp.NewCards) + + // 返回信息 + rsp.CardHolderInfo = gameData.GetInfo() + + return +} + +// HandleGetRewardAlbum 领取卡组奖励 +func HandleGetRewardAlbum(req *models.ReqCardHolderGetRewardAlbum) (code string, rsp models.RspCardHolderGetRewardAlbum) { + rsp = models.RspCardHolderGetRewardAlbum{} + code = constd.RECODE_OK + + // 尝试更新配置 + TryUpdateConfigs() + + // 检查活动状态 + code = CheckStatus() + if code != constd.RECODE_OK { + return + } + // 检查卡组ID + albumId := strconv.Itoa(req.Id) + confAlbum, okAlbum := Config.AlbumConfig[albumId] + if !okAlbum { + code = constd.RECODE_MERGE_CARDHOLDER_ALBUMID_ERROR + return + } + + // 读取游戏数据 + gameData := LoadData(req.UID) + // 检查游戏数据 轮次等 + code = CheckGameData(gameData) + if code != constd.RECODE_OK { + return + } + + // 是否已领过 + countGot := gameData.Details.Album[albumId] + if countGot > 0 { + code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_HASGOT_ERROR + return + } + // 检查卡组内卡是否集齐 + for _, config := range Config.CardConfig { + if config.SetId == albumId { + count := gameData.Details.Cards[config.Id] + if count < 1 { + code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_NOTFINISH_ERROR + return + } + } + } + + gameData.Details.Album[albumId] += 1 + SaveData(gameData) + + // 当前轮次 + round := gameData.Details.Round + // 返回奖励 + rsp.Award = confAlbum.Rewards[uttype.IntToString(round)] + + // 返回信息 + rsp.CardHolderInfo = gameData.GetInfo() + + // 记录日志 + game_record.Save(dto.NewCardHolderRecordRewardAlbum(gameData.Uid, Config.Id, gameData.Details.Round, + req.Id, rsp.Award)) + + return +} + +// HandleGetRewardRound 领取轮次奖励 +func HandleGetRewardRound(req *models.ReqCardHolderGetRewardRound) (code string, rsp models.RspCardHolderGetRewardRound) { + rsp = models.RspCardHolderGetRewardRound{} + code = constd.RECODE_OK + + // 尝试更新配置 + TryUpdateConfigs() + + // 检查活动状态 + code = CheckStatus() + if code != constd.RECODE_OK { + return + } + + // 读取游戏数据 + gameData := LoadData(req.UID) + // 检查游戏数据 轮次等 + code = CheckGameData(gameData) + if code != constd.RECODE_OK { + return + } + + // 判断所有卡组是否已经集齐 + // 检查卡组内卡是否集齐 + for _, config := range Config.AlbumConfig { + count := gameData.Details.Album[config.SetId] + if count < 1 { + code = constd.RECODE_MERGE_CARDHOLDER_ROUND_NOTFINISH_ERROR + return + } + } + + // 当前轮次 + round := gameData.Details.Round + // 返回奖励 + rsp.Award = Config.Awards[uttype.IntToString(round)] + + // 记录日志 + game_record.Save(dto.NewCardHolderRecordRewardRound(gameData.Uid, Config.Id, gameData.Details.Round, + rsp.Award)) + + // 处理轮次完成 + HandleNextRound(gameData) + SaveData(gameData) + + // 返回信息 + rsp.CardHolderInfo = gameData.GetInfo() + + return +} diff --git a/service/cardholder/logic.go b/service/cardholder/logic.go new file mode 100644 index 0000000..aa7723c --- /dev/null +++ b/service/cardholder/logic.go @@ -0,0 +1,137 @@ +package cardholder + +import ( + "apigame/dto" + "apigame/service/constd" + "apigame/util/util-lx/lxalilog" + "apigame/util/util-lx/lxtime" + "apigame/util/uttype" + "github.com/astaxie/beego/orm" +) + +// SaveData 存储数据 +func SaveData(d *dto.CardHolderData) { + d.UpdateTime = lxtime.NowUninx() + d.Encode() + o := orm.NewOrm() + o.Using(constd.MYSQL_DEFAULT) + if _, err := o.InsertOrUpdate(d); err != nil { + lxalilog.Errors(err, "ht_cardholder SaveData Error", d.Uid) + } +} + +func _LoadData(uid int64) (d *dto.CardHolderData) { + d = dto.NewCardHolderData(uid) + o := orm.NewOrm() + o.Using(constd.MYSQL_DEFAULT) + qs := o.QueryTable(d) + qs = qs.Filter("uid", uid) + count, err := qs.Count() + if count == 0 { + d.CreateTime = lxtime.NowUninx() + } else { + err = qs.One(d) + if err != nil { + lxalilog.Errors(err, "ht_cardholder LoadData Error", uid) + } else { + d.Details = dto.NewCardHolderDataDetails() + d.Decode() + } + } + return +} + +// LoadData 获取数据 外部接口 +func LoadData(uid int64) (d *dto.CardHolderData) { + d = _LoadData(uid) + // 如果当前有上线活动(活动ID不为0),且活动ID和玩家数据不同,说明活动已切换 需更新 + if Config.Id != 0 && + Config.Id != d.ActivityId { + d.ActivityId = Config.Id + d.Details = dto.NewCardHolderDataDetails() + SaveData(d) + } + return +} + +// CheckStatus 判断活动是否开启 +func CheckStatus() string { + sec := lxtime.NowUninx() + if Config.Id == 0 { + return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR + } + if sec < Config.Raw.StartTime { + return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR + } + if sec > Config.Raw.EndTime { + return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR + } + return constd.RECODE_OK +} + +// CheckGameData 检查游戏数据 轮次等 +func CheckGameData(d *dto.CardHolderData) string { + if d.Details.Round > Config.Raw.Round { + return constd.RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR + } + return constd.RECODE_OK +} + +// GetUserSequenceIdAndCohort 获取 用户序列组ID(sequenceId) 用户分组(cohort) +func GetUserSequenceIdAndCohort(uid int64) (sequenceId, cohort string) { + // todo 这里后续要对接 + sequenceId = "1" + cohort = "1" + return +} + +// GetOneFromArray 从配置的数组里获取一个值 scale=之前刻度 +func GetOneFromArray(array []string, scale int) string { + length := len(array) + if length < 1 { + return "" + } + if length == 1 { + return array[0] + } + return array[scale%length] +} + +// GetListFromArray 从配置的数组里获取一组值 scale=之前刻度 count=数目 +func GetListFromArray(array []string, scale, count int) []string { + list := make([]string, 0) + if count < 0 { + return list + } + s := scale + for i := 0; i < count; i++ { + one := GetOneFromArray(array, s) + list = append(list, one) + s++ + } + return list +} + +// GetNewCard 按顺序查找数目最少的一张卡抽取 +func GetNewCard(gameData *dto.CardHolderData) int { + if len(Config.CardConfig) < 1 { + return 0 + } + rate := int64(100000000) + list := make([]int64, 0) + for id, _ := range Config.CardConfig { + count, _ := gameData.Details.Cards[id] + index := int64(count)*rate + int64(id) + list = append(list, index) + } + + indexMin := uttype.Min(list...) + return int(indexMin % rate) +} + +// HandleNextRound 处理轮次完成 保留卡包 星级序列刻度 卡牌序列刻度 +func HandleNextRound(gameData *dto.CardHolderData) { + gameData.Details.Round += 1 + gameData.Details.Cards = make(map[int]int) + gameData.Details.Album = make(map[string]int) +} diff --git a/service/ht-cardholder/config-registry.go b/service/ht-cardholder/config-registry.go deleted file mode 100644 index 01ec613..0000000 --- a/service/ht-cardholder/config-registry.go +++ /dev/null @@ -1,131 +0,0 @@ -package ht_cardholder - -import ( - "apigame/service/constd" - "apigame/util/util-lx/lxalilog" - "encoding/json" - "errors" - "fmt" - "strings" -) - -var ( - ConfigRaws CardActivityConfigRaw // 活动配置 原始数据 - Config CardActivityConfig // 活动配置 分析后数据 -) - -func NewConfigs() { - ConfigRaws = CardActivityConfigRaw{} - Config = CardActivityConfig{} -} - -// ConfigDecode 解析配置原始数据 -func ConfigDecode() { - Config = CardActivityConfig{ - Raw: ConfigRaws, - Id: ConfigRaws.Id, - Awards: make(map[string]string), - AlbumConfig: make(map[string]AlbumConfig), - CardConfig: make(map[int]CardConfig), - CardholderConfig: make(map[string]CardholderConfig), - NormalCardStarConfig: make(map[string]NormalCardStarConfig), - CardSequenceConfig: make(map[string]CardSequenceConfig), - } - // 解析奖励 - { - err := json.Unmarshal([]byte(ConfigRaws.Awards), &Config.Awards) - if err != nil { - lxalilog.Errors(err, ConfigRaws.Awards, constd.GAME_ID_HT, ConfigRaws.Id) - return - } - } - // 卡组配置 - { - configs := make([]AlbumConfig, 0) - err := json.Unmarshal([]byte(ConfigRaws.AlbumConfig), &configs) - if err != nil { - lxalilog.Errors(err, ConfigRaws.AlbumConfig, constd.GAME_ID_HT, ConfigRaws.Id) - return - } - for _, i2 := range configs { - Config.AlbumConfig[i2.SetId] = i2 - } - } - // 卡牌配置 - { - configs := make([]CardConfig, 0) - err := json.Unmarshal([]byte(ConfigRaws.CardConfig), &configs) - if err != nil { - lxalilog.Errors(err, ConfigRaws.CardConfig, constd.GAME_ID_HT, ConfigRaws.Id) - return - } - for _, i2 := range configs { - Config.CardConfig[i2.Id] = i2 - } - } - // 卡包开卡规则 - { - configs := make([]CardholderConfig, 0) - err := json.Unmarshal([]byte(ConfigRaws.CardHolderConfig), &configs) - if err != nil { - lxalilog.Errors(err, ConfigRaws.CardHolderConfig, constd.GAME_ID_HT, ConfigRaws.Id) - return - } - for _, i2 := range configs { - Config.CardholderConfig[i2.Id] = i2 - } - } - // 卡片星级配置 - { - configs := make([]NormalCardStarConfig, 0) - err := json.Unmarshal([]byte(ConfigRaws.NormalCardStarSequence), &configs) - if err != nil { - lxalilog.Errors(err, ConfigRaws.NormalCardStarSequence, constd.GAME_ID_HT, ConfigRaws.Id) - return - } - for _, i2 := range configs { - i2.NormalCardSequenceIds = strings.Split(i2.NormalCardSequenceId, ",") - combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) - Config.NormalCardStarConfig[combineId] = i2 - } - } - // 卡片星级对应卡牌配置 - { - configs := make([]CardSequenceConfig, 0) - err := json.Unmarshal([]byte(ConfigRaws.CardSequenceConfig), &configs) - if err != nil { - lxalilog.Errors(err, ConfigRaws.CardSequenceConfig, constd.GAME_ID_HT, ConfigRaws.Id) - return - } - for _, i2 := range configs { - i2.CardIdLists = strings.Split(i2.CardIdList, ",") - combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) - Config.CardSequenceConfig[combineId] = i2 - } - } -} - -// CombineIdSequenceIdCohort 组合ID k=ID_用户序列_用户分组 -func CombineIdSequenceIdCohort(id, sequenceId, cohort string) string { - return fmt.Sprintf("%s_%s_%s", id, sequenceId, cohort) -} - -// FindNormalCardStarConfig 查找配置 非保底卡星级ID -func FindNormalCardStarConfig(id, sequenceId, cohort string) (conf NormalCardStarConfig, has bool) { - combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort) - conf, has = Config.NormalCardStarConfig[combineId] - if !has { - lxalilog.Errors(errors.New("ht_cardholder NormalCardStarConfig error"), id, sequenceId, cohort) - } - return -} - -// FindCardSequenceConfig 查找配置 星级ID对应的卡片 -func FindCardSequenceConfig(id, sequenceId, cohort string) (conf CardSequenceConfig, has bool) { - combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort) - conf, has = Config.CardSequenceConfig[combineId] - if !has { - lxalilog.Errors(errors.New("ht_cardholder CardSequenceConfig error"), id, sequenceId, cohort) - } - return -} diff --git a/service/ht-cardholder/config.go b/service/ht-cardholder/config.go deleted file mode 100644 index d2a4e23..0000000 --- a/service/ht-cardholder/config.go +++ /dev/null @@ -1,89 +0,0 @@ -package ht_cardholder - -import "apigame/service/constd" - -// CardActivityUpdateConfig 卡牌活动更新配置 -type CardActivityUpdateConfig struct { - Id int64 // ID - Status int // 状态 0=关闭 1=开启 - UpdateTime int64 // 修改时间戳 -} - -// CardActivityConfig 卡牌活动配置 分析后数据 -type CardActivityConfig struct { - Raw CardActivityConfigRaw - Id int64 // ID - Awards map[string]string // 奖励配置 - AlbumConfig map[string]AlbumConfig // 卡组配置 - CardConfig map[int]CardConfig // 卡牌配置 - CardholderConfig map[string]CardholderConfig // 卡包开卡规则 - NormalCardStarConfig map[string]NormalCardStarConfig // k=ID_用户序列_用户分组 卡片星级配置 - CardSequenceConfig map[string]CardSequenceConfig // k=ID_用户序列_用户分组 卡片星级对应卡牌配置 -} - -func (c *CardActivityConfig) TableName() string { - return constd.MYSQL_TABLE_S_CARD_ACTIVITY + constd.GAME_ID_HT -} - -// CardActivityConfigRaw 卡牌活动配置 原始数据 -type CardActivityConfigRaw struct { - Id int64 // ID - OpenLevel int // 开启等级 - PreviewTime int64 // 预告时间 - StartTime int64 // 开始时间 - EndTime int64 // 结束时间 - Round int // 轮数 - Awards string // 奖励配置 - AlbumConfig string // 卡组配置 - CardConfig string // 卡牌配置 - CardHolderConfig string // 卡包开卡规则 - NormalCardStarSequence string // 卡片星级配置 - CardSequenceConfig string // 卡片星级对应卡牌配置 - Ver string // 版本号 - Status int // 状态 0=关闭 1=开启 - UpdateTime int64 // 修改时间戳 -} - -// AlbumConfig 卡组表 -type AlbumConfig struct { - SetId string `json:"set_id"` // 卡组id - Rewards map[string]string `json:"rewards"` // 集齐奖励 k=轮次 - StartTime int64 `json:"start_time"` // 开始时间 - EndTime int64 `json:"end_time"` // 结束时间 -} - -// CardConfig 卡牌表 -type CardConfig struct { - Id int `json:"id"` // ID - SetId string `json:"album_setid"` // 卡组id - IsGold int `json:"is_gold"` // 是否是金卡 - Star int `json:"star"` // 星级 -} - -// CardholderConfig 卡包开卡规则表 -type CardholderConfig struct { - Id string `json:"id"` // ID - IsGoldCardholder int `json:"is_gold_card_holder"` // 是否是金卡包 - IsNew int `json:"is_new"` // 是否是新卡包 - GuaranteedStarCardId string `json:"guaranteed_star_card_id"` // 保底卡星级序列ID - NormalCardNumber int `json:"normal_card_number"` // 非保底卡数量 - MinimumGuaranteeCardId string `json:"minimum_guarantee_card_id"` // 非保底卡牌序列ID -} - -// NormalCardStarConfig 非保底卡星级ID -type NormalCardStarConfig struct { - Id string `json:"id"` // ID - SequenceId string `json:"user_sequence_id"` // 用户序列组ID - Cohort string `json:"cohort"` // 用户分组 - NormalCardSequenceId string `json:"normal_card_sequence_id"` // 非保底星级序列 - NormalCardSequenceIds []string `json:"-"` // 非保底星级序列 -} - -// CardSequenceConfig 星级ID对应的卡片 -type CardSequenceConfig struct { - Id string `json:"id"` // SequenceId 用户序列组ID - SequenceId string `json:"user_sequence_id"` // 用户序列组ID - Cohort string `json:"cohort"` // 用户分组 - CardIdList string `json:"card_id_list"` // 卡牌抽取序列 - CardIdLists []string `json:"-"` // 卡牌抽取序列 -} diff --git a/service/ht-cardholder/configs.go b/service/ht-cardholder/configs.go deleted file mode 100644 index 737027f..0000000 --- a/service/ht-cardholder/configs.go +++ /dev/null @@ -1,69 +0,0 @@ -package ht_cardholder - -import ( - "apigame/service/constd" - "apigame/util/util-lx/lxalilog" - "apigame/util/utmysql" - "fmt" - "github.com/astaxie/beego/logs" -) - -// Init 初始化 -func Init() { - - NewConfigs() - - TryUpdateConfigs() - - //DumpConfigs() -} - -// TryUpdateConfigs 尝试更新配置表 -func TryUpdateConfigs() { - LoadConfigs() -} - -// LoadConfigs 读取mysql配置 -func LoadConfigs() { - configTableName := new(CardActivityConfig).TableName() - // 找到当前开放的活动 - configOpen := CardActivityUpdateConfig{Id: 0} - { - conf := make([]CardActivityUpdateConfig, 0) - sql := fmt.Sprintf("select id,status,update_time from %s", configTableName) - err := utmysql.FindSql(constd.MYSQL_MERGECONFIG, sql, &conf) - if err != nil { - lxalilog.Errors(err, sql, constd.GAME_ID_HT) - return - } - for _, config := range conf { - if config.Status != 0 { - configOpen = config - continue - } - } - fmt.Println(configOpen) - } - // 没有开放的活动 - if configOpen.Id == 0 { - return - } - // 更新数据 - if configOpen.Id != Config.Raw.Id || configOpen.UpdateTime != Config.Raw.UpdateTime { - logs.Debug("__________________尝试更新活动条目ID:", configOpen.Id) - confNew := CardActivityConfigRaw{} - sql := fmt.Sprintf("select * from %s where id=%d limit 1", configTableName, configOpen.Id) - err := utmysql.FindOneSql(constd.MYSQL_MERGECONFIG, sql, &confNew) - if err != nil { - lxalilog.Errors(err, sql, constd.GAME_ID_HT, configOpen.Id) - return - } - logs.Debug("__________________更新活动条目ID:", confNew.Id) - ConfigRaws = confNew - ConfigDecode() - } -} - -func DumpConfigs() { - -} diff --git a/service/ht-cardholder/handle.go b/service/ht-cardholder/handle.go deleted file mode 100644 index 644787c..0000000 --- a/service/ht-cardholder/handle.go +++ /dev/null @@ -1,296 +0,0 @@ -package ht_cardholder - -import ( - "apigame/dto" - "apigame/models" - "apigame/service/constd" - game_record "apigame/service/game-record" - "apigame/util/utjson" - "apigame/util/uttype" - "strconv" -) - -// HandleInfo 卡包信息 -func HandleInfo(req *models.ReqHtCardHolderInfo) (code string, rsp models.RspHtCardHolderInfo) { - rsp = models.RspHtCardHolderInfo{} - code = constd.RECODE_OK - - // 尝试更新配置 - TryUpdateConfigs() - - // 读取游戏数据 - gameData := LoadData(req.UID) - - rsp.HtCardHolderInfo = gameData.GetInfo() - - return -} - -// HandleGetNew 获取卡包 -func HandleGetNew(req *models.ReqHtCardHolderGetNew) (code string, rsp models.RspHtCardHolderGetNew) { - rsp = models.RspHtCardHolderGetNew{} - code = constd.RECODE_OK - - // 尝试更新配置 - TryUpdateConfigs() - - // 检查活动状态 - code = CheckStatus() - if code != constd.RECODE_OK { - return - } - // 检查卡包ID - _, okCardholderConfig := Config.CardholderConfig[strconv.Itoa(req.Id)] - if !okCardholderConfig { - code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR - return - } - // 检查卡包数量 - if req.Count < 1 { - code = constd.RECODE_MERGE_CARDHOLDER_COUNTILLEGAL_ERROR - return - } - - // 读取游戏数据 - gameData := LoadData(req.UID) - // 检查游戏数据 轮次等 - code = CheckGameData(gameData) - if code != constd.RECODE_OK { - return - } - - gameData.Details.Cardholder[req.Id] += req.Count - SaveData(gameData) - - // 返回信息 - rsp.HtCardHolderInfo = gameData.GetInfo() - - // 记录日志 - game_record.Save(dto.NewHtCardHolderRecordGetNew(gameData.Uid, Config.Id, gameData.Details.Round, - req.Id, req.Count)) - - return -} - -// HandleOpen 打开卡包 -func HandleOpen(req *models.ReqHtCardHolderOpen) (code string, rsp models.RspHtCardHolderOpen) { - rsp = models.RspHtCardHolderOpen{} - code = constd.RECODE_OK - - // 尝试更新配置 - TryUpdateConfigs() - - // 检查活动状态 - code = CheckStatus() - if code != constd.RECODE_OK { - return - } - // 检查卡包ID - confCardholder, okCardholderConfig := Config.CardholderConfig[strconv.Itoa(req.Id)] - if !okCardholderConfig { - code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR - return - } - - // 读取游戏数据 - gameData := LoadData(req.UID) - // 检查游戏数据 轮次等 - code = CheckGameData(gameData) - if code != constd.RECODE_OK { - return - } - - // 判断卡包数目 - countOld, _ := gameData.Details.Cardholder[req.Id] - if countOld < 1 { - code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDER_NOTENOUGH_ERROR - return - } - - // 开始处理抽卡 - sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID) - //logs.Debug("wjwdbg 用户序列组IDsequenceId", sequenceId) - //logs.Debug("wjwdbg 用户分组IDcohort:", cohort) - if confCardholder.IsNew != 0 { - // 如果是新卡包 按顺序查找数目最少的一张卡抽取 - cardId := GetNewCard(gameData) - //logs.Debug("wjwdbg 抽取新卡ID:", cardId) - // 增加卡牌 - gameData.Details.Cards[cardId] += 1 - rsp.NewCards = append(rsp.NewCards, cardId) - } else { - getCardFunc := func(cardConfigId string) { - confCardSequence, hasCardSequence := FindCardSequenceConfig(cardConfigId, sequenceId, cohort) - if hasCardSequence { - combineId := CombineIdSequenceIdCohort(cardConfigId, sequenceId, cohort) - scale := gameData.Details.CardSequenceScales[combineId] - cardId := GetOneFromArray(confCardSequence.CardIdLists, scale) - cardIdInt := uttype.StringToInt(cardId) - // 增加刻度 - gameData.Details.CardSequenceScales[combineId] = scale + 1 - // 增加卡牌 - gameData.Details.Cards[cardIdInt] += 1 - //logs.Debug("wjwdbg😊 抽取卡牌ID:", cardIdInt) - rsp.NewCards = append(rsp.NewCards, cardIdInt) - } - } - // 正常抽卡 - // 先抽保底卡 - if confCardholder.GuaranteedStarCardId != "0" { - getCardFunc(confCardholder.GuaranteedStarCardId) - //logs.Debug("wjwdbg 保底卡牌配置ID:", confCardholder.GuaranteedStarCardId) - } - // 非保底卡 - if confCardholder.NormalCardNumber > 0 { - count := confCardholder.NormalCardNumber - confNormalCardStar, hasNormalCardStar := FindNormalCardStarConfig(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort) - if hasNormalCardStar { - combineIdStar := CombineIdSequenceIdCohort(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort) - scaleStar := gameData.Details.StarSequenceScales[combineIdStar] - starIds := GetListFromArray(confNormalCardStar.NormalCardSequenceIds, scaleStar, count) - // 增加星级刻度 - gameData.Details.StarSequenceScales[combineIdStar] = scaleStar + count - //logs.Debug("wjwdbg 非保底卡星级ID:", confCardholder.MinimumGuaranteeCardId) - //logs.Debug("wjwdbg 非保底卡星级抽取序列:", starIds) - // 遍历星级刻度抽取n张卡牌 - for _, id := range starIds { - getCardFunc(id) - } - } - } - } - - // 删除一个卡包 - gameData.Details.Cardholder[req.Id] = countOld - 1 - - // 存档 - SaveData(gameData) - - // 记录日志 - game_record.Save(dto.NewHtCardHolderRecordOpen(gameData.Uid, Config.Id, gameData.Details.Round, - req.Id, utjson.JsonString(rsp.NewCards))) - - //logs.Debug("wjwdbg 获取卡牌列表:", rsp.NewCards) - uttype.Shuffle(rsp.NewCards) - //logs.Debug("wjwdbg 获取卡牌列表打乱:", rsp.NewCards) - - // 返回信息 - rsp.HtCardHolderInfo = gameData.GetInfo() - - return -} - -// HandleGetRewardAlbum 领取卡组奖励 -func HandleGetRewardAlbum(req *models.ReqHtCardHolderGetRewardAlbum) (code string, rsp models.RspHtCardHolderGetRewardAlbum) { - rsp = models.RspHtCardHolderGetRewardAlbum{} - code = constd.RECODE_OK - - // 尝试更新配置 - TryUpdateConfigs() - - // 检查活动状态 - code = CheckStatus() - if code != constd.RECODE_OK { - return - } - // 检查卡组ID - albumId := strconv.Itoa(req.Id) - confAlbum, okAlbum := Config.AlbumConfig[albumId] - if !okAlbum { - code = constd.RECODE_MERGE_CARDHOLDER_ALBUMID_ERROR - return - } - - // 读取游戏数据 - gameData := LoadData(req.UID) - // 检查游戏数据 轮次等 - code = CheckGameData(gameData) - if code != constd.RECODE_OK { - return - } - - // 是否已领过 - countGot := gameData.Details.Album[albumId] - if countGot > 0 { - code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_HASGOT_ERROR - return - } - // 检查卡组内卡是否集齐 - for _, config := range Config.CardConfig { - if config.SetId == albumId { - count := gameData.Details.Cards[config.Id] - if count < 1 { - code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_NOTFINISH_ERROR - return - } - } - } - - gameData.Details.Album[albumId] += 1 - SaveData(gameData) - - // 当前轮次 - round := gameData.Details.Round - // 返回奖励 - rsp.Award = confAlbum.Rewards[uttype.IntToString(round)] - - // 返回信息 - rsp.HtCardHolderInfo = gameData.GetInfo() - - // 记录日志 - game_record.Save(dto.NewHtCardHolderRecordRewardAlbum(gameData.Uid, Config.Id, gameData.Details.Round, - req.Id, rsp.Award)) - - return -} - -// HandleGetRewardRound 领取轮次奖励 -func HandleGetRewardRound(req *models.ReqHtCardHolderGetRewardRound) (code string, rsp models.RspHtCardHolderGetRewardRound) { - rsp = models.RspHtCardHolderGetRewardRound{} - code = constd.RECODE_OK - - // 尝试更新配置 - TryUpdateConfigs() - - // 检查活动状态 - code = CheckStatus() - if code != constd.RECODE_OK { - return - } - - // 读取游戏数据 - gameData := LoadData(req.UID) - // 检查游戏数据 轮次等 - code = CheckGameData(gameData) - if code != constd.RECODE_OK { - return - } - - // 判断所有卡组是否已经集齐 - // 检查卡组内卡是否集齐 - for _, config := range Config.AlbumConfig { - count := gameData.Details.Album[config.SetId] - if count < 1 { - code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_NOTFINISH_ERROR - return - } - } - - // 当前轮次 - round := gameData.Details.Round - // 返回奖励 - rsp.Award = Config.Awards[uttype.IntToString(round)] - - // 记录日志 - game_record.Save(dto.NewHtCardHolderRecordRewardRound(gameData.Uid, Config.Id, gameData.Details.Round, - rsp.Award)) - - // 处理轮次完成 - HandleNextRound(gameData) - SaveData(gameData) - - // 返回信息 - rsp.HtCardHolderInfo = gameData.GetInfo() - - return -} diff --git a/service/ht-cardholder/logic.go b/service/ht-cardholder/logic.go deleted file mode 100644 index 39f5772..0000000 --- a/service/ht-cardholder/logic.go +++ /dev/null @@ -1,137 +0,0 @@ -package ht_cardholder - -import ( - "apigame/dto" - "apigame/service/constd" - "apigame/util/util-lx/lxalilog" - "apigame/util/util-lx/lxtime" - "apigame/util/uttype" - "github.com/astaxie/beego/orm" -) - -// SaveData 存储数据 -func SaveData(d *dto.HtCardHolderData) { - d.UpdateTime = lxtime.NowUninx() - d.Encode() - o := orm.NewOrm() - o.Using(constd.MYSQL_DEFAULT) - if _, err := o.InsertOrUpdate(d); err != nil { - lxalilog.Errors(err, "ht_cardholder SaveData Error", d.Uid) - } -} - -func _LoadData(uid int64) (d *dto.HtCardHolderData) { - d = dto.NewHtCardHolderData(uid) - o := orm.NewOrm() - o.Using(constd.MYSQL_DEFAULT) - qs := o.QueryTable(d) - qs = qs.Filter("uid", uid) - count, err := qs.Count() - if count == 0 { - d.CreateTime = lxtime.NowUninx() - } else { - err = qs.One(d) - if err != nil { - lxalilog.Errors(err, "ht_cardholder LoadData Error", uid) - } else { - d.Details = dto.NewHtCardHolderDataDetails() - d.Decode() - } - } - return -} - -// LoadData 获取数据 外部接口 -func LoadData(uid int64) (d *dto.HtCardHolderData) { - d = _LoadData(uid) - // 如果当前有上线活动(活动ID不为0),且活动ID和玩家数据不同,说明活动已切换 需更新 - if Config.Id != 0 && - Config.Id != d.ActivityId { - d.ActivityId = Config.Id - d.Details = dto.NewHtCardHolderDataDetails() - SaveData(d) - } - return -} - -// CheckStatus 判断活动是否开启 -func CheckStatus() string { - sec := lxtime.NowUninx() - if Config.Id == 0 { - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR - } - if sec < Config.Raw.StartTime { - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR - } - if sec > Config.Raw.EndTime { - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR - } - return constd.RECODE_OK -} - -// CheckGameData 检查游戏数据 轮次等 -func CheckGameData(d *dto.HtCardHolderData) string { - if d.Details.Round > Config.Raw.Round { - return constd.RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR - } - return constd.RECODE_OK -} - -// GetUserSequenceIdAndCohort 获取 用户序列组ID(sequenceId) 用户分组(cohort) -func GetUserSequenceIdAndCohort(uid int64) (sequenceId, cohort string) { - // todo 这里后续要对接 - sequenceId = "1" - cohort = "1" - return -} - -// GetOneFromArray 从配置的数组里获取一个值 scale=之前刻度 -func GetOneFromArray(array []string, scale int) string { - length := len(array) - if length < 1 { - return "" - } - if length == 1 { - return array[0] - } - return array[scale%length] -} - -// GetListFromArray 从配置的数组里获取一组值 scale=之前刻度 count=数目 -func GetListFromArray(array []string, scale, count int) []string { - list := make([]string, 0) - if count < 0 { - return list - } - s := scale - for i := 0; i < count; i++ { - one := GetOneFromArray(array, s) - list = append(list, one) - s++ - } - return list -} - -// GetNewCard 按顺序查找数目最少的一张卡抽取 -func GetNewCard(gameData *dto.HtCardHolderData) int { - if len(Config.CardConfig) < 1 { - return 0 - } - rate := int64(100000000) - list := make([]int64, 0) - for id, _ := range Config.CardConfig { - count, _ := gameData.Details.Cards[id] - index := int64(count)*rate + int64(id) - list = append(list, index) - } - - indexMin := uttype.Min(list...) - return int(indexMin % rate) -} - -// HandleNextRound 处理轮次完成 保留卡包 星级序列刻度 卡牌序列刻度 -func HandleNextRound(gameData *dto.HtCardHolderData) { - gameData.Details.Round += 1 - gameData.Details.Cards = make(map[int]int) - gameData.Details.Album = make(map[string]int) -} -- libgit2 0.21.0