印度包网
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

921 lines
24 KiB

package handler
import (
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"github.com/liangdas/mqant/log"
"gorm.io/gorm"
"server/call"
"server/common"
"server/config"
"server/db"
"server/modules/web/app"
"server/modules/web/values"
"server/util"
"time"
)
// 分享新手任务[done]
func ShareNewTaskInfo(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
resp := &values.ShareNewTaskInfoResp{}
a.Data = resp
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)
}
}
// 新手任务领取[done]
func ShareNewTaskDraw(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.ShareNewTaskDrawReq)
if !a.S(req) {
return
}
resp := &values.ShareNewTaskDrawResp{}
a.Data = resp
uid := a.UID
if !db.Redis().Lock(common.GetRedisKeyShare(uid)) {
a.Code = values.CodeRetry
return
}
defer func() {
db.Redis().UnLock(common.GetRedisKeyShare(uid))
}()
task := &common.ShareTaskNewData{UID: uid, TaskID: req.TaskID}
db.Mysql().Get(task)
if task.ID == 0 || task.Progress < task.Target {
a.Code = values.CodeParam
a.Msg = "Task not completed."
return
}
if task.Status == 1 {
a.Code = values.CodeParam
a.Msg = "Task received."
return
}
rows, err := db.Mysql().UpdateWRes(&common.ShareTaskNewData{}, map[string]interface{}{"status": 1}, fmt.Sprintf("uid = %d and task_id = %d and status = 0", uid, req.TaskID))
if rows == 0 || err != nil {
a.Code = values.CodeRetry
return
}
call.UpdateShare(uid, 3, task.Reward, fmt.Sprintf("%d", task.Target))
resp.Reward = task.Reward
}
func ShareNewAffiliate(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.ShareNewAffiliateReq)
if !a.S(req) {
return
}
if req.Num > 50 {
req.Num = 50
}
resp := &values.ShareNewAffiliateResp{}
a.Data = resp
si := &common.ShareInfo{UID: a.UID}
db.Mysql().Get(si)
if si.ID == 0 {
return
}
resp.Level1 = si.Down1
resp.Level2 = si.Down2
resp.Level3 = si.Down3
resp.Level4 = si.Down4
resp.Level5 = si.Down5
list := []common.ShareInfo{}
sql := fmt.Sprintf("up1 = %d", a.UID)
if req.Level > 0 {
sql = fmt.Sprintf("up%d = %d", req.Level, a.UID)
}
resp.Count, _ = db.Mysql().QueryList(req.Page, req.Num, sql, "down1 desc", &common.ShareInfo{}, &list)
for _, v := range list {
one := values.OneShareNewAffiliate{UID: v.UID, AffiliateCount: v.Down1}
p, _ := call.GetUserXInfo(v.UID, "nick", "last_login")
one.Nick = p.Nick
one.LastLogin = p.LastLogin
resp.AffiliateList = append(resp.AffiliateList, one)
}
}
// 收益列表
func ShareNewCommission(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.ShareNewCommissionReq)
if !a.S(req) {
return
}
resp := &values.ShareNewCommissionResp{Count: 100, List: []values.OneShareNewCommission{}}
a.Data = resp
total := &common.ShareRewardData{UID: a.UID}
db.Mysql().QueryBySql(fmt.Sprintf("select * from share_reward_data where uid = %d and time = 0", a.UID), total)
resp.All = total.TotalReward
resp.Invitation = total.InviteReward
resp.Affiliate = total.AffiliateReward
resp.Recharge = total.RechargeReward
resp.Other = total.OtherReward
if req.Num*req.Page >= 100 {
return
}
list := []common.ShareRewardData{}
db.Mysql().QueryList(0, 100, fmt.Sprintf("uid = %d", a.UID), "time desc", &common.ShareRewardData{}, &list)
now := time.Now()
zero := util.GetZeroTime(now)
if req.Page > 0 {
zero = zero.AddDate(0, 0, -req.Page*req.Num)
}
for i := 0; i < req.Num; i++ {
one := values.OneShareNewCommission{Date: zero.Format("20060102")}
for _, v := range list {
if v.Date == one.Date {
one.Invitation = v.InviteReward
one.Recharge = v.RechargeReward
one.Affiliate = v.AffiliateReward
one.Other = v.OtherReward
break
}
}
resp.List = append(resp.List, one)
zero = zero.AddDate(0, 0, -1)
}
}
// 排行榜
func ShareNewRank(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.ShareNewRankReq)
if !a.S(req) {
return
}
resp := &values.ShareNewRankResp{
List: []*common.ShareRank{},
}
a.Data = resp
now := time.Now()
dayNow := now
for i := 0; i < 7; i++ {
resp.Days = append(resp.Days, dayNow.Format("01/02"))
dayNow = dayNow.AddDate(0, 0, -1)
}
weekNow := util.GetWeekZeroTime(now)
for i := 0; i < 4; i++ {
resp.Weeks = append(resp.Weeks, fmt.Sprintf("%s-%s", weekNow.Format("01/02"), weekNow.AddDate(0, 0, 7).Format("01/02")))
weekNow = weekNow.AddDate(0, 0, -7)
}
monthNow := util.GetFirstDateOfMonth(now)
for i := 0; i < 3; i++ {
resp.Months = append(resp.Months, fmt.Sprintf("%s-%s", monthNow.Format("01/02"), monthNow.AddDate(0, 1, 0).Format("01/02")))
monthNow = monthNow.AddDate(0, -1, 0)
}
var list []*common.ShareRank
resp.Self = &common.ShareRank{
UID: a.UID,
Type: req.Type,
Rank: -1,
}
if req.Time == 0 {
resp.Self.Time = time.Now().Unix()
switch req.Type {
case common.ShareRankTypeDaily:
list = values.ShareRankDaily
case common.ShareRankTypeWeekly:
list = values.ShareRankWeekly
case common.ShareRankTypeMonthly:
list = values.ShareRankMonthly
}
} else {
var ti int64
switch req.Type {
case common.ShareRankTypeDaily:
ti = util.GetZeroTime(now.AddDate(0, 0, -req.Time)).Unix()
case common.ShareRankTypeWeekly:
ti = util.GetWeekZeroTime(now.AddDate(0, 0, -req.Time*7)).Unix()
case common.ShareRankTypeMonthly:
ti = util.GetFirstDateOfMonth(now.AddDate(0, -req.Time, 0)).Unix()
}
resp.Self.Time = ti
list = call.GetShareRank(req.Type, ti)
}
for i, v := range list {
v.Rank = i + 1
if v.UID == a.UID {
resp.Self = v
}
}
if resp.Self.Rank == -1 {
resp.Self = call.GetShareRewardData(a.UID, req.Type, resp.Self.Time)
resp.Self.Rank = -1
}
start := req.Page * req.Num
if start > common.ShareRankMaxNum {
return
}
if start > len(list) {
return
}
end := start + req.Num
if end > common.ShareRankMaxNum {
end = common.ShareRankMaxNum
}
if end > len(list) {
end = len(list)
}
resp.List = list[start:end]
}
func ShareNewBroadcast(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
// req := new(values.ShareNewBroadcastReq)
// if !a.S(req) {
// return
// }
// if req.Num > 100 {
// req.Num = 100
// }
resp := &values.ShareNewBroadcastResp{List: values.ShareWithdrawBroadcast}
a.Data = resp
}
func ShareNewWithdrawInfo(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
resp := &values.ShareNewWithdrawInfoResp{Tips: call.GetConfigPlatform().WithdrawTips}
a.Data = resp
si := call.GetShareInfo(a.UID)
resp.TotalBalance = si.Reward
resp.Withdrawable = si.Withdrawable
list := call.GetConfigWithdrawProduct(common.WithdrawSorceShare)
db.Mysql().QueryList(0, 3, fmt.Sprintf("uid = %d and draw_type = '%s'", a.UID, common.WithdrawTypeBank), "id desc", &common.PayInfo{}, &resp.Accounts)
sw := call.GetShareWithdrawInfo(a.UID)
resp.WithDrawCount = sw.DayCount
for _, v := range list {
// todo
one := &values.WithdrawProduct{ID: v.ProductID, Amount: v.Amount}
resp.List = append(resp.List, one)
}
con := call.GetConfigShare(si.Level, a.Channel)
if con == nil {
a.Code = values.CodeRetry
return
}
resp.TotalWithdrawCount = con.DayWithdrawCount
channels := call.GetConfigWithdrawChannels()
if len(channels) > 0 {
resp.NewList = []*common.ConfigWithdrawChannels{channels[0]}
} else {
resp.NewList = []*common.ConfigWithdrawChannels{}
}
}
func ShareNewWithdraw(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.WithdrawReq)
if !a.S(req) {
return
}
if req.CurrencyType != common.CurrencyINR {
req.CurrencyType = common.CurrencyINR
}
one := call.GetConfigWithdrawProductByID(req.AmountID)
if one == nil {
a.Code = values.CodeParam
a.Msg = "Withdraw product not found."
return
}
uid := a.UID
log.Debug("player %v withdraw %+v,one:%+v", uid, *req, *one)
amount := one.Amount * 100
si := call.GetShareInfo(uid)
if si.Withdrawable < amount {
a.Code = values.CodeParam
a.Msg = "Insufficient balance."
return
}
con := call.GetConfigShare(si.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
}
// 到游戏账户
if req.Type == 1 {
tx := db.Mysql().Begin()
defer a.MCommit(tx)
// 更新余额
res := tx.Model(&common.ShareInfo{}).Where("uid = ? and reward >= ? and withdrawable >= ?", uid, amount, amount).
Updates(map[string]interface{}{
"reward": gorm.Expr("reward - ?", amount),
"withdrawable": gorm.Expr("withdrawable - ?", amount),
})
if res.RowsAffected == 0 || res.Error != nil {
log.Error("err:%v", res.Error)
a.Code = values.CodeRetry
return
}
// 更新次数
res = tx.Model(&common.ShareWithdrawInfo{}).Where("uid = ? and day_time = ?", uid, sw.DayTime).
Updates(map[string]interface{}{"day_count": sw.DayCount + 1, "day_time": time.Now().Unix(), "total_withdraw": gorm.Expr("total_withdraw + ?", one.Amount)})
if res.RowsAffected == 0 || res.Error != nil {
log.Error("err:%v", res.Error)
a.Code = values.CodeRetry
return
}
// 更新rechargeinfo,转移到游戏等同于充值
re := call.GetRechargeInfo(uid)
if re.ID == 0 {
res = tx.Model(&common.RechargeInfo{}).Create(&common.RechargeInfo{UID: uid, TotalRecharge: one.Amount})
} else {
res = tx.Model(&common.RechargeInfo{}).Where("uid = ? ", uid).
Updates(map[string]interface{}{
"total_charge": gorm.Expr("total_charge + ?", one.Amount),
})
}
if res.RowsAffected == 0 || res.Error != nil {
log.Error("err:%v", res.Error)
a.Code = values.CodeRetry
return
}
db.Mysql().Create(&common.RechargeOrder{
UID: uid,
OrderID: util.NewOrderID(uid, config.GetBase().ServerFlag),
APIPayID: "",
// ProductID: common.ActivityIDPddShare,
Amount: one.Amount,
WithdrawCash: amount,
Status: common.StatusROrderFinish,
PaySource: common.PaySourceModulePay,
Event: int(common.CurrencyEventShareWithdraw),
// PayAccount: payInfo,
// Extra: strconv.FormatInt(serviceFee, 10),
CallbackTime: time.Now().Unix(),
ChannelID: a.Channel,
UPI: -1,
Scene: common.ActivityIDShare,
})
_, err := call.UpdateCurrencyPro(&common.UpdateCurrency{
CurrencyBalance: &common.CurrencyBalance{
UID: uid,
Value: amount * -1,
Event: common.CurrencyEventShareWithdraw,
Type: common.CurrencyINR,
},
})
if err != nil {
a.Code = values.CodeRetry
return
}
a.Msg = "Withdraw to game successfully."
return
}
ip := a.GetRemoteIP()
payInfo, code := NewWithdraw(req, a.UID, ip, a.UUID)
if code != values.CodeOK {
a.Code = code
a.Msg = payInfo
return
}
tx := db.Mysql().Begin()
defer a.MCommit(tx)
// 发起tx
// 更新余额
res := tx.Model(&common.ShareInfo{}).Where("uid = ? and reward >= ? and withdrawable >= ?", uid, amount, amount).
Updates(map[string]interface{}{
"reward": gorm.Expr("reward - ?", amount),
"withdrawable": gorm.Expr("withdrawable - ?", amount),
})
if res.RowsAffected == 0 || res.Error != nil {
log.Error("err:%v", res.Error)
a.Code = values.CodeRetry
return
}
// 更新次数
sw.SubRecord[one.Amount]++
byt, _ := json.Marshal(sw.SubRecord)
res = tx.Model(&common.ShareWithdrawInfo{}).Where("uid = ? and day_time = ?", uid, sw.DayTime).
Updates(map[string]interface{}{"day_count": sw.DayCount + 1, "day_time": time.Now().Unix(), "record": string(byt),
"total_withdraw": gorm.Expr("total_withdraw + ?", one.Amount)})
if res.RowsAffected == 0 || res.Error != nil {
log.Error("err:%v", res.Error)
a.Code = values.CodeRetry
return
}
orderID := util.NewOrderID(uid, config.GetBase().ServerFlag)
order := &common.RechargeOrder{
UID: uid,
OrderID: orderID,
APIPayID: "",
ProductID: one.ProductID,
Amount: one.Amount,
WithdrawCash: amount,
Status: common.StatusROrderCreate,
PaySource: common.PaySourceModulePay,
Event: int(common.CurrencyEventWithDraw),
PayAccount: payInfo,
// Extra: strconv.FormatInt(serviceFee, 10),
ChannelID: a.Channel,
UPI: -1,
Scene: common.ActivityIDShare,
}
if config.GetBase().Release && amount < con.WithdrawAudit {
order.Status = common.StatusROrderWaitting
}
if err := tx.Model(order).Create(order).Error; err != nil {
a.Code = values.CodeRetry
log.Error("create withdraw order fail err:%v", err)
return
}
a.Data = values.ShareNewWithdrawResp{TotalBalance: si.Reward - amount, Withdrawable: si.Withdrawable - amount}
}
func ShareNewWithdrawHis(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
req := new(values.ShareNewWithdrawHisReq)
if !a.S(req) {
return
}
if req.Num > 100 {
req.Num = 100
}
resp := &values.ShareNewWithdrawHisResp{}
a.Data = resp
list, count := call.GetShareWithdrawHis(a.UID, req.Page, req.Num)
resp.Count = count
for i, v := range list {
if v.Status <= common.StatusROrderCreate {
list[i].Status = common.StatusROrderPay
} else if v.Status == common.StatusROrderRefuse || v.Status == common.StatusROrderCancel {
list[i].Status = common.StatusROrderFail
}
one := common.WithdrawCommon{}
if v.PayAccount != "" {
err := json.Unmarshal([]byte(v.PayAccount), &one)
if err != nil {
log.Error("err:%v", err)
continue
}
}
list[i].PayAccount = one.BankCardNo
resp.List = append(resp.List, values.OneShareNewWithdrawHis{
CreatedAt: v.CreatedAt.Format("2006-01-02 15:04:05"),
OrderID: v.OrderID,
PayAccount: v.PayAccount,
UID: v.UID,
Amount: v.Amount,
Event: v.Event,
ProductID: v.ProductID,
Status: v.Status,
FailReason: v.FailReason,
ChannelID: v.ChannelID,
UPI: v.UPI,
Scene: v.Scene,
WithdrawCash: v.WithdrawCash,
})
}
}
// 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("COALESCE(SUM(reward_count), 0) as todayAmount").
Where("uid = ? and reward_at > ? and reward_count > 0 ", a.UID, util.GetZeroTime(time.Now()).Unix()).
Scan(&resp.TodayAward).Error
if err != nil {
log.Error("get todayAmount err, %s", err.Error())
}
if resp.TotalAward == 0 {
resp.TotalAward = shareInfo.Reward
}
resp.ShareLink = call.GetShareLink(a.Channel, a.UID)
}
// 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.RankValue,
UserIcon: shareRankUser.UserInfo.Avatar,
UserAward: userAward,
UserAwardExpected: userAwardExpected,
})
}
// 任务详情
list := []common.ShareTaskNewData{}
_, err = db.Mysql().QueryAll(fmt.Sprintf("uid = %d", a.UID), "", &common.ShareTaskNewData{}, &list)
if err != nil {
log.Error("get task info err, %s", err.Error())
a.Code = values.CodeRetry
return
}
if len(list) == 0 { // 任务初始化
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)
}
_, err = db.Mysql().QueryAll(fmt.Sprintf("uid = %d", a.UID), "", &common.ShareTaskNewData{}, &list)
if err != nil {
log.Error("get task info err, %s", err.Error())
a.Code = values.CodeRetry
return
}
}
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)
}
err = db.Mysql().C().Model(&common.ShareReward{}).
Select("COALESCE(SUM(reward_count), 0) as inviteAmount").
Where("uid = ? and reward_type = 4", a.UID).
Scan(&resp.InviteRewardTotal).Error
if err != nil {
log.Error("get todayAmount err, %s", err.Error())
}
shareInfo := call.GetShareInfo(a.UID)
shareCfg := call.GetConfigShare(shareInfo.Level, a.Channel)
resp.InviteReward = shareCfg.InviteRebate
resp.BeInviteReward = shareCfg.BeInviteRebate
resp.InviteCount = shareInfo.Down1
}
// 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)
}
log.Debug("share rankDetails, %+v rankAt:%d", req, rankAt.Unix())
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.LessJackPot = call.ShareRankJackpotPreLessGet()
}
resp.JackPot = jackpot
resp.Total = count
rankAwards := call.GetConfigShareRankAwardMap()
for index, shareRankUser := range shareRankUsers {
var userAward int
var userAwardExpected int64
rank := (req.Page-1)*req.PageSize + index + 1
if !req.Previous {
if rankAwards != nil {
if rankAward, ok := rankAwards[rank]; ok {
userAward = rankAward.AwardRate
userAwardExpected = jackpot * int64(rankAward.AwardRate) / 10000
}
}
} else {
rank = shareRankUser.Rank
userAward = shareRankUser.UserAward
userAwardExpected = shareRankUser.UserAwardCount
}
resp.RankUsers = append(resp.RankUsers, values.ShareRankUser{
UserRank: rank,
UserName: shareRankUser.UserInfo.Nick,
UserCount: shareRankUser.RankValue,
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
if !db.Redis().Lock(common.GetRedisKeyShare(uid)) {
a.Code = values.CodeRetry
return
}
defer func() {
db.Redis().UnLock(common.GetRedisKeyShare(uid))
}()
if req.Amount < 0 {
a.Code = values.CodeParam
a.Msg = "Insufficient Amount."
return
}
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
}
shareWithdrawInfo := call.GetShareWithdrawInfo(uid)
if shareWithdrawInfo.DayCount >= con.DayWithdrawCount {
a.Code = values.CodeParam
a.Msg = fmt.Sprintf("Your current agent level is %d, with a maximum of %d withdrawals per day.", shareInfo.Level, con.DayWithdrawCount)
return
}
if shareWithdrawInfo.TodayWithdraw+req.Amount >= con.WithdrawAudit {
a.Code = values.CodeParam
a.Msg = fmt.Sprintf("Your current agent level is %d, with a max amount of %d withdrawals per day.", shareInfo.Level, con.WithdrawAudit/common.DecimalDigits)
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
}
now := time.Now()
updateValues := map[string]interface{}{
"day_count": 1,
"day_time": now.Unix(),
"today_withdraw": req.Amount,
"total_withdraw": gorm.Expr("total_withdraw + ?", req.Amount),
}
if shareWithdrawInfo.DayTime != 0 && util.IsSameDayTimeStamp(shareWithdrawInfo.DayTime, now.Unix()) {
updateValues["day_count"] = gorm.Expr("day_count + ?", 1)
updateValues["today_withdraw"] = gorm.Expr("today_withdraw + ?", req.Amount)
delete(updateValues, "day_time")
}
err = db.Mysql().C().Model(&common.ShareWithdrawInfo{}).Where("id = ?", shareWithdrawInfo.ID).Updates(updateValues).Error
if err != nil {
log.Error("update share withdraw info err, %s", err.Error())
}
call.UploadActivityData(a.UID, common.ActivityIDShare, common.ActivityDataJoin, req.Amount)
}