Commit bb2b13bb01807ee51a8b721f4daa7fa4f91c28cd

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

faet: 卡牌功能重构为支持多个游戏

@@ -17,6 +17,6 @@ @@ -17,6 +17,6 @@
17 17
18 ## 游戏和游戏功能列表 18 ## 游戏和游戏功能列表
19 19
20 -| 功能模块名 | 所属游戏 | 所属功能 | 负责人 |  
21 -|---------------|------|------|-----|  
22 -| ht-cardholder | 海滩 | 卡包卡牌 | 王家文 | 20 +| 功能模块名 | 所属功能 | 负责人 |
  21 +|---------------|------|-----|
  22 +| cardholder | 卡包卡牌 | 王家文 |
controllers/cardholder.go 0 → 100644
@@ -0,0 +1,71 @@ @@ -0,0 +1,71 @@
  1 +package controllers
  2 +
  3 +import (
  4 + "apigame/models"
  5 + "apigame/service/cardholder"
  6 +)
  7 +
  8 +// CardHolderController 绑定控制器
  9 +type CardHolderController struct {
  10 + BaseController
  11 +}
  12 +
  13 +// Info 卡包信息
  14 +func (c *CardHolderController) Info() {
  15 + req := new(models.ReqCardHolderInfo)
  16 + if !c.GetPostData(req) {
  17 + return
  18 + }
  19 +
  20 + code, rsp := cardholder.HandleInfo(req)
  21 +
  22 + c.RetRspCodeData(code, rsp)
  23 +}
  24 +
  25 +// GetNew 获取卡包
  26 +func (c *CardHolderController) GetNew() {
  27 + req := new(models.ReqCardHolderGetNew)
  28 + if !c.GetPostData(req) {
  29 + return
  30 + }
  31 +
  32 + code, rsp := cardholder.HandleGetNew(req)
  33 +
  34 + c.RetRspCodeData(code, rsp)
  35 +}
  36 +
  37 +// Open 卡包打开
  38 +func (c *CardHolderController) Open() {
  39 + req := new(models.ReqCardHolderOpen)
  40 + if !c.GetPostData(req) {
  41 + return
  42 + }
  43 +
  44 + code, rsp := cardholder.HandleOpen(req)
  45 +
  46 + c.RetRspCodeData(code, rsp)
  47 +}
  48 +
  49 +// GetRewardAlbum 领取卡组奖励
  50 +func (c *CardHolderController) GetRewardAlbum() {
  51 + req := new(models.ReqCardHolderGetRewardAlbum)
  52 + if !c.GetPostData(req) {
  53 + return
  54 + }
  55 +
  56 + code, rsp := cardholder.HandleGetRewardAlbum(req)
  57 +
  58 + c.RetRspCodeData(code, rsp)
  59 +}
  60 +
  61 +// GetRewardRound 领取轮次奖励
  62 +func (c *CardHolderController) GetRewardRound() {
  63 + req := new(models.ReqCardHolderGetRewardRound)
  64 + if !c.GetPostData(req) {
  65 + return
  66 + }
  67 +
  68 + code, rsp := cardholder.HandleGetRewardRound(req)
  69 +
  70 + c.RetRspCodeData(code, rsp)
  71 +}
controllers/ht-cardholder.go
@@ -1,71 +0,0 @@ @@ -1,71 +0,0 @@
1 -package controllers  
2 -  
3 -import (  
4 - "apigame/models"  
5 - "apigame/service/ht-cardholder"  
6 -)  
7 -  
8 -// HtCardHolderController 绑定控制器  
9 -type HtCardHolderController struct {  
10 - BaseController  
11 -}  
12 -  
13 -// Info 卡包信息  
14 -func (c *HtCardHolderController) Info() {  
15 - req := new(models.ReqHtCardHolderInfo)  
16 - if !c.GetPostData(req) {  
17 - return  
18 - }  
19 -  
20 - code, rsp := ht_cardholder.HandleInfo(req)  
21 -  
22 - c.RetRspCodeData(code, rsp)  
23 -}  
24 -  
25 -// GetNew 获取卡包  
26 -func (c *HtCardHolderController) GetNew() {  
27 - req := new(models.ReqHtCardHolderGetNew)  
28 - if !c.GetPostData(req) {  
29 - return  
30 - }  
31 -  
32 - code, rsp := ht_cardholder.HandleGetNew(req)  
33 -  
34 - c.RetRspCodeData(code, rsp)  
35 -}  
36 -  
37 -// Open 卡包打开  
38 -func (c *HtCardHolderController) Open() {  
39 - req := new(models.ReqHtCardHolderOpen)  
40 - if !c.GetPostData(req) {  
41 - return  
42 - }  
43 -  
44 - code, rsp := ht_cardholder.HandleOpen(req)  
45 -  
46 - c.RetRspCodeData(code, rsp)  
47 -}  
48 -  
49 -// GetRewardAlbum 领取卡组奖励  
50 -func (c *HtCardHolderController) GetRewardAlbum() {  
51 - req := new(models.ReqHtCardHolderGetRewardAlbum)  
52 - if !c.GetPostData(req) {  
53 - return  
54 - }  
55 -  
56 - code, rsp := ht_cardholder.HandleGetRewardAlbum(req)  
57 -  
58 - c.RetRspCodeData(code, rsp)  
59 -}  
60 -  
61 -// GetRewardRound 领取轮次奖励  
62 -func (c *HtCardHolderController) GetRewardRound() {  
63 - req := new(models.ReqHtCardHolderGetRewardRound)  
64 - if !c.GetPostData(req) {  
65 - return  
66 - }  
67 -  
68 - code, rsp := ht_cardholder.HandleGetRewardRound(req)  
69 -  
70 - c.RetRspCodeData(code, rsp)  
71 -}  
dto/cardholder-record.go 0 → 100644
@@ -0,0 +1,124 @@ @@ -0,0 +1,124 @@
  1 +package dto
  2 +
  3 +import (
  4 + "apigame/service/constd"
  5 + "apigame/util/util-lx/lxtime"
  6 +)
  7 +
  8 +// CardHolderRecordGetNew 开卡包活动日志获得卡包
  9 +type CardHolderRecordGetNew struct {
  10 + Id int64 `orm:"auto"` // 日志ID
  11 + Uid int64 // 玩家唯一ID
  12 + ActivityId int64 // 当前活动ID
  13 + Round int // 当前轮次
  14 + CardholderId int // 卡包ID
  15 + CardholderCount int // 卡包数量
  16 + CreateTime int64 // 创建时间戳
  17 + UpdateTime int64 // 修改时间戳
  18 +}
  19 +
  20 +func (d *CardHolderRecordGetNew) TableName() string {
  21 + return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_GETNEW + constd.GAME_ID_HT
  22 +}
  23 +
  24 +func NewCardHolderRecordGetNew(uid int64, activityId int64, round int,
  25 + cardholderId int, cardholderCount int) *CardHolderRecordGetNew {
  26 + secNow := lxtime.NowUninx()
  27 + return &CardHolderRecordGetNew{
  28 + CreateTime: secNow,
  29 + UpdateTime: secNow,
  30 + Uid: uid,
  31 + ActivityId: activityId,
  32 + Round: round,
  33 + CardholderId: cardholderId,
  34 + CardholderCount: cardholderCount,
  35 + }
  36 +}
  37 +
  38 +// CardHolderRecordOpen 开卡包活动日志开卡包
  39 +type CardHolderRecordOpen struct {
  40 + Id int64 `orm:"auto"` // 日志ID
  41 + Uid int64 // 玩家唯一ID
  42 + ActivityId int64 // 当前活动ID
  43 + Round int // 当前轮次
  44 + CardholderId int // 卡包ID
  45 + CardList string // 开卡内容
  46 + CreateTime int64 // 创建时间戳
  47 + UpdateTime int64 // 修改时间戳
  48 +}
  49 +
  50 +func (d *CardHolderRecordOpen) TableName() string {
  51 + return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN + constd.GAME_ID_HT
  52 +}
  53 +
  54 +func NewCardHolderRecordOpen(uid int64, activityId int64, round int,
  55 + cardholderId int, cardList string) *CardHolderRecordOpen {
  56 + secNow := lxtime.NowUninx()
  57 + return &CardHolderRecordOpen{
  58 + CreateTime: secNow,
  59 + UpdateTime: secNow,
  60 + Uid: uid,
  61 + ActivityId: activityId,
  62 + Round: round,
  63 + CardholderId: cardholderId,
  64 + CardList: cardList,
  65 + }
  66 +}
  67 +
  68 +// CardHolderRecordRewardAlbum 开卡包活动日志领取卡组奖励
  69 +type CardHolderRecordRewardAlbum struct {
  70 + Id int64 `orm:"auto"` // 日志ID
  71 + Uid int64 // 玩家唯一ID
  72 + ActivityId int64 // 当前活动ID
  73 + Round int // 当前轮次
  74 + AlbumId int // 卡组ID
  75 + Award string // 奖励内容
  76 + CreateTime int64 // 创建时间戳
  77 + UpdateTime int64 // 修改时间戳
  78 +}
  79 +
  80 +func (d *CardHolderRecordRewardAlbum) TableName() string {
  81 + return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM + constd.GAME_ID_HT
  82 +}
  83 +
  84 +func NewCardHolderRecordRewardAlbum(uid int64, activityId int64, round int,
  85 + albumId int, award string) *CardHolderRecordRewardAlbum {
  86 + secNow := lxtime.NowUninx()
  87 + return &CardHolderRecordRewardAlbum{
  88 + CreateTime: secNow,
  89 + UpdateTime: secNow,
  90 + Uid: uid,
  91 + ActivityId: activityId,
  92 + Round: round,
  93 + AlbumId: albumId,
  94 + Award: award,
  95 + }
  96 +}
  97 +
  98 +// CardHolderRecordRewardRound 开卡包活动日志领取卡组奖励
  99 +type CardHolderRecordRewardRound struct {
  100 + Id int64 `orm:"auto"` // 日志ID
  101 + Uid int64 // 玩家唯一ID
  102 + ActivityId int64 // 当前活动ID
  103 + Round int // 当前轮次
  104 + Award string // 奖励内容
  105 + CreateTime int64 // 创建时间戳
  106 + UpdateTime int64 // 修改时间戳
  107 +}
  108 +
  109 +func (d *CardHolderRecordRewardRound) TableName() string {
  110 + return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND + constd.GAME_ID_HT
  111 +}
  112 +
  113 +func NewCardHolderRecordRewardRound(uid int64, activityId int64, round int,
  114 + award string) *CardHolderRecordRewardRound {
  115 + secNow := lxtime.NowUninx()
  116 + return &CardHolderRecordRewardRound{
  117 + CreateTime: secNow,
  118 + UpdateTime: secNow,
  119 + Uid: uid,
  120 + ActivityId: activityId,
  121 + Round: round,
  122 + Award: award,
  123 + }
  124 +}
