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