Commit 6ddd65ec authored by libin's avatar libin

抽奖逻修改

parent 3eda9793
package com.xxfc.platform.activity.constant;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/12/6 12:11
*/
public enum PrizeGoodsTypeEnum {
PRIZE(1,"奖品"),
COUPON(2,"优惠券"),
NO_PRIZE(0,"谢谢惠顾");
private int code;
private String desc;
PrizeGoodsTypeEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
...@@ -18,4 +18,5 @@ public class LotteryVo { ...@@ -18,4 +18,5 @@ public class LotteryVo {
private String prizeName; private String prizeName;
private Integer serialNumber; private Integer serialNumber;
private String expiryDateCode; private String expiryDateCode;
private String message;
} }
...@@ -9,6 +9,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; ...@@ -9,6 +9,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import tk.mybatis.spring.annotation.MapperScan; import tk.mybatis.spring.annotation.MapperScan;
...@@ -24,6 +26,8 @@ import tk.mybatis.spring.annotation.MapperScan; ...@@ -24,6 +26,8 @@ import tk.mybatis.spring.annotation.MapperScan;
"com.github.wxiaoqi.security.common.log", "com.github.wxiaoqi.security.common.log",
"com.github.wxiaoqi.security.admin.support.aop" "com.github.wxiaoqi.security.admin.support.aop"
}) })
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableAsync
@EnableDiscoveryClient @EnableDiscoveryClient
@EnableScheduling @EnableScheduling
@EnableAceAuthClient @EnableAceAuthClient
......
...@@ -13,6 +13,7 @@ import com.xxfc.platform.activity.entity.ActivityAttendanceRecord; ...@@ -13,6 +13,7 @@ import com.xxfc.platform.activity.entity.ActivityAttendanceRecord;
import com.xxfc.platform.activity.mapper.ActivityAttendanceRecordMapper; import com.xxfc.platform.activity.mapper.ActivityAttendanceRecordMapper;
import com.xxfc.platform.activity.vo.ActivityAttendanceRecordTotalVo; import com.xxfc.platform.activity.vo.ActivityAttendanceRecordTotalVo;
import com.xxfc.platform.activity.vo.ActivityAttendanceRecordVo; import com.xxfc.platform.activity.vo.ActivityAttendanceRecordVo;
import lombok.RequiredArgsConstructor;
import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
...@@ -20,18 +21,20 @@ import org.apache.poi.xssf.usermodel.XSSFSheet; ...@@ -20,18 +21,20 @@ import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.assertj.core.util.Lists; import org.assertj.core.util.Lists;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream; import javax.servlet.ServletOutputStream;
import java.io.IOException; import java.io.IOException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.*;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.stream.Stream; import java.util.stream.Stream;
...@@ -44,19 +47,35 @@ import java.util.stream.Stream; ...@@ -44,19 +47,35 @@ import java.util.stream.Stream;
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Service @Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecordMapper,ActivityAttendanceRecord> { public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecordMapper,ActivityAttendanceRecord> {
@Resource(name = "redisTemplate")
private ValueOperations<String, Object> valueOperations;
private final RedisTemplate<String,Object> redisTemplate;
public void attendActivity(Integer activityId, String activityName,AppUserDTO appUserDTO) { public void attendActivity(Integer activityId, String activityName,AppUserDTO appUserDTO) {
ActivityAttendanceRecord activityAttendanceRecord = new ActivityAttendanceRecord(); ActivityAttendanceRecord record = new ActivityAttendanceRecord();
activityAttendanceRecord.setActivityId(activityId); record.setActivityId(activityId);
activityAttendanceRecord.setActivityName(activityName); record.setUserId(appUserDTO.getUserid());
activityAttendanceRecord.setUserId(appUserDTO.getUserid()); int num = mapper.selectCount(record);
activityAttendanceRecord.setPhone(appUserDTO.getUsername()); if (num==0) {
activityAttendanceRecord.setUserName(StringUtils.isEmpty(appUserDTO.getRealname())?appUserDTO.getNickname():appUserDTO.getRealname()); ActivityAttendanceRecord activityAttendanceRecord = new ActivityAttendanceRecord();
activityAttendanceRecord.setPositionId(appUserDTO.getPositionId()); activityAttendanceRecord.setActivityId(activityId);
activityAttendanceRecord.setPositionName(appUserDTO.getPositionName()); activityAttendanceRecord.setActivityName(activityName);
activityAttendanceRecord.setCrtTime(new Date()); activityAttendanceRecord.setUserId(appUserDTO.getUserid());
mapper.insertSelective(activityAttendanceRecord); activityAttendanceRecord.setPhone(appUserDTO.getUsername());
activityAttendanceRecord.setUserName(StringUtils.isEmpty(appUserDTO.getRealname()) ? appUserDTO.getNickname() : appUserDTO.getRealname());
activityAttendanceRecord.setPositionId(appUserDTO.getPositionId());
activityAttendanceRecord.setPositionName(appUserDTO.getPositionName());
activityAttendanceRecord.setCrtTime(new Date());
mapper.insertSelective(activityAttendanceRecord);
String onlineKey = String.format("%d:%d:%d", appUserDTO.getUserid(), activityId, PrizeTypeEnum.ONLINE.getCode());
String localeKey = String.format("%d:%d:%d", appUserDTO.getUserid(), activityId, PrizeTypeEnum.LOCALE.getCode());
redisTemplate.delete(Arrays.asList(onlineKey,localeKey));
valueOperations.set(onlineKey, 1L);
valueOperations.set(localeKey, 1L);
}
} }
...@@ -99,6 +118,10 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor ...@@ -99,6 +118,10 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor
} }
public Boolean hasNumberOfLuckyDrawByType(Integer activityId, Integer prizeType, Integer userid) { public Boolean hasNumberOfLuckyDrawByType(Integer activityId, Integer prizeType, Integer userid) {
Object lotteryNum = valueOperations.get(String.format("%d:%d:%d", userid, activityId, prizeType));
if (lotteryNum!=null){
return Integer.valueOf(lotteryNum.toString()) >0;
}
ActivityAttendanceRecord activityAttendanceRecord = new ActivityAttendanceRecord(); ActivityAttendanceRecord activityAttendanceRecord = new ActivityAttendanceRecord();
activityAttendanceRecord.setActivityId(activityId); activityAttendanceRecord.setActivityId(activityId);
activityAttendanceRecord.setUserId(userid); activityAttendanceRecord.setUserId(userid);
...@@ -107,9 +130,11 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor ...@@ -107,9 +130,11 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor
return false; return false;
} }
if (prizeType == PrizeTypeEnum.ONLINE.getCode()){ if (prizeType == PrizeTypeEnum.ONLINE.getCode()){
valueOperations.set(String.format("%d:%d:%d", userid, activityId, prizeType),activityAttendanceRecord.getOnlineLotteryNum());
return activityAttendanceRecord.getOnlineLotteryNum()>0; return activityAttendanceRecord.getOnlineLotteryNum()>0;
} }
if (prizeType ==PrizeTypeEnum.LOCALE.getCode()){ if (prizeType ==PrizeTypeEnum.LOCALE.getCode()){
valueOperations.set(String.format("%d:%d:%d", userid, activityId, prizeType),activityAttendanceRecord.getLocaleLotteryNum());
return activityAttendanceRecord.getLocaleLotteryNum()>0; return activityAttendanceRecord.getLocaleLotteryNum()>0;
} }
return false; return false;
...@@ -172,6 +197,7 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor ...@@ -172,6 +197,7 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor
timeStr}; timeStr};
} }
@Async
public void updateLotteryNumByActivityIdAndUserIdAndPrizeType(Integer activityId,Integer userId,Integer prizeType){ public void updateLotteryNumByActivityIdAndUserIdAndPrizeType(Integer activityId,Integer userId,Integer prizeType){
mapper.updateLotteryNumByActivityIdAndUserIdAndPrizeType(activityId,userId,prizeType); mapper.updateLotteryNumByActivityIdAndUserIdAndPrizeType(activityId,userId,prizeType);
} }
......
package com.xxfc.platform.activity.biz; package com.xxfc.platform.activity.biz;
import cn.hutool.core.date.DateUtil; import com.ace.cache.annotation.Cache;
import com.ace.cache.annotation.CacheClear;
import com.github.wxiaoqi.security.admin.feign.dto.AppUserDTO; import com.github.wxiaoqi.security.admin.feign.dto.AppUserDTO;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.github.wxiaoqi.security.common.util.ReferralCodeUtil; import com.github.wxiaoqi.security.common.util.ReferralCodeUtil;
import com.xxfc.platform.activity.config.RedissonLock;
import com.xxfc.platform.activity.constant.PrizeGoodsTypeEnum;
import com.xxfc.platform.activity.constant.PrizeTypeEnum; import com.xxfc.platform.activity.constant.PrizeTypeEnum;
import com.xxfc.platform.activity.dto.UserCouponSendDTO; import com.xxfc.platform.activity.dto.UserCouponSendDTO;
import com.xxfc.platform.activity.entity.ActivityPrize;
import com.xxfc.platform.activity.entity.ActivityWinningRecord; import com.xxfc.platform.activity.entity.ActivityWinningRecord;
import com.xxfc.platform.activity.mapper.ActivityPrizeMapper;
import com.xxfc.platform.activity.util.LotteryUtils; import com.xxfc.platform.activity.util.LotteryUtils;
import com.xxfc.platform.activity.vo.ActivityPrizeVo; import com.xxfc.platform.activity.vo.ActivityPrizeVo;
import com.xxfc.platform.activity.vo.LotteryVo; import com.xxfc.platform.activity.vo.LotteryVo;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.redisson.api.RLock;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations; import org.springframework.data.redis.core.ValueOperations;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.xxfc.platform.activity.entity.ActivityPrize;
import com.xxfc.platform.activity.mapper.ActivityPrizeMapper;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.github.wxiaoqi.security.common.exception.BaseException;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example; import tk.mybatis.mapper.entity.Example;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -34,6 +41,7 @@ import java.util.stream.Collectors; ...@@ -34,6 +41,7 @@ import java.util.stream.Collectors;
* @email 18178966185@163.com * @email 18178966185@163.com
* @date 2019-12-03 16:46:02 * @date 2019-12-03 16:46:02
*/ */
@Slf4j
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Service @Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) @RequiredArgsConstructor(onConstructor = @__(@Autowired))
...@@ -46,8 +54,8 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -46,8 +54,8 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
private final RedisTemplate<String, Object> redisTemplate; private final RedisTemplate<String, Object> redisTemplate;
@Resource(name = "redisTemplate") @Resource(name = "redisTemplate")
private ValueOperations<String, Object> valueOperations; private ValueOperations<String, Object> valueOperations;
private final RedissonLock redissonLock;
private final String LOTTERY_PRE_KEY ="lottery"; private final String LOTTERY_PRE_KEY ="lottery:";
/** /**
* 查询奖品 * 查询奖品
...@@ -71,6 +79,7 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -71,6 +79,7 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
* *
* @param activityPrizes * @param activityPrizes
*/ */
@CacheClear(pre = LOTTERY_PRE_KEY)
public void saveActivityPrizes(List<ActivityPrize> activityPrizes) { public void saveActivityPrizes(List<ActivityPrize> activityPrizes) {
if (CollectionUtils.isEmpty(activityPrizes)) { if (CollectionUtils.isEmpty(activityPrizes)) {
throw new BaseException("奖品不能为空"); throw new BaseException("奖品不能为空");
...@@ -98,6 +107,7 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -98,6 +107,7 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
* @param prizeType * @param prizeType
* @return * @return
*/ */
@Cache(key = LOTTERY_PRE_KEY+"{1}")
public List<ActivityPrize> findActivityPrizeByType(Integer prizeType) { public List<ActivityPrize> findActivityPrizeByType(Integer prizeType) {
Example example = new Example(ActivityPrize.class); Example example = new Example(ActivityPrize.class);
example.orderBy("serialNumber").asc(); example.orderBy("serialNumber").asc();
...@@ -107,13 +117,20 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -107,13 +117,20 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
if (CollectionUtils.isEmpty(activityPrizes)) { if (CollectionUtils.isEmpty(activityPrizes)) {
return Collections.EMPTY_LIST; return Collections.EMPTY_LIST;
} }
for (ActivityPrize activityPrize : activityPrizes) {
if (activityPrize.getTotalStock()!=null) {
String prizeStockKey = String.format("%s%d:%d", LOTTERY_PRE_KEY, prizeType, activityPrize.getSerialNumber());
redisTemplate.delete(prizeStockKey);
valueOperations.set(prizeStockKey, Integer.valueOf(activityPrize.getTotalStock().toString()));
}
}
return activityPrizes; return activityPrizes;
} }
/** /**
* 抽奖 * 抽奖
* //todo
* *
* @param activityId * @param activityId
* @param prizeType * @param prizeType
...@@ -122,75 +139,108 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -122,75 +139,108 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
*/ */
public LotteryVo activityLottery(Integer activityId, Integer prizeType, String lotteryDate,AppUserDTO appUserDTO) { public LotteryVo activityLottery(Integer activityId, Integer prizeType, String lotteryDate,AppUserDTO appUserDTO) {
LotteryVo lotteryVo = new LotteryVo(); LotteryVo lotteryVo = new LotteryVo();
/* Boolean hasNum = activityAttendanceRecordBiz.hasNumberOfLuckyDrawByType(activityId, prizeType, appUserDTO.getUserid()); List<ActivityPrize> activityPrizes = ((ActivityPrizeBiz)AopContext.currentProxy()).findActivityPrizeByType(prizeType);
if (!hasNum){
lotteryVo.setPrizeName("谢谢惠顾");
lotteryVo.setSerialNumber(8);
return lotteryVo;
}*/
List<ActivityPrize> activityPrizes = findActivityPrizeByType(prizeType);
ActivityPrize notActivityPrize = activityPrizes.stream().filter(x -> x.getPrizeGoodsType() ==0).findFirst().orElseGet(() -> { ActivityPrize notActivityPrize = activityPrizes.stream().filter(x -> x.getPrizeGoodsType() ==0).findFirst().orElseGet(() -> {
ActivityPrize activityPrize = new ActivityPrize(); ActivityPrize activityPrize = new ActivityPrize();
activityPrize.setName("谢谢参与"); activityPrize.setName("谢谢参与");
activityPrize.setPrizeGoodsType(0); activityPrize.setPrizeGoodsType(PrizeGoodsTypeEnum.NO_PRIZE.getCode());
activityPrize.setType(prizeType); activityPrize.setType(prizeType);
activityPrize.setSerialNumber(8); activityPrize.setSerialNumber(8);
return activityPrize; return activityPrize;
}); });
int index = LotteryUtils.getrandomIndex(activityPrizes); String lotteryNumKey = String.format("%d:%d:%d", appUserDTO.getUserid(), activityId, prizeType);
ActivityPrize activityPrize = activityPrizes.get(index); Object lotteryNum = valueOperations.get(lotteryNumKey);
boolean hasLotteryNum = lotteryNum ==null?activityAttendanceRecordBiz.hasNumberOfLuckyDrawByType(activityId,prizeType,appUserDTO.getUserid()):((Integer)lotteryNum) >0;
try { if (hasLotteryNum) {
//库存为0 //更改抽奖次数
if (activityPrize.getPrizeGoodsType() != 0 && activityPrize.getTotalStock() != null && activityPrize.getTotalStock() == 0) { activityAttendanceRecordBiz.updateLotteryNumByActivityIdAndUserIdAndPrizeType(activityId, appUserDTO.getUserid(), prizeType);
activityPrize = notActivityPrize; valueOperations.decrement(lotteryNumKey);
//抽奖
int index = LotteryUtils.getrandomIndex(activityPrizes);
//获取对应的奖品
ActivityPrize activityPrize = activityPrizes.get(index);
//判断是否设置最大奖品数
if (activityPrize.getDayMaxUse() != null) {
String key = String.format("%s:%s%d:%s", lotteryDate, LOTTERY_PRE_KEY, activityId, activityPrize.getSerialNumber());
Long prizeDayUseStock = valueOperations.increment(key);
//达到日上限
if (prizeDayUseStock.intValue() > activityPrize.getDayMaxUse()) {
activityPrize = notActivityPrize;
}
} }
}catch (Exception ex){ //根据商品key获取库存
System.out.println("+++++"+activityPrize); String prizeStockKey = String.format("%s%d:%d", LOTTERY_PRE_KEY, prizeType, activityPrize.getSerialNumber());
} Object prizeStock = valueOperations.get(prizeStockKey);
if (activityPrize.getPrizeGoodsType() != PrizeGoodsTypeEnum.NO_PRIZE.getCode() && activityPrize.getTotalStock() != null) {
// if (activityPrize.getDayMaxUse()!=null){ //库存为0
// String key = String.format("%s:%s:%d:%s",lotteryDate,LOTTERY_PRE_KEY, activityId, activityPrize.getSerialNumber()); if (prizeStock == null || (Integer) prizeStock == 0) {
// Long prizeDayUseStock = valueOperations.increment(key); activityPrize = notActivityPrize;
// //达到日上限 }
// if (prizeDayUseStock.intValue() > activityPrize.getDayMaxUse()){
// activityPrize = notActivityPrize;
// }
// }
ActivityWinningRecord activityWinningRecord = new ActivityWinningRecord();
activityWinningRecord.setActivityId(activityId);
activityWinningRecord.setPrizeType(prizeType);
activityWinningRecord.setUserId(appUserDTO.getUserid());
activityWinningRecord.setHasWinning(0);
if (activityPrize.getPrizeGoodsType() !=0 && activityPrize.getTotalStock() != 0) {
if (PrizeTypeEnum.LOCALE.getCode() == prizeType) {
//兑奖码生成
String expiryDateCode = ReferralCodeUtil.encode(valueOperations.increment(String.valueOf(activityId)).intValue());
activityWinningRecord.setExpiryDateCode(expiryDateCode);
lotteryVo.setExpiryDateCode(expiryDateCode);
} }
//发放优惠券
if (activityPrize.getPrizeGoodsType() == 0) { ActivityWinningRecord activityWinningRecord = new ActivityWinningRecord();
UserCouponSendDTO userCouponSendDTO = new UserCouponSendDTO(); activityWinningRecord.setActivityId(activityId);
userCouponSendDTO.setCouponId(activityPrize.getGoodsId()); activityWinningRecord.setPrizeType(prizeType);
userCouponSendDTO.setCouponNum(1); activityWinningRecord.setUserId(appUserDTO.getUserid());
userCouponSendDTO.setPhone(appUserDTO.getUsername()); activityWinningRecord.setHasWinning(0);
userCouponBiz.sendCoupon(userCouponSendDTO); boolean hasStock = activityPrize.getPrizeGoodsType() != PrizeGoodsTypeEnum.NO_PRIZE.getCode() && activityPrize.getTotalStock() != 0 && prizeStock != null && (Integer)prizeStock != 0;
activityWinningRecord.setGoodsId(activityPrize.getGoodsId()); if (hasStock) {
String key = String.format("%s%d:%d:%d", LOTTERY_PRE_KEY, activityId, prizeType, activityPrize.getSerialNumber());
RLock rLock = redissonLock.getRLock(key);
try {
boolean isSuccess = rLock.tryLock(1, 2, TimeUnit.SECONDS);
if (isSuccess) {
prizeStock = valueOperations.get(prizeStockKey);
log.info("tryLock success, key = [{}]", key);
try {
if (prizeStock!=null && (Integer)prizeStock > 0) {
//更新库存
((ActivityPrizeBiz) AopContext.currentProxy()).updatePrizeStock(prizeType, activityPrize.getSerialNumber());
//更新缓存库存
valueOperations.decrement(prizeStockKey);
//设置为已中奖
activityWinningRecord.setHasWinning(1);
activityWinningRecord.setIconPath(activityPrize.getIconPath());
activityWinningRecord.setLotteryTime(new Date());
} else {
activityPrize = notActivityPrize;
}
} catch (Exception ex) {
log.error("抽奖失败:【{}】", ex);
rLock.unlock();
} finally {
rLock.unlock();
log.info("releaseLock success, key = [{}]", key);
}
} else {
// 获取锁失败
log.info("tryLock fail, key = [{}]", key);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
if (PrizeTypeEnum.LOCALE.getCode() == prizeType) {
//兑奖码生成
String expiryDateCode = ReferralCodeUtil.encode(valueOperations.increment(String.valueOf(activityId)).intValue());
activityWinningRecord.setExpiryDateCode(expiryDateCode);
lotteryVo.setExpiryDateCode(expiryDateCode);
}
//发放优惠券
if (activityPrize.getPrizeGoodsType() == PrizeGoodsTypeEnum.COUPON.getCode()) {
UserCouponSendDTO userCouponSendDTO = new UserCouponSendDTO();
userCouponSendDTO.setCouponId(activityPrize.getGoodsId());
userCouponSendDTO.setCouponNum(1);
userCouponSendDTO.setPhone(appUserDTO.getUsername());
userCouponBiz.sendCoupon(userCouponSendDTO);
activityWinningRecord.setGoodsId(activityPrize.getGoodsId());
}
} }
//更改抽奖次数
activityAttendanceRecordBiz.updateLotteryNumByActivityIdAndUserIdAndPrizeType(activityId, appUserDTO.getUserid(), prizeType);
//更新库存
updatePrizeStock(prizeType, activityPrize.getSerialNumber());
//设置为已中奖
activityWinningRecord.setHasWinning(1);
activityWinningRecord.setIconPath(activityPrize.getIconPath());
activityWinningRecord.setLotteryTime(new Date());
activityWinningRecord.setPrizeName(activityPrize.getName()); activityWinningRecord.setPrizeName(activityPrize.getName());
activityWinningRecordBiz.saveRecord(activityWinningRecord);
lotteryVo.setSerialNumber(activityPrize.getSerialNumber());
}else{
lotteryVo.setMessage("抽奖次数已用完!!!");
} }
activityWinningRecordBiz.saveRecord(activityWinningRecord);
lotteryVo.setSerialNumber(activityPrize.getSerialNumber());
return lotteryVo; return lotteryVo;
} }
...@@ -200,7 +250,8 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -200,7 +250,8 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
* @param prizeType * @param prizeType
* @param serialNumber * @param serialNumber
*/ */
private void updatePrizeStock(Integer prizeType, Integer serialNumber) { @Async
public void updatePrizeStock(Integer prizeType, Integer serialNumber) {
mapper.updatePrizeStock(prizeType, serialNumber); mapper.updatePrizeStock(prizeType, serialNumber);
} }
} }
\ No newline at end of file
...@@ -5,9 +5,12 @@ import org.springframework.context.annotation.Configuration; ...@@ -5,9 +5,12 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.nio.charset.Charset;
/** /**
* ${DESCRIPTION} * ${DESCRIPTION}
* *
...@@ -20,15 +23,15 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; ...@@ -20,15 +23,15 @@ import org.springframework.data.redis.serializer.StringRedisSerializer;
public class RedisConfiguration { public class RedisConfiguration {
@Bean @Bean
public RedisTemplate<String, Object> userRedisTemplate(RedisConnectionFactory factory) { public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate redisTemplate = new RedisTemplate(); RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(factory); redisTemplate.setConnectionFactory(factory);
RedisSerializer<String> stringSerializer = new StringRedisSerializer(); RedisSerializer<String> stringSerializer = new StringRedisSerializer(Charset.forName("UTF-8"));
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
redisTemplate.setKeySerializer(stringSerializer); redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(stringSerializer); redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer); redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate; return redisTemplate;
} }
......
package com.xxfc.platform.activity.config;
import org.redisson.api.*;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author libin
* @version 1.0
* @description TODO
* @data 2019/6/20 16:51
*/
@Component
public class RedissonLock {
@Resource
private RedissonClient redissonClient;
/**
* 获取锁
* @param key
* @return
*/
public RLock getRLock(String key){
return redissonClient.getLock(key);
}
/**
* 获取读写锁
* @param key
* @return
*/
public RReadWriteLock getRWLock(String key){
return redissonClient.getReadWriteLock(key);
}
/**
* 获取记数锁
* @param key
* @return
*/
public RCountDownLatch getRCountDownLatch(String key){
return redissonClient.getCountDownLatch(key);
}
/**
* 获取消息的Topic
* @param key
* @return
*/
public RTopic getRTopic(String key){
RTopic rTopic = redissonClient.getTopic(key);
return rTopic;
}
}
...@@ -4,7 +4,6 @@ import com.github.wxiaoqi.security.admin.feign.dto.AppUserDTO; ...@@ -4,7 +4,6 @@ import com.github.wxiaoqi.security.admin.feign.dto.AppUserDTO;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse; import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.xxfc.platform.activity.biz.ActivityPrizeBiz; import com.xxfc.platform.activity.biz.ActivityPrizeBiz;
import com.xxfc.platform.activity.entity.ActivityPrize; import com.xxfc.platform.activity.entity.ActivityPrize;
import com.xxfc.platform.activity.vo.ActivityPrizeVo;
import com.xxfc.platform.activity.vo.LotteryVo; import com.xxfc.platform.activity.vo.LotteryVo;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
</resultMap> </resultMap>
<select id="selectActivityWinningRecord" resultType="com.xxfc.platform.activity.dto.ActivityWinningRecordPageDTO"> <select id="selectActivityWinningRecord" resultType="com.xxfc.platform.activity.dto.ActivityWinningRecordPageDTO">
select awr.*,aar.* from `activity_winning_record` as `awr` select aar.user_id as `userId`,aar.user_name as `userName`, aar.phone as `phone`,aar.position_name as `positionName`,awr.* from `activity_winning_record` as `awr`
left join `activity_attendance_record` as `aar` ON aar.user_id=awr.user_id and aar.activity_id=awr.activity_id left join `activity_attendance_record` as `aar` ON aar.user_id=awr.user_id and aar.activity_id=awr.activity_id
where 1=1 where 1=1
<if test="activityId!=null"> <if test="activityId!=null">
......
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