印度包网
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.
 
 
 

225 lines
6.7 KiB

package handler
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/liangdas/mqant/log"
"github.com/olivere/elastic/v7"
"gorm.io/gorm"
"server/call"
"server/common"
"server/config"
"server/db"
"server/modules/web/app"
"server/modules/web/values"
"server/pb"
"server/util"
"sort"
"time"
)
func WeekCardInfo(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
a.GetUID()
if !a.CheckActivityExpire(common.ActivityIDWeekCard) {
return
}
resp := &values.ActivityWeekCardInfoResp{}
a.Data = resp
cons := call.GetConfigWeekCard()
_ = cons
cardInfo := new(common.ActivityWeekCardData)
if a.UID > 0 {
cardInfo = call.GetUserWeekCard(a.UID)
}
var rewardList []int64
var err error
_ = err
//rewardList, err = util.GenerateRandomSequence(cons.RewardAmount, cons.MiniLimit, 5)
//if err != nil {
// log.Error("err:%v", err)
//}
//rewardList = append([]int64{cons.DayOneReward}, rewardList...)
//rewardList = append(rewardList, 0)
//if cardInfo.ID <= 0 || len(cardInfo.Rewards) == 0 {
// cardInfo.Day = 0
// rewardList, err = util.GenerateRandomSequence(cons.RewardAmount, cons.MiniLimit, 5)
// if err != nil {
// log.Error("err:%v", err)
// }
// rewardList = append([]int64{cons.DayOneReward}, rewardList...)
// rewardList = append(rewardList, 0)
// if cardInfo.ID <= 0 {
// cardInfo.Rewards = strings.Join(util.Int64SliceToStringSlice(rewardList), ",")
// if a.UID > 0 {
// db.Mysql().Create(cardInfo)
// }
// } else {
// cardInfo.Rewards = strings.Join(util.Int64SliceToStringSlice(rewardList), ",")
// db.Mysql().Update(&common.ActivityWeekCardData{UID: a.UID}, map[string]interface{}{
// "rewards": cardInfo.Rewards,
// })
// }
//}
if rewardList == nil {
rewardList, _ = util.StringToInt64Slice(cardInfo.Rewards, ",")
}
if cardInfo.RechargeTime != 0 {
resp.RechargeStatus = true
}
// step:签完7天就重置
if cardInfo.Day >= len(rewardList) {
resp.RechargeStatus = false
}
for _, item := range rewardList {
_ = item
//resp.RewardList = append(resp.RewardList, values.WeekCardInfo{
// Min: cons.MiniLimit,
// Max: cons.RewardAmount - cons.MiniLimit*4,
// Val: item,
//})
}
resp.Status = true
if config.GetBase().Release {
if util.IsSameDayTimeStamp(time.Now().Unix(), cardInfo.LastDraw) {
resp.Status = false
}
}
resp.RewardDay = cardInfo.Day
resp.ChannelList = call.GetConfigPayChannelsByID(common.CurrencyINR)
resp.ProductList = call.GetConfigPayProductByActivityID(common.ActivityIDWeekCard)
if resp.Status && resp.RechargeStatus {
call.PushRed(a.UID, pb.RedPointModule_RedPointWeekCard, 1)
}
call.UploadActivityData(a.UID, common.ActivityIDSign, common.ActivityDataClick, 0)
}
func WeekCardDraw(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.Response()
}()
if !a.CheckActivityExpire(common.ActivityIDWeekCard) {
return
}
req := new(values.ActivityWeekCardDrawReq)
if !a.S(req) {
return
}
resp := &values.ActivityWeekCardDrawResp{}
a.Data = resp
// conf := call.GetConfigActivityWeekCard()
card := call.GetUserWeekCard(a.UID)
if card.ID == 0 {
a.Code = values.CodeRetry
return
}
now := time.Now().Unix()
if config.GetBase().Release {
if util.IsSameDayTimeStamp(now, card.LastDraw) {
a.Code = values.CodeRetry
a.Msg = "today has reward"
return
}
}
rewards, _ := util.StringToInt64Slice(card.Rewards, ",")
if card.Day >= len(rewards) {
a.Code = values.CodeRetry
a.Msg = "The weekly card has been collected"
return
}
rows, err := db.Mysql().UpdateRes(&common.ActivityWeekCardData{UID: a.UID},
map[string]interface{}{"day": gorm.Expr("day + 1"), "last_draw": now})
if rows == 0 || err != nil {
log.Error("err:%v", err)
a.Code = values.CodeRetry
return
}
var reward int64
if card.Day < 6 {
reward = rewards[card.Day] * common.DecimalDigits
} else {
// 第几天折扣券
// 用户画像一:6天内充值3笔及以上用户
// 推送当前最高额度向上一档充值满减卷
// 用户画像二:只解锁周卡,未充值的玩家
// 推送当前额度向下一档充值满减卷,最低300
var list []common.CurrencyBalance
q := elastic.NewBoolQuery()
q.Filter(elastic.NewRangeQuery("time").Gte(card.RechargeTime))
q.Filter(elastic.NewRangeQuery("time").Lte(now))
q.Filter(elastic.NewRangeQuery("event").Gte(common.CurrencyEventReCharge))
q.Must(elastic.NewTermsQuery("uid", a.UID))
db.ES().QueryList(common.ESIndexBalance, 0, 100, q, &list, "time", true)
up := false
maxAmount := card.RechargeAmount
if len(list) >= 3 {
up = true
for _, item := range list {
if item.Value > maxAmount {
maxAmount = item.Value
}
}
}
log.Info("maxAmount:%v", maxAmount)
ticket := call.GetConfigDiscountTicketByAmount(maxAmount)
log.Info("ticket:%v", ticket)
if ticket.ID > 0 {
// 赠送优惠券
tickets := call.GetConfigDiscountTicket()
sort.Slice(tickets, func(i, j int) bool {
return tickets[i].RechargeAmount < tickets[j].RechargeAmount
})
// 获取下一档
nextIdx := -1
for idx, item := range tickets {
if item.RechargeAmount == maxAmount {
if up {
nextIdx = idx + 1
} else if item.RechargeAmount >= 300*common.DecimalDigits {
nextIdx = idx - 1
}
break
}
}
var nextTicket = ticket
if len(tickets) > nextIdx && nextIdx != -1 {
nextTicket = tickets[nextIdx]
}
if up {
call.AddUserDiscountTicket(a.UID, ticket.DiscountAmount, ticket.RechargeAmount, -1, 0, false)
call.SendMailWithContent(a.UID, call.SystemTitle, fmt.Sprintf(call.EmailDiscount, ticket.DiscountAmount/common.DecimalDigits, ticket.RechargeAmount/common.DecimalDigits))
resp.DiscountTicket = ticket.DiscountAmount
resp.Amount = ticket.RechargeAmount
} else if nextTicket.ID > 0 {
call.AddUserDiscountTicket(a.UID, nextTicket.DiscountAmount, nextTicket.RechargeAmount, -1, 1, false)
call.SendMailWithContent(a.UID, call.SystemTitle, fmt.Sprintf(call.EmailDiscount, ticket.DiscountAmount/common.DecimalDigits, ticket.RechargeAmount/common.DecimalDigits))
resp.DiscountTicket = nextTicket.DiscountAmount
resp.Amount = nextTicket.RechargeAmount
}
}
}
resource := common.CurrencyResourceWeekCard
if card.Day > 0 {
resource = common.CurrencyResourceBonus
}
resp.Reward = reward
if reward > 0 {
call.UpdateCurrencyPro(&common.UpdateCurrency{
CurrencyBalance: &common.CurrencyBalance{
UID: a.UID,
Type: common.CurrencyINR,
Value: reward,
Event: common.CurrencyEventActivityWeekCard,
ChannelID: a.Channel,
NeedBet: call.GetConfigCurrencyResourceNeedBet(resource, reward),
},
})
}
call.PushRed(a.UID, pb.RedPointModule_RedPointWeekCard, 0)
call.UploadActivityData(a.UID, common.ActivityIDSign, common.ActivityDataJoin, reward)
}