补充逻辑

dev_aagame_provider
zhora 2 months ago
parent b5a3e29bf1
commit 6fedc45331
  1. 2
      call/provider.go
  2. 50
      call/rank.go
  3. 7
      config/config.go
  4. 17
      modules/backend/bdb/exec.go
  5. 4
      modules/backend/handler/examine/examine.go
  6. 2
      modules/backend/handler/statistics/withdrawListData.go
  7. 88
      modules/backend/handler/tgrobot/tgrobot.go
  8. 3
      modules/backend/middleware/token.go
  9. 17
      modules/backend/models/db.go
  10. 2
      modules/backend/module.go
  11. 1
      modules/backend/routers/routers.go
  12. 12
      modules/backend/routers/routers_tgrobot.go
  13. 49
      modules/backend/values/gameuser.go
  14. 26
      modules/backend/values/gm.go
  15. 1
      modules/backend/values/statistics.go
  16. 20
      modules/customer/handler/guser/getGameUserInfo.go
  17. 2
      modules/pay/propay/base.go
  18. 1
      modules/pay/timer.go
  19. 9
      modules/pay/tkpay/base.go
  20. 7
      modules/pay/virgopay/base.go
  21. 46
      modules/web/providers/base/base.go
  22. 11
      modules/web/providers/jin/handler.go
  23. 23
      util/struct.go

