问题背景

刺激用户的抽奖欲望:当用户抽奖次数到一定值时才会解锁新的奖品。eg: 一个用户前3次抽奖只能抽到1-6号奖品,第4次开始就解锁了更好的奖品。第7次又会解锁更好的奖品。这样就可以更快速的消耗用户积分

所以在上一节DefaultLogicFactory已经实现了黑名单过滤规则和权重范围过滤规则的基础上,再实现次数过滤:即任何一个奖品配置抽奖n次后才能解锁的操作 rule_lock

开发流程

  1. 实现RuleLockLogicFilter, 主要是过滤用户抽奖次数和奖品对应的rule_value就行比对,如果小于,就接管,如果大于就放行
  2. 增加了StrategyAwardRuleModelVO作为仓库查询对应的奖品规则返回值
  3. 补充AbstractRaffleStrategy的抽奖一般流程,补充抽奖中的规则过滤
  4. 增加了doCheckRaffleCenterLogic方法

RuleLockLogicFilter

RuleLockLogicFilter 实现了一个抽奖前的过滤规则,名为 “次数锁规则”。该规则的目的是,当用户的抽奖次数达到某个设定值后,才会解锁更好的奖品,这样可以激励用户更快消耗积分。这种逻辑通过 rule_lock 规则实现。

  1. 通过仓储查询到当前策略和抽到的奖品对应的rule_lockrule_value。得到的raffleCount是用户需要达到的抽奖次数,才能解锁这个奖品
  2. 如果用户抽奖次数大于raffleCount,放行
  3. 反之拦截

StrategyAwardRuleModelVO

值对象VO,Value Object, 存储ruleModel, 并提供raffleCenterRuleModelListraffkeAfterRuleModelList用来过滤抽奖不同阶段的规则

  • StrategyAwardRuleModelVO 的作用是将原始的策略规则字符串转换为系统可以使用的规则集合,按阶段(如抽奖前、抽奖中、抽奖后)进行分类和筛选。
  • 它为抽奖流程中的不同阶段提供了规则支持,确保每个阶段使用正确的规则来处理用户行为。

AbstractRaffleStrategy

  1. 拿到奖品id后,通过queryStrategyAwardRuleModelVO查询对应奖品的规则`rule_Model
  2. rule_model中是抽奖中的字段筛选出来rule_lock,并作为doCheckRaffleCenterLogic的入参。 抽奖过程中,会检查抽奖中的规则(例如解锁次数),如果用户的抽奖次数小于设定值,会触发“幸运奖”或其他的兜底奖品策略。
  3. 如果通过了所有规则过滤,则返回最终的奖品信息。

改bug

1.在DefaultRaffleStrategy的doCheckRaffleBeforeLogic,增加检查logics是否为空的逻辑,因为当策略的ruleModel为空时,这里会发生空指针

2.在strategyEntity的getRuleWeight增加了判断ruleModel为空的逻辑,同上

  1. 在assembleLotteryStrategy修改了这个:repository.storeStrategyAwardRateSearchTable(key, new BigDecimal(shuffleStrategyAwardRateSearchTable.size()), shuffleStrategyAwardRateSearchTable); 这样就可以保证抽出来的奖品不为空,但是不知道为什么