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.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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user