liujc 1 year ago
parent
commit
8b2ec0ef90
28 changed files with 1683 additions and 4 deletions
  1. 108 0
      mec-application/src/main/java/com/ym/mec/student/controller/UserMusicController.java
  2. 132 0
      mec-application/src/main/java/com/ym/mec/student/controller/UserMusicStarController.java
  3. 76 0
      mec-application/src/main/java/com/ym/mec/student/controller/open/OpenUserMusicController.java
  4. 77 0
      mec-application/src/main/java/com/ym/mec/student/controller/open/OpenUserMusicStarController.java
  5. 5 0
      mec-biz/pom.xml
  6. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicCompareRecordDao.java
  7. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  8. 84 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/UserMusic.java
  9. 44 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/UserMusicStar.java
  10. 31 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/EUserMusicType.java
  11. 28 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/UserMusicMapper.java
  12. 28 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/UserMusicStarMapper.java
  13. 135 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/UserMusicStarWrapper.java
  14. 217 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/UserMusicWrapper.java
  15. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java
  16. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicScoreService.java
  17. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysUserService.java
  18. 66 0
      mec-biz/src/main/java/com/ym/mec/biz/service/UserMusicService.java
  19. 63 0
      mec-biz/src/main/java/com/ym/mec/biz/service/UserMusicStarService.java
  20. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java
  21. 17 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreServiceImpl.java
  22. 13 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserServiceImpl.java
  23. 292 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/UserMusicServiceImpl.java
  24. 135 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/UserMusicStarServiceImpl.java
  25. 7 0
      mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  26. 7 0
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  27. 46 0
      mec-biz/src/main/resources/config/mybatis/UserMusicMapper.xml
  28. 42 0
      mec-biz/src/main/resources/config/mybatis/UserMusicStarMapper.xml

+ 108 - 0
mec-application/src/main/java/com/ym/mec/student/controller/UserMusicController.java

@@ -0,0 +1,108 @@
+package com.ym.mec.student.controller;
+
+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.config.jwt.utils.JwtUserInfo;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.enums.ClientEnum;
+import com.ym.mec.biz.dal.wrapper.UserMusicWrapper;
+import com.ym.mec.biz.dal.entity.UserMusic;
+import com.ym.mec.biz.service.UserMusicService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static com.ym.mec.common.controller.BaseController.failed;
+
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("${app-config.url.student:}/userMusic")
+@Api(tags = "用户曲目作品")
+public class UserMusicController  extends BaseController {
+
+    @Autowired
+    private UserMusicService userMusicService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @ApiOperation(value = "详情", notes = "用户曲目作品-根据详情ID查询单条, 传入id")
+    @GetMapping("/detail/{id}")
+    public HttpResponseResult<UserMusicWrapper.UserMusic> detail(@PathVariable("id") Long id) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        UserMusicWrapper.UserMusicQuery build = UserMusicWrapper.UserMusicQuery.builder().id(id).build();
+        IPage<UserMusicWrapper.UserMusic> pages = userMusicService.selectPage(QueryInfo.getPage(build), build,
+            JwtUserInfo.builder().userId(user.getId().toString()).clientType(ClientEnum.STUDENT.name()).build());
+        List<UserMusicWrapper.UserMusic> records = pages.getRecords();
+        if (records.isEmpty()) {
+            throw new BizException(999,"作品已删除");
+        }
+
+        return succeed(records.get(0));
+    }
+
+    @ApiOperation(value = "查询分页", notes = "用户曲目作品- 传入 UserMusicWrapper.UserMusicQuery")
+    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<UserMusicWrapper.UserMusic>> page(@RequestBody UserMusicWrapper.UserMusicQuery query) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        query.setUserId(user.getId().longValue());
+        query.setClientType(ClientEnum.STUDENT);
+        JwtUserInfo<Object> userInfo = JwtUserInfo.builder().userId(user.getId().toString()).clientType(ClientEnum.STUDENT.name()).build();
+        IPage<UserMusicWrapper.UserMusic> pages = userMusicService.selectPage(QueryInfo.getPage(query), query, userInfo);
+
+        return succeed(QueryInfo.pageInfo(pages));
+    }
+
+    @ApiOperation(value = "保存草稿/发布作品", notes = "用户曲目作品- 传入 UserMusicWrapper.UserMusic")
+    @PostMapping("/save")
+    public HttpResponseResult<JSONObject> add(@Validated @RequestBody UserMusicWrapper.AddUserMusic userMusic) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        userMusic.setUserId(user.getId().longValue());
+        userMusic.setClientType(ClientEnum.STUDENT);
+        // 新增数据
+        userMusicService.save(userMusic);
+
+        return succeed();
+    }
+
+    @ApiOperation(value = "删除", notes = "用户曲目作品- 传入id")
+    @PostMapping("/remove")
+    public HttpResponseResult<Boolean> remove(@RequestParam String id) {
+
+        if (StringUtils.isBlank(id)) {
+            throw new BizException( "id不能为空");
+        }
+        List<String> list = Arrays.asList(id.split(","));
+
+        userMusicService.lambdaUpdate()
+            .in(UserMusic::getId, list)
+            .set(UserMusic::getDelFlag, true)
+            .update();
+
+        return succeed(true);
+    }
+}

+ 132 - 0
mec-application/src/main/java/com/ym/mec/student/controller/UserMusicStarController.java

