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

Commit 18187100 authored by jiangxiulong's avatar jiangxiulong

choujiang

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