Commit 10969d16d81742efef734760ebb35157dd5e04a3

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

feat:公共库整理,开卡包(新卡,保底卡)

api-util/json.go
@@ -1,8 +0,0 @@ @@ -1,8 +0,0 @@
1 -package api_util  
2 -  
3 -import "encoding/json"  
4 -  
5 -func JsonString(o any) string {  
6 - bs, _ := json.Marshal(o)  
7 - return string(bs)  
8 -}  
api-util/umysql/index.go
@@ -1,55 +0,0 @@ @@ -1,55 +0,0 @@
1 -package umysql  
2 -  
3 -import (  
4 - "github.com/astaxie/beego/orm"  
5 - "strings"  
6 -)  
7 -  
8 -// FindSql 查询数据 根据sql  
9 -func FindSql(dbName string, sql string, result any) (err error) {  
10 - orm := orm.NewOrm()  
11 - orm.Using(dbName)  
12 -  
13 - if _, err = orm.Raw(sql).QueryRows(result); err != nil {  
14 - if strings.Contains(err.Error(), "doesn't exist") {  
15 - err = nil  
16 - return  
17 - }  
18 - return  
19 - }  
20 - return  
21 -}  
22 -  
23 -// FindOneSql 查询一条数据 根据sql  
24 -func FindOneSql(dbName string, sql string, result any) (err error) {  
25 - orm := orm.NewOrm()  
26 - orm.Using(dbName)  
27 -  
28 - if err = orm.Raw(sql).QueryRow(result); err != nil {  
29 - if strings.Contains(err.Error(), "doesn't exist") {  
30 - err = nil  
31 - return  
32 - }  
33 - return  
34 - }  
35 - return  
36 -}  
37 -  
38 -//  
39 -//// Find 查询数据  
40 -//func Find(dbName string, tableName string, result any) (err error) {  
41 -// o := orm.NewOrm()  
42 -// o.Using(dbName)  
43 -//  
44 -// // 也可以直接使用对象作为表名  
45 -// qs := o.QueryTable(tableName)  
46 -//  
47 -// if _, err = qs.All(result); err != nil {  
48 -// if strings.Contains(err.Error(), "doesn't exist") {  
49 -// err = nil  
50 -// return  
51 -// }  
52 -// return  
53 -// }  
54 -// return  
55 -//}  
models/ht-cardholder.go
@@ -8,12 +8,21 @@ import ( @@ -8,12 +8,21 @@ import (
8 "github.com/astaxie/beego/orm" 8 "github.com/astaxie/beego/orm"
9 ) 9 )
10 10
  11 +func InitHtCardholder() {
  12 +
  13 + // register model
  14 + orm.RegisterModel(new(HtCardHolderData))
  15 +
  16 + // create table
  17 + orm.RunSyncdb("default", false, true)
  18 +}
  19 +
