Parcourir la source

学生端评测活动支持声部多曲目

Eric il y a 2 ans
Parent
commit
f73cb0a9fd

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityEvaluationDao.java

@@ -9,6 +9,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.vo.ActivityMusicVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
 import com.yonge.cooleshow.biz.dal.vo.activity.ActivityTeacherWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import org.apache.ibatis.annotations.Param;
 import com.yonge.cooleshow.biz.dal.entity.ActivityEvaluation;
 import com.yonge.cooleshow.biz.dal.vo.ActivityEvaluationVo;
@@ -85,4 +86,12 @@ public interface ActivityEvaluationDao extends BaseMapper<ActivityEvaluation> {
 	 * @return List<ActivityTeacherWrapper>
 	 */
 	List<ActivityTeacherWrapper> selectActivityTeacherByTimePageInfo(@Param("page") IPage<ActivityTeacherWrapper> page, @Param("record") ActivityTeacherQuery query);
+
+	/**
+	 * 评测活动声部曲目最高分
+	 * @param activityId 活动ID
+	 * @param userId 用户ID
+	 * @return List<StatGroupWrapper>
+	 */
+    List<StatGroupWrapper> selectSubjectMusicHighestScoreStat(@Param("activityId") Long activityId, @Param("userId") Long userId);
 }

+ 49 - 10
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityEvaluationServiceImpl.java

@@ -27,11 +27,12 @@ import com.yonge.cooleshow.biz.dal.vo.ActivityMusicVo;
 import com.yonge.cooleshow.biz.dal.vo.ActivityRankingVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
 import com.yonge.cooleshow.biz.dal.vo.activity.ActivityTeacherWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.common.enums.ActivityResourceEnum;
 import com.yonge.cooleshow.common.enums.ActivityTypeEnum;
 import com.yonge.cooleshow.common.enums.EStatus;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.exception.BizException;
-import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,7 +40,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Arrays;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -204,17 +204,56 @@ public class ActivityEvaluationServiceImpl extends ServiceImpl<ActivityEvaluatio
 
     @Override
     public List<ActivityMusicVo> getActivityMusic(Long activityPlanId, Long userId) {
+
+        // 活动曲目信息
         List<ActivityMusicVo> result = baseMapper.selectActivityMusic(activityPlanId, userId);
-        for (ActivityMusicVo activityMusicVo : result) {
-        	List<ActivityRankingVo> rankingList =  activityEvaluationRecordService.queryRankingList(activityPlanId, activityMusicVo.getEvaluationId(), 1);
-            if (rankingList != null && rankingList.size() > 0) {
-                activityMusicVo.setUserSubject(rankingList.get(0).getUserSubject());
-                activityMusicVo.setScore(rankingList.get(0).getScore());
-                activityMusicVo.setUserAvatar(rankingList.get(0).getUserAvatar());
-                activityMusicVo.setUsername(rankingList.get(0).getUsername());
-                activityMusicVo.setUserId(rankingList.get(0).getUserId());
+
+        // 活动信息
+        ActivityPlan activity = activityPlanService.getById(activityPlanId);
+        if (Objects.isNull(activity)) {
+            throw new BizException("无效的活动ID");
+        }
+
+        // 评测活动
+        if (ActivityTypeEnum.EVALUATION == activity.getActivityType()) {
+
+
+            // 单曲排名,计算每一个曲目的最高分
+            if (ActivityRankingMethodEnum.MUSIC_RANKING == activity.getRankingMethod()) {
+
+                result.parallelStream().forEach(item -> {
+
+                    List<ActivityRankingVo> rankingList =  activityEvaluationRecordService.queryRankingList(activityPlanId, item.getEvaluationId(), 1);
+                    if (rankingList != null && rankingList.size() > 0) {
+                        item.setUserSubject(rankingList.get(0).getUserSubject());
+                        item.setScore(rankingList.get(0).getScore());
+                        item.setUserAvatar(rankingList.get(0).getUserAvatar());
+                        item.setUsername(rankingList.get(0).getUsername());
+                        item.setUserId(rankingList.get(0).getUserId());
+                    }
+
+                });
+
+            }
+
+            // 总分排名
+            if (ActivityRankingMethodEnum.TOTAL_SCORE == activity.getRankingMethod()) {
+
+                Map<Long, Double> collect = Maps.newHashMap();
+                if (result.stream().anyMatch(x -> x.getJoin() == YesOrNoEnum.YES)) {
+
+                    collect = getBaseMapper().selectSubjectMusicHighestScoreStat(activity.getId(), userId).stream()
+                            .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getNumber, (o, n) -> n));
+                }
+
+                for (ActivityMusicVo item : result) {
+
+                    item.setScore(collect.getOrDefault(item.getEvaluationId(), 0D));
+                }
             }
+
         }
+
         return result;
     }
 

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

