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) }