From 7143fd807f5143879bf87320374fcad21f5890d9 Mon Sep 17 00:00:00 2001 From: zhora Date: Fri, 26 Sep 2025 18:00:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E8=BF=94=E6=B4=BB=E5=8A=A8=EF=BC=8C?= =?UTF-8?q?=E7=BA=A2=E7=82=B9=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- call/activity.go | 25 ++++++++---- call/pay.go | 15 +++----- call/redpoint.go | 68 +++++++++++++++++++++++++++++++++ call/reload.go | 18 ++++----- call/user.go | 12 ++++-- common/activity.go | 4 +- common/redis_keys.go | 5 +++ modules/hall/player.go | 2 + modules/web/handler/activity.go | 68 ++++++++++++++++++++++----------- modules/web/handler/vip.go | 10 ++--- modules/web/values/activity.go | 17 ++++----- 11 files changed, 176 insertions(+), 68 deletions(-) diff --git a/call/activity.go b/call/activity.go index 9459728..b829377 100644 --- a/call/activity.go +++ b/call/activity.go @@ -93,6 +93,19 @@ func GetUserFirstRechargeBackData(uid int) *common.ActivityFirstRechargeBackData 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 { if !IsActivityValid(common.ActivityIDFirstRechargeBack) { return false @@ -104,15 +117,13 @@ func ShouldShowActivityFirstRechargeBack(uid int) bool { conf := GetConfigActivityFirstRechargeBack() p, _ := GetUserXInfo(uid, "birth") data := GetUserFirstRechargeBackData(uid) - val := int64(0) - if data.RechargeTime > 0 { - rechargeInfo := GetRechargeInfo(uid) - val = data.Amount - GetUserCurrencyTotal(uid, common.CurrencyINR) + rechargeInfo.TotalWithdrawing - if val < 0 { - val = 0 + if now > p.Birth+conf.CD { // 超时 + if data.RewardTime == 0 && data.Reward > 0 { // 有奖励 未领取 + return true } + return false } - if now >= p.Birth+conf.CD && val == 0 || data.RewardTime > 0 { + if data.RewardTime > 0 { // 已经领奖 return false } return true diff --git a/call/pay.go b/call/pay.go index 24c1b0d..214958e 100644 --- a/call/pay.go +++ b/call/pay.go @@ -616,21 +616,18 @@ func ActivityFirstRechargeBack(r *common.RechargeOrder) { p, _ := GetUserXInfo(r.UID, "birth") rechargeBackData := GetUserFirstRechargeBackData(r.UID) now := time.Now().Unix() - // 注册多少时间内 - if now <= p.Birth+conf.CD { + rechargeInfo := GetRechargeInfo(r.UID) + // 注册多少时间内,并且累计充值额度大于配置值 + 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 { - data := &common.ActivityFirstRechargeBackData{UID: r.UID, Amount: r.Amount} - if r.Amount >= conf.MinRecharge { - data.RechargeTime = now - } + data := &common.ActivityFirstRechargeBackData{ + UID: r.UID, Amount: rechargeInfo.TotalRecharge, RechargeTime: now} db.Mysql().Create(data) } else { update := map[string]interface{}{ "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) if err != nil { log.Error("err:%v", err) diff --git a/call/redpoint.go b/call/redpoint.go index 6daa058..82b1a67 100644 --- a/call/redpoint.go +++ b/call/redpoint.go @@ -5,6 +5,8 @@ import ( "server/common" "server/db" "server/pb" + "server/util" + "time" ) 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) { one := new(pb.RedPoint) one.List = append(one.List, &pb.RedInfo{ModuleName: module, Num: num}) diff --git a/call/reload.go b/call/reload.go index 51f4f68..61f77d2 100644 --- a/call/reload.go +++ b/call/reload.go @@ -331,15 +331,15 @@ func CommonReload(c map[int][]func(*pb.ReloadGameConfig) error) { return nil }} } - //if _, ok := c[common.ReloadConfigActivityFirstRechargeBack]; !ok { - // c[common.ReloadConfigActivityFirstRechargeBack] = []func(*pb.ReloadGameConfig) error{func(rgc *pb.ReloadGameConfig) error { - // if err := LoadConfigActivityFirstRechargeBack(); err != nil { - // log.Error("error : [%s]", err.Error()) - // return err - // } - // return nil - // }} - //} + if _, ok := c[common.ReloadConfigActivityFirstRechargeBack]; !ok { + c[common.ReloadConfigActivityFirstRechargeBack] = []func(*pb.ReloadGameConfig) error{func(rgc *pb.ReloadGameConfig) error { + if err := LoadConfigActivityFirstRechargeBack(); err != nil { + log.Error("error : [%s]", err.Error()) + return err + } + return nil + }} + } if _, ok := c[common.ReloadConfigBanner]; !ok { c[common.ReloadConfigBanner] = []func(*pb.ReloadGameConfig) error{func(rgc *pb.ReloadGameConfig) error { if err := LoadConfigBanner(); err != nil { diff --git a/call/user.go b/call/user.go index 7129f23..c1d1bf9 100644 --- a/call/user.go +++ b/call/user.go @@ -305,7 +305,11 @@ func GetVIP(uid int) *common.VipData { db.Mysql().Get(re) data := &common.VipData{UID: uid} db.Mysql().Get(data) - data.Exp = re.TotalRecharge + var updateExp bool + if data.Exp != re.TotalRecharge { + data.Exp = re.TotalRecharge + updateExp = true + } if data.ID == 0 { if data.Exp > 0 { cons := GetConfigVIP() @@ -321,9 +325,9 @@ func GetVIP(uid int) *common.VipData { }) } else { level := GetVipLevel(data.Exp, data.Bet) - if level != data.Level { + if level != data.Level || updateExp { 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 @@ -837,7 +841,7 @@ func GetRtpControlV1(uid int, withdrawPer ...*int) int { withdrawRechargePer = (rechargeInfo.TotalWithdraw + rechargeInfo.WithdrawingCash + cash) * 100 / rechargeInfo.TotalRecharge } playerProfile := GetPlayerProfile(uid) - if playerProfile != nil { + if playerProfile != nil && playerProfile.TotalBet > 0 { personalRtp = playerProfile.TotalSettle * 100 / playerProfile.TotalBet } if rechargeInfo.FirstRecharge == 0 { // 找表 diff --git a/common/activity.go b/common/activity.go index 02eb22e..3b9ae3d 100644 --- a/common/activity.go +++ b/common/activity.go @@ -192,9 +192,9 @@ const ( // ConfigActivityFirstRechargeBack 首日充值返还 type ConfigActivityFirstRechargeBack struct { 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"` - 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 { diff --git a/common/redis_keys.go b/common/redis_keys.go index 6895f99..68f8242 100644 --- a/common/redis_keys.go +++ b/common/redis_keys.go @@ -53,6 +53,7 @@ const ( RedisKeyShare = "share" RedisKeyWeekCard = "week_card" RedisKeyUserPay = "user_pay" + RedisKeyFirstRechargeBack = "first_recharge_back" ) const ( @@ -224,3 +225,7 @@ func GetRedisKeyWeekCard(uid int) string { func GetRedisKeyUserPay(payChannelId, uid, amount int) string { return fmt.Sprintf("%v:%d:%d:%v", RedisKeyUserPay, payChannelId, amount, uid) } + +func GetRedisKeyFirstRechargeBack(uid int) string { + return fmt.Sprintf("%v:%v", RedisKeyFirstRechargeBack, uid) +} diff --git a/modules/hall/player.go b/modules/hall/player.go index a8ca150..aaab20e 100644 --- a/modules/hall/player.go +++ b/modules/hall/player.go @@ -22,6 +22,8 @@ type player struct { func (p *player) PushRedPoint() { call.PushRed(p.db.Id, pb.RedPointModule_RedPointFreeCash, uint32(1)) call.PushMailRed(p.db.Id) + call.PushVipRed(p.db.Id) + call.PushWeekCard(p.db.Id) } // func (p *player) Send(topic string, data proto.Message) { diff --git a/modules/web/handler/activity.go b/modules/web/handler/activity.go index 54dc045..4ee4147 100644 --- a/modules/web/handler/activity.go +++ b/modules/web/handler/activity.go @@ -635,45 +635,52 @@ func ActivityFirstRechargeBackInfo(c *gin.Context) { conf := call.GetConfigActivityFirstRechargeBack() a.Data = resp data := call.GetUserFirstRechargeBackData(a.UID) - resp.NeedRechargeAmount = conf.MinRecharge / common.DecimalDigits - resp.ProductList = call.GetConfigPayProductByActivityID(common.ActivityIDFirstRechargeBack) - resp.Recharge = data.Amount - resp.PayAmount = data.Amount + rechargeInfo := call.GetRechargeInfo(a.UID) + resp.MinRechargeAmount = conf.MinRecharge + resp.TotalRechargeAmount = rechargeInfo.TotalRecharge resp.BackPer = conf.MaxBack - resp.ChannelList = call.GetConfigPayChannelsByID(common.CurrencyINR) + resp.RechargeAmount = data.Amount p, _ := call.GetUserXInfo(a.UID, "birth") - resp.DrawTime = p.Birth + conf.CD - rechargeInfo := call.GetRechargeInfo(a.UID) - if data.RechargeTime == 0 { - resp.CanRecharge = true + now := time.Now() + if v := p.Birth + conf.CD - now.Unix(); v > 0 { + resp.Countdown = v + } + if resp.MinRechargeAmount > resp.TotalRechargeAmount { // 未解锁给默认值 + resp.BackAmount = 6528600 + call.GetFirstRechargeBackSumAmount() + } + if data.RechargeTime == 0 { // 无充值 + return + } + if data.RewardTime > 0 { // 已领取 + resp.Draw = 2 return } - if data.Reward == 0 { + if data.Reward == 0 { // 计算奖励 val := data.Amount - call.GetUserCurrencyTotal(a.UID, common.CurrencyINR) - rechargeInfo.WithdrawingCash if val < 0 { val = 0 } val = val * conf.MaxBack / 100 - now := time.Now().Unix() - if now >= p.Birth+conf.CD && data.Reward == 0 && data.RechargeTime == 0 { + resp.BackAmount = val + if resp.Countdown == 0 { // 活动结束更新奖励 update := map[string]interface{}{ "reward": val, } if val == 0 { - data.RechargeTime = now - update["reward_time"] = now + update["reward_time"] = now.Unix() } db.Mysql().Update(&common.ActivityFirstRechargeBackData{UID: a.UID}, update) } - data.Reward = val + } else { + resp.BackAmount = data.Reward } - if data.RewardTime > 0 { - resp.Draw = true + if resp.Countdown == 0 && resp.BackAmount > 0 { + resp.Draw = 1 } - resp.Back = data.Reward - if !resp.Draw { + if resp.Draw == 1 { //call.PushRed(a.UID, pb.RedPointModule_RedPointFirstRecharge, 1) } + return } func ActivityFirstRechargeBackDraw(c *gin.Context) { @@ -684,12 +691,20 @@ func ActivityFirstRechargeBackDraw(c *gin.Context) { if !a.CheckActivityExpire(common.ActivityIDFirstRechargeBack) { 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) a.Data = resp conf := call.GetConfigActivityFirstRechargeBack() data := call.GetUserFirstRechargeBackData(a.UID) 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) a.Code = values.CodeRetry a.Msg = "Unarrived time" @@ -700,12 +715,20 @@ func ActivityFirstRechargeBackDraw(c *gin.Context) { a.Msg = "Award claimed" 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 { a.Code = values.CodeRetry return } - val := data.Reward _, err = call.UpdateCurrencyPro(&common.UpdateCurrency{ CurrencyBalance: &common.CurrencyBalance{ UID: a.UID, @@ -713,6 +736,7 @@ func ActivityFirstRechargeBackDraw(c *gin.Context) { Type: common.CurrencyINR, Value: val, Event: common.CurrencyEventActivityFirstRechargeBack, + NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, val), }, }) if err != nil { diff --git a/modules/web/handler/vip.go b/modules/web/handler/vip.go index 02eeb3a..d92a061 100644 --- a/modules/web/handler/vip.go +++ b/modules/web/handler/vip.go @@ -60,7 +60,7 @@ func GetVipInfoNew(c *gin.Context) { } for _, v := range resp.List { - if util.SliceContain(levelBonus, v.Level) { + if util.SliceContain(levelBonus, v.Level) && v.Bonus > 0 { // 可领取 v.BonusDraw = 1 } else { @@ -69,7 +69,7 @@ func GetVipInfoNew(c *gin.Context) { } } if v.Level == resp.Info.Level { - if weekBonus { + if weekBonus && v.BonusWeek > 0 { v.BonusWeekDraw = 1 } else { 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) reset = !util.IsSameDayTimeStamp(now.Unix(), resp.Info.ProfitTime) 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) { - 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) if !hasVipBonus(vip) { - call.PushRed(a.UID, pb.RedPointModule_RedPointVipReward, uint32(0)) + //call.PushRed(a.UID, pb.RedPointModule_RedPointVipReward, uint32(0)) } } diff --git a/modules/web/values/activity.go b/modules/web/values/activity.go index 2ffae63..bd62344 100644 --- a/modules/web/values/activity.go +++ b/modules/web/values/activity.go @@ -47,16 +47,13 @@ type ActivityFreeSpinDrawResp struct { // Recharge 充值总额 // Back 可领取的总额 type ActivityFirstRechargeBackInfoResp struct { - Recharge int64 - Back int64 - BackPer int64 - CanRecharge bool - PayAmount int64 // 支付金额 - DrawTime int64 // 领取时间 - Draw bool // 是否领取 - NeedRechargeAmount int64 // - ChannelList []*common.ConfigPayChannels - ProductList []*common.ConfigPayProduct + BackAmount int64 // 返还金额 + BackPer int64 // 返还比例 + Draw int // 领取状态(0:无,1:可领,2:已领取) + TotalRechargeAmount int64 // 当前充值额度(玩家总充值) + RechargeAmount int64 // 有效充值金额 + MinRechargeAmount int64 // 累计充值额度 + Countdown int64 // 倒计时 } type ActivityFirstRechargeBackDrawResp struct {