You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
511 lines
12 KiB
511 lines
12 KiB
|
1 year ago
|
package awc
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/json"
|
||
|
|
"fmt"
|
||
|
|
"server/call"
|
||
|
|
"server/common"
|
||
|
|
"server/db"
|
||
|
|
"server/modules/web/app"
|
||
|
|
"server/modules/web/providers/base"
|
||
|
|
"server/natsClient"
|
||
|
|
"server/pb"
|
||
|
|
"server/util"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"github.com/gin-gonic/gin"
|
||
|
|
"github.com/liangdas/mqant/log"
|
||
|
|
)
|
||
|
|
|
||
|
|
func AWC(e *gin.RouterGroup) {
|
||
|
|
e.POST("", Callback)
|
||
|
|
}
|
||
|
|
|
||
|
|
func Callback(c *gin.Context) {
|
||
|
|
a := app.NewApp(c)
|
||
|
|
defer func() {
|
||
|
|
a.ResponseB()
|
||
|
|
}()
|
||
|
|
key := c.PostForm("key")
|
||
|
|
message := c.PostForm("message")
|
||
|
|
log.Debug("awc callback key:%v,message:%v", key, message)
|
||
|
|
if key != APIKey {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
// message, err := strconv.Unquote(message)
|
||
|
|
// if err != nil {
|
||
|
|
// log.Error("err:%v", err)
|
||
|
|
// }
|
||
|
|
a.TmpData = message
|
||
|
|
|
||
|
|
act := new(Action)
|
||
|
|
json.Unmarshal([]byte(message), act)
|
||
|
|
|
||
|
|
switch act.Action {
|
||
|
|
case "getBalance":
|
||
|
|
uid, ct := base.GetUIDAndCurrency(act.UserId)
|
||
|
|
if uid <= 0 || !ct.IsValid() {
|
||
|
|
a.RetData = &CommonResp{Status: "1002"}
|
||
|
|
return
|
||
|
|
}
|
||
|
|
a.UID = uid
|
||
|
|
a.TmpData = ct
|
||
|
|
getBalance(a)
|
||
|
|
case "bet":
|
||
|
|
placeBet(a)
|
||
|
|
case "cancelBet":
|
||
|
|
cancelBet(a)
|
||
|
|
case "voidBet":
|
||
|
|
cancelBet(a)
|
||
|
|
case "settle":
|
||
|
|
settle(a)
|
||
|
|
case "voidSettle":
|
||
|
|
viodSettle(a)
|
||
|
|
case "give":
|
||
|
|
give(a)
|
||
|
|
case "resettle":
|
||
|
|
resettle(a)
|
||
|
|
default:
|
||
|
|
a.RetData = &CommonResp{Status: "1036"}
|
||
|
|
return
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func getBalance(a *app.Gin) {
|
||
|
|
resp := &GetBalanceResp{}
|
||
|
|
a.RetData = resp
|
||
|
|
// currency, err := db.Redis().GetInt(common.GetRedisKeyGameCurrency(a.UID))
|
||
|
|
// if err != nil {
|
||
|
|
// log.Error("err:%v", err)
|
||
|
|
// resp.Status = "1036"
|
||
|
|
// return
|
||
|
|
// }
|
||
|
|
resp.Status = "0000"
|
||
|
|
resp.Balance = call.GetUserCurrencyFloat(a.UID, a.TmpData.(common.CurrencyType), 4)
|
||
|
|
resp.UserId = fmt.Sprintf("%v", a.UID)
|
||
|
|
resp.BalanceTs = time.Now().Format(TimeFormatString)
|
||
|
|
}
|
||
|
|
|
||
|
|
func placeBet(a *app.Gin) {
|
||
|
|
req := new(PlaceBetReq)
|
||
|
|
message := a.TmpData.(string)
|
||
|
|
resp := &PlaceBetResp{}
|
||
|
|
a.RetData = resp
|
||
|
|
err := json.Unmarshal([]byte(message), req)
|
||
|
|
if err != nil {
|
||
|
|
log.Error("err:%v", err)
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
// log.Debug("placeBet:%+v", req)
|
||
|
|
now := time.Now().Unix()
|
||
|
|
var totalBet int64
|
||
|
|
var uid int
|
||
|
|
var ct common.CurrencyType
|
||
|
|
myUUID := call.SnowNode().Generate().Int64()
|
||
|
|
for _, v := range req.Txns {
|
||
|
|
uid = util.GetIntFromString(v.UserId)
|
||
|
|
if uid <= 0 {
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
ctName := v.Currency
|
||
|
|
if ctName == "USD" {
|
||
|
|
ctName = "USDT"
|
||
|
|
}
|
||
|
|
ct = common.GetCurrencyID(ctName)
|
||
|
|
if !ct.IsValid() {
|
||
|
|
log.Debug("unknown ct:%v", ct)
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
gameID := 0
|
||
|
|
var provider *common.ConfigGameProvider
|
||
|
|
if v.Platform == "SEXYBCRT" {
|
||
|
|
fmt.Sscanf(v.GameCode, "MX-LIVE-%d", &gameID)
|
||
|
|
provider = call.GetConfigGameProvider(common.ProviderSexy)
|
||
|
|
}
|
||
|
|
var betTime int64
|
||
|
|
t, err := time.Parse(TimeFormatString, v.BetTime)
|
||
|
|
if err != nil {
|
||
|
|
betTime = now
|
||
|
|
} else {
|
||
|
|
betTime = t.Unix()
|
||
|
|
}
|
||
|
|
betAmount := common.CashFloat64ToInt64(v.BetAmount)
|
||
|
|
record := &common.ProviderBetRecord{
|
||
|
|
UID: uid,
|
||
|
|
Provider: provider.ProviderID,
|
||
|
|
UUID: v.PlatformTxId,
|
||
|
|
}
|
||
|
|
db.Mysql().Get(record)
|
||
|
|
if record.ID > 0 {
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
if err := db.Mysql().Create(&common.ProviderBetRecord{
|
||
|
|
UID: uid,
|
||
|
|
Provider: provider.ProviderID,
|
||
|
|
Currency: ct.GetCurrencyName(),
|
||
|
|
CurrencyType: ct,
|
||
|
|
GameID: gameID,
|
||
|
|
UUID: v.PlatformTxId,
|
||
|
|
MyUUID: myUUID,
|
||
|
|
Type: common.SessionTypeBet,
|
||
|
|
Time: now,
|
||
|
|
ProviderTime: betTime,
|
||
|
|
Amount: betAmount,
|
||
|
|
SessionID: v.RoundId,
|
||
|
|
// TurnOver: req.TurnOver,
|
||
|
|
// Preserve: req.Preserve,
|
||
|
|
Esi: base.SessionSuccess,
|
||
|
|
}); err != nil {
|
||
|
|
log.Error("err:%v", err)
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
totalBet += betAmount
|
||
|
|
// log.Debug("betResp:%+v", betResp)
|
||
|
|
}
|
||
|
|
pro := call.MineCurrencyProReal(
|
||
|
|
&common.UpdateCurrency{
|
||
|
|
CurrencyBalance: &common.CurrencyBalance{
|
||
|
|
UID: uid,
|
||
|
|
Type: ct,
|
||
|
|
Event: common.CurrencyEventGameBet,
|
||
|
|
Value: -totalBet,
|
||
|
|
Exs1: fmt.Sprintf("%d", myUUID),
|
||
|
|
// Exs2: req.BetID,
|
||
|
|
// Exs3: req.SessionID,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
)
|
||
|
|
if pro.Err != nil {
|
||
|
|
log.Error("err:%v", pro.Err)
|
||
|
|
resp.Status = "1036"
|
||
|
|
if pro.Err == call.ErrNotEnoughBalance {
|
||
|
|
resp.Status = "1018"
|
||
|
|
}
|
||
|
|
return
|
||
|
|
}
|
||
|
|
resp.Status = "0000"
|
||
|
|
resp.Balance = util.Decimal(float64(pro.Balance)/common.DecimalDigits, 4)
|
||
|
|
resp.BalanceTs = time.Now().Format(TimeFormatString)
|
||
|
|
}
|
||
|
|
|
||
|
|
func cancelBet(a *app.Gin) {
|
||
|
|
req := new(CancelBetReq)
|
||
|
|
message := a.TmpData.(string)
|
||
|
|
resp := &CancelBetResp{}
|
||
|
|
a.RetData = resp
|
||
|
|
err := json.Unmarshal([]byte(message), req)
|
||
|
|
if err != nil {
|
||
|
|
log.Error("err:%v", err)
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
now := time.Now().Unix()
|
||
|
|
var betResp base.BetResp
|
||
|
|
for _, v := range req.Txns {
|
||
|
|
uid := util.GetIntFromString(v.UserId)
|
||
|
|
if uid <= 0 {
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
gameID := 0
|
||
|
|
var provider *common.ConfigGameProvider
|
||
|
|
if v.Platform == "SEXYBCRT" {
|
||
|
|
fmt.Sscanf(v.GameCode, "MX-LIVE-%d", &gameID)
|
||
|
|
provider = call.GetConfigGameProvider(common.ProviderSexy)
|
||
|
|
}
|
||
|
|
var betTime int64
|
||
|
|
t, err := time.Parse(TimeFormatString, v.BetTime)
|
||
|
|
if err != nil {
|
||
|
|
betTime = now
|
||
|
|
} else {
|
||
|
|
betTime = t.Unix()
|
||
|
|
}
|
||
|
|
betResp = base.CancelSessionBet(&base.BetReq{
|
||
|
|
UID: uid,
|
||
|
|
SessionType: common.SessionTypeBet,
|
||
|
|
GameID: gameID,
|
||
|
|
Provider: provider,
|
||
|
|
BetID: v.PlatformTxId,
|
||
|
|
SessionID: v.RoundId,
|
||
|
|
Time: betTime,
|
||
|
|
VoidType: v.VoidType,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
resp.Status = "0000"
|
||
|
|
resp.Balance = util.Decimal(float64(betResp.Balance)/common.DecimalDigits, 4)
|
||
|
|
resp.BalanceTs = time.Now().Format(TimeFormatString)
|
||
|
|
}
|
||
|
|
|
||
|
|
type SettleUser struct {
|
||
|
|
UID int
|
||
|
|
TotalSettle int64
|
||
|
|
TotalBet int64
|
||
|
|
TotalTurnover int64
|
||
|
|
}
|
||
|
|
|
||
|
|
func settle(a *app.Gin) {
|
||
|
|
req := new(SettleReq)
|
||
|
|
message := a.TmpData.(string)
|
||
|
|
resp := &SettleResp{}
|
||
|
|
a.RetData = resp
|
||
|
|
err := json.Unmarshal([]byte(message), req)
|
||
|
|
if err != nil {
|
||
|
|
log.Error("err:%v", err)
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
now := time.Now().Unix()
|
||
|
|
var settleResp base.SettleResp
|
||
|
|
var uid int
|
||
|
|
var ct common.CurrencyType
|
||
|
|
myUUID := call.SnowNode().Generate().Int64()
|
||
|
|
provider := new(common.ConfigGameProvider)
|
||
|
|
gameID := 0
|
||
|
|
uuid := ""
|
||
|
|
settles := map[int]SettleUser{}
|
||
|
|
for _, v := range req.Txns {
|
||
|
|
uid = util.GetIntFromString(v.UserId)
|
||
|
|
if uid <= 0 {
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
if v.Platform == "SEXYBCRT" {
|
||
|
|
fmt.Sscanf(v.GameCode, "MX-LIVE-%d", &gameID)
|
||
|
|
provider = call.GetConfigGameProvider(common.ProviderSexy)
|
||
|
|
}
|
||
|
|
var settleTime int64
|
||
|
|
t, err := time.Parse(TimeFormatString, v.UpdateTime)
|
||
|
|
if err != nil {
|
||
|
|
settleTime = now
|
||
|
|
} else {
|
||
|
|
settleTime = t.Unix()
|
||
|
|
}
|
||
|
|
record := &common.ProviderBetRecord{
|
||
|
|
UID: uid,
|
||
|
|
Provider: provider.ProviderID,
|
||
|
|
UUID: v.PlatformTxId,
|
||
|
|
Type: common.SessionTypeBet,
|
||
|
|
}
|
||
|
|
db.Mysql().Get(record)
|
||
|
|
if record.ID == 0 {
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
// 重复结算,忽略
|
||
|
|
if db.Mysql().Exist(&common.ProviderBetRecord{
|
||
|
|
UID: uid,
|
||
|
|
Provider: provider.ProviderID,
|
||
|
|
UUID: v.PlatformTxId,
|
||
|
|
Type: common.SessionTypeSettle,
|
||
|
|
}) {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
ct = record.CurrencyType
|
||
|
|
uuid = v.PlatformTxId
|
||
|
|
settleAmount := common.CashFloat64ToInt64(v.WinAmount)
|
||
|
|
betAmount := common.CashFloat64ToInt64(v.BetAmount)
|
||
|
|
turnOver := common.CashFloat64ToInt64(v.TurnOver)
|
||
|
|
if err := db.Mysql().Create(&common.ProviderBetRecord{
|
||
|
|
UID: uid,
|
||
|
|
Provider: provider.ProviderID,
|
||
|
|
Currency: ct.GetCurrencyName(),
|
||
|
|
CurrencyType: ct,
|
||
|
|
GameID: gameID,
|
||
|
|
UUID: v.PlatformTxId,
|
||
|
|
Type: common.SessionTypeSettle,
|
||
|
|
Time: now,
|
||
|
|
ProviderTime: settleTime,
|
||
|
|
Amount: betAmount,
|
||
|
|
SessionID: v.RoundId,
|
||
|
|
MyUUID: myUUID,
|
||
|
|
Settle: settleAmount,
|
||
|
|
Esi: base.SessionSuccess,
|
||
|
|
}); err != nil {
|
||
|
|
log.Error("err:%v", err)
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
user, ok := settles[uid]
|
||
|
|
if ok {
|
||
|
|
user.TotalBet += betAmount
|
||
|
|
user.TotalSettle += settleAmount
|
||
|
|
user.TotalTurnover += turnOver
|
||
|
|
settles[uid] = user
|
||
|
|
} else {
|
||
|
|
settles[uid] = SettleUser{
|
||
|
|
TotalBet: betAmount,
|
||
|
|
TotalSettle: settleAmount,
|
||
|
|
TotalTurnover: turnOver,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
for i, v := range settles {
|
||
|
|
thisUID := i
|
||
|
|
if v.TotalSettle != 0 {
|
||
|
|
pro := call.UpdateCurrencyProReal(
|
||
|
|
&common.UpdateCurrency{
|
||
|
|
CurrencyBalance: &common.CurrencyBalance{
|
||
|
|
UID: thisUID,
|
||
|
|
Type: ct,
|
||
|
|
Event: common.CurrencyEventGameSettle,
|
||
|
|
Value: v.TotalSettle,
|
||
|
|
Exs1: fmt.Sprintf("%d", myUUID),
|
||
|
|
// Exs2: req.BetID,
|
||
|
|
// Exs3: req.SessionID,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
)
|
||
|
|
if pro.Err != nil {
|
||
|
|
log.Error("err:%v", pro.Err)
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
// balance = pro.Balance
|
||
|
|
}
|
||
|
|
|
||
|
|
util.IndexTryS(func() error {
|
||
|
|
return call.Publish(natsClient.TopicInnerAfterSettle, &pb.InnerAfterSettle{
|
||
|
|
UID: int64(thisUID),
|
||
|
|
ProviderID: int64(provider.ProviderID),
|
||
|
|
GameID: int64(gameID),
|
||
|
|
UUID: uuid,
|
||
|
|
CurrencyType: int64(ct),
|
||
|
|
TotalBet: v.TotalTurnover,
|
||
|
|
OriginSettle: v.TotalSettle,
|
||
|
|
FinalSettle: v.TotalSettle,
|
||
|
|
MyUUID: fmt.Sprintf("%d", myUUID),
|
||
|
|
})
|
||
|
|
})
|
||
|
|
}
|
||
|
|
resp.Status = "0000"
|
||
|
|
if settleResp.Code != base.CodeOk {
|
||
|
|
resp.Status = "9999"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func viodSettle(a *app.Gin) {
|
||
|
|
req := new(SettleReq)
|
||
|
|
message := a.TmpData.(string)
|
||
|
|
resp := &SettleResp{}
|
||
|
|
a.RetData = resp
|
||
|
|
err := json.Unmarshal([]byte(message), req)
|
||
|
|
if err != nil {
|
||
|
|
log.Error("err:%v", err)
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
// var settleResp base.SettleResp
|
||
|
|
for _, v := range req.Txns {
|
||
|
|
uid := util.GetIntFromString(v.UserId)
|
||
|
|
if uid <= 0 {
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
gameID := 0
|
||
|
|
var provider *common.ConfigGameProvider
|
||
|
|
if v.Platform == "SEXYBCRT" {
|
||
|
|
fmt.Sscanf(v.GameCode, "MX-LIVE-%d", &gameID)
|
||
|
|
provider = call.GetConfigGameProvider(common.ProviderSexy)
|
||
|
|
}
|
||
|
|
base.VoidSettle(&base.VoidSettleReq{
|
||
|
|
UID: uid,
|
||
|
|
Provider: provider,
|
||
|
|
BetID: v.PlatformTxId,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
resp.Status = "0000"
|
||
|
|
}
|
||
|
|
|
||
|
|
func give(a *app.Gin) {
|
||
|
|
req := new(GiveReq)
|
||
|
|
message := a.TmpData.(string)
|
||
|
|
resp := &GiveResp{}
|
||
|
|
a.RetData = resp
|
||
|
|
err := json.Unmarshal([]byte(message), req)
|
||
|
|
if err != nil {
|
||
|
|
log.Error("err:%v", err)
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
now := time.Now().Unix()
|
||
|
|
// var settleResp base.SettleResp
|
||
|
|
for _, v := range req.Txns {
|
||
|
|
uid := util.GetIntFromString(v.UserId)
|
||
|
|
if uid <= 0 {
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
ctName := v.Currency
|
||
|
|
if ctName == "USD" {
|
||
|
|
ctName = "USDT"
|
||
|
|
}
|
||
|
|
ct := common.GetCurrencyID(ctName)
|
||
|
|
if !ct.IsValid() {
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
var provider *common.ConfigGameProvider
|
||
|
|
if v.Platform == "SEXYBCRT" {
|
||
|
|
provider = call.GetConfigGameProvider(common.ProviderSexy)
|
||
|
|
}
|
||
|
|
var txTime int64
|
||
|
|
t, err := time.Parse(TimeFormatString, v.TxTime)
|
||
|
|
if err != nil {
|
||
|
|
txTime = now
|
||
|
|
} else {
|
||
|
|
txTime = t.Unix()
|
||
|
|
}
|
||
|
|
base.Adjustment(&base.AdjustmentReq{
|
||
|
|
Time: txTime,
|
||
|
|
UID: uid,
|
||
|
|
CurrencyType: ct,
|
||
|
|
Amount: common.CashFloat64ToInt64(v.Amount),
|
||
|
|
Provider: provider,
|
||
|
|
BetID: v.PromotionTxId + v.PromotionId,
|
||
|
|
Ess: v.PromotionTypeId,
|
||
|
|
Type: common.SessionTypeActivity,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
resp.Status = "0000"
|
||
|
|
}
|
||
|
|
|
||
|
|
func resettle(a *app.Gin) {
|
||
|
|
req := new(SettleReq)
|
||
|
|
message := a.TmpData.(string)
|
||
|
|
resp := &SettleResp{}
|
||
|
|
a.RetData = resp
|
||
|
|
err := json.Unmarshal([]byte(message), req)
|
||
|
|
if err != nil {
|
||
|
|
log.Error("err:%v", err)
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
var settleResp base.ReSettleResp
|
||
|
|
for _, v := range req.Txns {
|
||
|
|
uid := util.GetIntFromString(v.UserId)
|
||
|
|
if uid <= 0 {
|
||
|
|
resp.Status = "1036"
|
||
|
|
return
|
||
|
|
}
|
||
|
|
var provider *common.ConfigGameProvider
|
||
|
|
if v.Platform == "SEXYBCRT" {
|
||
|
|
provider = call.GetConfigGameProvider(common.ProviderSexy)
|
||
|
|
}
|
||
|
|
settleResp = base.Resettle(&base.ReSettleReq{
|
||
|
|
UID: uid,
|
||
|
|
SettleAmount: common.CashFloat64ToInt64(v.WinAmount),
|
||
|
|
Provider: provider,
|
||
|
|
BetID: v.PlatformTxId,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
resp.Status = "0000"
|
||
|
|
if settleResp.Code != base.CodeOk {
|
||
|
|
resp.Status = "9999"
|
||
|
|
}
|
||
|
|
}
|