周卡,厂商逻辑修改

dev_aagame_provider
zhora 2 months ago
parent 7bd458b62e
commit 3f523af780
  1. 48
      call/config.go
  2. 156
      call/pay.go
  3. 9
      call/pdd.go
  4. 25
      common/activity.go
  5. 1
      common/recharge.go
  6. 5
      common/redis_keys.go
  7. 1
      modules/backend/migrate.go
  8. 32
      modules/web/app/balance.go
  9. 2
      modules/web/handler/firstpage.go
  10. 2
      modules/web/handler/game.go
  11. 19
      modules/web/handler/recharge.go
  12. 328
      modules/web/handler/weekCard.go
  13. 2
      modules/web/providers/base/base.go
  14. 6
      modules/web/providers/sn/api.go
  15. 20
      modules/web/providers/sn/base.go
  16. 78
      modules/web/providers/sn/handler.go
  17. 41
      modules/web/providers/sn/values.go
  18. 31
      modules/web/values/activity.go
  19. 7
      modules/web/values/pay.go

@ -1437,6 +1437,19 @@ func GetConfigCurrencyResourceNeedBet(t common.CurrencyRes, amount int64, speMul
return
}
func GetConfigCurrencyResourceNeedBetByActId(activityId int, amount int64) (needBet int64) {
if amount <= 0 {
return
}
switch activityId {
case common.ActivityIDWeekCard:
config := GetConfigWeekCard()
needBet = int64(config.BetMultiples) * amount
return
}
return
}
// LoadConfigFirstPay 首充
func LoadConfigFirstPay() (err error) {
one := []*common.ConfigFirstPay{}
@ -2147,18 +2160,45 @@ func GetConfigGameTag() (result []*common.ConfigGameTag) {
return
}
func GetConfigGameTagByIds(ids []int) (result []*common.ConfigGameTag) {
func GetConfigGameTagByIds(ids []int, notSort bool) (result []*common.ConfigGameTag) {
if len(configGameTag) == 0 {
LoadConfigGameTag()
}
idOrderMap := make(map[int]int)
for i, id := range ids {
idOrderMap[id] = i
}
for _, v := range configGameTag {
if util.SliceContain(ids, v.TagId) {
result = append(result, v)
}
}
sort.Slice(result, func(i, j int) bool {
return result[i].Sort > result[j].Sort
})
if notSort {
sort.Slice(result, func(i, j int) bool {
orderI, okI := idOrderMap[result[i].TagId]
orderJ, okJ := idOrderMap[result[j].TagId]
if okI && okJ {
return orderI < orderJ
}
if okI && !okJ {
return true
}
if !okI && okJ {
return false
}
return result[i].Sort > result[j].Sort
})
} else {
sort.Slice(result, func(i, j int) bool {
return result[i].Sort > result[j].Sort
})
}
return
}

@ -6,6 +6,7 @@ import (
"errors"
"fmt"
jsoniter "github.com/json-iterator/go"
"gorm.io/gorm/clause"
"io/ioutil"
"math/rand"
"net/http"
@ -222,7 +223,14 @@ func RechargeCallback(r *common.RechargeOrder, success bool, payAccount, extra s
t = common.CurrencyResourceRechargeWithBonus
}
}
needBet := GetConfigCurrencyResourceNeedBet(t, amount+bonus)
var needBet int64
if r.ActivityID != 0 {
needBet = GetConfigCurrencyResourceNeedBetByActId(r.ActivityID, amount)
}
if needBet == 0 {
needBet = GetConfigCurrencyResourceNeedBet(t, amount+bonus)
}
cb := &common.CurrencyBalance{
UID: r.UID,
Type: r.CurrencyType,
@ -533,6 +541,7 @@ func PayActivity(r *common.RechargeOrder, notCharge bool, user *common.PlayerDBI
}
// todo
util.Go(func() {
// 分享活动
UpdateShare(r.UID, 2, r.Amount)
shareInfo := common.ShareInfo{UID: user.Id}
@ -594,24 +603,24 @@ func CheckAllActivity(r *common.RechargeOrder) {
if r.ProductID > 0 {
product = GetConfigPayProductByID(r.ProductID)
}
// slots奖池活动
ActivitySlots(r, product)
//// slots奖池活动
//ActivitySlots(r, product)
if product == nil {
return
}
//if product == nil {
// return
//}
switch product.ActivityID {
case common.ActivityIDBreakGift:
ActivityBreakGift(r, product)
switch r.ActivityID {
case common.ActivityIDWeekCard:
ActivityWeekCard(r, product)
case common.ActivityIDLuckyShop:
ActivityLuckyShop(r, product)
case common.ActivityIDSevenDayBox:
ActivitySevenDayBox(r, product)
case common.ActivityIDSuper:
ActivitySuper(r, product)
//case common.ActivityIDBreakGift:
// ActivityBreakGift(r, product)
//case common.ActivityIDLuckyShop:
// ActivityLuckyShop(r, product)
//case common.ActivityIDSevenDayBox:
// ActivitySevenDayBox(r, product)
//case common.ActivityIDSuper:
// ActivitySuper(r, product)
}
}
@ -643,89 +652,6 @@ func ActivityBreakGift(r *common.RechargeOrder, product *common.ConfigPayProduct
UploadActivityData(r.UID, common.ActivityIDBreakGift, common.ActivityDataJoin, product.Value)
}
func ActivityWeekCard(r *common.RechargeOrder, product *common.ConfigPayProduct) {
con := GetConfigWeekCard()
if con == nil {
return
}
rows, err := db.Mysql().UpdateRes(&common.ActivityWeekCardData{UID: r.UID}, map[string]interface{}{
"recharge_time": time.Now().Unix(), "day": 0, "recharge_amount": r.Amount, "rewards": ""})
if err != nil || rows == 0 {
log.Error("err:%v", err)
return
}
// ok
UpdateCurrencyPro(&common.UpdateCurrency{
CurrencyBalance: &common.CurrencyBalance{
UID: r.UID,
Value: product.Value,
Event: common.CurrencyEventActivityWeekCard,
Type: common.CurrencyINR,
NeedBet: GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, product.Value),
ChannelID: r.ChannelID,
Exi1: product.ProductID,
},
})
UploadActivityData(r.UID, common.ActivityIDWeekCard, common.ActivityDataJoin, product.Value)
// 自动领第一天的
cons := GetConfigWeekCard()
cardInfo := GetUserWeekCard(r.UID)
var rewardList []int64
_ = rewardList
_ = cons
//rewardList, err = util.GenerateRandomSequence(cons.RewardAmount, cons.MiniLimit, 5)
//if err != nil {
// log.Error("err:%v", err)
//}
//rewardList = append([]int64{cons.DayOneReward}, rewardList...)
//rewardList = append(rewardList, 0)
//if cardInfo.ID <= 0 || len(cardInfo.Rewards) == 0 {
// cardInfo.Day = 0
// rewardList, err = util.GenerateRandomSequence(cons.RewardAmount, cons.MiniLimit, 5)
// if err != nil {
// log.Error("err:%v", err)
// }
// rewardList = append([]int64{cons.DayOneReward}, rewardList...)
// rewardList = append(rewardList, 0)
// cardInfo.Rewards = strings.Join(util.Int64SliceToStringSlice(rewardList), ",")
// db.Mysql().Update(&common.ActivityWeekCardData{UID: r.UID}, map[string]interface{}{
// "rewards": cardInfo.Rewards,
// })
//}
rewards, _ := util.StringToInt64Slice(cardInfo.Rewards, ",")
if cardInfo.Day >= len(rewards) {
log.Error("The weekly card has been collected")
return
}
now := time.Now()
rows, err = db.Mysql().UpdateRes(&common.ActivityWeekCardData{UID: r.UID},
map[string]interface{}{"day": gorm.Expr("day + 1"), "last_draw": now.Unix()})
if rows == 0 || err != nil {
log.Error("err:%v", err)
return
}
var reward int64
if cardInfo.Day < 6 {
reward = rewards[cardInfo.Day] * common.DecimalDigits
}
resource := common.CurrencyResourceWeekCard
if cardInfo.Day > 0 {
resource = common.CurrencyResourceBonus
}
if reward > 0 {
UpdateCurrencyPro(&common.UpdateCurrency{
CurrencyBalance: &common.CurrencyBalance{
UID: r.UID,
Type: common.CurrencyINR,
Value: reward,
Event: common.CurrencyEventActivityWeekCard,
ChannelID: r.ChannelID,
NeedBet: GetConfigCurrencyResourceNeedBet(resource, reward),
},
})
}
}
func ActivityLuckyShop(r *common.RechargeOrder, product *common.ConfigPayProduct) {
rows, err := db.Mysql().UpdateResW(&common.ActivityLuckyShopData{}, map[string]interface{}{"buy": 1},
fmt.Sprintf("uid = %d and product_id = %d and buy = 0", r.UID, product.ProductID))
@ -894,3 +820,37 @@ func WithdrawInfoGet(uid int) (withdrawInfo common.WithdrawInfo, err error) {
}
return
}
func ActivityWeekCard(r *common.RechargeOrder, product *common.ConfigPayProduct) {
con := GetConfigWeekCard()
if con == nil {
return
}
now := time.Now()
weekCardData := common.WeekCardData{
UID: r.UID,
BeginAt: now.Unix(),
CardPrice: int(product.Amount / common.DecimalDigits),
AwardTimes: 1,
AwardAt: now.Unix(),
AwardTotal: int(product.Amount),
AwardTotalHistory: int(product.Amount),
BuyCardTimes: 1,
}
err := db.Mysql().C().Model(&common.WeekCardData{}).Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "uid"}},
DoUpdates: clause.Assignments(map[string]interface{}{
"begin_at": weekCardData.BeginAt,
"card_price": weekCardData.CardPrice,
"award_times": weekCardData.AwardTimes,
"award_at": weekCardData.AwardAt,
"award_total": weekCardData.AwardTotal,
"award_total_history": gorm.Expr("`award_total_history` + ?", weekCardData.AwardTotalHistory),
"buy_card_times": gorm.Expr("`buy_card_times` + ?", weekCardData.BuyCardTimes),
}),
}).Create(&weekCardData).Error
if err != nil {
log.Error("update week card err:%v", err.Error())
return
}
}

@ -47,3 +47,12 @@ func GetPddData(uid int) (result *common.PddDataNew, err error) {
}
return
}
func GetWeekCardData(uid int) (result *common.WeekCardData, err error) {
err = db.Mysql().C().Model(&common.WeekCardData{}).Where("uid = ?", uid).Find(&result).Error
if err != nil {
log.Error("get week card data err, %s", err.Error())
return
}
return
}

@ -671,9 +671,10 @@ type WeekCardDay struct {
}
type ConfigWeekCard struct {
ID int `gorm:"primarykey"`
Switch int `gorm:"column:switch;type:int(11);default:0;comment:开关(1开2关)" json:"Switch" web:"switch"`
Amount int64 `gorm:"column:amount;type:int(20);default:50000;comment:周卡价格" json:"Amount" web:"amount"`
ID int `gorm:"primarykey"`
Switch int `gorm:"column:switch;type:int(11);default:0;comment:开关(1开2关)" json:"Switch" web:"switch"`
Amount int64 `gorm:"column:amount;type:int(20);default:50000;comment:周卡价格" json:"Amount" web:"amount"`
BetMultiples int `gorm:"column:bet_multiples;type:int(11);comment:打码倍数" json:"BetMultiples" web:"bet_multiples"`
// []WeekCardDay json
AwardData string `gorm:"column:award_data;type:varchar(512);default:'';comment:奖励数据" json:"AwardData" web:"award_data"`
@ -684,3 +685,21 @@ type ConfigWeekCard struct {
func (c *ConfigWeekCard) TableName() string {
return "config_week_card"
}
type WeekCardData struct {
ID int `gorm:"primarykey"`
UID int `gorm:"column:uid;not null;type:int(11);uniqueIndex:uid"`
BeginAt int64 `gorm:"column:begin_at;type:bigint(20);default:0;comment:周卡开始时间"`
CardPrice int `gorm:"column:card_price;type:int(11);default:0;comment:周卡价格"`
Amount int `gorm:"column:amount;type:bigint(20);default:0;comment:当前领取金额"`
AwardTimes int `gorm:"column:award_times;type:int(11);default:0;comment:当前领取次数"`
AwardAt int64 `gorm:"column:award_at;type:bigint(20);comment:最近领取时间"`
AwardTotal int `gorm:"column:award_total;type:bigint(20);comment:当前总奖励"`
AwardTotalHistory int `gorm:"column:award_total_history;type:bigint(20);comment:历史总奖励"`
BuyCardTimes int `gorm:"column:buy_card_times;type:bigint(20);comment:买卡次数"`
}
func (m *WeekCardData) TableName() string {
return "week_card_data"
}

@ -134,6 +134,7 @@ type RechargeOrder struct {
Event int `gorm:"column:event;not null;type:smallint(4);comment:事件类型"`
CurrencyType CurrencyType `gorm:"column:currency_type;not null;type:int(11);comment:货币类型"`
ProductID int `gorm:"column:productid;not null;type:int(11)"`
ActivityID int `gorm:"column:activity_id;default:0;type:int(11)"`
Status uint8 `gorm:"column:status;not null;type:tinyint(4);comment:1新建,2支付完成,3发货完成,4支付失败,5取消"`
FailReason string `gorm:"column:fail_reason;type:varchar(255);comment:失败原因"`
ChannelID int `gorm:"column:channel_id;type:bigint(20);default:1;comment:渠道id" redis:"channel_id"`

@ -51,6 +51,7 @@ const (
RedisKeyLuckyWheel = "luckyWheel"
RedisKeyPdd = "pdd"
RedisKeyShare = "share"
RedisKeyWeekCard = "week_card"
)
const (
@ -214,3 +215,7 @@ func GetRedisKeyPdd(uid int) string {
func GetRedisKeyShare(uid int) string {
return fmt.Sprintf("%v:%v", RedisKeyShare, uid)
}
func GetRedisKeyWeekCard(uid int) string {
return fmt.Sprintf("%v:%v", RedisKeyWeekCard, uid)
}

@ -150,6 +150,7 @@ func MigrateDB() {
new(common.ShareRankData),
new(common.LuckyWheelReward),
new(common.ConfigWeekCard),
new(common.WeekCardData),
)
if err != nil {
panic("Migrate db fail")

@ -2,6 +2,7 @@ package app
import (
"fmt"
"github.com/liangdas/mqant/log"
"server/call"
"server/common"
"server/db"
@ -57,11 +58,13 @@ func (g *Gin) CheckWithdrawCondition(amount int64, t common.CurrencyType) (ok bo
}
// CanBuyProduct 判断是否满足可以购买该商品
func (g *Gin) CanBuyProduct(actID, pid int) (can bool) {
if actID == 0 || actID < common.ProductTypeAll {
return true
func (g *Gin) CanBuyProduct(actID, pid int) (can bool, product *common.ConfigPayProduct) {
if actID == 0 {
return
}
if !g.CheckActivityExpire(actID) {
productList := call.GetConfigPayProductByActivityID(actID)
if len(productList) == 0 {
log.Debug("get activity[%d] product is nil", actID)
return
}
switch actID {
@ -72,6 +75,25 @@ func (g *Gin) CanBuyProduct(actID, pid int) (can bool) {
g.Code = values.CodeBuyLimit
return
}
case common.ActivityIDWeekCard:
configWeekCard := call.GetConfigWeekCard()
if configWeekCard == nil {
return
}
weekCardData, err := call.GetWeekCardData(g.UID)
if err != nil {
return
}
if weekCardData.BeginAt > 0 { // 还在周期中,不能购买
return
}
for _, v := range productList {
if configWeekCard.Amount*common.DecimalDigits == v.Amount {
can = true
product = v
return
}
}
}
return true
return
}

@ -167,7 +167,7 @@ func FirstPageNew(c *gin.Context) {
Multiple: item.Multiple / 100,
})
}
configGameTags := call.GetConfigGameTagByIds(call.GetConfigShowGameTagIds())
configGameTags := call.GetConfigGameTagByIds(call.GetConfigShowGameTagIds(), false)
tags := make([]values.Tag, 0, len(configGameTags))
for _, v := range configGameTags {
tags = append(tags, values.Tag{

@ -98,7 +98,7 @@ func GameTag(c *gin.Context) {
return
}
showGameTag := showGameTags[0]
configGameTags := call.GetConfigGameTagByIds(showGameTag.ShowTagIdsInt)
configGameTags := call.GetConfigGameTagByIds(showGameTag.ShowTagIdsInt, true)
tags := make([]values.TagWithGameList, 0, len(configGameTags))
for _, v := range configGameTags {
showCount := v.ShowCount

@ -232,6 +232,16 @@ func PlayerRecharge(c *gin.Context) {
return
}
req.Amount = product.Amount
req.ActivityID = product.ActivityID
if product.ActivityID > 0 {
can, _ := a.CanBuyProduct(req.ActivityID, req.ProductID)
if !can {
a.Code = values.CodeRetry
a.Msg = "Buy limit"
return
}
req.Bonus = false
}
} else {
req.Amount = common.RoundCurrency(req.CurrencyType, req.Amount)
}
@ -290,7 +300,6 @@ func NewRechargeImp(req *values.RechargeReq, uid, cid int, ip string) *RechargeI
return nil
}
order := &common.RechargeOrder{
// ProductID: product.ProductID, Amount: product.Amount,
CreateTime: time.Now().Unix(),
CurrencyType: req.CurrencyType,
Amount: req.Amount,
@ -300,8 +309,16 @@ func NewRechargeImp(req *values.RechargeReq, uid, cid int, ip string) *RechargeI
Event: int(common.CurrencyEventReCharge),
UPI: req.PayChannel,
ProductID: req.ProductID,
ActivityID: req.ActivityID,
}
if req.ActivityID > 0 {
switch req.ActivityID {
case common.ActivityIDWeekCard:
order.Event = int(common.CurrencyEventActivityWeekCard)
}
}
// 只有商城购买才能使用优惠券
// todo activityId为0才是商城购买
if req.ProductID == 0 && req.DiscountTicketId > 0 {
// 判断是否有折扣券
ticket := call.GetItem(req.DiscountTicketId)

@ -4,17 +4,14 @@ import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/liangdas/mqant/log"
"github.com/olivere/elastic/v7"
"gorm.io/gorm"
"math/rand"
"server/call"
"server/common"
"server/config"
"server/db"
"server/modules/web/app"
"server/modules/web/values"
"server/pb"
"server/util"
"sort"
"time"
)
@ -24,78 +21,60 @@ func WeekCardInfo(c *gin.Context) {
a.Response()
}()
a.GetUID()
if !a.CheckActivityExpire(common.ActivityIDWeekCard) {
return
}
resp := &values.ActivityWeekCardInfoResp{}
resp := &values.WeekCardInfoResp{}
a.Data = resp
uid := a.UID
cons := call.GetConfigWeekCard()
_ = cons
cardInfo := new(common.ActivityWeekCardData)
if a.UID > 0 {
cardInfo = call.GetUserWeekCard(a.UID)
}
var rewardList []int64
var err error
_ = err
//rewardList, err = util.GenerateRandomSequence(cons.RewardAmount, cons.MiniLimit, 5)
//if err != nil {
// log.Error("err:%v", err)
//}
//rewardList = append([]int64{cons.DayOneReward}, rewardList...)
//rewardList = append(rewardList, 0)
//if cardInfo.ID <= 0 || len(cardInfo.Rewards) == 0 {
// cardInfo.Day = 0
// rewardList, err = util.GenerateRandomSequence(cons.RewardAmount, cons.MiniLimit, 5)
// if err != nil {
// log.Error("err:%v", err)
// }
// rewardList = append([]int64{cons.DayOneReward}, rewardList...)
// rewardList = append(rewardList, 0)
// if cardInfo.ID <= 0 {
// cardInfo.Rewards = strings.Join(util.Int64SliceToStringSlice(rewardList), ",")
// if a.UID > 0 {
// db.Mysql().Create(cardInfo)
// }
// } else {
// cardInfo.Rewards = strings.Join(util.Int64SliceToStringSlice(rewardList), ",")
// db.Mysql().Update(&common.ActivityWeekCardData{UID: a.UID}, map[string]interface{}{
// "rewards": cardInfo.Rewards,
// })
// }
//}
if rewardList == nil {
rewardList, _ = util.StringToInt64Slice(cardInfo.Rewards, ",")
}
if cardInfo.RechargeTime != 0 {
resp.RechargeStatus = true
}
// step:签完7天就重置
if cardInfo.Day >= len(rewardList) {
resp.RechargeStatus = false
}
for _, item := range rewardList {
_ = item
//resp.RewardList = append(resp.RewardList, values.WeekCardInfo{
// Min: cons.MiniLimit,
// Max: cons.RewardAmount - cons.MiniLimit*4,
// Val: item,
//})
}
resp.Status = true
if config.GetBase().Release {
if util.IsSameDayTimeStamp(time.Now().Unix(), cardInfo.LastDraw) {
resp.Status = false
if cons == nil {
a.Code = values.CodeRetry
return
}
weekCardData, err := call.GetWeekCardData(uid)
if err != nil {
log.Error("get week card data err, %s", err.Error())
a.Code = values.CodeRetry
return
}
resp.Amount = cons.Amount
resp.List = make([]values.WeekCardDay, 0, len(cons.AwardDetails))
now := time.Now()
for index := 1; index <= 7; index++ {
var state int
if weekCardData != nil && weekCardData.ID != 0 && weekCardData.BeginAt != 0 { // 已经购买周卡的情况下
resp.IsUnlock = true
if util.IsSameDayTimeStamp(now.Unix(), weekCardData.AwardAt) {
resp.Time = int64(util.GetZeroTime(now.AddDate(0, 0, 1)).Sub(now).Seconds())
}
if weekCardData.AwardTimes >= index {
state = 2
} else if weekCardData.AwardTimes < index {
state = 0
if !util.IsSameDayTimeStamp(now.Unix(), weekCardData.AwardAt) &&
weekCardData.AwardTimes+1 == index {
state = 1
}
}
}
award := cons.AwardDetails[index]
var coinDesc string
if award.AwardLower == award.AwardUpper || award.AwardUpper == 0 {
coinDesc = fmt.Sprintf("₹%d", award.AwardLower)
} else {
coinDesc = fmt.Sprintf("₹%d-₹%d", award.AwardLower, award.AwardUpper)
}
resp.List = append(resp.List, values.WeekCardDay{
State: state,
Coin: coinDesc,
})
}
resp.RewardDay = cardInfo.Day
resp.ChannelList = call.GetConfigPayChannelsByID(common.CurrencyINR)
resp.ProductList = call.GetConfigPayProductByActivityID(common.ActivityIDWeekCard)
if resp.Status && resp.RechargeStatus {
call.PushRed(a.UID, pb.RedPointModule_RedPointWeekCard, 1)
products := call.GetConfigPayProductByActivityID(common.ActivityIDWeekCard)
for _, v := range products {
if v.Amount == resp.Amount*common.DecimalDigits {
resp.ProductId = v.ProductID
break
}
}
call.UploadActivityData(a.UID, common.ActivityIDSign, common.ActivityDataClick, 0)
}
func WeekCardDraw(c *gin.Context) {
@ -103,123 +82,136 @@ func WeekCardDraw(c *gin.Context) {
defer func() {
a.Response()
}()
if !a.CheckActivityExpire(common.ActivityIDWeekCard) {
return
}
req := new(values.ActivityWeekCardDrawReq)
req := new(values.WeekCardDrawReq)
if !a.S(req) {
return
}
resp := &values.ActivityWeekCardDrawResp{}
resp := &values.WeekCardDrawResp{}
a.Data = resp
// conf := call.GetConfigActivityWeekCard()
card := call.GetUserWeekCard(a.UID)
if card.ID == 0 {
uid := a.UID
if !db.Redis().Lock(common.GetRedisKeyWeekCard(uid)) {
a.Code = values.CodeRetry
return
}
now := time.Now().Unix()
if config.GetBase().Release {
if util.IsSameDayTimeStamp(now, card.LastDraw) {
a.Code = values.CodeRetry
a.Msg = "today has reward"
return
}
defer func() {
db.Redis().UnLock(common.GetRedisKeyWeekCard(uid))
}()
configWeekCard := call.GetConfigWeekCard()
if configWeekCard == nil {
log.Error("get week card config is nil")
a.Code = values.CodeRetry
a.Msg = "Illegal request"
return
}
rewards, _ := util.StringToInt64Slice(card.Rewards, ",")
if card.Day >= len(rewards) {
weekCardData, err := call.GetWeekCardData(uid)
if err != nil {
log.Error("get week card data err, %s", err.Error())
a.Code = values.CodeRetry
a.Msg = "The weekly card has been collected"
return
}
rows, err := db.Mysql().UpdateRes(&common.ActivityWeekCardData{UID: a.UID},
map[string]interface{}{"day": gorm.Expr("day + 1"), "last_draw": now})
if rows == 0 || err != nil {
log.Error("err:%v", err)
now := time.Now()
if weekCardData.ID == 0 || weekCardData.BeginAt == 0 {
a.Code = values.CodeRetry
a.Msg = "Not unlocked Week Card"
return
}
var reward int64
if card.Day < 6 {
reward = rewards[card.Day] * common.DecimalDigits
if util.IsSameDayTimeStamp(now.Unix(), weekCardData.AwardAt) {
a.Code = values.CodeRetry
a.Msg = "Already received today"
return
}
if req.Index != weekCardData.AwardTimes+1 {
a.Code = values.CodeRetry
a.Msg = "Illegal request"
return
}
var awardCount int64
maxAwardCount := weekCardData.CardPrice * 2 * common.DecimalDigits // 总奖励金额
lessAwardCount := maxAwardCount - weekCardData.AwardTotal // 剩余奖励金额
if req.Index == 7 { // 最后一天
awardCount = int64(maxAwardCount - weekCardData.AwardTotal)
} else {
// 第几天折扣券
// 用户画像一:6天内充值3笔及以上用户
// 推送当前最高额度向上一档充值满减卷
// 用户画像二:只解锁周卡,未充值的玩家
// 推送当前额度向下一档充值满减卷,最低300
var list []common.CurrencyBalance
q := elastic.NewBoolQuery()
q.Filter(elastic.NewRangeQuery("time").Gte(card.RechargeTime))
q.Filter(elastic.NewRangeQuery("time").Lte(now))
q.Filter(elastic.NewRangeQuery("event").Gte(common.CurrencyEventReCharge))
q.Must(elastic.NewTermsQuery("uid", a.UID))
db.ES().QueryList(common.ESIndexBalance, 0, 100, q, &list, "time", true)
up := false
maxAmount := card.RechargeAmount
if len(list) >= 3 {
up = true
for _, item := range list {
if item.Value > maxAmount {
maxAmount = item.Value
}
tryCount := 10
awardOffset := 0
lessMinAwardCount := 0 // 剩下每天的最低金额
lessMaxAwardCount := 0 // 剩下每天的最大金额
for index := req.Index + 1; index <= 7; index++ {
lessMinAwardCount += configWeekCard.AwardDetails[index].AwardLower * common.DecimalDigits
lessMaxAwardCount += configWeekCard.AwardDetails[index].AwardUpper * common.DecimalDigits
}
try:
awardDetail := configWeekCard.AwardDetails[req.Index]
if awardDetail.AwardUpper == awardDetail.AwardLower || awardDetail.AwardUpper == 0 {
awardCount = int64(awardDetail.AwardUpper * common.DecimalDigits)
} else {
randValue := (awardDetail.AwardUpper - awardDetail.AwardLower) + awardOffset
if randValue < 0 {
randValue = 1
}
awardCount = int64((rand.Intn(randValue) + awardDetail.AwardLower) * common.DecimalDigits)
}
log.Info("maxAmount:%v", maxAmount)
ticket := call.GetConfigDiscountTicketByAmount(maxAmount)
log.Info("ticket:%v", ticket)
if ticket.ID > 0 {
// 赠送优惠券
tickets := call.GetConfigDiscountTicket()
sort.Slice(tickets, func(i, j int) bool {
return tickets[i].RechargeAmount < tickets[j].RechargeAmount
})
// 获取下一档
nextIdx := -1
for idx, item := range tickets {
if item.RechargeAmount == maxAmount {
if up {
nextIdx = idx + 1
} else if item.RechargeAmount >= 300*common.DecimalDigits {
nextIdx = idx - 1
}
break
if lessMinAwardCount+int(awardCount) > lessAwardCount ||
lessMaxAwardCount+int(awardCount) < lessAwardCount { // 当前金额+之后每天最低金额比剩余金额还大的时候
if tryCount > 0 {
tryCount--
if lessMinAwardCount+int(awardCount) > lessAwardCount {
awardOffset -= 10 * common.DecimalDigits
} else if lessMaxAwardCount+int(awardCount) < lessAwardCount {
awardOffset += 10 * common.DecimalDigits
}
goto try
}
var nextTicket = ticket
if len(tickets) > nextIdx && nextIdx != -1 {
nextTicket = tickets[nextIdx]
}
if up {
call.AddUserDiscountTicket(a.UID, ticket.DiscountAmount, ticket.RechargeAmount, -1, 0, false)
call.SendMailWithContent(a.UID, call.SystemTitle, fmt.Sprintf(call.EmailDiscount, ticket.DiscountAmount/common.DecimalDigits, ticket.RechargeAmount/common.DecimalDigits))
resp.DiscountTicket = ticket.DiscountAmount
resp.Amount = ticket.RechargeAmount
} else if nextTicket.ID > 0 {
call.AddUserDiscountTicket(a.UID, nextTicket.DiscountAmount, nextTicket.RechargeAmount, -1, 1, false)
call.SendMailWithContent(a.UID, call.SystemTitle, fmt.Sprintf(call.EmailDiscount, ticket.DiscountAmount/common.DecimalDigits, ticket.RechargeAmount/common.DecimalDigits))
resp.DiscountTicket = nextTicket.DiscountAmount
resp.Amount = nextTicket.RechargeAmount
}
log.Error("uid:%d weekCard draw err, lessAward:%d lessMinAward:%d lessMaxAward:%d | awardCount:%d awardOffset:%d", uid, lessAwardCount, lessMinAwardCount, lessMaxAwardCount, awardCount, awardOffset)
a.Code = values.CodeRetry
return
}
}
resource := common.CurrencyResourceWeekCard
if card.Day > 0 {
resource = common.CurrencyResourceBonus
}
resp.Reward = reward
if reward > 0 {
call.UpdateCurrencyPro(&common.UpdateCurrency{
CurrencyBalance: &common.CurrencyBalance{
UID: a.UID,
Type: common.CurrencyINR,
Value: reward,
Event: common.CurrencyEventActivityWeekCard,
ChannelID: a.Channel,
NeedBet: call.GetConfigCurrencyResourceNeedBet(resource, reward),
},
})
if int(awardCount)+weekCardData.AwardTotal > maxAwardCount {
awardCount = int64(maxAwardCount - weekCardData.AwardTotal)
}
if awardCount <= 0 {
a.Code = values.CodeRetry
return
}
_, err = call.UpdateCurrencyPro(&common.UpdateCurrency{
CurrencyBalance: &common.CurrencyBalance{
UID: a.UID,
Type: common.CurrencyINR,
Value: awardCount,
Event: common.CurrencyEventActivityWeekCard,
ChannelID: a.Channel,
NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, awardCount, configWeekCard.BetMultiples),
},
})
if err != nil {
log.Error("update currency err, %s", err.Error())
return
}
updates := make(map[string]interface{})
if req.Index == 7 {
updates["begin_at"] = 0
updates["award_times"] = 0
updates["award_at"] = 0
updates["award_total"] = 0
updates["card_price"] = 0
updates["award_total_history"] = gorm.Expr("`award_total_history` + ?", awardCount)
} else {
updates["award_total"] = gorm.Expr("award_total + ?", awardCount)
updates["award_times"] = gorm.Expr("`award_times` + ?", 1)
updates["award_at"] = now.Unix()
updates["award_total_history"] = gorm.Expr("`award_total_history` + ?", awardCount)
}
err = db.Mysql().C().Model(&common.WeekCardData{}).Where("id = ?", weekCardData.ID).Updates(updates).Error
if err != nil {
log.Error("update week card data err, %s", err.Error())
}
call.PushRed(a.UID, pb.RedPointModule_RedPointWeekCard, 0)
call.UploadActivityData(a.UID, common.ActivityIDSign, common.ActivityDataJoin, reward)
resp.Reward = awardCount
return
}

@ -83,6 +83,8 @@ type BetReq struct {
SessionID string // 轮次id
Time int64
VoidType int64 // 注单无效原因
// todo
IsFinish int // (为0不处理,1:未结束,2:结束)
// SettleWithoutBet bool // 如果为true,代表结算的时候settle值为玩家实际加减值,不需要扣除下注
}

@ -3,12 +3,6 @@ package sn
// Success Codes
const (
CodeSuccess = 0 // 操作成功
SnAccount = "wjA77Game_N601"
DefaultLanguage = "en"
AgentId = 320
SnId = 135
SignKey = "2e0af20e8f0444a7decde7ae4c382dec"
)
// Request Error Codes

@ -25,12 +25,24 @@ func (s *Sub) Init() {
API = APITest
APICreate = APICreateUserTest
APIControl = APIControlTest
AgentMap = AgentMapTest
SnAccount = TestSnAccount
DefaultLanguage = TestDefaultLanguage
ApiKey = TestApiKey
WalletKey = TestWalletKey
ControlKey = TestControlKey
AgentId = TestAgentId
SnId = TestSnId
if config.GetBase().Release {
API = APIRlease
APICreate = APICreateUserRlease
APIControl = APIControlRlease
AgentMap = AgentMapRelease
SnAccount = ReleaseSnAccount
DefaultLanguage = ReleaseDefaultLanguage
ApiKey = ReleaseApiKey
WalletKey = ReleaseWalletKey
ControlKey = ReleaseControlKey
AgentId = ReleaseAgentId
SnId = ReleaseSnId
}
}
@ -105,7 +117,7 @@ func (s *Sub) EnterGame() string {
reqBody, _ := json.Marshal(req)
var tmpValue map[string]interface{}
json.Unmarshal(reqBody, &tmpValue)
req.Sign = GeneratedSign(tmpValue, SignKey)
req.Sign = GeneratedSign(tmpValue, ApiKey)
var resp EnterResp
err := util.HttpPost(API, req, &resp, nil)
@ -143,7 +155,7 @@ func (s *Sub) createUser() error {
reqBody, _ := json.Marshal(req)
var tmpValue map[string]interface{}
json.Unmarshal(reqBody, &tmpValue)
req.Sign = GeneratedSign(tmpValue, SignKey)
req.Sign = GeneratedSign(tmpValue, ApiKey)
var resp CreateUserResp
err := util.HttpPost(APICreate, req, &resp, nil)

@ -40,7 +40,8 @@ func GetBalance(c *gin.Context) {
resp.Code = INVALIDREQUESTERR
return
}
log.Debug("sn get balance:%s", string(body))
account := c.GetHeader("account")
log.Debug("sn get balance, %s:%s", account, string(body))
err = json.Unmarshal(body, &req)
if err != nil {
log.Error("unmarshal err, %s", err.Error())
@ -48,7 +49,6 @@ func GetBalance(c *gin.Context) {
return
}
account := c.GetHeader("account")
headers := make(map[string]string)
for key, values := range c.Request.Header {
if len(values) > 0 {
@ -61,7 +61,7 @@ func GetBalance(c *gin.Context) {
newBody, _ := json.Marshal(req)
var tmpValue map[string]interface{}
json.Unmarshal(newBody, &tmpValue)
tmpSign := GeneratedSign(tmpValue, SignKey)
tmpSign := GeneratedSign(tmpValue, WalletKey)
if tmpSign != req.Sign {
log.Error("sign is wrong, %+v", req)
resp.Code = INVALIDREQUESTERR
@ -84,7 +84,7 @@ func GetBalance(c *gin.Context) {
resp.Msg = "success"
resp.Data.Chips = int(call.GetUserCurrencyFloat(uid, common.CurrencyType(currency), 0) * common.DecimalDigits)
log.Debug("GetBalanceResp:%+v", resp)
log.Debug("sn getBalanceResp, %s:%+v", account, resp)
}
func GameBet(c *gin.Context) {
@ -101,14 +101,14 @@ func GameBet(c *gin.Context) {
resp.Code = INVALIDREQUESTERR
return
}
log.Debug("sn game bet:%s", string(body))
account := c.GetHeader("account")
log.Debug("sn game bet, %s:%s", account, string(body))
err = json.Unmarshal(body, &req)
if err != nil {
log.Error("unmarshal err, %s", err.Error())
resp.Code = INVALIDREQUESTERR
return
}
account := c.GetHeader("account")
headers := make(map[string]string)
for key, values := range c.Request.Header {
if len(values) > 0 {
@ -126,7 +126,7 @@ func GameBet(c *gin.Context) {
resp.Code = INVALIDREQUESTERR
return
}
tmpSign := GeneratedSign(tmpValue, SignKey)
tmpSign := GeneratedSign(tmpValue, WalletKey)
if tmpSign != req.Sign {
log.Error("sign is wrong, %+v", req)
resp.Code = INVALIDREQUESTERR
@ -158,8 +158,8 @@ func GameBet(c *gin.Context) {
GameID: req.GameId,
GameName: configGame.GameCode,
Provider: provider,
BetID: req.BetId,
SessionID: req.OrderId,
BetID: req.OrderId,
SessionID: req.BetId,
Time: now,
BetAmount: int64(betAmount),
TurnOver: int64(betAmount),
@ -180,7 +180,7 @@ func GameBet(c *gin.Context) {
resp.Data.DeductionAmount = betAmount
resp.Data.Chips = int(call.GetUserCurrencyFloat(uid, common.CurrencyType(0), 0) * common.DecimalDigits)
resp.Msg = "success"
log.Debug("GameBetResp:%+v", resp)
log.Debug("sn gameBetResp, %s:%+v", account, resp)
a.Data = resp
}
@ -198,14 +198,14 @@ func Settle(c *gin.Context) {
resp.Code = INVALIDREQUESTERR
return
}
log.Debug("sn settle:%s", string(body))
account := c.GetHeader("account")
log.Debug("sn settle, %s:%s", account, string(body))
err = json.Unmarshal(body, &req)
if err != nil {
log.Error("unmarshal err, %s", err.Error())
resp.Code = INVALIDREQUESTERR
return
}
account := c.GetHeader("account")
headers := make(map[string]string)
for key, values := range c.Request.Header {
if len(values) > 0 {
@ -222,7 +222,7 @@ func Settle(c *gin.Context) {
resp.Code = INVALIDREQUESTERR
return
}
tmpSign := GeneratedSign(tmpValue, SignKey)
tmpSign := GeneratedSign(tmpValue, WalletKey)
if tmpSign != req.Sign {
log.Error("sign is wrong, %+v", req)
resp.Code = INVALIDREQUESTERR
@ -236,17 +236,23 @@ func Settle(c *gin.Context) {
return
}
provider := call.GetConfigGameProvider(common.ProviderSn)
{ // 订单是否合法
var betId string
if len(req.Details) > 0 {
betId = req.Details[0].BetId
}
{ // todo 订单是否合法
record := &common.ProviderBetRecord{
UID: uid,
Provider: provider.ProviderID,
Type: base.SessionTypeBet,
SessionID: req.OrderId,
SessionID: betId,
}
db.Mysql().Get(record)
if record.ID == 0 {
resp.Code = INVALIDREQUESTERR
resp.Data.Chips = int(call.GetUserCurrencyFloat(uid, common.CurrencyType(0), 0) * common.DecimalDigits)
log.Debug("sn settleResp, %s:%+v", account, resp)
return
}
}
@ -257,10 +263,7 @@ func Settle(c *gin.Context) {
resp.Code = INVALIDREQUESTERR
return
}
var betId string
if len(req.Details) > 0 {
betId = req.Details[0].BetId
}
settleAmount := int64(req.JpBonus + req.BackAmount)
betReq := &base.BetReq{
UID: uid,
@ -269,13 +272,18 @@ func Settle(c *gin.Context) {
GameID: req.GameId,
GameName: configGame.GameCode,
Provider: provider,
BetID: betId,
SessionID: req.OrderId,
BetID: req.OrderId,
SessionID: betId,
Time: now,
}
isFinish := 1
for _, detail := range req.Details {
settleAmount += int64(detail.WinAmount)
if detail.IsFinish {
isFinish = 2
}
}
betReq.IsFinish = isFinish
betReq.SettleAmount = settleAmount
betResp := base.SessionBet(betReq)
if betResp.Code != base.CodeOk {
@ -287,13 +295,13 @@ func Settle(c *gin.Context) {
} else {
resp.Msg = "operation failed."
}
log.Error("GameBetResp err:%v", resp.Code)
log.Error("sn gameBetResp err, %s:%+v", account, betResp)
return
}
resp.Data.Chips = int(call.GetUserCurrencyFloat(uid, common.CurrencyType(0), 0) * common.DecimalDigits)
resp.Msg = "success"
log.Debug("SettleResp:%+v", resp)
log.Debug("sn settleResp, %s:%+v", account, resp)
a.Data = resp
}
@ -311,14 +319,14 @@ func Rollback(c *gin.Context) {
resp.Code = INVALIDREQUESTERR
return
}
log.Debug("sn rollback:%s", string(body))
account := c.GetHeader("account")
log.Debug("sn rollback, %s:%s", account, string(body))
err = json.Unmarshal(body, &req)
if err != nil {
log.Error("unmarshal err, %s", err.Error())
resp.Code = INVALIDREQUESTERR
return
}
account := c.GetHeader("account")
headers := make(map[string]string)
for key, values := range c.Request.Header {
if len(values) > 0 {
@ -335,7 +343,7 @@ func Rollback(c *gin.Context) {
resp.Code = INVALIDREQUESTERR
return
}
tmpSign := GeneratedSign(tmpValue, SignKey)
tmpSign := GeneratedSign(tmpValue, WalletKey)
if tmpSign != req.Sign {
log.Error("sign is wrong, %+v", req)
resp.Code = INVALIDREQUESTERR
@ -399,7 +407,7 @@ func Rollback(c *gin.Context) {
}
resp.Data.Chips = int(call.GetUserCurrencyFloat(uid, common.CurrencyType(0), 0) * common.DecimalDigits)
resp.Msg = "success"
log.Debug("rollback:%+v", resp)
log.Debug("sn rollback, %s:%+v", account, resp)
a.Data = resp
}
@ -417,14 +425,14 @@ func Update(c *gin.Context) {
resp.Code = INVALIDREQUESTERR
return
}
log.Debug("sn update:%s", string(body))
account := c.GetHeader("account")
log.Debug("sn update, %s:%s", account, string(body))
err = json.Unmarshal(body, &req)
if err != nil {
log.Error("unmarshal err, %s", err.Error())
resp.Code = INVALIDREQUESTERR
return
}
account := c.GetHeader("account")
headers := make(map[string]string)
for key, values := range c.Request.Header {
if len(values) > 0 {
@ -441,7 +449,7 @@ func Update(c *gin.Context) {
resp.Code = INVALIDREQUESTERR
return
}
tmpSign := GeneratedSign(tmpValue, SignKey)
tmpSign := GeneratedSign(tmpValue, WalletKey)
if tmpSign != req.Sign {
log.Error("sign is wrong, %+v", req)
resp.Code = INVALIDREQUESTERR
@ -529,7 +537,7 @@ func Update(c *gin.Context) {
}
resp.Data.Chips = int(call.GetUserCurrencyFloat(uid, common.CurrencyType(0), 0) * common.DecimalDigits)
resp.Msg = "success"
log.Debug("rollback:%+v", resp)
log.Debug("sn rollback, %s:%+v", account, resp)
a.Data = resp
}
@ -547,14 +555,14 @@ func GameControlCallback(c *gin.Context) {
resp.Code = INVALIDREQUESTERR
return
}
log.Debug("sn gameControlCallback:%s", string(body))
account := c.GetHeader("account")
log.Debug("sn gameControlCallback, %s:%s", account, string(body))
err = json.Unmarshal(body, &req)
if err != nil {
log.Error("unmarshal err, %s", err.Error())
resp.Code = INVALIDREQUESTERR
return
}
account := c.GetHeader("account")
headers := make(map[string]string)
for key, values := range c.Request.Header {
if len(values) > 0 {
@ -571,7 +579,7 @@ func GameControlCallback(c *gin.Context) {
resp.Code = INVALIDREQUESTERR
return
}
tmpSign := GeneratedSign(tmpValue, SignKey)
tmpSign := GeneratedSign(tmpValue, ControlKey)
if tmpSign != req.Sign {
log.Error("sign is wrong, %+v", req)
resp.Code = INVALIDREQUESTERR
@ -624,7 +632,7 @@ func Control(uid int, controlId int) error {
reqBody, _ := json.Marshal(req)
var tmpValue map[string]interface{}
json.Unmarshal(reqBody, &tmpValue)
req.Sign = GeneratedSign(tmpValue, SignKey)
req.Sign = GeneratedSign(tmpValue, ApiKey)
var resp ControlResp
err := util.HttpPost(APIControl, req, &resp, nil)

@ -11,18 +11,30 @@ import (
)
const (
APIRlease = "https://api.nbetps.com/v2/launch_game"
APIRlease = "https://ve-api.1betnbet.com/v2/launch_game"
APITest = "https://api.nbetps.com/v2/launch_game"
APICreateUserRlease = "https://api.nbetps.com/v1/create_user"
APICreateUserRlease = "https://ve-api.1betnbet.com/v1/create_user"
APICreateUserTest = "https://api.nbetps.com/v1/create_user"
APIControlRlease = "https://api.nbetps.com/v1/control"
APIControlRlease = "https://ve-api.1betnbet.com/v1/control"
APIControlTest = "https://api.nbetps.com/v1/control"
// LaunchGameURL = "/api/usr/ingame"
// GetGameListURL = "/api/game/loadlist"
// Lang = "hi"
TestSnAccount = "wjA77Game_N601"
TestDefaultLanguage = "en"
TestAgentId = 320
TestSnId = 135
TestApiKey = "2e0af20e8f0444a7decde7ae4c382dec"
TestWalletKey = "2e0af20e8f0444a7decde7ae4c382dec"
TestControlKey = "2e0af20e8f0444a7decde7ae4c382dec"
ReleaseSnAccount = "veveA77Game_603"
ReleaseDefaultLanguage = "en"
ReleaseAgentId = 338
ReleaseSnId = 141
ReleaseApiKey = "f5b7582b32420f7a602b47c0e99a69b7"
ReleaseWalletKey = "2e0af20e8f0444a7decde7ae4c382dec"
ReleaseControlKey = "2e0af20e8f0444a7decde7ae4c382dec"
)
type Agent struct {
@ -31,18 +43,11 @@ type Agent struct {
}
var (
API = ""
APICreate = ""
APIControl = ""
AgentMap Agent
AgentMapTest = Agent{
MchId: "slotgolden777test",
Key: "010804d1-7bbf-4ed5-9b50-60fbd2b22e34",
}
AgentMapRelease = Agent{
MchId: "slotgolden777",
Key: "ddeaeb76-5624-41fe-a6ea-7ad9307d7701",
}
API = ""
APICreate = ""
APIControl = ""
SnAccount, DefaultLanguage, ApiKey, WalletKey, ControlKey string
AgentId, SnId int
)
func getSignStr(str string, pass ...string) string {

@ -144,31 +144,28 @@ type OneWeekCard struct {
TotalReward int64
}
type WeekCardInfo struct {
Min int64
Val int64
Max int64
type WeekCardDay struct {
State int `json:"state"` // 0没领取,1可领取,2已经领取
Coin string `json:"coin"` // 金币数值
}
type ActivityWeekCardInfoResp struct {
RewardList []WeekCardInfo // 奖励列表
RewardDay int // 领取天数
Status bool // 是否可领取
RechargeStatus bool // 是否充值
ChannelList []*common.ConfigPayChannels
ProductList []*common.ConfigPayProduct
type WeekCardInfoResp struct {
List []WeekCardDay `json:"list"` // 奖励配置
Amount int64 `json:"tAmount"` // 周卡价格
IsUnlock bool `json:"isUnlock"` // 是否解锁
Time int64 `json:"time"` // 下次领取任务倒计时/可领取奖励
ProductId int `json:"productId"` // 商品id
}
// Level 领取的周卡的等级
type ActivityWeekCardDrawReq struct {
Level int
type WeekCardDrawReq struct {
Index int `json:"index"`
}
// Reward 获得的奖励
// DiscountTicket 获得的折扣券折扣
type ActivityWeekCardDrawResp struct {
Reward int64
DiscountTicket int64
Amount int64
type WeekCardDrawResp struct {
Reward int64
}
// Spin 可转次数

@ -56,9 +56,10 @@ type RechargeReq struct {
DiscountTicketId int `json:"DiscountTicketId"` // 折扣券ID
Amount int64 `json:"amount"`
Bonus bool `json:"bonus"`
ProductID int `json:"productId"`
Amount int64 `json:"amount"`
Bonus bool `json:"bonus"`
ProductID int `json:"productId"`
ActivityID int `json:"activityID"`
UserName *string `json:"userName"` // 用户姓名
UserPhone string `json:"userPhone"` // 用户手机号

Loading…
Cancel
Save