dto/cardholder.go 0 → 100644
@@ -0,0 +1,104 @@ @@ -0,0 +1,104 @@
  1 +package dto
  2 +
  3 +import (
  4 + "apigame/models"
  5 + "apigame/service/constd"
  6 + "apigame/util/util-lx/lxalilog"
  7 + "encoding/json"
  8 + "github.com/astaxie/beego/orm"
  9 +)
  10 +
  11 +func InitCardholder() {
  12 +
  13 + // register model
  14 + orm.RegisterModel(new(CardHolderData))
  15 + orm.RegisterModel(new(CardHolderRecordGetNew))
  16 + orm.RegisterModel(new(CardHolderRecordOpen))
  17 + orm.RegisterModel(new(CardHolderRecordRewardAlbum))
  18 + orm.RegisterModel(new(CardHolderRecordRewardRound))
  19 +
  20 + // create table
  21 + orm.RunSyncdb("default", false, true)
  22 +}
  23 +
  24 +// CardHolderData 卡牌活动持久数据
  25 +type CardHolderData struct {
  26 + Uid int64 `orm:"pk"` // 玩家唯一ID
  27 + ActivityId int64 // 活动ID
  28 + Details *CardHolderDataDetails `orm:"-"` // 活动详情
  29 + DetailsText string `orm:"type(text)"` // 活动详情封装
  30 + CreateTime int64 // 创建时间戳
  31 + UpdateTime int64 // 修改时间戳
  32 +}
  33 +
  34 +// CardHolderDataDetails 卡牌活动详情
  35 +type CardHolderDataDetails struct {
  36 + Cardholder map[int]int // 卡包数量 k=卡包ID v=卡包数量
  37 + Cards map[int]int // 每张卡集了多少张 k=卡牌ID v=数量
  38 + Album map[string]int // 卡组奖励领取 k=卡组ID v=数量
  39 + StarSequenceScales map[string]int // 星级序列刻度 k=ID_用户序列_用户分组 v=刻度
  40 + CardSequenceScales map[string]int // 卡牌序列刻度 k=ID_用户序列_用户分组 v=刻度
  41 + Round int // 卡册当前轮次
  42 +}
  43 +
  44 +func NewCardHolderData(uid int64) *CardHolderData {
  45 + return &CardHolderData{
  46 + Uid: uid,
  47 + Details: NewCardHolderDataDetails(),
  48 + }
  49 +}
  50 +
  51 +func NewCardHolderDataDetails() *CardHolderDataDetails {
  52 + return &CardHolderDataDetails{
  53 + Cardholder: make(map[int]int),
  54 + Cards: make(map[int]int),
  55 + Album: make(map[string]int),
  56 + StarSequenceScales: make(map[string]int),
  57 + CardSequenceScales: make(map[string]int),
  58 + Round: 1,
  59 + }
  60 +}
  61 +
  62 +func (d *CardHolderData) TableName() string {
  63 + return constd.MYSQL_TABLE_S_CARDHOLDER_DATA + constd.GAME_ID_HT
  64 +}
  65 +
  66 +// Encode 打包数据
  67 +func (d *CardHolderData) Encode() {
  68 + details, err := json.Marshal(d.Details)
  69 + if err != nil {
  70 + lxalilog.Errors(err, "CardHolderData Encode Error", d.Uid, d.ActivityId)
  71 + return
  72 + }
  73 + d.DetailsText = string(details)
  74 +}
  75 +
  76 +// Decode 分包数据
  77 +func (d *CardHolderData) Decode() {
  78 + err := json.Unmarshal([]byte(d.DetailsText), d.Details)
  79 + if err != nil {
  80 + lxalilog.Errors(err, "CardHolderData Decode Error", d.Uid, d.ActivityId)
  81 + return
  82 + }
  83 +}
  84 +
  85 +// GetInfo 封装成返回数据
  86 +func (d *CardHolderData) GetInfo() models.CardHolderInfo {
  87 + info := models.CardHolderInfo{
  88 + Cardholder: make(map[int]int),
  89 + Cards: make(map[int]int),
  90 + Album: make(map[string]int),
  91 + Round: 0,
  92 + }
  93 + for i, i2 := range d.Details.Cardholder {
  94 + info.Cardholder[i] = i2
  95 + }
  96 + for i, i2 := range d.Details.Cards {
  97 + info.Cards[i] = i2
  98 + }
  99 + for i, i2 := range d.Details.Album {
  100 + info.Album[i] = i2
  101 + }
  102 + info.Round = d.Details.Round
  103 + return info
  104 +}
