1、积分抽奖增加黑名单判断;
2、保底奖品抽奖次数从40改成60;
This commit is contained in:
parent
e3cc4705d1
commit
7cf9a25bf4
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
// 假设奖品等级字段为 PrizeLevel,4等奖等级为4
|
// 假设奖品等级字段为 PrizeLevel,4等奖等级为4
|
||||||
|
|
Loading…
Reference in New Issue
Block a user