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

Commit bfefa70a authored by jiangxiulong's avatar jiangxiulong

Lock

parent a97f895e
...@@ -67,136 +67,133 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg ...@@ -67,136 +67,133 @@ public class SweetIntegralActivityDrawServiceImpl extends ServiceImpl<SweetInteg
@Override @Override
public ResponseDto<SweetIntegralActivityPrizeVo> create(String integralActivityId) { public ResponseDto<SweetIntegralActivityPrizeVo> create(String integralActivityId) {
// TODO: 2021/10/26 看情况是否加锁 一个用户整个逻辑单进程 Map tokenClaims = CurrentUtil.getTokenClaims();
boolean isLock = redisDataUtils.setIntegralDrawLock("1111"); String userId = StringUtils.defaultString((String.valueOf(tokenClaims.get("sub"))), "");
// 加锁
boolean isLock = redisDataUtils.setIntegralDrawLock(userId);
if (!isLock) { if (!isLock) {
return ResponseDto.failure("太快了"); return ResponseDto.failure("您的手速太快啦~");
} else { } else {
try { try {
System.out.println("获取锁成功,开始执行逻辑"); String nickname = StringUtils.defaultString((String.valueOf(tokenClaims.get("nickname"))), "");
Thread.sleep(2000);
return ResponseDto.success();
} catch (Exception e) {
System.out.println("程序执行异常{}");
return ResponseDto.failure("异常了");
} finally {
redisDataUtils.delIntegralDrawLock("1111");
System.out.println("执行完毕。释放锁完成;");
}
}
/*Map tokenClaims = CurrentUtil.getTokenClaims();
String userId = StringUtils.defaultString((String.valueOf(tokenClaims.get("sub"))), "");
String nickname = StringUtils.defaultString((String.valueOf(tokenClaims.get("nickname"))), "");
IntegralActivityVo integralActivity = redisDataUtils.getIntegralActivityInfo(integralActivityId); IntegralActivityVo integralActivity = redisDataUtils.getIntegralActivityInfo(integralActivityId);
if (integralActivity.getIsOnline() == 1) { if (integralActivity.getIsOnline() == 1) {
return ResponseDto.failure("该活动已下线"); return ResponseDto.failure("该活动已下线");
} }
if (integralActivity.getTimeType() == 2) { if (integralActivity.getTimeType() == 2) {
LocalDateTime startTime = integralActivity.getStartTime(); LocalDateTime startTime = integralActivity.getStartTime();
LocalDateTime endTime = integralActivity.getEndTime(); LocalDateTime endTime = integralActivity.getEndTime();
LocalDateTime nowTime = LocalDateTime.now(); LocalDateTime nowTime = LocalDateTime.now();
if (nowTime.isAfter(endTime)) { // 已结束 if (nowTime.isAfter(endTime)) { // 已结束
return ResponseDto.failure("该活动已结束"); return ResponseDto.failure("该活动已结束");
} }
if (startTime.isAfter(nowTime)) { // 未开始 if (startTime.isAfter(nowTime)) { // 未开始
return ResponseDto.failure("该活动未开始"); return ResponseDto.failure("该活动未开始");
} }
} }
// 判断用户积分是否>=integralActivity.setActivityNum(); // 判断用户积分是否>=integralActivity.setActivityNum();
ResponseDto<StoneScoreListDto> userInfoRes = feignStoneIntegralClient.stoneUserInfo(); ResponseDto<StoneScoreListDto> userInfoRes = feignStoneIntegralClient.stoneUserInfo();
if (!userInfoRes.getCode().equals("0")) { if (!userInfoRes.getCode().equals("0")) {
return ResponseDto.failure("获取用户积分数据失败"); return ResponseDto.failure("获取用户积分数据失败");
} else { } else {
StoneScoreListDto userInfoData = userInfoRes.getData(); StoneScoreListDto userInfoData = userInfoRes.getData();
if (userInfoData.getStatus() == 2) { if (userInfoData.getStatus() == 2) {
return ResponseDto.failure("您的积分账户已被冻结!"); return ResponseDto.failure("您的积分账户已被冻结!");
} else { } else {
BigDecimal scoreRest = userInfoData.getScoreRest(); BigDecimal scoreRest = userInfoData.getScoreRest();
if (scoreRest.compareTo(BigDecimal.valueOf(integralActivity.getActivityNum())) == -1) { if (scoreRest.compareTo(BigDecimal.valueOf(integralActivity.getActivityNum())) == -1) {
return ResponseDto.failure("您的积分账户余额不足!"); return ResponseDto.failure("您的积分账户余额不足!");
}
}
} }
}
}
// 如果库存没了 限制的中奖人数到了就从列表剔出 列表为空就都没有库存了 // 如果库存没了 限制的中奖人数到了就从列表剔出 列表为空就都没有库存了
List<SweetIntegralActivityPrize> prizeList = integralActivity.getPrizeList(); List<SweetIntegralActivityPrize> prizeList = integralActivity.getPrizeList();
ArrayList<SweetIntegralActivityPrize> sweetIntegralActivityPrizeArrayList = SweetNewObjectUtil.getSweetIntegralActivityPrizeArrayList(); ArrayList<SweetIntegralActivityPrize> sweetIntegralActivityPrizeArrayList = SweetNewObjectUtil.getSweetIntegralActivityPrizeArrayList();
for (SweetIntegralActivityPrize info : prizeList) { for (SweetIntegralActivityPrize info : prizeList) {
int integralActivityPrizeNum = redisDataUtils.getIntegralActivityPrizeNum(integralActivityId, info.getPrizeId()); int integralActivityPrizeNum = redisDataUtils.getIntegralActivityPrizeNum(integralActivityId, info.getPrizeId());
int integralActivityPrizeWinnersNum = redisDataUtils.getIntegralActivityPrizeWinnersNum(integralActivityId, info.getPrizeId()); int integralActivityPrizeWinnersNum = redisDataUtils.getIntegralActivityPrizeWinnersNum(integralActivityId, info.getPrizeId());
if (integralActivityPrizeNum > 0 && integralActivityPrizeWinnersNum > 0) { if (integralActivityPrizeNum > 0 && integralActivityPrizeWinnersNum > 0) {
sweetIntegralActivityPrizeArrayList.add(info); sweetIntegralActivityPrizeArrayList.add(info);
} }
} }
if (CollectionUtils.isEmpty(sweetIntegralActivityPrizeArrayList)) { if (CollectionUtils.isEmpty(sweetIntegralActivityPrizeArrayList)) {
return ResponseDto.failure("活动太火爆了,奖品已经没有库存啦~"); return ResponseDto.failure("活动太火爆了,奖品已经没有库存啦~");
} }
SweetIntegralActivityPrize sweetIntegralActivityPrize = this.lotteryDraw(sweetIntegralActivityPrizeArrayList); SweetIntegralActivityPrize sweetIntegralActivityPrize = this.lotteryDraw(sweetIntegralActivityPrizeArrayList);
SweetIntegralActivityPrizeVo sweetIntegralActivityPrizeVo = SweetIntegralActivityPrizeVo.getNew().copy(sweetIntegralActivityPrize); SweetIntegralActivityPrizeVo sweetIntegralActivityPrizeVo = SweetIntegralActivityPrizeVo.getNew().copy(sweetIntegralActivityPrize);
// 减库存 顺便判断库存是否够 todo 这块可能不能这么判断 后台增加库存的时候如果是-1会丢库存 实际-1这个并没有发出 // 减库存 顺便判断库存是否够 -1的时候回滚回去
long activityPrizeNum = redisDataUtils.decrIntegralActivityPrizeNum(integralActivityId, sweetIntegralActivityPrizeVo.getPrizeId(), 1); long activityPrizeNum = redisDataUtils.decrIntegralActivityPrizeNum(integralActivityId, sweetIntegralActivityPrizeVo.getPrizeId(), 1);
long activityPrizeWinnersNum = redisDataUtils.decrIntegralActivityPrizeWinnersNum(integralActivityId, sweetIntegralActivityPrizeVo.getPrizeId(), 1); long activityPrizeWinnersNum = redisDataUtils.decrIntegralActivityPrizeWinnersNum(integralActivityId, sweetIntegralActivityPrizeVo.getPrizeId(), 1);
if (activityPrizeNum < 0) {// 库存不够了 if (activityPrizeNum < 0) {// 库存不够了
redisDataUtils.incrIntegralActivityPrizeNum(integralActivityId, sweetIntegralActivityPrizeVo.getPrizeId(), 1); redisDataUtils.incrIntegralActivityPrizeNum(integralActivityId, sweetIntegralActivityPrizeVo.getPrizeId(), 1);
return ResponseDto.failure("活动太火爆了,奖品已经没有库存了!"); return ResponseDto.failure("活动太火爆了,奖品已经没有库存了!");
} }
if (activityPrizeWinnersNum < 0) {// 库存不够了 if (activityPrizeWinnersNum < 0) {// 库存不够了
redisDataUtils.incrIntegralActivityPrizeWinnersNum(integralActivityId, sweetIntegralActivityPrizeVo.getPrizeId(), 1); redisDataUtils.incrIntegralActivityPrizeWinnersNum(integralActivityId, sweetIntegralActivityPrizeVo.getPrizeId(), 1);
return ResponseDto.failure("活动太火爆了,奖品已经没有库存了~"); return ResponseDto.failure("活动太火爆了,奖品已经没有库存了~");
} }
// 减积分 // 减积分
feignStoneIntegralClient.de2111(userId, integralActivity.getActivityNum(), integralActivity.getActivityTitle()); feignStoneIntegralClient.de2111(userId, integralActivity.getActivityNum(), integralActivity.getActivityTitle());
// 抽奖入库 // 抽奖入库
String drawId = IDGenerator.nextSnowId(); String drawId = IDGenerator.nextSnowId();
IntegralActivityDrawVo integralActivityDrawVo = IntegralActivityDrawVo.getNew(); IntegralActivityDrawVo integralActivityDrawVo = IntegralActivityDrawVo.getNew();
integralActivityDrawVo.setDrawId(drawId); integralActivityDrawVo.setDrawId(drawId);
integralActivityDrawVo.setIntegralActivityId(integralActivityId); integralActivityDrawVo.setIntegralActivityId(integralActivityId);
integralActivityDrawVo.setActivityNum(integralActivity.getActivityNum()); integralActivityDrawVo.setActivityNum(integralActivity.getActivityNum());
integralActivityDrawVo.setPrizeId(sweetIntegralActivityPrize.getPrizeId()); integralActivityDrawVo.setPrizeId(sweetIntegralActivityPrize.getPrizeId());
integralActivityDrawVo.setPrizeTitle(sweetIntegralActivityPrize.getPrizeTitle()); integralActivityDrawVo.setPrizeTitle(sweetIntegralActivityPrize.getPrizeTitle());
integralActivityDrawVo.setPrizeType(sweetIntegralActivityPrize.getPrizeType()); integralActivityDrawVo.setPrizeType(sweetIntegralActivityPrize.getPrizeType());
integralActivityDrawVo.setPrizeTypeNum(sweetIntegralActivityPrize.getPrizeTypeNum()); integralActivityDrawVo.setPrizeTypeNum(sweetIntegralActivityPrize.getPrizeTypeNum());
integralActivityDrawVo.setRelationId(sweetIntegralActivityPrize.getRelationId()); integralActivityDrawVo.setRelationId(sweetIntegralActivityPrize.getRelationId());
integralActivityDrawVo.setUserId(userId); integralActivityDrawVo.setUserId(userId);
integralActivityDrawVo.setNickname(nickname); integralActivityDrawVo.setNickname(nickname);
LocalDateTime nowTime = LocalDateTime.now(); LocalDateTime nowTime = LocalDateTime.now();
integralActivityDrawVo.setCreatedAt(nowTime); integralActivityDrawVo.setCreatedAt(nowTime);
Integer receivingStatus = 1; Integer receivingStatus = 1;
Integer prizeType = sweetIntegralActivityPrize.getPrizeType(); Integer prizeType = sweetIntegralActivityPrize.getPrizeType();
if (prizeType == 2) {// 中奖积分 if (prizeType == 2) {// 中奖积分
// 增加积分 // 增加积分
feignStoneIntegralClient.in2111(userId, sweetIntegralActivityPrize.getPrizeTypeNum(), integralActivity.getActivityTitle()); feignStoneIntegralClient.in2111(userId, sweetIntegralActivityPrize.getPrizeTypeNum(), integralActivity.getActivityTitle());
// 发放状态 // 发放状态
receivingStatus = 2; receivingStatus = 2;
} }
if (prizeType == 1) { // 谢谢惠顾 if (prizeType == 1) { // 谢谢惠顾
receivingStatus = 3; receivingStatus = 3;
}
integralActivityDrawVo.setReceivingStatus(receivingStatus);
// redis
redisDataUtils.setIntegralActivityDraw(integralActivityDrawVo);
// mongo
mongoTemplate.insert(integralActivityDrawVo, IntegralActivityDrawVo.class.getSimpleName());
// mysql 抽奖记录
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlsDataA = CollectionUtil.linkedListObjectArr();
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(),
userId, nickname,
receivingStatus
});
queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_INTEGRAL_ACTIVITY_DRAW.getKey(),
SqlMapping.gets(sqls, sqlsDataA));
return ResponseDto.success(sweetIntegralActivityPrizeVo);
} catch (Exception e) {
log.error("积分抽奖异常 e:{}", e);
return ResponseDto.failure("操作失败,请稍后重试!");
} finally {
// 执行完毕。释放锁
redisDataUtils.delIntegralDrawLock(userId);
}
} }
integralActivityDrawVo.setReceivingStatus(receivingStatus);
// redis
redisDataUtils.setIntegralActivityDraw(integralActivityDrawVo);
// mongo
mongoTemplate.insert(integralActivityDrawVo, IntegralActivityDrawVo.class.getSimpleName());
// mysql 抽奖记录
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlsDataA = CollectionUtil.linkedListObjectArr();
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(),
userId, nickname,
receivingStatus
});
queueUtils.sendMsgByRedis(MQConst.SweetQueue.SWEET_INTEGRAL_ACTIVITY_DRAW.getKey(),
SqlMapping.gets(sqls, sqlsDataA));
return ResponseDto.success(sweetIntegralActivityPrizeVo);*/
} }
@Override @Override
......
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