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

Commit 60acb331 authored by jiangxiulong's avatar jiangxiulong

中奖返回值、EstimatedNum

parent 855d6704
...@@ -37,7 +37,7 @@ public class SweetConstant { ...@@ -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_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 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 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:"; 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; ...@@ -3,6 +3,7 @@ package com.liquidnet.service.sweet.service;
import com.liquidnet.service.base.PagedResult; import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityDrawVo; 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.IntegralActivityPrizeVo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw; import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
...@@ -19,7 +20,7 @@ import java.util.List; ...@@ -19,7 +20,7 @@ import java.util.List;
*/ */
public interface ISweetIntegralActivityDrawService extends IService<SweetIntegralActivityDraw> { 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); ResponseDto<PagedResult<IntegralActivityDrawVo>> drawList(Integer type, String integralActivityId, Integer pageNum);
......
...@@ -76,6 +76,8 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA ...@@ -76,6 +76,8 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA
sweetIntegralActivityPrizeMapper.insert(sweetIntegralActivityPrize); sweetIntegralActivityPrizeMapper.insert(sweetIntegralActivityPrize);
// 奖品库存 // 奖品库存
sweetRedisAdminUtils.incrIntegralActivityPrizeNum(integralActivityId, sweetIntegralActivityPrize.getPrizeId(), sweetIntegralActivityPrize.getPrizeNum()); sweetRedisAdminUtils.incrIntegralActivityPrizeNum(integralActivityId, sweetIntegralActivityPrize.getPrizeId(), sweetIntegralActivityPrize.getPrizeNum());
// 预估人数
sweetRedisAdminUtils.incrIntegralActivityEstimatedNum(integralActivityId, sweetIntegralActivity.getEstimatedNum());
} }
} }
// 活动redis处理 // 活动redis处理
...@@ -94,10 +96,23 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA ...@@ -94,10 +96,23 @@ public class SweetIntegralActivityServiceImpl extends ServiceImpl<SweetIntegralA
SweetIntegralActivity sweetIntegralActivity = SweetIntegralActivityFromParam.getNew().copy(param); SweetIntegralActivity sweetIntegralActivity = SweetIntegralActivityFromParam.getNew().copy(param);
sweetIntegralActivity.setUpdatedAt(nowTime); sweetIntegralActivity.setUpdatedAt(nowTime);
String integralActivityId = param.getIntegralActivityId(); String integralActivityId = param.getIntegralActivityId();
SweetIntegralActivity sweetIntegralActivityOld = sweetIntegralActivityMapper.selectOne(
Wrappers.lambdaQuery(SweetIntegralActivity.class).eq(SweetIntegralActivity::getIntegralActivityId, integralActivityId)
);
int update = sweetIntegralActivityMapper.update( int update = sweetIntegralActivityMapper.update(
sweetIntegralActivity, sweetIntegralActivity,
Wrappers.lambdaUpdate(SweetIntegralActivity.class).eq(SweetIntegralActivity::getIntegralActivityId, integralActivityId) 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(); List<SweetIntegralActivityPrizeFormParam> prizeList = param.getPrizeList();
if (!CollectionUtils.isEmpty(prizeList)) { if (!CollectionUtils.isEmpty(prizeList)) {
for (SweetIntegralActivityPrizeFormParam prize : prizeList) { for (SweetIntegralActivityPrizeFormParam prize : prizeList) {
......
...@@ -26,6 +26,9 @@ public class SweetRedisAdminUtils { ...@@ -26,6 +26,9 @@ public class SweetRedisAdminUtils {
boolean set = redisDataSourceUtil.getRedisSweetUtil().set(redisKey, integralActivityVo); boolean set = redisDataSourceUtil.getRedisSweetUtil().set(redisKey, integralActivityVo);
} }
/**
* 奖品库存
*/
public void incrIntegralActivityPrizeNum(String integralActivityId, String prizeId, Integer num) { public void incrIntegralActivityPrizeNum(String integralActivityId, String prizeId, Integer num) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_NUM String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_PRIZE_NUM
.concat(integralActivityId) .concat(integralActivityId)
...@@ -55,6 +58,12 @@ public class SweetRedisAdminUtils { ...@@ -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) { public void setIntegralActivityDraw(LinkedList<IntegralActivityDrawVo> sweetIntegralActivityDraws, String integralActivityId, String userId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_IN_USER String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_IN_USER
.concat(integralActivityId) .concat(integralActivityId)
...@@ -71,9 +80,29 @@ public class SweetRedisAdminUtils { ...@@ -71,9 +80,29 @@ public class SweetRedisAdminUtils {
redisDataSourceUtil.getRedisSweetUtil().set(redisKeyDraw, info); 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); .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; ...@@ -4,6 +4,7 @@ package com.liquidnet.service.sweet.controller;
import com.liquidnet.service.base.PagedResult; import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityDrawVo; 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.IntegralActivityPrizeVo;
import com.liquidnet.service.sweet.service.ISweetIntegralActivityDrawService; import com.liquidnet.service.sweet.service.ISweetIntegralActivityDrawService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -35,7 +36,7 @@ public class SweetIntegralActivityDrawController { ...@@ -35,7 +36,7 @@ public class SweetIntegralActivityDrawController {
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "String", name = "integralActivityId", value = "活动id", required = true) @ApiImplicitParam(type = "query", dataType = "String", name = "integralActivityId", value = "活动id", required = true)
}) })
public ResponseDto<IntegralActivityPrizeVo> create( public ResponseDto<IntegralActivityPrizeApiVo> create(
@RequestParam("integralActivityId") String integralActivityId @RequestParam("integralActivityId") String integralActivityId
) { ) {
return activityDrawService.create(integralActivityId); return activityDrawService.create(integralActivityId);
......
...@@ -15,6 +15,7 @@ import com.liquidnet.service.feign.candy.api.FeignCandyBaseClient; ...@@ -15,6 +15,7 @@ import com.liquidnet.service.feign.candy.api.FeignCandyBaseClient;
import com.liquidnet.service.feign.stone.api.FeignStoneIntegralClient; import com.liquidnet.service.feign.stone.api.FeignStoneIntegralClient;
import com.liquidnet.service.stone.dto.StoneScoreListDto; import com.liquidnet.service.stone.dto.StoneScoreListDto;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityDrawVo; 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.IntegralActivityPrizeVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityVo; import com.liquidnet.service.sweet.dto.vo.IntegralActivityVo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw; import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw;
...@@ -69,7 +70,7 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg ...@@ -69,7 +70,7 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
private FeignCandyBaseClient feignCandyBaseClient; private FeignCandyBaseClient feignCandyBaseClient;
@Override @Override
public ResponseDto<IntegralActivityPrizeVo> create(String integralActivityId) { public ResponseDto<IntegralActivityPrizeApiVo> 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))), "");
// 加锁 // 加锁
...@@ -116,8 +117,9 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg ...@@ -116,8 +117,9 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
// 如果库存没了就从列表剔出 列表为空就都没有库存了 // 如果库存没了就从列表剔出 列表为空就都没有库存了
ArrayList<IntegralActivityPrizeVo> activityPrizeVoArrayList = SweetNewObjectUtil.getIntegralActivityPrizeVoArrayList(); ArrayList<IntegralActivityPrizeVo> activityPrizeVoArrayList = SweetNewObjectUtil.getIntegralActivityPrizeVoArrayList();
// 概率计算 // 概率计算
// TODO: 2021/12/6 黑名单只中券 不记录次数 // TODO: 2021/12/6 黑名单只中券 不记录次数
boolean lotteryDraw = this.lotteryDraw(integralActivity.getEstimatedNum(), integralActivity.getIntegralActivityId(), userId); redisDataUtils.decrIntegralActivityEstimatedNum(integralActivityId, 1);
boolean lotteryDraw = this.lotteryDraw(integralActivityId, userId);
if (lotteryDraw) { // 实物 if (lotteryDraw) { // 实物
List<IntegralActivityPrizeVo> prizeList = integralActivity.getPrizeList2(); List<IntegralActivityPrizeVo> prizeList = integralActivity.getPrizeList2();
for (IntegralActivityPrizeVo info : prizeList) { for (IntegralActivityPrizeVo info : prizeList) {
...@@ -207,8 +209,8 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg ...@@ -207,8 +209,8 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
}); });
queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_INTEGRAL_ACTIVITY_DRAW.getKey(), queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_INTEGRAL_ACTIVITY_DRAW.getKey(),
SqlMapping.gets(sqls, sqlsDataA)); SqlMapping.gets(sqls, sqlsDataA));
integralActivityPrizeVo.setPrizeRelationList(null); IntegralActivityPrizeApiVo activityPrizeApiVo = IntegralActivityPrizeApiVo.getNew().copy(integralActivityPrizeVo);
return ResponseDto.success(integralActivityPrizeVo); return ResponseDto.success(activityPrizeApiVo);
} catch (Exception e) { } catch (Exception e) {
log.error("积分抽奖异常 e:{}", e); log.error("积分抽奖异常 e:{}", e);
return ResponseDto.failure("操作失败,请稍后重试!"); return ResponseDto.failure("操作失败,请稍后重试!");
...@@ -412,7 +414,7 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg ...@@ -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; double random = Math.random() * 100;
BigDecimal randomBig = BigDecimal.valueOf(random); BigDecimal randomBig = BigDecimal.valueOf(random);
...@@ -420,19 +422,19 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg ...@@ -420,19 +422,19 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
int prizeNum = redisDataUtils.getIntegralActivityTotalPrizeNum(integralActivityId); int prizeNum = redisDataUtils.getIntegralActivityTotalPrizeNum(integralActivityId);
BigDecimal prizeNumBig = BigDecimal.valueOf(prizeNum); BigDecimal prizeNumBig = BigDecimal.valueOf(prizeNum);
// 概率 // 概率
int luckyDrawNum = redisDataUtils.getLuckyDrawNum(integralActivityId); int estimatedNum = redisDataUtils.getIntegralActivityEstimatedNum(integralActivityId);
BigDecimal diffEstimatedNum = BigDecimal.valueOf(estimatedNum - luckyDrawNum); BigDecimal estimatedNumBig = BigDecimal.valueOf(estimatedNum);
// 会员概率*2 // 会员概率*2
try { try {
ResponseDto<Boolean> isMemberDto = feignAdamBaseClient.isMember(uid); ResponseDto<Boolean> isMemberDto = feignAdamBaseClient.isMember(uid);
Boolean isMember = isMemberDto.getData(); Boolean isMember = isMemberDto.getData();
if (isMember) { 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) { } catch (Exception e) {
log.error("获取用户是否是会员失败 [uid:{}, e:{}]", uid, 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) { if (multiply.compareTo(randomBig) >= 0) {
return true; // 大于等于随机数中实物 return true; // 大于等于随机数中实物
......
...@@ -769,14 +769,19 @@ public class RedisDataUtils { ...@@ -769,14 +769,19 @@ public class RedisDataUtils {
} }
} }
public int getLuckyDrawNum(String integralActivityId) { public int getIntegralActivityEstimatedNum(String integralActivityId) {
String redisKeyDraw = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_DRAW_INFO String redisKey = SweetConstant.REDIS_KEY_SWEET_INTEGRAL_ACTIVITY_ESTIMATEDNUM
.concat(integralActivityId); .concat(integralActivityId);
Object obj = redisUtil.get(redisKeyDraw); Object obj = redisUtil.get(redisKey);
if (null == obj) { if (null == obj) {
return 0; return 0;
} else { } else {
return (int) obj; 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