123
This commit is contained in:
@@ -6,6 +6,7 @@ import com.ruoyi.cai.domain.PrizeOnline;
|
|||||||
import com.ruoyi.cai.domain.User;
|
import com.ruoyi.cai.domain.User;
|
||||||
import com.ruoyi.cai.enums.GenderEnum;
|
import com.ruoyi.cai.enums.GenderEnum;
|
||||||
import com.ruoyi.cai.enums.SystemConfigEnum;
|
import com.ruoyi.cai.enums.SystemConfigEnum;
|
||||||
|
import com.ruoyi.cai.enums.prize.PrizeTypeEnum;
|
||||||
import com.ruoyi.cai.manager.IdManager;
|
import com.ruoyi.cai.manager.IdManager;
|
||||||
import com.ruoyi.cai.manager.SystemConfigManager;
|
import com.ruoyi.cai.manager.SystemConfigManager;
|
||||||
import com.ruoyi.cai.service.AccountService;
|
import com.ruoyi.cai.service.AccountService;
|
||||||
@@ -140,21 +141,28 @@ public class LotteryService {
|
|||||||
PrizeOnline winPrize = null;
|
PrizeOnline winPrize = null;
|
||||||
boolean isResetContinuousDraws = false; // 是否需要重置累计抽数
|
boolean isResetContinuousDraws = false; // 是否需要重置累计抽数
|
||||||
|
|
||||||
// 3.1 保底规则判断(优先触发)
|
// 3.1 保底规则判断(优先触发,仅大奖)
|
||||||
winPrize = checkGuaranteeRule(validPrizes, newContinuousDraws);
|
winPrize = checkGuaranteeRule(validPrizes, newContinuousDraws);
|
||||||
if (winPrize != null) {
|
if (winPrize != null) {
|
||||||
// 触发保底中奖,需要重置累计抽数
|
// 触发大奖保底,需要重置累计抽数
|
||||||
isResetContinuousDraws = true;
|
isResetContinuousDraws = true;
|
||||||
log.info("用户{}触发保底,中得奖品{},累计抽数将重置", userId, winPrize.getPrizeName());
|
log.info("用户{}触发大奖保底,中得奖品{},累计抽数将重置", userId, winPrize.getPrizeName());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3.2 未触发保底,执行概率抽奖(含最低中奖抽数过滤)
|
// 3.2 未触发保底,执行概率抽奖(含最低中奖抽数过滤)
|
||||||
if (winPrize == null) {
|
if (winPrize == null) {
|
||||||
winPrize = executeProbabilityDraw(validPrizes, newContinuousDraws);
|
winPrize = executeProbabilityDraw(validPrizes, newContinuousDraws);
|
||||||
if (winPrize != null) {
|
if (winPrize != null) {
|
||||||
// 概率抽奖中奖,需要重置累计抽数
|
// 判断中奖类型
|
||||||
isResetContinuousDraws = true;
|
if (PrizeTypeEnum.GOOD.getCode().equals(winPrize.getPrizeType())) {
|
||||||
log.info("用户{}概率抽奖中得奖品{},累计抽数将重置", userId, winPrize.getPrizeName());
|
// 中大奖,需要重置累计抽数
|
||||||
|
isResetContinuousDraws = true;
|
||||||
|
log.info("用户{}概率抽奖中得大奖{},累计抽数将重置", userId, winPrize.getPrizeName());
|
||||||
|
} else {
|
||||||
|
// 中普通奖,不重置累计抽数
|
||||||
|
log.info("用户{}概率抽奖中得普通奖{},累计抽数继续累加到{}",
|
||||||
|
userId, winPrize.getPrizeName(), newContinuousDraws);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,7 +172,6 @@ public class LotteryService {
|
|||||||
// 谢谢惠顾不重置累计抽数
|
// 谢谢惠顾不重置累计抽数
|
||||||
log.info("用户{}未中奖,谢谢惠顾,累计抽数继续累加到{}", userId, newContinuousDraws);
|
log.info("用户{}未中奖,谢谢惠顾,累计抽数继续累加到{}", userId, newContinuousDraws);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 步骤4:持久化抽奖记录+更新缓存
|
// 步骤4:持久化抽奖记录+更新缓存
|
||||||
winPrizeAfter(winPrize, user, drawPoint, newContinuousDraws, isResetContinuousDraws);
|
winPrizeAfter(winPrize, user, drawPoint, newContinuousDraws, isResetContinuousDraws);
|
||||||
// 步骤5:返回中奖奖品
|
// 步骤5:返回中奖奖品
|
||||||
@@ -172,20 +179,31 @@ public class LotteryService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 保底规则判断
|
* 保底规则判断(仅对大奖生效)
|
||||||
* @param validPrizes 有效奖品列表
|
* @param validPrizes 有效奖品列表
|
||||||
* @param currentDraws 当前累计抽数
|
* @param currentDraws 当前累计抽数
|
||||||
* @return 保底中奖的奖品(无则返回null)
|
* @return 保底中奖的奖品(无则返回null)
|
||||||
*/
|
*/
|
||||||
private PrizeOnline checkGuaranteeRule(List<PrizeOnline> validPrizes, int currentDraws) {
|
private PrizeOnline checkGuaranteeRule(List<PrizeOnline> validPrizes, int currentDraws) {
|
||||||
// 按保底抽数升序排序,优先触发保底抽数小的奖品
|
// 筛选出有保底机制的大奖(prizeType = 3)
|
||||||
List<PrizeOnline> sortedPrizes = new ArrayList<>(validPrizes);
|
List<PrizeOnline> grandPrizesWithGuarantee = new ArrayList<>();
|
||||||
sortedPrizes.sort(Comparator.comparingInt(PrizeOnline::getGuaranteeDraws));
|
for (PrizeOnline prize : validPrizes) {
|
||||||
|
// 只有大奖才有保底机制
|
||||||
for (PrizeOnline prize : sortedPrizes) {
|
if (PrizeTypeEnum.GOOD.getCode().equals(prize.getPrizeType()) &&
|
||||||
|
prize.getGuaranteeDraws() != null && prize.getGuaranteeDraws() > 0) {
|
||||||
|
grandPrizesWithGuarantee.add(prize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (grandPrizesWithGuarantee.isEmpty()) {
|
||||||
|
log.debug("累计抽数{}:无配置保底的大奖", currentDraws);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// 按保底抽数升序排序,优先触发保底抽数小的大奖
|
||||||
|
grandPrizesWithGuarantee.sort(Comparator.comparingInt(PrizeOnline::getGuaranteeDraws));
|
||||||
|
for (PrizeOnline prize : grandPrizesWithGuarantee) {
|
||||||
int guaranteeDraws = prize.getGuaranteeDraws();
|
int guaranteeDraws = prize.getGuaranteeDraws();
|
||||||
if (guaranteeDraws > 0 && currentDraws >= guaranteeDraws) {
|
if (currentDraws >= guaranteeDraws) {
|
||||||
log.info("触发保底规则,累计抽数{} >= 保底抽数{},用户抽中奖品:{}",
|
log.info("触发大奖保底规则,累计抽数{} >= 保底抽数{},用户抽中大奖:{}",
|
||||||
currentDraws, guaranteeDraws, prize.getPrizeName());
|
currentDraws, guaranteeDraws, prize.getPrizeName());
|
||||||
return prize;
|
return prize;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user