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,8 +111,24 @@ func LotteryDraw(c *gin.Context) {
return
}
// 7. 白名单判断
// 7. 黑名单 & 白名单判断
var prize model.LotteryPrize
// ---- 黑名单逻辑 ----
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("黑名单抽奖失败 uid=%d err=%v", uc.Uid, err)
respNoPrize(c)
return
}
} else {
// ---- 白名单逻辑 ----
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)) { // 普通抽奖
@ -128,7 +144,7 @@ func LotteryDraw(c *gin.Context) {
isRentalMember = true
}
// 当用户抽奖次数超过40则判断是否中过1-4等奖;收集用户已中奖的奖项
// 当用户抽奖次数超过60则判断是否中过1-4等奖;收集用户已中奖的奖项
hasWon4OrAbove, userPrizeIds, _ := model.PrepareUserLotteryInfo(uc.Uid)
// 普通抽奖逻辑
@ -155,6 +171,7 @@ func LotteryDraw(c *gin.Context) {
return
}
}
}
// 8. 减少奖品库存(乐观锁)
result := tx.Model(&model.LotteryPrize{}).

View File

@ -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 {
// 假设奖品等级字段为 PrizeLevel4等奖等级为4