Commit bb2b13bb01807ee51a8b721f4daa7fa4f91c28cd

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

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

README.md
... ... @@ -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 @@
  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   -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 @@
  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 @@
  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   -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   -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   -}
dto/inits.go
... ... @@ -71,7 +71,7 @@ func Inits() (err error) {
71 71 //_ = config.InitLxLimit()
72 72  
73 73 // 海滩卡包
74   - InitHtCardholder()
  74 + InitCardholder()
75 75  
76 76 return
77 77 }
... ...
main.go
... ... @@ -3,7 +3,7 @@ package main
3 3 import (
4 4 "apigame/dto"
5 5 _ "apigame/routers"
6   - "apigame/service/ht-cardholder"
  6 + "apigame/service/cardholder"
7 7 "github.com/astaxie/beego"
8 8 "github.com/astaxie/beego/logs"
9 9 "github.com/astaxie/beego/plugins/cors"
... ... @@ -30,7 +30,7 @@ func main() {
30 30 _ = dto.Inits()
31 31  
32 32 // 初始化配置
33   - ht_cardholder.Init()
  33 + cardholder.Init()
34 34  
35 35 beego.Run()
36 36 }
... ...
models/ht-cardholder.go
... ... @@ -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 7 Cardholder map[int]int `form:"cardholder" json:"cardholder"` // 卡包数量 k=卡包ID v=卡包数量
8 8 Cards map[int]int `form:"cards" json:"cards"` // 每张卡集了多少张 k=卡牌ID v=数量
9 9 Album map[string]int `form:"album" json:"album"` // 卡组奖励领取 k=卡组ID v=数量
10 10 Round int `form:"round" json:"round"` // 卡册当前轮次
11 11 }
12 12  
13   -// ReqHtCardHolderInfo 请求 卡包信息
14   -type ReqHtCardHolderInfo struct {
  13 +// ReqCardHolderInfo 请求 卡包信息
  14 +type ReqCardHolderInfo struct {
15 15 BaseLoginInfo
16 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 26 BaseLoginInfo
27 27 BaseSign
28 28 Id int `form:"id" json:"id" valid:"Required"` // 卡包ID
29 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 39 BaseLoginInfo
40 40 BaseSign
41 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 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 52 BaseLoginInfo
53 53 BaseSign
54 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 60 Award string `form:"award" json:"award"` // 奖励字符串
61 61 }
62 62  
63   -// ReqHtCardHolderGetRewardRound 请求 领取轮次奖励
64   -type ReqHtCardHolderGetRewardRound struct {
  63 +// ReqCardHolderGetRewardRound 请求 领取轮次奖励
  64 +type ReqCardHolderGetRewardRound struct {
65 65 BaseLoginInfo
66 66 BaseSign
67 67 }
68 68  
69   -// RspHtCardHolderGetRewardRound 返回 领取轮次奖励
70   -type RspHtCardHolderGetRewardRound struct {
71   - HtCardHolderInfo
  69 +// RspCardHolderGetRewardRound 返回 领取轮次奖励
  70 +type RspCardHolderGetRewardRound struct {
  71 + CardHolderInfo
72 72 Award string `form:"award" json:"award"` // 奖励字符串
73 73 }
... ...
routers/router.go
... ... @@ -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 25 beego.ErrorController(&controllers.ErrorController{})
26 26 }
... ...
service/cardholder/config-registry.go 0 → 100644
... ... @@ -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 @@
  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 @@
  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 @@
  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 @@
  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   -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   -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   -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   -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   -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   -}