记得上下班打卡 | git大法好,push需谨慎

Commit a1dce53f authored by jiangxiulong's avatar jiangxiulong

几个字段null的判断;平均概率除数是未设置概率的总数;当全部设置了概率除数为0的判断;

parent 667c4e8a
...@@ -73,7 +73,7 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService { ...@@ -73,7 +73,7 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
String skuId = payParam.getSkuId(); String skuId = payParam.getSkuId();
int number = 1; int number = 1;
GoblinGoodsSkuInfoVo skuVo = goblinRedisUtils.getGoodsSkuInfoVo(skuId); GoblinGoodsSkuInfoVo skuVo = goblinRedisUtils.getGoodsSkuInfoVo(skuId);
if (null == skuVo || skuVo.getSkuAppear().equals("1")) { if (null == skuVo || (null != skuVo.getSkuAppear() && skuVo.getSkuAppear().equals("1"))) {
return ResponseDto.failure("该商品不存在~"); return ResponseDto.failure("该商品不存在~");
} }
String spuId = skuVo.getSpuId(); String spuId = skuVo.getSpuId();
...@@ -103,10 +103,10 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService { ...@@ -103,10 +103,10 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
return ResponseDto.failure("该商品已停售~"); return ResponseDto.failure("该商品已停售~");
} }
// 判断数量限购 盲盒暂时没限购但是要记录购买数量 所以也放在这里 这样既能都记录限购数量又不至于判断处理麻烦 // 判断数量限购 盲盒暂时没限购但是要记录购买数量 所以也放在这里 这样既能都记录限购数量又不至于判断处理麻烦
int limitCount = skuVo.getBuyLimit(); Integer limitCount = skuVo.getBuyLimit();
// 是否限购都记录一个购买数量 防止中间增加限购 开始没加后面判断库存减了也是有问题的 或者放在最后也行 因为对单用户限流了 // 是否限购都记录一个购买数量 防止中间增加限购 开始没加后面判断库存减了也是有问题的 或者放在最后也行 因为对单用户限流了
if (null != limitCount && !Objects.equals(0, limitCount)) {
int buyCount = goblinRedisUtils.incrSkuCountByUid(uid, skuId, number); int buyCount = goblinRedisUtils.incrSkuCountByUid(uid, skuId, number);
if (!Objects.equals(0, limitCount)) {
if (buyCount > limitCount) { if (buyCount > limitCount) {
goblinRedisUtils.decrSkuCountByUid(uid, skuId, number); goblinRedisUtils.decrSkuCountByUid(uid, skuId, number);
return ResponseDto.failure("您已超出限购数量~"); return ResponseDto.failure("您已超出限购数量~");
...@@ -220,17 +220,27 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService { ...@@ -220,17 +220,27 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
return null; return null;
} else { } else {
// 计算总概率 和 剩余没填概率的平均概率 // 计算总概率 和 剩余没填概率的平均概率
BigDecimal sumHitRatio = skuInfoVos.stream().map(GoblinGoodsSkuInfoVo::getHitRatio).reduce(BigDecimal.ZERO, BigDecimal::add); int size = 0;
int size = skuInfoVos.size(); BigDecimal sumHitRatio = BigDecimal.ZERO;
for (GoblinGoodsSkuInfoVo skuInfoVo : skuInfoVos) {
if (null == skuInfoVo.getHitRatio() || skuInfoVo.getHitRatio().compareTo(BigDecimal.ZERO) <= 0) {
size++;
} else {
sumHitRatio = sumHitRatio.add(skuInfoVo.getHitRatio());
}
}
/** /**
* 剔除掉没库存的商品再去算未设置概率商品的平均概率 会导致未设置概率的商品的概率增加 * 剔除掉没库存的商品再去算未设置概率商品的平均概率 会导致未设置概率的商品的概率增加
* 如果不剔除掉没库存的商品去算未设置概率商品的平均概率 会导致总概率小于100 如果随机数还是0-100的话就有可能会中奖溢出 * 如果不剔除掉没库存的商品去算未设置概率商品的平均概率 会导致总概率小于100 如果随机数还是0-100的话就有可能会中奖溢出
* 想保持概率 1.不剔除无库存商品算平均概率 2.随机数最大值为排序后概率的最后一个值 * 想保持概率 1.不剔除无库存商品算平均概率 2.随机数最大值为排序后概率的最后一个值
*/ */
// ************ BigDecimal avgHitRatio = BigDecimal.ZERO;
BigDecimal avgHitRatio = new BigDecimal(100).subtract(sumHitRatio).divide(new BigDecimal(size), 2, RoundingMode.HALF_UP); if (size > 0) {// 说明有未设置抽奖概率的
avgHitRatio = new BigDecimal(100).subtract(sumHitRatio).divide(new BigDecimal(size), 2, RoundingMode.HALF_UP);
}
// 未设置概率的写入概率 // 未设置概率的写入概率
for (int i = 0; i < size; i++) { int skuListSize = skuInfoVos.size();
for (int i = 0; i < skuListSize; i++) {
GoblinGoodsSkuInfoVo infoVo = skuInfoVos.get(i); GoblinGoodsSkuInfoVo infoVo = skuInfoVos.get(i);
if (null == infoVo.getHitRatio() || infoVo.getHitRatio().compareTo(BigDecimal.ZERO) <= 0) { if (null == infoVo.getHitRatio() || infoVo.getHitRatio().compareTo(BigDecimal.ZERO) <= 0) {
skuInfoVos.get(i).setHitRatio(avgHitRatio); skuInfoVos.get(i).setHitRatio(avgHitRatio);
...@@ -246,6 +256,8 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService { ...@@ -246,6 +256,8 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
// 根据区块值来获取抽取到的物品索引 // 根据区块值来获取抽取到的物品索引
double nextDouble = Math.random(); double nextDouble = Math.random();
BigDecimal nextDoubleNew = BigDecimal.valueOf(nextDouble); BigDecimal nextDoubleNew = BigDecimal.valueOf(nextDouble);
nextDoubleNew = nextDoubleNew.multiply(hitRatioList.get(hitRatioList.size() - 1)).setScale(4, RoundingMode.HALF_UP);
hitRatioList.add(nextDoubleNew); hitRatioList.add(nextDoubleNew);
Collections.sort(hitRatioList); Collections.sort(hitRatioList);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment