Przeglądaj źródła

学生端训练统计

zouxuan 1 rok temu
rodzic
commit
2d91fa1a11
15 zmienionych plików z 520 dodań i 30 usunięć
  1. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/StudentDao.java
  2. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SysMusicCompareRecordDao.java
  3. 20 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SysMusicCompareWeekDataDao.java
  4. 45 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysMusicCompareWeekData.java
  5. 71 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/SysMusicCompareRecordQueryInfo.java
  6. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java
  7. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMusicCompareRecordService.java
  8. 15 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMusicCompareWeekDataService.java
  9. 7 26
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  10. 63 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMusicCompareRecordServiceImpl.java
  11. 54 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMusicCompareWeekDataServiceImpl.java
  12. 24 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml
  13. 13 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  14. 170 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareWeekDataMapper.xml
  15. 24 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/SysMusicCompareRecordController.java

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/StudentDao.java

@@ -71,4 +71,7 @@ public interface StudentDao extends BaseMapper<Student> {
      */
     List<MyFollow> queryMyFollow(@Param("page") IPage page, @Param("param") QueryMyFollowSearch query);
 
+    List<Map<Integer, String>> getStudentSubjectMapList(List<Long> studentIds);
+
+    int countStudentsWithTenant(Map<String, Object> params);
 }

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

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.dao;
 import java.util.List;
 import java.util.Map;
 
+import com.yonge.cooleshow.biz.dal.entity.SysMusicCompareWeekData;
 import com.yonge.cooleshow.biz.dal.queryInfo.SysMusicCompareRecordQueryInfo;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
@@ -28,6 +29,7 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
 
 	int countMusicGroupStudentTrainData(Map<String, Object> params);
 
+
 	//统计分部小酷Ai新增人数
 	int getOrganNewCloudStudyNum(@Param("organId") Integer organId);
 
@@ -60,4 +62,8 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
 
 	//学生端训练统计
 	SysMusicCompareRecordQueryInfo.StudentMusicCompareRecordDto studentTrainStat(@Param("query") SysMusicCompareRecordQueryInfo.StudentMusicCompareRecordQuery query);
+
+	//统计用户指定周训练数据
+	SysMusicCompareWeekData getUserWeekCompareData(@Param("userId") Long userId,
+												   @Param("monday") String monday);
 }

+ 20 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SysMusicCompareWeekDataDao.java

@@ -0,0 +1,20 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import com.yonge.cooleshow.biz.dal.entity.SysMusicCompareWeekData;
+import com.yonge.cooleshow.biz.dal.queryInfo.SysMusicCompareRecordQueryInfo;
+import com.yonge.toolset.mybatis.dal.BaseDAO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface SysMusicCompareWeekDataDao extends BaseDAO<Integer, SysMusicCompareWeekData> {
+
+    SysMusicCompareWeekData getWithUserAndMonday(@Param("userId") Long userId,
+                                                 @Param("monday") String monday);
+
+    List<SysMusicCompareRecordQueryInfo.MusicCompareRankingDto> getUserTrainStat(@Param("monday") String monday,
+                                                                                 @Param("orderType") Integer orderType,
+                                                                                 @Param("heardLevel") String heardLevel,
+                                                                                 @Param("tenantId") Long tenantId);
+	
+}

+ 45 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysMusicCompareWeekData.java

