1、积分抽奖增加黑名单判断;

2、保底奖品抽奖次数从40改成60;
This commit is contained in:
chenlin 2025-08-18 14:38:03 +08:00
parent e3cc4705d1
commit 7cf9a25bf4
2 changed files with 59 additions and 36 deletions

View File

@ -111,48 +111,65 @@ func LotteryDraw(c *gin.Context) {
return return
} }
// 7. 白名单判断 // 7. 黑名单 & 白名单判断
var prize model.LotteryPrize 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 // ---- 黑名单逻辑 ----
// 判断用户是否为租卡会员 var blackEntry model.LotteryBlackList
if userInfo.IsMemberNew() { err = tx.Where("uid = ?", uc.Uid).First(&blackEntry).Error
isRentalMember = true if err == nil { // 命中黑名单
} logger.Infof("用户%d在黑名单中强制发放八等奖", uc.Uid)
// 固定发放八等奖“谢谢参与”
// 当用户抽奖次数超过40则判断是否中过1-4等奖;收集用户已中奖的奖项 err = tx.Where("level = ? AND stock > 0", model.LotteryPrizeTypeNone).First(&prize).Error
hasWon4OrAbove, userPrizeIds, _ := model.PrepareUserLotteryInfo(uc.Uid)
// 普通抽奖逻辑
prize, err = model.DrawFromDatabasePrizes(prizes, drawNumber, totalDrawNumber, userTotalAmount, userPrizeIds,
hasWon4OrAbove, isRentalMember)
if err != nil { if err != nil {
tx.Rollback() tx.Rollback()
logger.Errorf("DrawFromDatabasePrizes err uid=%d err=%v", uc.Uid, err) logger.Errorf("黑名单抽奖失败 uid=%d err=%v", uc.Uid, err)
respNoPrize(c) respNoPrize(c)
return return
} }
} else if err != nil {
logger.Errorf("查询白名单失败 uid=%d err=%v", uc.Uid, err)
RespJson(c, 500, "系统异常,请稍后再试...")
return
} else { } else {
logger.Infof("用户%d在白名单中%d等奖第%d次中奖", uc.Uid, whiteEntry.PrizeLevel, whiteEntry.DrawNumber) // ---- 白名单逻辑 ----
// 命中白名单,直接返回配置奖品 var whiteEntry model.LotteryWhiteList
err = tx.Where("level = ? and stock > 1", whiteEntry.PrizeLevel).First(&prize).Error err = tx.Where("uid = ?", uc.Uid).First(&whiteEntry).Error
if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) || (err == nil && drawNumber < int(whiteEntry.DrawNumber)) { // 普通抽奖
tx.Rollback() if err == nil && drawNumber < int(whiteEntry.DrawNumber) {
logger.Errorf("白名单抽奖失败 uid=%d err=%v", uc.Uid, err) logger.Errorf("用户%d在白名单,但抽奖次数 %d 小于设定次数 %d", uc.Uid, drawNumber, whiteEntry.DrawNumber)
respNoPrize(c) }
// 查询用户当天消费金额
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 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
}
} }
} }

View File

@ -24,8 +24,8 @@ const (
LotteryPrizeTypeNone = 0 // 谢谢参与 LotteryPrizeTypeNone = 0 // 谢谢参与
LotteryCheckLimit = 40 // 抽奖超过40次时判断是否有中过1-4等奖 LotteryCheckLimit = 60 // 抽奖超过60次时判断是否有中过1-4等奖
LotteryDefaultLevel = 4 // 抽奖超过40次时且未中过1-4等奖则默认中的奖项 LotteryDefaultLevel = 4 // 抽奖超过60次时且未中过1-4等奖则默认中的奖项
) )
// LotteryPrize 奖品信息表(抽奖) // LotteryPrize 奖品信息表(抽奖)
@ -102,6 +102,12 @@ type LotteryWhiteList struct {
PrizeLevel uint `json:"prize_level"` // 奖品等级 PrizeLevel uint `json:"prize_level"` // 奖品等级
} }
// LotteryBlackList 抽奖黑名单表
type LotteryBlackList struct {
Model
Uid uint `json:"uid"` // 用户ID
}
type LotteryDrawResponse struct { type LotteryDrawResponse struct {
PrizeID int `json:"prize_id"` // 奖品id PrizeID int `json:"prize_id"` // 奖品id
PrizeName string `json:"prize_name"` // 奖品名称 PrizeName string `json:"prize_name"` // 奖品名称
@ -136,7 +142,7 @@ type LotteryRecordPageResponse struct {
func DrawFromDatabasePrizes(prizes []LotteryPrize, userDrawCount, globalDrawCount int, totalAmount float64, func DrawFromDatabasePrizes(prizes []LotteryPrize, userDrawCount, globalDrawCount int, totalAmount float64,
userPrizeIds map[uint32]bool, hasWon4OrAbove bool, isRentalMember bool) (LotteryPrize, error) { userPrizeIds map[uint32]bool, hasWon4OrAbove bool, isRentalMember bool) (LotteryPrize, error) {
// 1. 判断是否超过40次且未中过4等奖以上强制发4等奖 // 1. 判断是否超过60次且未中过4等奖以上强制发4等奖
if userDrawCount > LotteryCheckLimit && !hasWon4OrAbove { if userDrawCount > LotteryCheckLimit && !hasWon4OrAbove {
for _, p := range prizes { for _, p := range prizes {
// 假设奖品等级字段为 PrizeLevel4等奖等级为4 // 假设奖品等级字段为 PrizeLevel4等奖等级为4