dto/ht-cardholder-record.go
@@ -1,124 +0,0 @@ @@ -1,124 +0,0 @@
1 -package dto  
2 -  
3 -import (  
4 - "apigame/service/constd"  
5 - "apigame/util/util-lx/lxtime"  
6 -)  
7 -  
8 -// HtCardHolderRecordGetNew 开卡包活动日志获得卡包  
9 -type HtCardHolderRecordGetNew struct {  
10 - Id int64 `orm:"auto"` // 日志ID  
11 - Uid int64 // 玩家唯一ID  
12 - ActivityId int64 // 当前活动ID  
13 - Round int // 当前轮次  
14 - CardholderId int // 卡包ID  
15 - CardholderCount int // 卡包数量  
16 - CreateTime int64 // 创建时间戳  
17 - UpdateTime int64 // 修改时间戳  
18 -}  
19 -  
20 -func (d *HtCardHolderRecordGetNew) TableName() string {  
21 - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_GETNEW + constd.GAME_ID_HT  
22 -}  
23 -  
24 -func NewHtCardHolderRecordGetNew(uid int64, activityId int64, round int,  
25 - cardholderId int, cardholderCount int) *HtCardHolderRecordGetNew {  
26 - secNow := lxtime.NowUninx()  
27 - return &HtCardHolderRecordGetNew{  
28 - CreateTime: secNow,  
29 - UpdateTime: secNow,  
30 - Uid: uid,  
31 - ActivityId: activityId,  
32 - Round: round,  
33 - CardholderId: cardholderId,  
34 - CardholderCount: cardholderCount,  
35 - }  
36 -}  
37 -  
38 -// HtCardHolderRecordOpen 开卡包活动日志开卡包  
39 -type HtCardHolderRecordOpen struct {  
40 - Id int64 `orm:"auto"` // 日志ID  
41 - Uid int64 // 玩家唯一ID  
42 - ActivityId int64 // 当前活动ID  
43 - Round int // 当前轮次  
44 - CardholderId int // 卡包ID  
45 - CardList string // 开卡内容  
46 - CreateTime int64 // 创建时间戳  
47 - UpdateTime int64 // 修改时间戳  
48 -}  
49 -  
50 -func (d *HtCardHolderRecordOpen) TableName() string {  
51 - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN + constd.GAME_ID_HT  
52 -}  
53 -  
54 -func NewHtCardHolderRecordOpen(uid int64, activityId int64, round int,  
55 - cardholderId int, cardList string) *HtCardHolderRecordOpen {  
56 - secNow := lxtime.NowUninx()  
57 - return &HtCardHolderRecordOpen{  
58 - CreateTime: secNow,  
59 - UpdateTime: secNow,  
60 - Uid: uid,  
61 - ActivityId: activityId,  
62 - Round: round,  
63 - CardholderId: cardholderId,  
64 - CardList: cardList,  
65 - }  
66 -}  
67 -  
68 -// HtCardHolderRecordRewardAlbum 开卡包活动日志领取卡组奖励  
69 -type HtCardHolderRecordRewardAlbum struct {  
70 - Id int64 `orm:"auto"` // 日志ID  
71 - Uid int64 // 玩家唯一ID  
72 - ActivityId int64 // 当前活动ID  
73 - Round int // 当前轮次  
74 - AlbumId int // 卡组ID  
75 - Award string // 奖励内容  
76 - CreateTime int64 // 创建时间戳  
77 - UpdateTime int64 // 修改时间戳  
78 -}  
79 -  
80 -func (d *HtCardHolderRecordRewardAlbum) TableName() string {  
81 - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM + constd.GAME_ID_HT  
82 -}  
83 -  
84 -func NewHtCardHolderRecordRewardAlbum(uid int64, activityId int64, round int,  
85 - albumId int, award string) *HtCardHolderRecordRewardAlbum {  
86 - secNow := lxtime.NowUninx()  
87 - return &HtCardHolderRecordRewardAlbum{  
88 - CreateTime: secNow,  
89 - UpdateTime: secNow,  
90 - Uid: uid,  
91 - ActivityId: activityId,  
92 - Round: round,  
93 - AlbumId: albumId,  
94 - Award: award,  
95 - }  
96 -}  
97 -  
98 -// HtCardHolderRecordRewardRound 开卡包活动日志领取卡组奖励  
99 -type HtCardHolderRecordRewardRound struct {  
100 - Id int64 `orm:"auto"` // 日志ID  
101 - Uid int64 // 玩家唯一ID  
102 - ActivityId int64 // 当前活动ID  
103 - Round int // 当前轮次  
104 - Award string // 奖励内容  
105 - CreateTime int64 // 创建时间戳  
106 - UpdateTime int64 // 修改时间戳  
107 -}  
108 -  
109 -func (d *HtCardHolderRecordRewardRound) TableName() string {  
110 - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND + constd.GAME_ID_HT  
111 -}  
112 -  
113 -func NewHtCardHolderRecordRewardRound(uid int64, activityId int64, round int,  
114 - award string) *HtCardHolderRecordRewardRound {  
115 - secNow := lxtime.NowUninx()  
116 - return &HtCardHolderRecordRewardRound{  
117 - CreateTime: secNow,  
118 - UpdateTime: secNow,  
119 - Uid: uid,  
120 - ActivityId: activityId,  
121 - Round: round,  
122 - Award: award,  
123 - }  
124 -}  
dto/ht-cardholder.go
@@ -1,104 +0,0 @@ @@ -1,104 +0,0 @@
1 -package dto  
2 -  
3 -import (  
4 - "apigame/models"  
5 - "apigame/service/constd"  
6 - "apigame/util/util-lx/lxalilog"  
7 - "encoding/json"  
8 - "github.com/astaxie/beego/orm"  
9 -)  
10 -  
11 -func InitHtCardholder() {  
12 -  
13 - // register model  
14 - orm.RegisterModel(new(HtCardHolderData))  
15 - orm.RegisterModel(new(HtCardHolderRecordGetNew))  
16 - orm.RegisterModel(new(HtCardHolderRecordOpen))  
17 - orm.RegisterModel(new(HtCardHolderRecordRewardAlbum))  
18 - orm.RegisterModel(new(HtCardHolderRecordRewardRound))  
19 -  
20 - // create table  
21 - orm.RunSyncdb("default", false, true)  
22 -}  
23 -  
24 -// HtCardHolderData 卡牌活动持久数据  
25 -type HtCardHolderData struct {  
26 - Uid int64 `orm:"pk"` // 玩家唯一ID  
27 - ActivityId int64 // 活动ID  
28 - Details *HtCardHolderDataDetails `orm:"-"` // 活动详情  
29 - DetailsText string `orm:"type(text)"` // 活动详情封装  
30 - CreateTime int64 // 创建时间戳  
31 - UpdateTime int64 // 修改时间戳  
32 -}  
33 -  
34 -// HtCardHolderDataDetails 卡牌活动详情  
35 -type HtCardHolderDataDetails struct {  
36 - Cardholder map[int]int // 卡包数量 k=卡包ID v=卡包数量  
37 - Cards map[int]int // 每张卡集了多少张 k=卡牌ID v=数量  
38 - Album map[string]int // 卡组奖励领取 k=卡组ID v=数量  
39 - StarSequenceScales map[string]int // 星级序列刻度 k=ID_用户序列_用户分组 v=刻度  
40 - CardSequenceScales map[string]int // 卡牌序列刻度 k=ID_用户序列_用户分组 v=刻度  
41 - Round int // 卡册当前轮次  
42 -}  
43 -  
44 -func NewHtCardHolderData(uid int64) *HtCardHolderData {  
45 - return &HtCardHolderData{  
46 - Uid: uid,  
47 - Details: NewHtCardHolderDataDetails(),  
48 - }  
49 -}  
50 -  
51 -func NewHtCardHolderDataDetails() *HtCardHolderDataDetails {  
52 - return &HtCardHolderDataDetails{  
53 - Cardholder: make(map[int]int),  
54 - Cards: make(map[int]int),  
55 - Album: make(map[string]int),  
56 - StarSequenceScales: make(map[string]int),  
57 - CardSequenceScales: make(map[string]int),  
58 - Round: 1,  
59 - }  
60 -}  
61 -  
62 -func (d *HtCardHolderData) TableName() string {  
63 - return constd.MYSQL_TABLE_S_CARDHOLDER_DATA + constd.GAME_ID_HT  
64 -}  
65 -  
66 -// Encode 打包数据  
67 -func (d *HtCardHolderData) Encode() {  
68 - details, err := json.Marshal(d.Details)  
69 - if err != nil {  
70 - lxalilog.Errors(err, "HtCardHolderData Encode Error", d.Uid, d.ActivityId)  
71 - return  
72 - }  
73 - d.DetailsText = string(details)  
74 -}  
75 -  
76 -// Decode 分包数据  
77 -func (d *HtCardHolderData) Decode() {  
78 - err := json.Unmarshal([]byte(d.DetailsText), d.Details)  
79 - if err != nil {  
80 - lxalilog.Errors(err, "HtCardHolderData Decode Error", d.Uid, d.ActivityId)  
81 - return  
82 - }  
83 -}  
84 -  
85 -// GetInfo 封装成返回数据  
86 -func (d *HtCardHolderData) GetInfo() models.HtCardHolderInfo {  
87 - info := models.HtCardHolderInfo{  
88 - Cardholder: make(map[int]int),  
89 - Cards: make(map[int]int),  
90 - Album: make(map[string]int),  
91 - Round: 0,  
92 - }  
93 - for i, i2 := range d.Details.Cardholder {  
94 - info.Cardholder[i] = i2  
95 - }  
96 - for i, i2 := range d.Details.Cards {  
97 - info.Cards[i] = i2  
98 - }  
99 - for i, i2 := range d.Details.Album {  
100 - info.Album[i] = i2  
101 - }  
102 - info.Round = d.Details.Round  
103 - return info  
104 -}  
@@ -71,7 +71,7 @@ func Inits() (err error) { @@ -71,7 +71,7 @@ func Inits() (err error) {
71 //_ = config.InitLxLimit() 71 //_ = config.InitLxLimit()
72 72
73 // 海滩卡包 73 // 海滩卡包
74 - InitHtCardholder() 74 + InitCardholder()
75 75
76 return 76 return
77 } 77 }
@@ -3,7 +3,7 @@ package main @@ -3,7 +3,7 @@ package main
3 import ( 3 import (
4 "apigame/dto" 4 "apigame/dto"
5 _ "apigame/routers" 5 _ "apigame/routers"
6 - "apigame/service/ht-cardholder" 6 + "apigame/service/cardholder"
7 "github.com/astaxie/beego" 7 "github.com/astaxie/beego"
8 "github.com/astaxie/beego/logs" 8 "github.com/astaxie/beego/logs"
9 "github.com/astaxie/beego/plugins/cors" 9 "github.com/astaxie/beego/plugins/cors"
@@ -30,7 +30,7 @@ func main() { @@ -30,7 +30,7 @@ func main() {
30 _ = dto.Inits() 30 _ = dto.Inits()
31 31
32 // 初始化配置 32 // 初始化配置
33 - ht_cardholder.Init() 33 + cardholder.Init()
34 34
35 beego.Run() 35 beego.Run()
36 } 36 }
models/ht-cardholder.go
@@ -2,72 +2,72 @@ package models @@ -2,72 +2,72 @@ package models
2 2
3 // 海滩卡包 3 // 海滩卡包
4 4
5 -// HtCardHolderInfo 卡包信息  
6 -type HtCardHolderInfo struct { 5 +// CardHolderInfo 卡包信息
  6 +type CardHolderInfo struct {
7 Cardholder map[int]int `form:"cardholder" json:"cardholder"` // 卡包数量 k=卡包ID v=卡包数量 7 Cardholder map[int]int `form:"cardholder" json:"cardholder"` // 卡包数量 k=卡包ID v=卡包数量
8 Cards map[int]int `form:"cards" json:"cards"` // 每张卡集了多少张 k=卡牌ID v=数量 8 Cards map[int]int `form:"cards" json:"cards"` // 每张卡集了多少张 k=卡牌ID v=数量
9 Album map[string]int `form:"album" json:"album"` // 卡组奖励领取 k=卡组ID v=数量 9 Album map[string]int `form:"album" json:"album"` // 卡组奖励领取 k=卡组ID v=数量
10 Round int `form:"round" json:"round"` // 卡册当前轮次 10 Round int `form:"round" json:"round"` // 卡册当前轮次
11 } 11 }
12 12
13 -// ReqHtCardHolderInfo 请求 卡包信息  
14 -type ReqHtCardHolderInfo struct { 13 +// ReqCardHolderInfo 请求 卡包信息
  14 +type ReqCardHolderInfo struct {
15 BaseLoginInfo 15 BaseLoginInfo
16 BaseSign 16 BaseSign
17 } 17 }
18 18
19 -// RspHtCardHolderInfo 返回 卡包信息  
20 -type RspHtCardHolderInfo struct {  
21 - HtCardHolderInfo 19 +// RspCardHolderInfo 返回 卡包信息
  20 +type RspCardHolderInfo struct {
  21 + CardHolderInfo
22 } 22 }
23 23
24 -// ReqHtCardHolderGetNew 请求 获取卡包  
25 -type ReqHtCardHolderGetNew struct { 24 +// ReqCardHolderGetNew 请求 获取卡包
  25 +type ReqCardHolderGetNew struct {
26 BaseLoginInfo 26 BaseLoginInfo
27 BaseSign 27 BaseSign
28 Id int `form:"id" json:"id" valid:"Required"` // 卡包ID 28 Id int `form:"id" json:"id" valid:"Required"` // 卡包ID
29 Count int `form:"count" json:"count" valid:"Required"` // 卡包数量 29 Count int `form:"count" json:"count" valid:"Required"` // 卡包数量
30 } 30 }
31 31
32 -// RspHtCardHolderGetNew 返回 获取卡包  
33 -type RspHtCardHolderGetNew struct {  
34 - HtCardHolderInfo 32 +// RspCardHolderGetNew 返回 获取卡包
  33 +type RspCardHolderGetNew struct {
  34 + CardHolderInfo
35 } 35 }
36 36
37 -// ReqHtCardHolderOpen 请求 打开卡包  
38 -type ReqHtCardHolderOpen struct { 37 +// ReqCardHolderOpen 请求 打开卡包
  38 +type ReqCardHolderOpen struct {
39 BaseLoginInfo 39 BaseLoginInfo
40 BaseSign 40 BaseSign
41 Id int `form:"id" json:"id" valid:"Required"` // 卡包ID 41 Id int `form:"id" json:"id" valid:"Required"` // 卡包ID
42 } 42 }
43 43
44 -// RspHtCardHolderOpen 返回 打开卡包  
45 -type RspHtCardHolderOpen struct {  
46 - HtCardHolderInfo 44 +// RspCardHolderOpen 返回 打开卡包
  45 +type RspCardHolderOpen struct {
  46 + CardHolderInfo
47 NewCards []int `form:"new_cards" json:"new_cards"` // 新获得的卡牌列表 47 NewCards []int `form:"new_cards" json:"new_cards"` // 新获得的卡牌列表
48 } 48 }
49 49
50 -// ReqHtCardHolderGetRewardAlbum 请求 领取卡组奖励  
51 -type ReqHtCardHolderGetRewardAlbum struct { 50 +// ReqCardHolderGetRewardAlbum 请求 领取卡组奖励
  51 +type ReqCardHolderGetRewardAlbum struct {
52 BaseLoginInfo 52 BaseLoginInfo
53 BaseSign 53 BaseSign
54 Id int `form:"id" json:"id" valid:"Required"` // 卡组ID 54 Id int `form:"id" json:"id" valid:"Required"` // 卡组ID
55 } 55 }
56 56
57 -// RspHtCardHolderGetRewardAlbum 返回 领取卡组奖励  
58 -type RspHtCardHolderGetRewardAlbum struct {  
59 - HtCardHolderInfo 57 +// RspCardHolderGetRewardAlbum 返回 领取卡组奖励
  58 +type RspCardHolderGetRewardAlbum struct {
  59 + CardHolderInfo
60 Award string `form:"award" json:"award"` // 奖励字符串 60 Award string `form:"award" json:"award"` // 奖励字符串
61 } 61 }
62 62
63 -// ReqHtCardHolderGetRewardRound 请求 领取轮次奖励  
64 -type ReqHtCardHolderGetRewardRound struct { 63 +// ReqCardHolderGetRewardRound 请求 领取轮次奖励
  64 +type ReqCardHolderGetRewardRound struct {
65 BaseLoginInfo 65 BaseLoginInfo
66 BaseSign 66 BaseSign
67 } 67 }
68 68
69 -// RspHtCardHolderGetRewardRound 返回 领取轮次奖励  
70 -type RspHtCardHolderGetRewardRound struct {  
71 - HtCardHolderInfo 69 +// RspCardHolderGetRewardRound 返回 领取轮次奖励
  70 +type RspCardHolderGetRewardRound struct {
  71 + CardHolderInfo
72 Award string `form:"award" json:"award"` // 奖励字符串 72 Award string `form:"award" json:"award"` // 奖励字符串
73 } 73 }
routers/router.go
@@ -12,15 +12,15 @@ func init() { @@ -12,15 +12,15 @@ func init() {
12 12
13 // 海滩项目 13 // 海滩项目
14 // 卡包信息 14 // 卡包信息
15 - beego.Router(prefix+"/ht/cardholder/info", &controllers.HtCardHolderController{}, "post:Info") 15 + beego.Router(prefix+"/cardholder/info", &controllers.CardHolderController{}, "post:Info")
16 // 获取卡包 16 // 获取卡包
17 - beego.Router(prefix+"/ht/cardholder/getnew", &controllers.HtCardHolderController{}, "post:GetNew") 17 + beego.Router(prefix+"/cardholder/getnew", &controllers.CardHolderController{}, "post:GetNew")
18 // 卡包打开 18 // 卡包打开
19 - beego.Router(prefix+"/ht/cardholder/open", &controllers.HtCardHolderController{}, "post:Open") 19 + beego.Router(prefix+"/cardholder/open", &controllers.CardHolderController{}, "post:Open")
20 // 领取卡组奖励 20 // 领取卡组奖励
21 - beego.Router(prefix+"/ht/cardholder/getrewardalbum", &controllers.HtCardHolderController{}, "post:GetRewardAlbum") 21 + beego.Router(prefix+"/cardholder/getrewardalbum", &controllers.CardHolderController{}, "post:GetRewardAlbum")
22 // 领取轮次奖励 22 // 领取轮次奖励
23 - beego.Router(prefix+"/ht/cardholder/getrewardround", &controllers.HtCardHolderController{}, "post:GetRewardRound") 23 + beego.Router(prefix+"/cardholder/getrewardround", &controllers.CardHolderController{}, "post:GetRewardRound")
24 24
25 beego.ErrorController(&controllers.ErrorController{}) 25 beego.ErrorController(&controllers.ErrorController{})
26 } 26 }
service/cardholder/config-registry.go 0 → 100644
@@ -0,0 +1,131 @@ @@ -0,0 +1,131 @@
  1 +package cardholder
  2 +
  3 +import (
  4 + "apigame/service/constd"
  5 + "apigame/util/util-lx/lxalilog"
  6 + "encoding/json"
  7 + "errors"
  8 + "fmt"
  9 + "strings"
  10 +)
  11 +
  12 +var (
  13 + ConfigRaws CardActivityConfigRaw // 活动配置 原始数据
  14 + Config CardActivityConfig // 活动配置 分析后数据
  15 +)
  16 +
  17 +func NewConfigs() {
  18 + ConfigRaws = CardActivityConfigRaw{}
  19 + Config = CardActivityConfig{}
  20 +}
  21 +
  22 +// ConfigDecode 解析配置原始数据
  23 +func ConfigDecode() {
  24 + Config = CardActivityConfig{
  25 + Raw: ConfigRaws,
  26 + Id: ConfigRaws.Id,
  27 + Awards: make(map[string]string),
  28 + AlbumConfig: make(map[string]AlbumConfig),
  29 + CardConfig: make(map[int]CardConfig),
  30 + CardholderConfig: make(map[string]CardholderConfig),
  31 + NormalCardStarConfig: make(map[string]NormalCardStarConfig),
  32 + CardSequenceConfig: make(map[string]CardSequenceConfig),
  33 + }
  34 + // 解析奖励
  35 + {
  36 + err := json.Unmarshal([]byte(ConfigRaws.Awards), &Config.Awards)
  37 + if err != nil {
  38 + lxalilog.Errors(err, ConfigRaws.Awards, constd.GAME_ID_HT, ConfigRaws.Id)
  39 + return
  40 + }
  41 + }
  42 + // 卡组配置
  43 + {
  44 + configs := make([]AlbumConfig, 0)
  45 + err := json.Unmarshal([]byte(ConfigRaws.AlbumConfig), &configs)
  46 + if err != nil {
  47 + lxalilog.Errors(err, ConfigRaws.AlbumConfig, constd.GAME_ID_HT, ConfigRaws.Id)
  48 + return
  49 + }
  50 + for _, i2 := range configs {
  51 + Config.AlbumConfig[i2.SetId] = i2
  52 + }
  53 + }
  54 + // 卡牌配置
  55 + {
  56 + configs := make([]CardConfig, 0)
  57 + err := json.Unmarshal([]byte(ConfigRaws.CardConfig), &configs)
  58 + if err != nil {
  59 + lxalilog.Errors(err, ConfigRaws.CardConfig, constd.GAME_ID_HT, ConfigRaws.Id)
  60 + return
  61 + }
  62 + for _, i2 := range configs {
  63 + Config.CardConfig[i2.Id] = i2
  64 + }
  65 + }
  66 + // 卡包开卡规则
  67 + {
  68 + configs := make([]CardholderConfig, 0)
  69 + err := json.Unmarshal([]byte(ConfigRaws.CardHolderConfig), &configs)
  70 + if err != nil {
  71 + lxalilog.Errors(err, ConfigRaws.CardHolderConfig, constd.GAME_ID_HT, ConfigRaws.Id)
  72 + return
  73 + }
  74 + for _, i2 := range configs {
  75 + Config.CardholderConfig[i2.Id] = i2
  76 + }
  77 + }
  78 + // 卡片星级配置
  79 + {
  80 + configs := make([]NormalCardStarConfig, 0)
  81 + err := json.Unmarshal([]byte(ConfigRaws.NormalCardStarSequence), &configs)
  82 + if err != nil {
  83 + lxalilog.Errors(err, ConfigRaws.NormalCardStarSequence, constd.GAME_ID_HT, ConfigRaws.Id)
  84 + return
  85 + }
  86 + for _, i2 := range configs {
  87 + i2.NormalCardSequenceIds = strings.Split(i2.NormalCardSequenceId, ",")
  88 + combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort)
  89 + Config.NormalCardStarConfig[combineId] = i2
  90 + }
  91 + }
  92 + // 卡片星级对应卡牌配置
  93 + {
  94 + configs := make([]CardSequenceConfig, 0)
  95 + err := json.Unmarshal([]byte(ConfigRaws.CardSequenceConfig), &configs)
  96 + if err != nil {
  97 + lxalilog.Errors(err, ConfigRaws.CardSequenceConfig, constd.GAME_ID_HT, ConfigRaws.Id)
  98 + return
  99 + }
  100 + for _, i2 := range configs {
  101 + i2.CardIdLists = strings.Split(i2.CardIdList, ",")
  102 + combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort)
  103 + Config.CardSequenceConfig[combineId] = i2
  104 + }
  105 + }
  106 +}
  107 +
  108 +// CombineIdSequenceIdCohort 组合ID k=ID_用户序列_用户分组
  109 +func CombineIdSequenceIdCohort(id, sequenceId, cohort string) string {
  110 + return fmt.Sprintf("%s_%s_%s", id, sequenceId, cohort)
  111 +}
  112 +
  113 +// FindNormalCardStarConfig 查找配置 非保底卡星级ID
  114 +func FindNormalCardStarConfig(id, sequenceId, cohort string) (conf NormalCardStarConfig, has bool) {
  115 + combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort)
  116 + conf, has = Config.NormalCardStarConfig[combineId]
  117 + if !has {
  118 + lxalilog.Errors(errors.New("ht_cardholder NormalCardStarConfig error"), id, sequenceId, cohort)
  119 + }
  120 + return
  121 +}
  122 +
  123 +// FindCardSequenceConfig 查找配置 星级ID对应的卡片
  124 +func FindCardSequenceConfig(id, sequenceId, cohort string) (conf CardSequenceConfig, has bool) {
  125 + combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort)
  126 + conf, has = Config.CardSequenceConfig[combineId]
  127 + if !has {
  128 + lxalilog.Errors(errors.New("ht_cardholder CardSequenceConfig error"), id, sequenceId, cohort)
  129 + }
  130 + return
  131 +}
