diff --git a/xfg-frame-archetype-lite-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/impl/RuleStockLogicTreeNode.java b/xfg-frame-archetype-lite-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/impl/RuleStockLogicTreeNode.java index 80a5592451045234d6fde52cbb253155766604e2..92969164a108fc1b7d70e2e25cac0674de1f628b 100644 --- a/xfg-frame-archetype-lite-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/impl/RuleStockLogicTreeNode.java +++ b/xfg-frame-archetype-lite-domain/src/main/java/cn/bugstack/domain/strategy/service/rule/tree/impl/RuleStockLogicTreeNode.java @@ -1,12 +1,17 @@ package cn.bugstack.domain.strategy.service.rule.tree.impl; import cn.bugstack.domain.strategy.model.valobj.RuleLogicCheckTypeVO; +import cn.bugstack.domain.strategy.model.valobj.StrategyAwardStockKeyVO; +import cn.bugstack.domain.strategy.repository.IStrategyRepository; +import cn.bugstack.domain.strategy.service.armory.IStrategyDispatch; import cn.bugstack.domain.strategy.service.rule.tree.ILogicTreeNode; import cn.bugstack.domain.strategy.service.rule.tree.factory.DefaultTreeFactory; import lombok.extern.slf4j.Slf4j; import org.checkerframework.checker.units.qual.C; import org.springframework.stereotype.Component; +import javax.annotation.Resource; + /** * @description: 库存扣减节点 * @author: hdr @@ -16,11 +21,40 @@ import org.springframework.stereotype.Component; @Slf4j @Component("rule_stock") public class RuleStockLogicTreeNode implements ILogicTreeNode { + + @Resource + private IStrategyDispatch strategyDispatch; + @Resource + private IStrategyRepository strategyRepository; + @Override public DefaultTreeFactory.TreeActionEntity logic(String userId, Long strategyId, Integer awardId, String ruleValue) { + log.info("规则过滤-库存扣减 userId:{} strategyId:{} awardId:{}", userId, strategyId, awardId); + // 扣减库存 + Boolean status = strategyDispatch.subtractionAwardStock(strategyId, awardId); + // true;库存扣减成功,TAKE_OVER 规则节点接管,返回奖品ID,奖品规则配置 + if (status) { + log.info("规则过滤-库存扣减-成功 userId:{} strategyId:{} awardId:{}", userId, strategyId, awardId); + + // 写入延迟队列,延迟消费更新数据库记录。【在trigger的job;UpdateAwardStockJob 下消费队列,更新数据库记录】 + strategyRepository.awardStockConsumeSendQueue(StrategyAwardStockKeyVO.builder() + .strategyId(strategyId) + .awardId(awardId) + .build()); + + return DefaultTreeFactory.TreeActionEntity.builder() + .ruleLogicCheckType(RuleLogicCheckTypeVO.TAKE_OVER) + .strategyAwardVO(DefaultTreeFactory.StrategyAwardVO.builder() + .awardId(awardId) + .awardRuleValue(ruleValue) + .build()) + .build(); + } + // 如果库存不足,则直接返回放行 + log.warn("规则过滤-库存扣减-告警,库存不足。userId:{} strategyId:{} awardId:{}", userId, strategyId, awardId); return DefaultTreeFactory.TreeActionEntity.builder() - .ruleLogicCheckType(RuleLogicCheckTypeVO.TAKE_OVER) + .ruleLogicCheckType(RuleLogicCheckTypeVO.ALLOW) .build(); } } diff --git a/xfg-frame-archetype-lite-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/StrategyRepository.java b/xfg-frame-archetype-lite-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/StrategyRepository.java index 5198721a08cb28ae7c94bbcab08e7de858bd8651..deb04948d7262783ba0120f5d3f2c736d013a0bb 100644 --- a/xfg-frame-archetype-lite-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/StrategyRepository.java +++ b/xfg-frame-archetype-lite-infrastructure/src/main/java/cn/bugstack/infrastructure/persistent/repository/StrategyRepository.java @@ -273,9 +273,12 @@ public class StrategyRepository implements IStrategyRepository { @Override public void awardStockConsumeSendQueue(StrategyAwardStockKeyVO strategyAwardStockKeyVO) { String cacheKey = Constants.RedisKey.STRATEGY_AWARD_COUNT_QUERY_KEY; + RBlockingQueue blockingQueue = redisService.getBlockingQueue(cacheKey); RDelayedQueue delayedQueue = redisService.getDelayedQueue(blockingQueue); + delayedQueue.offer(strategyAwardStockKeyVO, 3, TimeUnit.SECONDS); + log.info("抽到奖品了---------------"); } @@ -283,7 +286,9 @@ public class StrategyRepository implements IStrategyRepository { public StrategyAwardStockKeyVO takeQueueValue() throws InterruptedException { String cacheKey = Constants.RedisKey.STRATEGY_AWARD_COUNT_QUERY_KEY; RBlockingQueue destinationQueue = redisService.getBlockingQueue(cacheKey); - return destinationQueue.poll(); + StrategyAwardStockKeyVO poll = destinationQueue.poll(); + log.info("队列数据:{}",poll); + return poll; } @Override