Bladeren bron

add:学生最近练习曲目表

liujunchi 3 jaren geleden
bovenliggende
commit
37bfec3e95
13 gewijzigde bestanden met toevoegingen van 363 en 6 verwijderingen
  1. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java
  2. 40 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetPracticeRecordDao.java
  3. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetPracticeRecordSearch.java
  4. 69 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheetPracticeRecord.java
  5. 48 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetPracticeRecordService.java
  6. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  7. 48 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetPracticeRecordServiceImpl.java
  8. 27 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  9. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetDetailVo.java
  10. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetPracticeRecordVo.java
  11. 27 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  12. 36 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetPracticeRecordMapper.xml
  13. 20 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java

@@ -69,4 +69,14 @@ public interface MusicSheetDao extends BaseMapper<MusicSheet> {
      */
     List<MusicSheetVo> selectFavoriteMusicPage(@Param("page") IPage<MusicSheetVo> page, @Param(
             "param") StudentMusicSheetSearch query);
+
+    /**
+     * 最近练习曲目
+     *
+     * @param query               查询条件
+     * @param practiceMusicIdList 最近练习曲目id
+     * @return list
+     */
+    List<MusicSheetVo> selectPracticeMusicPage(@Param("param") StudentMusicSheetSearch query,
+                                               @Param("practiceMusicIdList") List<Long> practiceMusicIdList);
 }

+ 40 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetPracticeRecordDao.java

@@ -0,0 +1,40 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
+import org.apache.ibatis.annotations.Param;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheetPracticeRecord;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetPracticeRecordVo;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetPracticeRecordSearch;
+
+
+public interface MusicSheetPracticeRecordDao extends BaseMapper<MusicSheetPracticeRecord> {
+	/**
+	 * 查询详情
+	 *
+	 * @author liweifan
+	 * @date 2022-04-02 10:05:39
+	 * @return: com.yonge.cooleshow.biz.dal.vo.MusicSheetPracticeRecordVo
+	 */
+	MusicSheetPracticeRecordVo detail(@Param("id") Long id);
+
+	/**
+	 * 分页查询
+	 *
+	 * @author liweifan
+	 * @date 2022-04-02 10:05:39
+	 * @return: com.yonge.cooleshow.biz.dal.vo.MusicSheetPracticeRecordVo
+	 */
+	List<MusicSheetPracticeRecordVo> selectPage(@Param("page") IPage page, @Param("param") MusicSheetPracticeRecordSearch musicSheetPracticeRecord);
+
+	/**
+	 * 查询学生最近练习的曲目id
+	 *
+	 * @param query 查询条件
+	 * @return 曲目id 集合
+	 */
+	List<Long> selectPracticeMusicIdPage(@Param("iPage") IPage<Long> iPage, @Param("param") StudentMusicSheetSearch query);
+}

+ 14 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetPracticeRecordSearch.java

@@ -0,0 +1,14 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import com.yonge.cooleshow.biz.dal.support.Query;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022-04-02 10:05:39
+ */
+@ApiModel(value = "MusicSheetPracticeRecordSearch对象", description = "曲目练习记录表查询对象")
+public class MusicSheetPracticeRecordSearch extends Query{
+	private static final long serialVersionUID = 1L;
+
+}

+ 69 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheetPracticeRecord.java

@@ -0,0 +1,69 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 曲目练习记录表
+ */
+@TableName("music_sheet_practice_record")
+@ApiModel(value = "MusicSheetPracticeRecord对象", description = "曲目练习记录表")
+public class MusicSheetPracticeRecord implements Serializable {
+	private static final long serialVersionUID = 1L;
+    @ApiModelProperty("主键 ")
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+    @ApiModelProperty("用户ID(目前只是学生ID) ")
+	@TableField(value = "user_id_")
+    private Long userId;
+    @ApiModelProperty("曲目ID ")
+	@TableField(value = "music_sheet_id_")
+    private Long musicSheetId;
+    @ApiModelProperty("创建时间 ")
+	@TableField(value = "create_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date createTime;
+
+	public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+    
+	public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+    
+	public Long getMusicSheetId() {
+        return musicSheetId;
+    }
+
+    public void setMusicSheetId(Long musicSheetId) {
+        this.musicSheetId = musicSheetId;
+    }
+    
+	public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+    
+}

+ 48 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetPracticeRecordService.java

@@ -0,0 +1,48 @@
+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.biz.dal.dto.search.StudentMusicSheetSearch;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetPracticeRecordVo;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetPracticeRecordSearch;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheetPracticeRecord;
+
+/**
+ * 曲目练习记录表 服务类
+ * @author liweifan
+ * @date 2022-04-02
+ */
+public interface MusicSheetPracticeRecordService extends IService<MusicSheetPracticeRecord>  {
+
+	/**
+     * 查询详情
+     * @author liweifan
+ 	 * @date 2022-04-02
+     */
+	MusicSheetPracticeRecordVo detail(Long id);
+
+    /**
+     * 分页查询
+     * @author liweifan
+ 	 * @date 2022-04-02
+     */
+    IPage<MusicSheetPracticeRecordVo> selectPage(IPage<MusicSheetPracticeRecordVo> page, MusicSheetPracticeRecordSearch query);
+
+	/**
+	 * 添加曲目练习记录
+	 *
+	 * @param musicSheetId 曲目id
+	 * @param userId 用户id
+	 */
+	void addRecord(Long musicSheetId, Long userId);
+
+	/**
+	 * 查询学生最近练习的曲目id
+	 *
+	 * @param query 查询条件
+	 * @param page 当前页
+	 * @param size 展示数据
+	 * @return 曲目id 集合
+	 */
+	IPage<Long> selectPracticeMusic(StudentMusicSheetSearch query, long page, long size);
+}

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java

@@ -107,4 +107,13 @@ public interface MusicSheetService extends IService<MusicSheet> {
      * @return
      */
     IPage<MusicSheetVo> favoriteMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query);
+
+    /**
+     * 最近练习曲目
+     *
+     * @param page 分页信息
+     * @param query 查询条件
+     * @return page
+     */
+    IPage<MusicSheetVo> practiceMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query);
 }

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

