分享模块

dev_aagame_provider
zhora 2 months ago
parent a99f2bcee0
commit 7da246b994
  1. 159
      call/config.go
  2. 3
      call/pay.go
  3. 28
      call/rank.go
  4. 9
      call/reload.go
  5. 466
      call/share.go
  6. 1
      call/user.go
  7. 5
      common/activity.go
  8. 3
      common/config.go
  9. 1
      common/currency.go
  10. 2
      common/rank.go
  11. 136
      common/share.go
  12. 4
      modules/backend/migrate.go
  13. 2
      modules/backend/values/gm.go
  14. 5
      modules/common/nats.go
  15. 9
      modules/common/timer.go
  16. 17
      modules/web/config.go
  17. 2
      modules/web/handler/account.go
  18. 31
      modules/web/handler/luckyWheel.go
  19. 6
      modules/web/handler/recharge.go
  20. 529
      modules/web/handler/share.go
  21. 2
      modules/web/handler/user.go
  22. 4
      modules/web/handler/withdraw.go
  23. 21
      modules/web/providers/jin2/handler.go
  24. 1
      modules/web/routers/routers_luckyWheel.go
  25. 15
      modules/web/routers/routers_share.go
  26. 19
      modules/web/values/luckyWheel.go
  27. 9
      modules/web/values/pay.go
  28. 9
      modules/web/values/share.go
  29. 96
      modules/web/values/shareNew.go

@ -11,6 +11,7 @@ import (
"server/util" "server/util"
"sort" "sort"
"strings" "strings"
"sync"
"time" "time"
"github.com/liangdas/mqant/log" "github.com/liangdas/mqant/log"
@ -88,6 +89,14 @@ var (
configShareLimitTask []*common.ConfigShareLimitTask configShareLimitTask []*common.ConfigShareLimitTask
configShareWithdrawProducts []*common.ConfigShareWithdrawProducts configShareWithdrawProducts []*common.ConfigShareWithdrawProducts
ConfigWithdrawChannels []*common.ConfigWithdrawChannels ConfigWithdrawChannels []*common.ConfigWithdrawChannels
// 加锁
configShareRankMu sync.Mutex
configShareRankAwardMap map[int]map[int]common.RankAward
configShareRankAward map[int][]common.RankAward
configShareMu sync.Mutex
configShareMap map[int]*common.ConfigShare
) )
var ( var (
@ -1035,33 +1044,29 @@ func GetConfigAppSpin() []*common.ConfigAppSpin {
} }
func LoadConfigShare() (err error) { func LoadConfigShare() (err error) {
configShareMu.Lock()
defer configShareMu.Unlock()
list := []*common.ConfigShare{} list := []*common.ConfigShare{}
if _, err = db.Mysql().QueryAll("open = 1", "level asc", &common.ConfigShare{}, &list); err != nil { if _, err = db.Mysql().QueryAll("open = 1", "level", &common.ConfigShare{}, &list); err != nil {
log.Error("err:%v", err) log.Error("err:%v", err)
return err return err
} }
if configShareMap == nil {
configShareMap = make(map[int]*common.ConfigShare)
}
for _, v := range list { for _, v := range list {
if v.InviteReward != "" {
err := json.Unmarshal([]byte(v.InviteReward), &v.SubInviteReward)
if err != nil {
log.Error("err:%v", err)
return err
}
}
if v.NewReward != "" {
err := json.Unmarshal([]byte(v.NewReward), &v.SubNewReward)
if err != nil {
log.Error("err:%v", err)
return err
}
}
if v.RewardTiers != "" { if v.RewardTiers != "" {
err := json.Unmarshal([]byte(v.RewardTiers), &v.SubRewardTiers) err := json.Unmarshal([]byte(v.RewardTiers), &v.SubRewardTiers)
if err != nil { if err != nil {
log.Error("err:%v", err) log.Error("err:%v", err)
return err return err
} }
v.SubRewardTiersMap = make(map[int]common.ConfigShareTiers)
for _, tier := range v.SubRewardTiers {
v.SubRewardTiersMap[tier.Tier] = tier
}
} }
configShareMap[v.Level] = v
} }
configShare = list configShare = list
return nil return nil
@ -1069,47 +1074,58 @@ func LoadConfigShare() (err error) {
func GetConfigShare(level, channel int) *common.ConfigShare { func GetConfigShare(level, channel int) *common.ConfigShare {
for _, v := range configShare { for _, v := range configShare {
if v.Level != level { if v.Level == level {
continue
}
if v.Channel == channel || v.Channel == channel-10000 || v.Channel == 0 {
return v return v
} }
} }
return nil return nil
} }
func GetConfigShareByExp(channel int, exp int64) (ret *common.ConfigShare) { func GetConfigShareAll() []common.ConfigShare {
cons := GetConfigShares(channel) result := make([]common.ConfigShare, 0, len(configShare))
if len(cons) == 0 {
return
}
for i, v := range cons {
if v.Exp < 0 {
continue
}
if exp == v.Exp {
return v
}
if exp < v.Exp && i > 0 {
return cons[i-1]
}
}
ret = cons[len(cons)-1]
return
}
func GetConfigShares(channel int) []*common.ConfigShare {
var result []*common.ConfigShare
for _, v := range configShare { for _, v := range configShare {
if v.Channel == channel || v.Channel == channel-10000 { result = append(result, *v)
result = append(result, v)
continue
}
} }
return result return result
} }
func GetConfigShareMap() map[int]*common.ConfigShare {
configShareMu.Lock()
defer configShareMu.Unlock()
return configShareMap
}
//func GetConfigShareByExp(channel int, exp int64) (ret *common.ConfigShare) {
// cons := GetConfigShares(channel)
// if len(cons) == 0 {
// return
// }
// for i, v := range cons {
// if v.Exp < 0 {
// continue
// }
// if exp == v.Exp {
// return v
// }
// if exp < v.Exp && i > 0 {
// return cons[i-1]
// }
// }
// ret = cons[len(cons)-1]
// return
//}
//func GetConfigShares(channel int) []*common.ConfigShare {
// var result []*common.ConfigShare
// for _, v := range configShare {
// if v.Channel == channel || v.Channel == channel-10000 {
// result = append(result, v)
// continue
// }
// }
// return result
//}
// LoadConfigShareSys 分享系统配置 // LoadConfigShareSys 分享系统配置
func LoadConfigShareSys() (err error) { func LoadConfigShareSys() (err error) {
one := new(common.ConfigShareSys) one := new(common.ConfigShareSys)
@ -2179,13 +2195,10 @@ func LoadConfigShareBanner() (err error) {
return nil return nil
} }
func GetConfigShareBanner(channel int) []*common.ConfigShareBanner { func GetConfigShareBanner() []*common.ConfigShareBanner {
var result []*common.ConfigShareBanner var result []*common.ConfigShareBanner
for _, v := range configShareBanner { for _, v := range configShareBanner {
if v.Channel == channel || v.Channel == channel-10000 { result = append(result, v)
result = append(result, v)
continue
}
} }
return result return result
} }
@ -2267,3 +2280,49 @@ func GetShareWithdrawInfo(uid int) *common.ShareWithdrawInfo {
} }
return info return info
} }
func LoadConfigShareRankAward() (err error) {
configShareRankMu.Lock()
defer configShareRankMu.Unlock()
list := []*common.ConfigShareRankAward{}
if _, err = db.Mysql().QueryAll("", "", &common.ConfigShareRankAward{}, &list); err != nil {
log.Error("err:%v", err)
return err
}
if configShareRankAwardMap == nil {
configShareRankAwardMap = make(map[int]map[int]common.RankAward)
configShareRankAward = make(map[int][]common.RankAward)
}
for _, v := range list {
var tmpRankAward []common.RankAward
err = json.Unmarshal([]byte(v.RankAwards), &tmpRankAward)
if err != nil {
log.Error("unmarshal share rank award err, %s", err.Error())
return
}
tmpRankAwardMap := make(map[int]common.RankAward)
for _, award := range tmpRankAward {
for index := award.SmallRank; index <= award.LargeRank; index++ {
tmpRankAwardMap[index] = award
}
}
configShareRankAwardMap[v.ShareRankType] = tmpRankAwardMap
configShareRankAward[v.ShareRankType] = tmpRankAward
}
return nil
}
func GetConfigShareRankAwardMap(shareRankType ...int) (result map[int]common.RankAward) {
configShareRankMu.Lock()
defer configShareRankMu.Unlock()
if configShareRankAwardMap == nil {
LoadConfigShareRankAward()
}
if configShareRankAwardMap == nil {
return nil
}
if len(shareRankType) > 0 {
return configShareRankAwardMap[shareRankType[0]]
}
return configShareRankAwardMap[2]
}

@ -531,9 +531,10 @@ func PayActivity(r *common.RechargeOrder, notCharge bool, user *common.PlayerDBI
if notCharge { if notCharge {
InsertLoginRecord(r.UID, r.ChannelID, user.IP, user.Birth, user.Platform) InsertLoginRecord(r.UID, r.ChannelID, user.IP, user.Birth, user.Platform)
} }
CheckShare(r)
// todo // todo
util.Go(func() { util.Go(func() {
UpdateShare(r.UID, 2, r.Amount)
shareInfo := common.ShareInfo{UID: user.Id} shareInfo := common.ShareInfo{UID: user.Id}
err = db.Mysql().Get(&shareInfo) err = db.Mysql().Get(&shareInfo)
if err != nil { if err != nil {

@ -189,20 +189,22 @@ func rankAward(ticker *rankTicker) {
log.Error("rankAward, %s update rankData err, %s", jackpotKey, err.Error()) log.Error("rankAward, %s update rankData err, %s", jackpotKey, err.Error())
continue continue
} }
if userAwardCount == 0 {
continue
}
// todo 给玩家邮件发奖 // todo 给玩家邮件发奖
}
// 重置上一期奖池数量 // 重置上一期奖池数量
if lessJackpot > 0 { log.Debug("rankAward, %s, %d, less jackpot:%d", jackpotKey, jackpot, lessJackpot)
log.Debug("rankAward, %s less jackpot:%d", jackpotKey, lessJackpot) err = db.Redis().GetRedis().Set(context.Background(), jackpotKey, lessJackpot, 0).Err()
err = db.Redis().GetRedis().Set(context.Background(), jackpotKey, lessJackpot, 0).Err() if err != nil {
if err != nil { log.Error("rankAward, %s set less-jackpot err, %s", jackpotKey, err.Error())
log.Error("rankAward, %s set less-jackpot err, %s", jackpotKey, err.Error()) }
} if lessJackpot > 0 {
_, _, _, jackpotKeyNow := getRankJackpotKey(rankConfig.RankType, rankConfig.RankCycle) _, _, _, jackpotKeyNow := getRankJackpotKey(rankConfig.RankType, rankConfig.RankCycle)
_, err = db.Redis().Incr(jackpotKeyNow, lessJackpot) _, err = db.Redis().Incr(jackpotKeyNow, lessJackpot)
if err != nil { if err != nil {
log.Error("rankAward, %s:%s incr less-jackpot err, %s", jackpotKey, jackpotKeyNow, err.Error()) log.Error("rankAward, %s:%s incr less-jackpot err, %s", jackpotKey, jackpotKeyNow, err.Error())
}
} }
} }
} }

@ -623,4 +623,13 @@ func CommonReload(c map[int][]func(*pb.ReloadGameConfig) error) {
return nil return nil
}} }}
} }
if _, ok := c[common.ReloadConfigShowGameTag]; !ok {
c[common.ReloadConfigShowGameTag] = []func(*pb.ReloadGameConfig) error{func(rgc *pb.ReloadGameConfig) error {
if err := LoadConfigShowGameTag(); err != nil {
log.Error("error : [%s]", err.Error())
return err
}
return nil
}}
}
} }

