|
@@ -3,6 +3,7 @@ package com.seamew.lottery.domain.strategy.service.draw;
|
|
|
import com.seamew.lottery.common.Constants;
|
|
|
import com.seamew.lottery.domain.strategy.model.aggregates.StrategyRich;
|
|
|
import com.seamew.lottery.domain.strategy.model.req.DrawReq;
|
|
|
+import com.seamew.lottery.domain.strategy.model.res.DrawAlgorithmResult;
|
|
|
import com.seamew.lottery.domain.strategy.model.res.DrawResult;
|
|
|
import com.seamew.lottery.domain.strategy.model.vo.*;
|
|
|
import com.seamew.lottery.domain.strategy.service.algorithm.IDrawAlgorithm;
|
|
@@ -33,10 +34,10 @@ public abstract class AbstractDrawBase extends DrawStrategySupport implements ID
|
|
|
List<String> excludeAwardIds = queryExcludeAwardIds(req.getStrategyId());
|
|
|
|
|
|
// 4. 执行抽奖算法
|
|
|
- String awardId = drawAlgorithm(req.getStrategyId(), drawAlgorithmGroup.get(strategy.getStrategyMode()), excludeAwardIds);
|
|
|
+ DrawAlgorithmResult drawAlgorithmResult = drawAlgorithm(req.getStrategyId(), drawAlgorithmGroup.get(strategy.getStrategyMode()), excludeAwardIds);
|
|
|
|
|
|
// 5. 包装中奖结果
|
|
|
- return buildDrawResult(req.getUId(), req.getStrategyId(), awardId, strategy);
|
|
|
+ return buildDrawResult(req.getUId(), req.getStrategyId(), drawAlgorithmResult, strategy);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -53,9 +54,9 @@ public abstract class AbstractDrawBase extends DrawStrategySupport implements ID
|
|
|
* @param strategyId 策略ID
|
|
|
* @param drawAlgorithm 抽奖算法模型
|
|
|
* @param excludeAwardIds 排除的抽奖ID集合
|
|
|
- * @return 中奖奖品ID
|
|
|
+ * @return 抽奖算法结果
|
|
|
*/
|
|
|
- protected abstract String drawAlgorithm(Long strategyId, IDrawAlgorithm drawAlgorithm, List<String> excludeAwardIds);
|
|
|
+ protected abstract DrawAlgorithmResult drawAlgorithm(Long strategyId, IDrawAlgorithm drawAlgorithm, List<String> excludeAwardIds);
|
|
|
|
|
|
/**
|
|
|
* 校验抽奖策略是否已经初始化到内存
|
|
@@ -87,23 +88,24 @@ public abstract class AbstractDrawBase extends DrawStrategySupport implements ID
|
|
|
/**
|
|
|
* 包装抽奖结果
|
|
|
*
|
|
|
- * @param uId 用户ID
|
|
|
- * @param strategyId 策略ID
|
|
|
- * @param awardId 奖品ID,null 情况:并发抽奖情况下,库存临界值1 -> 0,会有用户中奖结果为 null
|
|
|
+ * @param uId 用户ID
|
|
|
+ * @param strategyId 策略ID
|
|
|
+ * @param drawAlgorithmResult 抽奖算法结果
|
|
|
* @return 中奖结果
|
|
|
*/
|
|
|
- private DrawResult buildDrawResult(String uId, Long strategyId, String awardId, StrategyBriefVO strategy) {
|
|
|
- if (null == awardId) {
|
|
|
+ private DrawResult buildDrawResult(String uId, Long strategyId, DrawAlgorithmResult drawAlgorithmResult, StrategyBriefVO strategy) {
|
|
|
+ if ("-1".equals(drawAlgorithmResult.getAwardId())) {
|
|
|
log.info("执行策略抽奖完成【未中奖】,用户:{} 策略ID:{}", uId, strategyId);
|
|
|
return new DrawResult(uId, strategyId, Constants.DrawState.FAIL.getCode());
|
|
|
}
|
|
|
|
|
|
- AwardBriefVO award = queryAwardInfoByAwardId(awardId);
|
|
|
+ AwardBriefVO award = queryAwardInfoByAwardId(drawAlgorithmResult.getAwardId());
|
|
|
DrawAwardVO drawAwardInfo = new DrawAwardVO(uId, award.getAwardId(), award.getAwardType(), award.getAwardName(), award.getAwardContent());
|
|
|
drawAwardInfo.setStrategyMode(strategy.getStrategyMode());
|
|
|
drawAwardInfo.setGrantType(strategy.getGrantType());
|
|
|
drawAwardInfo.setGrantDate(strategy.getGrantDate());
|
|
|
- log.info("执行策略抽奖完成【已中奖】,用户:{} 策略ID:{} 奖品ID:{} 奖品名称:{}", uId, strategyId, awardId, award.getAwardName());
|
|
|
+ drawAwardInfo.setAwardSurplusCount(drawAlgorithmResult.getAwardSurplusCount());
|
|
|
+ log.info("执行策略抽奖完成【已中奖】,用户:{} 策略ID:{} 奖品ID:{} 奖品名称:{}", uId, strategyId, drawAlgorithmResult.getAwardId(), award.getAwardName());
|
|
|
|
|
|
return new DrawResult(uId, strategyId, Constants.DrawState.SUCCESS.getCode(), drawAwardInfo);
|
|
|
}
|