@@ -0,0 +1,48 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
+import org.springframework.stereotype.Service;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheetPracticeRecord;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetPracticeRecordVo;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetPracticeRecordSearch;
+import com.yonge.cooleshow.biz.dal.dao.MusicSheetPracticeRecordDao;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetPracticeRecordService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+
+
+@Service
+public class MusicSheetPracticeRecordServiceImpl extends ServiceImpl<MusicSheetPracticeRecordDao, MusicSheetPracticeRecord> implements MusicSheetPracticeRecordService {
+
+	@Override
+    public MusicSheetPracticeRecordVo detail(Long id) {
+        MusicSheetPracticeRecordVo detail = baseMapper.detail(id);
+        return detail;
+    }
+    
+     @Override
+    public IPage<MusicSheetPracticeRecordVo> selectPage(IPage<MusicSheetPracticeRecordVo> page, MusicSheetPracticeRecordSearch query){
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addRecord(Long musicSheetId, Long userId) {
+        MusicSheetPracticeRecord musicSheetPracticeRecord = new MusicSheetPracticeRecord();
+        musicSheetPracticeRecord.setMusicSheetId(musicSheetId);
+        musicSheetPracticeRecord.setUserId(userId);
+        musicSheetPracticeRecord.setCreateTime(new Date());
+        this.save(musicSheetPracticeRecord);
+    }
+
+    @Override
+    public IPage<Long> selectPracticeMusic(StudentMusicSheetSearch query, long page, long size) {
+        IPage<Long> iPage = new Page<>(page,size);
+        return iPage.setRecords(baseMapper.selectPracticeMusicIdPage(iPage,query));
+    }
+
+}

+ 27 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java

@@ -9,10 +9,7 @@ import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
-import com.yonge.cooleshow.biz.dal.entity.MusicFavorite;
-import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
-import com.yonge.cooleshow.biz.dal.entity.MusicSheetAccompaniment;
-import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.AuditEnum;
 import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.StateEnum;
@@ -31,6 +28,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -59,6 +57,9 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     private MusicSheetPurchaseRecordService musicSheetPurchaseRecordService;
 
     @Autowired
+    private MusicSheetPracticeRecordService musicSheetPracticeRecordService;
+
+    @Autowired
     private StudentService studentService;
 
     public MusicSheetDao getDao() {
@@ -138,9 +139,9 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
             detail.setPlay(YesOrNoEnum.YES);
         }  else if (SysUserType.STUDENT.getCode().equals(userType.getCode())) {
             detail.setPlay(YesOrNoEnum.NO);
-            // 学生须判断是否能播放曲目
             // 单曲购买 判断购买记录,有记录课播放
             if (ChargeTypeEnum.CHARGE.getCode().equals(detail.getChargeType().getCode())) {
+                // 学生须判断是否能播放曲目
                 boolean b = musicSheetPurchaseRecordService.checkPurchase(sysUser.getId(),detail.getId());
                 if (b) {
                     detail.setPlay(YesOrNoEnum.YES);
@@ -152,6 +153,8 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
                     detail.setPlay(YesOrNoEnum.YES);
                 }
             }
+            // 学生进入云教练练习,添加一条练习记录
+            musicSheetPracticeRecordService.addRecord(id,sysUser.getId());
         } else {
             detail.setPlay(YesOrNoEnum.YES);
         }
@@ -188,4 +191,23 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     public IPage<MusicSheetVo> favoriteMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query) {
         return page.setRecords(baseMapper.selectFavoriteMusicPage(page,query));
     }
