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

Commit 18187100 authored by jiangxiulong's avatar jiangxiulong

choujiang

parent 03672984
......@@ -37,6 +37,7 @@ public class SweetConstant {
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_USER_KEY = ":userId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_INFO = "sweet:integralActivity:DrawInfo:drawId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_LOCK = "sweet:integralActivity:lock:userId:";
public static final String REDIS_KEY_SWEET_LUCKY_DRAW_NUM = "sweet:integralActivity:luckyDrawNum:activityId:";
// 答题活动
public final static String REDIS_KEY_SWEET_ANSWER_PHONE = "sweet:answer:phone:";
// 城市投票活动
......
......@@ -28,6 +28,9 @@ public class IntegralActivityVo implements Serializable, Cloneable {
@ApiModelProperty(value = "活动玩一次所需积分")
private Integer activityNum;
@ApiModelProperty(value = "预估玩此活动的总人数")
private Integer estimatedNum;
@ApiModelProperty(value = "活动时间类型 1长期 2开始结束时间")
private Integer timeType;
......@@ -80,6 +83,7 @@ public class IntegralActivityVo implements Serializable, Cloneable {
this.setActivityImg(source.getActivityImg());
this.setActivityType(source.getActivityType());
this.setActivityNum(source.getActivityNum());
this.setEstimatedNum(source.getEstimatedNum());
this.setTimeType(source.getTimeType());
this.setStartTime(source.getStartTime());
this.setEndTime(source.getEndTime());
......
......@@ -111,18 +111,36 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
}
}
// 如果库存没了 限制的中奖人数到了就从列表剔出 列表为空就都没有库存了
List<IntegralActivityPrizeVo> prizeList = integralActivity.getPrizeList();
// 如果库存没了就从列表剔出 列表为空就都没有库存了
ArrayList<IntegralActivityPrizeVo> activityPrizeVoArrayList = SweetNewObjectUtil.getIntegralActivityPrizeVoArrayList();
for (IntegralActivityPrizeVo info : prizeList) {
int integralActivityPrizeNum = redisDataUtils.getIntegralActivityPrizeNum(integralActivityId, info.getPrizeId());
if (integralActivityPrizeNum > 0) {
activityPrizeVoArrayList.add(info);
// 概率计算
boolean lotteryDraw = this.lotteryDraw(integralActivity.getPrizeList2(), integralActivity.getEstimatedNum(), integralActivity.getIntegralActivityId());
if (lotteryDraw) { // 实物
List<IntegralActivityPrizeVo> prizeList = integralActivity.getPrizeList2();
for (IntegralActivityPrizeVo info : prizeList) {
int integralActivityPrizeNum = redisDataUtils.getIntegralActivityPrizeNum(integralActivityId, info.getPrizeId());
if (integralActivityPrizeNum > 0) {
activityPrizeVoArrayList.add(info);
}
}
/*if (CollectionUtils.isEmpty(activityPrizeVoArrayList)) {
return ResponseDto.failure("活动太火爆了,奖品已经没有库存啦~");
}*/
}
if (CollectionUtils.isEmpty(activityPrizeVoArrayList)) {
return ResponseDto.failure("活动太火爆了,奖品已经没有库存啦~");
if (!lotteryDraw || CollectionUtils.isEmpty(activityPrizeVoArrayList)) {
List<IntegralActivityPrizeVo> prizeList = integralActivity.getPrizeList1();
for (IntegralActivityPrizeVo info : prizeList) {
int integralActivityPrizeNum = redisDataUtils.getIntegralActivityPrizeNum(integralActivityId, info.getPrizeId());
if (integralActivityPrizeNum > 0) {
activityPrizeVoArrayList.add(info);
}
}
/*if (CollectionUtils.isEmpty(activityPrizeVoArrayList)) {
return ResponseDto.failure("活动太火爆了,奖品已经没有库存啦~");
}*/
}
IntegralActivityPrizeVo integralActivityPrizeVo = this.lotteryDraw1(activityPrizeVoArrayList);
// 减库存 顺便判断库存是否够 -1的时候回滚回去
......@@ -338,7 +356,7 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
}
/**
* 抽奖方法 积分、券
* 抽奖方法 计算中哪一个
*/
private static IntegralActivityPrizeVo lotteryDraw1(List<IntegralActivityPrizeVo> prizeList) {
if (prizeList == null || prizeList.isEmpty()) {
......@@ -374,39 +392,28 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
}
/**
* 抽奖方法 实物、会员
* 抽奖方法 计算中哪个奖池的奖品
*/
private static IntegralActivityPrizeVo lotteryDraw2(List<IntegralActivityPrizeVo> prizeList) {
if (prizeList == null || prizeList.isEmpty()) {
return null;
}
int size = prizeList.size();
// 计算总概率,这样可以保证不一定总概率是1
BigDecimal sumRate = BigDecimal.ZERO;
private boolean lotteryDraw(List<IntegralActivityPrizeVo> prizeList, Integer estimatedNum, String integralActivityId) {
// 随机数
double random = Math.random() * 100;
BigDecimal randomBig = BigDecimal.valueOf(random);
// 剩余总库存 todo 添加编辑的时候设置个总库存省区计算
int prizeNum = 0;
for (IntegralActivityPrizeVo prize : prizeList) {
sumRate = sumRate.add(prize.getWinningProbability());
int integralActivityPrizeNum = redisDataUtils.getIntegralActivityPrizeNum(integralActivityId, prize.getPrizeId());
prizeNum += integralActivityPrizeNum;
}
// 计算每个物品在总概率的基础下的概率情况
List<BigDecimal> sortOrignalRates = new ArrayList<>(size);
BigDecimal tempSumRate = BigDecimal.ZERO;
for (IntegralActivityPrizeVo prize : prizeList) {
tempSumRate = tempSumRate.add(prize.getWinningProbability());
sortOrignalRates.add(tempSumRate.divide(sumRate, 4, BigDecimal.ROUND_HALF_UP));
BigDecimal prizeNumBig = BigDecimal.valueOf(prizeNum);
// 概率
int luckyDrawNum = redisDataUtils.getLuckyDrawNum(integralActivityId);
BigDecimal multiply = prizeNumBig.divide(BigDecimal.valueOf(estimatedNum - luckyDrawNum)).multiply(BigDecimal.valueOf(100));
// 对比大小
if (multiply.compareTo(randomBig) >= 0) {
return true; // 大于等于随机数中实物
} else {
return false;
}
// 根据区块值来获取抽取到的物品索引
double nextDouble = Math.random();
BigDecimal nextDoubleNew = BigDecimal.valueOf(nextDouble);
sortOrignalRates.add(nextDoubleNew);
Collections.sort(sortOrignalRates);
int index = sortOrignalRates.indexOf(nextDoubleNew);
IntegralActivityPrizeVo integralActivityPrizeVo = prizeList.get(index);
return integralActivityPrizeVo;
}
/*public static void main(String[] args) {
......
......@@ -751,4 +751,15 @@ public class RedisDataUtils {
return (List<TempBannerVo>)obj;
}
}
public int getLuckyDrawNum(String integralActivityId) {
String redisKeyDraw = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_INFO
.concat(integralActivityId);
Object obj = redisUtil.get(redisKeyDraw);
if (null == obj) {
return 0;
} else {
return (int) obj;
}
}
}
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