service/cardholder/config.go 0 → 100644
@@ -0,0 +1,89 @@ @@ -0,0 +1,89 @@
  1 +package cardholder
  2 +
  3 +import "apigame/service/constd"
  4 +
  5 +// CardActivityUpdateConfig 卡牌活动更新配置
  6 +type CardActivityUpdateConfig struct {
  7 + Id int64 // ID
  8 + Status int // 状态 0=关闭 1=开启
  9 + UpdateTime int64 // 修改时间戳
  10 +}
  11 +
  12 +// CardActivityConfig 卡牌活动配置 分析后数据
  13 +type CardActivityConfig struct {
  14 + Raw CardActivityConfigRaw
  15 + Id int64 // ID
  16 + Awards map[string]string // 奖励配置
  17 + AlbumConfig map[string]AlbumConfig // 卡组配置
  18 + CardConfig map[int]CardConfig // 卡牌配置
  19 + CardholderConfig map[string]CardholderConfig // 卡包开卡规则
  20 + NormalCardStarConfig map[string]NormalCardStarConfig // k=ID_用户序列_用户分组 卡片星级配置
  21 + CardSequenceConfig map[string]CardSequenceConfig // k=ID_用户序列_用户分组 卡片星级对应卡牌配置
  22 +}
  23 +
  24 +func (c *CardActivityConfig) TableName() string {
  25 + return constd.MYSQL_TABLE_S_CARD_ACTIVITY + constd.GAME_ID_HT
  26 +}
  27 +
  28 +// CardActivityConfigRaw 卡牌活动配置 原始数据
  29 +type CardActivityConfigRaw struct {
  30 + Id int64 // ID
  31 + OpenLevel int // 开启等级
  32 + PreviewTime int64 // 预告时间
  33 + StartTime int64 // 开始时间
  34 + EndTime int64 // 结束时间
  35 + Round int // 轮数
  36 + Awards string // 奖励配置
  37 + AlbumConfig string // 卡组配置
  38 + CardConfig string // 卡牌配置
  39 + CardHolderConfig string // 卡包开卡规则
  40 + NormalCardStarSequence string // 卡片星级配置
  41 + CardSequenceConfig string // 卡片星级对应卡牌配置
  42 + Ver string // 版本号
  43 + Status int // 状态 0=关闭 1=开启
  44 + UpdateTime int64 // 修改时间戳
  45 +}
  46 +
  47 +// AlbumConfig 卡组表
  48 +type AlbumConfig struct {
  49 + SetId string `json:"set_id"` // 卡组id
  50 + Rewards map[string]string `json:"rewards"` // 集齐奖励 k=轮次
  51 + StartTime int64 `json:"start_time"` // 开始时间
  52 + EndTime int64 `json:"end_time"` // 结束时间
  53 +}
  54 +
  55 +// CardConfig 卡牌表
  56 +type CardConfig struct {
  57 + Id int `json:"id"` // ID
  58 + SetId string `json:"album_setid"` // 卡组id
  59 + IsGold int `json:"is_gold"` // 是否是金卡
  60 + Star int `json:"star"` // 星级
  61 +}
  62 +
  63 +// CardholderConfig 卡包开卡规则表
  64 +type CardholderConfig struct {
  65 + Id string `json:"id"` // ID
  66 + IsGoldCardholder int `json:"is_gold_card_holder"` // 是否是金卡包
  67 + IsNew int `json:"is_new"` // 是否是新卡包
  68 + GuaranteedStarCardId string `json:"guaranteed_star_card_id"` // 保底卡星级序列ID
  69 + NormalCardNumber int `json:"normal_card_number"` // 非保底卡数量
  70 + MinimumGuaranteeCardId string `json:"minimum_guarantee_card_id"` // 非保底卡牌序列ID
  71 +}
  72 +
  73 +// NormalCardStarConfig 非保底卡星级ID
  74 +type NormalCardStarConfig struct {
  75 + Id string `json:"id"` // ID
  76 + SequenceId string `json:"user_sequence_id"` // 用户序列组ID
  77 + Cohort string `json:"cohort"` // 用户分组
  78 + NormalCardSequenceId string `json:"normal_card_sequence_id"` // 非保底星级序列
  79 + NormalCardSequenceIds []string `json:"-"` // 非保底星级序列
  80 +}
  81 +
  82 +// CardSequenceConfig 星级ID对应的卡片
  83 +type CardSequenceConfig struct {
  84 + Id string `json:"id"` // SequenceId 用户序列组ID
  85 + SequenceId string `json:"user_sequence_id"` // 用户序列组ID
  86 + Cohort string `json:"cohort"` // 用户分组
  87 + CardIdList string `json:"card_id_list"` // 卡牌抽取序列
  88 + CardIdLists []string `json:"-"` // 卡牌抽取序列
  89 +}
service/cardholder/configs.go 0 → 100644
@@ -0,0 +1,69 @@ @@ -0,0 +1,69 @@
  1 +package cardholder
  2 +
  3 +import (
  4 + "apigame/service/constd"
  5 + "apigame/util/util-lx/lxalilog"
  6 + "apigame/util/utmysql"
  7 + "fmt"
  8 + "github.com/astaxie/beego/logs"
  9 +)
  10 +
  11 +// Init 初始化
  12 +func Init() {
  13 +
  14 + NewConfigs()
  15 +
  16 + TryUpdateConfigs()
  17 +
  18 + //DumpConfigs()
  19 +}
  20 +
  21 +// TryUpdateConfigs 尝试更新配置表
  22 +func TryUpdateConfigs() {
  23 + LoadConfigs()
  24 +}
  25 +
  26 +// LoadConfigs 读取mysql配置
  27 +func LoadConfigs() {
  28 + configTableName := new(CardActivityConfig).TableName()
  29 + // 找到当前开放的活动
  30 + configOpen := CardActivityUpdateConfig{Id: 0}
  31 + {
  32 + conf := make([]CardActivityUpdateConfig, 0)
  33 + sql := fmt.Sprintf("select id,status,update_time from %s", configTableName)
  34 + err := utmysql.FindSql(constd.MYSQL_MERGECONFIG, sql, &conf)
  35 + if err != nil {
  36 + lxalilog.Errors(err, sql, constd.GAME_ID_HT)
  37 + return
  38 + }
  39 + for _, config := range conf {
  40 + if config.Status != 0 {
  41 + configOpen = config
  42 + continue
  43 + }
  44 + }
  45 + fmt.Println(configOpen)
  46 + }
  47 + // 没有开放的活动
  48 + if configOpen.Id == 0 {
  49 + return
  50 + }
  51 + // 更新数据
  52 + if configOpen.Id != Config.Raw.Id || configOpen.UpdateTime != Config.Raw.UpdateTime {
  53 + logs.Debug("__________________尝试更新活动条目ID:", configOpen.Id)
  54 + confNew := CardActivityConfigRaw{}
  55 + sql := fmt.Sprintf("select * from %s where id=%d limit 1", configTableName, configOpen.Id)
  56 + err := utmysql.FindOneSql(constd.MYSQL_MERGECONFIG, sql, &confNew)
  57 + if err != nil {
  58 + lxalilog.Errors(err, sql, constd.GAME_ID_HT, configOpen.Id)
  59 + return
  60 + }
  61 + logs.Debug("__________________更新活动条目ID:", confNew.Id)
  62 + ConfigRaws = confNew
  63 + ConfigDecode()
  64 + }
  65 +}
  66 +
  67 +func DumpConfigs() {
  68 +
  69 +}
