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

Commit 4f4595a6 authored by jiangxiulong's avatar jiangxiulong

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

parent 4649bae8
......@@ -49,4 +49,7 @@ public interface FeignAdamBaseClient {
@RequestParam(value = "mobile") String mobile,
@NotBlank(message = "临时票据不能为空")
@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
public ResponseDto<IntegralActivityPrizeVo> create(String integralActivityId) {
Map tokenClaims = CurrentUtil.getTokenClaims();
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);
if (!isLock) {
......@@ -118,8 +117,7 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
ArrayList<IntegralActivityPrizeVo> activityPrizeVoArrayList = SweetNewObjectUtil.getIntegralActivityPrizeVoArrayList();
// 概率计算
// TODO: 2021/12/6 黑名单只中券 不记录次数
// TODO: 2021/12/6 白名单概率*2
boolean lotteryDraw = this.lotteryDraw(integralActivity.getPrizeList2(), integralActivity.getEstimatedNum(), integralActivity.getIntegralActivityId());
boolean lotteryDraw = this.lotteryDraw(integralActivity.getEstimatedNum(), integralActivity.getIntegralActivityId(), userId);
if (lotteryDraw) { // 实物
List<IntegralActivityPrizeVo> prizeList = integralActivity.getPrizeList2();
for (IntegralActivityPrizeVo info : prizeList) {
......@@ -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();
for (IntegralActivityPrizeVo info : prizeList) {
int integralActivityPrizeNum = redisDataUtils.getIntegralActivityPrizeNum(integralActivityId, info.getPrizeId());
......@@ -187,27 +185,15 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
// 发放状态
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) { // 谢谢惠顾
receivingStatus = 3;
}
integralActivityDrawVo.setReceivingStatus(receivingStatus);
// redis
redisDataUtils.setIntegralActivityDraw(integralActivityDrawVo);
if (prizeType == 3 || prizeType == 4) { // 中实物减总库存
redisDataUtils.decrIntegralActivityTotalPrizeNum(integralActivityId);
}
// mongo
mongoTemplate.insert(integralActivityDrawVo, IntegralActivityDrawVo.class.getSimpleName());
......@@ -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;
BigDecimal randomBig = BigDecimal.valueOf(random);
// 剩余总库存 todo 添加编辑的时候设置个总库存省区计算
int prizeNum = 0;
for (IntegralActivityPrizeVo prize : prizeList) {
int integralActivityPrizeNum = redisDataUtils.getIntegralActivityPrizeNum(integralActivityId, prize.getPrizeId());
prizeNum += integralActivityPrizeNum;
}
// 剩余总库存 添加编辑的时候冗余的总库存省去计算
int prizeNum = redisDataUtils.getIntegralActivityTotalPrizeNum(integralActivityId);
BigDecimal prizeNumBig = BigDecimal.valueOf(prizeNum);
// 概率
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) {
return true; // 大于等于随机数中实物
......
......@@ -665,6 +665,23 @@ public class RedisDataUtils {
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) {
String redisKeyDraw = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_INFO
.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