@@ -0,0 +1,132 @@
+package com.ym.mec.student.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alipay.service.schema.util.StringUtil;
+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.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.Subject;
+import com.ym.mec.biz.dal.entity.UserMusicStar;
+import com.ym.mec.biz.dal.enums.ClientEnum;
+import com.ym.mec.biz.dal.wrapper.UserMusicStarWrapper;
+import com.ym.mec.biz.service.StudentService;
+import com.ym.mec.biz.service.SubjectService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.biz.service.UserMusicStarService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("${app-config.url.student:}/userMusicStar")
+@Api(tags = "用户曲目作品点赞记录")
+public class UserMusicStarController  extends BaseController {
+
+    @Autowired
+    private UserMusicStarService userMusicStarService;
+
+    @Autowired
+    private StudentService studentService;
+
+    @Autowired
+    private SubjectService subjectService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private SysUserService sysUserService;
+
+    @ApiOperation(value = "查询分页", notes = "用户曲目作品点赞记录- 传入 UserMusicStarWrapper.UserMusicStarQuery")
+    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<UserMusicStarWrapper.UserMusicStar>> page(@RequestBody @Validated UserMusicStarWrapper.UserMusicStarQuery query) {
+
+        IPage<UserMusicStar> pages = userMusicStarService.selectPage(QueryInfo.getPage(query), query);
+
+        List<UserMusicStar> records = pages.getRecords();
+
+        List<UserMusicStarWrapper.UserMusicStar> userMusicStars = new ArrayList<>();
+        if (CollectionUtils.isEmpty(records)){
+            return succeed(QueryInfo.pageInfo(pages,userMusicStars));
+        }
+
+        userMusicStars = JSON.parseArray(JSON.toJSONString(records), UserMusicStarWrapper.UserMusicStar.class);
+
+        // 学生ID集合
+        List<Integer> studentIds = records.stream().map(UserMusicStar::getUserId).map(Long::intValue).collect(Collectors.toList());
+
+        Map<Integer, Student> studentMap = studentService.getMapByIds(studentIds);
+        Map<Long, SysUser> userMap = sysUserService.getMapByIds(studentIds);
+
+        for (UserMusicStarWrapper.UserMusicStar userMusicStar : userMusicStars) {
+            Student student = studentMap.get(userMusicStar.getUserId());
+            if (student != null){
+                userMusicStar.setSubjectId(student.getSubjectId());
+            }
+            SysUser sysUser = userMap.get(userMusicStar.getUserId());
+            if (sysUser != null) {
+                userMusicStar.setUserName(sysUser.getUsername());
+                userMusicStar.setUserAvatar(sysUser.getAvatar());
+            }
+        }
+
+        // 声部ID集合
+        List<Integer> subjectIds = studentMap.values().stream().map(Student::getSubjectId).filter(StringUtils::isNotBlank).map(Integer::parseInt).collect(Collectors.toList());
+
+        Map<Integer, Subject> subjectMap =
+            subjectService.getMapByIds(subjectIds);
+
+        for (UserMusicStarWrapper.UserMusicStar userMusicStar : userMusicStars) {
+
+
+            if (StringUtil.isEmpty(userMusicStar.getSubjectId())) {
+                continue;
+            }
+            Subject subject = subjectMap.get(Integer.parseInt(userMusicStar.getSubjectId()));
+            if (subject != null){
+                userMusicStar.setSubjectName(subject.getName());
+            }
+        }
+
+        return succeed(QueryInfo.pageInfo(pages,userMusicStars));
+    }
+
+
+    @ApiOperation(value = "点赞/取消点赞")
+    @PostMapping("/star")
+    public HttpResponseResult<JSONObject> star(@Validated @RequestBody UserMusicStarWrapper.Star star) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        star.setUserId(user.getId().longValue());
+        star.setClientType(ClientEnum.STUDENT);
+        // 新增数据
+        userMusicStarService.star(star);
+
+        return succeed();
+    }
+}

+ 76 - 0
mec-application/src/main/java/com/ym/mec/student/controller/open/OpenUserMusicController.java

@@ -0,0 +1,76 @@
+package com.ym.mec.student.controller.open;
+
+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.config.jwt.utils.JwtUserInfo;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.enums.ClientEnum;
+import com.ym.mec.biz.dal.wrapper.UserMusicWrapper;
+import com.ym.mec.biz.service.UserMusicService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+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.List;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("${app-config.url.student:}/open/userMusic")
+@Api(tags = "用户曲目作品")
+public class OpenUserMusicController  extends BaseController {
+
+    @Autowired
+    private UserMusicService userMusicService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+
+    @ApiOperation(value = "详情", notes = "用户曲目作品-根据详情ID查询单条, 传入id")
+    @GetMapping("/detail/{id}")
+    public HttpResponseResult<UserMusicWrapper.UserMusic> detail(@PathVariable("id") Long id) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        JwtUserInfo userInfo = null;
+        if (user != null && null != user.getId()) {
+            userInfo = JwtUserInfo.builder()
+                .clientType(ClientEnum.STUDENT.name())
+                .userId(user.getId().toString())
+                .build();
+        }
+        UserMusicWrapper.UserMusicQuery build = UserMusicWrapper.UserMusicQuery.builder().id(id).build();
+        IPage<UserMusicWrapper.UserMusic> pages = userMusicService.selectPage(QueryInfo.getPage(build), build
+            ,userInfo);
+        List<UserMusicWrapper.UserMusic> records = pages.getRecords();
+        if (records.isEmpty()) {
+            throw new BizException(999,"作品已删除");
+        }
+
+        return succeed(records.get(0));
+    }
+
+
+    @ApiOperation(value = "查询分页", notes = "用户曲目作品- 传入 UserMusicWrapper.UserMusicQuery")
+    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<UserMusicWrapper.UserMusic>> page(@RequestBody UserMusicWrapper.UserMusicQuery query) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        JwtUserInfo userInfo = null;
+        if (user != null && null != user.getId()) {
+            userInfo = JwtUserInfo.builder()
+                .clientType(ClientEnum.STUDENT.name())
+                .userId(user.getId().toString())
+                .build();
+        }
+        IPage<UserMusicWrapper.UserMusic> pages = userMusicService.selectPage(QueryInfo.getPage(query), query
+            ,userInfo);
+
+        return succeed(QueryInfo.pageInfo(pages));
+    }
+}

+ 77 - 0
mec-application/src/main/java/com/ym/mec/student/controller/open/OpenUserMusicStarController.java

@@ -0,0 +1,77 @@
+package com.ym.mec.student.controller.open;
+
+import com.alibaba.fastjson.JSON;
+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.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.UserMusicStar;
+import com.ym.mec.biz.dal.wrapper.UserMusicStarWrapper;
+import com.ym.mec.biz.service.StudentService;
+import com.ym.mec.biz.service.SysUserService;
+import com.ym.mec.biz.service.UserMusicStarService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("${app-config.url.student:}/open/userMusicStar")
+@Api(tags = "用户曲目作品点赞记录")
+public class OpenUserMusicStarController {
+
+    @Autowired
+    private UserMusicStarService userMusicStarService;
+
+    @Autowired
+    private StudentService studentService;
+
+    @Autowired
+    private SysUserService sysUserService;
+
+
+    @ApiOperation(value = "查询分页", notes = "用户曲目作品点赞记录- 传入 UserMusicStarWrapper.UserMusicStarQuery")
+    @PostMapping("/page")
+    public R<PageInfo<UserMusicStarWrapper.UserMusicStar>> page(@RequestBody @Validated UserMusicStarWrapper.UserMusicStarQuery query) {
+
+        IPage<UserMusicStar> pages = userMusicStarService.selectPage(QueryInfo.getPage(query), query);
+
+        List<UserMusicStar> records = pages.getRecords();
+
+        List<UserMusicStarWrapper.UserMusicStar> userMusicStars = new ArrayList<>();
+        if (CollectionUtils.isEmpty(records)){
+            return R.from(QueryInfo.pageInfo(pages,userMusicStars));
+        }
+
+        userMusicStars = JSON.parseArray(JSON.toJSONString(records), UserMusicStarWrapper.UserMusicStar.class);
+
+        // 学生ID集合
+        List<Long> studentIds = records.stream().map(UserMusicStar::getUserId).collect(Collectors.toList());
+
+        Map<Long, SysUser> mapByIds = sysUserService.getMapByIds(studentIds);
+
+        for (UserMusicStarWrapper.UserMusicStar userMusicStar : userMusicStars) {
+            SysUser student = mapByIds.get(userMusicStar.getUserId());
+            if (student != null){
+                userMusicStar.setUserName(student.getUsername());
+                userMusicStar.setUserAvatar(student.getAvatar());
+            }
+        }
+
+        return R.from(QueryInfo.pageInfo(pages,userMusicStars));
+    }
+}

