diff --git a/call/config.go b/call/config.go index f3602d8..96ea7a0 100644 --- a/call/config.go +++ b/call/config.go @@ -11,6 +11,7 @@ import ( "server/util" "sort" "strings" + "sync" "time" "github.com/liangdas/mqant/log" @@ -88,6 +89,14 @@ var ( configShareLimitTask []*common.ConfigShareLimitTask configShareWithdrawProducts []*common.ConfigShareWithdrawProducts 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 ( @@ -1035,33 +1044,29 @@ func GetConfigAppSpin() []*common.ConfigAppSpin { } func LoadConfigShare() (err error) { + configShareMu.Lock() + defer configShareMu.Unlock() 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) return err } + if configShareMap == nil { + configShareMap = make(map[int]*common.ConfigShare) + } 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 != "" { err := json.Unmarshal([]byte(v.RewardTiers), &v.SubRewardTiers) if err != nil { log.Error("err:%v", 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 return nil @@ -1069,47 +1074,58 @@ func LoadConfigShare() (err error) { func GetConfigShare(level, channel int) *common.ConfigShare { for _, v := range configShare { - if v.Level != level { - continue - } - if v.Channel == channel || v.Channel == channel-10000 || v.Channel == 0 { + if v.Level == level { return v } } return nil } -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 +func GetConfigShareAll() []common.ConfigShare { + result := make([]common.ConfigShare, 0, len(configShare)) for _, v := range configShare { - if v.Channel == channel || v.Channel == channel-10000 { - result = append(result, v) - continue - } + result = append(result, *v) } 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 分享系统配置 func LoadConfigShareSys() (err error) { one := new(common.ConfigShareSys) @@ -2179,13 +2195,10 @@ func LoadConfigShareBanner() (err error) { return nil } -func GetConfigShareBanner(channel int) []*common.ConfigShareBanner { +func GetConfigShareBanner() []*common.ConfigShareBanner { var result []*common.ConfigShareBanner for _, v := range configShareBanner { - if v.Channel == channel || v.Channel == channel-10000 { - result = append(result, v) - continue - } + result = append(result, v) } return result } @@ -2267,3 +2280,49 @@ func GetShareWithdrawInfo(uid int) *common.ShareWithdrawInfo { } 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] +} diff --git a/call/pay.go b/call/pay.go index b58bd02..f2e97fe 100644 --- a/call/pay.go +++ b/call/pay.go @@ -531,9 +531,10 @@ func PayActivity(r *common.RechargeOrder, notCharge bool, user *common.PlayerDBI if notCharge { InsertLoginRecord(r.UID, r.ChannelID, user.IP, user.Birth, user.Platform) } - CheckShare(r) // todo util.Go(func() { + UpdateShare(r.UID, 2, r.Amount) + shareInfo := common.ShareInfo{UID: user.Id} err = db.Mysql().Get(&shareInfo) if err != nil { diff --git a/call/rank.go b/call/rank.go index 5eb2990..69f6f57 100644 --- a/call/rank.go +++ b/call/rank.go @@ -189,20 +189,22 @@ func rankAward(ticker *rankTicker) { log.Error("rankAward, %s update rankData err, %s", jackpotKey, err.Error()) continue } + if userAwardCount == 0 { + continue + } // todo 给玩家邮件发奖 - - // 重置上一期奖池数量 - if lessJackpot > 0 { - log.Debug("rankAward, %s less jackpot:%d", jackpotKey, lessJackpot) - err = db.Redis().GetRedis().Set(context.Background(), jackpotKey, lessJackpot, 0).Err() - if err != nil { - log.Error("rankAward, %s set less-jackpot err, %s", jackpotKey, err.Error()) - } - _, _, _, jackpotKeyNow := getRankJackpotKey(rankConfig.RankType, rankConfig.RankCycle) - _, err = db.Redis().Incr(jackpotKeyNow, lessJackpot) - if err != nil { - log.Error("rankAward, %s:%s incr less-jackpot err, %s", jackpotKey, jackpotKeyNow, err.Error()) - } + } + // 重置上一期奖池数量 + log.Debug("rankAward, %s, %d, less jackpot:%d", jackpotKey, jackpot, lessJackpot) + err = db.Redis().GetRedis().Set(context.Background(), jackpotKey, lessJackpot, 0).Err() + if err != nil { + log.Error("rankAward, %s set less-jackpot err, %s", jackpotKey, err.Error()) + } + if lessJackpot > 0 { + _, _, _, jackpotKeyNow := getRankJackpotKey(rankConfig.RankType, rankConfig.RankCycle) + _, err = db.Redis().Incr(jackpotKeyNow, lessJackpot) + if err != nil { + log.Error("rankAward, %s:%s incr less-jackpot err, %s", jackpotKey, jackpotKeyNow, err.Error()) } } } diff --git a/call/reload.go b/call/reload.go index 8efa7ef..856954b 100644 --- a/call/reload.go +++ b/call/reload.go @@ -623,4 +623,13 @@ func CommonReload(c map[int][]func(*pb.ReloadGameConfig) error) { 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 + }} + } } diff --git a/call/share.go b/call/share.go index 5e424ec..7632cb1 100644 --- a/call/share.go +++ b/call/share.go @@ -1,13 +1,16 @@ package call import ( + "context" "fmt" + "gorm.io/gorm/clause" "reflect" "server/common" "server/db" "server/pb" "server/util" "strings" + "sync" "time" "github.com/liangdas/mqant/log" @@ -22,9 +25,19 @@ func GetShareInfo(uid int) *common.ShareInfo { shareInfo.ChannelID = info.ChannelID shareInfo.Share = util.GetShareCode(uid) shareInfo.CreateTime = time.Now().Unix() - shareInfo.Level = 1 + shareInfo.Level = 0 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 } func GetShareInfoByCode(code string) *common.ShareInfo { @@ -62,10 +75,7 @@ func ShareBind(share string, isOld bool, uid, cid int) { db.Mysql().Get(upInfo) if upInfo.ID > 0 { upInfo.UID = upInfo.UID - // todo ?发送奖励? - //util.Go(func() { - // SendShareReward(cid, codeInfo.UID, codeInfo.ActivityId) - //}) + UpdateShare(upInfo.UID, 4, 0, fmt.Sprintf("%d", uid)) } else { // 一级 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))}) } - // todo 更新上级邀请玩家数量? - CheckTask(Task{Uid: upInfo.UID, Value: 1, Types: []common.TaskType{common.TaskTypeInvite}}) // todo util.Go(func() { if upInfo.UID != 0 { @@ -126,50 +134,50 @@ func ShareBind(share string, isOld bool, uid, cid int) { }) } -// 判断分享,发放有效用户奖励 -func CheckShare(r *common.RechargeOrder) { - shareInfo := GetShareInfo(r.UID) - // todo - if GetConfigShareSys() == nil { - return - } - reward := GetConfigShareSys().ShareReward - // 付费分享 - // CheckShareTask(shareInfo.UP1, 1, common.TaskTypePayShare) - // 发放奖励 - update := map[string]interface{}{ - "recharge_amount": gorm.Expr("recharge_amount + ?", r.Amount), - } - if shareInfo.BetAmount != -1 { - update["bet_amount"] = gorm.Expr("bet_amount + ?", r.Amount) - } - db.Mysql().Update(&common.ShareInfo{UID: r.UID}, update) - betAmount := shareInfo.BetAmount - if betAmount == -1 { - betAmount = 0 - } - if shareInfo.RechargeAmount+r.Amount < GetConfigShareSys().ShareRecharge { - return - } - if shareInfo.UP1 == 0 { - return - } - if shareInfo.BetAmount >= 0 { - db.Mysql().Update(&common.ShareInfo{UID: r.UID}, map[string]interface{}{ - "bet_amount": -1, - }) - update = map[string]interface{}{ - "invalid_invites": gorm.Expr("invalid_invites + 1"), - "invite_reward": gorm.Expr("invite_reward + ?", reward), - "available_reward": gorm.Expr("available_reward + ?", reward), - } - db.Mysql().Update(&common.ShareInfo{UID: shareInfo.UP1}, update) - ShareRecharge(r.UID, r.Amount+betAmount, 1) - IncreaseInviteCount(fmt.Sprintf("%v", shareInfo.UP1), 1, false) - } else { - ShareRecharge(r.UID, r.Amount+betAmount, 2) - } -} +//// 判断分享,发放有效用户奖励 +//func CheckShare(r *common.RechargeOrder) { +// shareInfo := GetShareInfo(r.UID) +// // todo +// if GetConfigShareSys() == nil { +// return +// } +// reward := GetConfigShareSys().ShareReward +// // 付费分享 +// // CheckShareTask(shareInfo.UP1, 1, common.TaskTypePayShare) +// // 发放奖励 +// update := map[string]interface{}{ +// "recharge_amount": gorm.Expr("recharge_amount + ?", r.Amount), +// } +// if shareInfo.BetAmount != -1 { +// update["bet_amount"] = gorm.Expr("bet_amount + ?", r.Amount) +// } +// db.Mysql().Update(&common.ShareInfo{UID: r.UID}, update) +// betAmount := shareInfo.BetAmount +// if betAmount == -1 { +// betAmount = 0 +// } +// if shareInfo.RechargeAmount+r.Amount < GetConfigShareSys().ShareRecharge { +// return +// } +// if shareInfo.UP1 == 0 { +// return +// } +// if shareInfo.BetAmount >= 0 { +// db.Mysql().Update(&common.ShareInfo{UID: r.UID}, map[string]interface{}{ +// "bet_amount": -1, +// }) +// update = map[string]interface{}{ +// "invalid_invites": gorm.Expr("invalid_invites + 1"), +// "invite_reward": gorm.Expr("invite_reward + ?", reward), +// "available_reward": gorm.Expr("available_reward + ?", reward), +// } +// db.Mysql().Update(&common.ShareInfo{UID: shareInfo.UP1}, update) +// ShareRecharge(r.UID, r.Amount+betAmount, 1) +// IncreaseInviteCount(fmt.Sprintf("%v", shareInfo.UP1), 1, false) +// } else { +// ShareRecharge(r.UID, r.Amount+betAmount, 2) +// } +//} func ShareRecharge(uid int, amount int64, typ int) { 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) 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 +} diff --git a/call/user.go b/call/user.go index bec6bbb..c9c6d07 100644 --- a/call/user.go +++ b/call/user.go @@ -508,6 +508,7 @@ func GetUserCurrencyTotal(uid int, t common.CurrencyType) int64 { } func GetUserCurrencyFloat(uid int, t common.CurrencyType, num int) float64 { + t = common.CurrencyINR var pc, pcr int64 if err := db.Mysql().C().Model(&common.PlayerCurrency{UID: uid}).Select(t.GetCurrencyName()).Scan(&pc).Error; err != nil { log.Error("err:%v", err) diff --git a/common/activity.go b/common/activity.go index 09bae64..22c5294 100644 --- a/common/activity.go +++ b/common/activity.go @@ -587,8 +587,9 @@ type LuckyAward struct { // 金币奖励结构 Currency CurrencyPair `json:"currencyPair"` // 货币结构 // 摇奖奖励结构 - WheelType int `json:"wheelType"` // 转盘 - WheelCount int `json:"wheelCount"` // 摇奖次数 + WheelType int `json:"wheelType"` // 转盘 + WheelCount int `json:"wheelCount"` // 摇奖次数 + WheelLessCount int `json:"wheelLessCount"` // 当前转盘剩余次数 // 权重 Weights int `json:"weights"` // 权重 } diff --git a/common/config.go b/common/config.go index 5a29be6..0b54964 100644 --- a/common/config.go +++ b/common/config.go @@ -72,6 +72,7 @@ const ( ReloadConfigShareWithdrawProducts ReloadConfigShareBanner ReloadTypeConfigWithdrawWeight + ReloadTypeConfigShareRankAward ) // GetConfigStructByType 获取相应配置的结构 @@ -197,6 +198,8 @@ func GetConfigStructByType(t int) (interface{}, interface{}) { return &ConfigShareBanner{}, &[]ConfigShareBanner{} case ReloadTypeConfigWithdrawWeight: return &ConfigWithdrawChannels{}, &[]ConfigWithdrawChannels{} + case ReloadTypeConfigShareRankAward: + return &ConfigShareRankAward{}, &[]ConfigShareRankAward{} default: return nil, nil } diff --git a/common/currency.go b/common/currency.go index 9fa256c..2671f49 100644 --- a/common/currency.go +++ b/common/currency.go @@ -108,6 +108,7 @@ const ( CurrencyEventDrawMail // 领取邮箱奖励 CurrencyEventLuckyWheel // 充值转盘 CurrencyEventVIPWeekBonus // 领取vip周奖励 + CurrencyEventShare CurrencyEventAll CurrencyEventGM = 1000 // 后台修改货币 diff --git a/common/rank.go b/common/rank.go index 1afca09..1812698 100644 --- a/common/rank.go +++ b/common/rank.go @@ -58,8 +58,6 @@ type RankData struct { 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"` // 更新时间 - - UserInfo PlayerDBInfo `gorm:"-"` } type RankDataWithUser struct { diff --git a/common/share.go b/common/share.go index 43ebaec..24aa042 100644 --- a/common/share.go +++ b/common/share.go @@ -33,8 +33,6 @@ type ShareInfo struct { UP3 int `gorm:"column:up3;type:int(11);default:0;comment:上3级"` UP4 int `gorm:"column:up4;default:0;type:int(11);comment:上4级"` 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:为上级创造的邀请奖励"` 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级数量"` @@ -46,9 +44,13 @@ type ShareInfo struct { PopWithdraw int `gorm:"pop_withdraw;default:0;type:tinyint(4);comment:是否弹出过退出"` 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:充值金额"` - 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 { @@ -184,7 +186,7 @@ const ( type ConfigShareTaskNew struct { ID int `gorm:"primarykey"` 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"` 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"` @@ -239,12 +241,6 @@ func (c *ShareTaskNewData) GetDesc() string { } } -type ConfigShareReward struct { - CanWithdraw bool - Amount int64 // 奖励金额 - ConditionAmount int64 // 转化条件金额 -} - type ConfigShareTiers struct { Tier int // 层级 Per int64 // 分成比例 @@ -252,23 +248,18 @@ type ConfigShareTiers struct { // 分享配置 type ConfigShare struct { - ID int `gorm:"primarykey"` - 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"` - Level int `gorm:"column:level;type:int(11);default:1;comment:代理等级" web:"level"` - Exp int64 `gorm:"column:exp;type:int(11);default:1;comment:升到本级所需总充值" web:"exp"` - InviteReward string `gorm:"column:invite_reward;type:varchar(256);default:'';comment:拉新奖励配置" web:"invite_reward"` - SubInviteReward ConfigShareReward `gorm:"-"` - NewReward string `gorm:"column:new_reward;type:varchar(256);default:'';comment:新手奖励配置" web:"new_reward"` - SubNewReward ConfigShareReward `gorm:"-"` - RechargeReward int64 `gorm:"column:recharge_reward;type:int(11);default:10;comment:充值返利比例" web:"recharge_reward"` - AffiliateReward int64 `gorm:"column:affiliate_reward;type:int(11);default:0;comment:客损返利比例" web:"affiliate_reward"` - RewardTiers string `gorm:"column:reward_tiers;type:varchar(256);default:'[]';comment:返利层级配置" web:"reward_tiers"` - 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"` + ID int `gorm:"primarykey"` + Level int `gorm:"column:level;type:int(11);default:0;comment:代理等级" web:"level"` + InviteExp int `gorm:"column:invite_exp;type:int(11);default:0;comment:邀请人数" web:"invite_exp"` + BetExp int `gorm:"column:bet_exp;type:int(11);default:0;comment:下注数" web:"bet_exp"` + BetRebate int64 `gorm:"column:bet_rebate;type:int(11);default:0;comment:客损返利(*1万)" web:"bet_rebate"` + RechargeRebate int64 `gorm:"column:recharge_rebate;type:int(11);default:0;comment:充值返利(*1万)" web:"recharge_rebate"` + InviteRebate int64 `gorm:"column:invite_rebate;type:int(11);default:0;comment:拉人奖励" web:"invite_rebate"` + RewardTiers string `gorm:"column:reward_tiers;type:varchar(256);default:'[]';comment:返利层级配置" web:"reward_tiers"` + SubRewardTiers []ConfigShareTiers `gorm:"-"` + SubRewardTiersMap map[int]ConfigShareTiers `gorm:"-"` + DayWithdrawCount int `gorm:"column:day_withdraw_count;type:int(11);default:3;comment:日退出次数" web:"day_withdraw_count"` + WithdrawAudit int64 `gorm:"column:withdraw_audit;type:int(11);default:50000;comment:退出审核金额" web:"withdraw_audit"` } func (c *ConfigShare) TableName() string { @@ -278,11 +269,11 @@ func (c *ConfigShare) TableName() string { func (c *ConfigShare) CalReward(event int, amount int64) int64 { switch event { case ShareEventInvitation: - return c.SubInviteReward.Amount + return c.InviteRebate case ShareEventRecharge: - return amount * c.RechargeReward / 100 + return amount * c.RechargeRebate / 10000 case ShareEventAffiliate: - return amount * c.AffiliateDiscount * c.AffiliateReward / 10000 + return amount * c.BetRebate / 10000 default: return 0 } @@ -291,8 +282,9 @@ func (c *ConfigShare) CalReward(event int, amount int64) int64 { func (c *ConfigShare) GetLevelUpInfo() LevelUpInfo { info := LevelUpInfo{} info.Level = c.Level - info.Invitation = fmt.Sprintf("%drs/person", c.SubInviteReward.Amount/100) - info.RechargeCommission = fmt.Sprintf("%d", c.RechargeReward+c.AffiliateReward) + "%" + info.Invitation = fmt.Sprintf("%drs/person", c.InviteRebate) + // todo + //info.RechargeCommission = fmt.Sprintf("%d", c.RechargeReward+c.AffiliateReward) + "%" tmp := "" for i, v := range c.SubRewardTiers { this := "" @@ -387,7 +379,7 @@ func (c *ShareLimitTaskData) IsValid() bool { } 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"` DayCount int `gorm:"column:day_count;type:int(11);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 { - ID int `gorm:"primarykey"` + ID int `gorm:"primarykey;autoIncrement:true"` 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"` 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 { - ID int `gorm:"primarykey"` - 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"` - Sort int `gorm:"column:sort;type:int(11);default:1;comment:排序" web:"sort"` - URL string `gorm:"column:url;type:varchar(256);default:'';comment:图片地址" web:"url"` + ID int `gorm:"primarykey;autoIncrement:true"` + Sort int `gorm:"column:sort;type:int(11);default:1;comment:排序" web:"sort"` + URL string `gorm:"column:url;type:varchar(256);default:'';comment:图片地址" web:"url"` + Desc string `gorm:"column:desc;type:varchar(256);default:'';comment:分享文案" web:"desc"` + SearchWord string `gorm:"column:search_word;type:varchar(512);default:'';comment:google search word" web:"search_word"` } func (c *ConfigShareBanner) TableName() string { @@ -427,7 +419,7 @@ func (c *ConfigShareBanner) TableName() string { } 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"` Time int64 `gorm:"column:time;type:bigint(20);default:0;uniqueIndex:ut;comment:创建时间"` Date string `gorm:"column:date;type:varchar(256);default:''"` @@ -497,3 +489,65 @@ type ESShareBalance struct { Level int 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" +} diff --git a/modules/backend/migrate.go b/modules/backend/migrate.go index 4d29ed3..43d333e 100644 --- a/modules/backend/migrate.go +++ b/modules/backend/migrate.go @@ -146,6 +146,10 @@ func MigrateDB() { new(common.ConfigShareWithdrawProducts), new(common.ConfigShareBanner), new(common.ShareRewardData), + new(common.ShareReward), + new(common.ConfigShareRankAward), + new(common.ShareRankData), + new(common.LuckyWheelReward), ) if err != nil { panic("Migrate db fail") diff --git a/modules/backend/values/gm.go b/modules/backend/values/gm.go index 6465ef2..d48583c 100644 --- a/modules/backend/values/gm.go +++ b/modules/backend/values/gm.go @@ -195,6 +195,8 @@ func GetControlType(path string) int { return common.ReloadConfigShareTaskNew case "shareBanner": return common.ReloadConfigShareBanner + case "shareRankAward": + return common.ReloadTypeConfigShareRankAward default: return 0 } diff --git a/modules/common/nats.go b/modules/common/nats.go index f03dea7..03fcdb3 100644 --- a/modules/common/nats.go +++ b/modules/common/nats.go @@ -1,6 +1,7 @@ package common import ( + "fmt" "server/call" "server/common" "server/natsClient" @@ -43,6 +44,10 @@ type Player struct { func afterSettle(d *pb.InnerAfterSettle) { log.Debug("afterSettle:%+v", *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) // p := &Player{uid: int(d.UID), gid: int(d.GameID), settleData: d} // p.ActivityFirstRechargeBack() diff --git a/modules/common/timer.go b/modules/common/timer.go index 867f1ce..9f10c2b 100644 --- a/modules/common/timer.go +++ b/modules/common/timer.go @@ -22,11 +22,11 @@ func initTimer() { // 结算重置每日数据 // ShareReset() // 分享机器人 - ShareRobotTimer() + // ShareRobotTimer() // slots奖池活动机器人 - ActivitySlotsRobotTimer() + // ActivitySlotsRobotTimer() // slots奖池活动结算 - ActivitySlotsSettleTimer() + // ActivitySlotsSettleTimer() } var ( @@ -64,7 +64,8 @@ func ShareRobotTimer() { db.Mysql().Get(one) if one.ID == 0 { one.Share = util.GetShareCode(one.UID) - one.BetReward = v.InitCash + add + // todo + //one.BetReward = v.InitCash + add db.Mysql().Create(one) } else { db.Mysql().Update(&common.ShareInfo{UID: v.RobotID}, map[string]interface{}{"bet_reward": gorm.Expr("bet_reward + ?", add)}) diff --git a/modules/web/config.go b/modules/web/config.go index 5552897..adca14b 100644 --- a/modules/web/config.go +++ b/modules/web/config.go @@ -25,6 +25,23 @@ func loadConfig() error { 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) return nil } diff --git a/modules/web/handler/account.go b/modules/web/handler/account.go index 47875dc..f990a0b 100644 --- a/modules/web/handler/account.go +++ b/modules/web/handler/account.go @@ -47,7 +47,7 @@ func onLogin(user *common.PlayerDBInfo, a *app.Gin, isNew bool) { if config.GetBase().Release { gateURL = "wss://" + gateURL } else { - gateURL = "wss://" + gateURL + ":16615" + gateURL = "ws://" + gateURL + ":16615" } // } else { // gateURL = "ws://" + gateURL diff --git a/modules/web/handler/luckyWheel.go b/modules/web/handler/luckyWheel.go index 101b714..7a4b4b4 100644 --- a/modules/web/handler/luckyWheel.go +++ b/modules/web/handler/luckyWheel.go @@ -41,9 +41,6 @@ func LuckyWheelCfg(c *gin.Context) { } rechargeInfo := call.GetRechargeInfo(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) { return } @@ -101,7 +98,6 @@ func LuckyWheelLottery(c *gin.Context) { } log.Debug("luckyWheelLottery req:%+v", req) - call.GetRedisRankKey() uid := a.UID resp := &values.LuckWheelLotteryResp{} if !db.Redis().Lock(common.GetRedisKeyLuckyWheel(uid)) { @@ -174,12 +170,14 @@ func LuckyWheelLottery(c *gin.Context) { case 2: addKey := fmt.Sprintf("l%d", award.WheelType) playerData.LuckyWheelMap[addKey] += award.WheelCount + award.WheelLessCount = playerData.LuckyWheelMap[addKey] } if err != nil { log.Error("award err, %s", err.Error()) a.Code = values.CodeRetry return } + call.SetLuckyWheelRecords(uid, req.LuckyType, award) luckyWheelBytes, err := json.Marshal(playerData.LuckyWheelMap) if err != nil { @@ -199,3 +197,28 @@ func LuckyWheelLottery(c *gin.Context) { resp.Award = *award 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 +} diff --git a/modules/web/handler/recharge.go b/modules/web/handler/recharge.go index 4d03b71..437aaf3 100644 --- a/modules/web/handler/recharge.go +++ b/modules/web/handler/recharge.go @@ -147,6 +147,12 @@ func RechargeInfo(c *gin.Context) { for _, channel := range resp.Channels { 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) { diff --git a/modules/web/handler/share.go b/modules/web/handler/share.go index cd392de..c1e7976 100644 --- a/modules/web/handler/share.go +++ b/modules/web/handler/share.go @@ -16,117 +16,6 @@ import ( "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] func ShareNewTaskInfo(c *gin.Context) { a := app.NewApp(c) @@ -188,18 +77,7 @@ func ShareNewTaskDraw(c *gin.Context) { a.Code = values.CodeRetry return } - s := call.GetShareInfo(a.UID) - // 转化奖励 - 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) + call.UpdateShare(a.UID, 3, task.Reward, fmt.Sprintf("%d", task.Target)) resp.Reward = task.Reward } @@ -378,116 +256,22 @@ func ShareNewRank(c *gin.Context) { resp.List = list[start:end] } -// 限时任务 -func ShareLimitTaskInfo(c *gin.Context) { +func ShareNewBroadcast(c *gin.Context) { a := app.NewApp(c) defer func() { 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) - conShare := call.GetConfigShare(nextLevel, a.Channel) - if conShare == nil { - conShare = conShareEx - } - - 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 -} + // req := new(values.ShareNewBroadcastReq) + // if !a.S(req) { + // return + // } + // if req.Num > 100 { + // req.Num = 100 + // } -func ShareLimitTaskDraw(c *gin.Context) { - a := app.NewApp(c) - defer func() { - a.Response() - }() - req := new(values.ShareLimitTaskDrawReq) - if !a.S(req) { - return - } - resp := &values.ShareLimitTaskDrawResp{} + resp := &values.ShareNewBroadcastResp{List: values.ShareWithdrawBroadcast} 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) { @@ -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) defer func() { 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) - // if !a.S(req) { - // return - // } - // if req.Num > 100 { - // req.Num = 100 - // } + resp.ShareLink = call.GetShareLink(a.Channel, a.UID) +} - 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 + 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 + } } diff --git a/modules/web/handler/user.go b/modules/web/handler/user.go index d683b6b..14b7c33 100644 --- a/modules/web/handler/user.go +++ b/modules/web/handler/user.go @@ -385,7 +385,7 @@ func CheckRedPoint(uid int, c *gin.Context) { // 判断是否有任务可以领取 GetPromotions(nc) // 邀请奖励 - ShareInfo(nc) + //ShareInfo(nc) // vip奖励 //GetVipInfo(nc) }) diff --git a/modules/web/handler/withdraw.go b/modules/web/handler/withdraw.go index d855585..0401f50 100644 --- a/modules/web/handler/withdraw.go +++ b/modules/web/handler/withdraw.go @@ -202,6 +202,10 @@ func WithdrawInfo(c *gin.Context) { resp.Bets = append(resp.Bets, canWithdraw) } 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 } diff --git a/modules/web/providers/jin2/handler.go b/modules/web/providers/jin2/handler.go index 4565b0c..a27461b 100644 --- a/modules/web/providers/jin2/handler.go +++ b/modules/web/providers/jin2/handler.go @@ -36,7 +36,7 @@ func GetBalance(c *gin.Context) { req := &GetBalanceReq{} resp := &GetBalanceResp{} a.RetData = resp - if !a.S(req) { + if !a.SB(req) { resp.Code = CodeRequestInvalidParams return } @@ -72,7 +72,7 @@ func GameBet(c *gin.Context) { req := &GameBetReq{} resp := &GameBetResp{} a.RetData = resp - if !a.S(req) { + if !a.SB(req) { resp.Code = CodeRequestInvalidParams return } @@ -89,14 +89,15 @@ func GameBet(c *gin.Context) { now := time.Now().Unix() if req.Reason == "bet" || req.Reason == "win" { betReq := &base.BetReq{ - UID: uid, - SessionType: base.SessionTypeBet, - GameID: GetGameID(common.ProviderJin2, req.GameID), - GameName: req.GameID, - Provider: provider, - BetID: req.TransactionID, - SessionID: req.RoundID, - Time: now, + UID: uid, + CurrencyType: common.CurrencyINR, + SessionType: base.SessionTypeBet, + GameID: GetGameID(common.ProviderJin2, req.GameID), + GameName: req.GameID, + Provider: provider, + BetID: req.TransactionID, + SessionID: req.RoundID, + Time: now, } if req.Reason == "bet" { betReq.BetAmount = util.Abs(int64(req.Amount * common.DecimalDigits)) diff --git a/modules/web/routers/routers_luckyWheel.go b/modules/web/routers/routers_luckyWheel.go index bf66b65..50a6be6 100644 --- a/modules/web/routers/routers_luckyWheel.go +++ b/modules/web/routers/routers_luckyWheel.go @@ -8,4 +8,5 @@ import ( func luckyWheel(e *gin.RouterGroup) { e.POST("/luckyWheel/cfg", handler.LuckyWheelCfg) e.POST("/luckyWheel/lottery", handler.LuckyWheelLottery) + e.POST("/luckyWheel/awardRecords", handler.LuckyWheelAwardRecords) } diff --git a/modules/web/routers/routers_share.go b/modules/web/routers/routers_share.go index 7e885e6..4abe771 100644 --- a/modules/web/routers/routers_share.go +++ b/modules/web/routers/routers_share.go @@ -6,18 +6,23 @@ import ( "github.com/gin-gonic/gin" ) +// todo 邀请,充值,客损 func share(e *gin.RouterGroup) { // 新版分享 - e.POST("/share/info", handler.ShareInfo) - e.POST("/share/taskInfo", handler.ShareNewTaskInfo) + e.POST("/share/cfg", handler.ShareCfg) + 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/taskInfo", handler.ShareNewTaskInfo) e.POST("/share/affiliate", handler.ShareNewAffiliate) e.POST("/share/commission", handler.ShareNewCommission) 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/withdraw", handler.ShareNewWithdraw) + //e.POST("/share/withdraw", handler.ShareNewWithdraw) e.POST("/share/withdrawHis", handler.ShareNewWithdrawHis) e.POST("/share/broadcast", handler.ShareNewBroadcast) } diff --git a/modules/web/values/luckyWheel.go b/modules/web/values/luckyWheel.go index e1192a3..38575c8 100644 --- a/modules/web/values/luckyWheel.go +++ b/modules/web/values/luckyWheel.go @@ -1,6 +1,8 @@ package values -import "server/common" +import ( + "server/common" +) type LuckyWheelCfgReq struct { } @@ -23,3 +25,18 @@ type LuckWheelLotteryResp struct { AwardIndex int `json:"awardIndex"` // 奖励下标 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"` // 总奖励数量 +} diff --git a/modules/web/values/pay.go b/modules/web/values/pay.go index f54a5a1..2ff22c1 100644 --- a/modules/web/values/pay.go +++ b/modules/web/values/pay.go @@ -26,6 +26,10 @@ type RechargeInfoResp struct { Tips string SelectID int DiscountTicket []*DiscountTicket + + Cash int64 + CanWithdraw int64 + NeedBet int64 } type PayInfo struct { @@ -175,7 +179,10 @@ type WithDrawInfoResp struct { Tips string Fees []int64 Bets []int64 - NeedBet int64 // 打码信息 + + Cash int64 // 货币 + CanWithdraw int64 // 可提现金额 + NeedBet int64 // 打码信息 } // WithdrawHistoryReq 请求退出记录 diff --git a/modules/web/values/share.go b/modules/web/values/share.go index a3047f2..89e31ff 100644 --- a/modules/web/values/share.go +++ b/modules/web/values/share.go @@ -46,15 +46,6 @@ type OneShareRank struct { 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 可用余额 type ShareWithdrawResp struct { Available int64 diff --git a/modules/web/values/shareNew.go b/modules/web/values/shareNew.go index 5e8c0bb..eaf43b5 100644 --- a/modules/web/values/shareNew.go +++ b/modules/web/values/shareNew.go @@ -58,15 +58,6 @@ type ShareNewTaskDrawResp struct { // Target 任务目标 // Reward 任务奖励 // Status 任务状态,0进行中,1可领取,2已领取 -type OneShareNewTask struct { - TaskID int - Desc string - Type int - Progess int64 - Target int64 - Reward int64 - Status int -} // Page 页码 // Num 一页个数,最大50 @@ -231,3 +222,90 @@ type ShareNewBroadcastReq struct { type ShareNewBroadcastResp struct { 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"` +}