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
4f0d9ad395

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

@@ -43,7 +43,7 @@ public class MusicCompareRecordStatController extends BaseController {
     /**
      * 查询曲目统计汇总信息
      */
-    @ApiOperation(value = "曲目统计汇总信息", notes = "传入id")
+    @ApiOperation(value = "曲目统计汇总信息", notes = "")
     @PostMapping(value = "/record/stat", consumes="application/json", produces="application/json")
     public HttpResponseResult<MusicCompareVo.RecordStat> musicCompareRecordStatInfo(@RequestBody MusicCompareVo.StatQueryRequest request) {
 
@@ -52,7 +52,7 @@ public class MusicCompareRecordStatController extends BaseController {
             return failed("用户信息获取失败");
         }
 
-        if (request.userId(sysUser.getId()).invalidParam()) {
+        if (request.invalidParam()) {
             return failed("无效的请求参数");
         }
 
@@ -65,16 +65,11 @@ public class MusicCompareRecordStatController extends BaseController {
     /**
      * 查询曲目统计汇总信息
      */
-    @ApiOperation(value = "曲目统计信息查询", notes = "传入id")
+    @ApiOperation(value = "曲目统计信息查询", notes = "")
     @PostMapping(value = "/record/page", consumes="application/json", produces="application/json")
     public HttpResponseResult<PageInfo<MusicCompareVo.RecordInfo>> musicCompareRecordPageInfo(@RequestBody MusicCompareVo.StatQueryRequest request) {
 
-        SysUser sysUser = sysUserFeignService.queryUserInfo();
-        if (sysUser == null  || sysUser.getId() == null) {
-            return failed("用户信息获取失败");
-        }
-
-        if (request.userId(sysUser.getId()).invalidParam()) {
+        if (request.invalidParam()) {
             return failed("无效的请求参数");
         }
 

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

@@ -11,6 +11,7 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -44,6 +45,22 @@ public class MusicCompareVo implements Serializable {
         @ApiModelProperty("排序方式 升序(ASC) 降序(DESC)")
         private String sortType;
 
+        @ApiModelProperty("曲目编号/名称")
+        private String keyword;
+
+        @ApiModelProperty("开始时间")
+        @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+        private Long startTime;
+
+        @ApiModelProperty("结束时间")
+        @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+        private Long endTime;
+
+        @ApiModelProperty(value = "曲目ID", hidden = true)
+        private Long musicId;
+        @ApiModelProperty(value = "曲目名称", hidden = true)
+        private String musicName;
+
         public boolean invalidParam() {
 
             return Objects.isNull(getClientType())
@@ -64,6 +81,19 @@ public class MusicCompareVo implements Serializable {
             return Optional.ofNullable(sortType).orElse("DESC");
         }
 
+        public void setKeyword(String keyword) {
+            if (StringUtils.isNotEmpty(keyword)) {
+
+                if (keyword.matches(MK.EXP_INT)) {
+
+                    setMusicId(Long.parseLong(keyword));
+                } else {
+                    setMusicName(keyword);
+                }
+            }
+            this.keyword = keyword;
+        }
+
         public StatQueryRequest userId(Long userId) {
             this.userId = userId;
             return this;
@@ -134,5 +164,11 @@ public class MusicCompareVo implements Serializable {
         @ApiModelProperty("最近使用时间")
         @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
         private Date recentTime;
+
+        @ApiModelProperty("作曲人")
+        private String composer;
+
+        @ApiModelProperty("音乐标签")
+        private String musicTagName;
     }
 }

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

@@ -3,6 +3,8 @@ package com.yonge.cooleshow.biz.dal.dao;
 import java.util.List;
 import java.util.Map;
 
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
 import org.apache.ibatis.annotations.Param;
 
 import com.yonge.cooleshow.biz.dal.dto.StudentTrainChartDto;
@@ -67,4 +69,11 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
 	 * @return java.lang.Integer
 	 */
 	Integer getUserWeekMaxMusicScoreId(@Param("userId") Long userId, @Param("monday") String monday, @Param("heardLevel") HeardLevelEnum heardLevel);
+
+	/**
+	 * 曲目练习记录统计
+	 * @param queryInfo MusicCompareWrapper.RecordQueryInfo
+	 * @return List<StatGroupWrapper>
+	 */
+	List<StatGroupWrapper> selectMusicCompareRecordStatInfo(@Param("record") MusicCompareWrapper.RecordQueryInfo queryInfo);
 }

+ 3 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicCompareRecordStat.java

@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.util.Date;
+
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
@@ -37,7 +39,7 @@ public class MusicCompareRecordStat implements Serializable {
 
     @ApiModelProperty("客户端标识")
     @TableField("client_id_")
-    private String clientId;
+    private ClientEnum clientId;
 
     @ApiModelProperty("用户编号")
     @TableField("user_id_")

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

@@ -5,6 +5,8 @@ import com.yonge.cooleshow.biz.dal.entity.MusicCompareRecordStat;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
 
+import java.util.List;
+
 /**
  * <p>
  * 曲目练习统计表 服务类
@@ -30,4 +32,10 @@ public interface MusicCompareRecordStatService extends IService<MusicCompareReco
      * @return IPage<MusicCompareWrapper.RecordInfo>
      */
     IPage<MusicCompareWrapper.RecordInfo> findMusicCompareRecordPage(IPage<MusicCompareWrapper.RecordInfo> page, MusicCompareWrapper.StatQueryInfo query);
+
+    /**
+     * 批量更新曲目统计汇总
+     * @param recordInfos List<MusicCompareWrapper.RecordInfo>
+     */
+    void batchUpdateMusicCompareRecordStat(List<MusicCompareWrapper.RecordInfo> recordInfos);
 }

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

@@ -4,18 +4,25 @@ 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;
+import com.yonge.cooleshow.biz.dal.entity.MusicTag;
 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.service.MusicTagService;
 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.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -28,6 +35,9 @@ import java.util.Objects;
 @Service
 public class MusicCompareRecordStatServiceImp extends ServiceImpl<MusicCompareRecordStatMapper, MusicCompareRecordStat> implements MusicCompareRecordStatService {
 
+    @Autowired
+    private MusicTagService musicTagService;
+
     /**
      * 曲目统计汇总信息
      *
@@ -112,6 +122,79 @@ public class MusicCompareRecordStatServiceImp extends ServiceImpl<MusicCompareRe
         // 用户曲目统计信息
         List<MusicCompareWrapper.RecordInfo> recordInfos = getBaseMapper().selectMusicCompareRecordPage(page, query);
 
+        if (CollectionUtils.isNotEmpty(recordInfos)) {
+
+            List<String> collect = recordInfos.stream()
+                    .filter(x -> StringUtils.isNotEmpty(x.getMusicTag()))
+                    .flatMap(x -> Arrays.stream(x.getMusicTag().split(",")))
+                    .distinct().collect(Collectors.toList());
+
+            Map<Long, String> tagNameMap = musicTagService.lambdaQuery()
+                    .eq(MusicTag::getType, "MUSIC")
+                    .in(MusicTag::getId, collect)
+                    .list().stream()
+                    .collect(Collectors.toMap(MusicTag::getId, MusicTag::getName, (o, n) -> n));
+
+            String tagName;
+            for (MusicCompareWrapper.RecordInfo item : recordInfos) {
+
+                if (StringUtils.isNotEmpty(item.getMusicTag())) {
+
+                    List<Long> tagIds = Arrays.stream(item.getMusicTag().split(","))
+                            .map(Long::parseLong).distinct().collect(Collectors.toList());
+
+                    tagName = tagNameMap.entrySet().stream()
+                            .filter(x -> tagIds.contains(x.getKey()))
+                            .map(Map.Entry::getValue).collect(Collectors.joining(","));
+
+                    item.setMusicTagName(tagName);
+                }
+            }
+        }
+
         return page.setRecords(recordInfos);
     }
+
+    /**
+     * 批量更新曲目统计汇总
+     *
+     * @param recordInfos List<MusicCompareWrapper.RecordInfo>
+     */
+    @Override
+    public void batchUpdateMusicCompareRecordStat(List<MusicCompareWrapper.RecordInfo> recordInfos) {
+
+        for (MusicCompareWrapper.RecordInfo record : recordInfos) {
+
+            // 判断曲目统计消息是新增还是更新
+            MusicCompareRecordStat musicRecord = lambdaQuery()
+                    .eq(MusicCompareRecordStat::getMusicSheetId, record.getMusicSheetId())
+                    .eq(MusicCompareRecordStat::getUserId, record.getUserId())
+                    .eq(MusicCompareRecordStat::getClientId, record.getClientId())
+                    .one();
+
+            if (Objects.isNull(musicRecord)) {
+
+                // 初始化数据默认值
+                if (Objects.isNull(record.getTrainDuration())) {
+                    record.setTrainDuration(0L);
+                }
+                if (Objects.isNull(record.getTrainFrequency())) {
+                    record.setTrainFrequency(0L);
+                }
+                if (Objects.isNull(record.getEvaluateDuration())) {
+                    record.setEvaluateDuration(0L);
+                }
+                if (Objects.isNull(record.getEvaluateFrequency())) {
+                    record.setEvaluateFrequency(0L);
+                }
+
+                // 新增记录
+                save(JSON.parseObject(record.jsonString(), MusicCompareRecordStat.class));
+            } else {
+                record.setId(musicRecord.getId());
+                // 更新记录
+                updateById(JSON.parseObject(record.jsonString(), MusicCompareRecordStat.class));
+            }
+        }
+    }
 }

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

@@ -11,19 +11,26 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import com.yonge.cooleshow.biz.dal.service.ActivityEvaluationRecordService;
+import com.google.common.collect.Lists;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.service.MusicCompareRecordStatService;
 import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
+import com.yonge.toolset.base.util.ThreadPool;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
@@ -61,6 +68,8 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 
 	@Autowired
 	private MusicSheetDao musicSheetDao;
+	@Autowired
+	private MusicCompareRecordStatService musicCompareRecordStatService;
 
 	@Override
 	public BaseDAO<Long, SysMusicCompareRecord> getDAO() {
@@ -70,8 +79,106 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	@Override
 	public long insert(SysMusicCompareRecord bean) {
 		// 保存评测记录
+		long record = super.insert(bean);
+
+		if (record > 0) {
+			ThreadPool.getExecutor().submit(() -> {
+				try {
+
+					// 统计单曲练习时长,频率;评测时长、频率
+					ClientEnum clientType = Optional.of(ClientEnum.valueOf(bean.getClientId().toUpperCase()))
+							.orElse(ClientEnum.STUDENT);
+
+					// 单曲统计
+					MusicCompareWrapper.RecordInfo musicStatRecord = MusicCompareWrapper.RecordInfo.builder()
+							.musicSheetId(bean.getMusicSheetId())
+							.clientId(clientType)
+							.userId(0L)
+							.recentTime(DateTime.now().getMillis())
+							.build();
+
+					// 用户单曲统计
+					MusicCompareWrapper.RecordInfo userStatRecord = MusicCompareWrapper.RecordInfo.builder()
+							.musicSheetId(bean.getMusicSheetId())
+							.clientId(clientType)
+							.userId(bean.getUserId())
+							.recentTime(DateTime.now().getMillis())
+							.build();
+
+					// 按练习、评测分别进行统计
+					Lists.newArrayList(FeatureType.values()).parallelStream().forEach(dataType -> {
+
+						MusicCompareWrapper.RecordQueryInfo queryInfo = MusicCompareWrapper.RecordQueryInfo.builder()
+								.clientId(bean.getClientId())
+								.musicSheetId(bean.getMusicSheetId())
+								.feature(dataType)
+								.build();
+
+						// 曲目统计
+						List<StatGroupWrapper> musicWrappers = sysMusicCompareRecordDao.selectMusicCompareRecordStatInfo(queryInfo);
+
+						// 用户曲目统计
+						queryInfo.setUserId(bean.getUserId());
+
+						List<StatGroupWrapper> userMusicWrappers = sysMusicCompareRecordDao.selectMusicCompareRecordStatInfo(queryInfo);
+
+						switch (dataType) {
+							case CLOUD_STUDY_TRAIN: // 练习
+								{
+									// 先统计练习曲目
+									if (CollectionUtils.isNotEmpty(musicWrappers)) {
+
+										StatGroupWrapper wrapper = musicWrappers.get(0);
+
+										musicStatRecord.trainDuration(wrapper.getNumber().longValue())
+												.trainFrequency(wrapper.getTotal().longValue());
+									}
+
+									// 在按用户统计
+									if (CollectionUtils.isNotEmpty(userMusicWrappers)) {
+										StatGroupWrapper wrapper = userMusicWrappers.get(0);
+
+										userStatRecord.trainDuration(wrapper.getNumber().longValue())
+												.trainFrequency(wrapper.getTotal().longValue());
+									}
+								}
+								break;
+							case CLOUD_STUDY_EVALUATION: // 评测
+								{
+									// 先统计评测曲目
+									if (CollectionUtils.isNotEmpty(musicWrappers)) {
+
+										StatGroupWrapper wrapper = musicWrappers.get(0);
+
+										musicStatRecord.evaluateDuration(wrapper.getNumber().longValue())
+												.evaluateFrequency(wrapper.getTotal().longValue());
+									}
+
+									// 在按用户统计
+									if (CollectionUtils.isNotEmpty(userMusicWrappers)) {
+										StatGroupWrapper wrapper = userMusicWrappers.get(0);
+
+										userStatRecord.evaluateDuration(wrapper.getNumber().longValue())
+												.evaluateFrequency(wrapper.getTotal().longValue());
+									}
+								}
+								break;
+							default:
+								break;
+						}
+					});
+
+					List<MusicCompareWrapper.RecordInfo> recordInfos = Lists.newArrayList(musicStatRecord, userStatRecord);
+
+					musicCompareRecordStatService.batchUpdateMusicCompareRecordStat(recordInfos);
+
+				} catch (Exception e) {
+				    log.error("MusicCompareRecordStat userId={}, musicId={}", bean.getUserId(), bean.getMusicSheetId(), e);
+				}
+			});
+		}
 
-		return super.insert(bean);
+		return record;
 	}
 
 	@Override

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.wrapper.music;
 
 import com.alibaba.fastjson.JSON;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.FeatureType;
 import com.yonge.cooleshow.biz.dal.enums.music.MusicCompareType;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
@@ -48,6 +49,18 @@ public class MusicCompareWrapper {
         @ApiModelProperty("评测曲目")
         private Boolean evaluateMusic;
 
+        @ApiModelProperty("曲目ID")
+        private Long musicId;
+
+        @ApiModelProperty("曲目名称")
+        private String musicName;
+
+        @ApiModelProperty("开始时间")
+        private Long startTime;
+
+        @ApiModelProperty("结束时间")
+        private Long endTime;
+
         public static StatQueryInfo from(String record) {
 
             return JSON.parseObject(record, StatQueryInfo.class);
@@ -154,9 +167,24 @@ public class MusicCompareWrapper {
         @ApiModelProperty("曲目ID")
         private Long musicSheetId;
 
+        @ApiModelProperty("客户端标识")
+        private ClientEnum clientId;
+
+        @ApiModelProperty("用户编号")
+        private Long userId;
+
         @ApiModelProperty("曲目名称")
         private String musicName;
 
+        @ApiModelProperty("作曲人")
+        private String composer;
+
+        @ApiModelProperty("音乐标签编号")
+        private String musicTag;
+
+        @ApiModelProperty("音乐标签")
+        private String musicTagName;
+
         @ApiModelProperty("使用时长")
         private Long trainDuration;
 
@@ -171,5 +199,56 @@ public class MusicCompareWrapper {
 
         @ApiModelProperty("最近使用时间")
         private Long recentTime;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public RecordInfo trainDuration(Long trainDuration) {
+            this.trainDuration = trainDuration;
+            return this;
+        }
+
+        public RecordInfo trainFrequency(Long trainFrequency) {
+            this.trainFrequency = trainFrequency;
+            return this;
+        }
+
+        public RecordInfo evaluateDuration(Long evaluateDuration) {
+            this.evaluateDuration = evaluateDuration;
+            return this;
+        }
+
+        public RecordInfo evaluateFrequency(Long evaluateFrequency) {
+            this.evaluateFrequency = evaluateFrequency;
+            return this;
+        }
+
+        public RecordInfo recentTime(Long recentTime) {
+            this.recentTime = recentTime;
+            return this;
+        }
+    }
+
+    /**
+     * 曲目练习记录查询
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class RecordQueryInfo implements Serializable {
+
+        @ApiModelProperty("用户ID ")
+        private Long userId;
+
+        @ApiModelProperty("曲目编号 ")
+        private Long musicSheetId;
+
+        @ApiModelProperty("客户端类型 ")
+        private String clientId;
+
+        @ApiModelProperty("功能类型 ")
+        private FeatureType feature;
     }
 }

+ 14 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicCompareRecordStatMapper.xml

@@ -31,10 +31,13 @@
         <result column="evaluate_duration_" property="evaluateDuration" />
         <result column="evaluate_frequency_" property="evaluateFrequency" />
         <result column="recent_time_" property="recentTime" />
+        <result column="music_sheet_name_" property="musicName" />
+        <result column="composer_" property="composer" />
+        <result column="music_tag_" property="musicTag" />
     </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
+        SELECT t1.id_, t1.music_sheet_id_, t1.user_id_, t1.train_duration_, t1.train_frequency_, t1.evaluate_duration_, t1.evaluate_frequency_, t1.recent_time_, t2.music_sheet_name_, t2.composer_, t2.music_tag_
+        FROM music_compare_record_stat t1 LEFT JOIN music_sheet t2 ON t1.music_sheet_id_ = t2.id_
         <where>
             <if test="record.clientType != null">
                 AND t1.client_id_ = #{record.clientType}
@@ -42,6 +45,15 @@
             <if test="record.userId != null">
                 AND t1.user_id_ = #{record.userId}
             </if>
+            <if test="record.startTime != null and record.endTime != null">
+                AND (t1.recent_time_ >= #{record.startTime} AND  t1.recent_time_ &lt;= #{record.endTime})
+            </if>
+            <if test="record.musicId != null">
+                AND t2.id_ = #{record.musicId}
+            </if>
+            <if test="record.musicName != null">
+                AND t2.music_sheet_name_ LIKE '%${record.musicName}%'
+            </if>
         </where>
         ORDER BY t1.${record.compareField} ${record.sortType}
     </select>

+ 29 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

@@ -301,4 +301,33 @@
 		WHERE user_id_=#{userId} AND monday_ = #{monday} AND heard_level_ = #{heardLevel, typeHandler=com.yonge.toolset.mybatis.dal.CustomEnumTypeHandler}
 		ORDER BY score_ DESC LIMIT 1
 	</select>
+
+	<!--曲目练习统计-->
+	<select id="selectMusicCompareRecordStatInfo"
+			resultType="com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper">
+		SELECT
+		    t1.music_sheet_id_ AS id, SUM(t1.play_time_) AS number
+			<choose>
+				<when test="record.feature.code == 'CLOUD_STUDY_TRAIN'">, COUNT(DISTINCT t1.behavior_id_) AS total</when>
+				<otherwise>, COUNT(t1.id_) AS total</otherwise>
+			</choose>
+		FROM sys_music_compare_record t1
+		<where>
+			<if test="record.musicSheetId != null">
+				AND t1.music_sheet_id_ = #{record.musicSheetId}
+			</if>
+			<if test="record.userId != null">
+				AND t1.user_id_ = #{record.userId}
+			</if>
+			<if test="record.clientId != null">
+				AND t1.client_id_ = #{record.clientId}
+			</if>
+			<if test="record.feature != null">
+				AND t1.feature_ = #{record.feature}
+			</if>
+		</where>
+		GROUP BY t1.music_sheet_id_ <if test="record.userId != null">, t1.user_id_</if>
+	</select>
+	<!--曲目练习统计-->
+
 </mapper>

+ 83 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/SysMusicCompareRecordController.java

@@ -0,0 +1,83 @@
+package com.yonge.cooleshow.teacher.controller;
+
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.SysMusicCompareRecord;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.queryInfo.SysMusicCompareRecordQueryInfo;
+import com.yonge.cooleshow.biz.dal.service.SysMusicCompareRecordService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Objects;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/13 0013
+ */
+@Api(tags = "小酷Ai记录")
+@RequestMapping("sysMusicRecord")
+@RestController
+public class SysMusicCompareRecordController extends BaseController {
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private SysMusicCompareRecordService sysMusicCompareRecordService;
+
+    @ApiOperation(value = "添加记录")
+    @PostMapping("add")
+    public HttpResponseResult add(SysMusicCompareRecord record){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            throw new BizException("请登录");
+        }
+        if(Objects.isNull(record.getFeature())){
+            return failed("请设置功能点");
+        }
+        record.setUserId(sysUser.getId());
+        record.setClientId(ClientEnum.TEACHER.name());
+        return succeed(sysMusicCompareRecordService.insert(record));
+    }
+
+    @ApiOperation(value = "用户最后一次评测数据")
+    @GetMapping("getLastEvaluationMusicalNotesPlayStats")
+    public HttpResponseResult getLastEvaluationMusicalNotesPlayStats(Long recordId){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            throw new BizException("请登录");
+        }
+        return succeed(sysMusicCompareRecordService.getLastEvaluationMusicalNotesPlayStats(sysUser.getId(), recordId));
+    }
+
+    @ApiOperation("老师训练数据统计")
+    @GetMapping("studentTrainData")
+    public HttpResponseResult studentTrainData(SysMusicCompareRecordQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        queryInfo.setUserId(sysUser.getId());
+        if (StringUtils.isEmpty(queryInfo.getStartTime())) {
+            return failed("时间不能为空");
+        }
+        LocalDate localDate = LocalDate.parse(queryInfo.getStartTime() + "-01",
+                                              DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        queryInfo.setStartTime(localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+        LocalDate endDate = localDate.plusDays(localDate.getMonth().length(localDate.isLeapYear()) -1);
+        queryInfo.setEndTime(endDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+        return succeed(sysMusicCompareRecordService.studentTrainData(queryInfo));
+    }
+
+}