+ 5 - 0
mec-biz/pom.xml

@@ -72,6 +72,11 @@
 			<artifactId>microsvc-config-validator</artifactId>
 			<version>1.0.0</version>
 		</dependency>
+        <dependency>
+            <groupId>com.microsvc.toolkit.config</groupId>
+            <artifactId>microsvc-config-jwt</artifactId>
+            <version>1.0.0</version>
+        </dependency>
 		<dependency>
 			<groupId>com.microsvc.toolkit.middleware</groupId>
 			<artifactId>microsvc-middleware-im</artifactId>

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicCompareRecordDao.java

@@ -125,4 +125,6 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
     int queryTeacherTrainingCount(@Param("queryInfo") TeacherCloudTrainingQueryInfo queryInfo);
 
     Integer getUserTrainingTime(@Param("userId") Integer userId);
+
+    List<SysMusicCompareRecord> getByIds(@Param("musicPracticeRecordIds") List<Long> musicPracticeRecordIds);
 }

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java

@@ -11,7 +11,9 @@ import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.ImUserModel;
 import org.apache.ibatis.annotations.Param;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -551,4 +553,6 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
     List<Teacher> queryBaseInfoByPage(Map<String, Object> params);
 
     int queryBaseInfoByCount(Map<String, Object> params);
+
+    List<SysUser> getUserList(@Param("studentIds") Collection<? extends Serializable> studentIds);
 }

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

@@ -0,0 +1,84 @@
+package com.ym.mec.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 com.ym.mec.biz.dal.enums.ClientEnum;
+import com.ym.mec.biz.dal.enums.EUserMusicType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 用户曲目作品
+ * 2023-09-05 15:27:10
+ */
+@Data
+@ApiModel(" UserMusic-用户曲目作品")
+@TableName("user_music")
+public class UserMusic implements Serializable {
+
+    @TableId(value = "id_",type = IdType.AUTO)
+	    private Long id;
+
+    @ApiModelProperty("用户ID")
+	@TableField(value = "user_id_")
+    private Long userId;
+
+    @ApiModelProperty("用户类型")
+	@TableField(value = "client_type_")
+    private ClientEnum clientType;
+
+    @ApiModelProperty("关联练习数据ID")
+	@TableField(value = "music_practice_record_id_")
+    private Long musicPracticeRecordId;
+
+    @ApiModelProperty("曲目ID")
+	@TableField(value = "music_sheet_id_")
+    private Long musicSheetId;
+
+
+    @ApiModelProperty("原伴奏")
+    @TableField(value = "accompany_url_")
+    private String accompanyUrl;
+
+    @ApiModelProperty("草稿 作品")
+	@TableField(value = "type_")
+    private EUserMusicType type;
+
+    @ApiModelProperty("封面图")
+	@TableField(value = "img_")
+    private String img;
+
+    @ApiModelProperty("发布描述")
+    @TableField(value = "desc_")
+    private String desc;
+
+    @ApiModelProperty("视频地址")
+	@TableField(value = "video_url_")
+    private String videoUrl;
+
+    @ApiModelProperty("json配置")
+	@TableField(value = "json_config_")
+    private String jsonConfig;
+
+    @ApiModelProperty("点赞数")
+    @TableField(value = "like_num_")
+    private Integer likeNum = 0;
+
+    @ApiModelProperty("删除标记")
+	@TableField(value = "del_flag_")
+    private Boolean delFlag;
+
+    @TableField(value = "submit_time_")
+    private Date submitTime;
+
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+}

+ 44 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/UserMusicStar.java

@@ -0,0 +1,44 @@
+package com.ym.mec.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 com.ym.mec.biz.dal.enums.ClientEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 用户曲目作品点赞记录
+ * 2023-10-30 14:59:53
+ */
+@Data
+@ApiModel(" UserMusicStar-用户曲目作品点赞记录")
+@TableName("user_music_star")
+public class UserMusicStar implements Serializable {
+
+	    @TableId(value = "id_",type = IdType.AUTO)
+	    private Long id;
+
+    @ApiModelProperty("用户ID")
+	@TableField(value = "user_id_")
+    private Long userId;
+
+    @ApiModelProperty("用户类型")
+	@TableField(value = "client_type_")
+    private ClientEnum clientType;
+
+    @ApiModelProperty("发布作品ID")
+	@TableField(value = "user_music_id_")
+    private Long userMusicId;
+
+    @ApiModelProperty("创建时间")
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+}

+ 31 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/EUserMusicType.java

@@ -0,0 +1,31 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.ym.mec.common.enums.BaseEnum;
+import lombok.Getter;
+
+/**
+ * 客户端类型
+ * Created by Eric.Shang on 2022/11/4.
+ */
+@Getter
+public enum EUserMusicType implements BaseEnum<String,EUserMusicType> {
+
+    // 草稿 作品
+    DRAFT("草稿 作品"),
+    // 正式 作品
+    FORMAL("正式 作品"),
+    ;
+
+    private final String msg;
+
+    @EnumValue
+    private final String code;
+
+    EUserMusicType(String msg) {
+        this.msg = msg;
+
+        this.code = this.name();
+    }
+
+}

+ 28 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/UserMusicMapper.java

@@ -0,0 +1,28 @@
+package com.ym.mec.biz.dal.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ym.mec.biz.dal.entity.UserMusic;
+import com.ym.mec.biz.dal.wrapper.UserMusicWrapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 用户曲目作品
+ * 2023-09-05 15:27:10
+ */
+@Repository
+public interface UserMusicMapper extends BaseMapper<UserMusic> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<UserMusicWrapper.UserMusic>
+	 * @param param UserMusicWrapper.UserMusicQuery
+	 * @return List<UserMusicWrapper.UserMusic>
+	 */
+	List<UserMusicWrapper.UserMusic> selectPage(@Param("page") IPage<UserMusicWrapper.UserMusic> page, @Param("param") UserMusicWrapper.UserMusicQuery param);
+
+    void updateStar(@Param("userMusicId") Long userMusicId);
+}

+ 28 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/UserMusicStarMapper.java

@@ -0,0 +1,28 @@
+package com.ym.mec.biz.dal.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ym.mec.biz.dal.entity.UserMusicStar;
+import com.ym.mec.biz.dal.wrapper.UserMusicStarWrapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 用户曲目作品点赞记录
+ * 2023-10-30 14:59:53
+ */
+@Repository
+public interface UserMusicStarMapper extends BaseMapper<UserMusicStar> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<UserMusicStarWrapper.UserMusicStar>
+	 * @param param UserMusicStarWrapper.UserMusicStarQuery
+	 * @return List<UserMusicStarWrapper.UserMusicStar>
+	 */
+	List<UserMusicStar> selectPage(@Param("page") IPage<UserMusicStar> page, @Param("param") UserMusicStarWrapper.UserMusicStarQuery param);
+
+    List<UserMusicStarWrapper.StarCount> getStarCountMapByUserMusicIds(@Param("userMusicIds") List<Long> userMusicIds);
+}