@@ -27,6 +27,7 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.EQueryOp;
 import com.yonge.cooleshow.biz.dal.enums.MK;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.activity.ActivityRankingMethodEnum;
 import com.yonge.cooleshow.biz.dal.service.ActivityEvaluationRecordService;
 import com.yonge.cooleshow.biz.dal.service.ActivityEvaluationService;
 import com.yonge.cooleshow.biz.dal.service.ActivityPlanEvaluationService;
@@ -488,6 +489,11 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
     @Override
     public MusicActivityVo getActivityInfo(Long activityPlanId, SysUser user) {
         ActivityPlan activityPlan = this.getById(activityPlanId);
+
+        if (Objects.isNull(activityPlan)) {
+            throw new BizException("无效的活动ID");
+        }
+
         if (activityPlan.getActivityState() != 1) {
             activityPlan.setActivityState(0);
         }
@@ -501,9 +507,48 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
         }
 
 
-        // 活动曲目
-        List<ActivityMusicVo> activityMusicVoList = activityEvaluationService.getActivityMusic(activityPlanId, userId);
-        activityVo.setActivityMusicVoList(activityMusicVoList);
+        // 评测活动曲目信息
+        if (ActivityTypeEnum.EVALUATION == activityPlan.getActivityType() && Objects.nonNull(userId)) {
+
+            // 活动曲目
+            List<ActivityMusicVo> activityMusicVoList = activityEvaluationService.getActivityMusic(activityPlanId, userId);
+            activityVo.setActivityMusicVoList(activityMusicVoList);
+
+            // 评测难度
+            String evaluationDifficulty = baseMapper.selectActivityPlanEvaluation(activityPlanId);
+            activityVo.setEvaluationDifficulty(evaluationDifficulty);
+
+            // 计算评测活动声部最高分
+            if (ActivityRankingMethodEnum.TOTAL_SCORE == activityPlan.getRankingMethod()) {
+
+                Map<Long, List<ActivityMusicVo>> collect = activityMusicVoList.stream()
+                        .collect(Collectors.groupingBy(x -> Long.parseLong(x.getSubjectId().split(",")[0])));
+
+                List<MusicActivityVo.SubjectInfo> subjectInfos = Lists.newArrayList();
+                ActivityMusicVo musicVo;
+                for (Map.Entry<Long, List<ActivityMusicVo>> entry : collect.entrySet()) {
+
+                    if (CollectionUtils.isEmpty(entry.getValue())) {
+                        continue;
+                    }
+
+                    musicVo = entry.getValue().get(0);
+
+                    subjectInfos.add(MusicActivityVo.SubjectInfo.builder()
+                                    .subjectId(musicVo.getSubjectId().split(",")[0])
+                                    .subjectName(musicVo.getMusicSubject())
+                                    .join(entry.getValue().stream().anyMatch(x -> x.getJoin() == YesOrNoEnum.YES))
+                                    .userId(musicVo.getUserId())
+                                    .username(musicVo.getUsername())
+                                    .userAvatar(musicVo.getUserAvatar())
+                                    .score(0D)
+                                    .musicNums(entry.getValue().size())
+                            .build());
+                }
+
+                activityVo.setSubjectInfos(subjectInfos);
+            }
+        }
 
         // 报名状态
         activityVo.setJoin(activityRegistrationService.getRegistration(userId, activityPlanId));
@@ -512,10 +557,6 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
         List<ActivityReward> activityRewardList = activityRewardService.getActivityReward(activityPlanId);
         activityVo.setActivityRewardList(activityRewardList);
 
-        // 评测难度
-        String evaluationDifficulty = baseMapper.selectActivityPlanEvaluation(activityPlanId);
-
-        activityVo.setEvaluationDifficulty(evaluationDifficulty);
         return activityVo;
     }
 

+ 33 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/ActivityMusicVo.java

