刘俊驰 6 months ago
parent
commit
54dcc298c5

+ 19 - 0
mec-application/src/main/java/com/ym/mec/student/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.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
@@ -20,8 +21,10 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import java.util.Arrays;
 import java.util.List;
@@ -59,6 +62,22 @@ public class UserMusicController  extends BaseController {
         return succeed(records.get(0));
     }
 
+
+
+    @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));
+    }
+
     @ApiOperation(value = "查询分页", notes = "用户曲目作品- 传入 UserMusicWrapper.UserMusicQuery")
     @PostMapping("/page")
     public HttpResponseResult<PageInfo<UserMusicWrapper.UserMusic>> page(@RequestBody UserMusicWrapper.UserMusicQuery query) {

+ 141 - 0
mec-application/src/main/java/com/ym/mec/teacher/controller/MusicPracticeRecordController.java

@@ -0,0 +1,141 @@
+package com.ym.mec.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.microsvc.toolkit.config.validator.group.ValidGroups;
+import com.ym.mec.biz.dal.entity.UserMusic;
+import com.ym.mec.biz.dal.enums.ClientEnum;
+import com.ym.mec.biz.dal.wrapper.MusicPracticeRecordWrapper;
+import com.ym.mec.biz.service.MusicPracticeRecordService;
+import com.ym.mec.biz.service.SysMusicScoreService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.biz.service.UserMusicService;
+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.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+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 SysMusicScoreService 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")
+    })
+    @PreAuthorize("@auditsvc.hasPermissions('musicPracticeRecord/detail', {'BACKEND'})")
+    @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(Integer.parseInt(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(@Validated(ValidGroups.Add.class) @RequestBody MusicPracticeRecordWrapper.MusicPracticeRecord record) {
+
+        Integer 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);
+    }
+
+}

+ 16 - 0
mec-application/src/main/java/com/ym/mec/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.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
@@ -57,6 +58,21 @@ public class UserMusicController  extends BaseController {
         return succeed(records.get(0));
     }
 
