Przeglądaj źródła

调整奖品发送校验规则

Eric 2 lat temu
rodzic
commit
bb281c5819

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanRewardDao.java

@@ -50,7 +50,7 @@ public interface ActivityPlanRewardDao extends BaseMapper<ActivityPlanReward>{
 	 * 减少库存
 	 *
 	 * @param activityId 活动id
-	 * @param rewardId   奖品id
+	 * @param activityRewardId   活动关闻奖品id
 	 */
-	int reduceStock(@Param("activityId") Long activityId, @Param("rewardId") Long rewardId);
+	int reduceStock(@Param("activityId") Long activityId, @Param("activityRewardId") Long activityRewardId);
 }

+ 3 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanRewardService.java

@@ -71,9 +71,9 @@ public interface ActivityPlanRewardService extends IService<ActivityPlanReward>
     Boolean recoveryReward(ActivityPlanReward reward);
 	/**
 	 * 减少库存
-	 *  @param activityId 活动id
-	 * @param rewardId   奖品id
+	 * @param activityId 活动id
+	 * @param activityRewardId  活动关闻奖品id
 	 * @return
 	 */
-    int reduceStock(Long activityId, Long rewardId);
+    int reduceStock(Long activityId, Long activityRewardId);
 }

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityRewardService.java

@@ -86,10 +86,11 @@ public interface ActivityRewardService extends IService<ActivityReward>  {
 	 * 发放获奖奖品
 	 * @param userId 用户id
 	 * @param activityId 活动id
+	 * @param activityRewardIds 活动关联奖品ID
 	 * @param date
 	 * @return 返回发放成功奖品id
 	 */
-	List<Long> sendReward(Long userId, Long activityId, List<Long> rewardIdList, Date date);
+	List<Long> sendReward(Long userId, Long activityId, List<Long> activityRewardIds, Date date);
 
 	Boolean userRewarded(Long userId, Long activityId);
 }

+ 11 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanEvaluationServiceImpl.java

@@ -113,16 +113,17 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
                     continue;
                 }
 
-                List<Long> rewardIdList = activityPlanRewardDtos.stream()
-                                   .map(activityPlanRewardDto -> activityPlanRewardDto.getActivityReward().getId())
-                                   .collect(Collectors.toList());
+                // 活动关联奖品ID
+                List<Long> activityRewardIds = activityPlanRewardDtos.stream()
+                                   .map(ActivityPlanReward::getId).collect(Collectors.toList());
 
                 Date date = new Date();
                 //给用户发放奖品 传入用户id和活动id
-                List<Long> successRewardIds = activityRewardService.sendReward(activityRankingVo.getUserId(), activityId,rewardIdList,date);
+                List<Long> collect = activityRewardService.sendReward(activityRankingVo.getUserId(), activityId, activityRewardIds, date);
 
                 // 保存奖品发放记录
-                for (Long rewardId : rewardIdList) {
+                for (ActivityPlanRewardDto item : activityPlanRewardDtos) {
+
                     ActivityUserReward activityUserReward = new ActivityUserReward();
                     activityUserReward.setActivityId(activityId);
                     activityUserReward.setBizId(activityEvaluation.getId());
@@ -133,12 +134,15 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
                     activityUserReward.setWinningTime(activityRankingVo.getJoinDate());
                     activityUserReward.setCreateTime(date);
                     activityUserReward.setUpdateTime(date);
-                    activityUserReward.setRewardId(rewardId);
-                    if (successRewardIds.contains(rewardId)) {
+                    activityUserReward.setRewardId(item.getRewardId());
+
+                    // 奖品发送状态
+                    if (collect.contains(item.getId())) {
                         activityUserReward.setGrantFlag(1);
                     }
                     activityUserRewardList.add(activityUserReward);
                 }
+
             }
         }
         if (!CollectionUtils.isEmpty(activityUserRewardList)) {

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanRewardServiceImpl.java

@@ -186,8 +186,8 @@ public class ActivityPlanRewardServiceImpl extends ServiceImpl<ActivityPlanRewar
     }
 
     @Override
-    public int reduceStock(Long activityId, Long rewardId) {
-        return baseMapper.reduceStock(activityId, rewardId);
+    public int reduceStock(Long activityId, Long activityRewardId) {
+        return baseMapper.reduceStock(activityId, activityRewardId);
     }
 
 }

+ 7 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanStandardServiceImpl.java

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.biz.dal.dto.ActivityPlanDto;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
 import com.yonge.cooleshow.biz.dal.dto.search.UserFirstTimeSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlanReward;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlanStandard;
 import com.yonge.cooleshow.biz.dal.entity.ActivityRegistration;
 import com.yonge.cooleshow.biz.dal.entity.ActivityUserReward;
@@ -157,10 +158,6 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
     }
 
     private void sendUserReward(Long userId, Long activityId, Date winningTime, List<ActivityPlanRewardDto> activityPlanRewardDtos) {
-        List<Long> rewardIdList = activityPlanRewardDtos.stream()
-                                                   .map(activityPlanRewardDto -> activityPlanRewardDto.getActivityReward()
-                                                                                                      .getId())
-                                                   .collect(Collectors.toList());
 
         Date date = DateTime.now().toDate(); // 发奖时间
         try {
@@ -170,8 +167,12 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
             log.warn("sendUserReward TIME_CONVERT, userId={}, activityId={}, winningTime={}", userId, activityId, winningTime);
         }
 
+        // 活动关联奖品ID
+        List<Long> activityRewardIds = activityPlanRewardDtos.stream()
+                .map(ActivityPlanReward::getId).collect(Collectors.toList());
+
         //给用户发奖
-        List<Long> successRewardIds = activityRewardService.sendReward(userId, activityId, rewardIdList, date);
+        List<Long> collect = activityRewardService.sendReward(userId, activityId, activityRewardIds, date);
 
         for (ActivityPlanRewardDto dto : activityPlanRewardDtos) {
             ActivityUserReward userReward = new ActivityUserReward();
@@ -179,8 +180,7 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
             userReward.setUserId(userId);
             userReward.setRewardId(dto.getRewardId());
 
-            Optional<Long> first = successRewardIds.stream().filter(o -> o.equals(dto.getRewardId())).findFirst();
-            userReward.setGrantFlag(first.isPresent() ? 1 : 0);
+            userReward.setGrantFlag(collect.contains(dto.getId()) ? 1 : 0);
             userReward.setWinningTime(winningTime); // 获将时间
             userReward.setCreateTime(date); // 发奖时间
 

+ 66 - 51
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRewardServiceImpl.java

@@ -38,6 +38,7 @@ import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
 import org.redisson.RedissonMultiLock;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
@@ -55,6 +56,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 
@@ -236,7 +238,7 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
 
     @Override
     @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)) {
             return new ArrayList<>();
         }
@@ -245,69 +247,82 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
             log.warn("活动不存在");
             return new ArrayList<>();
         }
-        if (CollectionUtils.isEmpty(rewardIdList)) {
+        if (CollectionUtils.isEmpty(activityRewardIds)) {
             log.warn("奖品不存在");
             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<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;
                 }
-                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;

+ 1 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanRewardMapper.xml

@@ -86,6 +86,6 @@
 
 
 	<update id="reduceStock">
-        update activity_plan_reward set reward_stock_ = reward_stock_ - 1 where #{activityId} = activity_id_ and #{rewardId} = reward_id_ and reward_stock_ > 0
+        update activity_plan_reward set reward_stock_ = reward_stock_ - 1 where id_ = #{activityRewardId} AND activity_id_ = #{activityId} and reward_stock_ > 0
     </update>
 </mapper>