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

Commit e3ec157d authored by jiangxiulong's avatar jiangxiulong

抽奖 vo

parent 65a713fd
......@@ -38,6 +38,12 @@ public class IntegralActivityPrizeVo implements Serializable, Cloneable {
@ApiModelProperty(value = "单次奖励数量如积分 中奖给多少物")
private Integer prizeTypeNum;
@ApiModelProperty(value = "奖品数量")
private Integer prizeNum;
@ApiModelProperty(value = "中奖概率")
private BigDecimal winningProbability;
@ApiModelProperty(value = "创建时间")
private LocalDateTime createdAt;
......@@ -67,6 +73,8 @@ public class IntegralActivityPrizeVo implements Serializable, Cloneable {
this.setPrizeImgSelect(source.getPrizeImgSelect());
this.setPrizeType(source.getPrizeType());
this.setPrizeTypeNum(source.getPrizeTypeNum());
this.setPrizeNum(source.getPrizeNum());
this.setWinningProbability(source.getWinningProbability());
this.setCreatedAt(source.getCreatedAt());
this.setUpdatedAt(source.getUpdatedAt());
return this;
......
......@@ -3,7 +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.admin.SweetIntegralActivityPrizeVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeVo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw;
import com.baomidou.mybatisplus.extension.service.IService;
......@@ -19,7 +19,7 @@ import java.util.List;
*/
public interface ISweetIntegralActivityDrawService extends IService<SweetIntegralActivityDraw> {
ResponseDto<SweetIntegralActivityPrizeVo> create(String integralActivityId);
ResponseDto<IntegralActivityPrizeVo> create(String integralActivityId);
ResponseDto<PagedResult<IntegralActivityDrawVo>> drawList(Integer type, String integralActivityId, Integer pageNum);
......
......@@ -2,8 +2,8 @@ package com.liquidnet.service.sweet.utils;
import com.liquidnet.service.base.PagedResult;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityDrawVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeVo;
import com.liquidnet.service.sweet.dto.vo.admin.SweetIntegralActivityPrizeVo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityPrize;
import java.util.ArrayList;
......@@ -11,6 +11,7 @@ import java.util.LinkedList;
public class SweetNewObjectUtil {
private static final ArrayList<SweetIntegralActivityPrizeVo> sweetIntegralActivityPrizeVoArrayList = new ArrayList<>();
private static final ArrayList<IntegralActivityPrizeVo> integralActivityPrizeVoArrayList = new ArrayList<>();
private static final ArrayList<SweetIntegralActivityPrize> sweetIntegralActivityPrizeArrayList = new ArrayList<>();
private static final LinkedList<IntegralActivityDrawVo> sweetIntegralActivityDrawVoLinkedList = new LinkedList<>();
private static final PagedResult<IntegralActivityDrawVo> sweetIntegralActivityDrawVoPagedResult = new PagedResult<>();
......@@ -31,4 +32,8 @@ public class SweetNewObjectUtil {
return (ArrayList<SweetIntegralActivityPrize>) sweetIntegralActivityPrizeArrayList.clone();
}
public static ArrayList<IntegralActivityPrizeVo> getIntegralActivityPrizeVoArrayList() {
return (ArrayList<IntegralActivityPrizeVo>) integralActivityPrizeVoArrayList.clone();
}
}
......@@ -4,7 +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.admin.SweetIntegralActivityPrizeVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityPrizeVo;
import com.liquidnet.service.sweet.service.ISweetIntegralActivityDrawService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
......@@ -35,7 +35,7 @@ public class SweetIntegralActivityDrawController {
@ApiImplicitParams({
@ApiImplicitParam(type = "query", dataType = "String", name = "integralActivityId", value = "活动id", required = true)
})
public ResponseDto<SweetIntegralActivityPrizeVo> create(
public ResponseDto<IntegralActivityPrizeVo> create(
@RequestParam("integralActivityId") String integralActivityId
) {
return activityDrawService.create(integralActivityId);
......
......@@ -14,10 +14,9 @@ import com.liquidnet.service.feign.adam.api.FeignAdamBaseClient;
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.IntegralActivityPrizeVo;
import com.liquidnet.service.sweet.dto.vo.IntegralActivityVo;
import com.liquidnet.service.sweet.dto.vo.admin.SweetIntegralActivityPrizeVo;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityDraw;
import com.liquidnet.service.sweet.entity.SweetIntegralActivityPrize;
import com.liquidnet.service.sweet.mapper.SweetIntegralActivityDrawMapper;
import com.liquidnet.service.sweet.service.ISweetIntegralActivityDrawService;
import com.liquidnet.service.sweet.utils.QueueUtils;
......@@ -67,7 +66,7 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
private FeignAdamBaseClient feignAdamBaseClient;
@Override
public ResponseDto<SweetIntegralActivityPrizeVo> create(String integralActivityId) {
public ResponseDto<IntegralActivityPrizeVo> create(String integralActivityId) {
Map tokenClaims = CurrentUtil.getTokenClaims();
String userId = StringUtils.defaultString((String.valueOf(tokenClaims.get("sub"))), "");
// 加锁
......@@ -112,26 +111,24 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
}
// 如果库存没了 限制的中奖人数到了就从列表剔出 列表为空就都没有库存了
List<SweetIntegralActivityPrize> prizeList = integralActivity.getPrizeList();
ArrayList<SweetIntegralActivityPrize> sweetIntegralActivityPrizeArrayList = SweetNewObjectUtil.getSweetIntegralActivityPrizeArrayList();
for (SweetIntegralActivityPrize info : prizeList) {
List<IntegralActivityPrizeVo> prizeList = integralActivity.getPrizeList();
ArrayList<IntegralActivityPrizeVo> activityPrizeVoArrayList = SweetNewObjectUtil.getIntegralActivityPrizeVoArrayList();
for (IntegralActivityPrizeVo info : prizeList) {
int integralActivityPrizeNum = redisDataUtils.getIntegralActivityPrizeNum(integralActivityId, info.getPrizeId());
if (integralActivityPrizeNum > 0) {
sweetIntegralActivityPrizeArrayList.add(info);
activityPrizeVoArrayList.add(info);
}
}
if (CollectionUtils.isEmpty(sweetIntegralActivityPrizeArrayList)) {
if (CollectionUtils.isEmpty(activityPrizeVoArrayList)) {
return ResponseDto.failure("活动太火爆了,奖品已经没有库存啦~");
}
SweetIntegralActivityPrize sweetIntegralActivityPrize = this.lotteryDraw(sweetIntegralActivityPrizeArrayList);
SweetIntegralActivityPrizeVo sweetIntegralActivityPrizeVo = SweetIntegralActivityPrizeVo.getNew().copy(sweetIntegralActivityPrize);
IntegralActivityPrizeVo integralActivityPrizeVo = this.lotteryDraw(activityPrizeVoArrayList);
// 减库存 顺便判断库存是否够 -1的时候回滚回去
long activityPrizeNum = redisDataUtils.decrIntegralActivityPrizeNum(integralActivityId, sweetIntegralActivityPrizeVo.getPrizeId(), 1);
long activityPrizeNum = redisDataUtils.decrIntegralActivityPrizeNum(integralActivityId, integralActivityPrizeVo.getPrizeId(), 1);
log.info("奖品库存情况 activityPrizeNum:{}", activityPrizeNum);
if (activityPrizeNum < 0) {// 库存不够了
long prizeNum = redisDataUtils.incrIntegralActivityPrizeNum(integralActivityId, sweetIntegralActivityPrizeVo.getPrizeId(), 1);
long prizeNum = redisDataUtils.incrIntegralActivityPrizeNum(integralActivityId, integralActivityPrizeVo.getPrizeId(), 1);
log.info("奖品库存情况回滚后 prizeNum:{}", prizeNum);
return ResponseDto.failure("活动太火爆了,奖品已经没有库存了!");
}
......@@ -144,20 +141,20 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
integralActivityDrawVo.setDrawId(drawId);
integralActivityDrawVo.setIntegralActivityId(integralActivityId);
integralActivityDrawVo.setActivityNum(integralActivity.getActivityNum());
integralActivityDrawVo.setPrizeId(sweetIntegralActivityPrize.getPrizeId());
integralActivityDrawVo.setPrizeTitle(sweetIntegralActivityPrize.getPrizeTitle());
integralActivityDrawVo.setPrizeType(sweetIntegralActivityPrize.getPrizeType());
integralActivityDrawVo.setPrizeTypeNum(sweetIntegralActivityPrize.getPrizeTypeNum());
integralActivityDrawVo.setPrizeId(integralActivityPrizeVo.getPrizeId());
integralActivityDrawVo.setPrizeTitle(integralActivityPrizeVo.getPrizeTitle());
integralActivityDrawVo.setPrizeType(integralActivityPrizeVo.getPrizeType());
integralActivityDrawVo.setPrizeTypeNum(integralActivityPrizeVo.getPrizeTypeNum());
// integralActivityDrawVo.setRelationId(sweetIntegralActivityPrize.getRelationId());
integralActivityDrawVo.setUserId(userId);
integralActivityDrawVo.setNickname(nickname);
LocalDateTime nowTime = LocalDateTime.now();
integralActivityDrawVo.setCreatedAt(nowTime);
Integer receivingStatus = 1;
Integer prizeType = sweetIntegralActivityPrize.getPrizeType();
Integer prizeType = integralActivityPrizeVo.getPrizeType();
if (prizeType == 2) {// 中奖积分
// 增加积分
ResponseDto<String> in2111 = feignStoneIntegralClient.in2112(userId, sweetIntegralActivityPrize.getPrizeTypeNum(), integralActivity.getActivityTitle());
ResponseDto<String> in2111 = feignStoneIntegralClient.in2112(userId, integralActivityPrizeVo.getPrizeTypeNum(), integralActivity.getActivityTitle());
log.info("中奖加积分返回值情况 in2111:{}", in2111);
// 发放状态
receivingStatus = 2;
......@@ -177,15 +174,15 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
sqls.add(SqlMapping.get("integral_activity_draw.insert"));
sqlsDataA.add(new Object[]{
drawId, integralActivityId, integralActivity.getActivityNum(),
sweetIntegralActivityPrize.getPrizeId(), sweetIntegralActivityPrize.getPrizeTitle(), sweetIntegralActivityPrize.getPrizeType(),
sweetIntegralActivityPrize.getPrizeTypeNum(), //sweetIntegralActivityPrize.getRelationId(),
integralActivityPrizeVo.getPrizeId(), integralActivityPrizeVo.getPrizeTitle(), integralActivityPrizeVo.getPrizeType(),
integralActivityPrizeVo.getPrizeTypeNum(), //sweetIntegralActivityPrize.getRelationId(),
userId, nickname,
receivingStatus
});
queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_INTEGRAL_ACTIVITY_DRAW.getKey(),
SqlMapping.gets(sqls, sqlsDataA));
return ResponseDto.success(sweetIntegralActivityPrizeVo);
return ResponseDto.success(integralActivityPrizeVo);
} catch (Exception e) {
log.error("积分抽奖异常 e:{}", e);
return ResponseDto.failure("操作失败,请稍后重试!");
......@@ -328,7 +325,7 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
/**
* 抽奖方法
*/
private static SweetIntegralActivityPrize lotteryDraw(List<SweetIntegralActivityPrize> prizeList) {
private static IntegralActivityPrizeVo lotteryDraw(List<IntegralActivityPrizeVo> prizeList) {
if (prizeList == null || prizeList.isEmpty()) {
return null;
}
......@@ -337,14 +334,14 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
// 计算总概率,这样可以保证不一定总概率是1
BigDecimal sumRate = BigDecimal.ZERO;
for (SweetIntegralActivityPrize prize : prizeList) {
for (IntegralActivityPrizeVo prize : prizeList) {
sumRate = sumRate.add(prize.getWinningProbability());
}
// 计算每个物品在总概率的基础下的概率情况
List<BigDecimal> sortOrignalRates = new ArrayList<>(size);
BigDecimal tempSumRate = BigDecimal.ZERO;
for (SweetIntegralActivityPrize prize : prizeList) {
for (IntegralActivityPrizeVo prize : prizeList) {
tempSumRate = tempSumRate.add(prize.getWinningProbability());
sortOrignalRates.add(tempSumRate.divide(sumRate, 4, BigDecimal.ROUND_HALF_UP));
}
......@@ -357,8 +354,8 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
int index = sortOrignalRates.indexOf(nextDoubleNew);
SweetIntegralActivityPrize sweetIntegralActivityPrize = prizeList.get(index);
return sweetIntegralActivityPrize;
IntegralActivityPrizeVo integralActivityPrizeVo = prizeList.get(index);
return integralActivityPrizeVo;
}
/*public static void main(String[] args) {
......
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