+    @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));
+    }
+
+
     @ApiOperation(value = "查询分页", notes = "用户曲目作品- 传入 UserMusicWrapper.UserMusicQuery")
     @PostMapping("/page")
     public HttpResponseResult<PageInfo<UserMusicWrapper.UserMusic>> page(@RequestBody UserMusicWrapper.UserMusicQuery query) {

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysMusicCompareRecord.java

@@ -87,6 +87,22 @@ public class SysMusicCompareRecord extends BaseEntity {
 
 	private Integer subjectId;
 
+    private String customConfiguration;
+
+    private String practiceTime;
+
+    private String practiceSource;
+
+    private String resultAnalyze;
+
+    private Boolean headphoneFlag;
+
+    private Long instrumentId;
+
+    private Boolean hiddenFlag;
+
+    private Boolean delFlag;
+
 	public SysMusicCompareRecord(FeatureType feature) {
 		this.feature = feature;
 	}

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/UserMusic.java

@@ -66,6 +66,11 @@ public class UserMusic implements Serializable {
 	@TableField(value = "video_url_")
     private String videoUrl;
 
+    @ApiModelProperty("文件类型") // .mp4 视频,其他为音频
+    @TableField(value = "file_type_")
+    private String fileType;
+
+
     @ApiModelProperty("json配置")
 	@TableField(value = "json_config_")
     private String jsonConfig;
@@ -86,6 +91,12 @@ public class UserMusic implements Serializable {
     @TableField(value = "submit_time_")
     private Date submitTime;
 
+
+
+    @ApiModelProperty("是否能被看到评级、评分字段")
+    @TableField(value = "select_flag_")
+    private Boolean selectFlag;
+
     @TableField(value = "create_time_")
     private Date createTime;
 

+ 477 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/MusicPracticeRecordWrapper.java

@@ -0,0 +1,477 @@
+package com.ym.mec.biz.dal.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.ym.mec.biz.dal.enums.im.CK;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.DateTime;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.temporal.WeekFields;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * 曲目练习记录
+ * 2022-12-07 10:16:58
+ */
+@ApiModel(value = "MusicPracticeRecordWrapper对象", description = "曲目练习记录查询对象")
+public class MusicPracticeRecordWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" MusicPracticeRecordQuery-曲目练习记录")
+    public static class MusicPracticeRecordQuery implements QueryInfo {
+
+    	@ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+        @ApiModelProperty("曲目名称")
+        private String musicSheetName;
+
+        @ApiModelProperty("评测难度")
+        private String heardLevel;
+
+
+        @ApiModelProperty("最低总分")
+        private BigDecimal minScore = BigDecimal.ZERO;
+
+
+        @ApiModelProperty("最高总分")
+        private BigDecimal maxScore = new BigDecimal(100);
+
+        @ApiModelProperty("是否生成作品")
+        private Boolean userMusicFlag;
+
+        @ApiModelProperty("生成作品开始时间")
+        private Date userMusicStartTime;
+
+        @ApiModelProperty("生成作品结束时间")
+        private Date userMusicEndTime;
+
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+
+        @ApiModelProperty("用户编号")
+        private Long userId;
+
+        @ApiModelProperty("客户端类型")
+        private String clientType;
+
+
+        @ApiModelProperty("班级ID")
+        private Long classGroupId;
+
+        @ApiModelProperty("曲目编号")
+        private Long musicSheetId;
+
+        @ApiModelProperty("功能")
+        private String feature;
+
+        @ApiModelProperty("练习类型")
+        private List<String> practiceTypes;
+
+        @ApiModelProperty("评测结果数据 ")
+        private Boolean scoreData;
+
+        @ApiModelProperty("练习时间(按月:202209)")
+        private String practiceMonth;
+
+        @ApiModelProperty("练习来源")
+        private String practiceSource;
+
+
+        @ApiModelProperty("评测乐器ID")
+        private Long instrumentId;
+
+
+        @ApiModelProperty("声部Id")
+        private String subjectId;
+
+        @ApiModelProperty("乐团Id")
+        private String orchestraId;
+
+        @ApiModelProperty("学校Id")
+        private Long schoolId;
+
+        @ApiModelProperty("开始时间")
+        private Date startTime;
+
+        @ApiModelProperty("结束时间")
+        private Date endTime;
+
+        @ApiModelProperty("伴学老师Id")
+        private Long teacherId;
+
+        @ApiModelProperty("删除标记")
+        private Boolean delFlag;
+
+        @ApiModelProperty("练习达标时间")
+        private Integer practiceTargetMinute;
+
+        @ApiModelProperty("周练习达标匹配")
+        private Boolean practiceTargetMatch;
+
+        @ApiModelProperty("周练习匹配")
+        private Boolean practiceMatch;
+
+        @ApiModelProperty("老师统计查询")
+        private Boolean teacherStatQuery;
+
+        @ApiModelProperty("学校统计查询")
+        private Boolean schoolStatQuery;
+
+        @ApiModelProperty("完整评测标记")
+        private Boolean completeEvaluation;
+
+        @ApiModelProperty("排除学生人数")
+        private List<Long> excludeStudentIds;
+
+        @ApiModelProperty("排序字段,1:综合得分,2:音准,3:节奏:4:完整度,5:评测时间 6:生成时间,7:评测进度")
+        private Integer sortType;
+
+        @ApiModelProperty("是否升序")
+        private Boolean asc;
+
+
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static MusicPracticeRecordQuery from(String json) {
+            return JSON.parseObject(json, MusicPracticeRecordQuery.class);
+        }
+
+        public String getSubjectId() {
+            return Optional.ofNullable(subjectId).filter(StringUtils::isNotBlank).orElse(null);
+        }
+
+        public String getOrchestraId() {
+            return Optional.ofNullable(orchestraId).filter(StringUtils::isNotBlank).orElse(null);
+        }
+
+        public String getPracticeMonth() {
+            return Optional.ofNullable(practiceMonth).filter(StringUtils::isNotBlank).orElse(null);
+        }
+
+        public MusicPracticeRecordQuery scoreData(Boolean scoreData) {
+            this.scoreData = scoreData;
+            return this;
+        }
+
+
+        public MusicPracticeRecordQuery userId(String userId) {
+            this.userId = Long.parseLong(userId);
+            return this;
+        }
+
+        public MusicPracticeRecordQuery clientType(String clientType) {
+            this.clientType = clientType;
+            return this;
+        }
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+	@ApiModel(" MusicPracticeRecord-曲目练习记录")
+    public static class MusicPracticeRecord {
+
+        @ApiModelProperty("主键ID")
+        private Long id;
+
+        @ApiModelProperty("用户编号")
+        private Long userId;
+
+        @ApiModelProperty("客户端类型")
+        private String clientType;
+
+        @ApiModelProperty("曲目编号")
+        private Long musicSheetId;
+
+        @ApiModelProperty("曲目名称")
+        private String musicSheetName;
+
+        @ApiModelProperty("行为编号,同一编号为一次")
+        private String behaviorId;
+
+        @ApiModelProperty("评分数据")
+        private String scoreData;
+
+        @ApiModelProperty("总分")
+        private BigDecimal score;
+
+        @ApiModelProperty("音准")
+        private BigDecimal intonation;
+
+        @ApiModelProperty("节奏")
+        private BigDecimal cadence;
+
+        @ApiModelProperty("完成度")
+        private BigDecimal integrity;
+
+        @ApiModelProperty("录音文件地址")
+        private String recordFilePath;
+
+        @ApiModelProperty("录像文件地址")
+        private String videoFilePath;
+
+        @ApiModelProperty("设备类型")
+        private String deviceType;
+
+        @ApiModelProperty("源音时长")
+        private Float sourceTime;
+
+        @ApiModelProperty("演奏时长")
+        private Float playTime;
+
+
+        @ApiModelProperty("演奏倍率")
+        private Float playRate;
+
+
+        @ApiModelProperty("速度")
+        private String speed;
+
+        @ApiModelProperty("周一日期")
+        private String monday;
+
+        @ApiModelProperty("功能")
+        private String feature;
+
+        @ApiModelProperty("评测难度")
+        private String heardLevel;
+
+        @ApiModelProperty("部分索引")
+        private String partIndex;
+
+        @ApiModelProperty("自定义配置 默认空字符串")
+        private String customConfiguration;
+
+        @ApiModelProperty("练习时间")
+        private String practiceTime;
+
+        @ApiModelProperty("练习来源")
+        private String practiceSource;
+
+        @ApiModelProperty("更新时间")
+        private Date updateTime;
+
+        @ApiModelProperty("创建时间")
+        private Date createTime;
+
+        @ApiModelProperty("评测乐器ID")
+        private Long instrumentId;
+
+        @ApiModelProperty("评测乐器")
+        private String instrumentName;
+
+        @ApiModelProperty("是否节奏音乐")
+        private Boolean rhythmFlag;
+
+        @ApiModelProperty("收费类型(FREE:免费;VIP:会员;CHARGE:单曲收费)")
+        private String paymentType;
+
+        @ApiModelProperty("是否生成作品")
+        private Boolean userMusicFlag;
+
+        @ApiModelProperty("生成作品时间")
+        private Date userMusicTime;
+
+        @ApiModelProperty("评测进度")
+        private BigDecimal evaluationProgressNumber;
+
+        @ApiModelProperty("评测进度")
+        private String evaluationProgress;
+
+        @ApiModelProperty("是否佩戴耳机")
+        private Boolean headphoneFlag;
+
+        @ApiModelProperty("假删除标识 0:未删除 1:已删除")
+        private Boolean delFlag;
+
+
+        @ApiModelProperty("是否隐藏评测记录 0:不隐藏 1:隐藏")
+        private Boolean hiddenFlag;
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static MusicPracticeRecord from(String json) {
+            return JSON.parseObject(json, MusicPracticeRecord.class);
+        }
+
+        // 初始化默认值
+        public MusicPracticeRecord initDefaultValue() {
+
+            return this.customConfiguration(Optional.ofNullable(getCustomConfiguration()).orElse(""))
+                .monday(Optional.ofNullable(getMonday()).orElse(LocalDate.now().with(WeekFields.of(DayOfWeek.MONDAY, 1).dayOfWeek(), DayOfWeek.MONDAY.getValue()).toString()))
+                .sourceTime(Optional.ofNullable(getSourceTime()).orElse(0F))
+                .playTime(Optional.ofNullable(getPlayTime()).orElse(0F))
+                .speed(Optional.ofNullable(getSpeed()).orElse("90"))
+                .practiceTime(Optional.ofNullable(getPracticeTime()).orElse(DateTime.now().toString(CK.FORMAT_YYYY_MM_DD)));
+        }
+
+
+        public MusicPracticeRecord sourceTime(Float sourceTime) {
+            this.sourceTime = sourceTime;
+            return this;
+        }
+
+        public MusicPracticeRecord playTime(Float playTime) {
+            this.playTime = playTime;
+            return this;
+        }
+
+        public MusicPracticeRecord speed(String speed) {
+            this.speed = speed;
+            return this;
+        }
+
+        public MusicPracticeRecord monday(String monday) {
+            this.monday = monday;
+            return this;
+        }
+
+        public MusicPracticeRecord customConfiguration(String customConfiguration) {
+            this.customConfiguration = customConfiguration;
+            return this;
+        }
+
+        public MusicPracticeRecord practiceTime(String practiceTime) {
+            this.practiceTime = practiceTime;
+            return this;
+        }
+
+        public MusicPracticeRecord userId(String userId) {
+            this.userId = Long.parseLong(userId);
+            return this;
+        }
+
+        public MusicPracticeRecord clientType(String clientType) {
+            this.clientType = clientType;
+            return this;
+        }
+    }
+
+    @Data
+    public static class Entity{
+
+        @ApiModelProperty("主键ID")
+        private String id;
+
+        @ApiModelProperty("用户编号")
+        private String userId;
+
+        @ApiModelProperty("客户端类型")
+        private String clientType;
+
+        @ApiModelProperty("曲目编号")
+        private String musicSheetId;
+
+        @ApiModelProperty("行为编号,同一编号为一次")
+        private String behaviorId;
+
+        @ApiModelProperty("评分数据")
+        private String scoreData;
+
+        @ApiModelProperty("总分")
+        private BigDecimal score;
+
+        @ApiModelProperty("音准")
+        private BigDecimal intonation;
+
+        @ApiModelProperty("节奏")
+        private BigDecimal cadence;
+
+        @ApiModelProperty("完成度")
+        private BigDecimal integrity;
+
+        @ApiModelProperty("录音文件地址")
+        private String recordFilePath;
+
+        @ApiModelProperty("录像文件地址")
+        private String videoFilePath;
+
+        @ApiModelProperty("设备类型")
+        private String deviceType;
+
+        @ApiModelProperty("源音时长")
+        private Float sourceTime;
+
+        @ApiModelProperty("演奏时长")
+        private Float playTime;
+
+
+
+        @ApiModelProperty("演奏倍率")
+        private Float playRate;
+
+
+        @ApiModelProperty("速度")
+        private String speed;
+
+        @ApiModelProperty("周一日期")
+        private String monday;
+
+        @ApiModelProperty("功能")
+        private String feature;
+
+        @ApiModelProperty("评测难度")
+        private String heardLevel;
+
+
+        @ApiModelProperty("评测乐器ID")
+        private String instrumentId;
+
+
+        @ApiModelProperty("评测结果分析")
+        private String resultAnalyze;
+
+        @ApiModelProperty("部分索引")
+        private String partIndex;
+
+        @ApiModelProperty("练习时间")
+        private String practiceTime;
+
+        @ApiModelProperty("练习来源")
+        private String practiceSource;
+
+        @ApiModelProperty("自定义配置 默认空字符串")
+        private String customConfiguration;
+
+
+        @ApiModelProperty("是否佩戴耳机")
+        private Boolean headphoneFlag;
+
+        @ApiModelProperty("更新时间")
+        private Date updateTime;
+
+        @ApiModelProperty("创建时间")
+        private Date createTime;
+
+        @ApiModelProperty("假删除标识 0:未删除 1:已删除")
+        private Boolean delFlag;
+
+    }
+}

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/UserMusicWrapper.java

@@ -51,6 +51,11 @@ public class UserMusicWrapper {
         @ApiModelProperty(value = "id",hidden = true)
         private Long id;
 
+        @ApiModelProperty("文件类型 音频 AUDIO,视频:VIDEO")
+        private String fileType;
+
+        @ApiModelProperty("关联练习数据ID")
+        private Long musicPracticeRecordId;
 
         @ApiModelProperty(value = "去除的ID,推荐作品列表需要去除原本作品")
         private Long exclusionId;
@@ -140,6 +145,9 @@ public class UserMusicWrapper {
         private String videoUrl;
 
 
+        @ApiModelProperty("文件类型") // .mp4 视频,其他为音频
+        private String fileType;
+
         @ApiModelProperty("录音文件地址")
         private String recordFilePath;
 
@@ -162,6 +170,9 @@ public class UserMusicWrapper {
         @ApiModelProperty("发布作品时间")
         private Date submitTime;
 
+        @ApiModelProperty("是否能被看到评级、评分字段")
+        private Boolean selectFlag;
+
         @ApiModelProperty("录制上传时间")
         private Date createTime;
 
@@ -221,6 +232,9 @@ public class UserMusicWrapper {
         @ApiModelProperty("json配置")
         private String jsonConfig;
 
+        @ApiModelProperty("是否能被看到评级、评分字段")
+        private Boolean selectFlag;
+
     }
 
 }

+ 31 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MusicPracticeRecordService.java

@@ -0,0 +1,31 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.wrapper.MusicPracticeRecordWrapper;
+
+public interface MusicPracticeRecordService {
+
+    /**
+     * 查询记录详情
+     */
+    MusicPracticeRecordWrapper.Entity detail(Long id);
+
+    /**
+     * 添加记录
+     */
+    String add(MusicPracticeRecordWrapper.MusicPracticeRecord from);
+
+
+    Object getLastEvaluationMusicalNotesPlayStats(Long recordId);
+
+    /**
+     * 查询记录
+     *
+     */
+    MusicPracticeRecordWrapper.Entity getById(Long id);
+
+    /**
+     * 更新练习记录
+     *
+     */
+    void update(MusicPracticeRecordWrapper.Entity practiceRecord);
+}

+ 60 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicPracticeRecordServiceImpl.java

@@ -0,0 +1,60 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.wrapper.MusicPracticeRecordWrapper;
+import com.ym.mec.biz.service.MusicPracticeRecordService;
+import com.ym.mec.biz.service.SysMusicCompareRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class MusicPracticeRecordServiceImpl implements MusicPracticeRecordService {
+
+    @Autowired
+    private SysMusicCompareRecordService sysMusicCompareRecordService;
+
+
+    /**
+     * 查询记录详情
+     *
+     * @param id
+     */
+    @Override
+    public MusicPracticeRecordWrapper.Entity detail(Long id) {
+        return null;
+    }
+
+    /**
+     * 添加记录
+     *
+     * @param from
+     */
+    @Override
+    public String add(MusicPracticeRecordWrapper.MusicPracticeRecord from) {
+        return null;
+    }
+
+    @Override
+    public Object getLastEvaluationMusicalNotesPlayStats(Long recordId) {
+        return null;
+    }
+
+    /**
+     * 查询记录
+     *
+     * @param id
+     */
+    @Override
+    public MusicPracticeRecordWrapper.Entity getById(Long id) {
+        return null;
+    }
+
+    /**
+     * 更新练习记录
+     *
+     * @param practiceRecord
+     */
+    @Override
+    public void update(MusicPracticeRecordWrapper.Entity practiceRecord) {
+
+    }
+}

+ 12 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/UserMusicServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alipay.service.schema.util.StringUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
 import com.microsvc.toolkit.common.webportal.exception.BizException;
 import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 import com.ym.mec.auth.api.entity.SysUser;
@@ -71,6 +72,7 @@ public class UserMusicServiceImpl extends ServiceImpl<UserMusicMapper, UserMusic
     private UserMusicMapper userMusicMapper;
 
 
+    private static  final List<String> videoList = Lists.newArrayList(".mp4");
     /**
      * 查询详情
      * @param id 详情ID
@@ -187,12 +189,20 @@ public class UserMusicServiceImpl extends ServiceImpl<UserMusicMapper, UserMusic
                 throw new BizException("已发布的作品不能修改为草稿");
             }
         }
-
+        Date date = new Date();
         if (entity.getType() == null) {
         } else if (entity.getType().equals(EUserMusicType.DRAFT)) {
             entity.setSubmitTime(null);
         } else if (old == null || old.getType().equals(EUserMusicType.DRAFT)) {
-            entity.setSubmitTime(new Date());
+            entity.setSubmitTime(date);
+        }
+        entity.setUpdateTime(date);
+        if (!StringUtil.isEmpty(entity.getVideoUrl())) {
+            if (videoList.stream().noneMatch(entity.getVideoUrl()::endsWith)) {
+                entity.setFileType("AUDIO");
+            } else {
+                entity.setFileType("VIDEO");
+            }
         }
         userMusicService.saveOrUpdate(entity);
         return entity.getId();

+ 8 - 0
mec-biz/src/main/resources/config/mybatis/UserMusicMapper.xml

@@ -21,6 +21,8 @@
                t.del_flag_,
                t.expire_flag_,
                t.submit_time_,
+                t.select_flag_,
+                t.file_type_ ,
                t.update_time_ as createTime
 		FROM user_music t
         left join sys_music_score t1 on t1.id_ = t.music_sheet_id_
@@ -44,6 +46,12 @@
             <if test="param.exclusionId != null">
                 and t.id_ != #{param.exclusionId}
             </if>
+            <if test="param.fileType != null">
+                and t.file_type_ = #{param.fileType}
+            </if>
+            <if test="param.musicPracticeRecordId != null">
+                and t.music_practice_record_id_ = #{param.musicPracticeRecordId}
+            </if>
         </where>
         <if test="param.sort != null">
             order by