Browse Source

Merge branch 'dev_v1.3.6_20221021' of http://git.dayaedu.com/yonge/cooleshow into dev_v1.3.6_20221021

liujunchi 2 years ago
parent
commit
23e2f10534

+ 3 - 3
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/music/MusicCompareRecordStatController.java

@@ -15,10 +15,10 @@ import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
@@ -30,9 +30,9 @@ import java.util.List;
  * @author Eric
  * @since 2022-10-17
  */
-@Controller
+@RestController
 @RequestMapping("/music/compare")
-@Api(tags = "曲目练习统计 API接口")
+@Api(tags = "曲目练习统计 ")
 public class MusicCompareRecordStatController extends BaseController {
 
     @Autowired

+ 6 - 3
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/coupon/CouponInfoVO.java

@@ -49,10 +49,10 @@ public class CouponInfoVO {
         @ApiModelProperty("客户类型")
         private ClientEnum clientType;
 
-        @ApiModelProperty("优惠券类型")
+        @ApiModelProperty("优惠券类型 FULL_DISCOUNT(满减券) VOUCHER(代金券)")
         private CouponTypeEnum couponType;
 
-        @ApiModelProperty("可用品类")
+        @ApiModelProperty("可用品类 UNIVERSAL(全场通用) VIP(小酷Ai) PIANO(云酷琴房) MALL(商场购物券) MUSIC(单曲点播券) ALBUM(专辑优惠券) SPARRING(陪练课购买券) LIVE(直播课购买券) ")
         private CouponCategoryEnum category;
 
         @ApiModelProperty("优惠券状态")
@@ -180,7 +180,10 @@ public class CouponInfoVO {
         @ApiModelProperty("客户端类型: TEACHER(老师端), STUDENT(学生端)")
         private ClientEnum clientType;
 
-        @ApiModelProperty("可用品类: UNIVERSAL(全场通用) VIP(小酷Ai) PIANO(云酷琴房) MALL(商场购物券) MUSIC(单曲点播券) SPARRING(陪练课购买券) LIVE(直播课购买券) VIDEO(视频课购买券) ")
+        @ApiModelProperty("可用品类: UNIVERSAL(全场通用) VIP(小酷Ai) " +
+                "PIANO(云酷琴房) MALL(商场购物券) MUSIC(单曲点播券) " +
+                "SPARRING(陪练课购买券) LIVE(直播课购买券) VIDEO(视频课购买券) " +
+                "VIDEO(视频课购买券)")
         private CouponCategoryEnum category;
 
         @ApiModelProperty("使用门槛")

+ 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;
     }
 }

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/coupon/CouponCategoryEnum.java

@@ -19,6 +19,7 @@ public enum CouponCategoryEnum implements BaseEnum<String, CouponCategoryEnum> {
     PIANO("云酷琴房", "PINAO_ROOM"),
     MALL("商场购物券", "MALL"),
     MUSIC("单曲点播券", "MUSIC"),
+    ALBUM("专辑优惠券", "ALBUM"),
     SPARRING("陪练课购买券", "PRACTICE"),
     LIVE("直播课购买券", "LIVE"),
     VIDEO("视频课购买券", "VIDEO"),

+ 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>

+ 3 - 3
service.md

@@ -1,8 +1,8 @@
 - [ ] gateway-server
 - [ ] auth-server
-- [ ] admin-server
-- [x] teacher-server
-- [x] student-server
+- [x] admin-server
+- [ ] teacher-server
+- [ ] student-server
 - [ ] website-server
 - [ ] task-server
 - [ ] websocket-server