|
@@ -62,6 +62,10 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
// 普通奖池
|
|
|
public static final String MARKETING_LOTTERY_ORDINARY_POOL = "MARKETING_LOTTERY_ORDINARY_POOL:%s";
|
|
|
|
|
|
+ // 普通用户低阶奖池
|
|
|
+ public static final String MARKETING_LOW_LOTTERY_ORDINARY_POOL = "MARKETING_LOW_LOTTERY_ORDINARY_POOL:%s";
|
|
|
+
|
|
|
+
|
|
|
protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
|
|
|
|
|
|
@Autowired
|
|
@@ -108,12 +112,100 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
private DistributedLocker distributedLocker;
|
|
|
|
|
|
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void copyById(Long marketingId) {
|
|
|
+ Marketing marketing = this.getById(marketingId);
|
|
|
+ if (Objects.isNull(marketing)) {
|
|
|
+ throw new ServiceException("活动不存在");
|
|
|
+ }
|
|
|
+ // 初始化活动
|
|
|
+ marketing.setId(null);
|
|
|
+ marketing.setFakeNum(0);
|
|
|
+ marketing.setRealNum(0);
|
|
|
+ marketing.setIsOn(MarketingStatusEnum.OFF.getValue());
|
|
|
+ marketing.setIsSend(0);
|
|
|
+ marketing.setTriggerStatus(0);
|
|
|
+ marketing.setCreatedTime(null);
|
|
|
+ Assert.isTrue(this.save(marketing), "复制营销活动失败");
|
|
|
+
|
|
|
+ List<MarketingAwards> marketingAwardsList = marketingAwardsService.list(new LambdaQueryWrapper<MarketingAwards>().eq(MarketingAwards::getMarketingId, marketingId));
|
|
|
+ if (CollectionUtils.isEmpty(marketingAwardsList)) {
|
|
|
+ throw new ServiceException("活动奖级信息不存在");
|
|
|
+ }
|
|
|
+ for (MarketingAwards marketingAwards : marketingAwardsList) {
|
|
|
+ List<MarketingAwardsPrize> marketingAwardsPrizeList = marketingAwardsPrizeService.list(new LambdaQueryWrapper<MarketingAwardsPrize>()
|
|
|
+ .eq(MarketingAwardsPrize::getMarketingId, marketingId)
|
|
|
+ .eq(MarketingAwardsPrize::getAwardsId, marketingAwards.getId()));
|
|
|
+ marketingAwards.setId(null);
|
|
|
+ marketingAwards.setMarketingId(marketing.getId());
|
|
|
+ Assert.isTrue(marketingAwardsService.save(marketingAwards),"复制营销活动奖级失败");
|
|
|
+ for (MarketingAwardsPrize marketingAwardsPrize : marketingAwardsPrizeList) {
|
|
|
+ marketingAwardsPrize.setId(null);
|
|
|
+ marketingAwardsPrize.setAwardsId(marketingAwards.getId());
|
|
|
+ marketingAwardsPrize.setMarketingId(marketing.getId());
|
|
|
+ }
|
|
|
+ Assert.isTrue(marketingAwardsPrizeService.saveBatch(marketingAwardsPrizeList),"复制营销活动奖品失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void generateCode(Long marketingId, Long userId) {
|
|
|
+
|
|
|
+ // 判断是否已经获取过
|
|
|
+ int count = marketingUserCodeService.count(new LambdaQueryWrapper<MarketingUserCode>()
|
|
|
+ .eq(MarketingUserCode::getUserId, userId)
|
|
|
+ .eq(MarketingUserCode::getMarketingId, marketingId)
|
|
|
+ .eq(MarketingUserCode::getHelpUserId, -1L));
|
|
|
+ if (count > 0) {
|
|
|
+ throw new ServiceException("您已经获取过抽奖码了");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 生成唯一抽奖码
|
|
|
+ String code = getOnlyCode(marketingId);
|
|
|
+
|
|
|
+ MarketingUserCode marketingUserCode = new MarketingUserCode();
|
|
|
+ // 设置活动id
|
|
|
+ marketingUserCode.setMarketingId(marketingId);
|
|
|
+ // 设置抽奖码
|
|
|
+ marketingUserCode.setCode(code);
|
|
|
+ // 设置用户
|
|
|
+ marketingUserCode.setUserId(userId);
|
|
|
+ // -1为无人助力获取抽奖码
|
|
|
+ marketingUserCode.setHelpUserId(-1L);
|
|
|
+ // 设置用户类型
|
|
|
+ marketingUserCode.setUserType(UserTypeEnum.ORDINARY.getValue());
|
|
|
+
|
|
|
+ // 保存助力信息
|
|
|
+ marketingUserCodeService.save(marketingUserCode);
|
|
|
+
|
|
|
+ Marketing marketing = this.getById(marketingId);
|
|
|
+
|
|
|
+
|
|
|
+ // 真实用户
|
|
|
+ int realNum = marketingUserCodeService.countRealUserNumByMarketingId(marketing.getId());
|
|
|
+ // 获取最新活动信息
|
|
|
+ marketing.setRealNum(realNum);
|
|
|
+ int randomNum = (int) 1 + (int) (Math.random() * 10);
|
|
|
+ marketing.setFakeNum(marketing.getFakeNum() + randomNum);
|
|
|
+ // 更新活动参与人数
|
|
|
+ boolean rtn = this.updateById(marketing);
|
|
|
+ Assert.isTrue(rtn, "更新活动参与人数异常。marketingId:" + marketing.getId());
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void lottery(Marketing marketing) {
|
|
|
|
|
|
// 用户抽奖池
|
|
|
String userLotteryPool = String.format(MARKETING_LOTTERY_ORDINARY_POOL, marketing.getId());
|
|
|
+ // 用户低阶奖池
|
|
|
+ String userLowLotteryPool = String.format(MARKETING_LOW_LOTTERY_ORDINARY_POOL, marketing.getId());
|
|
|
// 内部抽奖池
|
|
|
String insideLotteryPool = String.format(MARKETING_LOTTERY_INSIDE_POOL, marketing.getId());
|
|
|
|
|
@@ -144,7 +236,6 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
List<SysUser> insideUserList = sysUserService.selectUserListByRand(UserTypeEnum.INSIDE.getValue(), insideNum);
|
|
|
|
|
|
Set<String> insideCodes = new HashSet<>();
|
|
|
- Set<String> userCodes = new HashSet<>();
|
|
|
for (SysUser sysUser : insideUserList) {
|
|
|
// 生成抽奖码
|
|
|
String code = MarketingUtils.generatePrizeCode();
|
|
@@ -174,15 +265,32 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
redisCache.setCacheSet(insideLotteryPool, insideCodes);
|
|
|
|
|
|
|
|
|
- // 获取普通用户所有的抽奖码
|
|
|
+ // 获取普通用户拉新所获得的所有的抽奖码
|
|
|
List<MarketingUserCode> userCodeList = marketingUserCodeService.list(new LambdaQueryWrapper<MarketingUserCode>()
|
|
|
.eq(MarketingUserCode::getMarketingId, marketing.getId())
|
|
|
.eq(MarketingUserCode::getUserType, UserTypeEnum.ORDINARY.getValue()));
|
|
|
if (CollectionUtils.isNotEmpty(userCodeList)) {
|
|
|
- userCodes = userCodeList.stream().map(MarketingUserCode::getCode).collect(Collectors.toSet());
|
|
|
+ // 用户普通抽奖码
|
|
|
+ Set<String> userCodes = new HashSet<>();
|
|
|
+ // 用户低阶抽奖码
|
|
|
+ Set<String> userLowCodes = new HashSet<>();
|
|
|
+ for (MarketingUserCode marketingUserCode : userCodeList) {
|
|
|
+ if (marketingUserCode.getHelpUserId() == -1L) {
|
|
|
+ userLowCodes.add(marketingUserCode.getCode());
|
|
|
+ } else {
|
|
|
+ userCodes.add(marketingUserCode.getCode());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (CollectionUtils.isNotEmpty(userCodes)) {
|
|
|
+ // 将抽奖码放入普通抽奖池
|
|
|
+ redisCache.setCacheSet(userLotteryPool, userCodes);
|
|
|
+ }
|
|
|
+ if (CollectionUtils.isNotEmpty(userLowCodes)) {
|
|
|
+ // 将抽奖码放入低阶抽奖池
|
|
|
+ redisCache.setCacheSet(userLowLotteryPool, userLowCodes);
|
|
|
+ }
|
|
|
}
|
|
|
- // 将抽奖码放入普通抽奖池
|
|
|
- redisCache.setCacheSet(userLotteryPool, userCodes);
|
|
|
+
|
|
|
|
|
|
// 所有中奖名单
|
|
|
List<MarketingHitPrize> allHitPrizeList = new ArrayList<>();
|
|
@@ -224,10 +332,13 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
if (userNum > 0) {
|
|
|
// 设置普通用户抽奖信息
|
|
|
for (int i = 0; i < userNum; i++) {
|
|
|
- List<String> insideCodeList = redisCache.popCacheSet(userLotteryPool, 1);
|
|
|
+ List<String> hitCodeList = redisCache.popCacheSet(userLotteryPool, 1);
|
|
|
+ if (CollectionUtils.isEmpty(hitCodeList)) {
|
|
|
+ hitCodeList = redisCache.popCacheSet(userLowLotteryPool, 1);
|
|
|
+ }
|
|
|
MarketingUserCode marketingUserCode = marketingUserCodeService.getOne(new LambdaQueryWrapper<MarketingUserCode>()
|
|
|
.eq(MarketingUserCode::getMarketingId, marketing.getId())
|
|
|
- .eq(MarketingUserCode::getCode, insideCodeList.get(0)));
|
|
|
+ .eq(MarketingUserCode::getCode, hitCodeList.get(0)));
|
|
|
|
|
|
// 删除redis中该用户所有的抽奖码
|
|
|
List<MarketingUserCode> list = marketingUserCodeService.list(new LambdaQueryWrapper<MarketingUserCode>()
|
|
@@ -235,6 +346,7 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
.eq(MarketingUserCode::getUserId, marketingUserCode.getUserId()));
|
|
|
List<Object> delUserCodeList = list.stream().map(MarketingUserCode::getCode).collect(Collectors.toList());
|
|
|
redisCache.removeSetValueByKey(userLotteryPool, delUserCodeList);
|
|
|
+ redisCache.removeSetValueByKey(userLowLotteryPool, delUserCodeList);
|
|
|
MarketingHitPrize marketingHitPrize = exchangeMarketingHitPrize(marketing, allHitPrizeList, marketingAwards, marketingAwardsPrizeList, marketingUserCode);
|
|
|
|
|
|
userHitPrizeList.add(marketingHitPrize);
|
|
@@ -281,6 +393,7 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
|
|
|
// 删除抽奖池
|
|
|
redisCache.deleteObject(userLotteryPool);
|
|
|
+ redisCache.deleteObject(userLowLotteryPool);
|
|
|
redisCache.deleteObject(insideLotteryPool);
|
|
|
|
|
|
}
|
|
@@ -319,19 +432,8 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
if (count > 0) {
|
|
|
throw new ServiceException("您已经助力过了");
|
|
|
}
|
|
|
- // 生成抽奖码
|
|
|
- String code = "";
|
|
|
- while (true) {
|
|
|
- code = MarketingUtils.generatePrizeCode();
|
|
|
- // 判断抽奖码是否已经存在
|
|
|
- int codeCount = marketingUserCodeService.count(new LambdaQueryWrapper<MarketingUserCode>()
|
|
|
- .eq(MarketingUserCode::getMarketingId, marketing.getId())
|
|
|
- .eq(MarketingUserCode::getCode, code));
|
|
|
- if (codeCount > 0) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
+ // 生成唯一抽奖码
|
|
|
+ String code = getOnlyCode(marketing.getId());
|
|
|
|
|
|
MarketingUserCode marketingUserCode = new MarketingUserCode();
|
|
|
// 设置活动id
|
|
@@ -348,6 +450,20 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
marketingUserCodeService.save(marketingUserCode);
|
|
|
|
|
|
|
|
|
+ // 自己获得一个普通抽奖码
|
|
|
+ MarketingUserCode myCode= new MarketingUserCode();
|
|
|
+ myCode.setMarketingId(marketing.getId());
|
|
|
+ // 设置抽奖码
|
|
|
+ myCode.setCode(getOnlyCode(marketing.getId()));
|
|
|
+ // 设置被助力人
|
|
|
+ myCode.setUserId(userId);
|
|
|
+ myCode.setHelpUserId(-1L);
|
|
|
+ myCode.setUserType(UserTypeEnum.ORDINARY.getValue());
|
|
|
+
|
|
|
+ // 保存抽奖码
|
|
|
+ marketingUserCodeService.save(myCode);
|
|
|
+
|
|
|
+
|
|
|
// 真实用户
|
|
|
int realNum = marketingUserCodeService.countRealUserNumByMarketingId(marketing.getId());
|
|
|
|
|
@@ -365,6 +481,27 @@ public class MarketingServiceImpl extends ServiceImpl<MarketingMapper, Marketing
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取当前活动用户唯一的抽奖码
|
|
|
+ * @param marketingId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String getOnlyCode(Long marketingId) {
|
|
|
+ String code = "";
|
|
|
+ while (true) {
|
|
|
+ code = MarketingUtils.generatePrizeCode();
|
|
|
+ // 判断抽奖码是否已经存在
|
|
|
+ int codeCount = marketingUserCodeService.count(new LambdaQueryWrapper<MarketingUserCode>()
|
|
|
+ .eq(MarketingUserCode::getMarketingId, marketingId)
|
|
|
+ .eq(MarketingUserCode::getCode, code));
|
|
|
+ if (codeCount > 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return code;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void deleteById(Long id) {
|