抽奖开发思路
先中奖,然后再抽奖品。
0、整个代码外包加分布式锁,开始抽奖
1、参数检查
- 是否满足活动时间和场次
- 是否满足抽奖次数
- 是否满足库存校验
2、先拿到抽奖的配置参数,包括中奖率
- 人工配置中奖率直接返回
- 系统中奖率,则要计算总库存和总时间比
BigDecimal initStockTimeRatio = properties.getInitStockTimeRatio(); //初始库存时间比
BigDecimal nowStockTimeRatio = new BigDecimal(totalRestInventory / totalRestMinute);
BigDecimal dynamicWaveValue = nowStockTimeRatio.divide(initStockTimeRatio, 3, BigDecimal.ROUND_HALF_UP);//动态波动值
BigDecimal systemWinPrizeRate = dynamicWaveValue.multiply(new BigDecimal(properties.getWinPrizeRate()));
3、进行抽奖,取[1-100]随机数,看是否在中奖率范围内。
4、插入”抽奖日志”,只是记录中奖了,并没有记录什么奖品。
5、分配奖品,根据奖品配置为用户分配奖品。
- 奖品总剩余库存检查
- 用户该奖品已中奖次数超过设置的可中奖次数,或者对应奖品无库存则选择默认奖品,以对应乐观锁锁不住的情况