-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
12 changed files
with
260 additions
and
121 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
59 changes: 59 additions & 0 deletions
59
...ery-domain/src/main/java/com/flameking/lottery/domain/strategy/draw/BaseDrawTemplate.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
package com.flameking.lottery.domain.strategy.draw; | ||
|
||
import com.flameking.lottery.domain.strategy.algorithm.ILotteryStrategy; | ||
import com.flameking.lottery.domain.strategy.factory.LotteryStrategyFactory; | ||
import com.flameking.lottery.domain.strategy.model.StrategyRich; | ||
import com.flameking.lottery.infrastructure.entity.Award; | ||
import com.flameking.lottery.infrastructure.entity.Strategy; | ||
|
||
import java.util.List; | ||
|
||
public abstract class BaseDrawTemplate extends DrawStrategySupport implements IDrawTemplate{ | ||
|
||
|
||
@Override | ||
public Award doDraw(Long uId, Long strategyId) { | ||
//查询奖品概率和策略配置信息 | ||
StrategyRich strategyRich = this.queryStrategyRich(strategyId); | ||
Strategy strategy = strategyRich.getStrategy(); | ||
|
||
//初始化抽奖策略 | ||
this.initDrawStrategy(strategy.getStrategyMode(), strategyRich); | ||
|
||
//查询不在抽奖范围内的奖品 | ||
List<Long> excludeAwardIds = this.queryExcludeAwardIds(strategyId); | ||
|
||
//执行抽奖 | ||
Long awardId = this.excDrawStrategy(strategyId, strategy.getStrategyMode(), excludeAwardIds); | ||
|
||
//包装奖品信息 | ||
return awardId == null ? null : this.queryAward(awardId); | ||
} | ||
|
||
/** | ||
* 初始化抽奖策略 | ||
* | ||
* @param strategyMode | ||
* @param strategyRich | ||
*/ | ||
private void initDrawStrategy(Integer strategyMode, StrategyRich strategyRich) { | ||
ILotteryStrategy lotteryStrategy = LotteryStrategyFactory.getLotteryStrategy(strategyMode); | ||
lotteryStrategy.initAwardRateInfo(strategyRich.getStrategyId(), strategyRich.getStrategyDetailList()); | ||
} | ||
|
||
/** | ||
* 执行抽奖策略 | ||
* | ||
* @param strategyId | ||
* @param strategyMode | ||
* @param excludeAwardIds | ||
*/ | ||
protected abstract Long excDrawStrategy(Long strategyId, Integer strategyMode, List<Long> excludeAwardIds); | ||
|
||
/** | ||
* 查询查询不在抽奖范围内的奖品 | ||
* | ||
* @param strategyId | ||
*/ | ||
protected abstract List<Long> queryExcludeAwardIds(Long strategyId); | ||
} |
28 changes: 28 additions & 0 deletions
28
...-domain/src/main/java/com/flameking/lottery/domain/strategy/draw/DrawStrategySupport.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package com.flameking.lottery.domain.strategy.draw; | ||
|
||
import com.flameking.lottery.domain.strategy.factory.LotteryStrategyFactory; | ||
import com.flameking.lottery.domain.strategy.model.StrategyRich; | ||
import com.flameking.lottery.domain.strategy.repository.IStrategyRepository; | ||
import com.flameking.lottery.infrastructure.entity.Award; | ||
|
||
import javax.annotation.Resource; | ||
import java.util.List; | ||
|
||
public class DrawStrategySupport { | ||
@Resource | ||
protected IStrategyRepository strategyRepository; | ||
|
||
protected StrategyRich queryStrategyRich(Long strategyId){ | ||
return strategyRepository.queryStrategyRich(strategyId); | ||
} | ||
protected Award queryAward(Long awardId){ | ||
return strategyRepository.queryAward(awardId); | ||
} | ||
protected List<Long> queryAwardIdsWithoutAmount(Long strategyId){ | ||
return strategyRepository.queryAwardIdsWithoutAmount(strategyId); | ||
} | ||
protected boolean decreaseLeftAwardCount(Long strategyId, Long awardId){ | ||
return strategyRepository.decreaseLeftAwardCount(strategyId, awardId); | ||
} | ||
|
||
} |
77 changes: 22 additions & 55 deletions
77
...omain/src/main/java/com/flameking/lottery/domain/strategy/draw/impl/DrawTemplateImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,72 +1,39 @@ | ||
package com.flameking.lottery.domain.strategy.draw.impl; | ||
|
||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | ||
import com.flameking.lottery.domain.strategy.algorithm.ILotteryStrategy; | ||
import com.flameking.lottery.domain.strategy.algorithm.impl.SingleProbabilityLotteryStrategy; | ||
import com.flameking.lottery.domain.strategy.draw.BaseDrawTemplate; | ||
import com.flameking.lottery.domain.strategy.factory.LotteryStrategyFactory; | ||
import com.flameking.lottery.infrastructure.entity.Award; | ||
import com.flameking.lottery.infrastructure.entity.Strategy; | ||
import com.flameking.lottery.infrastructure.entity.StrategyDetail; | ||
import com.flameking.lottery.infrastructure.service.IAwardService; | ||
import com.flameking.lottery.domain.strategy.draw.IDrawTemplate; | ||
import com.flameking.lottery.infrastructure.service.IStrategyDetailService; | ||
import com.flameking.lottery.infrastructure.service.IStrategyService; | ||
import org.springframework.stereotype.Component; | ||
|
||
import javax.annotation.Resource; | ||
import java.util.List; | ||
|
||
|
||
@Component | ||
public class DrawTemplateImpl implements IDrawTemplate { | ||
@Resource | ||
private IStrategyDetailService strategyDetailService; | ||
@Resource | ||
private IStrategyService strategyService; | ||
@Resource | ||
private IAwardService awardService; | ||
|
||
/** | ||
* 抽奖策略是否初始化 | ||
* | ||
* @param strategy | ||
* @param awardInfos | ||
*/ | ||
private ILotteryStrategy checkAndInitStrategy(Strategy strategy, List<StrategyDetail> awardInfos){ | ||
Integer strategyMode = strategy.getStrategyMode(); | ||
ILotteryStrategy lotteryStrategy = LotteryStrategyFactory.getLotteryStrategy(strategy.getStrategyMode()); | ||
lotteryStrategy.checkAndInitStrategy(strategy.getStrategyId(), awardInfos); | ||
public class DrawTemplateImpl extends BaseDrawTemplate { | ||
@Override | ||
protected Long excDrawStrategy(Long strategyId, Integer strategyMode, List<Long> excludeAwardIds) { | ||
ILotteryStrategy lotteryStrategy = LotteryStrategyFactory.getLotteryStrategy(strategyMode); | ||
Long awardId; | ||
//单项概率抽奖策略需要初始化奖品概率池 | ||
if (strategyMode == 1){ | ||
lotteryStrategy.init(strategy.getStrategyId()); | ||
SingleProbabilityLotteryStrategy singleProbabilityLotteryStrategy = (SingleProbabilityLotteryStrategy) lotteryStrategy; | ||
singleProbabilityLotteryStrategy.initAwardRatePool(strategyId); | ||
} | ||
awardId = lotteryStrategy.draw(strategyId, excludeAwardIds); | ||
|
||
if (awardId != null){ | ||
boolean isSuccess = this.decreaseLeftAwardCount(strategyId, awardId); | ||
//扣减失败,则等于未中奖 | ||
if (!isSuccess){ | ||
return null; | ||
} | ||
} | ||
return lotteryStrategy; | ||
return awardId; | ||
} | ||
|
||
@Override | ||
public Award doDraw(Long uId, Long strategyId) { | ||
//查询奖品信息和被排除的奖品信息 | ||
List<StrategyDetail> awardInfos = strategyDetailService.getStrategyDetailsByStrategyId(strategyId); | ||
|
||
//根据 strategyId 查询策略信息 | ||
Strategy strategy = strategyService.getByStrategyId(strategyId); | ||
|
||
//初始化抽奖策略 | ||
ILotteryStrategy lotteryStrategy = checkAndInitStrategy(strategy, awardInfos); | ||
|
||
//排除掉的奖品id | ||
List<Long> excludeAwardIds = strategyDetailService.getExcludedAwardIds(strategyId); | ||
|
||
//执行抽奖 | ||
String awardId = lotteryStrategy.draw(strategyId, excludeAwardIds); | ||
|
||
//未中奖 | ||
if (awardId == null){ | ||
return null; | ||
} | ||
|
||
//抽奖成功,扣减库存 | ||
boolean isSuccess = strategyDetailService.decreaseLeftAwardCount(strategyId, awardId); | ||
|
||
//包装奖品信息 | ||
return isSuccess ? awardService.getAwardByAwardId(Long.valueOf(awardId)) : null; | ||
protected List<Long> queryExcludeAwardIds(Long strategyId) { | ||
return this.queryAwardIdsWithoutAmount(strategyId); | ||
} | ||
} |
Oops, something went wrong.