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

Commit 60acb331 authored by jiangxiulong's avatar jiangxiulong

中奖返回值、EstimatedNum

parent 855d6704
......@@ -37,7 +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 static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_ESTIMATEDNUM = "sweet:integralActivity:estimatedNum:activityId:";
public static final String REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_TOTAL_PRIZE_NUM = "sweet:integralActivity:totalPrizeNum:activityId:";
// 答题活动
public final static String REDIS_KEY_SWEET_ANSWER_PHONE = "sweet:answer:phone:";
......
package com.liquidnet.service.sweet.dto.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
public class IntegralActivityPrizeApiVo implements Serializable, Cloneable {
private static final long serialVersionUID = -303399210433737206L;
@ApiModelProperty(value = "奖品id")
private String prizeId;
@ApiModelProperty(value = "关联活动id")
private String integralActivityId;
@ApiModelProperty(value = "抽奖id")
private String drawId;
@ApiModelProperty(value = "奖品名称")
private String prizeTitle;
@ApiModelProperty(value = "奖品描述")
private String prizeDescribe;
@ApiModelProperty(value = "初始展示奖品图片")
private String prizeImgInit;
@ApiModelProperty(value = "中奖选中奖品图片")
private String prizeImgSelect;
@ApiModelProperty(value = "奖品类型 1积分 2优惠券 3实物 4登登登VIP")
private Integer prizeType;
@ApiModelProperty(value = "单次奖励数量如积分 中奖给多少物")
private Integer prizeTypeNum;
private static final IntegralActivityPrizeApiVo obj = new IntegralActivityPrizeApiVo();
public static IntegralActivityPrizeApiVo getNew() {
try {
return (IntegralActivityPrizeApiVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new IntegralActivityPrizeApiVo();
}
}
public IntegralActivityPrizeApiVo copy(IntegralActivityPrizeVo source) {
if (null == this) return this;
this.setIntegralActivityId(source.getIntegralActivityId());
this.setPrizeId(source.getPrizeId());
this.setIntegralActivityId(source.getIntegralActivityId());
this.setPrizeTitle(source.getPrizeTitle());
this.setPrizeDescribe(source.getPrizeDescribe());
this.setPrizeImgInit(source.getPrizeImgInit());
this.setPrizeImgSelect(source.getPrizeImgSelect());
this.setPrizeType(source.getPrizeType());
this.setPrizeTypeNum(source.getPrizeTypeNum());
return this;
}
}
......@@ -3,6 +3,7 @@ package com.liquidnet.service.sweet.service;
import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityDrawVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeApiVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeVo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw;
import com.baomidou.mybatisplus.extension.service.IService;
......@@ -19,7 +20,7 @@ import java.util.List;
*/
public interface ISweetIntegralActivityDrawService extends IService<SweetIntegralActivityDraw> {
ResponseDto<IntegralActivityPrizeVo> create(String integralActivityId);
ResponseDto<IntegralActivityPrizeApiVo> create(String integralActivityId);
ResponseDto<PagedResult<IntegralActivityDrawVo>> drawList(Integer type, String integralActivityId, Integer pageNum);
......
......@@ -76,6 +76,8 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA
sweetIntegralActivityPrizeMapper.insert(sweetIntegralActivityPrize);
// 奖品库存
sweetRedisAdminUtils.incrIntegralActivityPrizeNum(integralActivityId, sweetIntegralActivityPrize.getPrizeId(), sweetIntegralActivityPrize.getPrizeNum());
// 预估人数
sweetRedisAdminUtils.incrIntegralActivityEstimatedNum(integralActivityId, sweetIntegralActivity.getEstimatedNum());
}
}
// 活动redis处理
......@@ -94,10 +96,23 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA
SweetIntegralActivity sweetIntegralActivity = SweetIntegralActivityFromParam.getNew().copy(param);
sweetIntegralActivity.setUpdatedAt(nowTime);
String integralActivityId = param.getIntegralActivityId();
SweetIntegralActivity sweetIntegralActivityOld = sweetIntegralActivityMapper.selectOne(
Wrappers.lambdaQuery(SweetIntegralActivity.class).eq(SweetIntegralActivity::getIntegralActivityId, integralActivityId)
);
int update = sweetIntegralActivityMapper.update(
sweetIntegralActivity,
Wrappers.lambdaUpdate(SweetIntegralActivity.class).eq(SweetIntegralActivity::getIntegralActivityId, integralActivityId)
);
Integer estimatedNum = sweetIntegralActivityOld.getEstimatedNum();
Integer estimatedNumNew = sweetIntegralActivity.getEstimatedNum();
int estimatedNumDiff = estimatedNumNew - estimatedNum;
if (estimatedNumDiff > 0) {//增加
sweetRedisAdminUtils.incrIntegralActivityEstimatedNum(integralActivityId, estimatedNumDiff);
} else if(estimatedNumDiff < 0) {// 减少
sweetRedisAdminUtils.decrIntegralActivityEstimatedNum(integralActivityId, Math.abs(estimatedNumDiff));
}
List<SweetIntegralActivityPrizeFormParam> prizeList = param.getPrizeList();
if (!CollectionUtils.isEmpty(prizeList)) {
for (SweetIntegralActivityPrizeFormParam prize : prizeList) {
......
......@@ -26,6 +26,9 @@ public class SweetRedisAdminUtils {
boolean set = redisDataSourceUtil.getRedisSweetUtil().set(redisKey, integralActivityVo);
}
/**
* 奖品库存
*/
public void incrIntegralActivityPrizeNum(String integralActivityId, String prizeId, Integer num) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_NUM
.concat(integralActivityId)
......@@ -55,6 +58,12 @@ public class SweetRedisAdminUtils {
}
}
public void setIntegralActivityTotalPrizeNum(String integralActivityId, int totalPrizeNum) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_TOTAL_PRIZE_NUM
.concat(integralActivityId);
redisDataSourceUtil.getRedisSweetUtil().set(redisKey, totalPrizeNum);
}
public void setIntegralActivityDraw(LinkedList<IntegralActivityDrawVo> sweetIntegralActivityDraws, String integralActivityId, String userId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_IN_USER
.concat(integralActivityId)
......@@ -71,9 +80,29 @@ public class SweetRedisAdminUtils {
redisDataSourceUtil.getRedisSweetUtil().set(redisKeyDraw, info);
}
public void setIntegralActivityTotalPrizeNum(String integralActivityId, int totalPrizeNum) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_TOTAL_PRIZE_NUM
/**
* 预估人数
*/
public void incrIntegralActivityEstimatedNum(String integralActivityId, Integer num) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_ESTIMATEDNUM
.concat(integralActivityId);
redisDataSourceUtil.getRedisSweetUtil().set(redisKey, totalPrizeNum);
redisDataSourceUtil.getRedisSweetUtil().incr(redisKey, num);
}
public void decrIntegralActivityEstimatedNum(String integralActivityId, Integer num) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_ESTIMATEDNUM
.concat(integralActivityId);
redisDataSourceUtil.getRedisSweetUtil().decr(redisKey, num);
}
public int getIntegralActivityEstimatedNum(String integralActivityId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_ESTIMATEDNUM
.concat(integralActivityId);
Object obj = redisDataSourceUtil.getRedisSweetUtil().get(redisKey);
if (null == obj) {
return 0;
} else {
return (int) obj;
}
}
}
......@@ -4,6 +4,7 @@ package com.liquidnet.service.sweet.controller;
import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityDrawVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeApiVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeVo;
import com.liquidnet.service.sweet.service.ISweetIntegralActivityDrawService;
import io.swagger.annotations.Api;
......@@ -35,7 +36,7 @@ public class SweetIntegralActivityDrawController {
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "String", name = "integralActivityId", value = "活动id", required = true)
})
public ResponseDto<IntegralActivityPrizeVo> create(
public ResponseDto<IntegralActivityPrizeApiVo> create(
@RequestParam("integralActivityId") String integralActivityId
) {
return activityDrawService.create(integralActivityId);
......
......@@ -15,6 +15,7 @@ import com.liquidnet.service.feign.candy.api.FeignCandyBaseClient;
import com.liquidnet.service.feign.stone.api.FeignStoneIntegralClient;
import com.liquidnet.service.stone.dto.StoneScoreListDto;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityDrawVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeApiVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityVo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw;
......@@ -69,7 +70,7 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
private FeignCandyBaseClient feignCandyBaseClient;
@Override
public ResponseDto<IntegralActivityPrizeVo> create(String integralActivityId) {
public ResponseDto<IntegralActivityPrizeApiVo> create(String integralActivityId) {
Map tokenClaims = CurrentUtil.getTokenClaims();
String userId = StringUtils.defaultString((String.valueOf(tokenClaims.get(CurrentUtil.TOKEN_SUB))), "");
// 加锁
......@@ -116,8 +117,9 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
// 如果库存没了就从列表剔出 列表为空就都没有库存了
ArrayList<IntegralActivityPrizeVo> activityPrizeVoArrayList = SweetNewObjectUtil.getIntegralActivityPrizeVoArrayList();
// 概率计算
// TODO: 2021/12/6 黑名单只中券 不记录次数
boolean lotteryDraw = this.lotteryDraw(integralActivity.getEstimatedNum(), integralActivity.getIntegralActivityId(), userId);
// TODO: 2021/12/6 黑名单只中券 不记录次数
redisDataUtils.decrIntegralActivityEstimatedNum(integralActivityId, 1);
boolean lotteryDraw = this.lotteryDraw(integralActivityId, userId);
if (lotteryDraw) { // 实物
List<IntegralActivityPrizeVo> prizeList = integralActivity.getPrizeList2();
for (IntegralActivityPrizeVo info : prizeList) {
......@@ -207,8 +209,8 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
});
queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_INTEGRAL_ACTIVITY_DRAW.getKey(),
SqlMapping.gets(sqls, sqlsDataA));
integralActivityPrizeVo.setPrizeRelationList(null);
return ResponseDto.success(integralActivityPrizeVo);
IntegralActivityPrizeApiVo activityPrizeApiVo = IntegralActivityPrizeApiVo.getNew().copy(integralActivityPrizeVo);
return ResponseDto.success(activityPrizeApiVo);
} catch (Exception e) {
log.error("积分抽奖异常 e:{}", e);
return ResponseDto.failure("操作失败,请稍后重试!");
......@@ -412,7 +414,7 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
/**
* 抽奖方法 计算中哪个奖池的奖品
*/
private boolean lotteryDraw(Integer estimatedNum, String integralActivityId, String uid) {
private boolean lotteryDraw(String integralActivityId, String uid) {
// 随机数
double random = Math.random() * 100;
BigDecimal randomBig = BigDecimal.valueOf(random);
......@@ -420,19 +422,19 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
int prizeNum = redisDataUtils.getIntegralActivityTotalPrizeNum(integralActivityId);
BigDecimal prizeNumBig = BigDecimal.valueOf(prizeNum);
// 概率
int luckyDrawNum = redisDataUtils.getLuckyDrawNum(integralActivityId);
BigDecimal diffEstimatedNum = BigDecimal.valueOf(estimatedNum - luckyDrawNum);
int estimatedNum = redisDataUtils.getIntegralActivityEstimatedNum(integralActivityId);
BigDecimal estimatedNumBig = BigDecimal.valueOf(estimatedNum);
// 会员概率*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);
estimatedNumBig = estimatedNumBig.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));
BigDecimal multiply = prizeNumBig.divide(estimatedNumBig, 2, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100));
// 对比大小
if (multiply.compareTo(randomBig) >= 0) {
return true; // 大于等于随机数中实物
......
......@@ -769,14 +769,19 @@ public class RedisDataUtils {
}
}
public int getLuckyDrawNum(String integralActivityId) {
String redisKeyDraw = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_INFO
public int getIntegralActivityEstimatedNum(String integralActivityId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_ESTIMATEDNUM
.concat(integralActivityId);
Object obj = redisUtil.get(redisKeyDraw);
Object obj = redisUtil.get(redisKey);
if (null == obj) {
return 0;
} else {
return (int) obj;
}
}
public void decrIntegralActivityEstimatedNum(String integralActivityId, Integer num) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_ESTIMATEDNUM
.concat(integralActivityId);
redisUtil.decr(redisKey, num);
}
}
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