service/cardholder/handle.go 0 → 100644
@@ -0,0 +1,296 @@ @@ -0,0 +1,296 @@
  1 +package cardholder
  2 +
  3 +import (
  4 + "apigame/dto"
  5 + "apigame/models"
  6 + "apigame/service/constd"
  7 + game_record "apigame/service/game-record"
  8 + "apigame/util/utjson"
  9 + "apigame/util/uttype"
  10 + "strconv"
  11 +)
  12 +
  13 +// HandleInfo 卡包信息
  14 +func HandleInfo(req *models.ReqCardHolderInfo) (code string, rsp models.RspCardHolderInfo) {
  15 + rsp = models.RspCardHolderInfo{}
  16 + code = constd.RECODE_OK
  17 +
  18 + // 尝试更新配置
  19 + TryUpdateConfigs()
  20 +
  21 + // 读取游戏数据
  22 + gameData := LoadData(req.UID)
  23 +
  24 + rsp.CardHolderInfo = gameData.GetInfo()
  25 +
  26 + return
  27 +}
  28 +
  29 +// HandleGetNew 获取卡包
  30 +func HandleGetNew(req *models.ReqCardHolderGetNew) (code string, rsp models.RspCardHolderGetNew) {
  31 + rsp = models.RspCardHolderGetNew{}
  32 + code = constd.RECODE_OK
  33 +
  34 + // 尝试更新配置
  35 + TryUpdateConfigs()
  36 +
  37 + // 检查活动状态
  38 + code = CheckStatus()
  39 + if code != constd.RECODE_OK {
  40 + return
  41 + }
  42 + // 检查卡包ID
  43 + _, okCardholderConfig := Config.CardholderConfig[strconv.Itoa(req.Id)]
  44 + if !okCardholderConfig {
  45 + code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR
  46 + return
  47 + }
  48 + // 检查卡包数量
  49 + if req.Count < 1 {
  50 + code = constd.RECODE_MERGE_CARDHOLDER_COUNTILLEGAL_ERROR
  51 + return
  52 + }
  53 +
  54 + // 读取游戏数据
  55 + gameData := LoadData(req.UID)
  56 + // 检查游戏数据 轮次等
  57 + code = CheckGameData(gameData)
  58 + if code != constd.RECODE_OK {
  59 + return
  60 + }
  61 +
  62 + gameData.Details.Cardholder[req.Id] += req.Count
  63 + SaveData(gameData)
  64 +
  65 + // 返回信息
  66 + rsp.CardHolderInfo = gameData.GetInfo()
  67 +
  68 + // 记录日志
  69 + game_record.Save(dto.NewCardHolderRecordGetNew(gameData.Uid, Config.Id, gameData.Details.Round,
  70 + req.Id, req.Count))
  71 +
  72 + return
  73 +}
  74 +
  75 +// HandleOpen 打开卡包
  76 +func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardHolderOpen) {
  77 + rsp = models.RspCardHolderOpen{}
  78 + code = constd.RECODE_OK
  79 +
  80 + // 尝试更新配置
  81 + TryUpdateConfigs()
  82 +
  83 + // 检查活动状态
  84 + code = CheckStatus()
  85 + if code != constd.RECODE_OK {
  86 + return
  87 + }
  88 + // 检查卡包ID
  89 + confCardholder, okCardholderConfig := Config.CardholderConfig[strconv.Itoa(req.Id)]
  90 + if !okCardholderConfig {
  91 + code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR
  92 + return
  93 + }
  94 +
  95 + // 读取游戏数据
  96 + gameData := LoadData(req.UID)
  97 + // 检查游戏数据 轮次等
  98 + code = CheckGameData(gameData)
  99 + if code != constd.RECODE_OK {
  100 + return
  101 + }
  102 +
  103 + // 判断卡包数目
  104 + countOld, _ := gameData.Details.Cardholder[req.Id]
  105 + if countOld < 1 {
  106 + code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDER_NOTENOUGH_ERROR
  107 + return
  108 + }
  109 +
  110 + // 开始处理抽卡
  111 + sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID)
  112 + //logs.Debug("wjwdbg 用户序列组IDsequenceId", sequenceId)
  113 + //logs.Debug("wjwdbg 用户分组IDcohort:", cohort)
  114 + if confCardholder.IsNew != 0 {
  115 + // 如果是新卡包 按顺序查找数目最少的一张卡抽取
  116 + cardId := GetNewCard(gameData)
  117 + //logs.Debug("wjwdbg 抽取新卡ID:", cardId)
  118 + // 增加卡牌
  119 + gameData.Details.Cards[cardId] += 1
  120 + rsp.NewCards = append(rsp.NewCards, cardId)
  121 + } else {
  122 + getCardFunc := func(cardConfigId string) {
  123 + confCardSequence, hasCardSequence := FindCardSequenceConfig(cardConfigId, sequenceId, cohort)
  124 + if hasCardSequence {
  125 + combineId := CombineIdSequenceIdCohort(cardConfigId, sequenceId, cohort)
  126 + scale := gameData.Details.CardSequenceScales[combineId]
  127 + cardId := GetOneFromArray(confCardSequence.CardIdLists, scale)
  128 + cardIdInt := uttype.StringToInt(cardId)
  129 + // 增加刻度
  130 + gameData.Details.CardSequenceScales[combineId] = scale + 1
  131 + // 增加卡牌
  132 + gameData.Details.Cards[cardIdInt] += 1
  133 + //logs.Debug("wjwdbg😊 抽取卡牌ID:", cardIdInt)
  134 + rsp.NewCards = append(rsp.NewCards, cardIdInt)
  135 + }
  136 + }
  137 + // 正常抽卡
  138 + // 先抽保底卡
  139 + if confCardholder.GuaranteedStarCardId != "0" {
  140 + getCardFunc(confCardholder.GuaranteedStarCardId)
  141 + //logs.Debug("wjwdbg 保底卡牌配置ID:", confCardholder.GuaranteedStarCardId)
  142 + }
  143 + // 非保底卡
  144 + if confCardholder.NormalCardNumber > 0 {
  145 + count := confCardholder.NormalCardNumber
  146 + confNormalCardStar, hasNormalCardStar := FindNormalCardStarConfig(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort)
  147 + if hasNormalCardStar {
  148 + combineIdStar := CombineIdSequenceIdCohort(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort)
  149 + scaleStar := gameData.Details.StarSequenceScales[combineIdStar]
  150 + starIds := GetListFromArray(confNormalCardStar.NormalCardSequenceIds, scaleStar, count)
  151 + // 增加星级刻度
  152 + gameData.Details.StarSequenceScales[combineIdStar] = scaleStar + count
  153 + //logs.Debug("wjwdbg 非保底卡星级ID:", confCardholder.MinimumGuaranteeCardId)
  154 + //logs.Debug("wjwdbg 非保底卡星级抽取序列:", starIds)
  155 + // 遍历星级刻度抽取n张卡牌
  156 + for _, id := range starIds {
  157 + getCardFunc(id)
  158 + }
  159 + }
  160 + }
  161 + }
  162 +
  163 + // 删除一个卡包
  164 + gameData.Details.Cardholder[req.Id] = countOld - 1
  165 +
  166 + // 存档
  167 + SaveData(gameData)
  168 +
  169 + // 记录日志
  170 + game_record.Save(dto.NewCardHolderRecordOpen(gameData.Uid, Config.Id, gameData.Details.Round,
  171 + req.Id, utjson.JsonString(rsp.NewCards)))
  172 +
  173 + //logs.Debug("wjwdbg 获取卡牌列表:", rsp.NewCards)
  174 + uttype.Shuffle(rsp.NewCards)
  175 + //logs.Debug("wjwdbg 获取卡牌列表打乱:", rsp.NewCards)
  176 +
  177 + // 返回信息
  178 + rsp.CardHolderInfo = gameData.GetInfo()
  179 +
  180 + return
  181 +}
  182 +
  183 +// HandleGetRewardAlbum 领取卡组奖励
  184 +func HandleGetRewardAlbum(req *models.ReqCardHolderGetRewardAlbum) (code string, rsp models.RspCardHolderGetRewardAlbum) {
  185 + rsp = models.RspCardHolderGetRewardAlbum{}
  186 + code = constd.RECODE_OK
  187 +
  188 + // 尝试更新配置
  189 + TryUpdateConfigs()
  190 +
  191 + // 检查活动状态
  192 + code = CheckStatus()
  193 + if code != constd.RECODE_OK {
  194 + return
  195 + }
  196 + // 检查卡组ID
  197 + albumId := strconv.Itoa(req.Id)
  198 + confAlbum, okAlbum := Config.AlbumConfig[albumId]
  199 + if !okAlbum {
  200 + code = constd.RECODE_MERGE_CARDHOLDER_ALBUMID_ERROR
  201 + return
  202 + }
  203 +
  204 + // 读取游戏数据
  205 + gameData := LoadData(req.UID)
  206 + // 检查游戏数据 轮次等
  207 + code = CheckGameData(gameData)
  208 + if code != constd.RECODE_OK {
  209 + return
  210 + }
  211 +
  212 + // 是否已领过
  213 + countGot := gameData.Details.Album[albumId]
  214 + if countGot > 0 {
  215 + code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_HASGOT_ERROR
  216 + return
  217 + }
  218 + // 检查卡组内卡是否集齐
  219 + for _, config := range Config.CardConfig {
  220 + if config.SetId == albumId {
  221 + count := gameData.Details.Cards[config.Id]
  222 + if count < 1 {
  223 + code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_NOTFINISH_ERROR
  224 + return
  225 + }
  226 + }
  227 + }
  228 +
  229 + gameData.Details.Album[albumId] += 1
  230 + SaveData(gameData)
  231 +
  232 + // 当前轮次
  233 + round := gameData.Details.Round
  234 + // 返回奖励
  235 + rsp.Award = confAlbum.Rewards[uttype.IntToString(round)]
  236 +
  237 + // 返回信息
  238 + rsp.CardHolderInfo = gameData.GetInfo()
  239 +
  240 + // 记录日志
  241 + game_record.Save(dto.NewCardHolderRecordRewardAlbum(gameData.Uid, Config.Id, gameData.Details.Round,
  242 + req.Id, rsp.Award))
  243 +
  244 + return
  245 +}
  246 +
  247 +// HandleGetRewardRound 领取轮次奖励
  248 +func HandleGetRewardRound(req *models.ReqCardHolderGetRewardRound) (code string, rsp models.RspCardHolderGetRewardRound) {
  249 + rsp = models.RspCardHolderGetRewardRound{}
  250 + code = constd.RECODE_OK
  251 +
  252 + // 尝试更新配置
  253 + TryUpdateConfigs()
  254 +
  255 + // 检查活动状态
  256 + code = CheckStatus()
  257 + if code != constd.RECODE_OK {
  258 + return
  259 + }
  260 +
  261 + // 读取游戏数据
  262 + gameData := LoadData(req.UID)
  263 + // 检查游戏数据 轮次等
  264 + code = CheckGameData(gameData)
  265 + if code != constd.RECODE_OK {
  266 + return
  267 + }
  268 +
  269 + // 判断所有卡组是否已经集齐
  270 + // 检查卡组内卡是否集齐
  271 + for _, config := range Config.AlbumConfig {
  272 + count := gameData.Details.Album[config.SetId]
  273 + if count < 1 {
  274 + code = constd.RECODE_MERGE_CARDHOLDER_ROUND_NOTFINISH_ERROR
  275 + return
  276 + }
  277 + }
  278 +
  279 + // 当前轮次
  280 + round := gameData.Details.Round
  281 + // 返回奖励
  282 + rsp.Award = Config.Awards[uttype.IntToString(round)]
  283 +
  284 + // 记录日志
  285 + game_record.Save(dto.NewCardHolderRecordRewardRound(gameData.Uid, Config.Id, gameData.Details.Round,
  286 + rsp.Award))
  287 +
  288 + // 处理轮次完成
  289 + HandleNextRound(gameData)
  290 + SaveData(gameData)
  291 +
  292 + // 返回信息
  293 + rsp.CardHolderInfo = gameData.GetInfo()
  294 +
  295 + return
  296 +}