@ -1,13 +1,16 @@
package call package call
import ( import (
"context"
"fmt" "fmt"
"gorm.io/gorm/clause"
"reflect" "reflect"
"server/common" "server/common"
"server/db" "server/db"
"server/pb" "server/pb"
"server/util" "server/util"
"strings" "strings"
"sync"
"time" "time"
"github.com/liangdas/mqant/log" "github.com/liangdas/mqant/log"
@ -22,9 +25,19 @@ func GetShareInfo(uid int) *common.ShareInfo {
shareInfo.ChannelID = info.ChannelID shareInfo.ChannelID = info.ChannelID
shareInfo.Share = util.GetShareCode(uid) shareInfo.Share = util.GetShareCode(uid)
shareInfo.CreateTime = time.Now().Unix() shareInfo.CreateTime = time.Now().Unix()
shareInfo.Level = 1 shareInfo.Level = 0
db.Mysql().Create(shareInfo) db.Mysql().Create(shareInfo)
} }
shareInfo.UpList = []int{shareInfo.UP1, shareInfo.UP2, shareInfo.UP3, shareInfo.UP4, shareInfo.UP5}
betAmountTeam := shareInfo.BetAmountTeam
downCount := shareInfo.Down1 + shareInfo.Down2 + shareInfo.Down3 + shareInfo.Down4 + shareInfo.Down5
shareConfig := GetConfigShareAll()
for _, v := range shareConfig {
if betAmountTeam >= int64(v.BetExp) &&
downCount >= int64(v.InviteExp) {
shareInfo.Level = v.Level
}
}
return shareInfo return shareInfo
} }
func GetShareInfoByCode(code string) *common.ShareInfo { func GetShareInfoByCode(code string) *common.ShareInfo {
@ -62,10 +75,7 @@ func ShareBind(share string, isOld bool, uid, cid int) {
db.Mysql().Get(upInfo) db.Mysql().Get(upInfo)
if upInfo.ID > 0 { if upInfo.ID > 0 {
upInfo.UID = upInfo.UID upInfo.UID = upInfo.UID
// todo ?发送奖励? UpdateShare(upInfo.UID, 4, 0, fmt.Sprintf("%d", uid))
//util.Go(func() {
// SendShareReward(cid, codeInfo.UID, codeInfo.ActivityId)
//})
} else { } else {
// 一级 // 一级
upInfo = &common.ShareInfo{Share: share} upInfo = &common.ShareInfo{Share: share}
@ -99,8 +109,6 @@ func ShareBind(share string, isOld bool, uid, cid int) {
db.Mysql().Update(&common.ShareInfo{UID: upUid}, map[string]interface{}{field: gorm.Expr(fmt.Sprintf("%s + 1", field))}) db.Mysql().Update(&common.ShareInfo{UID: upUid}, map[string]interface{}{field: gorm.Expr(fmt.Sprintf("%s + 1", field))})
} }
// todo 更新上级邀请玩家数量?
CheckTask(Task{Uid: upInfo.UID, Value: 1, Types: []common.TaskType{common.TaskTypeInvite}})
// todo // todo
util.Go(func() { util.Go(func() {
if upInfo.UID != 0 { if upInfo.UID != 0 {
@ -126,50 +134,50 @@ func ShareBind(share string, isOld bool, uid, cid int) {
}) })
} }
// 判断分享,发放有效用户奖励 //// 判断分享,发放有效用户奖励
func CheckShare(r *common.RechargeOrder) { //func CheckShare(r *common.RechargeOrder) {
shareInfo := GetShareInfo(r.UID) // shareInfo := GetShareInfo(r.UID)
// todo // // todo
if GetConfigShareSys() == nil { // if GetConfigShareSys() == nil {
return // return
} // }
reward := GetConfigShareSys().ShareReward // reward := GetConfigShareSys().ShareReward
// 付费分享 // // 付费分享
// CheckShareTask(shareInfo.UP1, 1, common.TaskTypePayShare) // // CheckShareTask(shareInfo.UP1, 1, common.TaskTypePayShare)
// 发放奖励 // // 发放奖励
update := map[string]interface{}{ // update := map[string]interface{}{
"recharge_amount": gorm.Expr("recharge_amount + ?", r.Amount), // "recharge_amount": gorm.Expr("recharge_amount + ?", r.Amount),
} // }
if shareInfo.BetAmount != -1 { // if shareInfo.BetAmount != -1 {
update["bet_amount"] = gorm.Expr("bet_amount + ?", r.Amount) // update["bet_amount"] = gorm.Expr("bet_amount + ?", r.Amount)
} // }
db.Mysql().Update(&common.ShareInfo{UID: r.UID}, update) // db.Mysql().Update(&common.ShareInfo{UID: r.UID}, update)
betAmount := shareInfo.BetAmount // betAmount := shareInfo.BetAmount
if betAmount == -1 { // if betAmount == -1 {
betAmount = 0 // betAmount = 0
} // }
if shareInfo.RechargeAmount+r.Amount < GetConfigShareSys().ShareRecharge { // if shareInfo.RechargeAmount+r.Amount < GetConfigShareSys().ShareRecharge {
return // return
} // }
if shareInfo.UP1 == 0 { // if shareInfo.UP1 == 0 {
return // return
} // }
if shareInfo.BetAmount >= 0 { // if shareInfo.BetAmount >= 0 {
db.Mysql().Update(&common.ShareInfo{UID: r.UID}, map[string]interface{}{ // db.Mysql().Update(&common.ShareInfo{UID: r.UID}, map[string]interface{}{
"bet_amount": -1, // "bet_amount": -1,
}) // })
update = map[string]interface{}{ // update = map[string]interface{}{
"invalid_invites": gorm.Expr("invalid_invites + 1"), // "invalid_invites": gorm.Expr("invalid_invites + 1"),
"invite_reward": gorm.Expr("invite_reward + ?", reward), // "invite_reward": gorm.Expr("invite_reward + ?", reward),
"available_reward": gorm.Expr("available_reward + ?", reward), // "available_reward": gorm.Expr("available_reward + ?", reward),
} // }
db.Mysql().Update(&common.ShareInfo{UID: shareInfo.UP1}, update) // db.Mysql().Update(&common.ShareInfo{UID: shareInfo.UP1}, update)
ShareRecharge(r.UID, r.Amount+betAmount, 1) // ShareRecharge(r.UID, r.Amount+betAmount, 1)
IncreaseInviteCount(fmt.Sprintf("%v", shareInfo.UP1), 1, false) // IncreaseInviteCount(fmt.Sprintf("%v", shareInfo.UP1), 1, false)
} else { // } else {
ShareRecharge(r.UID, r.Amount+betAmount, 2) // ShareRecharge(r.UID, r.Amount+betAmount, 2)
} // }
} //}
func ShareRecharge(uid int, amount int64, typ int) { func ShareRecharge(uid int, amount int64, typ int) {
shareInfo := &common.ShareInfo{UID: uid} shareInfo := &common.ShareInfo{UID: uid}
@ -593,3 +601,359 @@ func GetShareWithdrawHis(uid, page, num int) (list []*common.RechargeOrder, coun
uid, common.CurrencyEventWithDraw, common.CurrencyEventShareWithdraw, common.ActivityIDShare) uid, common.CurrencyEventWithDraw, common.CurrencyEventShareWithdraw, common.ActivityIDShare)
return return
} }
func ShareRankUserGet(page, pageSize int, rankAt time.Time, withCount bool) (rankUsers []common.ShareRankDataWithUser, count int64, err error) {
if withCount {
countQuery := db.Mysql().C().
Model(&common.ShareRankData{}).
Where("rank_cycle = ? and rank_at = ?",
2, rankAt.Unix())
err = countQuery.Count(&count).Error
if err != nil {
log.Error("get rank user count err, %s", err.Error())
return
}
}
err = db.Mysql().C().Table("share_rank_data as srd").
Select("srd.*, u.*").
Joins("left join users as u on srd.uid = u.id").
Where("srd.rank_cycle = ? and srd.rank_at = ?", 2, rankAt.Unix()).
Order("srd.rank_value desc, srd.updated_at").Offset((page - 1) * pageSize).Limit(pageSize).
Find(&rankUsers).Error
if err != nil {
log.Error("get rank user err, %s", err.Error())
return
}
return
}
var once sync.Once
func ShareRankHandler() {
once.Do(func() {
util.Go(func() {
for {
now := time.Now()
nextSettleAt := util.GetWeekZeroTime(now).AddDate(0, 0, 7).Add(30 * time.Minute)
if now.After(nextSettleAt) {
nextSettleAt = nextSettleAt.AddDate(0, 0, 7)
}
timer := time.NewTimer(nextSettleAt.Sub(now))
<-timer.C
shareRankAward()
}
})
})
}
func shareRankAward() {
now := time.Now()
jackpot := ShareRankJackpotPreGet()
lessJackpot := jackpot
lastRankAt := util.GetWeekZeroTime(now).AddDate(0, 0, -7)
shareRankAwards := GetConfigShareRankAwardMap()
if shareRankAwards == nil {
log.Error("share rank award is nil")
return
}
var rankUsers []*common.ShareRankData
err := db.Mysql().C().Model(&common.ShareRankData{}).Where("rank_at = ?", lastRankAt.Unix()).Order("rank_value desc, updated_at").Find(&rankUsers).Error
if err != nil {
log.Error("get share rank user err, %s", err.Error())
return
}
for index, rankUser := range rankUsers {
var (
rank = index + 1
userAward int
userAwardCount int64
)
award, ok := shareRankAwards[rank]
if ok {
userAward = award.AwardRate
userAwardCount = jackpot * int64(userAward) / 10000
lessJackpot -= userAwardCount
}
if lessJackpot <= 0 {
userAwardCount = 0
}
updateValues := map[string]interface{}{
"user_award": userAward,
"user_award_count": userAwardCount,
"rank": rank,
"updated_at": now.Unix(),
}
err = db.Mysql().C().Model(&common.ShareRankData{}).Where("id = ?", rankUser.ID).Updates(updateValues).Error
if err != nil {
log.Error("update share rank data err, %d:%+v %s", rankUser.ID, updateValues, err.Error())
continue
}
if userAwardCount == 0 {
continue
}
// todo 给玩家邮件发奖
}
jackpotKey := getShareRankJackpotPreKey()
log.Debug("shareRankAward, %s, %d, less jackpot:%d", jackpotKey, jackpot, lessJackpot)
err = db.Redis().GetRedis().Set(context.Background(), jackpotKey, lessJackpot, 0).Err()
if err != nil {
log.Error("share rankAward, %s set less-jackpot err, %s", jackpotKey, err.Error())
}
}
// updateType(1:下注,2:充值,3:任务,4:邀请人)
func updateShareByUp(uid, upUid, uplevel, updateType int, updateValue int64, expand ...string) {
shareInfo := GetShareInfo(upUid)
shareCfgMap := GetConfigShareMap()
shareCfg := shareCfgMap[shareInfo.Level]
rewardTier, ok := shareCfg.SubRewardTiersMap[uplevel]
now := time.Now()
var awardCount int64
if !ok || rewardTier.Per == 0 {
return
}
var shareReward *common.ShareReward
updateValues := make(map[string]interface{})
switch updateType {
case 1: // 下注返利
var winCount int64
if len(expand) > 0 {
winCount = util.ToInt64(expand[0])
}
if winCount < 0 {
rewardCount := -winCount * rewardTier.Per / 100
shareReward = &common.ShareReward{
UID: upUid,
UpLevel: uplevel,
RewardType: updateType,
RewardCount: rewardCount,
RewardDesc: fmt.Sprintf("%d", uid),
RewardAt: now.Unix(),
}
awardCount = rewardCount
updateValues["reward"] = gorm.Expr("reward + ?", rewardCount)
updateValues["withdrawable"] = gorm.Expr("withdrawable + ?", rewardCount)
}
betAmount := updateValue * rewardTier.Per / 100
updateValues["bet_amount_team"] = gorm.Expr("bet_amount_team + ?", betAmount)
case 2: // 充值返利
rewardCount := updateValue * rewardTier.Per / 100
shareReward = &common.ShareReward{
UID: upUid,
UpLevel: uplevel,
RewardType: updateType,
RewardCount: rewardCount,
RewardDesc: fmt.Sprintf("%d", uid),
RewardAt: now.Unix(),
}
awardCount = rewardCount
updateValues["reward"] = gorm.Expr("reward + ?", rewardCount)
updateValues["withdrawable"] = gorm.Expr("withdrawable + ?", rewardCount)
}
if shareReward != nil {
err := db.Mysql().C().Create(&shareReward).Error
if err != nil {
log.Error("create up share reward err, %s", err.Error())
}
}
if len(updateValues) > 0 {
err := db.Mysql().C().Model(&common.ShareInfo{}).Where("uid = ?", upUid).Updates(updateValues).Error
if err != nil {
log.Error("update up share info err, %s", err.Error())
}
if _, ok = updateValues["reward"]; ok { // 更新排行榜
shareRankData := common.ShareRankData{
UID: shareInfo.UID,
RankCycle: 2,
RankAt: util.GetWeekZeroTime(now).Unix(),
RankValue: awardCount,
UpdatedAt: now.Unix(),
}
err = db.Mysql().C().Model(&common.ShareRankData{}).Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "rank_cycle"}, {Name: "rank_at"}, {Name: "uid"}},
DoUpdates: clause.Assignments(map[string]interface{}{
"rank_value": gorm.Expr("rank_value + ?", shareRankData.RankValue),
"updated_at": shareRankData.UpdatedAt,
}),
}).Create(&shareRankData).Error
if err != nil {
log.Error("update up share rank data err, %s", err.Error())
}
}
}
}
// updateType(1:下注,2:充值,3:任务,4:邀请人,5:提现, 6:回滚)
func UpdateShare(uid, updateType int, updateValue int64, expand ...string) (err error) {
if updateType == 1 { // 直接更新下注奖池
_, _, expired, rankKey := getShareRankJackpotKey()
_, err := db.Redis().Incr(rankKey, updateValue/100)
if err != nil {
log.Error("update rank jackpot err, %s:%s", rankKey, err.Error())
}
db.Redis().Expire(rankKey, time.Duration(expired)*time.Second)
}
now := time.Now()
shareInfo := GetShareInfo(uid)
var shareReward *common.ShareReward
updateValues := make(map[string]interface{})
var awardCount int64
var updateUp bool
switch updateType {
case 1:
updateValues["bet_amount"] = gorm.Expr("bet_amount + ?", updateValue)
updateValues["bet_amount_team"] = gorm.Expr("bet_amount_team + ?", updateValue)
updateUp = true
case 2:
updateUp = true
case 3:
desc := expand[0]
shareReward = &common.ShareReward{
UID: uid,
RewardType: updateType,
RewardCount: updateValue,
RewardDesc: desc,
RewardAt: now.Unix(),
}
awardCount = updateValue
updateValues["reward"] = gorm.Expr("reward + ?", updateValue)
updateValues["withdrawable"] = gorm.Expr("withdrawable + ?", updateValue)
case 4:
configMap := GetConfigShareMap()
if config, ok := configMap[shareInfo.Level]; ok {
amount := config.InviteRebate
var desc string
if len(expand) > 0 {
desc = expand[0]
}
shareReward = &common.ShareReward{
UID: uid,
RewardType: updateType,
RewardCount: amount,
RewardDesc: desc,
RewardAt: now.Unix(),
}
awardCount = updateValue
updateValues["reward"] = gorm.Expr("reward + ?", amount)
updateValues["withdrawable"] = gorm.Expr("withdrawable + ?", amount)
}
case 5:
desc := expand[0]
shareReward = &common.ShareReward{
UID: uid,
RewardType: updateType,
RewardCount: -updateValue,
RewardDesc: desc,
RewardAt: now.Unix(),
}
updateValues["withdrawable"] = gorm.Expr("withdrawable - ?", updateValue)
case 6:
desc := expand[0]
shareReward = &common.ShareReward{
UID: uid,
RewardType: updateType,
RewardCount: updateValue,
RewardDesc: desc,
RewardAt: now.Unix(),
}
updateValues["withdrawable"] = gorm.Expr("withdrawable + ?", updateValue)
}
if len(updateValues) > 0 {
err = db.Mysql().C().Model(&common.ShareInfo{}).
Where("id = ?", shareInfo.ID).
Updates(updateValues).Error
if err != nil {
log.Error("update share err, %s", err.Error())
return
}
if _, ok := updateValues["reward"]; ok { // 更新排行榜
shareRankData := common.ShareRankData{
UID: shareInfo.UID,
RankCycle: 2,
RankAt: util.GetWeekZeroTime(now).Unix(),
RankValue: awardCount,
UpdatedAt: now.Unix(),
}
err = db.Mysql().C().Model(&common.ShareRankData{}).Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "rank_cycle"}, {Name: "rank_at"}, {Name: "uid"}},
DoUpdates: clause.Assignments(map[string]interface{}{
"rank_value": gorm.Expr("rank_value + ?", shareRankData.RankValue),
"updated_at": shareRankData.UpdatedAt,
}),
}).Create(&shareRankData).Error
if err != nil {
log.Error("update share rank data err, %s", err.Error())
return
}
}
}
if shareReward != nil {
err = db.Mysql().C().Create(&shareReward).Error
if err != nil {
log.Error("create share reward err, %s", err.Error())
return
}
}
if updateUp {
for index, upUid := range shareInfo.UpList {
if upUid == 0 {
continue
}
updateShareByUp(uid, upUid, index+1, updateType, updateValue, expand...)
}
}
}
func getShareRankJackpotKey() (rankAt, awardAt time.Time, expired int64, key string) {
now := time.Now()
rankCycle := 2
key = fmt.Sprintf("share_rank_jackpot|%d", rankCycle)
switch rankCycle {
case 1:
rankAt = util.GetZeroTime(now)
awardAt = rankAt.AddDate(0, 0, 1)
expired = int64(rankAt.AddDate(0, 0, 2).Sub(now).Seconds())
case 2:
rankAt = util.GetWeekZeroTime(now)
awardAt = rankAt.AddDate(0, 0, 7)
expired = int64(rankAt.AddDate(0, 0, 14).Sub(now).Seconds())
case 3:
rankAt = util.GetFirstDateOfMonth(now)
awardAt = rankAt.AddDate(0, 1, 0)
expired = int64(rankAt.AddDate(0, 2, 0).Sub(now).Seconds())
}
key += fmt.Sprintf("|%s", rankAt.Format("20060102"))
return
}
func getShareRankJackpotPreKey() (key string) {
now := time.Now()
var rankAt time.Time
rankCycle := 2
key = fmt.Sprintf("share_rank_jackpot|%d", rankCycle)
switch rankCycle {
case 1:
rankAt = util.GetZeroTime(now).AddDate(0, 0, -1)
case 2:
rankAt = util.GetWeekZeroTime(now).AddDate(0, 0, -7)
case 3:
rankAt = util.GetFirstDateOfMonth(now).AddDate(0, -1, 0)
}
key += fmt.Sprintf("|%s", rankAt.Format("20060102"))
return
}
func ShareRankJackpotGet() (jackpot, rankLess int64) {
_, awardAt, _, rankKey := getShareRankJackpotKey()
jackpot = db.Redis().GetInt64(rankKey)
rankLess = int64(awardAt.Sub(time.Now()).Seconds())
return
}
func ShareRankJackpotPreGet() (jackpot int64) {
jackpot = db.Redis().GetInt64(getShareRankJackpotPreKey())
return
}

