Browse Source

老师端,学生端曲目统计

Eric 2 năm trước cách đây
mục cha
commit
73a5e9ba3e

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

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

@@ -114,4 +114,47 @@ public class MusicCompareRecordStatServiceImp extends ServiceImpl<MusicCompareRe
 
         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));
+            }
+        }
+    }
 }

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

@@ -17,19 +17,20 @@ import java.util.stream.Collectors;
 
 import com.google.common.collect.Lists;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.service.ActivityEvaluationRecordService;
+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;
@@ -67,6 +68,8 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 
 	@Autowired
 	private MusicSheetDao musicSheetDao;
+	@Autowired
+	private MusicCompareRecordStatService musicCompareRecordStatService;
 
 	@Override
 	public BaseDAO<Long, SysMusicCompareRecord> getDAO() {
@@ -86,6 +89,22 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 					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 -> {
 
@@ -95,21 +114,53 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 								.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: // 练习
 								{
 									// 先统计练习曲目
-									List<StatGroupWrapper> groupWrappers = sysMusicCompareRecordDao.selectMusicCompareRecordStatInfo(queryInfo);
+									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:
@@ -117,6 +168,10 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 						}
 					});
 
+					List<MusicCompareWrapper.RecordInfo> recordInfos = Lists.newArrayList(musicStatRecord, userStatRecord);
+
+					musicCompareRecordStatService.batchUpdateMusicCompareRecordStat(recordInfos);
+
 				} catch (Exception e) {
 				    log.error("MusicCompareRecordStat userId={}, musicId={}", bean.getUserId(), bean.getMusicSheetId(), e);
 				}

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.wrapper.music;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.TableField;
 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;
@@ -155,6 +156,12 @@ public class MusicCompareWrapper {
         @ApiModelProperty("曲目ID")
         private Long musicSheetId;
 
+        @ApiModelProperty("客户端标识")
+        private ClientEnum clientId;
+
+        @ApiModelProperty("用户编号")
+        private Long userId;
+
         @ApiModelProperty("曲目名称")
         private String musicName;
 
@@ -172,6 +179,35 @@ 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;
+        }
     }
 
     /**

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

@@ -31,10 +31,11 @@
         <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" />
     </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_
+        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}

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

@@ -308,7 +308,7 @@
 		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>
+				<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

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