Browse Source

调整用户发奖流程支持总分排名;用户总分排行榜调整

Eric 2 years ago
parent
commit
587ffdbfbc

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanDao.java

@@ -93,4 +93,15 @@ public interface ActivityPlanDao extends BaseMapper<ActivityPlan> {
 	 */
     List<ActivityRankingVo> selectActivityHighestScoreRankingInfo(@Param("activityId") Long activityId, @Param("subjectId") Long subjectId,
 																  @Param("rankingScore") Double rankingScore, @Param("limit") Integer limit);
+
+	/**
+	 * 总分用户排名信息
+	 * @param activityPlanId 活动ID
+	 * @param subjectId 声部ID
+	 * @param rankingScore 分数
+	 * @param userId 用户ID
+	 * @return ActivityRankingVo
+	 */
+	ActivityRankingVo selectActivityHighestScoreUserRanking(@Param("activityId") Long activityPlanId, @Param("subjectId") Long subjectId,
+															@Param("rankingScore") Double rankingScore, @Param("userId") Long userId);
 }

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

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.yonge.cooleshow.biz.dal.dao.ActivityEvaluationRecordDao;
+import com.yonge.cooleshow.biz.dal.dao.ActivityPlanDao;
 import com.yonge.cooleshow.biz.dal.dto.search.ActivityEvaluationRecordSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityEvaluation;
 import com.yonge.cooleshow.biz.dal.entity.ActivityEvaluationRecord;
@@ -47,6 +48,8 @@ public class ActivityEvaluationRecordServiceImpl extends ServiceImpl<ActivityEva
     private ActivityPlanService activityPlanService;
     @Autowired
     private MusicSheetService musicSheetService;
+    @Autowired
+    private ActivityPlanDao activityPlanMapper;
 
 	@Override
     public ActivityEvaluationRecordVo detail(Long id) {
@@ -210,7 +213,21 @@ public class ActivityEvaluationRecordServiceImpl extends ServiceImpl<ActivityEva
         if (activityPlan == null) {
             throw new BizException("活动已结束");
         }
-		return baseMapper.queryRankingList(activityPlanId, activityEvaluationId, limit,activityPlan.getRankingRule());
+
+        List<ActivityRankingVo> activityRankings;
+        // 活动排名
+        if (ActivityRankingMethodEnum.TOTAL_SCORE == activityPlan.getRankingMethod()) {
+
+            // 总分排名, 根据声部ID进行查询
+            activityRankings = activityPlanMapper.selectActivityHighestScoreRankingInfo(activityPlanId, activityEvaluationId,
+                    0D, limit);
+        } else {
+
+            // 单曲排名
+            activityRankings = baseMapper.queryRankingList(activityPlanId, activityEvaluationId, limit, activityPlan.getRankingRule());
+        }
+
+        return activityRankings;
 	}
 
 	@Override
@@ -219,7 +236,22 @@ public class ActivityEvaluationRecordServiceImpl extends ServiceImpl<ActivityEva
         if (activityPlan == null) {
             throw new BizException("活动已结束");
         }