@ -87,7 +87,7 @@ func GetConfigProviderGameListByID(provider, gameID int) *common.ConfigProviderG
}
func GetProviderGameRtp(uid int) int {
return 90
return 85
}
func GetProviderUserName(name string) string {

@ -82,6 +82,21 @@ func RankHandler() {
awardAt time.Time
)
for rankCycle := range rank.RankCycleMap {
// 获取上一期排行榜时间
_, lastJackpotKey := getRankJackpotPreKey(rank.RankType, rankCycle)
lastJackpot := RankJackpotPreGet(rank.RankType, rankCycle)
lastJackpotKeyLess := lastJackpotKey + "|less"
if lastJackpot > 0 && !db.Redis().Exist(lastJackpotKeyLess) { // 上一期奖池不为空,且上一期奖池未发奖,直接发奖
log.Debug("rankAward replenish!!! %s,%d", lastJackpotKey, lastJackpot)
go func() {
rankAward(&rankTicker{
rankType: rank.RankType,
rankCycle: rankCycle,
activityId: rank.ID,
})
}()
}
switch rankCycle {
case "1":
awardAt = util.GetZeroTime(now.AddDate(0, 0, 1)).Add(30 * time.Minute)
@ -114,7 +129,20 @@ func RankHandler() {
for {
select {
case <-ticker.timer.C:
rankAward(ticker)
go func() {
rankAward(ticker)
}()
var nextAwardAt time.Time
switch ticker.rankCycle {
case "1":
nextAwardAt = util.GetZeroTime(time.Now().AddDate(0, 0, 1)).Add(30 * time.Minute)
case "2":
nextAwardAt = util.GetWeekZeroTime(time.Now()).AddDate(0, 0, 7).Add(45 * time.Minute)
case "3":
nextAwardAt = util.GetFirstDateOfMonth(time.Now()).AddDate(0, 1, 0).Add(60 * time.Minute)
}
log.Debug("rankAward, %d %s next award at:%s", ticker.rankType, ticker.rankCycle, nextAwardAt.Format(time.DateTime))
ticker.timer.Reset(nextAwardAt.Sub(time.Now()))
case <-ticker.ctx.Done():
ticker.timer.Stop()
return
@ -243,9 +271,16 @@ func rankAward(ticker *rankTicker) {
if lessJackpot < 0 {
lessJackpot = 0
}
err = db.Redis().GetRedis().Set(context.Background(), preJackpotLessKey, lessJackpot, 0).Err()
if err != nil {
log.Error("share rankAward, %s set less-jackpot err, %s", preJackpotLessKey, err.Error())
if !db.Redis().Exist(preJackpotLessKey) {
err = db.Redis().GetRedis().Set(context.Background(), preJackpotLessKey, lessJackpot, 0).Err()
if err != nil {
log.Error("share rankAward, %s set less-jackpot err, %s", preJackpotLessKey, err.Error())
}
_, _, _, jackpotKeyNow := getRankJackpotKey(rankConfig.RankType, ticker.rankCycle)
_, err = db.Redis().Incr(jackpotKeyNow, lessJackpot)
if err != nil {
log.Error("rankAward, %s:%s incr less-jackpot err, %s", jackpotKey, jackpotKeyNow, err.Error())
}
}
var expire int64
switch ticker.rankCycle {
@ -257,13 +292,6 @@ func rankAward(ticker *rankTicker) {
expire = 24 * 60 * 60 * 30 * 2
}
db.Redis().Expire(preJackpotLessKey, time.Duration(expire)*time.Second)
if lessJackpot > 0 {
_, _, _, jackpotKeyNow := getRankJackpotKey(rankConfig.RankType, ticker.rankCycle)
_, err = db.Redis().Incr(jackpotKeyNow, lessJackpot)
if err != nil {
log.Error("rankAward, %s:%s incr less-jackpot err, %s", jackpotKey, jackpotKeyNow, err.Error())
}
}
}
// UpdateRankValue 更新玩家数值(mode:1打码,2充值)

@ -146,9 +146,10 @@ type Configure struct {
TLS bool
}
Backend struct {
Addr string
DB string
Oss OssParams
Addr string
DB string
Oss OssParams
AdminToken string
}
Rummy struct {
SettleTime int

@ -2,6 +2,9 @@ package bdb
import (
"encoding/json"
"server/common"
"server/config"
"server/db"
"server/modules/backend/values"
"github.com/liangdas/mqant/log"
@ -19,3 +22,17 @@ func GetPowerByRole(role int) map[int][]int {
}
return ret
}
func InitAdminToken() {
if config.GetConfig().Backend.AdminToken == "" {
return
}
one := new(values.User)
key := common.GetBackendTokenKey(config.GetConfig().Backend.AdminToken)
if err := db.Redis().GetJsonData(key, one); err != nil || one.Account == "" {
one.Account = "admin"
one.Name = "admin"
one.Role = values.UserRoleAdmin
db.Redis().SetJsonData(key, one)
}
}

@ -28,7 +28,7 @@ func WithdrawList(c *gin.Context) {
return
}
table1 := `(SELECT id,uid,channel_id,pay_channel,orderid,apipayid,payaccount,amount,create_time,callback_time,status,operator from withdraw_order %s)a`
table1 := `(SELECT id,uid,channel_id,pay_channel,orderid,fail_reason,apipayid,payaccount,amount,create_time,callback_time,status,operator from withdraw_order %s)a`
table2 := `(SELECT id,platform,mobile,tag from users %s)b`
table3 := `(SELECT uid,inr from player_currency)c`
table4 := `(SELECT uid,total_recharge,total_recharge_count,total_withdraw,total_withdraw_count FROM recharge_info)d`
@ -75,7 +75,7 @@ func WithdrawList(c *gin.Context) {
}
sqlCount := " SELECT COUNT(*) AS count from"
sqlList := `SELECT a.id,a.uid,a.channel_id,a.pay_channel,a.orderid as OrderID,a.apipayid as APIPayID,a.payaccount,a.amount,a.create_time,a.callback_time,
sqlList := `SELECT a.id,a.uid,a.channel_id,a.pay_channel,a.orderid as OrderID,a.fail_reason as FailReason,a.apipayid as APIPayID,a.payaccount,a.amount,a.create_time,a.callback_time,
a.status,a.operator,b.platform,b.mobile,b.tag,c.inr,d.total_recharge,d.total_recharge_count,d.total_withdraw,d.total_withdraw_count from `
querySql := fmt.Sprintf(table1, table1Condition) + " inner join " + fmt.Sprintf(table2, table2Condition) + " on a.uid = b.id inner join " +
table3 + " on a.uid = c.uid inner join " + table4 + " on a.uid = d.uid "

@ -84,7 +84,7 @@ func WithdrawListData(c *gin.Context) {
// 退出成功金额
func getWithDrawAmountBySql(s, e int64, event int) int64 {
var Amount int64
amountTotal := `SELECT SUM(amount) as RechargeAmount FROM recharge_order WHERE event = %v AND status = %v AND u.create_time >= %d AND u.create_time < %d`
amountTotal := `SELECT SUM(amount) as RechargeAmount FROM withdraw_order WHERE event = %v AND status = %v AND u.create_time >= %d AND u.create_time < %d`
err := db.Mysql().QueryBySql(fmt.Sprintf(amountTotal, common.CurrencyEventWithDraw, event, s, e), &Amount)
if err != nil {
log.Error("查询用户总退出失败, error : [%s]", err.Error())

@ -0,0 +1,88 @@
package handler
import (
"fmt"
"server/common"
"server/db"
"server/modules/backend/app"
"server/modules/backend/values"
"time"
"github.com/gin-gonic/gin"
)
type GetPayPerReq struct {
Second int // 秒
}
type GetPayPerResp struct {
Per int64
SuccessCount int64
TotalCount int64
}
// 查询支付成功率
func GetPayPer(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(GetPayPerReq)
a.S(req)
if req.Second <= 0 {
a.Code = values.CodeParam
return
}
resp := &GetPayPerResp{}
a.Data = resp
su := time.Now().Unix() - int64(req.Second)
count := getPayCount(0, su, 0)
successCount := getPaySuccessCount(0, su, 0)
if count > 0 {
resp.Per = successCount * 100 / count
}
resp.SuccessCount = successCount
resp.TotalCount = count
}
// 获取付费总单数
func getPayCount(channel int, su, eu int64) (count int64) {
channelSql := ""
if channel > 0 {
channelSql = fmt.Sprintf(` and channel_id = %d `, channel)
}
var start, end string
if su > 0 {
suStr := time.Unix(su, 0)
start = fmt.Sprintf(" and created_at >= '%s'", suStr.Format("2006-01-02 15:04:05"))
}
if eu > 0 {
euStr := time.Unix(eu, 0)
end = fmt.Sprintf(" and created_at < '%s'", euStr.Format("2006-01-02 15:04:05"))
}
sql := fmt.Sprintf(`SELECT ifNull(count(*),0) as count from recharge_order WHERE event = %d %s %s %s`,
common.CurrencyEventReCharge, start, end, channelSql)
db.Mysql().QueryCountBySql(sql, &count)
return
}
// 获取付费成功总单数
func getPaySuccessCount(channel int, su, eu int64) (count int64) {
channelSql := ""
if channel > 0 {
channelSql = fmt.Sprintf(` and channel_id = %d `, channel)
}
var start, end string
if su > 0 {
suStr := time.Unix(su, 0)
start = fmt.Sprintf(" and created_at >= '%s'", suStr.Format("2006-01-02 15:04:05"))
}
if eu > 0 {
euStr := time.Unix(eu, 0)
end = fmt.Sprintf(" and created_at < '%s'", euStr.Format("2006-01-02 15:04:05"))
}
sql := fmt.Sprintf(`SELECT ifNull(count(*),0) as count from recharge_order WHERE event = %d and status = %d %s %s %s`,
common.CurrencyEventReCharge, common.StatusROrderPay, start, end, channelSql)
db.Mysql().QueryCountBySql(sql, &count)
return
}

@ -2,6 +2,7 @@ package middleware
import (
"server/common"
"server/config"
"server/db"
"server/modules/backend/app"
"server/modules/backend/values"
@ -59,7 +60,7 @@ func TokenMiddleWare() gin.HandlerFunc {
c.Next()
// 刷新token过期时间
defer func() {
if token == values.AdminToken {
if token == config.GetConfig().Backend.AdminToken {
return
}
err := db.Redis().Expire(common.GetBackendTokenKey(token), values.RedisTokenEx)

@ -1425,14 +1425,14 @@ func GetTopGames(su, eu int64, opt, num int, channel ...*int) []*values.OneGameD
sql := ""
switch opt {
case 1:
sql = fmt.Sprintf(`SELECT provider as Provider,game_id as GameID,sum(amount) as Amount from provider_bet_record WHERE time>=%d and time <%d and (type = %d or type = %d or type = %d)`,
sql = fmt.Sprintf(`SELECT provider as Provider,game_id as GameID, game_name as GameName,sum(amount) as Amount from provider_bet_record WHERE time>=%d and time <%d and (type = %d or type = %d or type = %d)`,
su, eu, common.SessionTypeBet, common.SessionTypeSettle, common.SessionTypeBuyIn)
sql += PackChannels(channel...) + " group by game_id order by amount desc"
case 2:
sql = fmt.Sprintf(`SELECT provider as Provider,game_id as GameID,sum(amount - settle) as Amount from provider_bet_record WHERE time>=%d and time <%d`, su, eu)
sql = fmt.Sprintf(`SELECT provider as Provider,game_id as GameID,game_name as GameName,sum(amount - settle) as Amount from provider_bet_record WHERE time>=%d and time <%d`, su, eu)
sql += PackChannels(channel...) + " group by game_id order by amount desc"
case 3:
sql = fmt.Sprintf(`SELECT provider as Provider,game_id as GameID,sum(settle - amount) as Amount from provider_bet_record WHERE time>=%d and time <%d`, su, eu)
sql = fmt.Sprintf(`SELECT provider as Provider,game_id as GameID,game_name as GameName,sum(settle - amount) as Amount from provider_bet_record WHERE time>=%d and time <%d`, su, eu)
sql += PackChannels(channel...) + " group by game_id order by amount desc"
default:
return nil
@ -1444,9 +1444,14 @@ func GetTopGames(su, eu int64, opt, num int, channel ...*int) []*values.OneGameD
index := -1
for i, v := range ret {
game := call.GetConfigGameListByID(v.Provider, v.GameID)
if game != nil {
v.Name = game.Name
var gameCfg *common.ConfigGameList
if v.Provider == common.ProviderJin {
gameCfg = call.GetConfigGameListByCode(v.Provider, v.GameName)
} else {
gameCfg = call.GetConfigGameListByID(v.Provider, v.GameID)
}
if gameCfg != nil {
v.Name = gameCfg.Name
}
// 去掉amount<0的部分
if opt > 1 {

@ -52,6 +52,8 @@ func (b *Backend) OnInit(app module.App, settings *conf.ModuleSettings) {
// 自动初始化后台数据库
bdb.MigrateDB()
// 初始化常驻admintoken
bdb.InitAdminToken()
// 自动初始化游戏服数据库
MigrateDB()

@ -46,5 +46,6 @@ func SetUpRouter() *gin.Engine {
output(r)
firstPage(r)
notice(r)
tgrobot(r)
return r
}

@ -0,0 +1,12 @@
// 账号相关的接口
package routers
import (
handler "server/modules/backend/handler/tgrobot"
"github.com/gin-gonic/gin"
)
func tgrobot(e *gin.Engine) {
e.POST("/tgrobot/getPayPer", handler.GetPayPer)
}

@ -140,16 +140,47 @@ type GetGameUserInfoResp struct {
Rtp int
}
type GetGameUserInfoV1Resp struct {
UID int
Nick string
Channel int
Phone string
OpenID string
CashBrl int64
WithdrawalBrl int64
CashUsdt int64
WithdrawalUsdt int64
RechargeBrl int64
WithdrawBrl int64
RechargeUsdt int64
WithdrawUsdt int64
Online bool
Status int
Birth int64
IP string
LastLogin int64
Tag string
UserGameData []UserGameInfo
OutputData map[string]string
Gpsadid string
SubAccount []int
Rtp int
}
type UserGameInfo struct {
// GameId int // 游戏id
GameName string
GameCount int64 // 游戏局数
// WinPer string // 胜率
Profit int64 // 利润
// WinCount int64 // 胜利局数
// WinProfit int64 // 胜利的金钱总额
// LoseCount int64 // 输的局数
// LoseProfit int64 // 失败的金钱总额
GameId int `json:"GameId"`
WinPer string `json:"WinPer"`
WinCount int `json:"WinCount"`
WinProfit int `json:"WinProfit"`
LoseCount int `json:"LoseCount"`
LoseProfit int `json:"LoseProfit"`
Name string `json:"Name"`
Provider int `json:"Provider"`
GameName string
GameCount int64 // 游戏局数
Profit int64 // 利润
ProviderName string
}
// GetGameUserAllBalanceReq 获取游戏玩家所有流水详情

@ -236,6 +236,8 @@ func CheckQueryControl(data interface{}, req *GMConfigCommonListReq) (string, st
case *common.ConfigGameList:
if req != nil && req.Condition != nil {
sql := ""
providerSql := ""
tagIdsSql := ""
gameProviderList, ok := req.Condition["GameProvider"]
if ok {
var gameProviderValue string
@ -245,8 +247,30 @@ func CheckQueryControl(data interface{}, req *GMConfigCommonListReq) (string, st
}
gameProviderValue += fmt.Sprintf("%d", util.ToInt(v))
}
sql = fmt.Sprintf(" `game_provider` in (%s)", gameProviderValue)
providerSql = fmt.Sprintf(" `game_provider` in (%s)", gameProviderValue)
}
tagIds, ok := req.Condition["TagIds"]
if ok {
for _, v := range tagIds.([]interface{}) {
if tagIdsSql != "" {
tagIdsSql += " or "
}
tagIdsSql += fmt.Sprintf(" JSON_CONTAINS(`tag_ids`, '%d') ", util.ToInt(v))
}
tagIdsSql = fmt.Sprintf(" `tag_ids` != '' and ( %s )", tagIdsSql)
}
if providerSql != "" {
sql += providerSql
}
if tagIdsSql != "" {
if sql != "" {
sql += fmt.Sprintf(" and ( %s ) ", tagIdsSql)
} else {
sql = tagIdsSql
}
}
return sql, ""
}
}

@ -280,6 +280,7 @@ type RealBetData struct {
type OneGameData struct {
GameID int
GameName string
Name string
Provider int
Amount int64

@ -100,7 +100,7 @@ func GetGameUserInfo(c *gin.Context) {
// }
//black := &common.ConfigMillionBlack{UID: uid}
//db.Mysql().Get(black)
resp := values.GetGameUserInfoResp{
resp := values.GetGameUserInfoV1Resp{
UID: user.Id,
Nick: user.Nick,
//Recharge: info.TotalCharge,
@ -128,7 +128,7 @@ func GetGameUserInfo(c *gin.Context) {
//PointControlValue: uutil.FormatFloat(float64(pointControl.CurControlNum)/100, 2),
//PointControlTargetValue: uutil.FormatFloat(float64(pointControl.ControlNum), 2),
//PointControlPer: pointControl.ControlPer,
UserGameData: GetUserGameInfo(user.Id),
UserGameData: ChangeUserGameInfo(GetUserGameInfo(user.Id)),
//Gpsadid: user.DeviceId,
//Black: black,
}
@ -181,3 +181,19 @@ func GetUserGameInfo(uid int) map[string][]values.UserGameInfo {
ret["总计"] = []values.UserGameInfo{{GameCount: totalCount, Profit: totalProfit}}
return ret
}
// 获取用户游戏信息
func ChangeUserGameInfo(gameInfo map[string][]values.UserGameInfo) []values.UserGameInfo {
var result []values.UserGameInfo
for k, games := range gameInfo {
for _, v := range games {
result = append(result, values.UserGameInfo{
GameName: v.GameName,
GameCount: v.GameCount,
Profit: v.Profit,
ProviderName: k,
})
}
}
return result
}

@ -77,7 +77,7 @@ func (s *Sub) GetResp() (proto.Message, error) {
} else if s.Base.Opt == base.OPTWithdraw {
resp := s.Base.Resp.(*WithdrawResp)
if s.Base.Status == 0 && resp.Code != 0 {
return nil, errors.New("withdraw fail")
return nil, fmt.Errorf("withdraw fail, %s", resp.Msg)
}
return &pb.InnerWithdrawResp{APIOrderID: resp.Data.TransferID, Channel: uint32(values.ProPay), Status: uint32(s.Base.Status)}, nil
} else if s.Base.Opt == base.OPTQueryWithdraw {

@ -294,6 +294,7 @@ func TryWithdraw(or *common.WithdrawOrder) {
log.Debug("order:%v,err:%v", req.OrderID, err)
if err != nil {
log.Error("order:%+v,err:%v", or, err)
or.FailReason = err.Error()
call.ReturnBackWithdraw(or, common.StatusROrderPay, common.StatusROrderFail, int(req.Channel))
return
}

@ -4,7 +4,6 @@ import (
"errors"
"fmt"
"net/http"
"server/common"
"server/modules/pay/base"
"server/modules/pay/values"
"server/pb"
@ -76,7 +75,7 @@ func (s *Sub) GetResp() (proto.Message, error) {
} else if s.Base.Opt == base.OPTWithdraw {
resp := s.Base.Resp.(*WithdrawResp)
if s.Base.Status == 0 && resp.Code != 200 {
return nil, errors.New("withdraw fail")
return nil, fmt.Errorf("withdraw fail, %s", resp.Message)
}
return &pb.InnerWithdrawResp{APIOrderID: fmt.Sprintf("%v", resp.Data.ID), Channel: uint32(values.TKPay), Status: uint32(s.Base.Status)}, nil
} else if s.Base.Opt == base.OPTQueryWithdraw {
@ -140,9 +139,9 @@ func (s *Sub) PackPayReq() interface{} {
func (s *Sub) PackWithdrawReq() interface{} {
r := s.Base.WithdrawReq
if fmt.Sprintf("%d", r.PayType) != common.WithdrawTypeBank {
return nil
}
//if fmt.Sprintf("%d", r.PayType) != common.WithdrawTypeBank {
// return nil
//}
send := &WithdrawReq{
MerchantID: mid,
OrderID: r.OrderID,

@ -4,7 +4,6 @@ import (
"errors"
"fmt"
"net/http"
"server/common"
"server/config"
"server/modules/pay/base"
"server/pb"
@ -142,9 +141,9 @@ func (s *Sub) PackPayReq() interface{} {
func (s *Sub) PackWithdrawReq() interface{} {
r := s.Base.WithdrawReq
if fmt.Sprintf("%d", r.PayType) != common.WithdrawTypeBank {
return nil
}
//if fmt.Sprintf("%d", r.PayType) != common.WithdrawTypeBank {
// return nil
//}
send := &WithdrawReq{
MchId: config.GetConfig().Pay.VirgoPay.MID,
MOrderId: r.OrderID,

@ -328,7 +328,7 @@ func SessionBet(req *BetReq) (resp BetResp) {
UUID: req.BetID,
}
db.Mysql().Get(record)
if record.ID > 0 {
if record.ID > 0 && req.SessionType == SessionTypeBet {
resp.MyUUID = record.MyUUID
resp.Code = CodeAccepted
return
@ -341,27 +341,29 @@ func SessionBet(req *BetReq) (resp BetResp) {
}
settle := req.SettleAmount
uuid := call.SnowNode().Generate().Int64()
if err := db.Mysql().Create(&common.ProviderBetRecord{
UID: uid,
Provider: provider.ProviderID,
Currency: req.CurrencyType.GetCurrencyName(),
CurrencyType: req.CurrencyType,
GameID: req.GameID,
GameName: req.GameName,
UUID: req.BetID,
MyUUID: uuid,
Type: req.SessionType,
Time: req.Time,
Amount: betAmount,
Settle: settle,
SessionID: req.SessionID,
TurnOver: req.TurnOver,
Preserve: req.Preserve,
Esi: SessionSuccess,
}); err != nil {
log.Error("err:%v", err)
resp.Code = CodeInnerError
return
if req.SessionType == SessionTypeBet {
if err := db.Mysql().Create(&common.ProviderBetRecord{
UID: uid,
Provider: provider.ProviderID,
Currency: req.CurrencyType.GetCurrencyName(),
CurrencyType: req.CurrencyType,
GameID: req.GameID,
GameName: req.GameName,
UUID: req.BetID,
MyUUID: uuid,
Type: req.SessionType,
Time: req.Time,
Amount: betAmount,
Settle: settle,
SessionID: req.SessionID,
TurnOver: req.TurnOver,
Preserve: req.Preserve,
Esi: SessionSuccess,
}); err != nil {
log.Error("err:%v", err)
resp.Code = CodeInnerError
return
}
}
if betAmount == 0 && req.SessionType == SessionTypeBet {
resp.Balance = amount

@ -71,7 +71,13 @@ func GameBet(c *gin.Context) {
resp.Code = CodeRequestInvalidParams
return
}
log.Debug("GameBet:%+v", req)
log.Debug("jin GameBet:%+v", req)
/*
// jin GameBet:&{Reference:581622397157433172 OperatorID:695865 Accounts:101239 Token:cNFFLVZCHLNGZGJMI GameID:24000
RoomID:24001 WinAmount:0 BetAmount:10 RecordType:0 BetReferenceID:581622397157433172 RoundID:6755680920055585941 IsEndRound:0}
// jin GameBet:&{Reference:581622397157433173 OperatorID:695865 Accounts:101239 Token:cNFFLVZCHLNGZGJMI GameID:24000
RoomID:24001 WinAmount:14.3 BetAmount:0 RecordType:1 BetReferenceID:581622397157433172 RoundID:6755680920055585941 IsEndRound:1}
*/
if a.ShouldRoute(req, "Token", common.ProviderAPITypePostform) {
return
}
@ -97,8 +103,9 @@ func GameBet(c *gin.Context) {
BetID: req.RoundID,
SessionID: req.BetReferenceID,
Time: now,
CurrencyType: common.CurrencyINR,
}
if req.IsEndRound == 1 {
if req.IsEndRound == 1 { // 结算回合
betReq.SessionType = base.SessionTypeSettle
}
betResp := base.SessionBet(betReq)

@ -0,0 +1,23 @@
package util
import (
"reflect"
)
func GetStructFieldByJsonTag(obj interface{}, tag string) (field reflect.StructField, ok bool) {
t := reflect.TypeOf(obj)
v := reflect.ValueOf(obj)
if v.Kind() == reflect.Ptr {
t = t.Elem()
}
for i := 0; i < t.NumField(); i++ {
field = t.Field(i)
tagName := field.Tag.Get("json")
if tagName == tag {
ok = true
return
}
}
return
}
Loading…
Cancel
Save