刘俊驰 7 tháng trước cách đây
mục cha
commit
8a81d8a0a5

+ 128 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/MusicSheetCbsController.java

@@ -0,0 +1,128 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.dayaedu.cbs.common.enums.school.EMusicSheetType;
+import com.dayaedu.cbs.openfeign.wrapper.music.CbsMusicSheetWrapper;
+import com.microsvc.toolkit.common.response.template.R;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.AppVersionInfoService;
+import com.yonge.cooleshow.biz.dal.service.InstrumentService;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
+import com.yonge.cooleshow.biz.dal.wrapper.InstrumentWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.MusicSheetWrapper;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 曲谱表 web 控制层
+ * @author yzp
+ * @date 2022-03-26 00:21:46
+ * @version v1.0
+ **/
+@RestController
+@RequestMapping("${app-config.url.admin:}/musicSheet")
+@Api(tags = "曲谱表 API接口")
+public class MusicSheetCbsController extends BaseController {
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+
+	@Resource
+	private MusicSheetService musicSheetService;
+
+    @Resource
+    private AppVersionInfoService appVersionInfoService;
+
+    @Resource
+    private StudentService studentService;
+
+    @Autowired
+    private InstrumentService instrumentService;
+
+
+    /**
+     * 查询单条
+     *
+     * @param id 详情ID
+     * @return R<MusicSheetVo.MusicSheet>
+     */
+    @ApiOperation(value = "查询内容平台数据")
+    @ApiImplicitParams({
+        @ApiImplicitParam(name = "id", value = "id", dataType = "long")
+    })
+    @GetMapping("/cbsDetail/{id}")
+    public R<MusicSheetVo.MusicSheetDetail> cbsDetail(@PathVariable("id") Long id,
+                                                      @RequestParam(required = false) String tenantAlbumId) {
+
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            sysUser = null;
+        }
+        CbsMusicSheetWrapper.MusicSheet musicSheet = musicSheetService.cbsDetail(id);
+        musicSheet.setBizId(id);
+
+        MusicSheetVo.MusicSheetDetail musicSheetDetail = JSON.parseObject(JSON.toJSONString(musicSheet), MusicSheetVo.MusicSheetDetail.class);
+        MusicSheetDetailVo detail = musicSheetService.detail(id.toString(), sysUser, ClientEnum.SYSTEM, tenantAlbumId);
+        if (detail == null) {
+//            musicSheetDetail.setBizMusicCategoryId(null);
+        } else {
+            // 设置曲目付费类型
+            musicSheetDetail.setPaymentType(detail.getPaymentType());
+            // 设置业务端曲目分类
+//            musicSheetDetail.setBizMusicCategoryId(detail.getCategoriesId() == null ? null : detail.getCategoriesId().longValue());
+            musicSheetDetail.setScoreType(detail.getScoreType());
+            musicSheetDetail.setIsConvertibleScore(detail.getNotation() ==YesOrNoEnum.YES);
+            musicSheetDetail.setPlay(detail.getPlay());
+            musicSheetDetail.setBuyed(detail.getBuyed());
+            musicSheetDetail.setMusicPrice(detail.getMusicPrice());
+        }
+
+        // 如果是合奏 并且乐器ID = 2268
+        musicSheetDetail.setSpecialPercussionFlag(false);
+        if ("2268".equals(musicSheetDetail.getMusicalInstrumentIds()) && musicSheetDetail.getMusicSheetType() == EMusicSheetType.CONCERT) {
+            musicSheetDetail.setSpecialPercussionFlag(true);
+        }
+
+        // 设置乐器信息
+        if (StringUtils.isNotBlank(musicSheetDetail.getMusicalInstrumentIds())) {
+            List<Long> instrumentIds = Arrays.stream(musicSheetDetail.getMusicalInstrumentIds().split(","))
+                .map(Long::parseLong).collect(Collectors.toList());
+
+            if (CollectionUtils.isNotEmpty(instrumentIds) && CollectionUtils.isNotEmpty(musicSheetDetail.getMusicalInstruments())) {
+                Map<Long, InstrumentWrapper.Instrument> instrumentMap = instrumentService.getMapByIds(instrumentIds);
+                for (CbsMusicSheetWrapper.MusicalInstrument musicalInstrument : musicSheetDetail.getMusicalInstruments()) {
+                    InstrumentWrapper.Instrument instrument = instrumentMap.get(musicalInstrument.getId().longValue());
+                    if (instrument != null) {
+                        musicalInstrument.setOrientation(instrument.getOrientation());
+                    }
+
+                }
+            }
+        }
+        return R.from(musicSheetDetail);
+    }
+}

