From 5b33fb07ef37ec3992b5e445f1095fe7b46f6559 Mon Sep 17 00:00:00 2001 From: zhora Date: Fri, 12 Sep 2025 17:06:35 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/web/handler/weekCard.go | 225 ++++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 modules/web/handler/weekCard.go diff --git a/modules/web/handler/weekCard.go b/modules/web/handler/weekCard.go new file mode 100644 index 0000000..c05fbd1 --- /dev/null +++ b/modules/web/handler/weekCard.go @@ -0,0 +1,225 @@ +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) +}