-        return baseMapper.queryUserRanking(activityPlanId, activityEvaluationId, userId,activityPlan.getRankingRule());
+
+        // 用户排名信息
+        ActivityRankingVo userRanking;
+
+        if (ActivityRankingMethodEnum.TOTAL_SCORE == activityPlan.getRankingMethod()) {
+
+            // 总分排名
+            userRanking = activityPlanMapper.selectActivityHighestScoreUserRanking(activityPlanId, activityEvaluationId,
+                    0D, userId);
+        } else {
+
+            // 单曲排名
+            userRanking = baseMapper.queryUserRanking(activityPlanId, activityEvaluationId, userId, activityPlan.getRankingRule());
+        }
+
+        return userRanking;
 	}
 
     /**

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dao.ActivityPlanDao;
 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;
@@ -10,6 +11,7 @@ import com.yonge.cooleshow.biz.dal.entity.ActivityPlanReward;
 import com.yonge.cooleshow.biz.dal.entity.ActivityUserReward;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.activity.ActivityRankingMethodEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.ActivityPlanVo;
 import com.yonge.cooleshow.biz.dal.vo.ActivityRankingVo;
@@ -52,6 +54,8 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
 
     @Autowired
     private ActivityEvaluationService activityEvaluationService;
+    @Autowired
+    private ActivityPlanDao activityPlanMapper;
 
     @Override
     public boolean createOrUpdate(ActivityPlanDto activityPlan) {
@@ -86,7 +90,7 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
+    //@Transactional(rollbackFor = Exception.class)
     public void successActivity(Long activityId) {
         //关闭未付款订单
         closeActivity(activityId);
@@ -110,53 +114,114 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
         } catch (ParseException e) {
             e.printStackTrace();
         }
-        for (ActivityEvaluation activityEvaluation : activityEvaluationList) {
+        // 总分排名发奖流程
+        if (ActivityRankingMethodEnum.TOTAL_SCORE == detail.getRankingMethod()) {
 
-            List<ActivityRankingVo> activityRankingVos = activityEvaluationRecordService.queryRankingList(activityId,
-                                                              activityEvaluation.getId(),detail.getRanking());
-            for (int i = 0; i < activityRankingVos.size(); i++) {
+            // 查询活动获奖用户信息
+            List<ActivityRankingVo> rankingInfos = activityPlanMapper.selectActivityHighestScoreRankingInfo(detail.getId(), null,
+                    detail.getRankingScore(), 9999);
 
-                ActivityRankingVo activityRankingVo = activityRankingVos.get(i);
+            if (CollectionUtils.isEmpty(detail.getActivityRewardList())) {
+                // 活动未关联奖品,忽略后续流程
+                return;
+            }
 
-                List<ActivityPlanRewardDto> activityPlanRewardDtos = rewardMap.get(i + 1 + "");
-                if (CollectionUtils.isEmpty(activityPlanRewardDtos)) {
-                    continue;
-                }
+            // 活动关联奖品ID
+            List<Long> activityRewardIds = detail.getActivityRewardList().stream()
+                    .map(ActivityPlanReward::getId).collect(Collectors.toList());
 
-                // 活动关联奖品ID
-                List<Long> activityRewardIds = activityPlanRewardDtos.stream()
-                                   .map(ActivityPlanReward::getId).collect(Collectors.toList());
+            int ranking = 0;
+            for (ActivityRankingVo rankingInfo : rankingInfos) {
 
-                //给用户发放奖品 传入用户id和活动id
-                List<Long> collect = activityRewardService.sendReward(activityRankingVo.getUserId(), activityId, activityRewardIds, date);
+                // 推送发奖消息给用户
+                List<Long> collect = activityRewardService.sendReward(rankingInfo.getUserId(), activityId, activityRewardIds, date);
 
-                // 保存奖品发放记录
-                for (ActivityPlanRewardDto item : activityPlanRewardDtos) {
+                // 活动奖品信息
+                for (ActivityPlanRewardDto reward : detail.getActivityRewardList()) {
 
                     ActivityUserReward activityUserReward = new ActivityUserReward();
                     activityUserReward.setActivityId(activityId);
-                    activityUserReward.setBizId(activityEvaluation.getId());
-                    activityUserReward.setUserId(activityRankingVo.getUserId());
+                    activityUserReward.setBizId(rankingInfo.getResourceId());
+                    activityUserReward.setUserId(rankingInfo.getUserId());
                     activityUserReward.setRankingRule(detail.getRankingRule());
-                    activityUserReward.setRanking(i+1);
-                    activityUserReward.setGrantFlag(0);
-                    activityUserReward.setWinningTime(activityRankingVo.getJoinDate());
+                    activityUserReward.setRanking(ranking++);
+                    // 奖品发送状态
+                    activityUserReward.setGrantFlag(collect.contains(reward.getId()) ? 1 : 0);
+                    // 获取最高分时间
+                    activityUserReward.setWinningTime(rankingInfo.getJoinDate());
                     activityUserReward.setCreateTime(date);
                     activityUserReward.setUpdateTime(date);
-                    activityUserReward.setRewardId(item.getRewardId());
+                    activityUserReward.setRewardId(reward.getRewardId());
 
-                    // 奖品发送状态
-                    if (collect.contains(item.getId())) {
-                        activityUserReward.setGrantFlag(1);
-                    }
+                    // 添加发放记录
                     activityUserRewardList.add(activityUserReward);
                 }
 
+                // 若奖品数量超过1000,提交数据刷新缓存
+                if (activityUserRewardList.size() > 1000) {
+
+                    // 提交奖品发放记录
+                    activityUserRewardService.saveBatch(activityUserRewardList);
+
+                    // 清除缓存数据
+                    activityUserRewardList.clear();
+                }
+            }
+
+        } else {
+
+            // 曲目排名发奖流程
+            for (ActivityEvaluation activityEvaluation : activityEvaluationList) {
+
+                List<ActivityRankingVo> activityRankingVos = activityEvaluationRecordService.queryRankingList(activityId,
+                        activityEvaluation.getId(),detail.getRanking());
+                for (int i = 0; i < activityRankingVos.size(); i++) {
+
+                    ActivityRankingVo activityRankingVo = activityRankingVos.get(i);
+
+                    List<ActivityPlanRewardDto> activityPlanRewardDtos = rewardMap.get(i + 1 + "");
+                    if (CollectionUtils.isEmpty(activityPlanRewardDtos)) {
+                        continue;
+                    }
+
+                    // 活动关联奖品ID
+                    List<Long> activityRewardIds = activityPlanRewardDtos.stream()
+                            .map(ActivityPlanReward::getId).collect(Collectors.toList());
+
+                    //给用户发放奖品 传入用户id和活动id
+                    List<Long> collect = activityRewardService.sendReward(activityRankingVo.getUserId(), activityId, activityRewardIds, date);
+
+                    // 保存奖品发放记录
+                    for (ActivityPlanRewardDto item : activityPlanRewardDtos) {
+
+                        ActivityUserReward activityUserReward = new ActivityUserReward();
+                        activityUserReward.setActivityId(activityId);
+                        activityUserReward.setBizId(activityEvaluation.getId());
+                        activityUserReward.setUserId(activityRankingVo.getUserId());
+                        activityUserReward.setRankingRule(detail.getRankingRule());
+                        activityUserReward.setRanking(i+1);
+                        activityUserReward.setGrantFlag(0);
+                        activityUserReward.setWinningTime(activityRankingVo.getJoinDate());
+                        activityUserReward.setCreateTime(date);
+                        activityUserReward.setUpdateTime(date);
+                        activityUserReward.setRewardId(item.getRewardId());
+
+                        // 奖品发送状态
+                        if (collect.contains(item.getId())) {
+                            activityUserReward.setGrantFlag(1);
+                        }
+                        activityUserRewardList.add(activityUserReward);
+                    }
+
+                }
             }
+
         }
-        if (!CollectionUtils.isEmpty(activityUserRewardList)) {
+
+        if (CollectionUtils.isNotEmpty(activityUserRewardList)) {
             activityUserRewardService.saveBatch(activityUserRewardList);
         }
+
         //发完奖后将库存归还
         // activityPlanRewardService.recoveryReward(activityId);
     }

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

@@ -19,6 +19,7 @@ import com.yonge.cooleshow.biz.dal.entity.ActivityRewardChangeStock;
 import com.yonge.cooleshow.biz.dal.entity.CouponInfo;
 import com.yonge.cooleshow.biz.dal.entity.PianoRoomChangeRecord;
 import com.yonge.cooleshow.biz.dal.enums.*;
+import com.yonge.cooleshow.biz.dal.enums.activity.ActivityRankingMethodEnum;
 import com.yonge.cooleshow.biz.dal.mapper.CouponInfoMapper;
 import com.yonge.cooleshow.biz.dal.service.ActivityPlanRewardService;
 import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
@@ -39,8 +40,6 @@ 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;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -281,7 +280,10 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
 
             // 扣减奖品库存
             int update = activityPlanRewardService.reduceStock(activityId, item.getId());
-            if (update == 0) {
+
+            // 排除总分排名用户库存限制
+            if (ActivityRankingMethodEnum.TOTAL_SCORE != activityPlan.getRankingMethod()
+                    && update == 0) {
                 continue;
             }
 

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/ActivityRankingVo.java

@@ -27,6 +27,9 @@ public class ActivityRankingVo {
     @ApiModelProperty("次数")
     private int times;
 
+	@ApiModelProperty("资源ID")
+	private Long resourceId;
+
 	public double getScore() {
 		return score;
 	}
@@ -82,4 +85,12 @@ public class ActivityRankingVo {
 	public void setTimes(int times) {
 		this.times = times;
 	}
+
+	public Long getResourceId() {
+		return resourceId;
+	}
+
+	public void setResourceId(Long resourceId) {
+		this.resourceId = resourceId;
+	}
 }

+ 25 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanMapper.xml

@@ -169,15 +169,38 @@
     <select id="selectActivityHighestScoreRankingInfo"
             resultType="com.yonge.cooleshow.biz.dal.vo.ActivityRankingVo">
         SELECT
-            t1.score_, t1.user_id_, t2.avatar_ AS userAvatar, t2.username_ AS username
+            t1.score_, t1.user_id_, t1.resource_id_, t1.create_time_ AS joinDate, t1.times_, t2.avatar_ AS userAvatar, t2.username_ AS username
         FROM
             activity_evaluation_record t1 LEFT JOIN sys_user t2 ON t1.user_id_ = t2.id_
         WHERE
-            t1.activity_id_ = #{activityId} AND t1.resource_id_ = #{subjectId} AND t1.ranking_method_ = 'TOTAL_SCORE' AND t1.score_ > #{rankingScore}
+            t1.activity_id_ = #{activityId} AND t1.ranking_method_ = 'TOTAL_SCORE' AND t1.score_ > #{rankingScore}
+            <if test="subjectId != null">
+                AND t1.resource_id_ = #{subjectId}
+            </if>
         ORDER BY
             t1.score_ DESC,
             t1.registration_time_ ASC
         LIMIT #{limit}
     </select>
+
+    <select id="selectActivityHighestScoreUserRanking"
+            resultType="com.yonge.cooleshow.biz.dal.vo.ActivityRankingVo">
+        SELECT
+            t1.score_, t1.user_id_, t1.resource_id_, t1.create_time_ AS joinDate, t1.times_, t2.avatar_ AS userAvatar, t2.username_ AS username
+        FROM
+            activity_evaluation_record t1 LEFT JOIN sys_user t2 ON t1.user_id_ = t2.id_
+        WHERE
+            t1.activity_id_ = #{activityId} AND t1.ranking_method_ = 'TOTAL_SCORE' AND t1.score_ > #{rankingScore}
+            <if test="subjectId != null">
+                AND t1.resource_id_ = #{subjectId}
+            </if>
+            <if test="userId != null">
+                AND t1.user_id_ = #{userId}
+            </if>
+        ORDER BY
+            t1.score_ DESC,
+            t1.registration_time_ ASC
+        LIMIT 1
+    </select>
     <!--活动总分用户排名-->
 </mapper>