liujunchi преди 2 години
родител
ревизия
da7aef9a94

+ 18 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityEvaluationRecordDao.java

@@ -5,6 +5,7 @@ import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import com.yonge.cooleshow.biz.dal.enums.activity.ActivityRankingRuleEnum;
 import org.apache.ibatis.annotations.Param;
 
 import com.yonge.cooleshow.biz.dal.entity.ActivityEvaluationRecord;
@@ -38,24 +39,33 @@ public interface ActivityEvaluationRecordDao extends BaseMapper<ActivityEvaluati
 	 * @return
 	 */
     List<Long> getJoinEvaluationIdList(@Param("activityId") Long activityId, @Param("userId") Long userId);
-	
+
 	/**
 	 * 查询指定活动指定曲目的排行榜
-	 * @param activityPlanId 指定活动
+	 *
+	 * @param activityPlanId       指定活动
 	 * @param activityEvaluationId 指定曲目
-	 * @param limit 获奖人数
+	 * @param limit                获奖人数
+	 * @param rankingRule
 	 * @return
 	 */
-	List<ActivityRankingVo> queryRankingList(@Param("activityPlanId") Long activityPlanId, @Param("activityEvaluationId") Long activityEvaluationId, @Param("limit") int limit);
-	
-	ActivityRankingVo queryUserRanking(@Param("activityPlanId") Long activityPlanId, @Param("activityEvaluationId") Long activityEvaluationId, @Param("userId") Long userId);
+	List<ActivityRankingVo> queryRankingList(@Param("activityPlanId") Long activityPlanId, @Param(
+			"activityEvaluationId") Long activityEvaluationId, @Param("limit") int limit, @Param(
+			"rankRule") ActivityRankingRuleEnum rankingRule);
+
+	ActivityRankingVo queryUserRanking(@Param("activityPlanId") Long activityPlanId, @Param(
+			"activityEvaluationId") Long activityEvaluationId, @Param("userId") Long userId, @Param(
+			"rankRule") ActivityRankingRuleEnum rankRule);
 	
 	ActivityEvaluationRecord queryLastestRecord(@Param("activityPlanId") Long activityPlanId, @Param("userId") Long userId);
 
 	/**
 	 * 用户活动最高排名信息
-	 * @param userIds 用户ID
+	 *
+	 * @param userIds     用户ID
+	 * @param rankingRule
 	 * @return List<ActivityEvaluationRecord>
 	 */
-    List<ActivityEvaluationRecord> selectUserHighestRankingInfo(@Param("activityId") Long activityId, @Param("userIds") List<Long> userIds);
+	List<ActivityEvaluationRecord> selectUserHighestRankingInfo(@Param("activityId") Long activityId, @Param(
+			"userIds") List<Long> userIds, @Param("rankRule") ActivityRankingRuleEnum rankingRule);
 }

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

@@ -87,5 +87,7 @@ public interface ActivityRewardService extends IService<ActivityReward>  {
 	 * @param activityId 活动id
 	 * @return 返回发放成功奖品id
 	 */
-	List<Long> sendReward(Long userId, Long activityId);
+	List<Long> sendReward(Long userId, Long activityId,List<Long> rewardIdList);
+
+	Boolean userRewarded(Long userId, Long activityId);
 }

+ 24 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityEvaluationRecordServiceImpl.java

@@ -6,6 +6,9 @@ import java.util.List;
 import java.util.Optional;
 
 import com.google.common.collect.Lists;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
+import com.yonge.cooleshow.biz.dal.enums.activity.ActivityRankingRuleEnum;
+import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
 import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,6 +36,9 @@ public class ActivityEvaluationRecordServiceImpl extends ServiceImpl<ActivityEva
     @Autowired
     private ActivityEvaluationService activityEvaluationService;
 
