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

Commit 4f4595a6 authored by jiangxiulong's avatar jiangxiulong

是否会员概率*2 抽奖实物减总库存

parent 4649bae8
...@@ -49,4 +49,7 @@ public interface FeignAdamBaseClient { ...@@ -49,4 +49,7 @@ public interface FeignAdamBaseClient {
@RequestParam(value = "mobile") String mobile, @RequestParam(value = "mobile") String mobile,
@NotBlank(message = "临时票据不能为空") @NotBlank(message = "临时票据不能为空")
@RequestParam(value = "otp") String otp); @RequestParam(value = "otp") String otp);
@GetMapping("check/depth")
ResponseDto<Boolean> isMember(@NotBlank(message = "用户ID不能为空") @RequestParam String uid);
} }
...@@ -72,7 +72,6 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg ...@@ -72,7 +72,6 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
public ResponseDto<IntegralActivityPrizeVo> create(String integralActivityId) { public ResponseDto<IntegralActivityPrizeVo> create(String integralActivityId) {
Map tokenClaims = CurrentUtil.getTokenClaims(); Map tokenClaims = CurrentUtil.getTokenClaims();
String userId = StringUtils.defaultString((String.valueOf(tokenClaims.get(CurrentUtil.TOKEN_SUB))), ""); String userId = StringUtils.defaultString((String.valueOf(tokenClaims.get(CurrentUtil.TOKEN_SUB))), "");
String mobile = StringUtils.defaultString((String.valueOf(tokenClaims.get(CurrentUtil.TOKEN_MOBILE))), "");
// 加锁 // 加锁
boolean isLock = redisDataUtils.setIntegralDrawLock(userId); boolean isLock = redisDataUtils.setIntegralDrawLock(userId);
if (!isLock) { if (!isLock) {
...@@ -118,8 +117,7 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg ...@@ -118,8 +117,7 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
ArrayList<IntegralActivityPrizeVo> activityPrizeVoArrayList = SweetNewObjectUtil.getIntegralActivityPrizeVoArrayList(); ArrayList<IntegralActivityPrizeVo> activityPrizeVoArrayList = SweetNewObjectUtil.getIntegralActivityPrizeVoArrayList();
// 概率计算 // 概率计算
// TODO: 2021/12/6 黑名单只中券 不记录次数 // TODO: 2021/12/6 黑名单只中券 不记录次数
// TODO: 2021/12/6 白名单概率*2 boolean lotteryDraw = this.lotteryDraw(integralActivity.getEstimatedNum(), integralActivity.getIntegralActivityId(), userId);
boolean lotteryDraw = this.lotteryDraw(integralActivity.getPrizeList2(), integralActivity.getEstimatedNum(), integralActivity.getIntegralActivityId());
if (lotteryDraw) { // 实物 if (lotteryDraw) { // 实物
List<IntegralActivityPrizeVo> prizeList = integralActivity.getPrizeList2(); List<IntegralActivityPrizeVo> prizeList = integralActivity.getPrizeList2();
for (IntegralActivityPrizeVo info : prizeList) { for (IntegralActivityPrizeVo info : prizeList) {
...@@ -133,7 +131,7 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg ...@@ -133,7 +131,7 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
}*/ }*/
} }
if (!lotteryDraw || CollectionUtils.isEmpty(activityPrizeVoArrayList)) { if (!lotteryDraw || CollectionUtils.isEmpty(activityPrizeVoArrayList)) {// 没中实物 或者 实物库存没了中券
List<IntegralActivityPrizeVo> prizeList = integralActivity.getPrizeList1(); List<IntegralActivityPrizeVo> prizeList = integralActivity.getPrizeList1();
for (IntegralActivityPrizeVo info : prizeList) { for (IntegralActivityPrizeVo info : prizeList) {
int integralActivityPrizeNum = redisDataUtils.getIntegralActivityPrizeNum(integralActivityId, info.getPrizeId()); int integralActivityPrizeNum = redisDataUtils.getIntegralActivityPrizeNum(integralActivityId, info.getPrizeId());
...@@ -187,27 +185,15 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg ...@@ -187,27 +185,15 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
// 发放状态 // 发放状态
receivingStatus = 2; receivingStatus = 2;
} }
// TODO: 2021/12/6 判断一张券直接发
/*if (prizeType == 3 || prizeType == 4 || prizeType == 5) {// 优惠券
// 发放优惠券
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlsDataA = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("stone_candy_mgt_coupon.add_for_member"));
sqlsDataA.add(new Object[]{
IDGenerator.nextTimeId2(), sweetIntegralActivityPrize.getRelationId(),
sweetIntegralActivityPrize.getPrizeTypeNum(), mobile, nowTime, "INTEGRAL_ACTIVITY_DRAW_COUPON", nowTime
});
queueUtils.sendMsgByRedis(MQConst.StoneQueue.STONE_ORDER_COUPON.getKey(),
SqlMapping.gets(sqls, sqlsDataA));
// 发放状态
receivingStatus = 2;
}*/
if (prizeType == 1) { // 谢谢惠顾 if (prizeType == 1) { // 谢谢惠顾
receivingStatus = 3; receivingStatus = 3;
} }
integralActivityDrawVo.setReceivingStatus(receivingStatus); integralActivityDrawVo.setReceivingStatus(receivingStatus);
// redis // redis
redisDataUtils.setIntegralActivityDraw(integralActivityDrawVo); redisDataUtils.setIntegralActivityDraw(integralActivityDrawVo);
if (prizeType == 3 || prizeType == 4) { // 中实物减总库存
redisDataUtils.decrIntegralActivityTotalPrizeNum(integralActivityId);
}
// mongo // mongo
mongoTemplate.insert(integralActivityDrawVo, IntegralActivityDrawVo.class.getSimpleName()); mongoTemplate.insert(integralActivityDrawVo, IntegralActivityDrawVo.class.getSimpleName());
...@@ -429,20 +415,27 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg ...@@ -429,20 +415,27 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
/** /**
* 抽奖方法 计算中哪个奖池的奖品 * 抽奖方法 计算中哪个奖池的奖品
*/ */
private boolean lotteryDraw(List<IntegralActivityPrizeVo> prizeList, Integer estimatedNum, String integralActivityId) { private boolean lotteryDraw(Integer estimatedNum, String integralActivityId, String uid) {
// 随机数 // 随机数
double random = Math.random() * 100; double random = Math.random() * 100;
BigDecimal randomBig = BigDecimal.valueOf(random); BigDecimal randomBig = BigDecimal.valueOf(random);
// 剩余总库存 todo 添加编辑的时候设置个总库存省区计算 // 剩余总库存 添加编辑的时候冗余的总库存省去计算
int prizeNum = 0; int prizeNum = redisDataUtils.getIntegralActivityTotalPrizeNum(integralActivityId);
for (IntegralActivityPrizeVo prize : prizeList) {
int integralActivityPrizeNum = redisDataUtils.getIntegralActivityPrizeNum(integralActivityId, prize.getPrizeId());
prizeNum += integralActivityPrizeNum;
}
BigDecimal prizeNumBig = BigDecimal.valueOf(prizeNum); BigDecimal prizeNumBig = BigDecimal.valueOf(prizeNum);
// 概率 // 概率
int luckyDrawNum = redisDataUtils.getLuckyDrawNum(integralActivityId); int luckyDrawNum = redisDataUtils.getLuckyDrawNum(integralActivityId);
BigDecimal multiply = prizeNumBig.divide(BigDecimal.valueOf(estimatedNum - luckyDrawNum), 2, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)); BigDecimal diffEstimatedNum = BigDecimal.valueOf(estimatedNum - luckyDrawNum);
// 会员概率*2
try {
ResponseDto<Boolean> isMemberDto = feignAdamBaseClient.isMember(uid);
Boolean isMember = isMemberDto.getData();
if (isMember) {
diffEstimatedNum = diffEstimatedNum.divide(BigDecimal.valueOf(2), 2, BigDecimal.ROUND_HALF_UP);
}
} catch (Exception e) {
log.error("获取用户是否是会员失败 [uid:{], e:{}]", uid, e);
}
BigDecimal multiply = prizeNumBig.divide(diffEstimatedNum, 2, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100));
// 对比大小 // 对比大小
if (multiply.compareTo(randomBig) >= 0) { if (multiply.compareTo(randomBig) >= 0) {
return true; // 大于等于随机数中实物 return true; // 大于等于随机数中实物
......
...@@ -665,6 +665,23 @@ public class RedisDataUtils { ...@@ -665,6 +665,23 @@ public class RedisDataUtils {
return redisUtil.incr(redisKey, num); return redisUtil.incr(redisKey, num);
} }
public int getIntegralActivityTotalPrizeNum(String integralActivityId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_TOTAL_PRIZE_NUM
.concat(integralActivityId);
Object obj = redisUtil.get(redisKey);
if (null == obj) {
return 0;
} else {
return (int) obj;
}
}
public long decrIntegralActivityTotalPrizeNum(String integralActivityId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_TOTAL_PRIZE_NUM
.concat(integralActivityId);
long decr = redisUtil.decr(redisKey, 1);
return decr;
}
public IntegralActivityDrawVo getIntegralActivityDrawInfo(String drawId) { public IntegralActivityDrawVo getIntegralActivityDrawInfo(String drawId) {
String redisKeyDraw = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_INFO String redisKeyDraw = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_INFO
.concat(drawId); .concat(drawId);
......
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