瀏覽代碼

feat:云教练训练数据统计

Joburgess 4 年之前
父節點
當前提交
93a031f723

+ 39 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicCompareRecordDao.java

@@ -1,9 +1,47 @@
 package com.ym.mec.biz.dal.dao;
 
+import com.ym.mec.biz.dal.dto.MusicCompareRankingDto;
+import com.ym.mec.biz.dal.dto.StudentTrainChartDto;
+import com.ym.mec.biz.dal.dto.StudentTrainOverviewDto;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareRecord> {
 
+    /**
+     * @describe 获取用户训练汇总数据
+     * @author Joburgess
+     * @date 2021/8/11 0011
+     * @param startTime:
+     * @param endTime:
+     * @return java.util.List<com.ym.mec.biz.dal.dto.MusicCompareRankingDto>
+     */
+    List<MusicCompareRankingDto> getUserTrainStat(@Param("startTime") String startTime,
+                                                  @Param("endTime") String endTime);
+
+    /**
+     * @describe 获取用户训练总览
+     * @author Joburgess
+     * @date 2021/8/11 0011
+     * @param userId:
+     * @return com.ym.mec.biz.dal.dto.StudentTrainOverviewDto
+     */
+    StudentTrainOverviewDto getUserTrainOverView(@Param("userId") Integer userId);
+
+    /**
+     * @describe 获取用户训练图表数据
+     * @author Joburgess
+     * @date 2021/8/12 0012
+     * @param userId:
+     * @param startTime:
+     * @param endTime:
+     * @return java.util.List<com.ym.mec.biz.dal.dto.StudentTrainChartDto>
+     */
+    List<StudentTrainChartDto> getUserTrainChartData(@Param("userId") Integer userId,
+                                                     @Param("startTime") String startTime,
+                                                     @Param("endTime") String endTime);
 	
-}
+}

+ 87 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicCompareRankingDto.java

@@ -0,0 +1,87 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/11 0011
+ */
+public class MusicCompareRankingDto {
+
+    @ApiModelProperty("用户编号")
+    private Integer userId;
+
+    @ApiModelProperty("头像")
+    private String avatar;
+
+    @ApiModelProperty("学员姓名")
+    private String studentName;
+
+    @ApiModelProperty("排名")
+    private int rankNum = -1;
+
+    @ApiModelProperty("训练天数")
+    private int trainDays = 0;
+
+    @ApiModelProperty("训练时长")
+    private int trainTime = 0;
+
+    @ApiModelProperty("训练次数")
+    private int trainNum = 0;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public int getRankNum() {
+        return rankNum;
+    }
+
+    public void setRankNum(int rankNum) {
+        this.rankNum = rankNum;
+    }
+
+    public int getTrainDays() {
+        return trainDays;
+    }
+
+    public void setTrainDays(int trainDays) {
+        this.trainDays = trainDays;
+    }
+
+    public int getTrainTime() {
+        return trainTime;
+    }
+
+    public void setTrainTime(int trainTime) {
+        this.trainTime = trainTime;
+    }
+
+    public int getTrainNum() {
+        return trainNum;
+    }
+
+    public void setTrainNum(int trainNum) {
+        this.trainNum = trainNum;
+    }
+}

+ 29 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StatDto.java

@@ -0,0 +1,29 @@
+package com.ym.mec.biz.dal.dto;
+
+/**
+ * @Author Joburgess
+ * 统计用
+ * @Date 2021/8/11 0011
+ */
+public class StatDto {
+
+    private Object head;
+
+    private Object detail;
+
+    public Object getHead() {
+        return head;
+    }
+
+    public void setHead(Object head) {
+        this.head = head;
+    }
+
+    public Object getDetail() {
+        return detail;
+    }
+
+    public void setDetail(Object detail) {
+        this.detail = detail;
+    }
+}

+ 54 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentTrainChartDto.java

@@ -0,0 +1,54 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.time.LocalDate;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/12 0012
+ */
+public class StudentTrainChartDto {
+
+    @ApiModelProperty("训练时长")
+    private int trainTime = 0;
+
+    @ApiModelProperty("训练次数")
+    private int trainNum = 0;
+
+    @ApiModelProperty("训练日期")
+    private LocalDate trainDate;
+
+    public StudentTrainChartDto() {
+    }
+
+    public StudentTrainChartDto(int trainTime, int trainNum, LocalDate trainDate) {
+        this.trainTime = trainTime;
+        this.trainNum = trainNum;
+        this.trainDate = trainDate;
+    }
+
+    public int getTrainTime() {
+        return trainTime;
+    }
+
+    public void setTrainTime(int trainTime) {
+        this.trainTime = trainTime;
+    }
+
+    public int getTrainNum() {
+        return trainNum;
+    }
+
+    public void setTrainNum(int trainNum) {
+        this.trainNum = trainNum;
+    }
+
+    public LocalDate getTrainDate() {
+        return trainDate;
+    }
+
+    public void setTrainDate(LocalDate trainDate) {
+        this.trainDate = trainDate;
+    }
+}