+ 135 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/UserMusicStarWrapper.java

@@ -0,0 +1,135 @@
+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.ClientEnum;
+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 javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.Optional;
+
+/**
+ * 用户曲目作品点赞记录
+ * 2023-10-30 14:59:53
+ */
+@ApiModel(value = "UserMusicStarWrapper对象", description = "用户曲目作品点赞记录查询对象")
+public class UserMusicStarWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" UserMusicStarQuery-用户曲目作品点赞记录")
+    public static class UserMusicStarQuery implements QueryInfo {
+
+    	@ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+
+        @ApiModelProperty("作品ID")
+        @NotNull(message = "作品ID不能为空")
+        private Long userMusicId;
+
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static UserMusicStarQuery from(String json) {
+            return JSON.parseObject(json, UserMusicStarQuery.class);
+        }
+    }
+
+    @Data
+	@ApiModel(" UserMusicStar-用户曲目作品点赞记录")
+    public static class UserMusicStar {
+
+
+        private Long id;
+
+        @ApiModelProperty("用户ID")
+        private Long userId;
+
+        @ApiModelProperty("用户类型")
+        private ClientEnum clientType;
+
+        @ApiModelProperty("用户名")
+        private String userName;
+
+        @ApiModelProperty("用户头像")
+        private String userAvatar;
+
+        @ApiModelProperty(value = "用户声部ID")
+        private String subjectId;
+
+        @ApiModelProperty(value = "用户声部名称")
+        private String subjectName;
+
+        @ApiModelProperty("年级")
+        private Integer currentGradeNum;
+
+        @ApiModelProperty("班级")
+        private String currentClass;
+
+        @ApiModelProperty("发布作品ID")
+        private Long userMusicId;
+
+        @ApiModelProperty("创建时间")
+        private Date createTime;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static UserMusicStar from(String json) {
+            return JSON.parseObject(json, UserMusicStar.class);
+        }
+	}
+
+
+    @Data
+    @ApiModel(" Star-点赞/取消点赞")
+    public static class Star {
+
+        @ApiModelProperty("发布作品ID")
+        private Long userMusicId;
+
+        @ApiModelProperty("点赞/取消点赞")
+        private Boolean star = true;
+
+
+        @ApiModelProperty(value = "用户ID",hidden = true)
+        private Long userId;
+
+        @ApiModelProperty(value = "用户类型",hidden = true)
+        private ClientEnum clientType;
+
+
+    }
+
+    @Data
+    public static class StarCount {
+
+        @ApiModelProperty("发布作品ID")
+        private Long userMusicId;
+
+        @ApiModelProperty("点赞数")
+        private Integer starCount;
+
+    }
+}

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

@@ -0,0 +1,217 @@
+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.ClientEnum;
+import com.ym.mec.biz.dal.enums.EUserMusicType;
+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 java.util.Date;
+import java.util.Optional;
+
+/**
+ * 用户曲目作品
+ * 2023-09-05 15:27:10
+ */
+@ApiModel(value = "UserMusicWrapper对象", description = "用户曲目作品查询对象")
+public class UserMusicWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" UserMusicQuery-用户曲目作品")
+    public static class UserMusicQuery implements QueryInfo {
+
+    	@ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+
+        @ApiModelProperty("草稿 DRAFT 作品FORMAL")
+        private EUserMusicType type;
+
+        @ApiModelProperty(value = "用户ID",hidden = true)
+        private Long userId;
+
+        @ApiModelProperty(value = "用户类型",hidden = true)
+        private ClientEnum clientType;
+
+        @ApiModelProperty(value = "id",hidden = true)
+        private Long id;
+
+
+        @ApiModelProperty(value = "去除的ID,推荐作品列表需要去除原本作品")
+        private Long exclusionId;
+
+
+        @ApiModelProperty(value = "排序 1:推荐")
+        private Integer sort = 0;
+
+
+
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static UserMusicQuery from(String json) {
+            return JSON.parseObject(json, UserMusicQuery.class);
+        }
+    }
+
+    @Data
+	@ApiModel(" UserMusic-用户曲目作品")
+    public static class UserMusic {
+
+
+        private Long id;
+
+        @ApiModelProperty(value = "用户ID")
+        private Long userId;
+
+        @ApiModelProperty(value = "用户类型")
+        private ClientEnum clientType;
+
+        @ApiModelProperty(value = "用户名称")
+        private String username;
+
+        @ApiModelProperty(value = "用户头像")
+        private String avatar;
+
+        @ApiModelProperty(value = "用户声部ID")
+        private String subjectId;
+
+        @ApiModelProperty(value = "用户声部名称")
+        private String subjectName;
+
+
+        @ApiModelProperty("年级")
+        private Integer currentGradeNum;
+
+        @ApiModelProperty("班级")
+        private String currentClass;
+
+        @ApiModelProperty(value = "是否会员")
+        private Boolean vipFlag;
+
+        @ApiModelProperty("关联练习数据ID")
+        private Long musicPracticeRecordId;
+
+        @ApiModelProperty(value = "曲目ID")
+        private Long musicSheetId;
+
+
+        @ApiModelProperty("原伴奏")
+        private String accompanyUrl;
+
+        @ApiModelProperty("曲目名称")
+        private String musicSheetName;
+
+        @ApiModelProperty("曲目声部ID")
+        private String musicSheetSubjectId;
+
+        @ApiModelProperty("曲目声部名称")
+        private String musicSheetSubjectName;
+
+        @ApiModelProperty("草稿 DRAFT 作品FORMAL")
+        private EUserMusicType type;
+
+        @ApiModelProperty("封面图")
+        private String img;
+
+        @ApiModelProperty("视频地址")
+        private String videoUrl;
+
+
+        @ApiModelProperty("录音文件地址")
+        private String recordFilePath;
+
+        @ApiModelProperty("录像文件地址")
+        private String videoFilePath;
+
+        @ApiModelProperty("json配置")
+        private String jsonConfig;
+
+        @ApiModelProperty("点赞数")
+        private Integer likeNum = 0;
+
+        @ApiModelProperty("发布描述")
+        private String desc;
+
+        @ApiModelProperty("是否点赞")
+        private Boolean starFlag =false;
+
+
+        @ApiModelProperty("发布作品时间")
+        private Date submitTime;
+
+        @ApiModelProperty("录制上传时间")
+        private Date createTime;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static UserMusic from(String json) {
+            return JSON.parseObject(json, UserMusic.class);
+        }
+	}
+
+
+    @Data
+    @ApiModel(" UserMusic-用户曲目作品")
+    public static class AddUserMusic {
+
+
+        private Long id;
+
+        @ApiModelProperty(value = "用户ID",hidden = true)
+        private Long userId;
+
+        @ApiModelProperty(value = "用户类型",hidden = true)
+        private ClientEnum clientType;
+
+        @ApiModelProperty("关联练习数据ID")
+        private Long musicPracticeRecordId;
+
+        @ApiModelProperty(value = "曲目ID",hidden = true)
+        private Long musicSheetId;
+
+        @ApiModelProperty("原伴奏")
+        private String accompanyUrl;
+
+
+        @ApiModelProperty("草稿 DRAFT 作品FORMAL")
+        private EUserMusicType type;
+
+        @ApiModelProperty("封面图")
+        private String img;
+
+
+        @ApiModelProperty("发布描述")
+        private String desc;
+
+
+        @ApiModelProperty("视频地址")
+        private String videoUrl;
+
+        @ApiModelProperty("json配置")
+        private String jsonConfig;
+
+    }
+
+}

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import java.util.List;
 import java.util.Map;
 
 import com.ym.mec.biz.dal.dao.SysMusicCompareRecordDao;