service/cardholder/logic.go 0 → 100644
@@ -0,0 +1,137 @@ @@ -0,0 +1,137 @@
  1 +package cardholder
  2 +
  3 +import (
  4 + "apigame/dto"
  5 + "apigame/service/constd"
  6 + "apigame/util/util-lx/lxalilog"
  7 + "apigame/util/util-lx/lxtime"
  8 + "apigame/util/uttype"
  9 + "github.com/astaxie/beego/orm"
  10 +)
  11 +
  12 +// SaveData 存储数据
  13 +func SaveData(d *dto.CardHolderData) {
  14 + d.UpdateTime = lxtime.NowUninx()
  15 + d.Encode()
  16 + o := orm.NewOrm()
  17 + o.Using(constd.MYSQL_DEFAULT)
  18 + if _, err := o.InsertOrUpdate(d); err != nil {
  19 + lxalilog.Errors(err, "ht_cardholder SaveData Error", d.Uid)
  20 + }
  21 +}
  22 +
  23 +func _LoadData(uid int64) (d *dto.CardHolderData) {
  24 + d = dto.NewCardHolderData(uid)
  25 + o := orm.NewOrm()
  26 + o.Using(constd.MYSQL_DEFAULT)
  27 + qs := o.QueryTable(d)
  28 + qs = qs.Filter("uid", uid)
  29 + count, err := qs.Count()
  30 + if count == 0 {
  31 + d.CreateTime = lxtime.NowUninx()
  32 + } else {
  33 + err = qs.One(d)
  34 + if err != nil {
  35 + lxalilog.Errors(err, "ht_cardholder LoadData Error", uid)
  36 + } else {
  37 + d.Details = dto.NewCardHolderDataDetails()
  38 + d.Decode()
  39 + }
  40 + }
  41 + return
  42 +}
  43 +
  44 +// LoadData 获取数据 外部接口
  45 +func LoadData(uid int64) (d *dto.CardHolderData) {
  46 + d = _LoadData(uid)
  47 + // 如果当前有上线活动(活动ID不为0),且活动ID和玩家数据不同,说明活动已切换 需更新
  48 + if Config.Id != 0 &&
  49 + Config.Id != d.ActivityId {
  50 + d.ActivityId = Config.Id
  51 + d.Details = dto.NewCardHolderDataDetails()
  52 + SaveData(d)
  53 + }
  54 + return
  55 +}
  56 +
  57 +// CheckStatus 判断活动是否开启
  58 +func CheckStatus() string {
  59 + sec := lxtime.NowUninx()
  60 + if Config.Id == 0 {
  61 + return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR
  62 + }
  63 + if sec < Config.Raw.StartTime {
  64 + return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR
  65 + }
  66 + if sec > Config.Raw.EndTime {
  67 + return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR
  68 + }
  69 + return constd.RECODE_OK
  70 +}
  71 +
  72 +// CheckGameData 检查游戏数据 轮次等
  73 +func CheckGameData(d *dto.CardHolderData) string {
  74 + if d.Details.Round > Config.Raw.Round {
  75 + return constd.RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR
  76 + }
  77 + return constd.RECODE_OK
  78 +}
  79 +
  80 +// GetUserSequenceIdAndCohort 获取 用户序列组ID(sequenceId) 用户分组(cohort)
  81 +func GetUserSequenceIdAndCohort(uid int64) (sequenceId, cohort string) {
  82 + // todo 这里后续要对接
  83 + sequenceId = "1"
  84 + cohort = "1"
  85 + return
  86 +}
  87 +
  88 +// GetOneFromArray 从配置的数组里获取一个值 scale=之前刻度
  89 +func GetOneFromArray(array []string, scale int) string {
  90 + length := len(array)
  91 + if length < 1 {
  92 + return ""
  93 + }
  94 + if length == 1 {
  95 + return array[0]
  96 + }
  97 + return array[scale%length]
  98 +}
  99 +
  100 +// GetListFromArray 从配置的数组里获取一组值 scale=之前刻度 count=数目
  101 +func GetListFromArray(array []string, scale, count int) []string {
  102 + list := make([]string, 0)
  103 + if count < 0 {
  104 + return list
  105 + }
  106 + s := scale
  107 + for i := 0; i < count; i++ {
  108 + one := GetOneFromArray(array, s)
  109 + list = append(list, one)
  110 + s++
  111 + }
  112 + return list
  113 +}
  114 +
  115 +// GetNewCard 按顺序查找数目最少的一张卡抽取
  116 +func GetNewCard(gameData *dto.CardHolderData) int {
  117 + if len(Config.CardConfig) < 1 {
  118 + return 0
  119 + }
  120 + rate := int64(100000000)
  121 + list := make([]int64, 0)
  122 + for id, _ := range Config.CardConfig {
  123 + count, _ := gameData.Details.Cards[id]
  124 + index := int64(count)*rate + int64(id)
  125 + list = append(list, index)
  126 + }
  127 +
  128 + indexMin := uttype.Min(list...)
  129 + return int(indexMin % rate)
  130 +}
  131 +
  132 +// HandleNextRound 处理轮次完成 保留卡包 星级序列刻度 卡牌序列刻度
  133 +func HandleNextRound(gameData *dto.CardHolderData) {
  134 + gameData.Details.Round += 1
  135 + gameData.Details.Cards = make(map[int]int)
  136 + gameData.Details.Album = make(map[string]int)
  137 +}