@ -508,6 +508,7 @@ func GetUserCurrencyTotal(uid int, t common.CurrencyType) int64 {
} }
func GetUserCurrencyFloat(uid int, t common.CurrencyType, num int) float64 { func GetUserCurrencyFloat(uid int, t common.CurrencyType, num int) float64 {
t = common.CurrencyINR
var pc, pcr int64 var pc, pcr int64
if err := db.Mysql().C().Model(&common.PlayerCurrency{UID: uid}).Select(t.GetCurrencyName()).Scan(&pc).Error; err != nil { if err := db.Mysql().C().Model(&common.PlayerCurrency{UID: uid}).Select(t.GetCurrencyName()).Scan(&pc).Error; err != nil {
log.Error("err:%v", err) log.Error("err:%v", err)

@ -587,8 +587,9 @@ type LuckyAward struct {
// 金币奖励结构 // 金币奖励结构
Currency CurrencyPair `json:"currencyPair"` // 货币结构 Currency CurrencyPair `json:"currencyPair"` // 货币结构
// 摇奖奖励结构 // 摇奖奖励结构
WheelType int `json:"wheelType"` // 转盘 WheelType int `json:"wheelType"` // 转盘
WheelCount int `json:"wheelCount"` // 摇奖次数 WheelCount int `json:"wheelCount"` // 摇奖次数
WheelLessCount int `json:"wheelLessCount"` // 当前转盘剩余次数
// 权重 // 权重
Weights int `json:"weights"` // 权重 Weights int `json:"weights"` // 权重
} }

@ -72,6 +72,7 @@ const (
ReloadConfigShareWithdrawProducts ReloadConfigShareWithdrawProducts
ReloadConfigShareBanner ReloadConfigShareBanner
ReloadTypeConfigWithdrawWeight ReloadTypeConfigWithdrawWeight
ReloadTypeConfigShareRankAward
) )
// GetConfigStructByType 获取相应配置的结构 // GetConfigStructByType 获取相应配置的结构
@ -197,6 +198,8 @@ func GetConfigStructByType(t int) (interface{}, interface{}) {
return &ConfigShareBanner{}, &[]ConfigShareBanner{} return &ConfigShareBanner{}, &[]ConfigShareBanner{}
case ReloadTypeConfigWithdrawWeight: case ReloadTypeConfigWithdrawWeight:
return &ConfigWithdrawChannels{}, &[]ConfigWithdrawChannels{} return &ConfigWithdrawChannels{}, &[]ConfigWithdrawChannels{}
case ReloadTypeConfigShareRankAward:
return &ConfigShareRankAward{}, &[]ConfigShareRankAward{}
default: default:
return nil, nil return nil, nil
} }

@ -108,6 +108,7 @@ const (
CurrencyEventDrawMail // 领取邮箱奖励 CurrencyEventDrawMail // 领取邮箱奖励
CurrencyEventLuckyWheel // 充值转盘 CurrencyEventLuckyWheel // 充值转盘
CurrencyEventVIPWeekBonus // 领取vip周奖励 CurrencyEventVIPWeekBonus // 领取vip周奖励
CurrencyEventShare
CurrencyEventAll CurrencyEventAll
CurrencyEventGM = 1000 // 后台修改货币 CurrencyEventGM = 1000 // 后台修改货币

@ -58,8 +58,6 @@ type RankData struct {
UserAwardCount int64 `gorm:"column:user_award_count;type:bigint(20);not null;comment:玩家奖励数量" json:"user_award_count"` // 玩家奖励数量 UserAwardCount int64 `gorm:"column:user_award_count;type:bigint(20);not null;comment:玩家奖励数量" json:"user_award_count"` // 玩家奖励数量
Rank int `gorm:"column:rank;type:int(11);default:0;comment:排名" json:"rank"` // 玩家奖励比例(*10000) Rank int `gorm:"column:rank;type:int(11);default:0;comment:排名" json:"rank"` // 玩家奖励比例(*10000)
UpdatedAt int64 `gorm:"column:updated_at;type:bigint(20);not null;comment:更新时间" json:"updated_at"` // 更新时间 UpdatedAt int64 `gorm:"column:updated_at;type:bigint(20);not null;comment:更新时间" json:"updated_at"` // 更新时间
UserInfo PlayerDBInfo `gorm:"-"`
} }
type RankDataWithUser struct { type RankDataWithUser struct {

@ -33,8 +33,6 @@ type ShareInfo struct {
UP3 int `gorm:"column:up3;type:int(11);default:0;comment:上3级"` UP3 int `gorm:"column:up3;type:int(11);default:0;comment:上3级"`
UP4 int `gorm:"column:up4;default:0;type:int(11);comment:上4级"` UP4 int `gorm:"column:up4;default:0;type:int(11);comment:上4级"`
UP5 int `gorm:"column:up5;default:0;type:int(11);comment:上5级"` UP5 int `gorm:"column:up5;default:0;type:int(11);comment:上5级"`
Reward int64 `gorm:"column:reward;default:0;type:bigint(20);comment:总奖励"`
Withdrawable int64 `gorm:"column:withdrawable;default:0;type:bigint(20);comment:可退出奖励"`
UpInviteReward int64 `gorm:"column:up_invite_reward;default:0;type:int(11);comment:为上级创造的邀请奖励"` UpInviteReward int64 `gorm:"column:up_invite_reward;default:0;type:int(11);comment:为上级创造的邀请奖励"`
UpInviteUnlock int64 `gorm:"column:up_invite_Unlock;default:0;type:int(11);comment:为上级已解锁的邀请奖励"` UpInviteUnlock int64 `gorm:"column:up_invite_Unlock;default:0;type:int(11);comment:为上级已解锁的邀请奖励"`
Down1 int64 `gorm:"column:down1;default:0;type:int(11);comment:下1级数量"` Down1 int64 `gorm:"column:down1;default:0;type:int(11);comment:下1级数量"`
@ -46,9 +44,13 @@ type ShareInfo struct {
PopWithdraw int `gorm:"pop_withdraw;default:0;type:tinyint(4);comment:是否弹出过退出"` PopWithdraw int `gorm:"pop_withdraw;default:0;type:tinyint(4);comment:是否弹出过退出"`
ChannelID int `gorm:"column:channel_id;type:int(11);default:0;comment:渠道id"` ChannelID int `gorm:"column:channel_id;type:int(11);default:0;comment:渠道id"`
BetReward int64 `gorm:"column:bet_reward;type:bigint(20);default:0;comment:邀请人下注获得的金额"`
RechargeAmount int64 `gorm:"column:recharge_amount;type:bigint(20);default:0;comment:充值金额"` RechargeAmount int64 `gorm:"column:recharge_amount;type:bigint(20);default:0;comment:充值金额"`
BetAmount int64 `gorm:"column:bet_amount;type:bigint(20);default:0;comment:下注金额"`
UpList []int `gorm:"-"`
Reward int64 `gorm:"column:reward;default:0;type:bigint(20);comment:总奖励"`
Withdrawable int64 `gorm:"column:withdrawable;default:0;type:bigint(20);comment:可退出奖励"`
BetAmount int64 `gorm:"column:bet_amount;type:bigint(20);default:0;comment:下注金额"`
BetAmountTeam int64 `gorm:"column:bet_amount_team;type:bigint(20);default:0;comment:团队下注金额"`
} }
func (a *ShareInfo) TableName() string { func (a *ShareInfo) TableName() string {
@ -184,7 +186,7 @@ const (
type ConfigShareTaskNew struct { type ConfigShareTaskNew struct {
ID int `gorm:"primarykey"` ID int `gorm:"primarykey"`
TaskID int `gorm:"column:task_id;type:int(11);default:1;uniqueIndex:task_id;comment:任务编号" web:"task_id"` TaskID int `gorm:"column:task_id;type:int(11);default:1;uniqueIndex:task_id;comment:任务编号" web:"task_id"`
Type int `gorm:"column:type;type:int(11);default:1;comment:任务类型" web:"type"` Type int `gorm:"column:type;type:int(11);default:2;comment:任务类型" web:"type"`
Condition int `gorm:"column:condition;type:int(11);default:0;comment:任务条件,玩牌对应游戏id" web:"condition"` Condition int `gorm:"column:condition;type:int(11);default:0;comment:任务条件,玩牌对应游戏id" web:"condition"`
Target int64 `gorm:"column:target;type:int(11);default:1;comment:任务目标" web:"target"` Target int64 `gorm:"column:target;type:int(11);default:1;comment:任务目标" web:"target"`
Reward int64 `gorm:"column:reward;type:int(11);default:0;comment:任务奖励" web:"reward"` Reward int64 `gorm:"column:reward;type:int(11);default:0;comment:任务奖励" web:"reward"`
@ -239,12 +241,6 @@ func (c *ShareTaskNewData) GetDesc() string {
} }
} }
type ConfigShareReward struct {
CanWithdraw bool
Amount int64 // 奖励金额
ConditionAmount int64 // 转化条件金额
}
type ConfigShareTiers struct { type ConfigShareTiers struct {
Tier int // 层级 Tier int // 层级
Per int64 // 分成比例 Per int64 // 分成比例
@ -252,23 +248,18 @@ type ConfigShareTiers struct {
// 分享配置 // 分享配置
type ConfigShare struct { type ConfigShare struct {
ID int `gorm:"primarykey"` ID int `gorm:"primarykey"`
PN int `gorm:"column:pn;type:int(11);default:0;comment:包类别" web:"pn"` Level int `gorm:"column:level;type:int(11);default:0;comment:代理等级" web:"level"`
Channel int `gorm:"column:channel;type:int(11);default:0;comment:渠道" web:"channel"` InviteExp int `gorm:"column:invite_exp;type:int(11);default:0;comment:邀请人数" web:"invite_exp"`
Level int `gorm:"column:level;type:int(11);default:1;comment:代理等级" web:"level"` BetExp int `gorm:"column:bet_exp;type:int(11);default:0;comment:下注数" web:"bet_exp"`
Exp int64 `gorm:"column:exp;type:int(11);default:1;comment:升到本级所需总充值" web:"exp"` BetRebate int64 `gorm:"column:bet_rebate;type:int(11);default:0;comment:客损返利(*1万)" web:"bet_rebate"`
InviteReward string `gorm:"column:invite_reward;type:varchar(256);default:'';comment:拉新奖励配置" web:"invite_reward"` RechargeRebate int64 `gorm:"column:recharge_rebate;type:int(11);default:0;comment:充值返利(*1万)" web:"recharge_rebate"`
SubInviteReward ConfigShareReward `gorm:"-"` InviteRebate int64 `gorm:"column:invite_rebate;type:int(11);default:0;comment:拉人奖励" web:"invite_rebate"`
NewReward string `gorm:"column:new_reward;type:varchar(256);default:'';comment:新手奖励配置" web:"new_reward"` RewardTiers string `gorm:"column:reward_tiers;type:varchar(256);default:'[]';comment:返利层级配置" web:"reward_tiers"`
SubNewReward ConfigShareReward `gorm:"-"` SubRewardTiers []ConfigShareTiers `gorm:"-"`
RechargeReward int64 `gorm:"column:recharge_reward;type:int(11);default:10;comment:充值返利比例" web:"recharge_reward"` SubRewardTiersMap map[int]ConfigShareTiers `gorm:"-"`
AffiliateReward int64 `gorm:"column:affiliate_reward;type:int(11);default:0;comment:客损返利比例" web:"affiliate_reward"` DayWithdrawCount int `gorm:"column:day_withdraw_count;type:int(11);default:3;comment:日退出次数" web:"day_withdraw_count"`
RewardTiers string `gorm:"column:reward_tiers;type:varchar(256);default:'[]';comment:返利层级配置" web:"reward_tiers"` WithdrawAudit int64 `gorm:"column:withdraw_audit;type:int(11);default:50000;comment:退出审核金额" web:"withdraw_audit"`
SubRewardTiers []ConfigShareTiers `gorm:"-"`
DayWithdrawCount int `gorm:"column:day_withdraw_count;type:int(11);default:3;comment:日退出次数" web:"day_withdraw_count"`
Open int `gorm:"column:open;type:int(11);default:0;comment:是否打开 1打开" web:"open"`
AffiliateDiscount int64 `gorm:"column:affiliate_discount;type:int(11);default:0;comment:客损折扣比例" web:"affiliate_discount"`
WithdrawAudit int64 `gorm:"column:withdraw_audit;type:int(11);default:50000;comment:退出审核金额" web:"withdraw_audit"`
} }
func (c *ConfigShare) TableName() string { func (c *ConfigShare) TableName() string {
@ -278,11 +269,11 @@ func (c *ConfigShare) TableName() string {
func (c *ConfigShare) CalReward(event int, amount int64) int64 { func (c *ConfigShare) CalReward(event int, amount int64) int64 {
switch event { switch event {
case ShareEventInvitation: case ShareEventInvitation:
return c.SubInviteReward.Amount return c.InviteRebate
case ShareEventRecharge: case ShareEventRecharge:
return amount * c.RechargeReward / 100 return amount * c.RechargeRebate / 10000
case ShareEventAffiliate: case ShareEventAffiliate:
return amount * c.AffiliateDiscount * c.AffiliateReward / 10000 return amount * c.BetRebate / 10000
default: default:
return 0 return 0
} }
@ -291,8 +282,9 @@ func (c *ConfigShare) CalReward(event int, amount int64) int64 {
func (c *ConfigShare) GetLevelUpInfo() LevelUpInfo { func (c *ConfigShare) GetLevelUpInfo() LevelUpInfo {
info := LevelUpInfo{} info := LevelUpInfo{}
info.Level = c.Level info.Level = c.Level
info.Invitation = fmt.Sprintf("%drs/person", c.SubInviteReward.Amount/100) info.Invitation = fmt.Sprintf("%drs/person", c.InviteRebate)
info.RechargeCommission = fmt.Sprintf("%d", c.RechargeReward+c.AffiliateReward) + "%" // todo
//info.RechargeCommission = fmt.Sprintf("%d", c.RechargeReward+c.AffiliateReward) + "%"
tmp := "" tmp := ""
for i, v := range c.SubRewardTiers { for i, v := range c.SubRewardTiers {
this := "" this := ""
@ -387,7 +379,7 @@ func (c *ShareLimitTaskData) IsValid() bool {
} }
type ShareWithdrawInfo struct { type ShareWithdrawInfo struct {
ID int `gorm:"primarykey"` ID int `gorm:"primarykey;autoIncrement:true"`
UID int `gorm:"column:uid;not null;type:int(11);uniqueIndex:uid"` UID int `gorm:"column:uid;not null;type:int(11);uniqueIndex:uid"`
DayCount int `gorm:"column:day_count;type:int(11);default:0;comment:日退出次数"` DayCount int `gorm:"column:day_count;type:int(11);default:0;comment:日退出次数"`
DayTime int64 `gorm:"column:day_time;type:bigint(20);default:0;comment:日退出时间标记"` DayTime int64 `gorm:"column:day_time;type:bigint(20);default:0;comment:日退出时间标记"`
@ -402,7 +394,7 @@ func (c *ShareWithdrawInfo) TableName() string {
// 退出商品配置 // 退出商品配置
type ConfigShareWithdrawProducts struct { type ConfigShareWithdrawProducts struct {
ID int `gorm:"primarykey"` ID int `gorm:"primarykey;autoIncrement:true"`
PN int `gorm:"column:pn;type:int(11);default:0;comment:包类别" web:"pn"` PN int `gorm:"column:pn;type:int(11);default:0;comment:包类别" web:"pn"`
Channel int `gorm:"column:channel;type:int(11);default:0;comment:渠道" web:"channel"` Channel int `gorm:"column:channel;type:int(11);default:0;comment:渠道" web:"channel"`
ProductID int `gorm:"column:product_id;type:int(11);default:0;comment:商品id" web:"product_id"` ProductID int `gorm:"column:product_id;type:int(11);default:0;comment:商品id" web:"product_id"`
@ -415,11 +407,11 @@ func (c *ConfigShareWithdrawProducts) TableName() string {
} }
type ConfigShareBanner struct { type ConfigShareBanner struct {
ID int `gorm:"primarykey"` ID int `gorm:"primarykey;autoIncrement:true"`
PN int `gorm:"column:pn;type:int(11);default:0;comment:包类别" web:"pn"` Sort int `gorm:"column:sort;type:int(11);default:1;comment:排序" web:"sort"`
Channel int `gorm:"column:channel;type:int(11);default:0;comment:渠道" web:"channel"` URL string `gorm:"column:url;type:varchar(256);default:'';comment:图片地址" web:"url"`
Sort int `gorm:"column:sort;type:int(11);default:1;comment:排序" web:"sort"` Desc string `gorm:"column:desc;type:varchar(256);default:'';comment:分享文案" web:"desc"`
URL string `gorm:"column:url;type:varchar(256);default:'';comment:图片地址" web:"url"` SearchWord string `gorm:"column:search_word;type:varchar(512);default:'';comment:google search word" web:"search_word"`
} }
func (c *ConfigShareBanner) TableName() string { func (c *ConfigShareBanner) TableName() string {
@ -427,7 +419,7 @@ func (c *ConfigShareBanner) TableName() string {
} }
type ShareRewardData struct { type ShareRewardData struct {
ID int `gorm:"primarykey"` ID int `gorm:"primarykey;autoIncrement:true"`
UID int `gorm:"column:uid;not null;type:int(11);uniqueIndex:ut"` UID int `gorm:"column:uid;not null;type:int(11);uniqueIndex:ut"`
Time int64 `gorm:"column:time;type:bigint(20);default:0;uniqueIndex:ut;comment:创建时间"` Time int64 `gorm:"column:time;type:bigint(20);default:0;uniqueIndex:ut;comment:创建时间"`
Date string `gorm:"column:date;type:varchar(256);default:''"` Date string `gorm:"column:date;type:varchar(256);default:''"`
@ -497,3 +489,65 @@ type ESShareBalance struct {
Level int Level int
Balance int64 Balance int64
} }
type ShareReward struct {
ID int `gorm:"primarykey;autoIncrement:true"`
UID int `gorm:"column:uid;not null;type:int(11)"`
UpLevel int `gorm:"column:up_level;type:int(11);default:0"`
RewardType int `gorm:"column:reward_type;type:int(11);default:0;comment:奖励类型(1:下注,2:充值,3:任务,4:邀请人,5:提现)"`
RewardCount int64 `gorm:"column:reward_count;type:int(11);default:0;comment:奖励数量"`
RewardDesc string `gorm:"column:reward_desc;type:varchar(256);default:'奖励描述'"`
RewardAt int64 `gorm:"column:reward_at;type:int(11);default:0;comment:奖励时间"`
}
func (c *ShareReward) TableName() string {
return "share_reward"
}
type ConfigShareRankAward struct {
ID int `gorm:"primarykey;autoIncrement:true"`
ShareRankType int `gorm:"column:share_rank_type;type:int(11);default:2;comment:分享排行榜类型(1:日,2:周,3:月)" web:"share_rank_type"`
RankAwards string `gorm:"column:rank_awards;type:text;comment:排行榜奖励信息(复用打码排行榜奖励格式)" web:"rank_awards"`
}
func (c *ConfigShareRankAward) TableName() string {
return "config_share_rank_award"
}
type ShareRankData struct {
ID int64 `gorm:"column:id;type:bigint(20);primaryKey;autoIncrement:true" json:"id"`
UID int `gorm:"column:uid;type:bigint(11);not null;uniqueIndex:rank_idx,priority:3;comment:玩家id" json:"uid"` // 玩家id
RankCycle int `gorm:"column:rank_cycle;type:int(11);default:0;uniqueIndex:rank_idx,priority:1;comment:排行榜周期(1:日,2:周,3:月)" json:"rank_cycle"` // 排行榜周期(1:日,2:周,3:月)
RankAt int64 `gorm:"column:rank_at;type:bigint(20);not null;uniqueIndex:rank_idx,priority:2;comment:排行榜开始日期" json:"rank_at"` // 排行榜开始日期
RankValue int64 `gorm:"column:rank_value;type:bigint(20);not null;comment:玩家数值" json:"rank_value"` // 玩家数值
IsRobot int `gorm:"column:is_robot;type:int(11);not null;comment:是不是机器人(0:不是,1:是)" json:"is_robot"` // 是不是机器人(0:不是,1:是)
UserAward int `gorm:"column:user_award;type:int(11);not null;comment:玩家奖励比例(*10000)" json:"user_award"` // 玩家奖励比例(*10000)
UserAwardCount int64 `gorm:"column:user_award_count;type:bigint(20);not null;comment:玩家奖励数量" json:"user_award_count"` // 玩家奖励数量
Rank int `gorm:"column:rank;type:int(11);default:0;comment:排名" json:"rank"` // 玩家奖励比例(*10000)
UpdatedAt int64 `gorm:"column:updated_at;type:bigint(20);not null;comment:更新时间" json:"updated_at"` // 更新时间
}
type ShareRankDataWithUser struct {
ShareRankData `gorm:"embedded"` // RankData的所有字段会展开到表中
UserInfo PlayerDBInfo `gorm:"embedded"` // UserInfo的所有字段也会展开到同一张表中
}
func (c *ShareRankData) TableName() string {
return "share_rank_data"
}
type LuckyWheelReward struct {
ID int `gorm:"primarykey;autoIncrement:true"`
UID int `gorm:"column:uid;not null;type:int(11)"`
Nick string `gorm:"column:nick;type:varchar(256);default:''"`
LuckyType int `gorm:"column:lucky_type;type:int(11);default:0"`
AwardType int `gorm:"column:award_type;type:int(11);default:1"`
AwardCount int `gorm:"column:award_count;type:int(11);default:0"`
SpeAwardType int `gorm:"column:spe_award_type;type:int(11);default:0"`
SpeAwardCount int `gorm:"column:spe_award_count;type:int(11);default:0"`
UpdatedAt int64 `gorm:"column:updated_at;type:int(11);default:0;comment:奖励时间"`
}
func (c *LuckyWheelReward) TableName() string {
return "lucky_wheel_reward"
}

@ -146,6 +146,10 @@ func MigrateDB() {
new(common.ConfigShareWithdrawProducts), new(common.ConfigShareWithdrawProducts),
new(common.ConfigShareBanner), new(common.ConfigShareBanner),
new(common.ShareRewardData), new(common.ShareRewardData),
new(common.ShareReward),
new(common.ConfigShareRankAward),
new(common.ShareRankData),
new(common.LuckyWheelReward),
) )
if err != nil { if err != nil {
panic("Migrate db fail") panic("Migrate db fail")

@ -195,6 +195,8 @@ func GetControlType(path string) int {
return common.ReloadConfigShareTaskNew return common.ReloadConfigShareTaskNew
case "shareBanner": case "shareBanner":
return common.ReloadConfigShareBanner return common.ReloadConfigShareBanner
case "shareRankAward":
return common.ReloadTypeConfigShareRankAward
default: default:
return 0 return 0
} }

@ -1,6 +1,7 @@
package common package common
import ( import (
"fmt"
"server/call" "server/call"
"server/common" "server/common"
"server/natsClient" "server/natsClient"
@ -43,6 +44,10 @@ type Player struct {
func afterSettle(d *pb.InnerAfterSettle) { func afterSettle(d *pb.InnerAfterSettle) {
log.Debug("afterSettle:%+v", *d) log.Debug("afterSettle:%+v", *d)
UpdateGameData(d) UpdateGameData(d)
// 更新打码排行榜信息
call.UpdateRankValue(1, int(d.UID), d.TotalBet, 0)
// 更新分享信息
call.UpdateShare(int(d.UID), 1, d.TotalBet, fmt.Sprintf("%d", d.FinalSettle-d.TotalBet))
// call.ShareSettle(d) // call.ShareSettle(d)
// p := &Player{uid: int(d.UID), gid: int(d.GameID), settleData: d} // p := &Player{uid: int(d.UID), gid: int(d.GameID), settleData: d}
// p.ActivityFirstRechargeBack() // p.ActivityFirstRechargeBack()

@ -22,11 +22,11 @@ func initTimer() {
// 结算重置每日数据 // 结算重置每日数据
// ShareReset() // ShareReset()
// 分享机器人 // 分享机器人
ShareRobotTimer() // ShareRobotTimer()
// slots奖池活动机器人 // slots奖池活动机器人
ActivitySlotsRobotTimer() // ActivitySlotsRobotTimer()
// slots奖池活动结算 // slots奖池活动结算
ActivitySlotsSettleTimer() // ActivitySlotsSettleTimer()
} }
var ( var (
@ -64,7 +64,8 @@ func ShareRobotTimer() {
db.Mysql().Get(one) db.Mysql().Get(one)
if one.ID == 0 { if one.ID == 0 {
one.Share = util.GetShareCode(one.UID) one.Share = util.GetShareCode(one.UID)
one.BetReward = v.InitCash + add // todo
//one.BetReward = v.InitCash + add
db.Mysql().Create(one) db.Mysql().Create(one)
} else { } else {
db.Mysql().Update(&common.ShareInfo{UID: v.RobotID}, map[string]interface{}{"bet_reward": gorm.Expr("bet_reward + ?", add)}) db.Mysql().Update(&common.ShareInfo{UID: v.RobotID}, map[string]interface{}{"bet_reward": gorm.Expr("bet_reward + ?", add)})

@ -25,6 +25,23 @@ func loadConfig() error {
return nil return nil
}, },
} }
if _, ok := c[common.ReloadTypeConfigShareRankAward]; !ok {
c[common.ReloadTypeConfigShareRankAward] = []func(*pb.ReloadGameConfig) error{
func(rgc *pb.ReloadGameConfig) error {
if err := call.LoadConfigShareRankAward(); err != nil {
log.Error("error : [%s]", err.Error())
return err
}
return nil
},
func(rgc *pb.ReloadGameConfig) error {
util.Go(func() {
call.ShareRankHandler()
})
return nil
},
}
}
call.LoadConfigs(c) call.LoadConfigs(c)
return nil return nil
} }

@ -47,7 +47,7 @@ func onLogin(user *common.PlayerDBInfo, a *app.Gin, isNew bool) {
if config.GetBase().Release { if config.GetBase().Release {
gateURL = "wss://" + gateURL gateURL = "wss://" + gateURL
} else { } else {
gateURL = "wss://" + gateURL + ":16615" gateURL = "ws://" + gateURL + ":16615"
} }
// } else { // } else {
// gateURL = "ws://" + gateURL // gateURL = "ws://" + gateURL

@ -41,9 +41,6 @@ func LuckyWheelCfg(c *gin.Context) {
} }
rechargeInfo := call.GetRechargeInfo(uid) rechargeInfo := call.GetRechargeInfo(uid)
playerData := call.GetPlayerData(uid) playerData := call.GetPlayerData(uid)
log.Debug("get config:%+v", *luckyWheel)
log.Debug("rechargeInfo:%+v", *rechargeInfo)
log.Debug("playerData:%+v", *playerData)
if rechargeInfo.TotalRechargeCount <= int64(luckyWheel.RechargeCount) { if rechargeInfo.TotalRechargeCount <= int64(luckyWheel.RechargeCount) {
return return
} }
@ -101,7 +98,6 @@ func LuckyWheelLottery(c *gin.Context) {
} }
log.Debug("luckyWheelLottery req:%+v", req) log.Debug("luckyWheelLottery req:%+v", req)
call.GetRedisRankKey()
uid := a.UID uid := a.UID
resp := &values.LuckWheelLotteryResp{} resp := &values.LuckWheelLotteryResp{}
if !db.Redis().Lock(common.GetRedisKeyLuckyWheel(uid)) { if !db.Redis().Lock(common.GetRedisKeyLuckyWheel(uid)) {
@ -174,12 +170,14 @@ func LuckyWheelLottery(c *gin.Context) {
case 2: case 2:
addKey := fmt.Sprintf("l%d", award.WheelType) addKey := fmt.Sprintf("l%d", award.WheelType)
playerData.LuckyWheelMap[addKey] += award.WheelCount playerData.LuckyWheelMap[addKey] += award.WheelCount
award.WheelLessCount = playerData.LuckyWheelMap[addKey]
} }
if err != nil { if err != nil {
log.Error("award err, %s", err.Error()) log.Error("award err, %s", err.Error())
a.Code = values.CodeRetry a.Code = values.CodeRetry
return return
} }
call.SetLuckyWheelRecords(uid, req.LuckyType, award)
luckyWheelBytes, err := json.Marshal(playerData.LuckyWheelMap) luckyWheelBytes, err := json.Marshal(playerData.LuckyWheelMap)
if err != nil { if err != nil {
@ -199,3 +197,28 @@ func LuckyWheelLottery(c *gin.Context) {
resp.Award = *award resp.Award = *award
a.Data = resp a.Data = resp
} }
func LuckyWheelAwardRecords(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.LuckWheelAwardRecordsReq)
if !a.S(req) {
return
}
log.Debug("LuckyWheelAwardRecords req:%+v", req)
resp := &values.LuckWheelAwardRecordsResp{}
records, count, totalAmount, err := call.GetLuckWheelRecords(req.Uid, a.UID, req.Page, req.PageSize)
if err != nil {
log.Error("get records err, %s", err.Error())
a.Code = values.CodeRetry
return
}
resp.Records = records
resp.Total = count
resp.TotalAmount = totalAmount
a.Data = resp
}

@ -147,6 +147,12 @@ func RechargeInfo(c *gin.Context) {
for _, channel := range resp.Channels { for _, channel := range resp.Channels {
channel.PayStatus = call.GetChannelStatus(channel.ChannelID) channel.PayStatus = call.GetChannelStatus(channel.ChannelID)
} }
resp.NeedBet = call.GetUserNeedBet(a.UID)
resp.Cash = int64(call.GetUserCurrencyFloat(a.UID, common.CurrencyType(0), 2))
if resp.NeedBet == 0 {
resp.CanWithdraw = resp.Cash
}
} }
func RechargeHistory(c *gin.Context) { func RechargeHistory(c *gin.Context) {

@ -16,117 +16,6 @@ import (
"time" "time"
) )
// 分享信息[done]
func ShareInfo(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
if !a.CheckActivityExpire(common.ActivityIDShare) {
return
}
resp := &values.ShareNewInfoResp{}
a.Data = resp
banners := call.GetConfigShareBanner(a.Channel)
for _, v := range banners {
resp.Banners = append(resp.Banners, v.URL)
}
shareInfo := call.GetShareInfo(a.UID)
resp.NowLevel = shareInfo.Level
resp.NowExp = shareInfo.Exp
nextCon := call.GetConfigShare(shareInfo.Level+1, a.Channel)
if nextCon != nil {
resp.NextExp = nextCon.Exp
} else {
resp.NextExp = shareInfo.Exp
}
conShare := call.GetConfigShare(shareInfo.Level, a.Channel)
if conShare == nil {
a.Code = values.CodeRetry
return
}
resp.ShareLink = call.GetShareLink(a.Channel, a.UID)
user, _ := call.GetUserInfo(a.UID)
resp.Avatar = user.Avatar
// 新手任务弹窗
task := &common.ShareTaskNewData{UID: a.UID}
db.Mysql().Get(task)
if task.ID == 0 { // 初始化任务
if user.IsOldDevice != 1 {
resp.PopNewTask = true
}
resp.NewReward = conShare.SubNewReward.Amount
shareInfo.Reward += conShare.SubNewReward.Amount
update := map[string]interface{}{"reward": gorm.Expr("reward + ?", conShare.SubNewReward.Amount)}
if conShare.SubNewReward.CanWithdraw {
shareInfo.Withdrawable += conShare.SubNewReward.Amount
update["withdrawable"] = gorm.Expr("withdrawable + ?", conShare.SubNewReward.Amount)
// 新建一个任务标记玩家已经领取过新手奖励
task := &common.ShareTaskNewData{UID: a.UID, TaskID: 1, Type: common.ShareTaskNewTypeFirst, Progress: 1, Target: 1, Reward: 0, Status: 1}
db.Mysql().Create(task)
} else {
con := call.GetConfigShareTaskNew()
for _, v := range con {
task := &common.ShareTaskNewData{UID: a.UID, TaskID: v.TaskID, Type: v.Type, Progress: 0, Target: v.Target, Reward: v.Reward, Condition: v.Condition}
if v.Type == common.ShareTaskNewTypeFirst {
task.Progress = 1
}
db.Mysql().Create(task)
}
}
db.Mysql().Update(&common.ShareInfo{UID: a.UID}, update)
call.WriteShareBalance(&common.ESShareBalance{
Event: common.ShareEventOther,
FriendUID: a.UID,
AmountType: int(common.CurrencyINR),
RefererUID: a.UID,
Amount: conShare.SubNewReward.Amount,
Level: 1,
Balance: conShare.SubNewReward.Amount,
}, true)
}
// 可退出弹窗
//products := call.GetConfigWithdrawProduct(common.WithdrawSorceShare)
//if shareInfo.PopWithdraw == 0 && len(products) > 0 && shareInfo.Withdrawable >= products[0].Amount*100 {
// resp.PopWithdraw = true
// resp.PopWithdrawAmount = products[0].Amount * 100
// shareInfo.PopWithdraw = 1
// db.Mysql().Update(&common.ShareInfo{ID: shareInfo.ID}, map[string]interface{}{"pop_withdraw": 1})
//}
resp.Balance = shareInfo.Reward
resp.TotalCommission = shareInfo.Withdrawable
resp.TotalReferrals = shareInfo.Down1 + shareInfo.Down2 + shareInfo.Down3 + shareInfo.Down4 + shareInfo.Down5
resp.TotalWithdrawals = call.GetShareWithdrawInfo(a.UID).TotalWithdraw * 100
// 昨日收益弹窗
{
now := time.Now()
t := util.GetZeroTime(now.AddDate(0, 0, -1)).Unix()
last := &common.ShareRewardData{UID: a.UID, Time: t}
db.Mysql().Get(last)
if last.ID > 0 && !util.IsSameDayTimeStamp(now.Unix(), last.PopTime) {
db.Mysql().Update(&common.ShareRewardData{UID: a.UID, Time: t}, map[string]interface{}{"pop_time": now.Unix()})
resp.LastReward.Total = last.TotalReward
resp.LastReward.Invitation = last.InviteReward
resp.LastReward.Recharge = last.RechargeReward
resp.LastReward.Affiliate = last.AffiliateReward
resp.LastReward.Other = last.OtherReward
}
}
// 升级弹窗
{
if shareInfo.LastLevel != shareInfo.Level {
db.Mysql().Update(&common.ShareInfo{UID: a.UID}, map[string]interface{}{"last_level": shareInfo.Level})
resp.LevelUpInfo = conShare.GetLevelUpInfo()
}
}
}
// 分享新手任务[done] // 分享新手任务[done]
func ShareNewTaskInfo(c *gin.Context) { func ShareNewTaskInfo(c *gin.Context) {
a := app.NewApp(c) a := app.NewApp(c)
@ -188,18 +77,7 @@ func ShareNewTaskDraw(c *gin.Context) {
a.Code = values.CodeRetry a.Code = values.CodeRetry
return return
} }
s := call.GetShareInfo(a.UID) call.UpdateShare(a.UID, 3, task.Reward, fmt.Sprintf("%d", task.Target))
// 转化奖励
db.Mysql().Update(&common.ShareInfo{UID: a.UID}, map[string]interface{}{"withdrawable": gorm.Expr("withdrawable + ?", task.Reward)})
bal := &common.ESShareBalance{
Event: common.ShareEventOther,
AmountType: int(common.CurrencyINR),
Amount: task.Reward,
RefererUID: a.UID,
Level: s.Level,
Balance: s.Withdrawable + task.Reward,
}
call.WriteShareBalance(bal, false)
resp.Reward = task.Reward resp.Reward = task.Reward
} }
@ -378,116 +256,22 @@ func ShareNewRank(c *gin.Context) {
resp.List = list[start:end] resp.List = list[start:end]
} }
// 限时任务 func ShareNewBroadcast(c *gin.Context) {
func ShareLimitTaskInfo(c *gin.Context) {
a := app.NewApp(c) a := app.NewApp(c)
defer func() { defer func() {
a.Response() a.Response()
}() }()
resp := &values.ShareLimitTaskInfoResp{}
a.Data = resp
si := call.GetShareInfo(a.UID)
tasks := []*common.ShareLimitTaskData{}
db.Mysql().QueryBySql(fmt.Sprintf("select * from share_limit_task_data where uid = %d order by level asc", a.UID), &tasks)
now := time.Now().Unix()
var task *common.ShareLimitTaskData
for i := 1; i <= si.Level; i++ {
var thisTask *common.ShareLimitTaskData
for _, v := range tasks {
if v.Level == i {
thisTask = v
break
}
}
if thisTask == nil { // 当前等级还未创建
conTask := call.GetConfigShareLimitTask(i, a.Channel)
if conTask != nil {
thisTask = &common.ShareLimitTaskData{}
thisTask.UID = a.UID
thisTask.Level = i
thisTask.CreateTime = now
thisTask.Time = conTask.Time
thisTask.Status = 0
thisTask.Reward = conTask.Reward
db.Mysql().Create(thisTask)
if i <= si.Level && task == nil {
task = thisTask
}
}
} else if thisTask.IsValid() && task == nil {
task = thisTask
}
}
exLevel := si.Level
nextLevel := si.Level + 1
if task != nil {
exLevel = task.Level
nextLevel = task.Level + 1
resp.TimeLeft = task.CreateTime + task.Time*60 - now
resp.Reward = task.Reward
}
conShareEx := call.GetConfigShare(exLevel, a.Channel) // req := new(values.ShareNewBroadcastReq)
conShare := call.GetConfigShare(nextLevel, a.Channel) // if !a.S(req) {
if conShare == nil { // return
conShare = conShareEx // }
} // if req.Num > 100 {
// req.Num = 100
resp.NowLevel = conShareEx.GetLevelUpInfo() // }
resp.NextLevel = conShare.GetLevelUpInfo()
resp.Exp = si.Exp
resp.LevelUpExp = conShare.Exp
if resp.LevelUpExp < 0 {
resp.LevelUpExp = resp.Exp
}
resp.CanDraw = task != nil && si.Exp >= resp.LevelUpExp
}
func ShareLimitTaskDraw(c *gin.Context) { resp := &values.ShareNewBroadcastResp{List: values.ShareWithdrawBroadcast}
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.ShareLimitTaskDrawReq)
if !a.S(req) {
return
}
resp := &values.ShareLimitTaskDrawResp{}
a.Data = resp a.Data = resp
task := &common.ShareLimitTaskData{UID: a.UID, Level: req.NowLevel}
db.Mysql().Get(task)
if !task.IsValid() {
a.Code = values.CodeParam
a.Msg = "Invalid draw."
return
}
si := call.GetShareInfo(a.UID)
if si.Level <= task.Level { // 不可领取
a.Code = values.CodeParam
a.Msg = "Invalid draw."
return
}
rows, err := db.Mysql().UpdateWRes(&common.ShareLimitTaskData{}, map[string]interface{}{"status": 1},
fmt.Sprintf("uid = %d and level = %d and status = 0", a.UID, task.Level))
if err != nil || rows == 0 {
a.Code = values.CodeParam
a.Msg = "Invalid draw."
return
}
db.Mysql().Update(&common.ShareInfo{UID: a.UID},
map[string]interface{}{"reward": gorm.Expr("reward + ?", task.Reward), "withdrawable": gorm.Expr("withdrawable + ?", task.Reward)})
call.WriteShareBalance(&common.ESShareBalance{
Event: common.ShareEventOther,
// FriendUID: ,
AmountType: int(common.CurrencyINR),
Amount: task.Reward,
RefererUID: a.UID,
Level: si.Level,
Balance: si.Reward + task.Reward,
}, true)
resp.Reward = task.Reward
} }
func ShareNewWithdrawInfo(c *gin.Context) { func ShareNewWithdrawInfo(c *gin.Context) {
@ -757,20 +541,295 @@ func ShareNewWithdrawHis(c *gin.Context) {
} }
} }
func ShareNewBroadcast(c *gin.Context) { // todo
// ShareCfg 分享配置数据
func ShareCfg(c *gin.Context) {
a := app.NewApp(c) a := app.NewApp(c)
defer func() { defer func() {
a.Response() a.Response()
}() }()
if !a.CheckActivityExpire(common.ActivityIDShare) {
return
}
resp := &values.ShareCfgResp{}
a.Data = resp
resp.ShareCfg = call.GetConfigShareAll()
shareInfo := call.GetShareInfo(a.UID)
resp.ShareLevel = shareInfo.Level
resp.InviteCount = shareInfo.Down1 + shareInfo.Down2 + shareInfo.Down3 + shareInfo.Down4 + shareInfo.Down5
resp.BetCount = shareInfo.BetAmountTeam
resp.Amount = shareInfo.Withdrawable
resp.TotalAward = shareInfo.Reward
err := db.Mysql().C().Model(&common.ShareReward{}).
Select("sum(reward_count) as totayAmount").
Where("uid = ? and reward_at > ?", a.UID, util.GetZeroTime(time.Now()).Unix()).
Scan(&resp.TotalAward).Error
if err != nil {
log.Error("get totayAmount err, %s", err.Error())
}
// req := new(values.ShareNewBroadcastReq) resp.ShareLink = call.GetShareLink(a.Channel, a.UID)
// if !a.S(req) { }
// return
// }
// if req.Num > 100 {
// req.Num = 100
// }
resp := &values.ShareNewBroadcastResp{List: values.ShareWithdrawBroadcast} // Reward 奖励页面数据
func Reward(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
resp := &values.RewardResp{}
a.Data = resp a.Data = resp
if !a.CheckActivityExpire(common.ActivityIDShare) {
return
}
jackpot, _ := call.ShareRankJackpotGet()
resp.JackPot = jackpot
weekAt := util.GetWeekZeroTime(time.Now())
shareRankUsers, _, err := call.ShareRankUserGet(1, 3, weekAt, false)
if err != nil {
log.Error("get share rank user err, %s", err.Error())
a.Code = values.CodeRetry
return
}
resp.TopUsers = make([]values.ShareRankUser, 0, len(shareRankUsers))
rankAwards := call.GetConfigShareRankAwardMap()
for index, shareRankUser := range shareRankUsers {
var userAward int
var userAwardExpected int64
rank := index + 1
if rankAwards != nil {
if rankAward, ok := rankAwards[index+1]; ok {
userAward = rankAward.AwardRate
userAwardExpected = jackpot * int64(rankAward.AwardRate) / 10000
}
}
resp.TopUsers = append(resp.TopUsers, values.ShareRankUser{
UserRank: rank,
UserName: shareRankUser.UserInfo.Nick,
UserCount: shareRankUser.UserAwardCount,
UserIcon: shareRankUser.UserInfo.Avatar,
UserAward: userAward,
UserAwardExpected: userAwardExpected,
})
}
// 任务详情
list := []common.ShareTaskNewData{}
db.Mysql().QueryAll(fmt.Sprintf("uid = %d", a.UID), "", &common.ShareTaskNewData{}, &list)
for _, v := range list {
one := values.OneShareNewTask{
TaskID: v.TaskID,
Desc: v.GetDesc(),
Type: v.Type,
Progess: v.Progress,
Target: v.Target,
Reward: v.Reward,
}
if one.Progess >= one.Target || v.Status == 1 {
one.Progess = one.Target
if v.Status == 1 {
one.Status = 2
} else {
one.Status = 1
}
}
resp.TaskList = append(resp.TaskList, one)
}
}
// RewardDetails 玩家奖励详情
func RewardDetails(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.RewardDetailsReq)
if !a.S(req) {
return
}
resp := &values.RewardDetailsResp{}
a.Data = resp
if !a.CheckActivityExpire(common.ActivityIDShare) {
return
}
mdb := db.Mysql().C().Model(&common.ShareReward{}).Where("uid = ?", a.UID)
if req.RewardType != 0 {
mdb = mdb.Where("reward_type = ?", req.RewardType)
}
if req.StartAt != 0 {
mdb = mdb.Where("reward_at >= ?", req.StartAt)
}
if req.EndAt != 0 {
mdb = mdb.Where("reward_at <= ?", req.EndAt)
}
err := mdb.Count(&resp.Total).Error
if err != nil {
log.Error("get total err, %s", err.Error())
a.Code = values.CodeRetry
return
}
// 计算奖励金额总和
var rewardAmount int64
err = mdb.Select("COALESCE(SUM(reward_count), 0)").Row().Scan(&rewardAmount)
if err != nil {
log.Error("get reward amount err, %s", err.Error())
a.Code = values.CodeRetry
return
}
resp.RewardAmount = rewardAmount
err = mdb.Order("reward_at desc").Offset((req.Page - 1) * req.PageSize).Limit(req.PageSize).Find(&resp.List).Error
if err != nil {
log.Error("get list err, %s", err.Error())
a.Code = values.CodeRetry
return
}
}
// RankDetails 排行榜详情
func RankDetails(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.RankDetailsReq)
if !a.S(req) {
return
}
resp := &values.RankDetailsResp{}
a.Data = resp
if !a.CheckActivityExpire(common.ActivityIDShare) {
return
}
rankAt := util.GetWeekZeroTime(time.Now())
if req.Previous {
rankAt = rankAt.AddDate(0, 0, 7)
}
shareRankUsers, count, err := call.ShareRankUserGet(req.Page, req.PageSize, rankAt, true)
if err != nil {
log.Error("get rank user err, %s", err.Error())
a.Code = values.CodeRetry
return
}
jackpot, _ := call.ShareRankJackpotGet()
if req.Previous {
jackpot = call.ShareRankJackpotPreGet()
}
resp.Total = count
rankAwards := call.GetConfigShareRankAwardMap()
for index, shareRankUser := range shareRankUsers {
var userAward int
var userAwardExpected int64
rank := index + 1
if !req.Previous {
if rankAwards != nil {
if rankAward, ok := rankAwards[index+1]; ok {
userAward = rankAward.AwardRate
userAwardExpected = jackpot * int64(rankAward.AwardRate) / 10000
}
}
} else {
userAward = shareRankUser.UserAward
userAwardExpected = shareRankUser.UserAwardCount
}
resp.RankUsers = append(resp.RankUsers, values.ShareRankUser{
UserRank: rank,
UserName: shareRankUser.UserInfo.Nick,
UserCount: shareRankUser.UserAwardCount,
UserIcon: shareRankUser.UserInfo.Avatar,
UserAward: userAward,
UserAwardExpected: userAwardExpected,
})
}
}
func ShareBanner(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
resp := &values.ShareBannerResp{}
a.Data = resp
shareBanners := call.GetConfigShareBanner()
if len(shareBanners) == 0 {
return
}
shareBanner := shareBanners[0]
resp.SearchWord = shareBanner.SearchWord
resp.JpgUrl = shareBanner.URL
resp.Desc = shareBanner.Desc
shareInfo := call.GetShareInfo(a.UID)
resp.ShareCode = shareInfo.Share
resp.ShareLink = call.GetShareLink(a.Channel, a.UID)
}
func ShareWithdraw(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.ShareWithdrawReq)
if !a.S(req) {
return
}
if req.Opt == 0 {
req.Opt = 1
}
uid := a.UID
shareInfo := call.GetShareInfo(uid)
if shareInfo.Reward < req.Amount {
a.Code = values.CodeParam
a.Msg = "Insufficient balance."
return
}
con := call.GetConfigShare(shareInfo.Level, a.Channel)
if con == nil {
a.Code = values.CodeRetry
return
}
sw := call.GetShareWithdrawInfo(uid)
if sw.DayCount >= con.DayWithdrawCount {
a.Code = values.CodeParam
a.Msg = "Withdrawal limit."
return
}
err := call.UpdateShare(uid, 5, req.Amount, fmt.Sprintf("%d", req.Amount))
if err != nil {
log.Error("update share err, %s", err.Error())
a.Code = values.CodeRetry
return
}
_, err = call.UpdateCurrencyPro(&common.UpdateCurrency{
CurrencyBalance: &common.CurrencyBalance{
UID: uid,
Value: req.Amount,
Event: common.CurrencyEventShare,
Type: common.CurrencyINR,
NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, req.Amount, 1),
},
})
if err != nil {
log.Error("update balance err, %s", err.Error())
call.UpdateShare(uid, 6, req.Amount, "callback")
a.Code = values.CodeRetry
return
}
} }

@ -385,7 +385,7 @@ func CheckRedPoint(uid int, c *gin.Context) {
// 判断是否有任务可以领取 // 判断是否有任务可以领取
GetPromotions(nc) GetPromotions(nc)
// 邀请奖励 // 邀请奖励
ShareInfo(nc) //ShareInfo(nc)
// vip奖励 // vip奖励
//GetVipInfo(nc) //GetVipInfo(nc)
}) })

@ -202,6 +202,10 @@ func WithdrawInfo(c *gin.Context) {
resp.Bets = append(resp.Bets, canWithdraw) resp.Bets = append(resp.Bets, canWithdraw)
} }
resp.NeedBet = call.GetUserNeedBet(a.UID) resp.NeedBet = call.GetUserNeedBet(a.UID)
resp.Cash = int64(call.GetUserCurrencyFloat(a.UID, common.CurrencyType(0), 2))
if resp.NeedBet == 0 {
resp.CanWithdraw = resp.Cash
}
a.Data = resp a.Data = resp
} }

@ -36,7 +36,7 @@ func GetBalance(c *gin.Context) {
req := &GetBalanceReq{} req := &GetBalanceReq{}
resp := &GetBalanceResp{} resp := &GetBalanceResp{}
a.RetData = resp a.RetData = resp
if !a.S(req) { if !a.SB(req) {
resp.Code = CodeRequestInvalidParams resp.Code = CodeRequestInvalidParams
return return
} }
@ -72,7 +72,7 @@ func GameBet(c *gin.Context) {
req := &GameBetReq{} req := &GameBetReq{}
resp := &GameBetResp{} resp := &GameBetResp{}
a.RetData = resp a.RetData = resp
if !a.S(req) { if !a.SB(req) {
resp.Code = CodeRequestInvalidParams resp.Code = CodeRequestInvalidParams
return return
} }
@ -89,14 +89,15 @@ func GameBet(c *gin.Context) {
now := time.Now().Unix() now := time.Now().Unix()
if req.Reason == "bet" || req.Reason == "win" { if req.Reason == "bet" || req.Reason == "win" {
betReq := &base.BetReq{ betReq := &base.BetReq{
UID: uid, UID: uid,
SessionType: base.SessionTypeBet, CurrencyType: common.CurrencyINR,
GameID: GetGameID(common.ProviderJin2, req.GameID), SessionType: base.SessionTypeBet,
GameName: req.GameID, GameID: GetGameID(common.ProviderJin2, req.GameID),
Provider: provider, GameName: req.GameID,
BetID: req.TransactionID, Provider: provider,
SessionID: req.RoundID, BetID: req.TransactionID,
Time: now, SessionID: req.RoundID,
Time: now,
} }
if req.Reason == "bet" { if req.Reason == "bet" {
betReq.BetAmount = util.Abs(int64(req.Amount * common.DecimalDigits)) betReq.BetAmount = util.Abs(int64(req.Amount * common.DecimalDigits))

@ -8,4 +8,5 @@ import (
func luckyWheel(e *gin.RouterGroup) { func luckyWheel(e *gin.RouterGroup) {
e.POST("/luckyWheel/cfg", handler.LuckyWheelCfg) e.POST("/luckyWheel/cfg", handler.LuckyWheelCfg)
e.POST("/luckyWheel/lottery", handler.LuckyWheelLottery) e.POST("/luckyWheel/lottery", handler.LuckyWheelLottery)
e.POST("/luckyWheel/awardRecords", handler.LuckyWheelAwardRecords)
} }

@ -6,18 +6,23 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
// todo 邀请,充值,客损
func share(e *gin.RouterGroup) { func share(e *gin.RouterGroup) {
// 新版分享 // 新版分享
e.POST("/share/info", handler.ShareInfo) e.POST("/share/cfg", handler.ShareCfg)
e.POST("/share/taskInfo", handler.ShareNewTaskInfo) e.POST("/share/reward", handler.Reward)
e.POST("/share/reward/details", handler.RewardDetails)
e.POST("/share/rank/details", handler.RankDetails)
e.POST("/share/banner", handler.ShareBanner)
e.POST("/share/withdraw", handler.ShareWithdraw)
e.POST("/share/taskDraw", handler.ShareNewTaskDraw) e.POST("/share/taskDraw", handler.ShareNewTaskDraw)
e.POST("/share/taskInfo", handler.ShareNewTaskInfo)
e.POST("/share/affiliate", handler.ShareNewAffiliate) e.POST("/share/affiliate", handler.ShareNewAffiliate)
e.POST("/share/commission", handler.ShareNewCommission) e.POST("/share/commission", handler.ShareNewCommission)
e.POST("/share/rank", handler.ShareNewRank) e.POST("/share/rank", handler.ShareNewRank)
e.POST("/share/limitTaskInfo", handler.ShareLimitTaskInfo)
e.POST("/share/limitTaskDraw", handler.ShareLimitTaskDraw)
e.POST("/share/withdrawInfo", handler.ShareNewWithdrawInfo) e.POST("/share/withdrawInfo", handler.ShareNewWithdrawInfo)
e.POST("/share/withdraw", handler.ShareNewWithdraw) //e.POST("/share/withdraw", handler.ShareNewWithdraw)
e.POST("/share/withdrawHis", handler.ShareNewWithdrawHis) e.POST("/share/withdrawHis", handler.ShareNewWithdrawHis)
e.POST("/share/broadcast", handler.ShareNewBroadcast) e.POST("/share/broadcast", handler.ShareNewBroadcast)
} }

@ -1,6 +1,8 @@
package values package values
import "server/common" import (
"server/common"
)
type LuckyWheelCfgReq struct { type LuckyWheelCfgReq struct {
} }
@ -23,3 +25,18 @@ type LuckWheelLotteryResp struct {
AwardIndex int `json:"awardIndex"` // 奖励下标 AwardIndex int `json:"awardIndex"` // 奖励下标
Award common.LuckyAward `json:"award"` // 奖励类型 Award common.LuckyAward `json:"award"` // 奖励类型
} }
type LuckWheelAwardRecordsReq struct {
// 针对个人
Uid int `json:"uid"`
Page int `json:"page"`
PageSize int `json:"pageSize"`
// 针对大厅(大厅场景最多返回10条)
}
type LuckWheelAwardRecordsResp struct {
Records []common.LuckyWheelReward `json:"records"`
Total int64 `json:"total"` // 总数
TotalAmount int64 `json:"totalAmount"` // 总奖励数量
}

@ -26,6 +26,10 @@ type RechargeInfoResp struct {
Tips string Tips string
SelectID int SelectID int
DiscountTicket []*DiscountTicket DiscountTicket []*DiscountTicket
Cash int64
CanWithdraw int64
NeedBet int64
} }
type PayInfo struct { type PayInfo struct {
@ -175,7 +179,10 @@ type WithDrawInfoResp struct {
Tips string Tips string
Fees []int64 Fees []int64
Bets []int64 Bets []int64
NeedBet int64 // 打码信息
Cash int64 // 货币
CanWithdraw int64 // 可提现金额
NeedBet int64 // 打码信息
} }
// WithdrawHistoryReq 请求退出记录 // WithdrawHistoryReq 请求退出记录

@ -46,15 +46,6 @@ type OneShareRank struct {
Reward int64 Reward int64
} }
// Opt 1转到余额 2直接赠送
// PayAccount opt为2时必填
type ShareWithdrawReq struct {
Opt int `json:"Opt" binding:"required"`
Amount int64 `json:"Amount" binding:"required"`
// 可能对应多种结构
PayAccount map[string]interface{} `json:"PayAccount"`
}
// Available 可用余额 // Available 可用余额
type ShareWithdrawResp struct { type ShareWithdrawResp struct {
Available int64 Available int64

@ -58,15 +58,6 @@ type ShareNewTaskDrawResp struct {
// Target 任务目标 // Target 任务目标
// Reward 任务奖励 // Reward 任务奖励
// Status 任务状态,0进行中,1可领取,2已领取 // Status 任务状态,0进行中,1可领取,2已领取
type OneShareNewTask struct {
TaskID int
Desc string
Type int
Progess int64
Target int64
Reward int64
Status int
}
// Page 页码 // Page 页码
// Num 一页个数,最大50 // Num 一页个数,最大50
@ -231,3 +222,90 @@ type ShareNewBroadcastReq struct {
type ShareNewBroadcastResp struct { type ShareNewBroadcastResp struct {
List []string List []string
} }
type ShareCfgResp struct {
// 等级配置
ShareCfg []common.ConfigShare `json:"shareCfg"`
// 分享等级
ShareLevel int `json:"shareLevel"`
// 邀请人数
InviteCount int64 `json:"inviteCount"`
// 团队下注金额
BetCount int64 `json:"betCount"`
// 奖励金额
Amount int64 `json:"amount"`
// 总奖励
TotalAward int64 `json:"totalAward"`
// 当天奖励
TodayAward int64 `json:"todayAward"`
// 分享链接
ShareLink string `json:"shareLink"`
}
type RewardDetailsReq struct {
RewardType int `json:"rewardType"`
StartAt int64 `json:"startAt"`
EndAt int64 `json:"endAt"`
Page int `json:"page"`
PageSize int `json:"pageSize"`
}
type RewardDetailsResp struct {
Total int64 `json:"total"`
RewardAmount int64 `json:"rewardAmount"`
List []common.ShareReward `json:"list"`
}
type ShareRankUser struct { // 排行榜玩家
UserRank int `json:"userRank"` // 玩家排名
UserName string `json:"userName"` // 玩家昵称
UserCount int64 `json:"userCount"` // 玩家数值
UserIcon string `json:"userIcon"` // 玩家头像
UserAward int `json:"userAward"` // 玩家预计分奖比例(*10000)
UserAwardExpected int64 `json:"userAwardExpected"` // 玩家预计奖励
}
type OneShareNewTask struct { // 任务列表
TaskID int `json:"taskID"`
Desc string `json:"desc"`
Type int `json:"type"`
Progess int64 `json:"progess"`
Target int64 `json:"target"`
Reward int64 `json:"reward"`
Status int `json:"status"`
}
type RewardResp struct {
TopUsers []ShareRankUser `json:"topUsers"` // 前三玩家
TaskList []OneShareNewTask `json:"taskList"` // 任务列表
JackPot int64 `json:"jackPot"` // 奖池数值
}
type RankDetailsReq struct {
Previous bool `json:"previous"` // 历史列表
Page int `json:"page"`
PageSize int `json:"pageSize"`
}
type RankDetailsResp struct {
Total int64 `json:"total"`
RankUsers []ShareRankUser `json:"rankUsers"`
JackPot int64 `json:"jackPot"`
}
type ShareBannerResp struct {
JpgUrl string `json:"jpgUrl"` // 图片地址
ShareCode string `json:"shareCode"` // 分享码
SearchWord string `json:"searchWord"` // google search word
Desc string `json:"desc"` // 文案
ShareLink string `json:"shareLink"` // 分享链接
}
// Opt 1转到余额 2直接赠送
// PayAccount opt为2时必填
type ShareWithdrawReq struct {
Opt int `json:"Opt"`
Amount int64 `json:"Amount"`
// 可能对应多种结构
PayAccount map[string]interface{} `json:"PayAccount"`
}

Loading…
Cancel
Save