@@ -110,4 +111,6 @@ public interface SysMusicCompareRecordService extends BaseService<Long, SysMusic
      * @param campId 训练营id
      */
     boolean insert(SysMusicCompareRecord record,Integer campId);
+
+    Map<Long, SysMusicCompareRecord> getMapByIds(List<Long> musicPracticeRecordIds);
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicScoreService.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service;
 
 
 import java.util.List;
+import java.util.Map;
 
 import com.ym.mec.biz.dal.dto.MusicScoreDto;
 import com.ym.mec.biz.dal.entity.SysMusicScore;
@@ -27,4 +28,5 @@ public interface SysMusicScoreService extends BaseService<Integer, SysMusicScore
 
     int updateExtStyleConfigJson(Integer id, String extStyleConfigJson);
 
+    Map<Long, SysMusicScore> getMapByIds(List<Long> musicSheetIds);
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysUserService.java

@@ -2,6 +2,11 @@ package com.ym.mec.biz.service;
 
 import com.ym.mec.auth.api.entity.SysUser;
 
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
 public interface SysUserService {
     Integer getUserId();
 
@@ -22,4 +27,6 @@ public interface SysUserService {
      * @param userId 用户id
      */
     void registerImUserInfo(Integer userId);
+
+    Map<Long, SysUser> getMapByIds(Collection<? extends Serializable> studentIds);
 }

+ 66 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/UserMusicService.java

@@ -0,0 +1,66 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
+import com.ym.mec.biz.dal.entity.UserMusic;
+import com.ym.mec.biz.dal.wrapper.UserMusicWrapper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 用户曲目作品
+ * 2023-09-05 15:27:10
+ */
+public interface UserMusicService extends IService<UserMusic>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return UserMusic
+     */
+	UserMusic detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<UserMusic>
+     * @param query UserMusicWrapper.UserMusicQuery
+     * @return IPage<UserMusic>
+     */
+    IPage<UserMusicWrapper.UserMusic> selectPage(IPage<UserMusicWrapper.UserMusic> page, UserMusicWrapper.UserMusicQuery query);
+
+    /**
+     * 添加
+     * @param userMusic UserMusicWrapper.UserMusic
+     * @return Boolean
+     */
+     Boolean add(UserMusicWrapper.UserMusic userMusic);
+
+    /**
+     * 更新
+     * @param userMusic UserMusicWrapper.UserMusic
+     * @return Boolean
+     */
+     Boolean update(UserMusicWrapper.UserMusic userMusic);
+
+    /**
+     *  根据曲目练习记录获取发布曲目
+     *
+     * @param musicPracticeRecordIds 曲目练习记录ID
+     */
+    Map<Long, UserMusic> getMapByMusicPracticeRecordIds(List<Long> musicPracticeRecordIds);
+
+
+    /**
+     * 保存草稿/发布作品
+     *
+     */
+    void save(UserMusicWrapper.AddUserMusic userMusic);
+
+    /**
+     * 分页
+     *
+     */
+    IPage<UserMusicWrapper.UserMusic> selectPage(IPage<UserMusicWrapper.UserMusic> page, UserMusicWrapper.UserMusicQuery query, JwtUserInfo<?> userInfo);
+}

+ 63 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/UserMusicStarService.java

@@ -0,0 +1,63 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.entity.UserMusicStar;
+import com.ym.mec.biz.dal.wrapper.UserMusicStarWrapper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 用户曲目作品点赞记录
+ * 2023-10-30 14:59:53
+ */
+public interface UserMusicStarService extends IService<UserMusicStar>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return UserMusicStar
+     */
+	UserMusicStar detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<UserMusicStar>
+     * @param query UserMusicStarWrapper.UserMusicStarQuery
+     * @return IPage<UserMusicStar>
+     */
+    IPage<UserMusicStar> selectPage(IPage<UserMusicStar> page, UserMusicStarWrapper.UserMusicStarQuery query);
+
+    /**
+     * 添加
+     * @param userMusicStar UserMusicStarWrapper.UserMusicStar
+     * @return Boolean
+     */
+     Boolean add(UserMusicStarWrapper.UserMusicStar userMusicStar);
+
+    /**
+     * 更新
+     * @param userMusicStar UserMusicStarWrapper.UserMusicStar
+     * @return Boolean
+     */
+     Boolean update(UserMusicStarWrapper.UserMusicStar userMusicStar);
+
+    /**
+     * 点赞/取消点赞
+     */
+    void star(UserMusicStarWrapper.Star star);
+
+    /**
+     *
+     * 查询点赞数
+     *
+     */
+    Map<Long,Integer> getStarCountMapByUserMusicIds(List<Long> userMusicIds);
+
+    /**
+     * 是否点赞
+     *
+     */
+    Map<Long,Boolean> getStarFlagMapByUserMusicIds(List<Long> userMusicIds, String clientType, String userId);
+}

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java

@@ -521,6 +521,18 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
         return true;
     }
 