service/ht-cardholder/config-registry.go
@@ -1,131 +0,0 @@ @@ -1,131 +0,0 @@
1 -package ht_cardholder  
2 -  
3 -import (  
4 - "apigame/service/constd"  
5 - "apigame/util/util-lx/lxalilog"  
6 - "encoding/json"  
7 - "errors"  
8 - "fmt"  
9 - "strings"  
10 -)  
11 -  
12 -var (  
13 - ConfigRaws CardActivityConfigRaw // 活动配置 原始数据  
14 - Config CardActivityConfig // 活动配置 分析后数据  
15 -)  
16 -  
17 -func NewConfigs() {  
18 - ConfigRaws = CardActivityConfigRaw{}  
19 - Config = CardActivityConfig{}  
20 -}  
21 -  
22 -// ConfigDecode 解析配置原始数据  
23 -func ConfigDecode() {  
24 - Config = CardActivityConfig{  
25 - Raw: ConfigRaws,  
26 - Id: ConfigRaws.Id,  
27 - Awards: make(map[string]string),  
28 - AlbumConfig: make(map[string]AlbumConfig),  
29 - CardConfig: make(map[int]CardConfig),  
30 - CardholderConfig: make(map[string]CardholderConfig),  
31 - NormalCardStarConfig: make(map[string]NormalCardStarConfig),  
32 - CardSequenceConfig: make(map[string]CardSequenceConfig),  
33 - }  
34 - // 解析奖励  
35 - {  
36 - err := json.Unmarshal([]byte(ConfigRaws.Awards), &Config.Awards)  
37 - if err != nil {  
38 - lxalilog.Errors(err, ConfigRaws.Awards, constd.GAME_ID_HT, ConfigRaws.Id)  
39 - return  
40 - }  
41 - }  
42 - // 卡组配置  
43 - {  
44 - configs := make([]AlbumConfig, 0)  
45 - err := json.Unmarshal([]byte(ConfigRaws.AlbumConfig), &configs)  
46 - if err != nil {  
47 - lxalilog.Errors(err, ConfigRaws.AlbumConfig, constd.GAME_ID_HT, ConfigRaws.Id)  
48 - return  
49 - }  
50 - for _, i2 := range configs {  
51 - Config.AlbumConfig[i2.SetId] = i2  
52 - }  
53 - }  
54 - // 卡牌配置  
55 - {  
56 - configs := make([]CardConfig, 0)  
57 - err := json.Unmarshal([]byte(ConfigRaws.CardConfig), &configs)  
58 - if err != nil {  
59 - lxalilog.Errors(err, ConfigRaws.CardConfig, constd.GAME_ID_HT, ConfigRaws.Id)  
60 - return  
61 - }  
62 - for _, i2 := range configs {  
63 - Config.CardConfig[i2.Id] = i2  
64 - }  
65 - }  
66 - // 卡包开卡规则  
67 - {  
68 - configs := make([]CardholderConfig, 0)  
69 - err := json.Unmarshal([]byte(ConfigRaws.CardHolderConfig), &configs)  
70 - if err != nil {  
71 - lxalilog.Errors(err, ConfigRaws.CardHolderConfig, constd.GAME_ID_HT, ConfigRaws.Id)  
72 - return  
73 - }  
74 - for _, i2 := range configs {  
75 - Config.CardholderConfig[i2.Id] = i2  
76 - }  
77 - }  
78 - // 卡片星级配置  
79 - {  
80 - configs := make([]NormalCardStarConfig, 0)  
81 - err := json.Unmarshal([]byte(ConfigRaws.NormalCardStarSequence), &configs)  
82 - if err != nil {  
83 - lxalilog.Errors(err, ConfigRaws.NormalCardStarSequence, constd.GAME_ID_HT, ConfigRaws.Id)  
84 - return  
85 - }  
86 - for _, i2 := range configs {  
87 - i2.NormalCardSequenceIds = strings.Split(i2.NormalCardSequenceId, ",")  
88 - combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort)  
89 - Config.NormalCardStarConfig[combineId] = i2  
90 - }  
91 - }  
92 - // 卡片星级对应卡牌配置  
93 - {  
94 - configs := make([]CardSequenceConfig, 0)  
95 - err := json.Unmarshal([]byte(ConfigRaws.CardSequenceConfig), &configs)  
96 - if err != nil {  
97 - lxalilog.Errors(err, ConfigRaws.CardSequenceConfig, constd.GAME_ID_HT, ConfigRaws.Id)  
98 - return  
99 - }  
100 - for _, i2 := range configs {  
101 - i2.CardIdLists = strings.Split(i2.CardIdList, ",")  
102 - combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort)  
103 - Config.CardSequenceConfig[combineId] = i2  
104 - }  
105 - }  
106 -}  
107 -  
108 -// CombineIdSequenceIdCohort 组合ID k=ID_用户序列_用户分组  
109 -func CombineIdSequenceIdCohort(id, sequenceId, cohort string) string {  
110 - return fmt.Sprintf("%s_%s_%s", id, sequenceId, cohort)  
111 -}  
112 -  
113 -// FindNormalCardStarConfig 查找配置 非保底卡星级ID  
114 -func FindNormalCardStarConfig(id, sequenceId, cohort string) (conf NormalCardStarConfig, has bool) {  
115 - combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort)  
116 - conf, has = Config.NormalCardStarConfig[combineId]  
117 - if !has {  
118 - lxalilog.Errors(errors.New("ht_cardholder NormalCardStarConfig error"), id, sequenceId, cohort)  
119 - }  
120 - return  
121 -}  
122 -  
123 -// FindCardSequenceConfig 查找配置 星级ID对应的卡片  
124 -func FindCardSequenceConfig(id, sequenceId, cohort string) (conf CardSequenceConfig, has bool) {  
125 - combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort)  
126 - conf, has = Config.CardSequenceConfig[combineId]  
127 - if !has {  
128 - lxalilog.Errors(errors.New("ht_cardholder CardSequenceConfig error"), id, sequenceId, cohort)  
129 - }  
130 - return  
131 -}  
service/ht-cardholder/config.go
@@ -1,89 +0,0 @@ @@ -1,89 +0,0 @@
1 -package ht_cardholder  
2 -  
3 -import "apigame/service/constd"  
4 -  
5 -// CardActivityUpdateConfig 卡牌活动更新配置  
6 -type CardActivityUpdateConfig struct {  
7 - Id int64 // ID  
8 - Status int // 状态 0=关闭 1=开启  
9 - UpdateTime int64 // 修改时间戳  
10 -}  
11 -  
12 -// CardActivityConfig 卡牌活动配置 分析后数据  
13 -type CardActivityConfig struct {  
14 - Raw CardActivityConfigRaw  
15 - Id int64 // ID  
16 - Awards map[string]string // 奖励配置  
17 - AlbumConfig map[string]AlbumConfig // 卡组配置  
18 - CardConfig map[int]CardConfig // 卡牌配置  
19 - CardholderConfig map[string]CardholderConfig // 卡包开卡规则  
20 - NormalCardStarConfig map[string]NormalCardStarConfig // k=ID_用户序列_用户分组 卡片星级配置  
21 - CardSequenceConfig map[string]CardSequenceConfig // k=ID_用户序列_用户分组 卡片星级对应卡牌配置  
22 -}  
23 -  
24 -func (c *CardActivityConfig) TableName() string {  
25 - return constd.MYSQL_TABLE_S_CARD_ACTIVITY + constd.GAME_ID_HT  
26 -}  
27 -  
28 -// CardActivityConfigRaw 卡牌活动配置 原始数据  
29 -type CardActivityConfigRaw struct {  
30 - Id int64 // ID  
31 - OpenLevel int // 开启等级  
32 - PreviewTime int64 // 预告时间  
33 - StartTime int64 // 开始时间  
34 - EndTime int64 // 结束时间  
35 - Round int // 轮数  
36 - Awards string // 奖励配置  
37 - AlbumConfig string // 卡组配置  
38 - CardConfig string // 卡牌配置  
39 - CardHolderConfig string // 卡包开卡规则  
40 - NormalCardStarSequence string // 卡片星级配置  
41 - CardSequenceConfig string // 卡片星级对应卡牌配置  
42 - Ver string // 版本号  
43 - Status int // 状态 0=关闭 1=开启  
44 - UpdateTime int64 // 修改时间戳  
45 -}  
46 -  
47 -// AlbumConfig 卡组表  
48 -type AlbumConfig struct {  
49 - SetId string `json:"set_id"` // 卡组id  
50 - Rewards map[string]string `json:"rewards"` // 集齐奖励 k=轮次  
51 - StartTime int64 `json:"start_time"` // 开始时间  
52 - EndTime int64 `json:"end_time"` // 结束时间  
53 -}  
54 -  
55 -// CardConfig 卡牌表  
56 -type CardConfig struct {  
57 - Id int `json:"id"` // ID  
58 - SetId string `json:"album_setid"` // 卡组id  
59 - IsGold int `json:"is_gold"` // 是否是金卡  
60 - Star int `json:"star"` // 星级  
61 -}  
62 -  
63 -// CardholderConfig 卡包开卡规则表  
64 -type CardholderConfig struct {  
65 - Id string `json:"id"` // ID  
66 - IsGoldCardholder int `json:"is_gold_card_holder"` // 是否是金卡包  
67 - IsNew int `json:"is_new"` // 是否是新卡包  
68 - GuaranteedStarCardId string `json:"guaranteed_star_card_id"` // 保底卡星级序列ID  
69 - NormalCardNumber int `json:"normal_card_number"` // 非保底卡数量  
70 - MinimumGuaranteeCardId string `json:"minimum_guarantee_card_id"` // 非保底卡牌序列ID  
71 -}  
72 -  
73 -// NormalCardStarConfig 非保底卡星级ID  
74 -type NormalCardStarConfig struct {  
75 - Id string `json:"id"` // ID  
76 - SequenceId string `json:"user_sequence_id"` // 用户序列组ID  
77 - Cohort string `json:"cohort"` // 用户分组  
78 - NormalCardSequenceId string `json:"normal_card_sequence_id"` // 非保底星级序列  
79 - NormalCardSequenceIds []string `json:"-"` // 非保底星级序列  
80 -}  
81 -  
82 -// CardSequenceConfig 星级ID对应的卡片  
83 -type CardSequenceConfig struct {  
84 - Id string `json:"id"` // SequenceId 用户序列组ID  
85 - SequenceId string `json:"user_sequence_id"` // 用户序列组ID  
86 - Cohort string `json:"cohort"` // 用户分组  
87 - CardIdList string `json:"card_id_list"` // 卡牌抽取序列  
88 - CardIdLists []string `json:"-"` // 卡牌抽取序列  
89 -}  
service/ht-cardholder/configs.go
@@ -1,69 +0,0 @@ @@ -1,69 +0,0 @@
1 -package ht_cardholder  
2 -  
3 -import (  
4 - "apigame/service/constd"  
5 - "apigame/util/util-lx/lxalilog"  
6 - "apigame/util/utmysql"  
7 - "fmt"  
8 - "github.com/astaxie/beego/logs"  
9 -)  
10 -  
11 -// Init 初始化  
12 -func Init() {  
13 -  
14 - NewConfigs()  
15 -  
16 - TryUpdateConfigs()  
17 -  
18 - //DumpConfigs()  
19 -}  
20 -  
21 -// TryUpdateConfigs 尝试更新配置表  
22 -func TryUpdateConfigs() {  
23 - LoadConfigs()  
24 -}  
25 -  
26 -// LoadConfigs 读取mysql配置  
27 -func LoadConfigs() {  
28 - configTableName := new(CardActivityConfig).TableName()  
29 - // 找到当前开放的活动  
30 - configOpen := CardActivityUpdateConfig{Id: 0}  
31 - {  
32 - conf := make([]CardActivityUpdateConfig, 0)  
33 - sql := fmt.Sprintf("select id,status,update_time from %s", configTableName)  
34 - err := utmysql.FindSql(constd.MYSQL_MERGECONFIG, sql, &conf)  
35 - if err != nil {  
36 - lxalilog.Errors(err, sql, constd.GAME_ID_HT)  
37 - return  
38 - }  
39 - for _, config := range conf {  
40 - if config.Status != 0 {  
41 - configOpen = config  
42 - continue  
43 - }  
44 - }  
45 - fmt.Println(configOpen)  
46 - }  
47 - // 没有开放的活动  
48 - if configOpen.Id == 0 {  
49 - return  
50 - }  
51 - // 更新数据  
52 - if configOpen.Id != Config.Raw.Id || configOpen.UpdateTime != Config.Raw.UpdateTime {  
53 - logs.Debug("__________________尝试更新活动条目ID:", configOpen.Id)  
54 - confNew := CardActivityConfigRaw{}  
55 - sql := fmt.Sprintf("select * from %s where id=%d limit 1", configTableName, configOpen.Id)  
56 - err := utmysql.FindOneSql(constd.MYSQL_MERGECONFIG, sql, &confNew)  
57 - if err != nil {  
58 - lxalilog.Errors(err, sql, constd.GAME_ID_HT, configOpen.Id)  
59 - return  
60 - }  
61 - logs.Debug("__________________更新活动条目ID:", confNew.Id)  
62 - ConfigRaws = confNew  
63 - ConfigDecode()  
64 - }  
65 -}  
66 -  
67 -func DumpConfigs() {  
68 -  
69 -}  
service/ht-cardholder/handle.go
@@ -1,296 +0,0 @@ @@ -1,296 +0,0 @@
1 -package ht_cardholder  
2 -  
3 -import (  
4 - "apigame/dto"  
5 - "apigame/models"  
6 - "apigame/service/constd"  
7 - game_record "apigame/service/game-record"  
8 - "apigame/util/utjson"  
9 - "apigame/util/uttype"  
10 - "strconv"  
11 -)  
12 -  
13 -// HandleInfo 卡包信息  
14 -func HandleInfo(req *models.ReqHtCardHolderInfo) (code string, rsp models.RspHtCardHolderInfo) {  
15 - rsp = models.RspHtCardHolderInfo{}  
16 - code = constd.RECODE_OK  
17 -  
18 - // 尝试更新配置  
19 - TryUpdateConfigs()  
20 -  
21 - // 读取游戏数据  
22 - gameData := LoadData(req.UID)  
23 -  
24 - rsp.HtCardHolderInfo = gameData.GetInfo()  
25 -  
26 - return  
27 -}  
28 -  
29 -// HandleGetNew 获取卡包  
30 -func HandleGetNew(req *models.ReqHtCardHolderGetNew) (code string, rsp models.RspHtCardHolderGetNew) {  
31 - rsp = models.RspHtCardHolderGetNew{}  
32 - code = constd.RECODE_OK  
33 -  
34 - // 尝试更新配置  
35 - TryUpdateConfigs()  
36 -  
37 - // 检查活动状态  
38 - code = CheckStatus()  
39 - if code != constd.RECODE_OK {  
40 - return  
41 - }  
42 - // 检查卡包ID  
43 - _, okCardholderConfig := Config.CardholderConfig[strconv.Itoa(req.Id)]  
44 - if !okCardholderConfig {  
45 - code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR  
46 - return  
47 - }  
48 - // 检查卡包数量  
49 - if req.Count < 1 {  
50 - code = constd.RECODE_MERGE_CARDHOLDER_COUNTILLEGAL_ERROR  
51 - return  
52 - }  
53 -  
54 - // 读取游戏数据  
55 - gameData := LoadData(req.UID)  
56 - // 检查游戏数据 轮次等  
57 - code = CheckGameData(gameData)  
58 - if code != constd.RECODE_OK {  
59 - return  
60 - }  
61 -  
62 - gameData.Details.Cardholder[req.Id] += req.Count  
63 - SaveData(gameData)  
64 -  
65 - // 返回信息  
66 - rsp.HtCardHolderInfo = gameData.GetInfo()  
67 -  
68 - // 记录日志  
69 - game_record.Save(dto.NewHtCardHolderRecordGetNew(gameData.Uid, Config.Id, gameData.Details.Round,  
70 - req.Id, req.Count))  
71 -  
72 - return  
73 -}  
74 -  
75 -// HandleOpen 打开卡包  
76 -func HandleOpen(req *models.ReqHtCardHolderOpen) (code string, rsp models.RspHtCardHolderOpen) {  
77 - rsp = models.RspHtCardHolderOpen{}  
78 - code = constd.RECODE_OK  
79 -  
80 - // 尝试更新配置  
81 - TryUpdateConfigs()  
82 -  
83 - // 检查活动状态  
84 - code = CheckStatus()  
85 - if code != constd.RECODE_OK {  
86 - return  
87 - }  
88 - // 检查卡包ID  
89 - confCardholder, okCardholderConfig := Config.CardholderConfig[strconv.Itoa(req.Id)]  
90 - if !okCardholderConfig {  
91 - code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR  
92 - return  
93 - }  
94 -  
95 - // 读取游戏数据  
96 - gameData := LoadData(req.UID)  
97 - // 检查游戏数据 轮次等  
98 - code = CheckGameData(gameData)  
99 - if code != constd.RECODE_OK {  
100 - return  
101 - }  
102 -  
103 - // 判断卡包数目  
104 - countOld, _ := gameData.Details.Cardholder[req.Id]  
105 - if countOld < 1 {  
106 - code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDER_NOTENOUGH_ERROR  
107 - return  
108 - }  
109 -  
110 - // 开始处理抽卡  
111 - sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID)  
112 - //logs.Debug("wjwdbg 用户序列组IDsequenceId", sequenceId)  
113 - //logs.Debug("wjwdbg 用户分组IDcohort:", cohort)  
114 - if confCardholder.IsNew != 0 {  
115 - // 如果是新卡包 按顺序查找数目最少的一张卡抽取  
116 - cardId := GetNewCard(gameData)  
117 - //logs.Debug("wjwdbg 抽取新卡ID:", cardId)  
118 - // 增加卡牌  
119 - gameData.Details.Cards[cardId] += 1  
120 - rsp.NewCards = append(rsp.NewCards, cardId)  
121 - } else {  
122 - getCardFunc := func(cardConfigId string) {  
123 - confCardSequence, hasCardSequence := FindCardSequenceConfig(cardConfigId, sequenceId, cohort)  
124 - if hasCardSequence {  
125 - combineId := CombineIdSequenceIdCohort(cardConfigId, sequenceId, cohort)  
126 - scale := gameData.Details.CardSequenceScales[combineId]  
127 - cardId := GetOneFromArray(confCardSequence.CardIdLists, scale)  
128 - cardIdInt := uttype.StringToInt(cardId)  
129 - // 增加刻度  
130 - gameData.Details.CardSequenceScales[combineId] = scale + 1  
131 - // 增加卡牌  
132 - gameData.Details.Cards[cardIdInt] += 1  
133 - //logs.Debug("wjwdbg😊 抽取卡牌ID:", cardIdInt)  
134 - rsp.NewCards = append(rsp.NewCards, cardIdInt)  
135 - }  
136 - }  
137 - // 正常抽卡  
138 - // 先抽保底卡  
139 - if confCardholder.GuaranteedStarCardId != "0" {  
140 - getCardFunc(confCardholder.GuaranteedStarCardId)  
141 - //logs.Debug("wjwdbg 保底卡牌配置ID:", confCardholder.GuaranteedStarCardId)  
142 - }  
143 - // 非保底卡  
144 - if confCardholder.NormalCardNumber > 0 {  
145 - count := confCardholder.NormalCardNumber  
146 - confNormalCardStar, hasNormalCardStar := FindNormalCardStarConfig(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort)  
147 - if hasNormalCardStar {  
148 - combineIdStar := CombineIdSequenceIdCohort(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort)  
149 - scaleStar := gameData.Details.StarSequenceScales[combineIdStar]  
150 - starIds := GetListFromArray(confNormalCardStar.NormalCardSequenceIds, scaleStar, count)  
151 - // 增加星级刻度  
152 - gameData.Details.StarSequenceScales[combineIdStar] = scaleStar + count  
153 - //logs.Debug("wjwdbg 非保底卡星级ID:", confCardholder.MinimumGuaranteeCardId)  
154 - //logs.Debug("wjwdbg 非保底卡星级抽取序列:", starIds)  
155 - // 遍历星级刻度抽取n张卡牌  
156 - for _, id := range starIds {  
157 - getCardFunc(id)  
158 - }  
159 - }  
160 - }  
161 - }  
162 -  
163 - // 删除一个卡包  
164 - gameData.Details.Cardholder[req.Id] = countOld - 1  
165 -  
166 - // 存档  
167 - SaveData(gameData)  
168 -  
169 - // 记录日志  
170 - game_record.Save(dto.NewHtCardHolderRecordOpen(gameData.Uid, Config.Id, gameData.Details.Round,  
171 - req.Id, utjson.JsonString(rsp.NewCards)))  
172 -  
173 - //logs.Debug("wjwdbg 获取卡牌列表:", rsp.NewCards)  
174 - uttype.Shuffle(rsp.NewCards)  
175 - //logs.Debug("wjwdbg 获取卡牌列表打乱:", rsp.NewCards)  
176 -  
177 - // 返回信息  
178 - rsp.HtCardHolderInfo = gameData.GetInfo()  
179 -  
180 - return  
181 -}  
182 -  
183 -// HandleGetRewardAlbum 领取卡组奖励  
184 -func HandleGetRewardAlbum(req *models.ReqHtCardHolderGetRewardAlbum) (code string, rsp models.RspHtCardHolderGetRewardAlbum) {  
185 - rsp = models.RspHtCardHolderGetRewardAlbum{}  
186 - code = constd.RECODE_OK  
187 -  
188 - // 尝试更新配置  
189 - TryUpdateConfigs()  
190 -  
191 - // 检查活动状态  
192 - code = CheckStatus()  
193 - if code != constd.RECODE_OK {  
194 - return  
195 - }  
196 - // 检查卡组ID  
197 - albumId := strconv.Itoa(req.Id)  
198 - confAlbum, okAlbum := Config.AlbumConfig[albumId]  
199 - if !okAlbum {  
200 - code = constd.RECODE_MERGE_CARDHOLDER_ALBUMID_ERROR  
201 - return  
202 - }  
203 -  
204 - // 读取游戏数据  
205 - gameData := LoadData(req.UID)  
206 - // 检查游戏数据 轮次等  
207 - code = CheckGameData(gameData)  
208 - if code != constd.RECODE_OK {  
209 - return  
210 - }  
211 -  
212 - // 是否已领过  
213 - countGot := gameData.Details.Album[albumId]  
214 - if countGot > 0 {  
215 - code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_HASGOT_ERROR  
216 - return  
217 - }  
218 - // 检查卡组内卡是否集齐  
219 - for _, config := range Config.CardConfig {  
220 - if config.SetId == albumId {  
221 - count := gameData.Details.Cards[config.Id]  
222 - if count < 1 {  
223 - code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_NOTFINISH_ERROR  
224 - return  
225 - }  
226 - }  
227 - }  
228 -  
229 - gameData.Details.Album[albumId] += 1  
230 - SaveData(gameData)  
231 -  
232 - // 当前轮次  
233 - round := gameData.Details.Round  
234 - // 返回奖励  
235 - rsp.Award = confAlbum.Rewards[uttype.IntToString(round)]  
236 -  
237 - // 返回信息  
238 - rsp.HtCardHolderInfo = gameData.GetInfo()  
239 -  
240 - // 记录日志  
241 - game_record.Save(dto.NewHtCardHolderRecordRewardAlbum(gameData.Uid, Config.Id, gameData.Details.Round,  
242 - req.Id, rsp.Award))  
243 -  
244 - return  
245 -}  
246 -  
247 -// HandleGetRewardRound 领取轮次奖励  
248 -func HandleGetRewardRound(req *models.ReqHtCardHolderGetRewardRound) (code string, rsp models.RspHtCardHolderGetRewardRound) {  
249 - rsp = models.RspHtCardHolderGetRewardRound{}  
250 - code = constd.RECODE_OK  
251 -  
252 - // 尝试更新配置  
253 - TryUpdateConfigs()  
254 -  
255 - // 检查活动状态  
256 - code = CheckStatus()  
257 - if code != constd.RECODE_OK {  
258 - return  
259 - }  
260 -  
261 - // 读取游戏数据  
262 - gameData := LoadData(req.UID)  
263 - // 检查游戏数据 轮次等  
264 - code = CheckGameData(gameData)  
265 - if code != constd.RECODE_OK {  
266 - return  
267 - }  
268 -  
269 - // 判断所有卡组是否已经集齐  
270 - // 检查卡组内卡是否集齐  
271 - for _, config := range Config.AlbumConfig {  
272 - count := gameData.Details.Album[config.SetId]  
273 - if count < 1 {  
274 - code = constd.RECODE_MERGE_CARDHOLDER_ALBUM_NOTFINISH_ERROR  
275 - return  
276 - }  
277 - }  
278 -  
279 - // 当前轮次  
280 - round := gameData.Details.Round  
281 - // 返回奖励  
282 - rsp.Award = Config.Awards[uttype.IntToString(round)]  
283 -  
284 - // 记录日志  
285 - game_record.Save(dto.NewHtCardHolderRecordRewardRound(gameData.Uid, Config.Id, gameData.Details.Round,  
286 - rsp.Award))  
287 -  
288 - // 处理轮次完成  
289 - HandleNextRound(gameData)  
290 - SaveData(gameData)  
291 -  
292 - // 返回信息  
293 - rsp.HtCardHolderInfo = gameData.GetInfo()  
294 -  
295 - return  
296 -}  
service/ht-cardholder/logic.go
@@ -1,137 +0,0 @@ @@ -1,137 +0,0 @@
1 -package ht_cardholder  
2 -  
3 -import (  
4 - "apigame/dto"  
5 - "apigame/service/constd"  
6 - "apigame/util/util-lx/lxalilog"  
7 - "apigame/util/util-lx/lxtime"  
8 - "apigame/util/uttype"  
9 - "github.com/astaxie/beego/orm"  
10 -)  
11 -  
12 -// SaveData 存储数据  
13 -func SaveData(d *dto.HtCardHolderData) {  
14 - d.UpdateTime = lxtime.NowUninx()  
15 - d.Encode()  
16 - o := orm.NewOrm()  
17 - o.Using(constd.MYSQL_DEFAULT)  
18 - if _, err := o.InsertOrUpdate(d); err != nil {  
19 - lxalilog.Errors(err, "ht_cardholder SaveData Error", d.Uid)  
20 - }  
21 -}  
22 -  
23 -func _LoadData(uid int64) (d *dto.HtCardHolderData) {  
24 - d = dto.NewHtCardHolderData(uid)  
25 - o := orm.NewOrm()  
26 - o.Using(constd.MYSQL_DEFAULT)  
27 - qs := o.QueryTable(d)  
28 - qs = qs.Filter("uid", uid)  
29 - count, err := qs.Count()  
30 - if count == 0 {  
31 - d.CreateTime = lxtime.NowUninx()  
32 - } else {  
33 - err = qs.One(d)  
34 - if err != nil {  
35 - lxalilog.Errors(err, "ht_cardholder LoadData Error", uid)  
36 - } else {  
37 - d.Details = dto.NewHtCardHolderDataDetails()  
38 - d.Decode()  
39 - }  
40 - }  
41 - return  
42 -}  
43 -  
44 -// LoadData 获取数据 外部接口  
45 -func LoadData(uid int64) (d *dto.HtCardHolderData) {  
46 - d = _LoadData(uid)  
47 - // 如果当前有上线活动(活动ID不为0),且活动ID和玩家数据不同,说明活动已切换 需更新  
48 - if Config.Id != 0 &&  
49 - Config.Id != d.ActivityId {  
50 - d.ActivityId = Config.Id  
51 - d.Details = dto.NewHtCardHolderDataDetails()  
52 - SaveData(d)  
53 - }  
54 - return  
55 -}  
56 -  
57 -// CheckStatus 判断活动是否开启  
58 -func CheckStatus() string {  
59 - sec := lxtime.NowUninx()  
60 - if Config.Id == 0 {  
61 - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR  
62 - }  
63 - if sec < Config.Raw.StartTime {  
64 - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR  
65 - }  
66 - if sec > Config.Raw.EndTime {  
67 - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR  
68 - }  
69 - return constd.RECODE_OK  
70 -}  
71 -  
72 -// CheckGameData 检查游戏数据 轮次等  
73 -func CheckGameData(d *dto.HtCardHolderData) string {  
74 - if d.Details.Round > Config.Raw.Round {  
75 - return constd.RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR  
76 - }  
77 - return constd.RECODE_OK  
78 -}  
79 -  
80 -// GetUserSequenceIdAndCohort 获取 用户序列组ID(sequenceId) 用户分组(cohort)  
81 -func GetUserSequenceIdAndCohort(uid int64) (sequenceId, cohort string) {  
82 - // todo 这里后续要对接  
83 - sequenceId = "1"  
84 - cohort = "1"  
85 - return  
86 -}  
87 -  
88 -// GetOneFromArray 从配置的数组里获取一个值 scale=之前刻度  
89 -func GetOneFromArray(array []string, scale int) string {  
90 - length := len(array)  
91 - if length < 1 {  
92 - return ""  
93 - }  
94 - if length == 1 {  
95 - return array[0]  
96 - }  
97 - return array[scale%length]  
98 -}  
99 -  
100 -// GetListFromArray 从配置的数组里获取一组值 scale=之前刻度 count=数目  
101 -func GetListFromArray(array []string, scale, count int) []string {  
102 - list := make([]string, 0)  
103 - if count < 0 {  
104 - return list  
105 - }  
106 - s := scale  
107 - for i := 0; i < count; i++ {  
108 - one := GetOneFromArray(array, s)  
109 - list = append(list, one)  
110 - s++  
111 - }  
112 - return list  
113 -}  
114 -  
115 -// GetNewCard 按顺序查找数目最少的一张卡抽取  
116 -func GetNewCard(gameData *dto.HtCardHolderData) int {  
117 - if len(Config.CardConfig) < 1 {  
118 - return 0  
119 - }  
120 - rate := int64(100000000)  
121 - list := make([]int64, 0)  
122 - for id, _ := range Config.CardConfig {  
123 - count, _ := gameData.Details.Cards[id]  
124 - index := int64(count)*rate + int64(id)  
125 - list = append(list, index)  
126 - }  
127 -  
128 - indexMin := uttype.Min(list...)  
129 - return int(indexMin % rate)  
130 -}  
131 -  
132 -// HandleNextRound 处理轮次完成 保留卡包 星级序列刻度 卡牌序列刻度  
133 -func HandleNextRound(gameData *dto.HtCardHolderData) {  
134 - gameData.Details.Round += 1  
135 - gameData.Details.Cards = make(map[int]int)  
136 - gameData.Details.Album = make(map[string]int)  
137 -}