liujunchi 2 سال پیش
والد
کامیت
8f63ba03e5
15فایلهای تغییر یافته به همراه1108 افزوده شده و 0 حذف شده
  1. 80 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CourseCoursewareController.java
  2. 15 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenUserAccountController.java
  3. 34 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseCoursewareDao.java
  4. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseCoursewareDto.java
  5. 116 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/CourseCoursewareSearch.java
  6. 115 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseCourseware.java
  7. 34 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/CoursewareEnum.java
  8. 45 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseCoursewareService.java
  9. 235 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseCoursewareServiceImpl.java
  10. 15 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  11. 110 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseCoursewareVo.java
  12. 21 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetDetailVo.java
  13. 102 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseCoursewareMapper.xml
  14. 97 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseCoursewareController.java
  15. 76 0
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/CourseCoursewareController.java

+ 80 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/CourseCoursewareController.java

@@ -0,0 +1,80 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+
+import com.yonge.toolset.base.util.StringUtil;
+import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+import com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo;
+import com.yonge.cooleshow.biz.dal.dto.search.CourseCoursewareSearch;
+import com.yonge.cooleshow.biz.dal.entity.CourseCourseware;
+import com.yonge.cooleshow.biz.dal.service.CourseCoursewareService;
+
+import java.util.Date;
+
+@RestController
+@RequestMapping("/courseCourseware")
+@Api(value = "课件表", tags = "课件表")
+public class CourseCoursewareController extends BaseController {
+
+    @Autowired
+    private CourseCoursewareService courseCoursewareService;
+    
+    /**
+     * 查询分页
+     */
+    @PostMapping("/page")
+    @ApiOperation(value = "查询分页", notes = "传入courseCoursewareSearch")
+    public HttpResponseResult<PageInfo<CourseCoursewareVo>> page(@RequestBody CourseCoursewareSearch query) {
+		IPage<CourseCoursewareVo> pages = courseCoursewareService.selectPage(PageUtil.getPage(query), query);
+        return succeed(PageUtil.pageInfo(pages));
+	}
+    
+    /**
+	 * 新增或修改
+	 */
+    @PostMapping("/submit")
+    @ApiOperation(value = "新增或修改", notes = "传入courseCourseware")
+	public HttpResponseResult<CourseCourseware> submit(@Valid @RequestBody CourseCourseware courseCourseware) {
+		if (courseCourseware.getId() != null) {
+			courseCourseware.setUpdateTime(new Date());
+		} else {
+			courseCourseware.setUpdateTime(new Date());
+			courseCourseware.setCreateTime(new Date());
+		}
+		if (courseCourseware.getUserId() == null) {
+			throw new BizException("用户id不能为空");
+		}
+		courseCourseware.setClientType(ClientEnum.TEACHER);
+        return succeed(courseCoursewareService.submit(courseCourseware));
+    }
+
+ 	/**
+	 * 删除
+	 */
+	@PostMapping("/remove/{id}")
+	@ApiOperation(value = "删除", notes = "传入id")
+	public HttpResponseResult remove(@PathVariable Long id ) {
+		return status(courseCoursewareService.removeById(id));
+	}
+
+
+	/**
+	 * 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperation(value = "批量删除", notes = "传入id")
+	public HttpResponseResult remove(@RequestParam String ids ) {
+		return status(courseCoursewareService.removeByIds(StringUtil.toLongList(ids)));
+	}
+}

+ 15 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenUserAccountController.java

@@ -1,10 +1,13 @@
 package com.yonge.cooleshow.admin.controller.open;
 
+import com.yonge.cooleshow.biz.dal.dto.MusicImgDto;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
 import com.yonge.cooleshow.biz.dal.service.UserAccountService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.entity.MallOrderItemDto;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -13,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.validation.Valid;
 import java.util.List;
 
 @RestController
@@ -26,6 +30,8 @@ public class OpenUserAccountController extends BaseController {
     @Autowired
     private UserAccountService userAccountService;
 
+    @Autowired
+    private MusicSheetService musicSheetService;
 
     /**
      * 设置商城收入分润
@@ -45,4 +51,13 @@ public class OpenUserAccountController extends BaseController {
         userAccountService.mallTeacherRecordState(shareDto);
         return succeed();
     }
+
+
+
+    @ApiOperation(value = "新增曲谱渲染图")
+    @PostMapping(value="/music/sheet/img")
+    public HttpResponseResult<Boolean> img(@RequestBody @Valid MusicImgDto musicImgDto) {
+        return succeed(musicSheetService.updateMusicImg(musicImgDto.getMusicImg(),musicImgDto.getMusicSheetId()));
+    }
+
 }

+ 34 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseCoursewareDao.java

@@ -0,0 +1,34 @@
+package com.yonge.cooleshow.biz.dal.dao;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import com.yonge.cooleshow.biz.dal.entity.CourseCourseware;
+import com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo;
+import com.yonge.cooleshow.biz.dal.dto.search.CourseCoursewareSearch;
+
+
+public interface CourseCoursewareDao extends BaseMapper<CourseCourseware>{
+	/**
+	 * 查询详情
+     * @author liweifan
+     * @date 2022-11-02 10:17:44
+     * @return: com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo
+	 */
+	CourseCoursewareVo detail(@Param("id") Long id);
+
+	/**
+	 * 分页查询
+     * @author liweifan
+     * @date 2022-11-02 10:17:44
+     * @return: com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo
+	 */
+	List<CourseCoursewareVo> selectPage(@Param("page") IPage page, @Param("param") CourseCoursewareSearch courseCourseware);
+
+	/**
+	 * 查询被购买够的课件信息
+	 */
+	List<Long> selectPayMusic(@Param("coursewareIdList") List<Long> coursewareIdList);
+}

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/CourseCoursewareDto.java