+    @Override
+    public Map<Long, SysMusicCompareRecord> getMapByIds(List<Long> musicPracticeRecordIds) {
+        if (CollectionUtils.isEmpty(musicPracticeRecordIds)) {
+            return Collections.emptyMap();
+        }
+
+        List<SysMusicCompareRecord> list = sysMusicCompareRecordDao.getByIds(musicPracticeRecordIds);
+
+        return list.stream().collect(Collectors.toMap(SysMusicCompareRecord::getId, Function.identity()));
+
+    }
+
     private void updateCampData(SysMusicCompareRecord record, Integer campId) {
 
         if (campId == null) {

+ 17 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreServiceImpl.java

@@ -17,6 +17,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.SysMusicScoreMetronomeTranscod;
 import com.ym.mec.biz.dal.dto.SysMusicScoreTranscod;
@@ -355,7 +356,22 @@ public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicS
 		return sysMusicScoreDao.updateExtStyleConfigJson(id, extStyleConfigJson);
 	}
 
-	/**
+    @Override
+    public Map<Long, SysMusicScore> getMapByIds(List<Long> musicSheetIds) {
+        if (CollectionUtils.isEmpty(musicSheetIds)) {
+            return new HashMap<>();
+        }
+
+        List<SysMusicScore> musicScoreList = sysMusicScoreDao.findByIds(musicSheetIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
+
+        if (CollectionUtils.isEmpty(musicScoreList)) {
+            return new HashMap<>();
+        }
+        dealMusicScoreData(musicScoreList);
+        return musicScoreList.stream().collect(Collectors.toMap(o -> o.getId().longValue(), e -> e));
+    }
+
+    /**
      * 进行转码
      *
      * @param fileUrl

+ 13 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysUserServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.google.common.collect.Lists;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
@@ -15,9 +16,8 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
+import java.io.Serializable;
+import java.util.*;
 
 @Slf4j
 @Service
@@ -127,4 +127,14 @@ public class SysUserServiceImpl implements SysUserService {
             }
         }
     }
+
+    @Override
+    public Map<Long, SysUser> getMapByIds(Collection<? extends Serializable> studentIds) {
+        if (CollectionUtils.isEmpty(studentIds)) {
+            return new HashMap<>();
+        }
+
+        List<SysUser> userList = teacherDao.getUserList(studentIds);
+        return userList.stream().collect(HashMap::new, (m, v) -> m.put(v.getId().longValue(), v), HashMap::putAll);
+    }
 }

+ 292 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/UserMusicServiceImpl.java

@@ -0,0 +1,292 @@
+package com.ym.mec.biz.service.impl;
+
+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.microsvc.toolkit.common.webportal.exception.BizException;
+import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.EUserMusicType;
+import com.ym.mec.biz.dal.mapper.UserMusicMapper;
+import com.ym.mec.biz.dal.wrapper.UserMusicWrapper;
+import com.ym.mec.biz.service.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 用户曲目作品
+ * 2023-09-05 15:27:10
+ */
+@Slf4j
+@Service
+public class UserMusicServiceImpl extends ServiceImpl<UserMusicMapper, UserMusic> implements UserMusicService {
+
+
+
+    @Autowired
+    private UserMusicService userMusicService;
+
+    @Autowired
+    private SysMusicCompareRecordService sysMusicCompareRecordService;
+
+    @Autowired
+    private SysMusicScoreService sysMusicScoreService;
+
+    @Autowired
+    private SysUserService sysUserService;
+
+    @Autowired
+    private SubjectService subjectService;
+
+    @Autowired
+    private UserMusicStarService userMusicStarService;
+
+    @Autowired
+    private StudentService studentService;
+
+    /**
+     * 查询详情
+     * @param id 详情ID
+     * @return UserMusic
+     */
+    @Override
+    public UserMusic detail(Long id) {
+
+        return baseMapper.selectById(id);
+    }
+
+    /**
+     * 分页查询
+     * @param page IPage<UserMusic>
+     * @param query UserMusicWrapper.UserMusicQuery
+     * @return IPage<UserMusic>
+     */
+    @Override
+    public IPage<UserMusicWrapper.UserMusic> selectPage(IPage<UserMusicWrapper.UserMusic> page, UserMusicWrapper.UserMusicQuery query) {
+
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+
+    /**
+     * 添加
+     * @param userMusic UserMusicWrapper.UserMusic
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(UserMusicWrapper.UserMusic userMusic) {
+
+        return this.save(JSON.parseObject(userMusic.jsonString(), UserMusic.class));
+    }
+
+    /**
+     * 更新
+     * @param userMusic UserMusicWrapper.UserMusic
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(UserMusicWrapper.UserMusic userMusic){
+
+        return this.updateById(JSON.parseObject(userMusic.jsonString(), UserMusic.class));
+    }
+
+
+    /**
+     *  根据曲目练习记录获取发布曲目
+     *
+     * @param musicPracticeRecordIds 曲目练习记录ID
+     * @return
+     */
+    @Override
+    public Map<Long, UserMusic> getMapByMusicPracticeRecordIds(List<Long> musicPracticeRecordIds) {
+        if (CollectionUtils.isEmpty(musicPracticeRecordIds)) {
+            return new HashMap<>();
+        }
+        List<UserMusic> list = this.lambdaQuery()
+            .in(UserMusic::getMusicPracticeRecordId, musicPracticeRecordIds)
+            .eq(UserMusic::getType, EUserMusicType.FORMAL)
+            .eq(UserMusic::getDelFlag, false)
+            .list();
+        if (CollectionUtils.isEmpty(list)) {
+            return new HashMap<>();
+        }
+        return list.stream().collect(Collectors.toMap(UserMusic::getMusicPracticeRecordId, v -> v, (v1, v2) -> v1));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void save(UserMusicWrapper.AddUserMusic userMusic) {
+
+        // 设置曲目ID
+        if (userMusic.getMusicPracticeRecordId() != null) {
+            SysMusicCompareRecord practiceRecord = sysMusicCompareRecordService.get(userMusic.getMusicPracticeRecordId());
+            if (practiceRecord == null) {
+                throw new BizException("练习记录不存在");
+            }
+            userMusic.setMusicSheetId(practiceRecord.getSysMusicScoreId().longValue());
+            List<UserMusic> list = userMusicService.lambdaQuery()
+                .eq(UserMusic::getMusicPracticeRecordId, userMusic.getMusicPracticeRecordId())
+                .eq(UserMusic::getUserId, userMusic.getUserId())
+                .eq(UserMusic::getClientType, userMusic.getClientType())
+                .eq(UserMusic::getDelFlag, false)
+                .orderByAsc(UserMusic::getId)
+                .list();
+            if (!CollectionUtils.isEmpty(list)) {
+                userMusic.setId(list.get(0).getId());
+            }
+        }
+
+        // 设置默认封面
+        if (userMusic.getId() == null && StringUtils.isEmpty(userMusic.getImg()) && userMusic.getMusicSheetId() != null) {
+            SysMusicScore sheet = sysMusicScoreService.get(userMusic.getMusicSheetId().intValue());
+            if (sheet != null) {
+//                userMusic.setImg(sheet.getTitleImg());
+            }
+        }
+        UserMusic entity = JSON.parseObject(JSON.toJSONString(userMusic), UserMusic.class);
+
+        UserMusic old = null;
+        if (entity.getId() != null) {
+            old = userMusicService.getById(entity.getId());
+            if (old.getType() == EUserMusicType.FORMAL && entity.getType() == EUserMusicType.DRAFT) {
+                throw new BizException("已发布的作品不能修改为草稿");
+            }
+        }
+
+        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());
+        }
+        userMusicService.saveOrUpdate(entity);
+    }
+
+    /**
+     * 分页
+     *
+     */
+    @Override
+    public IPage<UserMusicWrapper.UserMusic> selectPage(IPage<UserMusicWrapper.UserMusic> page, UserMusicWrapper.UserMusicQuery query, JwtUserInfo<?> userInfo) {
+        // 推荐作品 排序 同曲目同声部点赞降序>其他曲目同声部点赞降序
+        if (query.getSort() !=null && query.getSort() == 1) {
+            if (query.getExclusionId() != null) {
+                UserMusic userMusic = userMusicService.getById(query.getExclusionId());
+                if (userMusic != null) {
+                    query.setClientType(userMusic.getClientType());
+                    query.setUserId(userMusic.getUserId());
+                }
+            }
+        }
+        IPage<UserMusicWrapper.UserMusic> userMusicIPage = userMusicService.selectPage(page, query);
+        List<UserMusicWrapper.UserMusic> records = userMusicIPage.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            return userMusicIPage;
+        }
+
+        // id集合
+        List<Long> ids = records.stream().map(UserMusicWrapper.UserMusic::getId).collect(Collectors.toList());
+
+        // 是否点赞
+        if (userInfo != null) {
+            Map<Long, Boolean> starFlagMapByUserMusicIds = userMusicStarService.getStarFlagMapByUserMusicIds(ids, userInfo.getClientType(), userInfo.getUserId());
+            for (UserMusicWrapper.UserMusic record : records) {
+                Boolean starFlag = starFlagMapByUserMusicIds.get(record.getId());
+                if (starFlag != null) {
+                    record.setStarFlag(starFlag);
+                }
+            }
+        }
+
+
+//        Map<Long, Integer> mapByUserMusicIds = userMusicStarService.getStarCountMapByUserMusicIds(ids);
+//        for (UserMusicWrapper.UserMusic record : records) {
+//            Integer starCount = mapByUserMusicIds.get(record.getId());
+//            if (starCount != null) {
+//                record.setLikeNum(starCount);
+//            }
+//        }
+
+        // 评测记录ID集合
+        List<Long> musicPracticeRecordIds = records.stream()
+            .map(UserMusicWrapper.UserMusic::getMusicPracticeRecordId).collect(Collectors.toList());
+        Map<Long, SysMusicCompareRecord> recordMap = sysMusicCompareRecordService.getMapByIds(musicPracticeRecordIds);
+        for (UserMusicWrapper.UserMusic record : records) {
+            SysMusicCompareRecord musicPracticeRecord = recordMap.get(record.getMusicPracticeRecordId());
+            if (musicPracticeRecord != null) {
+                record.setRecordFilePath(musicPracticeRecord.getRecordFilePath());
+                record.setVideoFilePath(musicPracticeRecord.getVideoFilePath());
+            }
+        }
+
+        // 曲目ID集合
+        List<Long> musicSheetIds = records.stream().map(UserMusicWrapper.UserMusic::getMusicSheetId).collect(Collectors.toList());
+        Map<Long, SysMusicScore> musicSheetMap = sysMusicScoreService.getMapByIds(musicSheetIds);
+
+        for (UserMusicWrapper.UserMusic record : records) {
+            SysMusicScore musicSheet = musicSheetMap.get(record.getMusicSheetId());
+            if (musicSheet != null) {
+                record.setMusicSheetName(musicSheet.getName());
+//                record.setMusicSheetSubjectId(musicSheet.get());
+            }
+        }
+
+        // 用户ID集合
+        List<Long> userIds = records.stream().map(UserMusicWrapper.UserMusic::getUserId).collect(Collectors.toList());
+        Map<Long, SysUser> userMap = sysUserService.getMapByIds(userIds);
+        Map<Integer, Student> studentMap = studentService.getMapByIds(userIds.stream().map(Long::intValue).collect(Collectors.toList()));
+        for (UserMusicWrapper.UserMusic record : records) {
+            SysUser sysUser = userMap.get(record.getUserId());
+            if (sysUser != null) {
+                record.setUsername(sysUser.getUsername());
+                record.setAvatar(sysUser.getAvatar());
+//                record.setCurrentGradeNum(sysUser.getCurrentGradeNum());
+//                record.setCurrentClass(sysUser.getCurrentClass());
+            }
+            Student student = studentMap.get(record.getUserId().intValue());
+            if (student != null) {
+
+                record.setSubjectId(student.getSubjectId());
+                record.setVipFlag(student.getMembershipEndTime() != null && student.getMembershipEndTime().after(new Date()));
+            }
+        }
+
+        // 声部ID集合
+        List<Integer> subjectIds = records.stream().map(UserMusicWrapper.UserMusic::getSubjectId)
+            .filter(o -> !StringUtil.isEmpty(o))
+            .flatMap( o -> Arrays.stream(o.split(",")))
+            .map(Integer::parseInt)
+            .distinct().collect(Collectors.toList());
+
+        Map<Integer, Subject> subjectMap =
+            subjectService.getMapByIds(subjectIds);
+
+        for (UserMusicWrapper.UserMusic record : records) {
+            if (StringUtil.isEmpty(record.getSubjectId())) {
+                continue;
+            }
+            Subject subject = subjectMap.get(Integer.parseInt(record.getSubjectId()));
+            if (subject != null) {
+                record.setSubjectName(subject.getName());
+            }
+            if (StringUtil.isEmpty(record.getMusicSheetSubjectId())) {
+                continue;
+            }
+            subject = subjectMap.get(Integer.parseInt(record.getMusicSheetSubjectId()));
+            if (subject != null) {
+                record.setMusicSheetSubjectName(subject.getName());
+            }
+        }
+
+
+        return userMusicIPage;
+    }
+}

