Commit f19c10a6 authored by libin's avatar libin

抽奖过期时间设置

parent 6ddd65ec
...@@ -22,6 +22,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; ...@@ -22,6 +22,7 @@ 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.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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.scheduling.annotation.Async;
...@@ -35,6 +36,7 @@ import javax.servlet.ServletOutputStream; ...@@ -35,6 +36,7 @@ import javax.servlet.ServletOutputStream;
import java.io.IOException; import java.io.IOException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.stream.Stream; import java.util.stream.Stream;
...@@ -54,6 +56,9 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor ...@@ -54,6 +56,9 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor
private final RedisTemplate<String,Object> redisTemplate; private final RedisTemplate<String,Object> redisTemplate;
@Value("${lottery.expire.days:60}")
private int expirDays;
public void attendActivity(Integer activityId, String activityName,AppUserDTO appUserDTO) { public void attendActivity(Integer activityId, String activityName,AppUserDTO appUserDTO) {
ActivityAttendanceRecord record = new ActivityAttendanceRecord(); ActivityAttendanceRecord record = new ActivityAttendanceRecord();
record.setActivityId(activityId); record.setActivityId(activityId);
...@@ -73,8 +78,8 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor ...@@ -73,8 +78,8 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor
String onlineKey = String.format("%d:%d:%d", appUserDTO.getUserid(), activityId, PrizeTypeEnum.ONLINE.getCode()); 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()); String localeKey = String.format("%d:%d:%d", appUserDTO.getUserid(), activityId, PrizeTypeEnum.LOCALE.getCode());
redisTemplate.delete(Arrays.asList(onlineKey,localeKey)); redisTemplate.delete(Arrays.asList(onlineKey,localeKey));
valueOperations.set(onlineKey, 1L); valueOperations.set(onlineKey, 1L,expirDays, TimeUnit.DAYS);
valueOperations.set(localeKey, 1L); valueOperations.set(localeKey, 1L,expirDays, TimeUnit.DAYS);
} }
} }
...@@ -130,11 +135,11 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor ...@@ -130,11 +135,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()); valueOperations.set(String.format("%d:%d:%d", userid, activityId, prizeType),activityAttendanceRecord.getOnlineLotteryNum(),expirDays, TimeUnit.DAYS);
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()); valueOperations.set(String.format("%d:%d:%d", userid, activityId, prizeType),activityAttendanceRecord.getLocaleLotteryNum(),expirDays, TimeUnit.DAYS);
return activityAttendanceRecord.getLocaleLotteryNum()>0; return activityAttendanceRecord.getLocaleLotteryNum()>0;
} }
return false; return false;
......
...@@ -22,6 +22,7 @@ import org.apache.commons.collections.CollectionUtils; ...@@ -22,6 +22,7 @@ import org.apache.commons.collections.CollectionUtils;
import org.redisson.api.RLock; import org.redisson.api.RLock;
import org.springframework.aop.framework.AopContext; import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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.scheduling.annotation.Async;
...@@ -55,7 +56,9 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -55,7 +56,9 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
@Resource(name = "redisTemplate") @Resource(name = "redisTemplate")
private ValueOperations<String, Object> valueOperations; private ValueOperations<String, Object> valueOperations;
private final RedissonLock redissonLock; private final RedissonLock redissonLock;
private final String LOTTERY_PRE_KEY ="lottery:"; @Value("${lottery.expire.days:60}")
private int expirDays;
private static final String LOTTERY_PRE_KEY = "lottery:";
/** /**
* 查询奖品 * 查询奖品
...@@ -107,7 +110,7 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -107,7 +110,7 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
* @param prizeType * @param prizeType
* @return * @return
*/ */
@Cache(key = LOTTERY_PRE_KEY+"{1}") @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();
...@@ -119,10 +122,10 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -119,10 +122,10 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
} }
for (ActivityPrize activityPrize : activityPrizes) { for (ActivityPrize activityPrize : activityPrizes) {
if (activityPrize.getTotalStock()!=null) { if (activityPrize.getTotalStock() != null) {
String prizeStockKey = String.format("%s%d:%d", LOTTERY_PRE_KEY, prizeType, activityPrize.getSerialNumber()); String prizeStockKey = String.format("%s%d:%d", LOTTERY_PRE_KEY, prizeType, activityPrize.getSerialNumber());
redisTemplate.delete(prizeStockKey); redisTemplate.delete(prizeStockKey);
valueOperations.set(prizeStockKey, Integer.valueOf(activityPrize.getTotalStock().toString())); valueOperations.set(prizeStockKey, Integer.valueOf(activityPrize.getTotalStock().toString()), expirDays, TimeUnit.DAYS);
} }
} }
return activityPrizes; return activityPrizes;
...@@ -137,10 +140,10 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -137,10 +140,10 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
* @param appUserDTO * @param appUserDTO
* @return * @return
*/ */
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();
List<ActivityPrize> activityPrizes = ((ActivityPrizeBiz)AopContext.currentProxy()).findActivityPrizeByType(prizeType); List<ActivityPrize> activityPrizes = ((ActivityPrizeBiz) AopContext.currentProxy()).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(PrizeGoodsTypeEnum.NO_PRIZE.getCode()); activityPrize.setPrizeGoodsType(PrizeGoodsTypeEnum.NO_PRIZE.getCode());
...@@ -150,19 +153,20 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -150,19 +153,20 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
}); });
String lotteryNumKey = String.format("%d:%d:%d", appUserDTO.getUserid(), activityId, prizeType); String lotteryNumKey = String.format("%d:%d:%d", appUserDTO.getUserid(), activityId, prizeType);
Object lotteryNum = valueOperations.get(lotteryNumKey); Object lotteryNum = valueOperations.get(lotteryNumKey);
boolean hasLotteryNum = lotteryNum ==null?activityAttendanceRecordBiz.hasNumberOfLuckyDrawByType(activityId,prizeType,appUserDTO.getUserid()):((Integer)lotteryNum) >0; boolean hasLotteryNum = lotteryNum == null ? activityAttendanceRecordBiz.hasNumberOfLuckyDrawByType(activityId, prizeType, appUserDTO.getUserid()) : ((Integer) lotteryNum) > 0;
if (hasLotteryNum) { if (hasLotteryNum) {
//更改抽奖次数
activityAttendanceRecordBiz.updateLotteryNumByActivityIdAndUserIdAndPrizeType(activityId, appUserDTO.getUserid(), prizeType);
valueOperations.decrement(lotteryNumKey);
//抽奖 //抽奖
int index = LotteryUtils.getrandomIndex(activityPrizes); int index = LotteryUtils.getrandomIndex(activityPrizes);
//获取对应的奖品 //获取对应的奖品
ActivityPrize activityPrize = activityPrizes.get(index); ActivityPrize activityPrize = activityPrizes.get(index);
//判断是否设置最大奖品数 //判断是否设置最大奖品数(谢谢参与排除)
if (activityPrize.getDayMaxUse() != null) { if (activityPrize.getDayMaxUse() != null && activityPrize.getPrizeGoodsType() != PrizeGoodsTypeEnum.NO_PRIZE.getCode()) {
String key = String.format("%s:%s%d:%s", lotteryDate, LOTTERY_PRE_KEY, activityId, activityPrize.getSerialNumber()); String key = String.format("%s:%s%d:%s", lotteryDate, LOTTERY_PRE_KEY, activityId, activityPrize.getSerialNumber());
Long prizeDayUseStock = valueOperations.increment(key); Long prizeDayUseStock = valueOperations.increment(key);
//第一次时设置每天奖品份数的过期时间为1天
if (prizeDayUseStock.intValue() == 1) {
redisTemplate.expire(key, 1, TimeUnit.DAYS);
}
//达到日上限 //达到日上限
if (prizeDayUseStock.intValue() > activityPrize.getDayMaxUse()) { if (prizeDayUseStock.intValue() > activityPrize.getDayMaxUse()) {
activityPrize = notActivityPrize; activityPrize = notActivityPrize;
...@@ -183,17 +187,17 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -183,17 +187,17 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
activityWinningRecord.setPrizeType(prizeType); activityWinningRecord.setPrizeType(prizeType);
activityWinningRecord.setUserId(appUserDTO.getUserid()); activityWinningRecord.setUserId(appUserDTO.getUserid());
activityWinningRecord.setHasWinning(0); activityWinningRecord.setHasWinning(0);
boolean hasStock = activityPrize.getPrizeGoodsType() != PrizeGoodsTypeEnum.NO_PRIZE.getCode() && activityPrize.getTotalStock() != 0 && prizeStock != null && (Integer)prizeStock != 0; boolean hasStock = activityPrize.getPrizeGoodsType() != PrizeGoodsTypeEnum.NO_PRIZE.getCode() && activityPrize.getTotalStock() != 0 && prizeStock != null && (Integer) prizeStock != 0;
if (hasStock) { if (hasStock) {
String key = String.format("%s%d:%d:%d", LOTTERY_PRE_KEY, activityId, prizeType, activityPrize.getSerialNumber()); String key = String.format("%s%d:%d:%d", LOTTERY_PRE_KEY, activityId, prizeType, activityPrize.getSerialNumber());
RLock rLock = redissonLock.getRLock(key); RLock rLock = redissonLock.getRLock(key);
try { try {
boolean isSuccess = rLock.tryLock(1, 2, TimeUnit.SECONDS); boolean isSuccess = rLock.tryLock(1, 2, TimeUnit.SECONDS);
if (isSuccess) { if (isSuccess) {
prizeStock = valueOperations.get(prizeStockKey); prizeStock = valueOperations.get(prizeStockKey);
log.info("tryLock success, key = [{}]", key); log.info("tryLock success, key = [{}]", key);
try { try {
if (prizeStock!=null && (Integer)prizeStock > 0) { if (prizeStock != null && (Integer) prizeStock > 0) {
//更新库存 //更新库存
((ActivityPrizeBiz) AopContext.currentProxy()).updatePrizeStock(prizeType, activityPrize.getSerialNumber()); ((ActivityPrizeBiz) AopContext.currentProxy()).updatePrizeStock(prizeType, activityPrize.getSerialNumber());
//更新缓存库存 //更新缓存库存
...@@ -221,7 +225,12 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -221,7 +225,12 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
} }
if (PrizeTypeEnum.LOCALE.getCode() == prizeType) { if (PrizeTypeEnum.LOCALE.getCode() == prizeType) {
//兑奖码生成 //兑奖码生成
String expiryDateCode = ReferralCodeUtil.encode(valueOperations.increment(String.valueOf(activityId)).intValue()); String expireDateCodeKey = String.format("%s:%s%d",lotteryDate.substring(0,4),LOTTERY_PRE_KEY, activityId);
Long expireDateCodeCounter = valueOperations.increment(expireDateCodeKey);
if (expireDateCodeCounter == 1) {
redisTemplate.expire(expireDateCodeKey, expirDays, TimeUnit.DAYS);
}
String expiryDateCode = ReferralCodeUtil.encode(expireDateCodeCounter.intValue());
activityWinningRecord.setExpiryDateCode(expiryDateCode); activityWinningRecord.setExpiryDateCode(expiryDateCode);
lotteryVo.setExpiryDateCode(expiryDateCode); lotteryVo.setExpiryDateCode(expiryDateCode);
} }
...@@ -238,7 +247,10 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -238,7 +247,10 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
activityWinningRecord.setPrizeName(activityPrize.getName()); activityWinningRecord.setPrizeName(activityPrize.getName());
activityWinningRecordBiz.saveRecord(activityWinningRecord); activityWinningRecordBiz.saveRecord(activityWinningRecord);
lotteryVo.setSerialNumber(activityPrize.getSerialNumber()); lotteryVo.setSerialNumber(activityPrize.getSerialNumber());
}else{ //更改对应抽奖类型的抽奖次数
activityAttendanceRecordBiz.updateLotteryNumByActivityIdAndUserIdAndPrizeType(activityId, appUserDTO.getUserid(), prizeType);
valueOperations.decrement(lotteryNumKey);
} else {
lotteryVo.setMessage("抽奖次数已用完!!!"); lotteryVo.setMessage("抽奖次数已用完!!!");
} }
return lotteryVo; return lotteryVo;
......
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