@@ -0,0 +1,13 @@
+package com.yonge.cooleshow.biz.dal.dto;
+
+import com.yonge.cooleshow.biz.dal.entity.CourseCourseware;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022-11-02 10:17:44
+ */
+@ApiModel(value = "CourseCoursewareDto对象", description = "课件表数据传输对象")
+public class CourseCoursewareDto extends CourseCourseware{
+	private static final long serialVersionUID = 1L;
+}

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

@@ -0,0 +1,116 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import com.yonge.toolset.base.util.StringUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022-11-02 10:17:44
+ */
+@ApiModel(value = "CourseCoursewareSearch对象", description = "课件表查询对象")
+public class CourseCoursewareSearch extends QueryInfo{
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty("老师id")
+	private Long userId;
+
+
+	@ApiModelProperty("曲目编号/名称")
+	private String idAndName;
+
+	@ApiModelProperty("标签id(多个逗号隔开)")
+	private String musicTagIds;
+
+	@ApiModelProperty(hidden = true)
+	private List<Long> musicTagIdList;
+
+	@ApiModelProperty("声部id(多个逗号隔开)")
+	private String subjectIds;
+
+	@ApiModelProperty(hidden = true)
+	private List<Long> subjectIdList;
+
+	@ApiModelProperty("是否有效, 0:失效 1:有效")
+	private YesOrNoEnum status;
+
+	@ApiModelProperty(value = "用户类型 STUDENT,TEACHER ",hidden = true)
+	private ClientEnum clientType;
+
+	public String getIdAndName() {
+		return idAndName;
+	}
+
+	public void setIdAndName(String idAndName) {
+		this.idAndName = idAndName;
+	}
+
+	public String getMusicTagIds() {
+		return musicTagIds;
+	}
+
+	public void setMusicTagIds(String musicTagIds) {
+		this.musicTagIds = musicTagIds;
+	}
+
+	public List<Long> getMusicTagIdList() {
+		return musicTagIdList;
+	}
+
+	public void setMusicTagIdList(List<Long> musicTagIdList) {
+		this.musicTagIdList = musicTagIdList;
+		if (StringUtils.isNotBlank(musicTagIds)) {
+			this.musicTagIdList = StringUtil.toLongList(musicTagIds);
+		}
+	}
+
+	public String getSubjectIds() {
+		return subjectIds;
+	}
+
+	public void setSubjectIds(String subjectIds) {
+		this.subjectIds = subjectIds;
+		if (StringUtils.isNotBlank(subjectIds)) {
+			this.subjectIdList = StringUtil.toLongList(subjectIds);
+		}
+	}
+
+	public List<Long> getSubjectIdList() {
+		return subjectIdList;
+	}
+
+	public void setSubjectIdList(List<Long> subjectIdList) {
+		this.subjectIdList = subjectIdList;
+	}
+
+	public YesOrNoEnum getStatus() {
+		return status;
+	}
+
+	public void setStatus(YesOrNoEnum status) {
+		this.status = status;
+	}
+
+	public ClientEnum getClientType() {
+		return clientType;
+	}
+
+	public void setClientType(ClientEnum clientType) {
+		this.clientType = clientType;
+	}
+
+	public Long getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Long userId) {
+		this.userId = userId;
+	}
+
+}

+ 115 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CourseCourseware.java

@@ -0,0 +1,115 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 课件表
+ */
+@TableName("course_courseware")
+@ApiModel(value = "CourseCourseware对象", description = "课件表")
+public class CourseCourseware implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty("主键 ")
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("用户id ")
+    @TableField(value = "user_id_")
+    private Long userId;
+
+    @ApiModelProperty("用户类型 STUDENT,TEACHER ")
+    @TableField(value = "client_type_")
+    private ClientEnum clientType;
+
+    @ApiModelProperty("曲目id ")
+    @TableField(value = "music_sheet_id_")
+    @NotNull(message = "曲目id不能为空")
+    private Long musicSheetId;
+
+    @ApiModelProperty("创建时间 ")
+    @TableField(value = "create_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间 ")
+    @TableField(value = "update_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date updateTime;
+
+    @ApiModelProperty("假删除标识 0:未删除 1:已删除 ")
+    @TableField(value = "del_flag_")
+    private Boolean delFlag;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public ClientEnum getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(ClientEnum clientType) {
+        this.clientType = clientType;
+    }
+
+    public Long getMusicSheetId() {
+        return musicSheetId;
+    }
+
+    public void setMusicSheetId(Long musicSheetId) {
+        this.musicSheetId = musicSheetId;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Boolean getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(Boolean delFlag) {
+        this.delFlag = delFlag;
+    }
+
+}

+ 34 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/CoursewareEnum.java

@@ -0,0 +1,34 @@
+package com.yonge.cooleshow.biz.dal.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-28
+ */
+public enum CoursewareEnum implements BaseEnum<String, CoursewareEnum> {
+    AUDIO("音频"),
+    IMG("图片"),
+
+    ;
+    @EnumValue
+    private String code;
+    private String msg;
+
+    CoursewareEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+}

+ 45 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CourseCoursewareService.java

@@ -0,0 +1,45 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo;
+import com.yonge.cooleshow.biz.dal.dto.search.CourseCoursewareSearch;
+import com.yonge.cooleshow.biz.dal.entity.CourseCourseware;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+/**
+ * 课件表 服务类
+ * @author liweifan
+ * @date 2022-11-02
+ */
+public interface CourseCoursewareService extends IService<CourseCourseware>  {
+
+	/**
+     * 查询详情
+     * @author liweifan
+ 	 * @date 2022-11-02
+     */
+	CourseCoursewareVo detail(Long id);
+
+    /**
+     * 分页查询
+     * @author liweifan
+ 	 * @date 2022-11-02
+     */
+    IPage<CourseCoursewareVo> selectPage(IPage<CourseCoursewareVo> page, CourseCoursewareSearch query);
+
+	@Override
+	boolean removeById(Serializable id);
+
+	/**
+	 * 保存课件数据
+	 * @return
+	 */
+	CourseCourseware submit(CourseCourseware courseCourseware);
+
+
+	@Override
+	boolean removeByIds(Collection<? extends Serializable> idList);
+}

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

@@ -0,0 +1,235 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.biz.dal.dao.CourseCoursewareDao;
+import com.yonge.cooleshow.biz.dal.dao.MusicSheetAccompanimentDao;
+import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
+import com.yonge.cooleshow.biz.dal.dto.search.CourseCoursewareSearch;
+import com.yonge.cooleshow.biz.dal.entity.CourseCourseware;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheetAccompaniment;
+import com.yonge.cooleshow.biz.dal.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.Teacher;
+import com.yonge.cooleshow.biz.dal.enums.AudioTypeEnum;
+import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
+import com.yonge.cooleshow.biz.dal.service.CourseCoursewareService;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
+import com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.exception.BizException;
+import org.apache.commons.collections.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+
+@Service
+public class CourseCoursewareServiceImpl extends ServiceImpl<CourseCoursewareDao, CourseCourseware> implements CourseCoursewareService {
+    private final static Logger log = LoggerFactory.getLogger(CourseCoursewareServiceImpl.class);
+
+
+    @Autowired
+    private SysUserMapper userMapper;
+
+    @Autowired
+    private MusicSheetService musicSheetService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private MusicSheetAccompanimentDao musicSheetAccompanimentDao;
+
+    @Autowired
+    private TeacherDao teacherDao;
+
+	@Override
+    public CourseCoursewareVo detail(Long id) {
+        return baseMapper.detail(id);
+    }
+    
+    @Override
+    public IPage<CourseCoursewareVo> selectPage(IPage<CourseCoursewareVo> page, CourseCoursewareSearch query){
+        IPage<CourseCoursewareVo> courseCoursewareVoIPage = page.setRecords(baseMapper.selectPage(page, query));
+        List<CourseCoursewareVo> records = courseCoursewareVoIPage.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            return courseCoursewareVoIPage;
+        }
+        // 设置用户名
+        Set<Long> userIdList = records.stream().map(CourseCoursewareVo::getUserId).collect(Collectors.toSet());
+        List<SysUser> sysUsers = userMapper.selectBatchIds(userIdList);
+        if (CollectionUtils.isEmpty(sysUsers)) {
+            return courseCoursewareVoIPage;
+        }
+        Map<Long, String> userIdUsernameMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getId, SysUser::getUsername));
+        for (CourseCoursewareVo record : records) {
+            record.setUsername(userIdUsernameMap.get(record.getUserId()));
+        }
+
+        // 设置原音
+        List<Long> musicSheetIdList = records.stream().map(CourseCoursewareVo::getMusicSheetId).collect(Collectors.toList());
+        List<MusicSheetAccompaniment> musicSheetAccompanimentList = musicSheetAccompanimentDao.selectList(
+                Wrappers.<MusicSheetAccompaniment>lambdaQuery()
+                        .in(MusicSheetAccompaniment::getMusicSheetId, musicSheetIdList));
+        if (CollectionUtils.isNotEmpty(musicSheetAccompanimentList)) {
+            Map<Long, List<MusicSheetAccompaniment>> map = musicSheetAccompanimentList.stream()
+                                                          .collect( Collectors.groupingBy(MusicSheetAccompaniment::getMusicSheetId));
+            for (CourseCoursewareVo record : records) {
+                List<MusicSheetAccompaniment> musicSheetAccompaniments = map.get(record.getMusicSheetId());
+                if (CollectionUtils.isEmpty(musicSheetAccompaniments)) {
+                    continue;
+                }
+                String url = musicSheetAccompaniments.stream()
+                                                         .map(MusicSheetAccompaniment::getAudioFileUrl)
+                                                         .collect(Collectors.joining(","));
+                record.setMp3url(url);
+            }
+        }
+
+
+
+        // 查询有效直接返回
+        if (query.getStatus() != null && query.getStatus().equals(YesOrNoEnum.YES)) {
+            records = records.stream()
+                   .peek(record -> record.setStatus(YesOrNoEnum.YES)).collect(Collectors.toList());
+            courseCoursewareVoIPage.setRecords(records);
+            return courseCoursewareVoIPage;
+        }
+        // 设置课件失效
+
+        // 1.判断曲目启用
+        for (CourseCoursewareVo record : records) {
+            if (record.getMusicStatus().equals(YesOrNoEnum.NO)) {
+                record.setStatus(YesOrNoEnum.NO);
+            }
+        }
+
+        // 1. 判断免费
+
+        for (CourseCoursewareVo record : records) {
+            if (record.getPaymentType().contains("FREE") && record.getStatus() == null) {
+                record.setStatus(YesOrNoEnum.YES);
+            }
+        }
+
+        // 2. 判断是否购买曲目或专辑
+        List<Long> coursewareIdList = records.stream()
+                                    .filter(record -> record.getStatus() == null)
+                                    .map(CourseCoursewareVo::getId)
+                                    .collect(Collectors.toList());
+
+        coursewareIdList = baseMapper.selectPayMusic(coursewareIdList);
+
+        for (CourseCoursewareVo record : records) {
+            if (coursewareIdList.contains(record.getId())) {
+                record.setStatus(YesOrNoEnum.YES);
+            }
+        }
+        // 4. 判断会员
+
+        List<Teacher> teachers = teacherDao.selectBatchIds(userIdList);
+        userIdList = new HashSet<>();
+        for (Teacher teacher : teachers) {
+            if (teacher.getMembershipEndTime() != null && teacher.getMembershipEndTime().compareTo(new Date()) > 0) {
+                userIdList.add(teacher.getUserId());
+            }
+        }
+
+        for (CourseCoursewareVo record : records) {
+            if (record.getPaymentType().contains("VIP") && record.getStatus() == null && userIdList.contains(record.getUserId())) {
+                record.setStatus(YesOrNoEnum.YES);
+            }
+        }
+        for (CourseCoursewareVo record : records) {
+            if (record.getStatus() == null) {
+                record.setStatus(YesOrNoEnum.NO);
+            }
+        }
+
+        courseCoursewareVoIPage.setRecords(records);
+        return courseCoursewareVoIPage;
+    }
+
+    @Override
+    public boolean removeById(Serializable id) {
+        return super.removeById(id);
+        // CourseCourseware courseCourseware = new CourseCourseware();
+        // courseCourseware.setId((Long) id);
+        // courseCourseware.setDelFlag(true);
+        // return updateById(courseCourseware);
+    }
+
+    @Override
+    public CourseCourseware submit(CourseCourseware courseCourseware) {
+
+        // 判断用户
+        com.yonge.cooleshow.auth.api.entity.SysUser user = sysUserFeignService.queryUserById(
+                courseCourseware.getUserId());
+        if (user == null) {
+            throw new BizException("用户信息未找到");
+        }
+
+        // 判断是否已经添加到附件
+        Integer count = this.lambdaQuery()
+                            .eq(CourseCourseware::getDelFlag, false)
+                            .eq(CourseCourseware::getUserId, courseCourseware.getUserId())
+                            .eq(CourseCourseware::getMusicSheetId, courseCourseware.getMusicSheetId())
+                            .eq(CourseCourseware::getClientType, courseCourseware.getClientType())
+                            .count();
+        if (count >0 ) {
+            throw new BizException("当前曲目已经添加到附件");
+        }
+
+        // 判断是否有权限添加
+        MusicSheetDetailVo detail = musicSheetService.detail(courseCourseware.getMusicSheetId(), user,
+                                                             courseCourseware.getClientType());
+
+        if (detail == null) {
+            throw new BizException("曲目不存在");
+        }
+        // 判断是否为MP3
+        if (detail.getAudioType().equals(AudioTypeEnum.MIDI)) {
+            throw new BizException("该曲目不支持添加到课件");
+        }
+
+        if (detail.getPlay().equals(YesOrNoEnum.NO)) {
+            if (detail.getPaymentType().contains("VIP") && detail.getPaymentType().contains("CHARGE")) {
+                throw new BizException("请先开通会员或购买曲目");
+            } else if (detail.getPaymentType().contains("VIP")) {
+                throw new BizException("请先开通会员");
+            } else if (detail.getPaymentType().contains("CHARGE")) {
+                throw new BizException("请先购买曲目");
+            } else {
+                throw new BizException("该曲目不支持添加到课件");
+            }
+        }
+        this.saveOrUpdate(courseCourseware);
+        return courseCourseware;
+    }
+
+    @Override
+    public boolean removeByIds(Collection<? extends Serializable> idList) {
+        return super.removeByIds(idList);
+        // List<CourseCourseware> list = new ArrayList<>();
+        // for (Serializable id : idList) {
+        //     CourseCourseware courseCourseware = new CourseCourseware();
+        //     courseCourseware.setId((Long) id);
+        //     courseCourseware.setDelFlag(true);
+        //     list.add(courseCourseware);
+        // }
+        // return updateBatchById(list);
+    }
+}

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

