|
@@ -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;
|
|
|
+ }
|
|
|
+}
|