@@ -47,6 +47,15 @@ public class ActivityMusicVo {
     @ApiModelProperty("最高分用户声部")
     private String userSubject;
 
+    @ApiModelProperty("声部ID")
+    private String subjectId;
+
+    @ApiModelProperty("作曲人")
+    private String composer;
+
+    @ApiModelProperty("声部图片")
+    private String subjectImage;
+
     public Long getUserId() {
         return userId;
     }
@@ -126,4 +135,28 @@ public class ActivityMusicVo {
     public void setUserSubject(String userSubject) {
         this.userSubject = userSubject;
     }
+
+    public String getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(String subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getComposer() {
+        return composer;
+    }
+
+    public void setComposer(String composer) {
+        this.composer = composer;
+    }
+
+    public String getSubjectImage() {
+        return subjectImage;
+    }
+
+    public void setSubjectImage(String subjectImage) {
+        this.subjectImage = subjectImage;
+    }
 }

+ 50 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicActivityVo.java

@@ -5,7 +5,12 @@ import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
 import java.util.List;
 
 /**
@@ -29,6 +34,9 @@ public class MusicActivityVo extends ActivityPlan {
     @ApiModelProperty("是否已经报名参与 0 :否 1:是")
     private YesOrNoEnum join;
 
+    @ApiModelProperty("活动声部信息")
+    private List<SubjectInfo> subjectInfos;
+
     public YesOrNoEnum getJoin() {
         return join;
     }
@@ -60,4 +68,46 @@ public class MusicActivityVo extends ActivityPlan {
     public void setEvaluationDifficulty(String evaluationDifficulty) {
         this.evaluationDifficulty = evaluationDifficulty;
     }
+
+    public List<SubjectInfo> getSubjectInfos() {
+        return subjectInfos;
+    }
+
+    public void setSubjectInfos(List<SubjectInfo> subjectInfos) {
+        this.subjectInfos = subjectInfos;
+    }
+
+    /**
+     * 活动曲目声部信息
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class SubjectInfo implements Serializable {
+
+        @ApiModelProperty("声部ID")
+        private String subjectId;
+
+        @ApiModelProperty("声部名称")
+        private String subjectName;
+
+        @ApiModelProperty("是否已经报名参与 ")
+        private Boolean join;
+
+        @ApiModelProperty("最高分")
+        private double score;
+
+        @ApiModelProperty("最高分的用户id")
+        private Long userId;
+
+        @ApiModelProperty("最高分用户头像")
+        private String userAvatar;
+
+        @ApiModelProperty("最高分用户名")
+        private String username;
+
+        @ApiModelProperty("声部曲目数")
+        private Integer musicNums;
+    }
 }

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StatGroupWrapper.java

@@ -20,5 +20,6 @@ public class StatGroupWrapper implements Serializable {
     private Long id;
     private Integer total;
     private String gid; // 字符串分组ID
+    private Double number;
 
 }

+ 21 - 3
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityEvaluationMapper.xml

@@ -66,11 +66,12 @@
 
         select ms.id_ as musicSheetId
         ,ms.music_sheet_name_ as musicSheetName
+        , ms.music_subject_ AS subjectId
         ,s.name_ as musicSubject
+        , ms.composer_ AS composer
+        , s.img_ AS subjectImage
         ,ae.id_ as evaluationId
-        ,(select if(count(1)>0,1,0) as `join` from activity_evaluation_record aer
-            where aer.evaluation_id_ = ae.id_ and aer.user_id_ = #{userId}
-        ) as `join`
+        ,(select if(count(1)>0,1,0) as `join` from activity_evaluation_record aer where aer.evaluation_id_ = ae.id_ and aer.user_id_ = #{userId}) as `join`
         from activity_evaluation ae
         left join music_sheet ms on ms.id_ = ae.music_sheet_id_
         left join subject s on s.id_ = ms.music_subject_
@@ -240,4 +241,21 @@
         </where>
     </select>
     <!--时间匹配活动老师信息-->
+
+    <!--评测活动声部曲目最多分-->
+    <select id="selectSubjectMusicHighestScoreStat"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper">
+        SELECT t1.evaluation_id_ AS id, MAX(t1.score_) AS number FROM activity_evaluation_record t1
+        <where>
+            t1.score_ IS NOT NULL
+            <if test="activityId != null">
+                AND t1.activity_id_ = #{activityId}
+            </if>
+            <if test="userId != null">
+                AND t1.user_id_ = #{userId}
+            </if>
+        </where>
+        GROUP BY t1.evaluation_id_
+    </select>
+    <!--评测活动声部曲目最多分-->
 </mapper>