@@ -119,6 +119,8 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     @Autowired
     private TeacherService teacherService;
 
+    @Autowired
+    private CourseCoursewareService courseCoursewareService;
 
     @Autowired
     private StudentStarService studentStarService;
@@ -276,6 +278,19 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
             return detail;
         }
 
+        // 设置课件
+        List<CourseCourseware> list = courseCoursewareService.lambdaQuery()
+                                                             .eq(CourseCourseware::getClientType, userType)
+                                                             .eq(CourseCourseware::getMusicSheetId, id)
+                                                             .eq(CourseCourseware::getUserId, sysUser.getId())
+                                                             .eq(CourseCourseware::getDelFlag, false)
+                                                             .list();
+        if (CollectionUtils.isNotEmpty(list)) {
+            detail.setCoursewareStatus(YesOrNoEnum.YES);
+            detail.setCoursewareId(list.get(0).getId());
+        }
+
+
         // 收藏
         YesOrNoEnum favorite = musicFavoriteService.checkFavorite(id,sysUser.getId(),userType);
         detail.setFavorite(favorite);

+ 110 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseCoursewareVo.java

@@ -0,0 +1,110 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.yonge.cooleshow.biz.dal.entity.CourseCourseware;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022-11-02 10:17:44
+ */
+@ApiModel(value = "CourseCoursewareVo对象", description = "课件表查询视图对象")
+public class CourseCoursewareVo extends CourseCourseware{
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty("用户名")
+	private String username;
+
+	@ApiModelProperty(value = "曲谱名称")
+	private String musicSheetName;  //曲谱名称
+
+	@ApiModelProperty("是否有效, 0:失效 1:有效")
+	private YesOrNoEnum status;
+
+	@ApiModelProperty(value = "封面图")
+	private String titleImg;  //曲谱名称
+
+	@ApiModelProperty(hidden = true)
+	private String paymentType;
+
+
+	@ApiModelProperty("曲目图片 多个逗号隔开")
+	private String musicImg;
+
+	@ApiModelProperty("原音地址,多个逗号隔开")
+	private String mp3url;
+
+
+	@ApiModelProperty(value = "曲目是否启用 0:未启用, 1:启用",hidden = true)
+	private YesOrNoEnum musicStatus;
+
+
+	public String getMusicImg() {
+		return musicImg;
+	}
+
+	public void setMusicImg(String musicImg) {
+		this.musicImg = musicImg;
+	}
+
+	public String getMp3url() {
+		return mp3url;
+	}
+
+	public void setMp3url(String mp3url) {
+		this.mp3url = mp3url;
+	}
+
+	public YesOrNoEnum getMusicStatus() {
+		return musicStatus;
+	}
+
+	public void setMusicStatus(YesOrNoEnum musicStatus) {
+		this.musicStatus = musicStatus;
+	}
+
+	public String getPaymentType() {
+		return paymentType;
+	}
+
+	public void setPaymentType(String paymentType) {
+		this.paymentType = paymentType;
+	}
+
+	public YesOrNoEnum getStatus() {
+		return status;
+	}
+
+	public void setStatus(YesOrNoEnum status) {
+		this.status = status;
+	}
+
+	public String getMusicSheetName() {
+		return musicSheetName;
+	}
+
+	public void setMusicSheetName(String musicSheetName) {
+		this.musicSheetName = musicSheetName;
+	}
+
+	public String getTitleImg() {
+		return titleImg;
+	}
+
+	public void setTitleImg(String titleImg) {
+		this.titleImg = titleImg;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
+	}
+}

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