+ 1 - 1
cooleshow-app/src/main/java/com/yonge/cooleshow/student/MusicPracticeRecordController.java → cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MusicPracticeRecordController.java

@@ -1,4 +1,4 @@
-package com.yonge.cooleshow.student;
+package com.yonge.cooleshow.student.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.dayaedu.cbs.common.enums.music.EEvaluationStandard;

+ 7 - 2
cooleshow-app/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetCbsController.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.student.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.dayaedu.cbs.common.enums.school.EMusicSheetType;
 import com.dayaedu.cbs.openfeign.wrapper.music.CbsMusicSheetWrapper;
 import com.microsvc.toolkit.common.response.template.R;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
@@ -79,7 +80,8 @@ public class MusicSheetCbsController extends BaseController {
         @ApiImplicitParam(name = "id", value = "id", dataType = "long")
     })
     @GetMapping("/cbsDetail/{id}")
-    public R<MusicSheetVo.MusicSheetDetail> cbsDetail(@PathVariable("id") Long id) {
+    public R<MusicSheetVo.MusicSheetDetail> cbsDetail(@PathVariable("id") Long id,
+                                                      @RequestParam(required = false) String tenantAlbumId) {
 
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
@@ -89,7 +91,7 @@ public class MusicSheetCbsController extends BaseController {
         musicSheet.setBizId(id);
 
         MusicSheetVo.MusicSheetDetail musicSheetDetail = JSON.parseObject(JSON.toJSONString(musicSheet), MusicSheetVo.MusicSheetDetail.class);
-        MusicSheetDetailVo detail = musicSheetService.detail(id.toString(), sysUser, ClientEnum.STUDENT, null);
+        MusicSheetDetailVo detail = musicSheetService.detail(id.toString(), sysUser, ClientEnum.STUDENT, tenantAlbumId);
         if (detail == null) {
 //            musicSheetDetail.setBizMusicCategoryId(null);
         } else {
@@ -106,6 +108,9 @@ public class MusicSheetCbsController extends BaseController {
 
         // 如果是合奏 并且乐器ID = 2268
         musicSheetDetail.setSpecialPercussionFlag(false);
+        if ("2268".equals(musicSheetDetail.getMusicalInstrumentIds()) && musicSheetDetail.getMusicSheetType() == EMusicSheetType.CONCERT) {
+            musicSheetDetail.setSpecialPercussionFlag(true);
+        }
 
         // 设置乐器信息
         if (StringUtils.isNotBlank(musicSheetDetail.getMusicalInstrumentIds())) {

+ 137 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/MusicPracticeRecordController.java

@@ -0,0 +1,137 @@
+package com.yonge.cooleshow.teacher.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.dayaedu.cbs.common.enums.music.EEvaluationStandard;
+import com.dayaedu.cbs.openfeign.wrapper.music.CbsMusicSheetWrapper;
+import com.google.common.collect.Lists;
+import com.microsvc.toolkit.common.response.template.R;
+import com.microsvc.toolkit.common.webportal.exception.BizException;
+import com.yonge.cooleshow.biz.dal.entity.UserMusic;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.service.MusicPracticeRecordService;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
+import com.yonge.cooleshow.biz.dal.service.SysUserService;
+import com.yonge.cooleshow.biz.dal.service.UserMusicService;
+import com.yonge.cooleshow.biz.dal.wrapper.MusicPracticeRecordWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+import java.util.Objects;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("${app-config.url.teacher:}/musicPracticeRecord")
+@Api(tags = "曲目练习记录")
+public class MusicPracticeRecordController {
+
+    @Autowired
+    private MusicPracticeRecordService musicPracticeRecordService;
+
+    @Autowired
+    private UserMusicService userMusicService;
+
+    @Autowired
+    private MusicSheetService musicSheetService;
+
+    @Autowired
+    private SysUserService sysUserService;
+
+    /**
+     * 查询单条
+     * @param id 详情ID
+     * @return R<MusicPracticeRecordVo.MusicPracticeRecord>
+     */
+    @ApiOperation(value = "详情", notes = "曲目练习记录-根据详情ID查询单条, 传入id")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "id", dataType = "long")
+    })
+    @GetMapping("/detail/{id}")
+    public R<MusicPracticeRecordWrapper.MusicPracticeRecord> detail(@PathVariable("id") Long id) {
+
+        MusicPracticeRecordWrapper.Entity wrapper = musicPracticeRecordService.detail(id);
+
+        if (wrapper == null) {
+            throw new BizException("记录不存在");
+        }
+
+        // 上传过作品,用作品视频路径覆盖上传视频路径
+        // ID集合
+        Map<Long, UserMusic> userMusicMap = userMusicService.getMapByMusicPracticeRecordIds(Lists.newArrayList(Long.parseLong(wrapper.getId())));
+
+        UserMusic userMusic = userMusicMap.get(Long.parseLong(wrapper.getId()));
+        if (Objects.nonNull(userMusic)) {
+            wrapper.setVideoFilePath(userMusic.getVideoUrl());
+        }
+        MusicPracticeRecordWrapper.MusicPracticeRecord from = MusicPracticeRecordWrapper.MusicPracticeRecord.from(JSON.toJSONString(wrapper));
+
+        CbsMusicSheetWrapper.MusicSheet musicSheet = musicSheetService.cbsDetail(Long.parseLong(wrapper.getMusicSheetId()));
+        if (musicSheet != null) {
+            from.setRhythmFlag(musicSheet.getEvaluationStandard() != EEvaluationStandard.FREQUENCY);
+        }
+
+        return R.from(from);
+    }
+
+
+    /**
+     * 新增
+     * @param record MusicPracticeRecordVo.MusicPracticeRecord
+     * @return R<Boolean>
+     */
+    @ApiOperation(value = "新增", notes = "曲目练习记录- 传入 MusicPracticeRecordVo.MusicPracticeRecord")
+    @PostMapping("/save")
+    public R<String> add( @RequestBody MusicPracticeRecordWrapper.MusicPracticeRecord record) {
+
+        Long userId = sysUserService.getUserId();
+        record.userId(String.valueOf(userId)).clientType(ClientEnum.TEACHER.getCode());
+
+        // 新增数据
+        MusicPracticeRecordWrapper.MusicPracticeRecord from = MusicPracticeRecordWrapper.MusicPracticeRecord.from(record.jsonString());
+        if (record.getDelFlag() !=null && record.getDelFlag()) {
+            from.setDelFlag(false);
+            from.setHiddenFlag(true);
+        }
+
+        return R.from(musicPracticeRecordService.add(from));
+    }
+
+    @ApiOperation(value = "用户最后一次评测数据")
+    @ApiImplicitParams({
+        @ApiImplicitParam(name = "recordId", value = "曲目练习记录Id", dataType = "long")
+    })
+    @GetMapping("/getLastEvaluationMusicalNotesPlayStats")
+    public Object getLastEvaluationMusicalNotesPlayStats(Long recordId){
+        return R.from(musicPracticeRecordService.getLastEvaluationMusicalNotesPlayStats(recordId));
+    }
+
+    @ApiOperation(value = "上传音频文件")
+    @PostMapping("videoUpload")
+    public R<Boolean> videoUpload( @RequestBody MusicPracticeRecordWrapper.MusicPracticeRecord record){
+
+        if (Objects.isNull(record.getId())) {
+            throw BizException.from("recordId不能为空");
+        }
+        if (Objects.isNull(record.getVideoFilePath())) {
+            throw BizException.from("videoUrl不能为空");
+        }
+
+        MusicPracticeRecordWrapper.Entity practiceRecord = musicPracticeRecordService.getById(record.getId());
+        if (Objects.isNull(practiceRecord)) {
+            throw BizException.from("记录不存在");
+        }
+
+        practiceRecord.setVideoFilePath(record.getVideoFilePath());
+        musicPracticeRecordService.update(practiceRecord);
+
+        return R.from(true);
+    }
+
+}

+ 155 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetCbsController.java

@@ -0,0 +1,155 @@
+package com.yonge.cooleshow.teacher.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.dayaedu.cbs.common.enums.school.EMusicSheetType;
+import com.dayaedu.cbs.openfeign.wrapper.music.CbsMusicSheetWrapper;
+import com.microsvc.toolkit.common.response.template.R;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.Teacher;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
+import com.yonge.cooleshow.biz.dal.wrapper.InstrumentWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.MusicSheetWrapper;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 曲谱表 web 控制层
+ * @author yzp
+ * @date 2022-03-26 00:21:46
+ * @version v1.0
+ **/
+@RestController
+@RequestMapping("${app-config.url.teacher:}/musicSheet")
+@Api(tags = "曲谱表 API接口")
+public class MusicSheetCbsController extends BaseController {
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+
+	@Resource
+	private MusicSheetService musicSheetService;
+
+    @Resource
+    private AppVersionInfoService appVersionInfoService;
+
+    @Resource
+    private StudentService studentService;
+
+    @Autowired
+    private InstrumentService instrumentService;
+    @Autowired
+    private TeacherService teacherService;
+
+
+    /**
+     * 查询单条
+     *
+     * @param id 详情ID
+     * @return R<MusicSheetVo.MusicSheet>
+     */
+    @ApiOperation(value = "查询内容平台数据")
+    @ApiImplicitParams({
+        @ApiImplicitParam(name = "id", value = "id", dataType = "long")
+    })
+    @GetMapping("/cbsDetail/{id}")
+    public R<MusicSheetVo.MusicSheetDetail> cbsDetail(@PathVariable("id") Long id,
+                                                      @RequestParam(required = false) String tenantAlbumId) {
+
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            sysUser = null;
+        }
+        CbsMusicSheetWrapper.MusicSheet musicSheet = musicSheetService.cbsDetail(id);
+        musicSheet.setBizId(id);
+
+        MusicSheetVo.MusicSheetDetail musicSheetDetail = JSON.parseObject(JSON.toJSONString(musicSheet), MusicSheetVo.MusicSheetDetail.class);
+        MusicSheetDetailVo detail = musicSheetService.detail(id.toString(), sysUser, ClientEnum.TEACHER, tenantAlbumId);
+        if (detail == null) {
+//            musicSheetDetail.setBizMusicCategoryId(null);
+        } else {
+            // 设置曲目付费类型
+            musicSheetDetail.setPaymentType(detail.getPaymentType());
+            // 设置业务端曲目分类
+//            musicSheetDetail.setBizMusicCategoryId(detail.getCategoriesId() == null ? null : detail.getCategoriesId().longValue());
+            musicSheetDetail.setScoreType(detail.getScoreType());
+            musicSheetDetail.setIsConvertibleScore(detail.getNotation() ==YesOrNoEnum.YES);
+            musicSheetDetail.setPlay(detail.getPlay());
+            musicSheetDetail.setBuyed(detail.getBuyed());
+            musicSheetDetail.setMusicPrice(detail.getMusicPrice());
+        }
+
+        // 如果是合奏 并且乐器ID = 2268
+        musicSheetDetail.setSpecialPercussionFlag(false);
+        if ("2268".equals(musicSheetDetail.getMusicalInstrumentIds()) && musicSheetDetail.getMusicSheetType() == EMusicSheetType.CONCERT) {
+            musicSheetDetail.setSpecialPercussionFlag(true);
+        }
+
+        // 设置乐器信息
+        if (StringUtils.isNotBlank(musicSheetDetail.getMusicalInstrumentIds())) {
+            List<Long> instrumentIds = Arrays.stream(musicSheetDetail.getMusicalInstrumentIds().split(","))
+                .map(Long::parseLong).collect(Collectors.toList());
+
+            if (CollectionUtils.isNotEmpty(instrumentIds) && CollectionUtils.isNotEmpty(musicSheetDetail.getMusicalInstruments())) {
+                Map<Long, InstrumentWrapper.Instrument> instrumentMap = instrumentService.getMapByIds(instrumentIds);
+                for (CbsMusicSheetWrapper.MusicalInstrument musicalInstrument : musicSheetDetail.getMusicalInstruments()) {
+                    InstrumentWrapper.Instrument instrument = instrumentMap.get(musicalInstrument.getId().longValue());
+                    if (instrument != null) {
+                        musicalInstrument.setOrientation(instrument.getOrientation());
+                    }
+
+                }
+            }
+        }
+        return R.from(musicSheetDetail);
+    }
+
+    @ApiOperation(value = "查询分页", notes = "曲谱表- 传入 MusicSheetVo.MusicSheetQuery")
+    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<MusicSheetWrapper.MusicSheetCloud>> cloudPage(@RequestBody MusicSheetWrapper.MusicSheetCloudQuery query) {
+
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        Teacher teacher = teacherService.getById(sysUser.getId());
+        if (teacher == null) {
+            return failed("用户信息获取失败");
+        }
+
+        // 检查app版本
+        YesOrNoEnum appAuditVersion = appVersionInfoService.getAppAuditVersion(query.getPlatform(), query.getVersion());
+        // 学生 只能看通过审核 并且 启用的 曲目
+        query.setDelFlag(false);
+        query.setVersionFlag(appAuditVersion == YesOrNoEnum.YES);
+        query.setStatus(true);
+        query.setUserId(teacher.getUserId());
+        query.setClientType(ClientEnum.TEACHER.name());
+        query.setProviderType(SourceTypeEnum.PLATFORM);
+
+        IPage<MusicSheetWrapper.MusicSheetCloud> musicSheetCloudIPage = musicSheetService.cloudPage(query);
+        return HttpResponseResult.succeed(PageUtil.pageInfo(musicSheetCloudIPage));
+    }
+}

+ 16 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/UserMusicController.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.microsvc.toolkit.common.response.paging.PageInfo;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.microsvc.toolkit.common.response.template.R;
 import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
@@ -103,4 +104,19 @@ public class UserMusicController {
 
         return HttpResponseResult.succeed(true);
     }
+
+
+    @ApiOperation(value = "详情")
+    @GetMapping("/musicPracticeRecord/{id}")
+    public R<UserMusicWrapper.UserMusic> musicPracticeRecord(@PathVariable("id") Long id) {
+
+        UserMusicWrapper.UserMusicQuery build = UserMusicWrapper.UserMusicQuery.builder().musicPracticeRecordId(id).build();
+        IPage<UserMusicWrapper.UserMusic> pages = userMusicService.selectPage(QueryInfo.getPage(build), build);
+        List<UserMusicWrapper.UserMusic> records = pages.getRecords();
+        if (records.isEmpty()) {
+            return R.from(new UserMusicWrapper.UserMusic()).data(null);
+        }
+
+        return R.from(records.get(0));
+    }
 }