+    @Autowired
+    private ActivityPlanService activityPlanService;
+
 	@Override
     public ActivityEvaluationRecordVo detail(Long id) {
         return baseMapper.detail(id);
@@ -91,14 +97,24 @@ public class ActivityEvaluationRecordServiceImpl extends ServiceImpl<ActivityEva
         activityEvaluationRecord.setActivityId(activityId);
         activityEvaluationRecord.setEvaluationId(activityEvaluation.getId());
         this.save(activityEvaluationRecord);
-    }	@Override
+    }
+
+    @Override
 	public List<ActivityRankingVo> queryRankingList(Long activityPlanId, Long activityEvaluationId, int limit) {
-		return baseMapper.queryRankingList(activityPlanId, activityEvaluationId, limit);
+        ActivityPlan activityPlan = activityPlanService.getById(activityPlanId);
+        if (activityPlan == null) {
+            throw new BizException("活动已结束");
+        }
+		return baseMapper.queryRankingList(activityPlanId, activityEvaluationId, limit,activityPlan.getRankingRule());
 	}
 
 	@Override
 	public ActivityRankingVo queryUserRanking(Long activityPlanId, Long activityEvaluationId, Long userId) {
-		return baseMapper.queryUserRanking(activityPlanId, activityEvaluationId, userId);
+        ActivityPlan activityPlan = activityPlanService.getById(activityPlanId);
+        if (activityPlan == null) {
+            throw new BizException("活动已结束");
+        }
+        return baseMapper.queryUserRanking(activityPlanId, activityEvaluationId, userId,activityPlan.getRankingRule());
 	}
 
     /**
@@ -114,9 +130,12 @@ public class ActivityEvaluationRecordServiceImpl extends ServiceImpl<ActivityEva
         if (CollectionUtils.isEmpty(userIds)) {
             return Lists.newArrayList();
         }
-
+        ActivityPlan activityPlan = activityPlanService.getById(activityId);
+        if (activityPlan == null) {
+            throw new BizException("活动已结束");
+        }
         // 用户最高排名信息
-        List<ActivityEvaluationRecord> records = getBaseMapper().selectUserHighestRankingInfo(activityId, userIds);
+        List<ActivityEvaluationRecord> records = getBaseMapper().selectUserHighestRankingInfo(activityId, userIds,activityPlan.getRankingRule());
 
         return Optional.ofNullable(records).orElse(Lists.newArrayList());
     }

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanDto;
+import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlanReward;
@@ -10,6 +11,7 @@ import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -19,7 +21,9 @@ import com.yonge.cooleshow.biz.dal.entity.ActivityPlanEvaluation;
 import com.yonge.cooleshow.biz.dal.dao.ActivityPlanEvaluationDao;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -76,7 +80,10 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
         closeActivity(activityId);
 
         //活动需要发放的奖品
-        List<ActivityUserReward> activityUserRewardList = baseMapper.getUserReward(activityId);
+        List<ActivityPlanRewardDto> activityPlanRewardDtos = activityPlanRewardService.queryActivityPlanReward(
+                activityId);
+        Map<String, List<Long>> collect = activityPlanRewardDtos.stream()
+                                             .collect(Collectors.groupingBy(ActivityPlanReward::getGroup,));
 
         Set<Long> userIds = activityUserRewardList.stream().map(ActivityUserReward::getUserId).collect(Collectors.toSet());
 

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

@@ -50,6 +50,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Collectors;
+import java.util.*;
 
 
 @Service
@@ -77,6 +78,9 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
     private ActivityPlanRewardService activityPlanRewardService;
 
     @Autowired
+    private ActivityRewardService activityRewardService;
+
+    @Autowired
     private MemberPriceSettingsService memberPriceSettingsService;
 
     @Override
@@ -180,56 +184,59 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public List<Long> sendReward(Long userId, Long activityId) {
+    public List<Long> sendReward(Long userId, Long activityId,List<Long> rewardIdList) {
         if (userRewarded(userId, activityId)) {
             return new ArrayList<>();
         }
         ActivityPlan activityPlan = activityPlanService.getById(activityId);
         if (activityPlan == null) {
             log.warn("活动不存在");
-            return null;
+            return new ArrayList<>();
+        }
+        if (CollectionUtils.isEmpty(rewardIdList)) {
+            log.warn("奖品不存在");
+            return new ArrayList<>();
         }
 
-        List<ActivityPlanRewardDto> activityPlanRewardDtos = activityPlanRewardService.queryActivityPlanReward(
-                activityId);
+        Collection<ActivityReward> activityRewards = activityRewardService.listByIds(rewardIdList);
 
-        if (CollectionUtils.isEmpty(activityPlanRewardDtos)) {
+        if (CollectionUtils.isEmpty(activityRewards)) {
             return new ArrayList<>();
         }
 
         // 级联锁同时处理奖品库存
-        List<RLock> lockList = new ArrayList<>();
-        for (ActivityPlanRewardDto activityReward : activityPlanRewardDtos) {
-            lockList.add(redissonClient.getLock(CacheNameEnum.LOCK_ACTIVITY_REWARD_STOCK.getRedisKey(activityReward.getId())));
-        }
-
-        RedissonMultiLock lock = new RedissonMultiLock(lockList.toArray(new RLock[lockList.size()]));
+        // List<RLock> lockList = new ArrayList<>();
+        // for (ActivityPlanRewardDto activityReward : activityPlanRewardDtos) {
+        //     lockList.add(redissonClient.getLock(CacheNameEnum.LOCK_ACTIVITY_REWARD_STOCK.getRedisKey(activityReward.getId())));
+        // }
+        //
+        // RedissonMultiLock lock = new RedissonMultiLock(lockList.toArray(new RLock[lockList.size()]));
 
         List<Long> activityRewardIdList = new ArrayList<>();
         List<String> rewardNameList = new ArrayList<>();
         try {
-            lock.lock();
-            for (ActivityPlanRewardDto activityReward : activityPlanRewardDtos) {
-                int update = activityPlanRewardService.reduceStock(activityId, activityReward.getActivityReward().getId());
-                if (update == 0) {
-                    continue;
-                }
-                if (activityReward.getActivityReward().getRewardType().equals(RewardTypeEnum.PIAMO_ROOM)) {
+            // lock.lock();
+            for (ActivityReward activityReward : activityRewards) {
+                // int update = activityPlanRewardService.reduceStock(activityId, activityReward.getActivityReward().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.getActivityReward().getNum());
+                    pianoRoomChangeRecord.setTimes(activityReward.getNum());
                     pianoRoomChangeRecord.setBizId(activityId.toString());
                     pianoRoomChangeRecord.setCreateTime(new Date());
                     pianoRoomChangeRecord.setReason(activityPlan.getActivityName());
                     pianoRoomChangeRecordService.add(pianoRoomChangeRecord);
-                } else if (activityReward.getActivityReward().getRewardType().equals(RewardTypeEnum.VIP)) {
+                } else if (activityReward.getRewardType().equals(RewardTypeEnum.VIP)) {
                     memberPriceSettingsService.activityReward(userId, activityPlan.getActivityClient(),
-                                                              activityReward.getActivityReward(), activityId,activityPlan.getActivityName());
+                                                              activityReward, activityId,activityPlan.getActivityName());
                 }
-                rewardNameList.add(activityReward.getActivityReward().getRewardName());
-                activityRewardIdList.add(activityReward.getActivityReward().getId());
+                rewardNameList.add(activityReward.getRewardName());
+                activityRewardIdList.add(activityReward.getId());
             }
             // 发送活动获奖推送
             if (!CollectionUtils.isEmpty(rewardNameList)) {
@@ -237,13 +244,14 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
                 sendActivityMessage(userId, activityPlan.getActivityName(),name, activityPlan.getActivityClient());
             }
         } finally {
-            lock.unlock();
+            // lock.unlock();
         }
 
         return activityRewardIdList;
     }
 
-    private Boolean userRewarded(Long userId, Long activityId) {
+    @Override
+    public Boolean userRewarded(Long userId, Long activityId) {
         return baseMapper.userRewarded(userId, activityId);
     }
 

+ 13 - 3
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityEvaluationRecordMapper.xml

@@ -50,7 +50,11 @@
         left join subject s on s.id_ = stu.subject_id_
 		where aer.activity_id_ = #{activityPlanId} and aer.evaluation_id_ = #{activityEvaluationId} and aer.score_ >= 0
 		order by aer.score_ desc,aer.times_ asc, aer.id_ asc limit 1000000
-		) a group by userId order by score desc,times asc,id_ asc
+		) a group by userId order by score desc,
+        <if test="rankRule != null and rankRule.code == 'EVALUATIONS_NUMBER'">
+            times asc,
+        </if>
+        id_ asc
 		limit #{limit}
     </select>
 
@@ -61,7 +65,11 @@
         left join subject s on s.id_ = stu.subject_id_
 		where aer.id_ in (select * from (
 		select aer.id_ from activity_evaluation_record aer where aer.activity_id_ = #{activityPlanId} and aer.evaluation_id_ = #{activityEvaluationId} and aer.user_id_ = #{userId} and aer.score_ >= 0
-		order by aer.score_ desc,aer.times_ asc, aer.id_ asc limit 1) a
+		order by aer.score_ desc,
+        <if test="rankRule != null and rankRule.code == 'EVALUATIONS_NUMBER'">
+            aer.times_ asc,
+        </if>
+         aer.id_ asc limit 1) a
 		) 
     </select>
 
@@ -90,7 +98,9 @@
                  t1.activity_id_ = #{activityId}
              ORDER BY
                  t1.score_ DESC,
-                 t1.times_ ASC,
+                <if test="rankRule != null and rankRule.code == 'EVALUATIONS_NUMBER'">
+                    t1.times_ asc,
+                </if>
                  t1.id_ ASC
              ) t
         WHERE t.userId IN (<foreach collection="userIds" separator="," item="item">#{item}</foreach>)