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

Commit a1dce53f authored by jiangxiulong's avatar jiangxiulong

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

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