日返活动,红点推送

dev_aagame_provider
zhora 1 month ago
parent 14cd5f90c8
commit 7143fd807f
  1. 25
      call/activity.go
  2. 15
      call/pay.go
  3. 68
      call/redpoint.go
  4. 18
      call/reload.go
  5. 10
      call/user.go
  6. 4
      common/activity.go
  7. 5
      common/redis_keys.go
  8. 2
      modules/hall/player.go
  9. 68
      modules/web/handler/activity.go
  10. 10
      modules/web/handler/vip.go
  11. 17
      modules/web/values/activity.go

@ -93,6 +93,19 @@ func GetUserFirstRechargeBackData(uid int) *common.ActivityFirstRechargeBackData
return data return data
} }
func GetFirstRechargeBackSumAmount() int64 {
var awardSum *int64
err := db.Mysql().C().Model(&common.ActivityFirstRechargeBackData{}).Select("sum(reward) as reward").Where("reward > 0 and reward_time > 0").Scan(&awardSum).Error
if err != nil {
log.Error("get sum of amount err, %s", err.Error())
return 0
}
if awardSum == nil {
return 0
}
return *awardSum
}
func ShouldShowActivityFirstRechargeBack(uid int) bool { func ShouldShowActivityFirstRechargeBack(uid int) bool {
if !IsActivityValid(common.ActivityIDFirstRechargeBack) { if !IsActivityValid(common.ActivityIDFirstRechargeBack) {
return false return false
@ -104,15 +117,13 @@ func ShouldShowActivityFirstRechargeBack(uid int) bool {
conf := GetConfigActivityFirstRechargeBack() conf := GetConfigActivityFirstRechargeBack()
p, _ := GetUserXInfo(uid, "birth") p, _ := GetUserXInfo(uid, "birth")
data := GetUserFirstRechargeBackData(uid) data := GetUserFirstRechargeBackData(uid)
val := int64(0) if now > p.Birth+conf.CD { // 超时
if data.RechargeTime > 0 { if data.RewardTime == 0 && data.Reward > 0 { // 有奖励 未领取
rechargeInfo := GetRechargeInfo(uid) return true
val = data.Amount - GetUserCurrencyTotal(uid, common.CurrencyINR) + rechargeInfo.TotalWithdrawing
if val < 0 {
val = 0
} }
return false
} }
if now >= p.Birth+conf.CD && val == 0 || data.RewardTime > 0 { if data.RewardTime > 0 { // 已经领奖
return false return false
} }
return true return true

@ -616,21 +616,18 @@ func ActivityFirstRechargeBack(r *common.RechargeOrder) {
p, _ := GetUserXInfo(r.UID, "birth") p, _ := GetUserXInfo(r.UID, "birth")
rechargeBackData := GetUserFirstRechargeBackData(r.UID) rechargeBackData := GetUserFirstRechargeBackData(r.UID)
now := time.Now().Unix() now := time.Now().Unix()
// 注册多少时间内 rechargeInfo := GetRechargeInfo(r.UID)
if now <= p.Birth+conf.CD { // 注册多少时间内,并且累计充值额度大于配置值
log.Debug("uid:%d now:%d, p.birth+conf.cd:%d total:%d min:%d", r.UID, now, p.Birth+conf.CD, rechargeInfo.TotalRecharge, conf.MinRecharge)
if now <= p.Birth+conf.CD && rechargeInfo.TotalRecharge >= conf.MinRecharge {
if rechargeBackData.Amount == 0 { if rechargeBackData.Amount == 0 {
data := &common.ActivityFirstRechargeBackData{UID: r.UID, Amount: r.Amount} data := &common.ActivityFirstRechargeBackData{
if r.Amount >= conf.MinRecharge { UID: r.UID, Amount: rechargeInfo.TotalRecharge, RechargeTime: now}
data.RechargeTime = now
}
db.Mysql().Create(data) db.Mysql().Create(data)
} else { } else {
update := map[string]interface{}{ update := map[string]interface{}{
"amount": gorm.Expr("amount + ?", r.Amount), "amount": gorm.Expr("amount + ?", r.Amount),
} }
if rechargeBackData.Amount+r.Amount >= conf.MinRecharge {
update["recharge_time"] = time.Now().Unix()
}
err := db.Mysql().Update(&common.ActivityFirstRechargeBackData{UID: r.UID}, update) err := db.Mysql().Update(&common.ActivityFirstRechargeBackData{UID: r.UID}, update)
if err != nil { if err != nil {
log.Error("err:%v", err) log.Error("err:%v", err)

@ -5,6 +5,8 @@ import (
"server/common" "server/common"
"server/db" "server/db"
"server/pb" "server/pb"
"server/util"
"time"
) )
const ( const (
@ -86,6 +88,72 @@ func PushMailRed(uid int) {
//} //}
} }
func PushVipRed(uid int) {
vipInfo := GetVIP(uid)
configVip := GetConfigVIPWithout0()
var levelBonus []int
for level := 1; level <= vipInfo.Level; level++ {
flag := int64(1 << level)
if vipInfo.Draws&flag == 0 {
levelBonus = append(levelBonus, level)
}
}
con := GetConfigVIPByLevel(vipInfo.Level)
if con == nil {
return
}
var weekBonus bool
if con.BonusWeek != 0 { // 有周奖励
if vipInfo.WeekBonusAt == 0 { // 可以领取
weekBonus = true
} else {
weekBonus = !util.IsSameWeek(time.Now().Unix(), vipInfo.WeekBonusAt)
}
}
var award bool
for _, v := range configVip {
if util.SliceContain(levelBonus, v.Level) && v.Bonus > 0 {
award = true
break
}
if v.Level == vipInfo.Level {
if weekBonus && v.BonusWeek > 0 {
award = true
break
}
}
}
if award {
PushRed(uid, pb.RedPointModule_RedPointVipReward, 1)
}
}
func PushWeekCard(uid int) {
cons := GetConfigWeekCard()
if cons == nil {
return
}
weekCardData, err := GetWeekCardData(uid)
if err != nil {
return
}
if weekCardData.ID == 0 {
return
}
now := time.Now()
var award bool
if weekCardData.ID != 0 && weekCardData.BeginAt != 0 { // 已经购买周卡的情况下
if !util.IsSameDayTimeStamp(now.Unix(), weekCardData.AwardAt) {
award = true
}
}
if award {
PushRed(uid, pb.RedPointModule_RedPointWeekCard, 1)
}
}
func PushRed(uid int, module pb.RedPointModule, num uint32) { func PushRed(uid int, module pb.RedPointModule, num uint32) {
one := new(pb.RedPoint) one := new(pb.RedPoint)
one.List = append(one.List, &pb.RedInfo{ModuleName: module, Num: num}) one.List = append(one.List, &pb.RedInfo{ModuleName: module, Num: num})

@ -331,15 +331,15 @@ func CommonReload(c map[int][]func(*pb.ReloadGameConfig) error) {
return nil return nil
}} }}
} }
//if _, ok := c[common.ReloadConfigActivityFirstRechargeBack]; !ok { if _, ok := c[common.ReloadConfigActivityFirstRechargeBack]; !ok {
// c[common.ReloadConfigActivityFirstRechargeBack] = []func(*pb.ReloadGameConfig) error{func(rgc *pb.ReloadGameConfig) error { c[common.ReloadConfigActivityFirstRechargeBack] = []func(*pb.ReloadGameConfig) error{func(rgc *pb.ReloadGameConfig) error {
// if err := LoadConfigActivityFirstRechargeBack(); err != nil { if err := LoadConfigActivityFirstRechargeBack(); err != nil {
// log.Error("error : [%s]", err.Error()) log.Error("error : [%s]", err.Error())
// return err return err
// } }
// return nil return nil
// }} }}
//} }
if _, ok := c[common.ReloadConfigBanner]; !ok { if _, ok := c[common.ReloadConfigBanner]; !ok {
c[common.ReloadConfigBanner] = []func(*pb.ReloadGameConfig) error{func(rgc *pb.ReloadGameConfig) error { c[common.ReloadConfigBanner] = []func(*pb.ReloadGameConfig) error{func(rgc *pb.ReloadGameConfig) error {
if err := LoadConfigBanner(); err != nil { if err := LoadConfigBanner(); err != nil {

@ -305,7 +305,11 @@ func GetVIP(uid int) *common.VipData {
db.Mysql().Get(re) db.Mysql().Get(re)
data := &common.VipData{UID: uid} data := &common.VipData{UID: uid}
db.Mysql().Get(data) db.Mysql().Get(data)
var updateExp bool
if data.Exp != re.TotalRecharge {
data.Exp = re.TotalRecharge data.Exp = re.TotalRecharge
updateExp = true
}
if data.ID == 0 { if data.ID == 0 {
if data.Exp > 0 { if data.Exp > 0 {
cons := GetConfigVIP() cons := GetConfigVIP()
@ -321,9 +325,9 @@ func GetVIP(uid int) *common.VipData {
}) })
} else { } else {
level := GetVipLevel(data.Exp, data.Bet) level := GetVipLevel(data.Exp, data.Bet)
if level != data.Level { if level != data.Level || updateExp {
data.Level = level data.Level = level
db.Mysql().UpdateRes(&common.VipData{UID: uid}, map[string]interface{}{"level": level}) db.Mysql().UpdateRes(&common.VipData{UID: uid}, map[string]interface{}{"level": level, "exp": data.Exp})
} }
} }
return data return data
@ -837,7 +841,7 @@ func GetRtpControlV1(uid int, withdrawPer ...*int) int {
withdrawRechargePer = (rechargeInfo.TotalWithdraw + rechargeInfo.WithdrawingCash + cash) * 100 / rechargeInfo.TotalRecharge withdrawRechargePer = (rechargeInfo.TotalWithdraw + rechargeInfo.WithdrawingCash + cash) * 100 / rechargeInfo.TotalRecharge
} }
playerProfile := GetPlayerProfile(uid) playerProfile := GetPlayerProfile(uid)
if playerProfile != nil { if playerProfile != nil && playerProfile.TotalBet > 0 {
personalRtp = playerProfile.TotalSettle * 100 / playerProfile.TotalBet personalRtp = playerProfile.TotalSettle * 100 / playerProfile.TotalBet
} }
if rechargeInfo.FirstRecharge == 0 { // 找表 if rechargeInfo.FirstRecharge == 0 { // 找表

@ -192,9 +192,9 @@ const (
// ConfigActivityFirstRechargeBack 首日充值返还 // ConfigActivityFirstRechargeBack 首日充值返还
type ConfigActivityFirstRechargeBack struct { type ConfigActivityFirstRechargeBack struct {
ID int `gorm:"primary_key;AUTO_INCREMENT;column:id" json:"ID"` ID int `gorm:"primary_key;AUTO_INCREMENT;column:id" json:"ID"`
MinRecharge int64 `gorm:"column:min_recharge;type:bigint(20);default:10000000000;comment:最低充值额度" web:"min_recharge"` MinRecharge int64 `gorm:"column:min_recharge;type:bigint(20);default:30000;comment:最低充值额度" web:"min_recharge"`
MaxBack int64 `gorm:"column:max_back;type:bigint(20);default:0;comment:最大返还额度比例" web:"max_back"` MaxBack int64 `gorm:"column:max_back;type:bigint(20);default:0;comment:最大返还额度比例" web:"max_back"`
CD int64 `gorm:"column:cd;type:bigint(20);default:0;comment:持续时间" web:"cd"` CD int64 `gorm:"column:cd;type:bigint(20);default:0;comment:注册时间内(单位s)" web:"cd"`
} }
func (c *ConfigActivityFirstRechargeBack) TableName() string { func (c *ConfigActivityFirstRechargeBack) TableName() string {

@ -53,6 +53,7 @@ const (
RedisKeyShare = "share" RedisKeyShare = "share"
RedisKeyWeekCard = "week_card" RedisKeyWeekCard = "week_card"
RedisKeyUserPay = "user_pay" RedisKeyUserPay = "user_pay"
RedisKeyFirstRechargeBack = "first_recharge_back"
) )
const ( const (
@ -224,3 +225,7 @@ func GetRedisKeyWeekCard(uid int) string {
func GetRedisKeyUserPay(payChannelId, uid, amount int) string { func GetRedisKeyUserPay(payChannelId, uid, amount int) string {
return fmt.Sprintf("%v:%d:%d:%v", RedisKeyUserPay, payChannelId, amount, uid) return fmt.Sprintf("%v:%d:%d:%v", RedisKeyUserPay, payChannelId, amount, uid)
} }
func GetRedisKeyFirstRechargeBack(uid int) string {
return fmt.Sprintf("%v:%v", RedisKeyFirstRechargeBack, uid)
}

@ -22,6 +22,8 @@ type player struct {
func (p *player) PushRedPoint() { func (p *player) PushRedPoint() {
call.PushRed(p.db.Id, pb.RedPointModule_RedPointFreeCash, uint32(1)) call.PushRed(p.db.Id, pb.RedPointModule_RedPointFreeCash, uint32(1))
call.PushMailRed(p.db.Id) call.PushMailRed(p.db.Id)
call.PushVipRed(p.db.Id)
call.PushWeekCard(p.db.Id)
} }
// func (p *player) Send(topic string, data proto.Message) { // func (p *player) Send(topic string, data proto.Message) {

@ -635,45 +635,52 @@ func ActivityFirstRechargeBackInfo(c *gin.Context) {
conf := call.GetConfigActivityFirstRechargeBack() conf := call.GetConfigActivityFirstRechargeBack()
a.Data = resp a.Data = resp
data := call.GetUserFirstRechargeBackData(a.UID) data := call.GetUserFirstRechargeBackData(a.UID)
resp.NeedRechargeAmount = conf.MinRecharge / common.DecimalDigits rechargeInfo := call.GetRechargeInfo(a.UID)
resp.ProductList = call.GetConfigPayProductByActivityID(common.ActivityIDFirstRechargeBack) resp.MinRechargeAmount = conf.MinRecharge
resp.Recharge = data.Amount resp.TotalRechargeAmount = rechargeInfo.TotalRecharge
resp.PayAmount = data.Amount
resp.BackPer = conf.MaxBack resp.BackPer = conf.MaxBack
resp.ChannelList = call.GetConfigPayChannelsByID(common.CurrencyINR) resp.RechargeAmount = data.Amount
p, _ := call.GetUserXInfo(a.UID, "birth") p, _ := call.GetUserXInfo(a.UID, "birth")
resp.DrawTime = p.Birth + conf.CD now := time.Now()
rechargeInfo := call.GetRechargeInfo(a.UID) if v := p.Birth + conf.CD - now.Unix(); v > 0 {
if data.RechargeTime == 0 { resp.Countdown = v
resp.CanRecharge = true }
if resp.MinRechargeAmount > resp.TotalRechargeAmount { // 未解锁给默认值
resp.BackAmount = 6528600 + call.GetFirstRechargeBackSumAmount()
}
if data.RechargeTime == 0 { // 无充值
return return
} }
if data.Reward == 0 { if data.RewardTime > 0 { // 已领取
resp.Draw = 2
return
}
if data.Reward == 0 { // 计算奖励
val := data.Amount - call.GetUserCurrencyTotal(a.UID, common.CurrencyINR) - rechargeInfo.WithdrawingCash val := data.Amount - call.GetUserCurrencyTotal(a.UID, common.CurrencyINR) - rechargeInfo.WithdrawingCash
if val < 0 { if val < 0 {
val = 0 val = 0
} }
val = val * conf.MaxBack / 100 val = val * conf.MaxBack / 100
now := time.Now().Unix() resp.BackAmount = val
if now >= p.Birth+conf.CD && data.Reward == 0 && data.RechargeTime == 0 { if resp.Countdown == 0 { // 活动结束更新奖励
update := map[string]interface{}{ update := map[string]interface{}{
"reward": val, "reward": val,
} }
if val == 0 { if val == 0 {
data.RechargeTime = now update["reward_time"] = now.Unix()
update["reward_time"] = now
} }
db.Mysql().Update(&common.ActivityFirstRechargeBackData{UID: a.UID}, update) db.Mysql().Update(&common.ActivityFirstRechargeBackData{UID: a.UID}, update)
} }
data.Reward = val } else {
resp.BackAmount = data.Reward
} }
if data.RewardTime > 0 { if resp.Countdown == 0 && resp.BackAmount > 0 {
resp.Draw = true resp.Draw = 1
} }
resp.Back = data.Reward if resp.Draw == 1 {
if !resp.Draw {
//call.PushRed(a.UID, pb.RedPointModule_RedPointFirstRecharge, 1) //call.PushRed(a.UID, pb.RedPointModule_RedPointFirstRecharge, 1)
} }
return
} }
func ActivityFirstRechargeBackDraw(c *gin.Context) { func ActivityFirstRechargeBackDraw(c *gin.Context) {
@ -684,12 +691,20 @@ func ActivityFirstRechargeBackDraw(c *gin.Context) {
if !a.CheckActivityExpire(common.ActivityIDFirstRechargeBack) { if !a.CheckActivityExpire(common.ActivityIDFirstRechargeBack) {
return return
} }
if !db.Redis().Lock(common.GetRedisKeyFirstRechargeBack(a.UID)) {
a.Code = values.CodeRetry
return
}
defer func() {
db.Redis().UnLock(common.GetRedisKeyFirstRechargeBack(a.UID))
}()
resp := new(values.ActivityFirstRechargeBackDrawResp) resp := new(values.ActivityFirstRechargeBackDrawResp)
a.Data = resp a.Data = resp
conf := call.GetConfigActivityFirstRechargeBack() conf := call.GetConfigActivityFirstRechargeBack()
data := call.GetUserFirstRechargeBackData(a.UID) data := call.GetUserFirstRechargeBackData(a.UID)
p, _ := call.GetUserXInfo(a.UID, "birth") p, _ := call.GetUserXInfo(a.UID, "birth")
if time.Now().Unix()-p.Birth < conf.CD { now := time.Now()
if now.Unix()-p.Birth < conf.CD {
log.Error("not ActivityFirstRechargeBackDraw time:%+v", data) log.Error("not ActivityFirstRechargeBackDraw time:%+v", data)
a.Code = values.CodeRetry a.Code = values.CodeRetry
a.Msg = "Unarrived time" a.Msg = "Unarrived time"
@ -700,12 +715,20 @@ func ActivityFirstRechargeBackDraw(c *gin.Context) {
a.Msg = "Award claimed" a.Msg = "Award claimed"
return return
} }
rows, err := db.Mysql().UpdateRes(&common.ActivityFirstRechargeBackData{UID: a.UID}, map[string]interface{}{"reward_time": time.Now().Unix()}) rechargeInfo := call.GetRechargeInfo(a.UID)
val := data.Amount - call.GetUserCurrencyTotal(a.UID, common.CurrencyINR) - rechargeInfo.WithdrawingCash
if val < 0 {
val = 0
}
val = val * conf.MaxBack / 100
rows, err := db.Mysql().UpdateRes(&common.ActivityFirstRechargeBackData{UID: a.UID}, map[string]interface{}{
"reward_time": now.Unix(),
"reward": val,
})
if err != nil || rows == 0 { if err != nil || rows == 0 {
a.Code = values.CodeRetry a.Code = values.CodeRetry
return return
} }
val := data.Reward
_, err = call.UpdateCurrencyPro(&common.UpdateCurrency{ _, err = call.UpdateCurrencyPro(&common.UpdateCurrency{
CurrencyBalance: &common.CurrencyBalance{ CurrencyBalance: &common.CurrencyBalance{
UID: a.UID, UID: a.UID,
@ -713,6 +736,7 @@ func ActivityFirstRechargeBackDraw(c *gin.Context) {
Type: common.CurrencyINR, Type: common.CurrencyINR,
Value: val, Value: val,
Event: common.CurrencyEventActivityFirstRechargeBack, Event: common.CurrencyEventActivityFirstRechargeBack,
NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, val),
}, },
}) })
if err != nil { if err != nil {

@ -60,7 +60,7 @@ func GetVipInfoNew(c *gin.Context) {
} }
for _, v := range resp.List { for _, v := range resp.List {
if util.SliceContain(levelBonus, v.Level) { if util.SliceContain(levelBonus, v.Level) && v.Bonus > 0 {
// 可领取 // 可领取
v.BonusDraw = 1 v.BonusDraw = 1
} else { } else {
@ -69,7 +69,7 @@ func GetVipInfoNew(c *gin.Context) {
} }
} }
if v.Level == resp.Info.Level { if v.Level == resp.Info.Level {
if weekBonus { if weekBonus && v.BonusWeek > 0 {
v.BonusWeekDraw = 1 v.BonusWeekDraw = 1
} else { } else {
v.BonusWeekDraw = 2 v.BonusWeekDraw = 2
@ -168,10 +168,10 @@ func GetVipInfo(c *gin.Context) {
db.ES().QueryList(common.ESIndexBalance, req.Page, req.Num, q, &resp.CashbackList, "time", false) db.ES().QueryList(common.ESIndexBalance, req.Page, req.Num, q, &resp.CashbackList, "time", false)
reset = !util.IsSameDayTimeStamp(now.Unix(), resp.Info.ProfitTime) reset = !util.IsSameDayTimeStamp(now.Unix(), resp.Info.ProfitTime)
if reset && resp.Info.Cashback > 0 { if reset && resp.Info.Cashback > 0 {
call.PushRed(a.UID, pb.RedPointModule_RedPointVipReward, uint32(1)) //call.PushRed(a.UID, pb.RedPointModule_RedPointVipReward, uint32(1))
} }
if hasVipBonus(resp.Info) { if hasVipBonus(resp.Info) {
call.PushRed(a.UID, pb.RedPointModule_RedPointVipReward, uint32(1)) //call.PushRed(a.UID, pb.RedPointModule_RedPointVipReward, uint32(1))
} }
} }
@ -400,7 +400,7 @@ func DrawVipBonus(c *gin.Context) {
} }
vip = call.GetVIP(a.UID) vip = call.GetVIP(a.UID)
if !hasVipBonus(vip) { if !hasVipBonus(vip) {
call.PushRed(a.UID, pb.RedPointModule_RedPointVipReward, uint32(0)) //call.PushRed(a.UID, pb.RedPointModule_RedPointVipReward, uint32(0))
} }
} }

@ -47,16 +47,13 @@ type ActivityFreeSpinDrawResp struct {
// Recharge 充值总额 // Recharge 充值总额
// Back 可领取的总额 // Back 可领取的总额
type ActivityFirstRechargeBackInfoResp struct { type ActivityFirstRechargeBackInfoResp struct {
Recharge int64 BackAmount int64 // 返还金额
Back int64 BackPer int64 // 返还比例
BackPer int64 Draw int // 领取状态(0:无,1:可领,2:已领取)
CanRecharge bool TotalRechargeAmount int64 // 当前充值额度(玩家总充值)
PayAmount int64 // 支付金额 RechargeAmount int64 // 有效充值金额
DrawTime int64 // 领取时间 MinRechargeAmount int64 // 累计充值额度
Draw bool // 是否领取 Countdown int64 // 倒计时
NeedRechargeAmount int64 //
ChannelList []*common.ConfigPayChannels
ProductList []*common.ConfigPayProduct
} }
type ActivityFirstRechargeBackDrawResp struct { type ActivityFirstRechargeBackDrawResp struct {

Loading…
Cancel
Save