|
@@ -38,6 +38,7 @@ import com.yonge.toolset.base.exception.BizException;
|
|
import com.yonge.toolset.payment.util.DistributedLock;
|
|
import com.yonge.toolset.payment.util.DistributedLock;
|
|
import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
|
|
import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
|
|
+import org.apache.commons.collections.MapUtils;
|
|
import org.redisson.RedissonMultiLock;
|
|
import org.redisson.RedissonMultiLock;
|
|
import org.redisson.api.RLock;
|
|
import org.redisson.api.RLock;
|
|
import org.redisson.api.RedissonClient;
|
|
import org.redisson.api.RedissonClient;
|
|
@@ -55,6 +56,7 @@ import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
import java.util.Optional;
|
|
import java.util.Optional;
|
|
|
|
+import java.util.function.Function;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
@@ -236,7 +238,7 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
- public List<Long> sendReward(Long userId, Long activityId, List<Long> rewardIdList, Date date) {
|
|
|
|
|
|
+ public List<Long> sendReward(Long userId, Long activityId, List<Long> activityRewardIds, Date date) {
|
|
if (userRewarded(userId, activityId)) {
|
|
if (userRewarded(userId, activityId)) {
|
|
return new ArrayList<>();
|
|
return new ArrayList<>();
|
|
}
|
|
}
|
|
@@ -245,69 +247,82 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
|
|
log.warn("活动不存在");
|
|
log.warn("活动不存在");
|
|
return new ArrayList<>();
|
|
return new ArrayList<>();
|
|
}
|
|
}
|
|
- if (CollectionUtils.isEmpty(rewardIdList)) {
|
|
|
|
|
|
+ if (CollectionUtils.isEmpty(activityRewardIds)) {
|
|
log.warn("奖品不存在");
|
|
log.warn("奖品不存在");
|
|
return new ArrayList<>();
|
|
return new ArrayList<>();
|
|
}
|
|
}
|
|
|
|
|
|
- Collection<ActivityReward> activityRewards = activityRewardService.listByIds(rewardIdList);
|
|
|
|
|
|
+ // 根据活动关联奖品ID,查询奖品信息
|
|
|
|
+ Collection<ActivityPlanReward> activityRewards = activityPlanRewardService.listByIds(activityRewardIds);
|
|
|
|
|
|
- if (CollectionUtils.isEmpty(activityRewards)) {
|
|
|
|
- return new ArrayList<>();
|
|
|
|
- }
|
|
|
|
|
|
+ // 活动奖品信息
|
|
|
|
+ List<Long> rewardIds = activityRewards.stream()
|
|
|
|
+ .map(ActivityPlanReward::getRewardId).distinct().collect(Collectors.toList());
|
|
|
|
|
|
- // 级联锁同时处理奖品库存
|
|
|
|
- List<RLock> lockList = new ArrayList<>();
|
|
|
|
- for (ActivityReward activityReward : activityRewards) {
|
|
|
|
- lockList.add(redissonClient.getLock(CacheNameEnum.LOCK_ACTIVITY_REWARD_STOCK.getRedisKey(activityReward.getId())));
|
|
|
|
- }
|
|
|
|
|
|
+ Map<Long, ActivityReward> rewardInfoMap = activityRewardService.listByIds(rewardIds).stream()
|
|
|
|
+ .collect(Collectors.toMap(ActivityReward::getId, Function.identity(), (o, n) -> n));
|
|
|
|
|
|
- RedissonMultiLock lock = new RedissonMultiLock(lockList.toArray(new RLock[lockList.size()]));
|
|
|
|
|
|
+ if (MapUtils.isEmpty(rewardInfoMap)) {
|
|
|
|
+ return new ArrayList<>();
|
|
|
|
+ }
|
|
|
|
|
|
List<Long> activityRewardIdList = new ArrayList<>();
|
|
List<Long> activityRewardIdList = new ArrayList<>();
|
|
List<String> rewardNameList = new ArrayList<>();
|
|
List<String> rewardNameList = new ArrayList<>();
|
|
- try {
|
|
|
|
- lock.lock();
|
|
|
|
- for (ActivityReward activityReward : activityRewards) {
|
|
|
|
- int update = activityPlanRewardService.reduceStock(activityId, activityReward.getId());
|
|
|
|
- if (update == 0) {
|
|
|
|
|
|
+
|
|
|
|
+ ActivityReward activityReward;
|
|
|
|
+ for (ActivityPlanReward item : activityRewards) {
|
|
|
|
+
|
|
|
|
+ if (!rewardInfoMap.containsKey(item.getRewardId())) {
|
|
|
|
+ // 没有匹配奖品信息,读取下一行数据
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ activityReward = rewardInfoMap.get(item.getRewardId());
|
|
|
|
+
|
|
|
|
+ // 扣减奖品库存
|
|
|
|
+ int update = activityPlanRewardService.reduceStock(activityId, item.getId());
|
|
|
|
+ if (update == 0) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (activityReward.getRewardType().equals(RewardTypeEnum.PIAMO_ROOM)) {
|
|
|
|
+ // 琴房课时
|
|
|
|
+ PianoRoomChangeRecord pianoRoomChangeRecord = new PianoRoomChangeRecord();
|
|
|
|
+ pianoRoomChangeRecord.setUserId(userId);
|
|
|
|
+ pianoRoomChangeRecord.setInOrOut(InOrOutEnum.IN);
|
|
|
|
+ pianoRoomChangeRecord.setSourceType(SourceTypeEnum.ACTIVITY);
|
|
|
|
+ pianoRoomChangeRecord.setTimes(activityReward.getNum());
|
|
|
|
+ pianoRoomChangeRecord.setBizId(activityId.toString());
|
|
|
|
+ pianoRoomChangeRecord.setCreateTime(new Date());
|
|
|
|
+ pianoRoomChangeRecord.setReason(activityPlan.getActivityName());
|
|
|
|
+ pianoRoomChangeRecordService.add(pianoRoomChangeRecord);
|
|
|
|
+ } else if (activityReward.getRewardType().equals(RewardTypeEnum.VIP)) {
|
|
|
|
+ // VIP
|
|
|
|
+ memberPriceSettingsService.activityReward(userId, activityPlan.getActivityClient(),
|
|
|
|
+ activityReward, activityId,activityPlan.getActivityName());
|
|
|
|
+ } else if (activityReward.getRewardType().equals(RewardTypeEnum.COUPON)) {
|
|
|
|
+ // 优惠券
|
|
|
|
+ List<UserParam> list = new ArrayList<>();
|
|
|
|
+ UserParam userParam = new UserParam();
|
|
|
|
+ userParam.setUserId(userId);
|
|
|
|
+ userParam.setClientType(activityPlan.getActivityClient());
|
|
|
|
+ list.add(userParam);
|
|
|
|
+ Boolean issueCoupon = couponIssueService.issueCoupon(activityReward.getCouponId(), list, null, activityPlan.getActivityName(),
|
|
|
|
+ false, false, SendTypeEnum.ACTIVITY,date);
|
|
|
|
+ if (!issueCoupon) {
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
- if (activityReward.getRewardType().equals(RewardTypeEnum.PIAMO_ROOM)) {
|
|
|
|
- PianoRoomChangeRecord pianoRoomChangeRecord = new PianoRoomChangeRecord();
|
|
|
|
- pianoRoomChangeRecord.setUserId(userId);
|
|
|
|
- pianoRoomChangeRecord.setInOrOut(InOrOutEnum.IN);
|
|
|
|
- pianoRoomChangeRecord.setSourceType(SourceTypeEnum.ACTIVITY);
|
|
|
|
- pianoRoomChangeRecord.setTimes(activityReward.getNum());
|
|
|
|
- pianoRoomChangeRecord.setBizId(activityId.toString());
|
|
|
|
- pianoRoomChangeRecord.setCreateTime(new Date());
|
|
|
|
- pianoRoomChangeRecord.setReason(activityPlan.getActivityName());
|
|
|
|
- pianoRoomChangeRecordService.add(pianoRoomChangeRecord);
|
|
|
|
- } else if (activityReward.getRewardType().equals(RewardTypeEnum.VIP)) {
|
|
|
|
- memberPriceSettingsService.activityReward(userId, activityPlan.getActivityClient(),
|
|
|
|
- activityReward, activityId,activityPlan.getActivityName());
|
|
|
|
- } else if (activityReward.getRewardType().equals(RewardTypeEnum.COUPON)) {
|
|
|
|
- List<UserParam> list = new ArrayList<>();
|
|
|
|
- UserParam userParam = new UserParam();
|
|
|
|
- userParam.setUserId(userId);
|
|
|
|
- userParam.setClientType(activityPlan.getActivityClient());
|
|
|
|
- list.add(userParam);
|
|
|
|
- Boolean issueCoupon = couponIssueService.issueCoupon(activityReward.getCouponId(), list, null, activityPlan.getActivityName(),
|
|
|
|
- false, false, SendTypeEnum.ACTIVITY,date);
|
|
|
|
- if (!issueCoupon) {
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- rewardNameList.add(activityReward.getRewardName());
|
|
|
|
- activityRewardIdList.add(activityReward.getId());
|
|
|
|
- }
|
|
|
|
- // 发送活动获奖推送
|
|
|
|
- if (!CollectionUtils.isEmpty(rewardNameList)) {
|
|
|
|
- String name = String.join(",", rewardNameList);
|
|
|
|
- sendActivityMessage(userId, activityPlan.getActivityName(),name, activityPlan.getActivityClient());
|
|
|
|
}
|
|
}
|
|
- } finally {
|
|
|
|
- lock.unlock();
|
|
|
|
|
|
+ // 获取推送奖品消息信息
|
|
|
|
+ rewardNameList.add(activityReward.getRewardName());
|
|
|
|
+ // 关联返回数据,更新用户奖品发送状态
|
|
|
|
+ activityRewardIdList.add(item.getId());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 发送活动获奖推送
|
|
|
|
+ if (!CollectionUtils.isEmpty(rewardNameList)) {
|
|
|
|
+ String name = String.join(",", rewardNameList);
|
|
|
|
+ sendActivityMessage(userId, activityPlan.getActivityName(),name, activityPlan.getActivityClient());
|
|
}
|
|
}
|
|
|
|
|
|
return activityRewardIdList;
|
|
return activityRewardIdList;
|