+ 43 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentTrainOverviewDto.java

@@ -0,0 +1,43 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/11 0011
+ */
+public class StudentTrainOverviewDto {
+
+    @ApiModelProperty("训练天数")
+    private int trainDays = 0;
+
+    @ApiModelProperty("训练时长")
+    private int trainTime = 0;
+
+    @ApiModelProperty("训练次数")
+    private int trainNum = 0;
+
+    public int getTrainDays() {
+        return trainDays;
+    }
+
+    public void setTrainDays(int trainDays) {
+        this.trainDays = trainDays;
+    }
+
+    public int getTrainTime() {
+        return trainTime;
+    }
+
+    public void setTrainTime(int trainTime) {
+        this.trainTime = trainTime;
+    }
+
+    public int getTrainNum() {
+        return trainNum;
+    }
+
+    public void setTrainNum(int trainNum) {
+        this.trainNum = trainNum;
+    }
+}

+ 11 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java

@@ -18,6 +18,8 @@ public class SysMusicCompareRecord {
 	
 	/** 教程编号 */
 	private Integer sysMusicScoreId;
+
+	private String sysMusicScoreName;
 	
 	/** 评分数据 */
 	private String scoreData;
@@ -80,7 +82,15 @@ public class SysMusicCompareRecord {
 	public Integer getSysMusicScoreId(){
 		return this.sysMusicScoreId;
 	}
-			
+
+	public String getSysMusicScoreName() {
+		return sysMusicScoreName;
+	}
+
+	public void setSysMusicScoreName(String sysMusicScoreName) {
+		this.sysMusicScoreName = sysMusicScoreName;
+	}
+
 	public void setScoreData(String scoreData){
 		this.scoreData = scoreData;
 	}

+ 40 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysMusicCompareRecordQueryInfo.java

@@ -0,0 +1,40 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/11 0011
+ */
+public class SysMusicCompareRecordQueryInfo extends QueryInfo {
+
+    private Integer userId;
+
+    private String startTime;
+
+    private String endTime;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+}

+ 20 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java

@@ -1,10 +1,11 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.SoundCompareHelper;
+import com.ym.mec.biz.dal.dto.StatDto;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
+import com.ym.mec.biz.dal.page.SysMusicCompareRecordQueryInfo;
 import com.ym.mec.common.service.BaseService;
 
-import java.math.BigDecimal;
 import java.util.Map;
 
 public interface SysMusicCompareRecordService extends BaseService<Long, SysMusicCompareRecord> {
@@ -19,4 +20,22 @@ public interface SysMusicCompareRecordService extends BaseService<Long, SysMusic
      */
     void saveMusicCompareData(String phone, SoundCompareHelper soundCompareInfo);
 
+    /**
+     * @describe 云教练排行榜
+     * @author Joburgess
+     * @date 2021/8/11 0011
+     * @param startDate:
+     * @param endDate:
+     * @return com.ym.mec.biz.dal.dto.StatDto
+     */
+    StatDto rankingList(Integer headUserId, String startDate, String endDate);
+
+    /**
+     * @describe 学员训练数据统计
+     * @author Joburgess
+     * @date 2021/8/12 0012
+     * @param queryInfo:
+     * @return java.util.Map<java.lang.String,java.lang.Object>
+     */
+    Map<String, Object> studentTrainData(SysMusicCompareRecordQueryInfo queryInfo);
 }

+ 84 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java

@@ -2,23 +2,27 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.SysMusicCompareRecordDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
-import com.ym.mec.biz.dal.dto.SoundCompareHelper;
+import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
+import com.ym.mec.biz.dal.page.SysMusicCompareRecordQueryInfo;
+import com.ym.mec.biz.service.SysMusicCompareRecordService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
-import com.ym.mec.common.service.impl.BaseServiceImpl;
-import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
-import com.ym.mec.biz.service.SysMusicCompareRecordService;
-import com.ym.mec.biz.dal.dao.SysMusicCompareRecordDao;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
-import java.io.IOException;
 import java.math.BigDecimal;
 import java.time.DayOfWeek;
 import java.time.LocalDate;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysMusicCompareRecord>  implements SysMusicCompareRecordService {
@@ -59,4 +63,76 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		sysMusicCompareRecord.setMonday(LocalDate.now().with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()).toString());
 		sysMusicCompareRecordDao.insert(sysMusicCompareRecord);
 	}
+
+	@Override
+	public StatDto rankingList(Integer headUserId, String startDate, String endDate) {
+		SysUser user = teacherDao.getUser(headUserId);
+		StatDto result = new StatDto();
+		MusicCompareRankingDto head = new MusicCompareRankingDto();
+		head.setUserId(headUserId);
+		List<MusicCompareRankingDto> userTrainStat = sysMusicCompareRecordDao.getUserTrainStat(startDate, endDate);
+		List<MusicCompareRankingDto> detail = new ArrayList<>();
+		userTrainStat.sort(Comparator.comparing(m->m.getTrainDays()+m.getTrainNum()+m.getTrainTime()));
+		for (int i = 0; i < userTrainStat.size(); i++) {
+			userTrainStat.get(i).setRankNum(userTrainStat.size()-i);
+			userTrainStat.get(i).setTrainTime(userTrainStat.get(i).getTrainTime()/60);
+			if(userTrainStat.get(i).getUserId().equals(headUserId)){
+				head = userTrainStat.get(i);
+			}
+			if(userTrainStat.get(i).getRankNum()<=10){
+				detail.add(userTrainStat.get(i));
+			}
+		}
+		if(Objects.isNull(head.getRankNum())&&Objects.nonNull(user)){
+			head.setAvatar(user.getAvatar());
+			head.setStudentName(user.getUsername());
+		}
+		result.setHead(head);
+		detail.sort(Comparator.comparing(MusicCompareRankingDto::getRankNum).thenComparing(MusicCompareRankingDto::getUserId));
+		result.setDetail(detail);
+		return result;
+	}
+
+	@Override
+	public Map<String, Object> studentTrainData(SysMusicCompareRecordQueryInfo queryInfo) {
+		StudentTrainOverviewDto userTrainOverView = new StudentTrainOverviewDto();
+
+		List<StudentTrainChartDto> userTrainChartData = new ArrayList<>();
+		if(queryInfo.getPage()==1){
+			userTrainOverView = sysMusicCompareRecordDao.getUserTrainOverView(queryInfo.getUserId());
+			userTrainChartData = sysMusicCompareRecordDao.getUserTrainChartData(queryInfo.getUserId(), queryInfo.getStartTime(), queryInfo.getEndTime());
+		}
+
+		if(CollectionUtils.isEmpty(userTrainChartData)||userTrainChartData.size()!=7){
+			Set<LocalDate> trainDates = userTrainChartData.stream().map(StudentTrainChartDto::getTrainDate).collect(Collectors.toSet());
+			LocalDate startLocalDate = LocalDate.parse(queryInfo.getStartTime(), DateUtil.dateFormatter);
+			for (int i = 1; i <= 7; i++) {
+				if(!trainDates.contains(startLocalDate)){
+					userTrainChartData.add(new StudentTrainChartDto(0, 0, startLocalDate));
+				}
+				startLocalDate=startLocalDate.plusDays(1);
+			}
+		}
+
+		PageInfo<SysMusicCompareRecord> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<SysMusicCompareRecord> dataList = null;
+		int count = this.findCount(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = this.getDAO().queryPage(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		Map<String, Object> result = new HashMap<>();
+		result.put("userTrainOverView",userTrainOverView);
+		result.put("userTrainChartData",userTrainChartData);
+		result.put("detail",pageInfo);
+		return result;
+	}
 }

+ 62 - 2
mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

@@ -10,6 +10,7 @@
 		<result column="id_" property="id" />
 		<result column="user_id_" property="userId" />
 		<result column="sys_music_score_id_" property="sysMusicScoreId" />
+		<result column="sys_music_score_name_" property="sysMusicScoreName" />
 		<result column="score_data_" property="scoreData" />
 		<result column="score_" property="score" />
 		<result column="intonation_" property="intonation" />
@@ -93,13 +94,72 @@
 		DELETE FROM sys_music_compare_record WHERE id_ = #{id}
 	</delete>
 
+	<sql id="queryCondition">
+		<where>
+			<if test="userId!=null">
+				AND smcr.user_id_=#{userId}
+			</if>
+			<if test="startTime!=null and endTime!=null">
+				AND DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') BETWEEN #{startTime} AND #{endTime}
+			</if>
+		</where>
+	</sql>
+
 	<!-- 分页查询 -->
 	<select id="queryPage" resultMap="SysMusicCompareRecord" parameterType="map">
-		SELECT * FROM sys_music_compare_record ORDER BY id_ <include refid="global.limit"/>
+		SELECT
+			smcr.id_, smcr.user_id_, smcr.sys_music_score_id_, smcr.score_, smcr.intonation_, smcr.cadence_,
+		       smcr.integrity_, smcr.record_file_path_, smcr.client_id_, smcr.device_type_, smcr.play_time_,
+		       smcr.monday_, smcr.create_time_,
+			sms.name_ sys_music_score_name_
+		FROM sys_music_compare_record smcr
+		LEFT JOIN sys_music_score sms on smcr.sys_music_score_id_ = sms.id_
+		<include refid="queryCondition"></include>
+		ORDER BY id_ DESC
+		<include refid="global.limit"/>
 	</select>
 
 	<!-- 查询当前表的总记录数 -->
 	<select id="queryCount" resultType="int">
-		SELECT COUNT(*) FROM sys_music_compare_record
+		SELECT COUNT(*) FROM sys_music_compare_record smcr
+		<include refid="queryCondition"></include>
+	</select>
+
+    <select id="getUserTrainStat" resultType="com.ym.mec.biz.dal.dto.MusicCompareRankingDto">
+		SELECT
+			smcr.user_id_ userId,
+			su.avatar_ avatar,
+		    su.username_ studentName,
+			COUNT(smcr.id_) trainNum,
+			COUNT(DISTINCT DAY(smcr.create_time_)) trainDays,
+			SUM(smcr.play_time_) trainTime
+		FROM sys_music_compare_record smcr
+				 LEFT JOIN sys_user su ON smcr.user_id_=su.id_
+		WHERE EXISTS (SELECT user_id_ FROM student WHERE user_id_=smcr.user_id_)
+		AND DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') BETWEEN #{startTime} AND #{endTime}
+		GROUP BY smcr.user_id_
+	</select>
+
+	<select id="getUserTrainOverView" resultType="com.ym.mec.biz.dal.dto.StudentTrainOverviewDto">
+		SELECT
+			COUNT(smcr.id_) trainNum,
+			COUNT(DISTINCT DAY(smcr.create_time_)) trainDays,
+			SUM(smcr.play_time_) trainTime
+		FROM sys_music_compare_record smcr
+		WHERE smcr.user_id_=#{userId}
+		      AND EXISTS (SELECT user_id_ FROM student WHERE user_id_=smcr.user_id_)
+	</select>
+
+	<select id="getUserTrainChartData" resultType="com.ym.mec.biz.dal.dto.StudentTrainChartDto">
+		SELECT
+			DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') trainDate,
+			COUNT(smcr.id_) trainNum,
+			SUM(smcr.play_time_) trainTime
+		FROM sys_music_compare_record smcr
+		WHERE smcr.user_id_=#{userId}
+		  AND EXISTS (SELECT user_id_ FROM student WHERE user_id_=smcr.user_id_)
+		  AND DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') BETWEEN #{startTime} AND #{endTime}
+		GROUP BY DATE_FORMAT(smcr.create_time_, '%Y-%m-%d')
+		ORDER BY trainDate;
 	</select>
 </mapper>

+ 54 - 0
mec-student/src/main/java/com/ym/mec/student/controller/CloudStudyController.java

@@ -0,0 +1,54 @@
+package com.ym.mec.student.controller;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.page.SysMusicCompareRecordQueryInfo;
+import com.ym.mec.biz.service.SysMusicCompareRecordService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+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.util.Map;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/11 0011
+ */
+@Api("云教练")
+@RestController
+@RequestMapping("cloudStudy")
+public class CloudStudyController extends BaseController {
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private SysMusicCompareRecordService sysMusicCompareRecordService;
+
+    @ApiOperation("云教练排行榜")
+    @GetMapping("rankingList")
+    public HttpResponseResult rankingList(String startDate, String endDate){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        return succeed(sysMusicCompareRecordService.rankingList(sysUser.getId(), startDate, endDate));
+    }
+
+    @ApiOperation("学员训练数据统计")
+    @GetMapping("studentTrainData")
+    public HttpResponseResult studentTrainData(SysMusicCompareRecordQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        queryInfo.setUserId(sysUser.getId());
+        return succeed(sysMusicCompareRecordService.studentTrainData(queryInfo));
+    }
+
+}

+ 0 - 3
mec-web/src/main/java/com/ym/mec/web/controller/SysSuggestionController.java

@@ -3,7 +3,6 @@ package com.ym.mec.web.controller;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.SysSuggestion;
-import com.ym.mec.biz.dal.enums.SuggestionType;
 import com.ym.mec.biz.dal.page.SysSuggestionQueryInfo;
 import com.ym.mec.biz.service.SysSuggestionService;
 import com.ym.mec.common.controller.BaseController;
@@ -15,8 +14,6 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.Objects;
-
 @Api(tags = "意见反馈")
 @RestController
 public class SysSuggestionController extends BaseController {