Prechádzať zdrojové kódy

曲目统计查询接口

Eric 2 rokov pred
rodič
commit
d55378a50f

+ 5 - 11
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/music/MusicCompareVo.java

@@ -1,7 +1,9 @@
 package com.yonge.cooleshow.admin.io.request.music;
 
 import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.MK;
 import com.yonge.cooleshow.biz.dal.enums.music.MusicCompareType;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
@@ -11,6 +13,7 @@ import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
@@ -66,16 +69,6 @@ public class MusicCompareVo implements Serializable {
             return this;
         }
 
-
-        public StatQueryRequest compareType(MusicCompareType compareType) {
-            this.compareType = compareType;
-            return this;
-        }
-
-        public StatQueryRequest sortType(String sortType) {
-            this.sortType = sortType;
-            return this;
-        }
     }
 
     /**
@@ -139,6 +132,7 @@ public class MusicCompareVo implements Serializable {
         private Long evaluateFrequency;
 
         @ApiModelProperty("最近使用时间")
-        private Long recentTime;
+        @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+        private Date recentTime;
     }
 }

+ 11 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/music/MusicCompareType.java

@@ -10,18 +10,20 @@ import com.yonge.toolset.base.enums.BaseEnum;
  * @date 2022-04-28
  */
 public enum MusicCompareType implements BaseEnum<String, MusicCompareType> {
-    TRAIN_DURATION("练习时长"),
-    TRAIN_FREQ("练习次数"),
-    EVALUATE_DURATION("评测时长"),
-    EVALUATE_FREQ("评测次数"),
+    TRAIN_DURATION("练习时长", "train_duration_"),
+    TRAIN_FREQ("练习次数", "train_frequency_"),
+    EVALUATE_DURATION("评测时长", "evaluate_duration_"),
+    EVALUATE_FREQ("评测次数", "evaluate_frequency_"),
     ;
     @EnumValue
     private String code;
     private String msg;
+    private String sortField;
 
-    MusicCompareType(String msg) {
+    MusicCompareType(String msg, String field) {
         this.code = this.name();
         this.msg = msg;
+        this.sortField = field;
     }
 
     public String getCode() {
@@ -32,6 +34,10 @@ public enum MusicCompareType implements BaseEnum<String, MusicCompareType> {
         return msg;
     }
 
+    public String getSortField() {
+        return sortField;
+    }
+
     /**
      * 校验类型合法性
      * @param clientType 客户端类型

+ 20 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/MusicCompareRecordStatMapper.java

@@ -1,7 +1,13 @@
 package com.yonge.cooleshow.biz.dal.mapper;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.entity.MusicCompareRecordStat;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +19,18 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface MusicCompareRecordStatMapper extends BaseMapper<MusicCompareRecordStat> {
 
+    /**
+     * 用户曲目统计查询
+     * @param page IPage<MusicCompareWrapper.RecordInfo>
+     * @param query MusicCompareWrapper.StatQueryInfo
+     * @return List<MusicCompareWrapper.RecordInfo>
+     */
+    List<MusicCompareWrapper.RecordInfo> selectMusicCompareRecordPage(@Param("page") IPage<MusicCompareWrapper.RecordInfo> page, @Param("record") MusicCompareWrapper.StatQueryInfo query);
+
+    /**
+     * 用户曲目统计汇总
+     * @param query MusicCompareWrapper.StatQueryInfo
+     * @return List<StatGroupWrapper>
+     */
+    List<StatGroupWrapper> selectMusicCompareRecordStatInfo(@Param("record") MusicCompareWrapper.StatQueryInfo query);
 }

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

@@ -29,5 +29,5 @@ public interface MusicCompareRecordStatService extends IService<MusicCompareReco
      * @param query MusicCompareWrapper.StatQueryInfo
      * @return IPage<MusicCompareWrapper.RecordInfo>
      */
-    IPage<MusicCompareWrapper.RecordInfo> findMusicCompareRecordPage(IPage<Object> page, MusicCompareWrapper.StatQueryInfo query);
+    IPage<MusicCompareWrapper.RecordInfo> findMusicCompareRecordPage(IPage<MusicCompareWrapper.RecordInfo> page, MusicCompareWrapper.StatQueryInfo query);
 }

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.google.common.collect.Lists;
 import com.yonge.cooleshow.biz.dal.entity.MusicCompareRecordStat;
@@ -7,9 +8,15 @@ import com.yonge.cooleshow.biz.dal.enums.EQueryOp;
 import com.yonge.cooleshow.biz.dal.mapper.MusicCompareRecordStatMapper;
 import com.yonge.cooleshow.biz.dal.service.MusicCompareRecordStatService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
+import com.yonge.toolset.mybatis.support.PageUtil;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Objects;
+
 /**
  * <p>
  * 曲目练习统计表 服务实现类
@@ -45,12 +52,37 @@ public class MusicCompareRecordStatServiceImp extends ServiceImpl<MusicCompareRe
         // 指标统计信息
         Lists.newArrayList(EQueryOp.values()).parallelStream().forEach(dataType -> {
 
+
+            MusicCompareWrapper.StatQueryInfo queryInfo = JSON.parseObject(info.jsonString(), MusicCompareWrapper.StatQueryInfo.class);
+
             switch (dataType) {
                 case FUNCTION_1: // 练习曲目
+                    {
+                        List<StatGroupWrapper> groupWrappers = getBaseMapper().selectMusicCompareRecordStatInfo(queryInfo.trainMusic(true));
+
+                        if (CollectionUtils.isNotEmpty(groupWrappers)) {
 
+                            StatGroupWrapper groupWrapper = groupWrappers.get(0);
+
+                            wrapper.trainMusicNums(groupWrapper.getMusicNum())
+                                    .trainDuration(groupWrapper.getDurationNum() / 60)
+                                    .trainFrequency(groupWrapper.getFrequencyNum());
+                        }
+                    }
                     break;
                 case FUNCTION_2: // 评测曲目
+                    {
+                        List<StatGroupWrapper> groupWrappers = getBaseMapper().selectMusicCompareRecordStatInfo(queryInfo.evaluateMusic(true));
+
+                        if (CollectionUtils.isNotEmpty(groupWrappers)) {
 
+                            StatGroupWrapper groupWrapper = groupWrappers.get(0);
+
+                            wrapper.evaluateMusicNums(groupWrapper.getMusicNum())
+                                    .evaluateDuration(groupWrapper.getDurationNum() / 60)
+                                    .evaluateFrequency(groupWrapper.getFrequencyNum());
+                        }
+                    }
                     break;
                 default:
                     break;
@@ -58,6 +90,11 @@ public class MusicCompareRecordStatServiceImp extends ServiceImpl<MusicCompareRe
         });
 
         // 曲目统计信息
+        IPage<MusicCompareWrapper.RecordInfo> page = findMusicCompareRecordPage(PageUtil.getPage(info), info);
+        if (Objects.nonNull(page)) {
+
+            wrapper.setRecordInfos(page.getRecords());
+        }
 
         return wrapper;
     }
@@ -70,10 +107,11 @@ public class MusicCompareRecordStatServiceImp extends ServiceImpl<MusicCompareRe
      * @return IPage<MusicCompareWrapper.RecordInfo>
      */
     @Override
-    public IPage<MusicCompareWrapper.RecordInfo> findMusicCompareRecordPage(IPage<Object> page, MusicCompareWrapper.StatQueryInfo query) {
+    public IPage<MusicCompareWrapper.RecordInfo> findMusicCompareRecordPage(IPage<MusicCompareWrapper.RecordInfo> page, MusicCompareWrapper.StatQueryInfo query) {
 
         // 用户曲目统计信息
+        List<MusicCompareWrapper.RecordInfo> recordInfos = getBaseMapper().selectMusicCompareRecordPage(page, query);
 
-        return null;
+        return page.setRecords(recordInfos);
     }
 }

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

@@ -22,4 +22,8 @@ public class StatGroupWrapper implements Serializable {
     private String gid; // 字符串分组ID
     private Double number;
 
+    // 拓展字段信息
+    private Long musicNum;
+    private Long durationNum;
+    private Long frequencyNum;
 }

+ 61 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/music/MusicCompareWrapper.java

@@ -36,14 +36,41 @@ public class MusicCompareWrapper {
         @ApiModelProperty("排序类型 ")
         private MusicCompareType compareType;
 
+        @ApiModelProperty("排序字段")
+        private String compareField;
+
         @ApiModelProperty("排序方式 升序(ASC) 降序(DESC)")
         private String sortType;
 
+        @ApiModelProperty("练习曲目")
+        private Boolean trainMusic;
+
+        @ApiModelProperty("评测曲目")
+        private Boolean evaluateMusic;
+
         public static StatQueryInfo from(String record) {
 
             return JSON.parseObject(record, StatQueryInfo.class);
         }
 
+        public String getCompareField() {
+            return getCompareType().getSortField();
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+
+        public StatQueryInfo trainMusic(Boolean trainMusic) {
+            this.trainMusic = trainMusic;
+            return this;
+        }
+
+        public StatQueryInfo evaluateMusic(Boolean evaluateMusic) {
+            this.evaluateMusic = evaluateMusic;
+            return this;
+        }
     }
 
     /**
@@ -79,6 +106,37 @@ public class MusicCompareWrapper {
 
             return JSON.toJSONString(this);
         }
+
+
+        public RecordStat trainMusicNums(Long trainMusicNums) {
+            this.trainMusicNums = trainMusicNums;
+            return this;
+        }
+
+        public RecordStat trainDuration(Long trainDuration) {
+            this.trainDuration = trainDuration;
+            return this;
+        }
+
+        public RecordStat trainFrequency(Long trainFrequency) {
+            this.trainFrequency = trainFrequency;
+            return this;
+        }
+
+        public RecordStat evaluateMusicNums(Long evaluateMusicNums) {
+            this.evaluateMusicNums = evaluateMusicNums;
+            return this;
+        }
+
+        public RecordStat evaluateDuration(Long evaluateDuration) {
+            this.evaluateDuration = evaluateDuration;
+            return this;
+        }
+
+        public RecordStat evaluateFrequency(Long evaluateFrequency) {
+            this.evaluateFrequency = evaluateFrequency;
+            return this;
+        }
     }
 
     /**
@@ -90,6 +148,9 @@ public class MusicCompareWrapper {
     @AllArgsConstructor
     public static class RecordInfo implements Serializable {
 
+        @ApiModelProperty("主键ID")
+        private Long id;
+
         @ApiModelProperty("曲目ID")
         private Long musicSheetId;
 

+ 54 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicCompareRecordStatMapper.xml

@@ -21,4 +21,58 @@
         id_, music_sheet_id_, client_id_, user_id_, train_duration_, train_frequency_, evaluate_duration_, evaluate_frequency_, recent_time_, create_time_
     </sql>
 
+    <!--曲目统计查询-->
+    <resultMap id="MusicCompareRecordPageResultMap"
+               type="com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper$RecordInfo">
+        <id column="id_" property="id" />
+        <result column="music_sheet_id_" property="musicSheetId" />
+        <result column="train_duration_" property="trainDuration" />
+        <result column="train_frequency_" property="trainFrequency" />
+        <result column="evaluate_duration_" property="evaluateDuration" />
+        <result column="evaluate_frequency_" property="evaluateFrequency" />
+        <result column="recent_time_" property="recentTime" />
+    </resultMap>
+    <select id="selectMusicCompareRecordPage" resultMap="MusicCompareRecordPageResultMap">
+        SELECT t1.id_, t1.music_sheet_id_, t1.user_id_, t1.train_duration_, t1.train_frequency_, t1.evaluate_duration_, t1.evaluate_frequency_
+        FROM music_compare_record_stat t1
+        <where>
+            <if test="record.clientType != null">
+                AND t1.client_id_ = #{record.clientType}
+            </if>
+            <if test="record.userId != null">
+                AND t1.user_id_ = #{record.userId}
+            </if>
+        </where>
+        ORDER BY t1.${record.compareField} #{record.sortType}
+    </select>
+    <!--曲目统计查询-->
+
+    <!--用户曲目统计汇总-->
+    <select id="selectMusicCompareRecordStatInfo"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper">
+        SELECT t1.user_id_ AS id, COUNT(DISTINCT t1.music_sheet_id_) AS musicNum,
+                <if test="record.trainMusic != null">
+                   SUM(t1.train_duration_) AS durationNum, SUM(t1.train_frequency_) AS frequencyNum
+                </if>
+                <if test="record.evaluateMusic != null">
+                   SUM(t1.evaluate_duration_) AS durationNum, SUM(t1.evaluate_frequency_) AS frequencyNum
+                </if>
+        FROM music_compare_record_stat t1
+        <where>
+            <if test="record.clientType != null">
+                AND t1.client_id_ = #{record.clientType}
+            </if>
+            <if test="record.userId != null">
+                AND t1.user_id_ = #{record.userId}
+            </if>
+            <if test="record.trainMusic != null">
+                AND t1.train_frequency_ > 0
+            </if>
+            <if test="record.evaluateMusic != null">
+                AND t1.evaluate_frequency_ > 0
+            </if>
+        </where>
+        GROUP BY t1.user_id_
+    </select>
+    <!--用户曲目统计汇总-->
 </mapper>