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

Commit d59d36ad authored by jiangxiulong's avatar jiangxiulong

抽奖概率判断 总概率超过100的;=0;排序

parent 0f0a62a9
...@@ -245,20 +245,35 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService { ...@@ -245,20 +245,35 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
avgHitRatio = new BigDecimal(100).subtract(sumHitRatio).divide(new BigDecimal(size), 2, RoundingMode.HALF_UP); avgHitRatio = new BigDecimal(100).subtract(sumHitRatio).divide(new BigDecimal(size), 2, RoundingMode.HALF_UP);
} }
// 未设置概率的写入概率 // 未设置概率的写入概率
ArrayList<GoblinGoodsSkuInfoVo> newSkuInfoVos = ObjectUtil.cloneArrayGoblinGoodsSkuInfoListVo();
int skuListSize = skuInfoVos.size(); int skuListSize = skuInfoVos.size();
for (int i = 0; i < skuListSize; i++) { 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); /**
* 算所得平均概率是0 即中不了 剔除掉
* 但是这么处理会导致前端页面显示有库存 买的时候显示没有
* 所以要么概率加起来必须100 要么前端计算盲盒总概率的时候也要同样处理
*/
if (avgHitRatio.compareTo(BigDecimal.ZERO) <= 0) {
continue;
} else {
infoVo.setHitRatio(avgHitRatio);
}
} }
// 等于0的最终概率就是设置的值 大于0最终的概率是自己的+上面的 // 等于0的最终概率就是设置的值 大于0最终的概率是自己的+上面的
if (i > 0) { if (i > 0) {
skuInfoVos.get(i).setHitRatio(skuInfoVos.get(i - 1).getHitRatio().add(skuInfoVos.get(i).getHitRatio())); infoVo.setHitRatio(skuInfoVos.get(i - 1).getHitRatio().add(infoVo.getHitRatio()));
} }
newSkuInfoVos.add(infoVo);
}
if (CollectionUtil.isEmpty(newSkuInfoVos)) {
log.info("该盲盒概率超过100导致不能卖 skuIdList:{}", skuIdList);
return null;
} }
// 按照概率排序 // 按照概率排序 按照上面的运算最后一定是最大的不用排序了
List<GoblinGoodsSkuInfoVo> listSort = skuInfoVos.stream().sorted(Comparator.comparing(GoblinGoodsSkuInfoVo::getHitRatio)).collect(Collectors.toList()); // List<GoblinGoodsSkuInfoVo> listSort = newSkuInfoVos.stream().sorted(Comparator.comparing(GoblinGoodsSkuInfoVo::getHitRatio)).collect(Collectors.toList());
List<BigDecimal> hitRatioList = listSort.stream().map(GoblinGoodsSkuInfoVo::getHitRatio).collect(Collectors.toList()); List<BigDecimal> hitRatioList = newSkuInfoVos.stream().map(GoblinGoodsSkuInfoVo::getHitRatio).collect(Collectors.toList());
// 根据区块值来获取抽取到的物品索引 // 根据区块值来获取抽取到的物品索引
double nextDouble = Math.random(); double nextDouble = Math.random();
BigDecimal nextDoubleNew = BigDecimal.valueOf(nextDouble); BigDecimal nextDoubleNew = BigDecimal.valueOf(nextDouble);
...@@ -269,7 +284,7 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService { ...@@ -269,7 +284,7 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
int index = hitRatioList.indexOf(nextDoubleNew); int index = hitRatioList.indexOf(nextDoubleNew);
GoblinGoodsSkuInfoVo goodsSkuInfoVo = listSort.get(index); GoblinGoodsSkuInfoVo goodsSkuInfoVo = newSkuInfoVos.get(index);
// 判断库存 // 判断库存
int surplusGeneral = nftOrderUtils.decrSkuStock(goodsSkuInfoVo.getSkuId(), number); int surplusGeneral = nftOrderUtils.decrSkuStock(goodsSkuInfoVo.getSkuId(), number);
if (surplusGeneral < 0) { if (surplusGeneral < 0) {
......
...@@ -374,7 +374,7 @@ public class GoblinNftOrderUtils { ...@@ -374,7 +374,7 @@ public class GoblinNftOrderUtils {
return false; return false;
} }
} }
// 根据概率判断是否过滤当前sku // 根据概率判断是否过滤当前sku 没设置概率或者设置了的返回true
public boolean getSkuHitRatio(BigDecimal hitRatio) { public boolean getSkuHitRatio(BigDecimal hitRatio) {
if (hitRatio == null || hitRatio.compareTo(BigDecimal.ZERO) > 0) { if (hitRatio == null || hitRatio.compareTo(BigDecimal.ZERO) > 0) {
return true; return true;
......
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