+
+    @Override
+    public IPage<MusicSheetVo> practiceMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query) {
+        // 预计最近练习表数据量会很多
+        // 先找到最近练习的曲目id 在根据曲目id进行精确查找
+        IPage<Long> practiceMusicIdPage = musicSheetPracticeRecordService.selectPracticeMusic(query,page.getPages(),page.getSize());
+        List<Long> practiceMusicIdList = practiceMusicIdPage.getRecords();
+        if (CollectionUtils.isEmpty(practiceMusicIdList)) {
+            page.setRecords(new ArrayList<>());
+            return page;
+        }
+        // 构建分页信息
+        page.setRecords(baseMapper.selectPracticeMusicPage(query,practiceMusicIdList));
+        page.setPages(practiceMusicIdPage.getPages());
+        page.setCurrent(practiceMusicIdPage.getCurrent());
+        page.setSize(practiceMusicIdPage.getSize());
+        page.setTotal(practiceMusicIdPage.getTotal());
+        return page;
+    }
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetDetailVo.java

@@ -18,7 +18,7 @@ public class MusicSheetDetailVo extends MusicSheet {
     @ApiModelProperty("曲谱伴奏")
     private List<MusicSheetAccompaniment> background;
 
-    @ApiModelProperty("是否能播放(0:否,1:是)")
+    @ApiModelProperty("是否能播放(0:否,1:是) 学生端进入云教练判断 试用/完整 播放")
     private YesOrNoEnum play;
 
     public List<MusicSheetAccompaniment> getBackground() {

+ 14 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetPracticeRecordVo.java

@@ -0,0 +1,14 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.biz.dal.entity.MusicSheetPracticeRecord;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022-04-02 10:05:39
+ */
+@ApiModel(value = "MusicSheetPracticeRecordVo对象", description = "曲目练习记录表查询视图对象")
+public class MusicSheetPracticeRecordVo extends MusicSheetPracticeRecord{
+	private static final long serialVersionUID = 1L;
+
+}

+ 27 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

@@ -244,4 +244,31 @@
             </if>
         </where>
     </select>
+
+    <select id="selectPracticeMusicPage" resultType="com.yonge.cooleshow.biz.dal.vo.MusicSheetVo">
+        select <include refid="Base_Column_List"/>
+        ,su.username_ as addName
+        ,su.avatar_ as addUserAvatar
+        ,(select group_concat(mt.name_) from music_tag mt
+        where find_in_set(mt.id_,t.music_tag_) and mt.del_flag_ = 0) as musicTagNames
+        ,(select group_concat(s.name_) from subject s where find_in_set(s.id_,t.music_subject_) ) as subjectNames
+        from music_sheet t
+        left join sys_user su on t.create_by_ = su.id_
+        <where>
+            <include refid="QueryInfo"/>
+            <if test="practiceMusicIdList != null and practiceMusicIdList.size() != 0">
+                and t.id_ in
+                <foreach collection="practiceMusicIdList" item="item" open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+        <if test="practiceMusicIdList != null and practiceMusicIdList.size() != 0">
+            order by field(t.id_,
+            <foreach collection="practiceMusicIdList" item="item" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        )
+    </select>
 </mapper>

+ 36 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetPracticeRecordMapper.xml

@@ -0,0 +1,36 @@
+<?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.MusicSheetPracticeRecordDao">
+	<resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.MusicSheetPracticeRecord">
+            <result column="id_" property="id" />
+	        <result column="user_id_" property="userId" />
+	        <result column="music_sheet_id_" property="musicSheetId" />
+	        <result column="create_time_" property="createTime" />
+		</resultMap>  
+    
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id_
+        , t.user_id_
+        , t.music_sheet_id_
+        , t.create_time_
+        </sql>
+
+	<select id="selectPracticeMusicIdPage" resultType="java.lang.Long">
+        select t.music_sheet_id_ from  (select mspr.music_sheet_id_
+        from music_sheet_practice_record mspr
+        left join music_sheet ms on mspr.music_sheet_id_ = ms.id_
+        <where>
+            <if test="param.auditStatus !=null">
+                and ms.audit_status_ = #{param.auditStatus}
+            </if>
+            <if test="param.state != null">
+                and ms.state_ = #{param.state}
+            </if>
+            <if test="param.studentId != null">
+                and mspr.user_id_ = #{param.studentId}
+            </if>
+        </where>
+        order by mspr.create_time_) t group by t.music_sheet_id_
+    </select>
+</mapper>

+ 20 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java

@@ -118,4 +118,24 @@ public class MusicSheetController extends BaseController {
         IPage<MusicSheetVo> sheetVoIPage = musicSheetService.favoriteMusic(PageUtil.getPage(query),search);
         return succeed(PageUtil.pageInfo(sheetVoIPage));
     }
+
+
+    /**
+     * 最近练习
+     */
+    @GetMapping("/practice")
+    @ApiOperation(value = "最近练习")
+    public HttpResponseResult<PageInfo<MusicSheetVo>> practiceMusic(Query query) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        StudentMusicSheetSearch search = new StudentMusicSheetSearch();
+        search.setStudentId(sysUser.getId());
+        search.setState(StateEnum.ENABLE);
+        search.setAuditStatus(AuditEnum.OPEN);
+        IPage<MusicSheetVo> sheetVoIPage = musicSheetService.practiceMusic(PageUtil.getPage(query),search);
+        return succeed(PageUtil.pageInfo(sheetVoIPage));
+    }
+
 }