@@ -0,0 +1,45 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.yonge.cooleshow.common.entity.BaseEntity;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+/**
+ * 对应数据库表(sys_music_compare_week_data):
+ */
+@Data
+public class SysMusicCompareWeekData extends BaseEntity {
+
+	/** 用户编号 */
+	private Long userId;
+	
+	/** 周一日期 */
+	private java.util.Date monday;
+	
+	/** 训练次数 */
+	private Integer trainNum;
+	
+	/** 本周训练天数 */
+	private Integer trainDays;
+	
+	/** 本周训练时长 */
+	private Float trainTime;
+	
+	/** 本周入门级最高分 */
+	private Integer beginnerMaxScore;
+	private Integer beginnerMaxScoreId;
+
+	/** 本周进阶级最高分 */
+	private Integer advancedMaxScore;
+	private Integer advancedMaxScoreId;
+
+	/** 本周大师级最高分 */
+	private Integer performerMaxScore;
+	private Integer performerMaxScoreId;
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 71 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/SysMusicCompareRecordQueryInfo.java

@@ -57,6 +57,77 @@ public class SysMusicCompareRecordQueryInfo {
     }
 
     @Data
+    public static class StudentCompareRecordQueryInfo extends QueryInfo{
+        @ApiModelProperty(name = "机构编号")
+        private Long tenantId;
+
+        @ApiModelProperty(name = "学员编号")
+        private Long userId;
+
+        @ApiModelProperty(name = "开始时间")
+        private String startTime;
+
+        @ApiModelProperty(name = "截止时间")
+        private String endTime;
+
+        private HeardLevelEnum heardLevel;
+
+        @ApiModelProperty(name = "0查询时长榜,1查询高分榜,2查询天数榜")
+        private int orderType;
+    }
+
+    @Data
+    public static class StatDto {
+
+        private MusicCompareRankingDto head;
+
+        private Object detail;
+    }
+
+    @Data
+    public static class MusicCompareRankingDto {
+
+        @ApiModelProperty("用户编号")
+        private Long userId;
+
+        @ApiModelProperty("头像")
+        private String avatar;
+
+        @ApiModelProperty("学员姓名")
+        private String studentName;
+
+        @ApiModelProperty("声部编号")
+        private Integer subjectId;
+
+        @ApiModelProperty("声部名称")
+        private String subjectName;
+
+        @ApiModelProperty("演奏曲目")
+        private String musicScoreName;
+
+        @ApiModelProperty("排名")
+        private int rankNum = -1;
+
+        @ApiModelProperty("得分")
+        private int score;
+
+        @ApiModelProperty("训练天数")
+        private int trainDays = 0;
+
+        @ApiModelProperty("训练时长")
+        private int trainTime = 0;
+
+        @ApiModelProperty("训练次数")
+        private int trainNum = 0;
+
+        @ApiModelProperty("是否是会员")
+        private int vipUser;
+
+        @ApiModelProperty("学生总数")
+        private int studentNum;
+    }
+
+    @Data
     public static class WechatCompareRecordPageDto{
         @ApiModelProperty(name = "用户编号")
         private Long userId;

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dao.StudentDao;
 import com.yonge.cooleshow.biz.dal.dto.search.QueryMyFollowSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
 import com.yonge.cooleshow.biz.dal.entity.Student;
@@ -24,6 +25,7 @@ import java.util.Map;
  * @date 2022-03-23
  */
 public interface StudentService extends IService<Student> {
+    StudentDao getDao();
     /***
      * 查询学员详情
      * @author liweifan

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMusicCompareRecordService.java

@@ -58,4 +58,7 @@ public interface SysMusicCompareRecordService extends BaseService<Long, SysMusic
 
     //学生端,学员训练统计
     SysMusicCompareRecordQueryInfo.StudentMusicCompareRecordDto studentTrainStat(SysMusicCompareRecordQueryInfo.StudentMusicCompareRecordQuery query);
+
+    //训练时长榜
+    SysMusicCompareRecordQueryInfo.StatDto rankingList(SysMusicCompareRecordQueryInfo.StudentCompareRecordQueryInfo queryInfo);
 }

+ 15 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMusicCompareWeekDataService.java

@@ -0,0 +1,15 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.yonge.cooleshow.biz.dal.dao.SysMusicCompareWeekDataDao;
+import com.yonge.cooleshow.biz.dal.entity.SysMusicCompareWeekData;
+import com.yonge.toolset.mybatis.service.BaseService;
+
+import java.time.LocalDate;
+
+public interface SysMusicCompareWeekDataService extends BaseService<Integer, SysMusicCompareWeekData> {
+    SysMusicCompareWeekDataDao getDao();
+
+    //更新学员本周训练统计数据
+    void updateUserWeekTrainData(Long Long, LocalDate monday);
+
+}

+ 7 - 26
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java

@@ -14,21 +14,10 @@ import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dao.UserBindingTeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.search.QueryMyFollowSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
-import com.yonge.cooleshow.biz.dal.entity.Student;
-import com.yonge.cooleshow.biz.dal.entity.StudentTotal;
-import com.yonge.cooleshow.biz.dal.entity.Subject;
-import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
-import com.yonge.cooleshow.biz.dal.entity.UserBindingTeacher;
-import com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord;
+import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
-import com.yonge.cooleshow.biz.dal.service.ImGroupService;
-import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
-import com.yonge.cooleshow.biz.dal.service.StudentService;
-import com.yonge.cooleshow.biz.dal.service.StudentTotalService;
-import com.yonge.cooleshow.biz.dal.service.SysConfigService;
-import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
-import com.yonge.cooleshow.biz.dal.service.UserTenantAlbumRecordService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.MyFollow;
 import com.yonge.cooleshow.biz.dal.vo.StudentHomeVo;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
@@ -53,14 +42,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.text.MessageFormat;
 import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 
@@ -80,18 +62,17 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     private SysUserMapper sysUserMapper;
     @Autowired
     private SubjectDao subjectDao;
-
     @Autowired
     private TenantInfoService tenantInfoService;
-
     @Autowired
     private UserTenantAlbumRecordService userTenantAlbumRecordService;
-
     @Autowired
     private SysConfigService sysConfigService;
 
-    @Autowired
-    private ImGroupService imGroupService;
+    @Override
+    public StudentDao getDao() {
+        return baseMapper;
+    }
 
     @Override
     public StudentVo detail(Long userId) {

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

@@ -3,8 +3,11 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.auth.api.entity.SysUserDevice;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetDao;
 import com.yonge.cooleshow.biz.dal.dao.SysMusicCompareRecordDao;
+import com.yonge.cooleshow.biz.dal.dao.SysMusicCompareWeekDataDao;
 import com.yonge.cooleshow.biz.dal.dto.IndexBaseDto;
 import com.yonge.cooleshow.biz.dal.dto.IndexBaseMonthData;
 import com.yonge.cooleshow.biz.dal.dto.StudentTrainChartDto;
@@ -34,6 +37,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -54,10 +58,8 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	private final static Logger log = LoggerFactory.getLogger(SysMusicCompareRecordServiceImpl.class);
 	@Autowired
 	private SysMusicCompareRecordDao sysMusicCompareRecordDao;
-
 	@Autowired
 	private SysConfigService sysConfigService;
-
 	@Autowired
 	private MusicSheetDao musicSheetDao;
 	@Autowired
@@ -66,6 +68,10 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	private TeacherService teacherService;
 	@Autowired
 	private StudentService studentService;
+	@Autowired
+	private SysUserService sysUserService;
+	@Autowired
+	private SysMusicCompareWeekDataService sysMusicCompareWeekDataService;
 
 	@Override
 	public BaseDAO<Long, SysMusicCompareRecord> getDAO() {
@@ -226,6 +232,8 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 					}
 
 				}
+				//按周统计
+				sysMusicCompareWeekDataService.updateUserWeekTrainData(record.getUserId(), LocalDate.now().with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()));
 
 			} catch (Exception e) {
 				log.error("MusicCompareRecordStat userId={}, musicId={}", record.getUserId(), record.getMusicSheetId(), e);
@@ -445,8 +453,60 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		return sysMusicCompareRecordDao.studentTrainStat(query);
 	}
 
+    @Override
+    public SysMusicCompareRecordQueryInfo.StatDto rankingList(SysMusicCompareRecordQueryInfo.StudentCompareRecordQueryInfo queryInfo) {
+		SysMusicCompareRecordQueryInfo.StatDto result = new SysMusicCompareRecordQueryInfo.StatDto();
+		SysMusicCompareRecordQueryInfo.MusicCompareRankingDto head = new SysMusicCompareRecordQueryInfo.MusicCompareRankingDto();
+		head.setUserId(queryInfo.getUserId());
+		List<SysMusicCompareRecordQueryInfo.MusicCompareRankingDto> userTrainStat = sysMusicCompareWeekDataService.getDao().getUserTrainStat(queryInfo.getStartTime(),
+				queryInfo.getOrderType(),
+				Objects.isNull(queryInfo.getHeardLevel())?null:queryInfo.getHeardLevel().getCode(),
+				queryInfo.getTenantId());
+		List<SysMusicCompareRecordQueryInfo.MusicCompareRankingDto> detail = new ArrayList<>();
+
+		List<Long> studentIds = userTrainStat.stream().limit(10).
+				map(SysMusicCompareRecordQueryInfo.MusicCompareRankingDto::getUserId).collect(Collectors.toList());
+		Map<Integer, String> studentSubjectMap = new HashMap<>();
+		if(!org.springframework.util.CollectionUtils.isEmpty(studentIds)){
+			List<Map<Integer, String>> studentSubjectMapList = studentService.getDao().getStudentSubjectMapList(studentIds);
+			studentSubjectMap = MapUtil.convertIntegerMap(studentSubjectMapList);
+		}
+
+		int rankNum = 0;
+		for (int i = 0; i < userTrainStat.size(); i++) {
+			if(userTrainStat.get(i).getUserId().equals(queryInfo.getUserId())){
+				head = userTrainStat.get(i);
+			}
+			userTrainStat.get(i).setTrainTime(userTrainStat.get(i).getTrainTime()/60);
+			if(userTrainStat.get(i).getVipUser() <= 0){
+				continue;
+			}
+			userTrainStat.get(i).setRankNum(++rankNum);
+			if(studentSubjectMap.containsKey(userTrainStat.get(i).getUserId())){
+				userTrainStat.get(i).setSubjectName(studentSubjectMap.get(userTrainStat.get(i).getUserId()));
+			}
+			if(detail.size()<10){
+				detail.add(userTrainStat.get(i));
+			}
+		}
+		Map<String,Object> params = new HashMap<String, Object>(1);
+		params.put("tenantId", queryInfo.getTenantId());
+		head.setStudentNum(studentService.getDao().countStudentsWithTenant(params));
+		if(StringUtils.isBlank(head.getAvatar())){
+			SysUser user = sysUserService.findUserById(queryInfo.getUserId());
+			if(user != null){
+				head.setAvatar(user.getAvatar());
+			}
+		}
+		result.setHead(head);
+		detail.sort(Comparator.comparing(SysMusicCompareRecordQueryInfo.MusicCompareRankingDto::getRankNum).
+				thenComparing(SysMusicCompareRecordQueryInfo.MusicCompareRankingDto::getUserId));
+		result.setDetail(detail);
+		return result;
+    }
+
 
-	private String getExpireTime() {
+    private String getExpireTime() {
 
 		String homeworkExpireTime = sysConfigService.findConfigValue(SysConfigConstant.HOMEWORK_EXPIRE_TIME);
 		if (org.springframework.util.StringUtils.isEmpty(homeworkExpireTime)) {

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

@@ -0,0 +1,54 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.yonge.cooleshow.biz.dal.dao.SysMusicCompareRecordDao;
+import com.yonge.cooleshow.biz.dal.dao.SysMusicCompareWeekDataDao;
+import com.yonge.cooleshow.biz.dal.entity.SysMusicCompareWeekData;
+import com.yonge.cooleshow.biz.dal.enums.HeardLevelEnum;
+import com.yonge.cooleshow.biz.dal.service.SysMusicCompareWeekDataService;
+import com.yonge.toolset.mybatis.dal.BaseDAO;
+import com.yonge.toolset.mybatis.service.impl.BaseServiceImpl;
+import com.yonge.toolset.utils.date.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.sql.Date;
+import java.time.LocalDate;
+import java.util.Objects;
+
+@Service
+public class SysMusicCompareWeekDataServiceImpl extends BaseServiceImpl<Integer, SysMusicCompareWeekData> implements SysMusicCompareWeekDataService {
+
+	@Autowired
+	private SysMusicCompareWeekDataDao sysMusicCompareWeekDataDao;
+	@Autowired
+	private SysMusicCompareRecordDao sysMusicCompareRecordDao;
+
+	@Override
+	public BaseDAO<Integer, SysMusicCompareWeekData> getDAO() {
+		return sysMusicCompareWeekDataDao;
+	}
+
+	@Override
+	public SysMusicCompareWeekDataDao getDao() {
+		return sysMusicCompareWeekDataDao;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void updateUserWeekTrainData(Long userId, LocalDate monday) {
+		SysMusicCompareWeekData userWeekData = sysMusicCompareWeekDataDao.getWithUserAndMonday(userId, monday.toString());
+		SysMusicCompareWeekData userWeekCompareData = sysMusicCompareRecordDao.getUserWeekCompareData(userId, monday.toString());
+		userWeekCompareData.setUserId(userId);
+		userWeekCompareData.setMonday(Date.from(monday.atStartOfDay(DateUtil.zoneId).toInstant()));
+		userWeekCompareData.setBeginnerMaxScoreId(sysMusicCompareRecordDao.getUserWeekMaxMusicScoreId(userId, monday.toString(), HeardLevelEnum.BEGINNER));
+		userWeekCompareData.setAdvancedMaxScoreId(sysMusicCompareRecordDao.getUserWeekMaxMusicScoreId(userId, monday.toString(), HeardLevelEnum.ADVANCED));
+		userWeekCompareData.setPerformerMaxScoreId(sysMusicCompareRecordDao.getUserWeekMaxMusicScoreId(userId, monday.toString(), HeardLevelEnum.PERFORMER));
+		if(Objects.isNull(userWeekData)){
+			sysMusicCompareWeekDataDao.insert(userWeekCompareData);
+		}else{
+			sysMusicCompareWeekDataDao.update(userWeekCompareData);
+		}
+	}
+}

+ 24 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -284,4 +284,28 @@
             and u.username_ LIKE CONCAT('%', #{param.username}, '%')
         </if>
     </select>
+
+    <select id="getStudentSubjectMapList" resultType="java.util.Map">
+        SELECT stu.user_id_ 'key',sub.name_ 'value'
+        FROM student stu
+        LEFT JOIN `subject` sub ON stu.subject_id_list_ = sub.id_
+        WHERE stu.user_id_ IN
+        <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+            #{studentId}
+        </foreach>
+    </select>
+
+    <select id="countStudentsWithTenant" resultType="int">
+        SELECT
+        COUNT(su.id_)
+        FROM
+        sys_user su
+        WHERE
+        su.tenant_id_ = #{tenantId}
+        AND su.del_flag_=0 AND su.lock_flag_=0
+        AND FIND_IN_SET('STUDENT',su.user_type_)
+        <if test="search != null">
+            AND (su.username_ LIKE CONCAT('%', #{search}, '%') OR su.phone_ LIKE CONCAT('%', #{search}, '%'))
+        </if>
+    </select>
 </mapper>

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

@@ -452,6 +452,18 @@
 		</if>
 		group by smcr.user_id_
 	</select>
-	<!--曲目练习统计-->
+    <select id="getUserWeekCompareData"
+            resultType="com.yonge.cooleshow.biz.dal.entity.SysMusicCompareWeekData">
+		SELECT
+			COUNT(smcr.id_) trainNum,
+			COUNT(DISTINCT DATE(smcr.create_time_)) trainDays,
+			SUM(smcr.play_time_) trainTime,
+			MAX(IF(heard_level_='BEGINNER' AND source_time_ &gt;= play_time_, smcr.score_, 0)) beginnerMaxScore,
+			MAX(IF(heard_level_='ADVANCED' AND source_time_ &gt;= play_time_, smcr.score_, 0)) advancedMaxScore,
+			MAX(IF(heard_level_='PERFORMER' AND source_time_ &gt;= play_time_, smcr.score_, 0)) performerMaxScore,smcr.tenant_id_ tenantId
+		FROM sys_music_compare_record smcr
+		WHERE user_id_=#{userId} AND monday_ = #{monday}
+	</select>
+    <!--曲目练习统计-->
 
 </mapper>

+ 170 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareWeekDataMapper.xml

@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.yonge.cooleshow.biz.dal.dao.SysMusicCompareWeekDataDao">
+	
+	<resultMap type="com.yonge.cooleshow.biz.dal.entity.SysMusicCompareWeekData" id="SysMusicCompareWeekData">
+		<result column="user_id_" property="userId" />
+		<result column="monday_" property="monday" />
+		<result column="train_num_" property="trainNum" />
+		<result column="train_days_" property="trainDays" />
+		<result column="train_time_" property="trainTime" />
+		<result column="beginner_max_score_" property="beginnerMaxScore" />
+		<result column="advanced_max_score_" property="advancedMaxScore" />
+		<result column="performer_max_score_" property="performerMaxScore" />
+        <result column="tenant_id_" property="tenantId"/>
+	</resultMap>
+	
+	
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="SysMusicCompareWeekData">
+		SELECT * FROM sys_music_compare_week_data where tenant_id_ = #{tenantId}
+	</select>
+	
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.yonge.cooleshow.biz.dal.entity.SysMusicCompareWeekData">
+		INSERT INTO sys_music_compare_week_data (user_id_,monday_,train_num_,train_days_,train_time_,
+		                                         beginner_max_score_,beginner_max_score_id_,advanced_max_score_,advanced_max_score_id_,
+		                                         performer_max_score_,performer_max_score_id_,
+		                                         create_time_,update_time_,tenant_id_)
+		VALUES(#{userId},#{monday},#{trainNum},#{trainDays},#{trainTime},#{beginnerMaxScore},#{beginnerMaxScoreId},
+		       #{advancedMaxScore},#{advancedMaxScoreId},#{performerMaxScore},#{performerMaxScoreId},NOW(),NOW(),#{tenantId})
+	</insert>
+	
+	<update id="update" parameterType="com.yonge.cooleshow.biz.dal.entity.SysMusicCompareWeekData">
+		UPDATE sys_music_compare_week_data
+		<set>
+			<if test="trainNum!=null">
+				train_num_ = #{trainNum},
+			</if>
+			<if test="trainDays!=null">
+				train_days_ = #{trainDays},
+			</if>
+			<if test="trainTime!=null">
+				train_time_ = #{trainTime},
+			</if>
+			<if test="beginnerMaxScore!=null">
+				beginner_max_score_ = #{beginnerMaxScore},
+			</if>
+			<if test="beginnerMaxScoreId!=null">
+				beginner_max_score_id_ = #{beginnerMaxScoreId},
+			</if>
+			<if test="advancedMaxScore!=null">
+				advanced_max_score_ = #{advancedMaxScore},
+			</if>
+			<if test="advancedMaxScoreId!=null">
+				advanced_max_score_id_ = #{advancedMaxScoreId},
+			</if>
+			<if test="performerMaxScore!=null">
+				performer_max_score_ = #{performerMaxScore},
+			</if>
+			<if test="performerMaxScoreId!=null">
+				performer_max_score_id_ = #{performerMaxScoreId},
+			</if>
+			update_time_ = NOW()
+		</set>
+		WHERE user_id_=#{userId} AND monday_ = #{monday} and tenant_id_ = #{tenantId}
+	</update>
+	
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="SysMusicCompareWeekData" parameterType="map">
+		SELECT * FROM sys_music_compare_week_data where tenant_id_ = #{tenantId} <include refid="global.limit"/>
+	</select>
+	
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM sys_music_compare_week_data where tenant_id_ = #{tenantId}
+	</select>
+
+	<select id="getWithUserAndMonday" resultMap="SysMusicCompareWeekData">
+		SELECT * FROM sys_music_compare_week_data WHERE user_id_=#{userId} AND monday_=#{monday}
+	</select>
+
+	<select id="getUserTrainStat" resultType="com.yonge.cooleshow.biz.dal.queryInfo.SysMusicCompareRecordQueryInfo$MusicCompareRankingDto">
+		SELECT
+		smcwd.user_id_ userId,
+			su.avatar_ avatar,
+			su.username_ studentName,
+			<if test="orderType==1">
+				sms.name_ musicScoreName,
+				<if test="heardLevel==null">
+					smcwd.advanced_max_score_ score,
+				</if>
+				<if test="heardLevel=='BEGINNER'">
+					smcwd.beginner_max_score_ score,
+				</if>
+				<if test="heardLevel=='ADVANCED'">
+					smcwd.advanced_max_score_ score,
+				</if>
+				<if test="heardLevel=='PERFORMER'">
+					smcwd.performer_max_score_ score,
+				</if>
+			</if>
+			smcwd.train_num_ trainNum,
+			smcwd.train_days_ trainDays,
+			smcwd.train_time_ trainTime,
+			case when stu.membership_end_time_ &gt; now() then 1 else 0 end vipUser
+		FROM sys_music_compare_week_data smcwd
+		LEFT JOIN sys_user su ON smcwd.user_id_=su.id_
+		LEFT JOIN student stu ON smcwd.user_id_ = stu.user_id_
+		<if test="orderType==1">
+			LEFT JOIN sys_music_score sms
+			<if test="heardLevel==null">
+				ON smcwd.advanced_max_score_id_ = sms.id_
+			</if>
+			<if test="heardLevel=='BEGINNER'">
+				ON smcwd.beginner_max_score_id_ = sms.id_
+			</if>
+			<if test="heardLevel=='ADVANCED'">
+				ON smcwd.advanced_max_score_id_ = sms.id_
+			</if>
+			<if test="heardLevel=='PERFORMER'">
+				ON smcwd.performer_max_score_id_ = sms.id_
+			</if>
+		</if>
+		WHERE smcwd.monday_ = #{monday}
+			AND stu.user_id_ = smcwd.user_id_ and smcwd.tenant_id_ = #{tenantId}
+			<if test="orderType==1">
+				<if test="heardLevel==null">
+					AND smcwd.advanced_max_score_ > 0
+				</if>
+				<if test="heardLevel=='BEGINNER'">
+					AND smcwd.beginner_max_score_ > 0
+				</if>
+				<if test="heardLevel=='ADVANCED'">
+					AND smcwd.advanced_max_score_ > 0
+				</if>
+				<if test="heardLevel=='PERFORMER'">
+					AND smcwd.performer_max_score_ > 0
+				</if>
+			</if>
+			ORDER BY
+			<if test="orderType==null">
+				smcwd.train_time_ DESC,
+			</if>
+			<if test="orderType==0">
+				smcwd.train_time_ DESC,
+			</if>
+			<if test="orderType==1">
+				<if test="heardLevel==null">
+					smcwd.advanced_max_score_ DESC,
+				</if>
+				<if test="heardLevel=='BEGINNER'">
+					smcwd.beginner_max_score_ DESC,
+				</if>
+				<if test="heardLevel=='ADVANCED'">
+					smcwd.advanced_max_score_ DESC,
+				</if>
+				<if test="heardLevel=='PERFORMER'">
+					smcwd.performer_max_score_ DESC,
+				</if>
+			</if>
+			<if test="orderType==2">
+				smcwd.train_days_ DESC,
+			</if>
+			smcwd.user_id_
+	</select>
+</mapper>

+ 24 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/SysMusicCompareRecordController.java

@@ -10,6 +10,7 @@ import com.yonge.toolset.base.page.PageInfo;
 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;
@@ -49,4 +50,27 @@ public class SysMusicCompareRecordController extends BaseController {
         return succeed(sysMusicCompareRecordService.studentTrainStat(query));
     }
 
+    @ApiOperation("云教练排行榜")
+    @GetMapping("rankingList")
+    public HttpResponseResult<SysMusicCompareRecordQueryInfo.StatDto> rankingList(SysMusicCompareRecordQueryInfo.StudentCompareRecordQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        queryInfo.setUserId(sysUser.getId());
+        queryInfo.setTenantId(sysUser.getTenantId());
+        return succeed(sysMusicCompareRecordService.rankingList(queryInfo));
+    }
+
+    @ApiOperation("学员训练数据统计")
+    @GetMapping("studentTrainData")
+    public HttpResponseResult studentTrainData(SysMusicCompareRecordQueryInfo.TeacherCompareRecordQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        queryInfo.setUserId(sysUser.getId());
+        return succeed(sysMusicCompareRecordService.studentTrainData(queryInfo));
+    }
+
 }