This commit is contained in:
777
2026-01-14 18:09:04 +08:00
parent 27edbd9cf6
commit 6f2ed64dbf

View File

@@ -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<PrizeOnline> validPrizes, int currentDraws) {
// 按保底抽数升序排序,优先触发保底抽数小的奖品
List<PrizeOnline> sortedPrizes = new ArrayList<>(validPrizes);
sortedPrizes.sort(Comparator.comparingInt(PrizeOnline::getGuaranteeDraws));
for (PrizeOnline prize : sortedPrizes) {
// 筛选出有保底机制的大奖prizeType = 3
List<PrizeOnline> 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;
}