From 7cf9a25bf455511dd29acbb73356ec57d7bd6c54 Mon Sep 17 00:00:00 2001 From: chenlin Date: Mon, 18 Aug 2025 14:38:03 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E7=A7=AF=E5=88=86=E6=8A=BD=E5=A5=96?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=BB=91=E5=90=8D=E5=8D=95=E5=88=A4=E6=96=AD?= =?UTF-8?q?=EF=BC=9B=202=E3=80=81=E4=BF=9D=E5=BA=95=E5=A5=96=E5=93=81?= =?UTF-8?q?=E6=8A=BD=E5=A5=96=E6=AC=A1=E6=95=B0=E4=BB=8E40=E6=94=B9?= =?UTF-8?q?=E6=88=9060=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/lottery.go | 83 ++++++++++++++++++++++++++----------------- model/lottery.go | 12 +++++-- 2 files changed, 59 insertions(+), 36 deletions(-) diff --git a/controller/lottery.go b/controller/lottery.go index 3c1489c..a6cfd3d 100644 --- a/controller/lottery.go +++ b/controller/lottery.go @@ -111,48 +111,65 @@ func LotteryDraw(c *gin.Context) { return } - // 7. 白名单判断 + // 7. 黑名单 & 白名单判断 var prize model.LotteryPrize - var whiteEntry model.LotteryWhiteList - err = tx.Where("uid = ?", uc.Uid).First(&whiteEntry).Error - if errors.Is(err, gorm.ErrRecordNotFound) || (err == nil && drawNumber < int(whiteEntry.DrawNumber)) { // 普通抽奖 - if err == nil && drawNumber < int(whiteEntry.DrawNumber) { - logger.Errorf("用户%d在白名单,但抽奖次数 %d 小于设定次数 %d", uc.Uid, drawNumber, whiteEntry.DrawNumber) - } - // 查询用户当天消费金额 - userTotalAmount := model.GetUserDailyTotalAmount(uc.Uid) - isRentalMember := false - // 判断用户是否为租卡会员 - if userInfo.IsMemberNew() { - isRentalMember = true - } - - // 当用户抽奖次数超过40,则判断是否中过1-4等奖;收集用户已中奖的奖项 - hasWon4OrAbove, userPrizeIds, _ := model.PrepareUserLotteryInfo(uc.Uid) - - // 普通抽奖逻辑 - prize, err = model.DrawFromDatabasePrizes(prizes, drawNumber, totalDrawNumber, userTotalAmount, userPrizeIds, - hasWon4OrAbove, isRentalMember) + // ---- 黑名单逻辑 ---- + var blackEntry model.LotteryBlackList + err = tx.Where("uid = ?", uc.Uid).First(&blackEntry).Error + if err == nil { // 命中黑名单 + logger.Infof("用户%d在黑名单中,强制发放八等奖", uc.Uid) + // 固定发放八等奖“谢谢参与” + err = tx.Where("level = ? AND stock > 0", model.LotteryPrizeTypeNone).First(&prize).Error if err != nil { tx.Rollback() - logger.Errorf("DrawFromDatabasePrizes err uid=%d err=%v", uc.Uid, err) + logger.Errorf("黑名单抽奖失败 uid=%d err=%v", uc.Uid, err) respNoPrize(c) return } - } else if err != nil { - logger.Errorf("查询白名单失败 uid=%d err=%v", uc.Uid, err) - RespJson(c, 500, "系统异常,请稍后再试...") - return } else { - logger.Infof("用户%d在白名单中,%d等奖,第%d次中奖", uc.Uid, whiteEntry.PrizeLevel, whiteEntry.DrawNumber) - // 命中白名单,直接返回配置奖品 - err = tx.Where("level = ? and stock > 1", whiteEntry.PrizeLevel).First(&prize).Error - if err != nil { - tx.Rollback() - logger.Errorf("白名单抽奖失败 uid=%d err=%v", uc.Uid, err) - respNoPrize(c) + // ---- 白名单逻辑 ---- + var whiteEntry model.LotteryWhiteList + err = tx.Where("uid = ?", uc.Uid).First(&whiteEntry).Error + if errors.Is(err, gorm.ErrRecordNotFound) || (err == nil && drawNumber < int(whiteEntry.DrawNumber)) { // 普通抽奖 + if err == nil && drawNumber < int(whiteEntry.DrawNumber) { + logger.Errorf("用户%d在白名单,但抽奖次数 %d 小于设定次数 %d", uc.Uid, drawNumber, whiteEntry.DrawNumber) + } + // 查询用户当天消费金额 + userTotalAmount := model.GetUserDailyTotalAmount(uc.Uid) + + isRentalMember := false + // 判断用户是否为租卡会员 + if userInfo.IsMemberNew() { + isRentalMember = true + } + + // 当用户抽奖次数超过60,则判断是否中过1-4等奖;收集用户已中奖的奖项 + hasWon4OrAbove, userPrizeIds, _ := model.PrepareUserLotteryInfo(uc.Uid) + + // 普通抽奖逻辑 + prize, err = model.DrawFromDatabasePrizes(prizes, drawNumber, totalDrawNumber, userTotalAmount, userPrizeIds, + hasWon4OrAbove, isRentalMember) + if err != nil { + tx.Rollback() + logger.Errorf("DrawFromDatabasePrizes err uid=%d err=%v", uc.Uid, err) + respNoPrize(c) + return + } + } else if err != nil { + logger.Errorf("查询白名单失败 uid=%d err=%v", uc.Uid, err) + RespJson(c, 500, "系统异常,请稍后再试...") return + } else { + logger.Infof("用户%d在白名单中,%d等奖,第%d次中奖", uc.Uid, whiteEntry.PrizeLevel, whiteEntry.DrawNumber) + // 命中白名单,直接返回配置奖品 + err = tx.Where("level = ? and stock > 1", whiteEntry.PrizeLevel).First(&prize).Error + if err != nil { + tx.Rollback() + logger.Errorf("白名单抽奖失败 uid=%d err=%v", uc.Uid, err) + respNoPrize(c) + return + } } } diff --git a/model/lottery.go b/model/lottery.go index f3b78ff..d6ab883 100644 --- a/model/lottery.go +++ b/model/lottery.go @@ -24,8 +24,8 @@ const ( LotteryPrizeTypeNone = 0 // 谢谢参与 - LotteryCheckLimit = 40 // 抽奖超过40次时判断是否有中过1-4等奖 - LotteryDefaultLevel = 4 // 抽奖超过40次时且未中过1-4等奖,则默认中的奖项 + LotteryCheckLimit = 60 // 抽奖超过60次时判断是否有中过1-4等奖 + LotteryDefaultLevel = 4 // 抽奖超过60次时且未中过1-4等奖,则默认中的奖项 ) // LotteryPrize 奖品信息表(抽奖) @@ -102,6 +102,12 @@ type LotteryWhiteList struct { PrizeLevel uint `json:"prize_level"` // 奖品等级 } +// LotteryBlackList 抽奖黑名单表 +type LotteryBlackList struct { + Model + Uid uint `json:"uid"` // 用户ID +} + type LotteryDrawResponse struct { PrizeID int `json:"prize_id"` // 奖品id PrizeName string `json:"prize_name"` // 奖品名称 @@ -136,7 +142,7 @@ type LotteryRecordPageResponse struct { func DrawFromDatabasePrizes(prizes []LotteryPrize, userDrawCount, globalDrawCount int, totalAmount float64, userPrizeIds map[uint32]bool, hasWon4OrAbove bool, isRentalMember bool) (LotteryPrize, error) { - // 1. 判断是否超过40次且未中过4等奖以上,强制发4等奖 + // 1. 判断是否超过60次且未中过4等奖以上,强制发4等奖 if userDrawCount > LotteryCheckLimit && !hasWon4OrAbove { for _, p := range prizes { // 假设奖品等级字段为 PrizeLevel,4等奖等级为4