|
@@ -50,10 +50,10 @@ import java.util.stream.Collectors;
|
|
|
public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing> implements IMarketingService {
|
|
|
|
|
|
// 内部奖池
|
|
|
- public static final String MARKETING_LOTTERY_INSIDE_POOL = "MARKETING_LOTTERY_INSIDE_POOL";
|
|
|
+ public static final String MARKETING_LOTTERY_INSIDE_POOL = "MARKETING_LOTTERY_INSIDE_POOL:%s";
|
|
|
|
|
|
// 普通奖池
|
|
|
- public static final String MARKETING_LOTTERY_ORDINARY_POOL = "MARKETING_LOTTERY_ORDINARY_POOL";
|
|
|
+ public static final String MARKETING_LOTTERY_ORDINARY_POOL = "MARKETING_LOTTERY_ORDINARY_POOL:%s";
|
|
|
|
|
|
|
|
|
@Autowired
|
|
@@ -97,6 +97,11 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void lottery(Marketing marketing) {
|
|
|
|
|
|
+ // 用户抽奖池
|
|
|
+ String userLotteryPool = String.format(MARKETING_LOTTERY_ORDINARY_POOL, marketing.getId());
|
|
|
+ // 内部抽奖池
|
|
|
+ String insideLotteryPool = String.format(MARKETING_LOTTERY_INSIDE_POOL, marketing.getId());
|
|
|
+
|
|
|
// 获取奖级信息
|
|
|
List<MarketingAwards> marketingAwardsList = marketingAwardsService.list(new LambdaQueryWrapper<MarketingAwards>()
|
|
|
.eq(MarketingAwards::getMarketingId, marketing.getId()));
|
|
@@ -126,7 +131,8 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
// 获取一定数量的内定人员设置抽奖码加入抽奖关系表和抽奖池
|
|
|
List<SysUser> insideUserList = sysUserService.selectUserListByRand(UserTypeEnum.INSIDE.getValue(), insideNum);
|
|
|
|
|
|
- Set<String> codeList = new HashSet<>();
|
|
|
+ Set<String> insideCodes = new HashSet<>();
|
|
|
+ Set<String> userCodes = new HashSet<>();
|
|
|
for (SysUser sysUser : insideUserList) {
|
|
|
// 生成抽奖码
|
|
|
String code = MarketingUtils.generatePrizeCode();
|
|
@@ -141,7 +147,7 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
- codeList.add(code);
|
|
|
+ insideCodes.add(code);
|
|
|
MarketingUserCode marketingUserCode = new MarketingUserCode();
|
|
|
marketingUserCode.setMarketingId(marketing.getId());
|
|
|
marketingUserCode.setUserId(sysUser.getUserId());
|
|
@@ -153,19 +159,18 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
marketingUserCodeService.save(marketingUserCode);
|
|
|
}
|
|
|
// 将抽奖码放入内部抽奖池
|
|
|
- redisCache.setCacheSet(MARKETING_LOTTERY_INSIDE_POOL, codeList);
|
|
|
+ redisCache.setCacheSet(insideLotteryPool, insideCodes);
|
|
|
|
|
|
|
|
|
// 获取普通用户所有的抽奖码
|
|
|
List<MarketingUserCode> userCodeList = marketingUserCodeService.list(new LambdaQueryWrapper<MarketingUserCode>()
|
|
|
.eq(MarketingUserCode::getMarketingId, marketing.getId())
|
|
|
.eq(MarketingUserCode::getUserType, UserTypeEnum.ORDINARY.getValue()));
|
|
|
- codeList.clear();
|
|
|
if (CollectionUtils.isNotEmpty(userCodeList)) {
|
|
|
- codeList = userCodeList.stream().map(MarketingUserCode::getCode).collect(Collectors.toSet());
|
|
|
+ userCodes = userCodeList.stream().map(MarketingUserCode::getCode).collect(Collectors.toSet());
|
|
|
}
|
|
|
// 将抽奖码放入普通抽奖池
|
|
|
- redisCache.setCacheSet(MARKETING_LOTTERY_ORDINARY_POOL, codeList);
|
|
|
+ redisCache.setCacheSet(userLotteryPool, userCodes);
|
|
|
|
|
|
// 所有中奖名单
|
|
|
List<MarketingHitPrize> allHitPrizeList = new ArrayList<>();
|
|
@@ -191,26 +196,14 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
|
|
|
if (insideNum != 0) {
|
|
|
// 设置内部用户抽奖信息
|
|
|
- List<String> insideCodeList = redisCache.popCacheSet(MARKETING_LOTTERY_INSIDE_POOL, insideNum);
|
|
|
+ List<String> insideCodeList = redisCache.popCacheSet(insideLotteryPool, insideNum);
|
|
|
for (String code : insideCodeList) {
|
|
|
MarketingUserCode marketingUserCode = marketingUserCodeService.getOne(new LambdaQueryWrapper<MarketingUserCode>()
|
|
|
.eq(MarketingUserCode::getMarketingId, marketing.getId())
|
|
|
.eq(MarketingUserCode::getCode, code));
|
|
|
|
|
|
// 设置中奖信息
|
|
|
- MarketingHitPrize marketingHitPrize = new MarketingHitPrize();
|
|
|
- marketingHitPrize.setId(bizIdGenerator.newId());
|
|
|
- marketingHitPrize.setMarketingId(marketing.getId());
|
|
|
- marketingHitPrize.setAwardsId(marketingAwards.getId());
|
|
|
- marketingHitPrize.setMarketingUserCodeId(marketingUserCode.getId());
|
|
|
- marketingHitPrize.setUserId(marketingUserCode.getUserId());
|
|
|
- marketingHitPrize.setUserType(marketingUserCode.getUserType());
|
|
|
-
|
|
|
- // 随机抽取奖品,[0, list.size) 左闭右开
|
|
|
- int randomIndex = RandomUtil.randomInt(0, marketingAwardsPrizeList.size());
|
|
|
- marketingHitPrize.setPrizeId(marketingAwardsPrizeList.get(randomIndex).getId());
|
|
|
-
|
|
|
- allHitPrizeList.add(marketingHitPrize);
|
|
|
+ exchangeMarketingHitPrize(marketing, allHitPrizeList, marketingAwards, marketingAwardsPrizeList, marketingUserCode);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -219,7 +212,7 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
if (userNum > 0) {
|
|
|
// 设置普通用户抽奖信息
|
|
|
for (int i = 0; i < userNum; i++) {
|
|
|
- List<String> insideCodeList = redisCache.popCacheSet(MARKETING_LOTTERY_INSIDE_POOL, 1);
|
|
|
+ List<String> insideCodeList = redisCache.popCacheSet(userLotteryPool, 1);
|
|
|
MarketingUserCode marketingUserCode = marketingUserCodeService.getOne(new LambdaQueryWrapper<MarketingUserCode>()
|
|
|
.eq(MarketingUserCode::getMarketingId, marketing.getId())
|
|
|
.eq(MarketingUserCode::getCode, insideCodeList.get(0)));
|
|
@@ -229,23 +222,9 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
.eq(MarketingUserCode::getMarketingId, marketing.getId())
|
|
|
.eq(MarketingUserCode::getUserId, marketingUserCode.getUserId()));
|
|
|
List<Object> delUserCodeList = list.stream().map(MarketingUserCode::getCode).collect(Collectors.toList());
|
|
|
- redisCache.removeSetValueByKey(MARKETING_LOTTERY_ORDINARY_POOL, delUserCodeList);
|
|
|
-
|
|
|
+ redisCache.removeSetValueByKey(userLotteryPool, delUserCodeList);
|
|
|
+ MarketingHitPrize marketingHitPrize = exchangeMarketingHitPrize(marketing, allHitPrizeList, marketingAwards, marketingAwardsPrizeList, marketingUserCode);
|
|
|
|
|
|
- // 设置中奖信息
|
|
|
- MarketingHitPrize marketingHitPrize = new MarketingHitPrize();
|
|
|
- marketingHitPrize.setId(bizIdGenerator.newId());
|
|
|
- marketingHitPrize.setMarketingId(marketing.getId());
|
|
|
- marketingHitPrize.setAwardsId(marketingAwards.getId());
|
|
|
- marketingHitPrize.setMarketingUserCodeId(marketingUserCode.getId());
|
|
|
- marketingHitPrize.setUserId(marketingUserCode.getUserId());
|
|
|
- marketingHitPrize.setUserType(marketingUserCode.getUserType());
|
|
|
-
|
|
|
- // 随机抽取奖品,[0, list.size) 左闭右开
|
|
|
- int randomIndex = RandomUtil.randomInt(0, marketingAwardsPrizeList.size());
|
|
|
- marketingHitPrize.setPrizeId(marketingAwardsPrizeList.get(randomIndex).getId());
|
|
|
-
|
|
|
- allHitPrizeList.add(marketingHitPrize);
|
|
|
userHitPrizeList.add(marketingHitPrize);
|
|
|
|
|
|
// 更新用户中奖状态
|
|
@@ -287,6 +266,28 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
.eq(Marketing::getTriggerStatus, 0));
|
|
|
Assert.isTrue(rtn, "更新活动开奖状态失败。marketingId:" + marketing.getId());
|
|
|
|
|
|
+ // 删除抽奖池
|
|
|
+ redisCache.deleteObject(userLotteryPool);
|
|
|
+ redisCache.deleteObject(insideLotteryPool);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private MarketingHitPrize exchangeMarketingHitPrize(Marketing marketing, List<MarketingHitPrize> allHitPrizeList, MarketingAwards marketingAwards, List<MarketingAwardsPrize> marketingAwardsPrizeList, MarketingUserCode marketingUserCode) {
|
|
|
+ // 设置中奖信息
|
|
|
+ MarketingHitPrize marketingHitPrize = new MarketingHitPrize();
|
|
|
+ marketingHitPrize.setId(bizIdGenerator.newId());
|
|
|
+ marketingHitPrize.setMarketingId(marketing.getId());
|
|
|
+ marketingHitPrize.setAwardsId(marketingAwards.getId());
|
|
|
+ marketingHitPrize.setMarketingUserCodeId(marketingUserCode.getId());
|
|
|
+ marketingHitPrize.setUserId(marketingUserCode.getUserId());
|
|
|
+ marketingHitPrize.setUserType(marketingUserCode.getUserType());
|
|
|
+
|
|
|
+ // 随机抽取奖品,[0, list.size) 左闭右开
|
|
|
+ int randomIndex = RandomUtil.randomInt(0, marketingAwardsPrizeList.size());
|
|
|
+ marketingHitPrize.setPrizeId(marketingAwardsPrizeList.get(randomIndex).getId());
|
|
|
+
|
|
|
+ allHitPrizeList.add(marketingHitPrize);
|
|
|
+ return marketingHitPrize;
|
|
|
}
|
|
|
|
|
|
@Override
|