@@ -69,6 +69,27 @@ public class MusicSheetDetailVo extends MusicSheet {
     @ApiModelProperty("审核理由")
     private String auditReason;
 
+    @ApiModelProperty("是否为课件")
+    private YesOrNoEnum coursewareStatus = YesOrNoEnum.NO;
+
+    @ApiModelProperty("课件id")
+    private Long coursewareId;
+
+    public YesOrNoEnum getCoursewareStatus() {
+        return coursewareStatus;
+    }
+
+    public void setCoursewareStatus(YesOrNoEnum coursewareStatus) {
+        this.coursewareStatus = coursewareStatus;
+    }
+
+    public Long getCoursewareId() {
+        return coursewareId;
+    }
+
+    public void setCoursewareId(Long coursewareId) {
+        this.coursewareId = coursewareId;
+    }
 
     public YesOrNoEnum getFavorite() {
         return favorite;

+ 102 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseCoursewareMapper.xml

@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.yonge.cooleshow.biz.dal.dao.CourseCoursewareDao">
+	<resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.CourseCourseware">
+            <result column="id_" property="id" />
+	        <result column="user_id_" property="userId" />
+	        <result column="client_type_" property="clientType" />
+	        <result column="music_sheet_id_" property="musicSheetId" />
+	        <result column="create_time_" property="createTime" />
+	        <result column="update_time_" property="updateTime" />
+		</resultMap>  
+    
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+         t.id_ as id
+        , t.user_id_ as userId
+        , t.client_type_ as clientType
+         ,t.music_sheet_id_ as musicSheetId
+        , t.create_time_ as createTime
+        , t.update_time_ as updateTime
+        </sql>
+    
+    <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo">
+        SELECT
+            <include refid="baseColumns"/>
+        FROM course_courseware t
+        where t.id_ = #{id}
+    </select>
+    
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo">
+		SELECT         
+        	<include refid="baseColumns" />
+        ,ms.music_sheet_name_ as musicSheetName
+        ,ms.state_ as musicStatus
+        ,ms.payment_type_ as paymentType
+        ,ms.music_img_ as musicImg
+        ,ms.title_img_ as titleImg
+		FROM course_courseware t
+        left join music_sheet ms on t.music_sheet_id_ = ms.id_
+        <where>
+            t.del_flag_ = 0
+            <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.idAndName != null and param.idAndName != ''">
+                and  (ms.music_sheet_name_ like '%${param.idAndName}%' or ms.id_ like '%${param.idAndName}%')
+            </if>
+            <if test="param.musicTagIdList != null and param.musicTagIdList.size() != 0">
+                and
+                <foreach collection="param.musicTagIdList" open="(" close=")" separator="or" item="item">
+                    find_in_set(#{item},ms.music_tag_)
+                </foreach>
+            </if>
+            <if test="param.subjectIdList != null and param.subjectIdList.size() != 0">
+                and
+                <foreach collection="param.subjectIdList" separator="or" item="item"  open="(" close=")" >
+                    find_in_set(#{item},ms.music_subject_)
+                </foreach>
+            </if>
+            <if test="param.status != null and param.status.code == 1">
+                 and (ms.payment_type_ like '%FREE%'
+                or EXISTS (select * from music_sheet_purchase_record mspr where mspr.music_sheet_id_ = ms.id_ and mspr.student_id_ = t.user_id_ and mspr.order_status_ = 'PAID' and mspr.purchase_type_ = 'MUSIC' and mspr.client_type_ = 'TEACHER')
+
+                or  EXISTS (select mspr.music_sheet_id_ from music_sheet_purchase_record mspr
+                left join album_music_relate amr on amr.album_id_ = mspr.music_sheet_id_
+                where mspr.student_id_ = t.user_id_ and mspr.order_status_ = 'PAID' and mspr.purchase_type_ = 'ALBUM' and amr.music_sheet_id_ = ms.id_ and mspr.client_type_ = 'TEACHER' )
+                or (ms.payment_type_ like '%VIP%' and  EXISTS(select 1 from teacher t1 where t1.user_id_ = t.user_id_ and t1.membership_end_time_ > now()))
+                )
+            </if>
+        </where>
+	</select>
+
+	<select id="selectPayMusic" resultType="java.lang.Long">
+        select cc.id_ from course_courseware cc
+
+        where
+            (EXISTS (select * from music_sheet_purchase_record mspr
+                       where mspr.music_sheet_id_ = cc.music_sheet_id_
+                         and mspr.student_id_ = cc.user_id_
+                         and mspr.order_status_ = 'PAID'
+                         and mspr.purchase_type_ = 'MUSIC'
+                         and mspr.client_type_ = 'TEACHER')
+
+           or  EXISTS (select mspr.music_sheet_id_ from music_sheet_purchase_record mspr
+                       left join album_music_relate amr on amr.album_id_ = mspr.music_sheet_id_
+                       where mspr.student_id_ = cc.user_id_
+                         and mspr.order_status_ = 'PAID'
+                         and mspr.purchase_type_ = 'ALBUM'
+                         and amr.music_sheet_id_ = cc.music_sheet_id_
+                         and mspr.client_type_ = 'TEACHER'))
+
+        <if test="coursewareIdList != null and coursewareIdList.size() != 0">
+            and cc.id_ in
+            <foreach collection="coursewareIdList" separator="," item="item" open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+    </select>
+</mapper>

+ 97 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/CourseCoursewareController.java

@@ -0,0 +1,97 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+
+import com.yonge.toolset.base.util.StringUtil;
+import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+import com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo;
+import com.yonge.cooleshow.biz.dal.dto.search.CourseCoursewareSearch;
+import com.yonge.cooleshow.biz.dal.entity.CourseCourseware;
+import com.yonge.cooleshow.biz.dal.service.CourseCoursewareService;
+
+import java.util.Date;
+
+@RestController
+@RequestMapping("/courseCourseware")
+@Api(value = "课件表", tags = "课件表")
+public class CourseCoursewareController extends BaseController {
+
+	@Autowired
+	private CourseCoursewareService courseCoursewareService;
+
+
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+	/**
+	 * 查询分页
+	 */
+	@PostMapping("/page")
+	@ApiOperation(value = "查询分页", notes = "传入courseCoursewareSearch")
+	public HttpResponseResult<PageInfo<CourseCoursewareVo>> page(@RequestBody CourseCoursewareSearch query) {
+		SysUser user = sysUserFeignService.queryUserInfo();
+		if (user == null) {
+			throw new BizException("请重新登录");
+		}
+		query.setClientType(ClientEnum.TEACHER);
+		query.setUserId(user.getId());
+		IPage<CourseCoursewareVo> pages = courseCoursewareService.selectPage(PageUtil.getPage(query), query);
+		return succeed(PageUtil.pageInfo(pages));
+	}
+
+	/**
+	 * 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperation(value = "新增或修改", notes = "传入courseCourseware")
+	public HttpResponseResult<CourseCourseware> submit(@Valid @RequestBody CourseCourseware courseCourseware) {
+
+		SysUser user = sysUserFeignService.queryUserInfo();
+		if (user == null) {
+			throw new BizException("请重新登录");
+		}
+
+		courseCourseware.setClientType(ClientEnum.TEACHER);
+		courseCourseware.setUserId(user.getId());
+		if (courseCourseware.getId() != null) {
+			courseCourseware.setUpdateTime(new Date());
+		} else {
+			courseCourseware.setUpdateTime(new Date());
+			courseCourseware.setCreateTime(new Date());
+		}
+		courseCourseware.setClientType(ClientEnum.TEACHER);
+		return succeed(courseCoursewareService.submit(courseCourseware));
+	}
+
+	/**
+	 * 删除
+	 */
+	@PostMapping("/remove/{id}")
+	@ApiOperation(value = "删除", notes = "传入id")
+	public HttpResponseResult remove(@PathVariable Long id ) {
+		return status(courseCoursewareService.removeById(id));
+	}
+
+
+	/**
+	 * 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperation(value = "批量删除", notes = "传入id")
+	public HttpResponseResult remove(@RequestParam String ids ) {
+		return status(courseCoursewareService.removeByIds(StringUtil.toLongList(ids)));
+	}
+}

+ 76 - 0
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/CourseCoursewareController.java

@@ -0,0 +1,76 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+
+import com.yonge.toolset.base.util.StringUtil;
+import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+import com.yonge.cooleshow.biz.dal.vo.CourseCoursewareVo;
+import com.yonge.cooleshow.biz.dal.dto.search.CourseCoursewareSearch;
+import com.yonge.cooleshow.biz.dal.entity.CourseCourseware;
+import com.yonge.cooleshow.biz.dal.service.CourseCoursewareService;
+
+import java.util.Date;
+
+@RestController
+@RequestMapping("/courseCourseware")
+@Api(value = "课件表", tags = "课件表")
+public class CourseCoursewareController extends BaseController {
+
+	@Autowired
+	private CourseCoursewareService courseCoursewareService;
+
+	/**
+	 * 查询分页
+	 */
+	@PostMapping("/page")
+	@ApiOperation(value = "查询分页", notes = "传入courseCoursewareSearch")
+	public HttpResponseResult<PageInfo<CourseCoursewareVo>> page(@RequestBody CourseCoursewareSearch query) {
+		IPage<CourseCoursewareVo> pages = courseCoursewareService.selectPage(PageUtil.getPage(query), query);
+		return succeed(PageUtil.pageInfo(pages));
+	}
+
+	/**
+	 * 新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperation(value = "新增或修改", notes = "传入courseCourseware")
+	public HttpResponseResult<CourseCourseware> submit(@Valid @RequestBody CourseCourseware courseCourseware) {
+		if (courseCourseware.getId() != null) {
+			courseCourseware.setUpdateTime(new Date());
+		} else {
+			courseCourseware.setUpdateTime(new Date());
+			courseCourseware.setCreateTime(new Date());
+		}
+		courseCourseware.setClientType(ClientEnum.TEACHER);
+		return succeed(courseCoursewareService.submit(courseCourseware));
+	}
+
+	/**
+	 * 删除
+	 */
+	@PostMapping("/remove/{id}")
+	@ApiOperation(value = "删除", notes = "传入id")
+	public HttpResponseResult remove(@PathVariable Long id ) {
+		return status(courseCoursewareService.removeById(id));
+	}
+
+
+	/**
+	 * 删除
+	 */
+	@PostMapping("/remove")
+	@ApiOperation(value = "批量删除", notes = "传入id")
+	public HttpResponseResult remove(@RequestParam String ids ) {
+		return status(courseCoursewareService.removeByIds(StringUtil.toLongList(ids)));
+	}
+}