11 // HtCardHolderData 卡牌活动持久数据 20 // HtCardHolderData 卡牌活动持久数据
12 type HtCardHolderData struct { 21 type HtCardHolderData struct {
13 Uid int64 `orm:"pk"` // 玩家唯一ID 22 Uid int64 `orm:"pk"` // 玩家唯一ID
14 ActivityId int64 // 活动ID 23 ActivityId int64 // 活动ID
15 - DetailsData *HtCardHolderDataDetails `orm:"-"` // 活动详情  
16 - Details string `orm:"type(text)"` // 活动详情封装 24 + Details *HtCardHolderDataDetails `orm:"-"` // 活动详情
  25 + DetailsText string `orm:"type(text)"` // 活动详情封装
17 CreateTime int64 // 创建时间戳 26 CreateTime int64 // 创建时间戳
18 UpdateTime int64 // 修改时间戳 27 UpdateTime int64 // 修改时间戳
19 } 28 }
@@ -30,8 +39,8 @@ type HtCardHolderDataDetails struct { @@ -30,8 +39,8 @@ type HtCardHolderDataDetails struct {
30 39
31 func NewHtCardHolderData(uid int64) *HtCardHolderData { 40 func NewHtCardHolderData(uid int64) *HtCardHolderData {
32 return &HtCardHolderData{ 41 return &HtCardHolderData{
33 - Uid: uid,  
34 - DetailsData: NewHtCardHolderDataDetails(), 42 + Uid: uid,
  43 + Details: NewHtCardHolderDataDetails(),
35 } 44 }
36 } 45 }
37 46
@@ -52,17 +61,17 @@ func (d *HtCardHolderData) TableName() string { @@ -52,17 +61,17 @@ func (d *HtCardHolderData) TableName() string {
52 61
53 // Encode 打包数据 62 // Encode 打包数据
54 func (d *HtCardHolderData) Encode() { 63 func (d *HtCardHolderData) Encode() {
55 - details, err := json.Marshal(d.DetailsData) 64 + details, err := json.Marshal(d.Details)
56 if err != nil { 65 if err != nil {
57 lxalilog.Errors(err, "HtCardHolderData Encode Error", d.Uid, d.ActivityId) 66 lxalilog.Errors(err, "HtCardHolderData Encode Error", d.Uid, d.ActivityId)
58 return 67 return
59 } 68 }
60 - d.Details = string(details) 69 + d.DetailsText = string(details)
61 } 70 }
62 71
63 // Decode 分包数据 72 // Decode 分包数据
64 func (d *HtCardHolderData) Decode() { 73 func (d *HtCardHolderData) Decode() {
65 - err := json.Unmarshal([]byte(d.Details), d.DetailsData) 74 + err := json.Unmarshal([]byte(d.DetailsText), d.Details)
66 if err != nil { 75 if err != nil {
67 lxalilog.Errors(err, "HtCardHolderData Decode Error", d.Uid, d.ActivityId) 76 lxalilog.Errors(err, "HtCardHolderData Decode Error", d.Uid, d.ActivityId)
68 return 77 return
@@ -77,24 +86,15 @@ func (d *HtCardHolderData) GetInfo() dto.HtCardHolderInfo { @@ -77,24 +86,15 @@ func (d *HtCardHolderData) GetInfo() dto.HtCardHolderInfo {
77 Album: make(map[string]int), 86 Album: make(map[string]int),
78 Round: 0, 87 Round: 0,
79 } 88 }
80 - for i, i2 := range d.DetailsData.Cardholder { 89 + for i, i2 := range d.Details.Cardholder {
81 info.Cardholder[i] = i2 90 info.Cardholder[i] = i2
82 } 91 }
83 - for i, i2 := range d.DetailsData.Cards { 92 + for i, i2 := range d.Details.Cards {
84 info.Cards[i] = i2 93 info.Cards[i] = i2
85 } 94 }
86 - for i, i2 := range d.DetailsData.Album { 95 + for i, i2 := range d.Details.Album {
87 info.Album[i] = i2 96 info.Album[i] = i2
88 } 97 }
89 - info.Round = d.DetailsData.Round 98 + info.Round = d.Details.Round
90 return info 99 return info
91 } 100 }
92 -  
93 -func InitHtCardholder() {  
94 -  
95 - // register model  
96 - orm.RegisterModel(new(HtCardHolderData))  
97 -  
98 - // create table  
99 - orm.RunSyncdb("default", false, true)  
100 -}  
service/ht-cardholder/config-registry.go
@@ -6,6 +6,7 @@ import ( @@ -6,6 +6,7 @@ import (
6 "encoding/json" 6 "encoding/json"
7 "errors" 7 "errors"
8 "fmt" 8 "fmt"
  9 + "strings"
9 ) 10 )
10 11
11 var ( 12 var (
@@ -83,6 +84,7 @@ func ConfigDecode() { @@ -83,6 +84,7 @@ func ConfigDecode() {
83 return 84 return
84 } 85 }
85 for _, i2 := range configs { 86 for _, i2 := range configs {
  87 + i2.NormalCardSequenceIds = strings.Split(i2.NormalCardSequenceId, ",")
86 combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) 88 combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort)
87 Config.NormalCardStarSequence[combineId] = i2 89 Config.NormalCardStarSequence[combineId] = i2
88 } 90 }
@@ -96,6 +98,7 @@ func ConfigDecode() { @@ -96,6 +98,7 @@ func ConfigDecode() {
96 return 98 return
97 } 99 }
98 for _, i2 := range configs { 100 for _, i2 := range configs {
  101 + i2.CardIdLists = strings.Split(i2.CardIdList, ",")
99 combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) 102 combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort)
100 Config.CardSequenceConfig[combineId] = i2 103 Config.CardSequenceConfig[combineId] = i2
101 } 104 }
service/ht-cardholder/config.go
@@ -64,24 +64,26 @@ type CardConfig struct { @@ -64,24 +64,26 @@ type CardConfig struct {
64 type CardholderConfig struct { 64 type CardholderConfig struct {
65 Id string `json:"id"` // ID 65 Id string `json:"id"` // ID
66 GuaranteedStar string `json:"guaranteed_star_card_id"` // 保底卡星级序列ID 66 GuaranteedStar string `json:"guaranteed_star_card_id"` // 保底卡星级序列ID
67 - IsGoldCardholder int `json:"isgoldcardholder"` // 是否是金卡包  
68 - IsNew int `json:"isnew"` // 是否是新卡包 67 + IsGoldCardholder int `json:"is_gold_card_holder"` // 是否是金卡包
  68 + IsNew int `json:"is_new"` // 是否是新卡包
69 NormalCardNumber int `json:"normal_card_number"` // 非保底卡数量 69 NormalCardNumber int `json:"normal_card_number"` // 非保底卡数量
70 MinimumGuaranteeCardId string `json:"minimum_guarantee_card_id"` // 非保底卡牌序列ID 70 MinimumGuaranteeCardId string `json:"minimum_guarantee_card_id"` // 非保底卡牌序列ID
71 } 71 }
72 72
73 // NormalCardStarSequence 非保底卡星级ID 73 // NormalCardStarSequence 非保底卡星级ID
74 type NormalCardStarSequence struct { 74 type NormalCardStarSequence 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"` // 非保底星级序列 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:"-"` // 非保底星级序列
79 } 80 }
80 81
81 // CardSequenceConfig 星级ID对应的卡片 82 // CardSequenceConfig 星级ID对应的卡片
82 type CardSequenceConfig struct { 83 type CardSequenceConfig struct {
83 - Id string `json:"id"` // SequenceId 用户序列组ID  
84 - SequenceId string `json:"user_sequence_id"` // 用户序列组ID  
85 - Cohort string `json:"cohort"` // 用户分组  
86 - CardIdList string `json:"card_id_list"` // 卡牌抽取序列 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:"-"` // 卡牌抽取序列
87 } 89 }
service/ht-cardholder/configs.go
1 package ht_cardholder 1 package ht_cardholder
2 2
3 import ( 3 import (
4 - "apigame/api-util/umysql"  
5 "apigame/lx-util/lxalilog" 4 "apigame/lx-util/lxalilog"
6 "apigame/service/constd" 5 "apigame/service/constd"
  6 + "apigame/util/utmysql"
7 "fmt" 7 "fmt"
8 "github.com/astaxie/beego/logs" 8 "github.com/astaxie/beego/logs"
9 ) 9 )
@@ -31,7 +31,7 @@ func LoadConfigs() { @@ -31,7 +31,7 @@ func LoadConfigs() {
31 { 31 {
32 conf := make([]CardActivityUpdateConfig, 0) 32 conf := make([]CardActivityUpdateConfig, 0)
33 sql := fmt.Sprintf("select id,status,update_time from %s", configTableName) 33 sql := fmt.Sprintf("select id,status,update_time from %s", configTableName)
34 - err := umysql.FindSql(constd.MYSQL_MERGECONFIG, sql, &conf) 34 + err := utmysql.FindSql(constd.MYSQL_MERGECONFIG, sql, &conf)
35 if err != nil { 35 if err != nil {
36 lxalilog.Errors(err, sql, constd.GAME_ID_HT) 36 lxalilog.Errors(err, sql, constd.GAME_ID_HT)
37 return 37 return
@@ -53,7 +53,7 @@ func LoadConfigs() { @@ -53,7 +53,7 @@ func LoadConfigs() {
53 logs.Debug("__________________尝试更新活动条目ID:", configOpen.Id) 53 logs.Debug("__________________尝试更新活动条目ID:", configOpen.Id)
54 confNew := CardActivityConfigRaw{} 54 confNew := CardActivityConfigRaw{}
55 sql := fmt.Sprintf("select * from %s where id=%d limit 1", configTableName, configOpen.Id) 55 sql := fmt.Sprintf("select * from %s where id=%d limit 1", configTableName, configOpen.Id)
56 - err := umysql.FindOneSql(constd.MYSQL_MERGECONFIG, sql, &confNew) 56 + err := utmysql.FindOneSql(constd.MYSQL_MERGECONFIG, sql, &confNew)
57 if err != nil { 57 if err != nil {
58 lxalilog.Errors(err, sql, constd.GAME_ID_HT, configOpen.Id) 58 lxalilog.Errors(err, sql, constd.GAME_ID_HT, configOpen.Id)
59 return 59 return
service/ht-cardholder/handle.go
@@ -2,11 +2,8 @@ package ht_cardholder @@ -2,11 +2,8 @@ package ht_cardholder
2 2
3 import ( 3 import (
4 "apigame/dto" 4 "apigame/dto"
5 - "apigame/lx-util/lxalilog"  
6 - "apigame/lx-util/lxtime"  
7 - "apigame/models"  
8 "apigame/service/constd" 5 "apigame/service/constd"
9 - "github.com/astaxie/beego/orm" 6 + "apigame/util/uttype"
10 "strconv" 7 "strconv"
11 ) 8 )
12 9
@@ -54,9 +51,10 @@ func HandleGetNew(req *dto.ReqHtCardHolderGetNew) (code string, rsp dto.RspHtCar @@ -54,9 +51,10 @@ func HandleGetNew(req *dto.ReqHtCardHolderGetNew) (code string, rsp dto.RspHtCar
54 // 读取游戏数据 51 // 读取游戏数据
55 gameData := LoadData(req.UID) 52 gameData := LoadData(req.UID)
56 53
57 - gameData.DetailsData.Cardholder[req.Id] += req.Count 54 + gameData.Details.Cardholder[req.Id] += req.Count
58 SaveData(gameData) 55 SaveData(gameData)
59 56
  57 + // 返回信息
60 rsp.HtCardHolderInfo = gameData.GetInfo() 58 rsp.HtCardHolderInfo = gameData.GetInfo()
61 59
62 return 60 return
@@ -75,100 +73,59 @@ func HandleOpen(req *dto.ReqHtCardHolderOpen) (code string, rsp dto.RspHtCardHol @@ -75,100 +73,59 @@ func HandleOpen(req *dto.ReqHtCardHolderOpen) (code string, rsp dto.RspHtCardHol
75 if code != constd.RECODE_OK { 73 if code != constd.RECODE_OK {
76 return 74 return
77 } 75 }
78 - //// 检查卡包ID  
79 - //confCardholder, okCardholderConfig := Registry.Config.CardholderConfig[strconv.Itoa(req.Id)]  
80 - //if !okCardholderConfig {  
81 - // code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR  
82 - // return  
83 - //}  
84 - //  
85 - //// 读取游戏数据  
86 - //gameData := LoadData(req.UID)  
87 - //  
88 - //// 判断卡包数目  
89 - //countOld, _ := gameData.DetailsData.Cardholder[req.Id]  
90 - //if countOld < 1 {  
91 - // code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDER_NOTENOUGH_ERROR  
92 - // return  
93 - //}  
94 - //  
95 - //// 开始处理抽卡  
96 - //sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID)  
97 - //// 先抽保底卡  
98 - //if confCardholder.GuaranteedStar != "0" {  
99 - // confGuaranteed, hasGuaranteed := FindCardSequenceConfig(confCardholder.GuaranteedStar, sequenceId, cohort)  
100 - // if hasGuaranteed {  
101 - //  
102 - // }  
103 - //} 76 + // 检查卡包ID
  77 + confCardholder, okCardholderConfig := Config.CardholderConfig[strconv.Itoa(req.Id)]
  78 + if !okCardholderConfig {
  79 + code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR
  80 + return
  81 + }
104 82
105 - return  
106 -} 83 + // 读取游戏数据
  84 + gameData := LoadData(req.UID)
107 85
108 -// SaveData 存储数据  
109 -func SaveData(d *models.HtCardHolderData) {  
110 - d.UpdateTime = lxtime.NowUninx()  
111 - d.Encode()  
112 - o := orm.NewOrm()  
113 - o.Using(constd.MYSQL_DEFAULT)  
114 - if _, err := o.InsertOrUpdate(d); err != nil {  
115 - lxalilog.Errors(err, "ht_cardholder SaveData Error", d.Uid) 86 + // 判断卡包数目
  87 + countOld, _ := gameData.Details.Cardholder[req.Id]
  88 + if countOld < 1 {
  89 + code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDER_NOTENOUGH_ERROR
  90 + return
116 } 91 }
117 -}  
118 92
119 -func _LoadData(uid int64) (d *models.HtCardHolderData) {  
120 - d = models.NewHtCardHolderData(uid)  
121 - o := orm.NewOrm()  
122 - o.Using(constd.MYSQL_DEFAULT)  
123 - qs := o.QueryTable(d)  
124 - qs = qs.Filter("uid", uid)  
125 - count, err := qs.Count()  
126 - if count == 0 {  
127 - d.CreateTime = lxtime.NowUninx() 93 + // 开始处理抽卡
  94 + sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID)
  95 + if confCardholder.IsNew != 0 {
  96 + // 如果是新卡包 按顺序查找数目最少的一张卡抽取
  97 + cardId := GetNewCard(gameData)
  98 + // 增加卡牌
  99 + gameData.Details.Cards[cardId] += 1
  100 + rsp.NewCards = append(rsp.NewCards, cardId)
128 } else { 101 } else {
129 - err = qs.One(d)  
130 - if err != nil {  
131 - lxalilog.Errors(err, "ht_cardholder LoadData Error", uid)  
132 - } else {  
133 - d.DetailsData = models.NewHtCardHolderDataDetails()  
134 - d.Decode() 102 + // 正常抽卡
  103 + // 先抽保底卡
  104 + if confCardholder.GuaranteedStar != "0" {
  105 + confGuaranteed, hasGuaranteed := FindCardSequenceConfig(confCardholder.GuaranteedStar, sequenceId, cohort)
  106 + if hasGuaranteed {
  107 + combineId := CombineIdSequenceIdCohort(confCardholder.GuaranteedStar, sequenceId, cohort)
  108 + scale := gameData.Details.CardSequenceScales[combineId]
  109 + cardId := GetOneFromArray(confGuaranteed.CardIdLists, scale)
  110 + cardIdInt := uttype.StringToInt(cardId)
  111 + // 增加刻度
  112 + gameData.Details.CardSequenceScales[combineId] = scale + 1
  113 + // 增加卡牌
  114 + gameData.Details.Cards[cardIdInt] += 1
  115 + rsp.NewCards = append(rsp.NewCards, cardIdInt)
  116 + }
135 } 117 }
136 - }  
137 - return  
138 -}  
139 118
140 -// LoadData 获取数据 外部接口  
141 -func LoadData(uid int64) (d *models.HtCardHolderData) {  
142 - d = _LoadData(uid)  
143 - // 如果当前有上线活动(活动ID不为0),且活动ID和玩家数据不同,说明活动已切换 需更新  
144 - if Config.Id != 0 &&  
145 - Config.Id != d.ActivityId {  
146 - d.ActivityId = Config.Id  
147 - d.DetailsData = models.NewHtCardHolderDataDetails()  
148 - SaveData(d)  
149 } 119 }
150 - return  
151 -}  
152 120
153 -// CheckStatus 判断活动是否开启  
154 -func CheckStatus() string {  
155 - sec := lxtime.NowUninx()  
156 - if Config.Id == 0 {  
157 - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR  
158 - }  
159 - if sec < Config.Raw.StartTime {  
160 - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR  
161 - }  
162 - if sec > Config.Raw.EndTime {  
163 - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR  
164 - }  
165 - return constd.RECODE_OK  
166 -} 121 + // 删除一个卡包
  122 + gameData.Details.Cardholder[req.Id] = countOld - 1
  123 +
  124 + // 存档
  125 + SaveData(gameData)
  126 +
  127 + // 返回信息
  128 + rsp.HtCardHolderInfo = gameData.GetInfo()
167 129
168 -// GetUserSequenceIdAndCohort 获取 用户序列组ID(sequenceId) 用户分组(cohort)  
169 -func GetUserSequenceIdAndCohort(uid int64) (sequenceId, cohort string) {  
170 - // todo 这里后续要对接  
171 - sequenceId = "1"  
172 - cohort = "1"  
173 return 130 return
174 } 131 }
service/ht-cardholder/logic.go 0 → 100644
@@ -0,0 +1,122 @@ @@ -0,0 +1,122 @@
  1 +package ht_cardholder
  2 +
  3 +import (
  4 + "apigame/lx-util/lxalilog"
  5 + "apigame/lx-util/lxtime"
  6 + "apigame/models"
  7 + "apigame/service/constd"
  8 + "apigame/util/uttype"
  9 + "github.com/astaxie/beego/orm"
  10 +)
  11 +
  12 +// SaveData 存储数据
  13 +func SaveData(d *models.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 *models.HtCardHolderData) {
  24 + d = models.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 = models.NewHtCardHolderDataDetails()
  38 + d.Decode()
  39 + }
  40 + }
  41 + return
  42 +}
  43 +
  44 +// LoadData 获取数据 外部接口
  45 +func LoadData(uid int64) (d *models.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 = models.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 +// GetUserSequenceIdAndCohort 获取 用户序列组ID(sequenceId) 用户分组(cohort)
  73 +func GetUserSequenceIdAndCohort(uid int64) (sequenceId, cohort string) {
  74 + // todo 这里后续要对接
  75 + sequenceId = "1"
  76 + cohort = "1"
  77 + return
  78 +}
  79 +
  80 +// GetOneFromArray 从配置的数组里获取一个值 scale=之前刻度
  81 +func GetOneFromArray(array []string, scale int) string {
  82 + length := len(array)
  83 + if length < 1 {
  84 + return ""
  85 + }
  86 + if length == 1 {
  87 + return array[0]
  88 + }
  89 + return array[scale%length]
  90 +}
  91 +
  92 +// GetListFromArray 从配置的数组里获取一组值 scale=之前刻度 count=数目
  93 +func GetListFromArray(array []string, scale, count int) []string {
  94 + list := make([]string, 0)
  95 + if count < 0 {
  96 + return list
  97 + }
  98 + s := scale
  99 + for i := 0; i < count; i++ {
  100 + one := GetOneFromArray(array, s)
  101 + list = append(list, one)
  102 + s++
  103 + }
  104 + return list
  105 +}
  106 +
  107 +// GetNewCard 按顺序查找数目最少的一张卡抽取
  108 +func GetNewCard(gameData *models.HtCardHolderData) int {
  109 + if len(Config.CardConfig) < 1 {
  110 + return 0
  111 + }
  112 + rate := int64(100000000)
  113 + list := make([]int64, 0)
  114 + for id, _ := range Config.CardConfig {
  115 + count, _ := gameData.Details.Cards[id]
  116 + index := int64(count)*rate + int64(id)
  117 + list = append(list, index)
  118 + }
  119 +
  120 + indexMin := uttype.Min(list...)
  121 + return int(indexMin % rate)
  122 +}
util/utjson/json.go 0 → 100644
@@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
  1 +package utjson
  2 +
  3 +import "encoding/json"
  4 +
  5 +func JsonString(o any) string {
  6 + bs, _ := json.Marshal(o)
  7 + return string(bs)
  8 +}
util/utmysql/index.go 0 → 100644
@@ -0,0 +1,55 @@ @@ -0,0 +1,55 @@
  1 +package utmysql
  2 +
  3 +import (
  4 + "github.com/astaxie/beego/orm"
  5 + "strings"
  6 +)
  7 +
  8 +// FindSql 查询数据 根据sql
  9 +func FindSql(dbName string, sql string, result any) (err error) {
  10 + orm := orm.NewOrm()
  11 + orm.Using(dbName)
  12 +
  13 + if _, err = orm.Raw(sql).QueryRows(result); err != nil {
  14 + if strings.Contains(err.Error(), "doesn't exist") {
  15 + err = nil
  16 + return
  17 + }
  18 + return
  19 + }
  20 + return
  21 +}
  22 +
  23 +// FindOneSql 查询一条数据 根据sql
  24 +func FindOneSql(dbName string, sql string, result any) (err error) {
  25 + orm := orm.NewOrm()
  26 + orm.Using(dbName)
  27 +
  28 + if err = orm.Raw(sql).QueryRow(result); err != nil {
  29 + if strings.Contains(err.Error(), "doesn't exist") {
  30 + err = nil
  31 + return
  32 + }
  33 + return
  34 + }
  35 + return
  36 +}
  37 +
  38 +//
  39 +//// Find 查询数据
  40 +//func Find(dbName string, tableName string, result any) (err error) {
  41 +// o := orm.NewOrm()
  42 +// o.Using(dbName)
  43 +//
  44 +// // 也可以直接使用对象作为表名
  45 +// qs := o.QueryTable(tableName)
  46 +//
  47 +// if _, err = qs.All(result); err != nil {
  48 +// if strings.Contains(err.Error(), "doesn't exist") {
  49 +// err = nil
  50 +// return
  51 +// }
  52 +// return
  53 +// }
  54 +// return
  55 +//}
util/uttype/number.go 0 → 100644
@@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
  1 +package uttype
  2 +
  3 +// Int 整型
  4 +type Int interface {
  5 + int | int8 | int16 | int32 | int64 | float32 | float64
  6 +}
  7 +
  8 +// Uint 无符号整型
  9 +type Uint interface {
  10 + uint | uint8 | uint16 | uint32
  11 +}
  12 +
  13 +// Float 浮点
  14 +type Float interface {
  15 + float32 | float64
  16 +}
  17 +
  18 +// Number 数字
  19 +type Number interface {
  20 + Int | Uint | Float
  21 +}
util/uttype/slice.go 0 → 100644
@@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
  1 +package uttype
  2 +
  3 +func Min[T Number](values ...T) T {
  4 + result := values[0]
  5 + for _, v := range values[1:] {
  6 + if v < result {
  7 + result = v
  8 + }
  9 + }
  10 + return result
  11 +}
  12 +
  13 +func Max[T Number](values ...T) T {
  14 + result := values[0]
  15 + for _, v := range values[1:] {
  16 + if v > result {
  17 + result = v
  18 + }
  19 + }
  20 + return result
  21 +}
util/uttype/string.go 0 → 100644
@@ -0,0 +1,84 @@ @@ -0,0 +1,84 @@
  1 +package uttype
  2 +
  3 +import (
  4 + "strconv"
  5 + "strings"
  6 +)
  7 +
  8 +const (
  9 + StrSpe1 = "|"
  10 + StrSpe2 = "_"
  11 +)
  12 +
  13 +func StringToInt(str string) int {
  14 + if value, err := strconv.Atoi(str); err == nil {
  15 + return value
  16 + }
  17 + return 0
  18 +}
  19 +func StringToInt32(str string) int32 {
  20 + return int32(StringToInt(str))
  21 +}
  22 +func StringToInt64(str string) int64 {
  23 + if value, err := strconv.ParseInt(str, 10, 64); err == nil {
  24 + return value
  25 + }
  26 + return 0
  27 +}
  28 +func IntToString(value int) string {
  29 + return strconv.Itoa(value)
  30 +}
  31 +func Int32ToString(value int32) string {
  32 + return IntToString(int(value))
  33 +}
  34 +func Int64ToString(value int64) string {
  35 + return strconv.FormatInt(value, 10)
  36 +}
  37 +
  38 +func ListStringToListInt(list []string) []int {
  39 + result := make([]int, 0)
  40 + for _, v := range list {
  41 + result = append(result, StringToInt(v))
  42 + }
  43 + return result
  44 +}
  45 +func ListStringToListInt64(list []string) []int64 {
  46 + result := make([]int64, 0)
  47 + for _, v := range list {
  48 + result = append(result, StringToInt64(v))
  49 + }
  50 + return result
  51 +}
  52 +func StringToListString(str string) []string {
  53 + return strings.Split(str, StrSpe1)
  54 +}
  55 +func StringToListInt(str string) []int {
  56 + return ListStringToListInt(strings.Split(str, StrSpe1))
  57 +}
  58 +func StringToListListString(str string) [][]string {
  59 + result := make([][]string, 0)
  60 + list1 := strings.Split(str, StrSpe1)
  61 + for _, v := range list1 {
  62 + list2 := strings.Split(v, StrSpe2)
  63 + result = append(result, list2)
  64 + }
  65 + return result
  66 +}
  67 +func StringToListListInt(str string) [][]int {
  68 + result := make([][]int, 0)
  69 + list1 := strings.Split(str, StrSpe1)
  70 + for _, v := range list1 {
  71 + list2 := strings.Split(v, StrSpe2)
  72 + result = append(result, ListStringToListInt(list2))
  73 + }
  74 + return result
  75 +}
  76 +func StringToListListInt64(str string) [][]int64 {
  77 + result := make([][]int64, 0)
  78 + list1 := strings.Split(str, StrSpe1)
  79 + for _, v := range list1 {
  80 + list2 := strings.Split(v, StrSpe2)
  81 + result = append(result, ListStringToListInt64(list2))
  82 + }
  83 + return result
  84 +}