+ 135 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/UserMusicStarServiceImpl.java

@@ -0,0 +1,135 @@
+package com.ym.mec.biz.service.impl;
+
+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.ym.mec.biz.dal.entity.UserMusicStar;
+import com.ym.mec.biz.dal.mapper.UserMusicMapper;
+import com.ym.mec.biz.dal.mapper.UserMusicStarMapper;
+import com.ym.mec.biz.dal.wrapper.UserMusicStarWrapper;
+import com.ym.mec.biz.service.UserMusicStarService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 用户曲目作品点赞记录
+ * 2023-10-30 14:59:53
+ */
+@Slf4j
+@Service
+public class UserMusicStarServiceImpl extends ServiceImpl<UserMusicStarMapper, UserMusicStar> implements UserMusicStarService {
+
+    @Autowired
+    private UserMusicMapper userMusicMapper;
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return UserMusicStar
+     */
+	@Override
+    public UserMusicStar detail(Long id) {
+
+        return baseMapper.selectById(id);
+    }
+
+    /**
+     * 分页查询
+     * @param page IPage<UserMusicStar>
+     * @param query UserMusicStarWrapper.UserMusicStarQuery
+     * @return IPage<UserMusicStar>
+     */
+    @Override
+    public IPage<UserMusicStar> selectPage(IPage<UserMusicStar> page, UserMusicStarWrapper.UserMusicStarQuery query) {
+
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+
+    /**
+     * 添加
+     * @param userMusicStar UserMusicStarWrapper.UserMusicStar
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(UserMusicStarWrapper.UserMusicStar userMusicStar) {
+
+        return this.save(JSON.parseObject(userMusicStar.jsonString(), UserMusicStar.class));
+    }
+
+    /**
+     * 更新
+     * @param userMusicStar UserMusicStarWrapper.UserMusicStar
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(UserMusicStarWrapper.UserMusicStar userMusicStar){
+
+        return this.updateById(JSON.parseObject(userMusicStar.jsonString(), UserMusicStar.class));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void star(UserMusicStarWrapper.Star star) {
+
+        this.lambdaUpdate()
+            .eq(UserMusicStar::getUserId, star.getUserId())
+            .eq(UserMusicStar::getUserMusicId, star.getUserMusicId())
+            .eq(UserMusicStar::getClientType, star.getClientType())
+            .remove();
+
+        if (star.getStar()) {
+            UserMusicStar userMusicStar = new UserMusicStar();
+            userMusicStar.setClientType(star.getClientType());
+            userMusicStar.setUserId(star.getUserId());
+            userMusicStar.setUserMusicId(star.getUserMusicId());
+            this.save(userMusicStar);
+        }
+        userMusicMapper.updateStar(star.getUserMusicId());
+
+
+    }
+
+    @Override
+    public Map<Long, Integer> getStarCountMapByUserMusicIds(List<Long> userMusicIds) {
+        if (CollectionUtils.isEmpty(userMusicIds)) {
+            return new HashMap<>();
+        }
+        List<UserMusicStarWrapper.StarCount> starCounts = baseMapper.getStarCountMapByUserMusicIds(userMusicIds);
+        Map<Long, Integer> starCountMap = new HashMap<>();
+        for (UserMusicStarWrapper.StarCount starCount : starCounts) {
+            starCountMap.put(starCount.getUserMusicId(), starCount.getStarCount());
+        }
+        return starCountMap;
+    }
+
+    @Override
+    public Map<Long, Boolean> getStarFlagMapByUserMusicIds(List<Long> userMusicIds, String clientType, String userId) {
+        if (CollectionUtils.isEmpty(userMusicIds)) {
+            return new HashMap<>();
+        }
+        if (StringUtil.isEmpty(clientType)) {
+            return new HashMap<>();
+        }
+        if (StringUtil.isEmpty(userId)) {
+            return new HashMap<>();
+        }
+        List<UserMusicStar> list = this.lambdaQuery()
+            .eq(UserMusicStar::getClientType, clientType)
+            .eq(UserMusicStar::getUserId, userId)
+            .in(UserMusicStar::getUserMusicId, userMusicIds)
+            .list();
+        if (CollectionUtils.isEmpty(list)) {
+            return new HashMap<>();
+        }
+        return list.stream().collect(Collectors.toMap(UserMusicStar::getUserMusicId, o->true));
+    }
+}

+ 7 - 0
mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

@@ -542,4 +542,11 @@
 		select CASE WHEN sum(play_time_) IS NULL THEN 0 ELSE sum(play_time_) END
 		from sys_music_compare_record where user_id_ = #{userId} and DATE_FORMAT(create_time_,'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d')
 	</select>
+
+	<select id="getByIds" resultMap="SysMusicCompareRecord">
+        SELECT * FROM sys_music_compare_record WHERE id_ IN
+        <foreach collection="musicPracticeRecordIds" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
 </mapper>

+ 7 - 0
mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -1589,4 +1589,11 @@
         SELECT COUNT(DISTINCT t.id_)
         FROM teacher t LEFT JOIN sys_user su ON t.id_ = su.id_
     </select>
+
+    <select id="getUserList" resultMap="SysUser">
+        select * from sys_user where id_ in
+        <foreach collection="studentIds"    item="studentId" separator="," open="(" close=")">
+            #{studentId}
+        </foreach>
+    </select>
 </mapper>

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

@@ -0,0 +1,46 @@
+<?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.ym.mec.biz.dal.mapper.UserMusicMapper">
+
+
+
+    <select id="selectPage" resultType="com.ym.mec.biz.dal.wrapper.UserMusicWrapper$UserMusic">
+		SELECT
+            t.*
+		FROM user_music t
+        left join sys_music_score t1 on t1.id_ = t.music_sheet_id_
+        <where>
+            t.del_flag_ = 0
+            <if test="param.keyword != null and param.keyword != ''">
+                and t1.name_ like concat('%', #{param.keyword}, '%')
+            </if>
+            <if test="param.userId != null">
+                and t.user_id_ = #{param.userId}
+            </if>
+            <if test="param.clientType != null">
+                and t.client_type_ = #{param.clientType}
+            </if>
+            <if test="param.type != null">
+                and t.type_ = #{param.type}
+            </if>
+            <if test="param.id != null">
+                and t.id_ = #{param.id}
+            </if>
+            <if test="param.exclusionId != null">
+                and t.id_ != #{param.exclusionId}
+            </if>
+        </where>
+        <if test="param.sort != null">
+            order by
+            <if test="param.sort == 1">
+                t.like_num_ desc,
+            </if>
+            t.submit_time_ desc ,t.create_time_ desc ,t.id_ desc
+        </if>
+
+	</select>
+
+    <update id="updateStar">
+        update user_music set like_num_ =(select count(1) from  user_music_star where  user_music_id_ = #{userMusicId}) where id_ = #{userMusicId}
+    </update>
+</mapper>

+ 42 - 0
mec-biz/src/main/resources/config/mybatis/UserMusicStarMapper.xml

@@ -0,0 +1,42 @@
+<?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.ym.mec.biz.dal.mapper.UserMusicStarMapper">
+
+
+
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id_ AS id
+        , t.user_id_ AS userId
+        , t.client_type_ AS clientType
+        , t.user_music_id_ AS userMusicId
+        , t.create_time_ AS createTime
+        </sql>
+
+    <select id="selectPage" resultType="com.ym.mec.biz.dal.entity.UserMusicStar">
+		SELECT
+        	<include refid="baseColumns" />
+		FROM user_music_star t
+        <where>
+            <if test="param.userMusicId != null">
+                AND t.user_music_id_ = #{param.userMusicId}
+            </if>
+        </where>
+        order by t.create_time_ desc ,t.id_ desc
+	</select>
+
+    <select id="getStarCountMapByUserMusicIds"
+            resultType="com.ym.mec.biz.dal.wrapper.UserMusicStarWrapper$StarCount">
+        SELECT
+            t.user_music_id_ AS userMusicId,
+            count(1) AS starCount
+        FROM user_music_star t
+        WHERE t.user_music_id_ IN
+        <foreach collection="userMusicIds" item="userMusicId" separator="," open="(" close=")">
+            #{userMusicId}
+        </foreach>
+        GROUP BY t.user_music_id_
+
+
+    </select>
+</mapper>