Browse Source

酷乐秀曲目来源改为内容平台

zouxuan 9 months ago
parent
commit
3f11f137d5

+ 20 - 11
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/SubjectController.java

@@ -2,11 +2,15 @@ package com.yonge.cooleshow.admin.controller;
 
 import com.dayaedu.cbs.openfeign.client.MusicFeignClientService;
 import com.dayaedu.cbs.openfeign.wrapper.music.CbsSubjectWrapper;
+import com.microsvc.toolkit.common.response.template.R;
 import com.microsvc.toolkit.common.webportal.exception.BizException;
+import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 import com.yonge.cooleshow.biz.dal.dto.PageUtil;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.queryInfo.SubjectQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.SubjectService;
+import com.yonge.cooleshow.biz.dal.service.SysUserService;
+import com.yonge.cooleshow.biz.dal.wrapper.SubjectWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
@@ -23,6 +27,7 @@ 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 springfox.documentation.annotations.ApiIgnore;
 
 import java.util.List;
 import java.util.Map;
@@ -38,6 +43,9 @@ public class SubjectController extends BaseController {
 	private SubjectService subjectService;
 
     @Autowired
+    private SysUserService sysUserService;
+
+    @Autowired
     private MusicFeignClientService musicFeignClientService;
 
 	@ApiOperation(value = "根据声部编号查询声部")
@@ -100,25 +108,26 @@ public class SubjectController extends BaseController {
 	@ApiOperation(value = "修改、新增声部")
 	@PostMapping("/upset")
 	@PreAuthorize("@pcs.hasPermissions('subject/upset')")
-	public Object update(@RequestBody Subject subject) {
-		subjectService.upSetSubject(subject);
+	public Object update(@RequestBody SubjectWrapper.AddSubject add) {
+		add.setOperator(sysUserService.getUserId());
+		subjectService.add(add);
 		return succeed();
 	}
 
-	/*@ApiOperation(value = "删除指定声部")
-	@PostMapping("/delete/{id}")
-	@PreAuthorize("@pcs.hasPermissions('subject/delete')")
-	public HttpResponseResult<Subject> delete(@ApiParam(value = "声部编号", required = true) @PathVariable("id") Long id) {
-		subjectService.deleteById(id);
-		return succeed();
-	}*/
-
+	@PreAuthorize("@pcs.hasPermissions('subject/enable')")
+	@PostMapping("/enable")
+	public HttpResponseResult<Boolean> enable(@RequestBody SubjectWrapper.SubjectEnable subjectEnable) {
+		Subject subject = new Subject();
+		subject.setId(subjectEnable.getId());
+		subject.setEnableFlag(subjectEnable.getEnableFlag());
+		return succeed(subjectService.enable(subject));
+	}
 
     /**
      * 声部分页
      */
     @ApiOperation(value = "内容平台对应的声部数据")
-    @PostMapping("/cbsSubject/list")
+    @PostMapping("/cbsSubject/page")
     public HttpResponseResult<PageInfo<CbsSubjectWrapper.Subject>> subjectPage(){
         CbsSubjectWrapper.SubjectQuery subjectQuery = new CbsSubjectWrapper.SubjectQuery();
         subjectQuery.setPage(1);

+ 1 - 7
cooleshow-gateway/gateway-web/src/main/java/com/yonge/gateway/web/config/SwaggerDocumentConfig.java

@@ -21,15 +21,9 @@ public class SwaggerDocumentConfig implements SwaggerResourcesProvider {
 		resources.add(swaggerResource("授权服务", "/auth-server/v2/api-docs", "2.0"));
 		resources.add(swaggerResource("CMS服务", "/cms-server/v2/api-docs", "2.0"));
 		resources.add(swaggerResource("TASK服务", "/task-server/v2/api-docs", "2.0"));
-		resources.add(swaggerResource("STUDENT服务", "/student-server/v2/api-docs", "2.0"));
-		resources.add(swaggerResource("TEACHER服务", "/teacher-server/v2/api-docs", "2.0"));
-		resources.add(swaggerResource("ADMIN服务", "/admin-server/v2/api-docs", "2.0"));
-		resources.add(swaggerResource("WEBSITE服务", "/website-server/v2/api-docs", "2.0"));
 		resources.add(swaggerResource("MALL_ADMIN服务", "/mall-admin-server/v2/api-docs", "2.0"));
 		resources.add(swaggerResource("MALL_PORTAL服务", "/mall-portal-server/v2/api-docs", "2.0"));
-		resources.add(swaggerResource("网络教室", "/classroom-server/v2/api-docs", "2.0"));
-		resources.add(swaggerResource("TENANT服务", "/tenant-server/v2/api-docs", "2.0"));
-		resources.add(swaggerResource("App服务", "/app-server/v2/api-docs", "2.0"));
+		resources.add(swaggerResource("业务服务", "/app-server/v2/api-docs", "2.0"));
 		return resources;
 	}
 

+ 55 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Instrument.java

@@ -0,0 +1,55 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 乐器设置
+ * 2024-04-22 16:55:18
+ */
+@Data
+@ApiModel(" Instrument-乐器设置")
+@TableName("instrument")
+public class Instrument implements Serializable {
+
+    @ApiModelProperty("主键ID,内容平台乐器ID")
+    @TableId(value = "id_")
+    private Long id;
+
+    @ApiModelProperty("声部ID")
+	@TableField(value = "subject_id_")
+    private Long subjectId;
+
+    @ApiModelProperty("横竖屏:1:竖 0:横")
+	@TableField(value = "orientation_")
+    private Boolean orientation;
+
+    @ApiModelProperty("启用/停用")
+    @TableField(value = "enable_flag_")
+    private Boolean enableFlag;
+
+    @ApiModelProperty("删除标记")
+	@TableField(value = "del_flag_")
+    private Boolean delFlag;
+
+    @ApiModelProperty("创建时间")
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间")
+	@TableField(value = "update_time_")
+    private Date updateTime;
+
+    @ApiModelProperty("操作人")
+	@TableField(value = "operator_")
+    private Long operator;
+
+}

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/Subject.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -49,6 +50,9 @@ public class Subject implements Serializable {
     @ApiModelProperty(value = "cbs声部名称")
     private String cbsSubjectName;
 
+	@TableField(value = "enable_flag_")
+	private Boolean enableFlag;
+
 	/**  */
 	@ApiModelProperty(value = "是否删除1是,0否",required = false)
 	private Boolean delFlag= false;

+ 55 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/InstrumentService.java

@@ -0,0 +1,55 @@
+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.entity.Instrument;
+import com.yonge.cooleshow.biz.dal.wrapper.InstrumentWrapper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 乐器设置
+ * 2024-04-22 16:55:18
+ */
+public interface InstrumentService extends IService<Instrument>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return Instrument
+     */
+	Instrument detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<Instrument>
+     * @param query InstrumentWrapper.InstrumentQuery
+     * @return IPage<Instrument>
+     */
+    IPage<InstrumentWrapper.Instrument> selectPage(IPage<InstrumentWrapper.Instrument> page, InstrumentWrapper.InstrumentQuery query);
+
+    /**
+     * 添加
+     * @param instrument InstrumentWrapper.Instrument
+     * @return Boolean
+     */
+     Boolean add(InstrumentWrapper.Instrument instrument);
+
+    /**
+     * 更新
+     * @param instrument InstrumentWrapper.Instrument
+     * @return Boolean
+     */
+     Boolean update(InstrumentWrapper.Instrument instrument);
+
+    List<Instrument> queryBySubjectId(Long subject);
+
+    Map<Long,InstrumentWrapper.Instrument> getMapByIds(List<Long> instrumentIdList);
+
+    Map<Integer,List<InstrumentWrapper.Instrument>> getGroupBySubjectId(List<Integer> subjectIds, Boolean enableFlag);
+
+    List<InstrumentWrapper.Instrument> getList(InstrumentWrapper.InstrumentQuery query);
+
+    List<Long> getInstrumentIdsBySubjectId(Long subjectId);
+}

+ 7 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SubjectService.java

@@ -3,9 +3,12 @@ package com.yonge.cooleshow.biz.dal.service;
 import java.util.List;
 import java.util.Map;
 
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.SubjectDao;
+import com.yonge.cooleshow.biz.dal.entity.Employee;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.queryInfo.SubjectQueryInfo;
+import com.yonge.cooleshow.biz.dal.wrapper.SubjectWrapper;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.service.BaseService;
 
@@ -58,4 +61,8 @@ public interface SubjectService extends BaseService<Long, Subject> {
     Map<Integer, Subject> getMapByIds(List<String> subjectIds);
 
     Map<Integer, Subject> getAllMap();
+
+    void add(SubjectWrapper.AddSubject add);
+
+	Boolean enable(Subject subject);
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysUserService.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.wrapper.UserInfoWrapper;
@@ -42,4 +43,5 @@ public interface SysUserService{
      *
      */
     void imDeviceId(UserInfoWrapper.UpdateUser info);
+
 }

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

@@ -1,34 +1,45 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-import org.apache.commons.lang3.StringUtils;
-import org.redisson.api.RedissonClient;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-
+import com.dayaedu.cbs.openfeign.client.MusicFeignClientService;
+import com.dayaedu.cbs.openfeign.wrapper.musicInstrument.CbsMusicalInstrumentWrapper;
 import com.yonge.cooleshow.biz.dal.dao.SubjectDao;
+import com.yonge.cooleshow.biz.dal.entity.Instrument;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.queryInfo.SubjectQueryInfo;
+import com.yonge.cooleshow.biz.dal.service.InstrumentService;
 import com.yonge.cooleshow.biz.dal.service.SubjectService;
+import com.yonge.cooleshow.biz.dal.wrapper.SubjectWrapper;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.mybatis.dal.BaseDAO;
 import com.yonge.toolset.mybatis.service.impl.BaseServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 @Service
 public class SubjectServiceImpl extends BaseServiceImpl<Long, Subject> implements SubjectService {
+    private static final Logger log = LoggerFactory.getLogger(MusicSheetServiceImpl.class);
 
-    @Autowired
-    private SubjectDao subjectDao;
-    @Autowired
+    @Resource
     private RedissonClient redissonClient;
+    @Resource
+    private SubjectDao subjectDao;
+    @Resource
+    private MusicFeignClientService musicFeignClientService;
+    @Resource
+    private InstrumentService instrumentService;
 
     @Override
     public BaseDAO<Long, Subject> getDAO() {
@@ -119,7 +130,7 @@ public class SubjectServiceImpl extends BaseServiceImpl<Long, Subject> implement
         List<Subject> subjects;
 
         if(StringUtil.isEmpty(type)){
-            List<Subject> allList = subjectDao.findAll(new HashMap<>());
+            List<Subject> allList = subjectDao.getAll();
 
             parents = allList.stream()
                     .filter(o -> (null == o.getParentSubjectId() || o.getParentSubjectId().equals(0L)))
@@ -203,6 +214,88 @@ public class SubjectServiceImpl extends BaseServiceImpl<Long, Subject> implement
         return all.stream().collect(Collectors.toMap(o -> o.getId().intValue(), o -> o));
     }
 
+    @Override
+    public void add(SubjectWrapper.AddSubject add) {
+        List<SubjectWrapper.AddSubjectInstrument> subjects = add.getSubjects();
+        if (CollectionUtils.isEmpty(subjects)) {
+            throw new BizException("声部不能为空");
+        }
+        // 声部ID集合
+        String cbsSubjectIds = subjects.stream().map(e->e.getCbsSubjectId().toString()).collect(Collectors.joining(","));
+        // 查询声部是否存在
+        List<Subject> subjectList = subjectDao.getByCbsSubjectIds(cbsSubjectIds);
+        // 已存在的cbsId集合
+        Map<Long,Long> cbsSubjectMap = subjectList.stream()
+                .collect(Collectors.toMap(Subject::getCbsSubjectId, Subject::getId,(o1, o2)->o1));
+
+        // 乐器ID集合
+        List<Long> instrumentIds = subjects.stream().filter(o -> org.apache.commons.collections.CollectionUtils.isNotEmpty(o.getInstrumentIds()))
+                .flatMap(o -> o.getInstrumentIds().stream()).distinct().collect(Collectors.toList());
+
+        Map<Long, CbsMusicalInstrumentWrapper.MusicalInstrumentQueryDto> instrumentQueryDtoMap = new HashMap<>();
+
+        // 查询乐器信息
+        CbsMusicalInstrumentWrapper.MusicalInstrumentQuery musicalInstrumentQuery = new CbsMusicalInstrumentWrapper.MusicalInstrumentQuery();
+        musicalInstrumentQuery.setIds(instrumentIds.stream().map(Long::intValue).collect(Collectors.toList()));
+        musicalInstrumentQuery.setPage(1);
+        musicalInstrumentQuery.setRows(9999);
+        try {
+            List<CbsMusicalInstrumentWrapper.MusicalInstrumentQueryDto> rows = musicFeignClientService
+                    .musicalInstrumentPage(musicalInstrumentQuery).feignData().getRows();
+            instrumentQueryDtoMap = rows.stream().collect(Collectors.toMap(o->o.getId().longValue(),o->o,(o1,o2)->o1));
+        }catch (Exception e){
+            log.error("调用音乐服务查询乐器失败", e);
+            throw new com.microsvc.toolkit.common.webportal.exception.BizException("内容平台服务异常");
+        }
+
+        List<Instrument> saveInstrumentList = new ArrayList<>();
+        // 保存声部
+        for (SubjectWrapper.AddSubjectInstrument addSubject : subjects) {
+            Long subjectId;
+            if (!cbsSubjectMap.containsKey(addSubject.getCbsSubjectId())) {
+                Subject subject = new Subject();
+                subject.setCbsSubjectId(addSubject.getCbsSubjectId());
+                subject.setEnableFlag(false);
+                this.insert(subject);
+                subjectId= subject.getId();
+            } else {
+                subjectId = cbsSubjectMap.get(addSubject.getCbsSubjectId());
+            }
+            if (org.apache.commons.collections.CollectionUtils.isNotEmpty(addSubject.getInstrumentIds())) {
+                for (Long instrumentId : addSubject.getInstrumentIds()) {
+                    Instrument instrument = new Instrument();
+                    instrument.setId(instrumentId);
+                    instrument.setSubjectId(subjectId);
+                    instrument.setEnableFlag(false);
+                    instrument.setOperator(add.getOperator());
+                    CbsMusicalInstrumentWrapper.MusicalInstrumentQueryDto musicalInstrumentQueryDto = instrumentQueryDtoMap.get(instrumentId);
+                    if (musicalInstrumentQueryDto != null) {
+                        instrument.setOrientation(musicalInstrumentQueryDto.getOrientation());
+                    } else {
+                        instrument.setOrientation(false);
+                    }
+                    saveInstrumentList.add(instrument);
+                }
+            }
+
+        }
+        instrumentService.saveOrUpdateBatch(saveInstrumentList);
+    }
+
+    @Override
+    public Boolean enable(Subject subject) {
+        // 停用声部,同时停用声部下的乐器
+        subjectDao.update(subject);
+        if (Boolean.FALSE.equals(subject.getEnableFlag())) {
+            instrumentService.lambdaUpdate()
+                    .eq(Instrument::getSubjectId, subject.getId())
+                    .eq(Instrument::getEnableFlag, true)
+                    .set(Instrument::getEnableFlag, false)
+                    .update();
+        }
+        return true;
+    }
+
     /***
      * 查询声部树
      * @param: sub

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

@@ -5,6 +5,7 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;

+ 129 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/InstrumentWrapper.java

@@ -0,0 +1,129 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 乐器设置
+ * 2024-04-22 16:55:18
+ */
+@ApiModel(value = "InstrumentWrapper对象", description = "乐器设置查询对象")
+public class InstrumentWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" InstrumentQuery-乐器设置")
+    public static class InstrumentQuery implements QueryInfo {
+
+    	@ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+
+        @ApiModelProperty("声部")
+        private Integer subjectId;
+        @ApiModelProperty("声部")
+        private List<Integer> subjectIds;
+        @ApiModelProperty("是否启用")
+        private Boolean enableFlag;
+
+
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static InstrumentQuery from(String json) {
+            return JSON.parseObject(json, InstrumentQuery.class);
+        }
+    }
+
+    @Data
+	@ApiModel(" Instrument-乐器设置")
+    public static class Instrument {
+
+        @ApiModelProperty("乐器ID")
+        private Long id;
+
+        @ApiModelProperty("乐器名称")
+        private String name;
+
+        @ApiModelProperty("声部ID")
+        private Long subjectId;
+
+        @ApiModelProperty("声部名称")
+        private String subjectName;
+
+        @ApiModelProperty("横竖屏:1:竖 0:横")
+        private Boolean orientation;
+
+        @ApiModelProperty("启用/停用")
+        private Boolean enableFlag;
+
+        @ApiModelProperty("创建时间")
+        private Date createTime;
+
+        @ApiModelProperty("更新时间")
+        private Date updateTime;
+
+        @ApiModelProperty("操作人")
+        private Long operator;
+
+        @ApiModelProperty("编码")
+        private String code;
+
+
+        @ApiModelProperty("是否可转普")
+        private Boolean transferFlag;
+
+        @ApiModelProperty("图片")
+        private String img;
+
+        @ApiModelProperty("音频")
+        private String media;
+
+        @ApiModelProperty("频率")
+        private Integer hz;
+
+        @ApiModelProperty("默认谱面(STAVE: 五线谱; JIAN: 固定调; FIRST: 首调)")
+        private String defaultScore;
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static Instrument from(String json) {
+            return JSON.parseObject(json, Instrument.class);
+        }
+	}
+
+    @Data
+    public static class Update {
+
+        @ApiModelProperty("乐器ID")
+        @NotNull(message = "乐器ID不能为空")
+        private Long id;
+
+        @ApiModelProperty("操作人")
+        private Long operator;
+
+        @ApiModelProperty("横竖屏:1:竖 0:横")
+        private Boolean orientation;
+
+        @ApiModelProperty("启用/停用")
+        private Boolean enableFlag;
+    }
+}

+ 265 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/SubjectWrapper.java

@@ -0,0 +1,265 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+import com.dayaedu.cbs.openfeign.wrapper.music.CbsSubjectWrapper;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+public class SubjectWrapper {
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class SubjectQuery implements QueryInfo {
+
+        @ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+        @ApiModelProperty("关键字匹配")
+        private String keyword;
+
+        @ApiModelProperty("删除标识")
+        private Integer delFlag;
+
+        @ApiModelProperty("启用标识")
+        private Boolean enableFlag;
+
+        @ApiModelProperty("声部ID")
+        private Integer subjectId;
+
+        @ApiModelProperty("多个声部ID")
+        private String subjectIds;
+
+        @ApiModelProperty("多个乐器ID")
+        private String instrumentIds;
+
+        @ApiModelProperty("有乐器")
+        private Boolean hasInstrument;
+
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class Subject {
+
+        @ApiModelProperty("主键")
+        private Integer id;
+
+        @ApiModelProperty("内容平台声部ID")
+        private Long cbsSubjectId;
+
+        @ApiModelProperty("内容平台声部名称")
+        private String cbsSubjectName;
+
+        @ApiModelProperty("名称")
+        private String name;
+
+        @ApiModelProperty("编码")
+        private String code;
+
+        @ApiModelProperty("父级声部ID")
+        private Long parentId;
+
+        @ApiModelProperty("封面")
+        private String img;
+
+        @ApiModelProperty("orientation:1:竖 0:横")
+        private Boolean orientation;
+
+        @ApiModelProperty("删除标识")
+        private Boolean delFlag;
+
+        @ApiModelProperty("描述信息")
+        private String desc;
+
+        @ApiModelProperty("logo")
+        private String logo;
+
+        @ApiModelProperty("音频")
+        private String media;
+
+        @ApiModelProperty("更新人")
+        private Long operator;
+
+        @ApiModelProperty("更新人")
+        private String operatorName;
+
+        @ApiModelProperty("更新时间")
+        private Date updateTime;
+
+        @ApiModelProperty("创建时间")
+        private Date createTime;
+
+        @ApiModelProperty("启用标识")
+        private Boolean enableFlag;
+
+        @ApiModelProperty("声部列表")
+        private List<Subject> subjects;
+
+        @ApiModelProperty("乐器列表")
+        private List<InstrumentWrapper.Instrument> instruments;
+
+    }
+
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class SmallInstrument {
+
+        @ApiModelProperty("乐器ID")
+        private Integer id;
+
+        @ApiModelProperty("乐器名称")
+        private String name;
+
+        @ApiModelProperty("编码")
+        private String code;
+
+        @ApiModelProperty("横竖屏:1:竖 0:横")
+        private Boolean orientation;
+
+        @ApiModelProperty("是否可转普")
+        private Boolean transferFlag;
+
+        @ApiModelProperty("图片")
+        private String img;
+
+        @ApiModelProperty("音频")
+        private String media;
+
+        @ApiModelProperty("频率")
+        private Integer hz;
+
+        @ApiModelProperty("是否启用")
+        private Boolean enableFlag = false;
+
+        @ApiModelProperty("操作人")
+        private Long operator;
+    }
+
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class SmallSubject {
+
+        @ApiModelProperty("声部ID")
+        private Integer id;
+
+        @ApiModelProperty("声部名称")
+        private String name;
+    }
+
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class SmallMusicSheet {
+
+        @ApiModelProperty("id")
+        private Long id;
+
+        @ApiModelProperty("声部ID")
+        private String musicSubject;
+
+        @ApiModelProperty("内容平台声部ID")
+        private String cbsSubjectId;
+    }
+
+    @Data
+    @ApiModel("声部启用")
+    public static class SubjectEnable {
+
+        @ApiModelProperty("声部ID")
+        @NotNull(message = "声部ID不能为空")
+        private Long id;
+
+        @ApiModelProperty("启用标识")
+        @NotNull(message = "启用标识不能为空")
+        private Boolean enableFlag;
+    }
+
+
+    @Data
+    public static class AddSubject {
+
+        @ApiModelProperty("内容平台声部")
+        private List<AddSubjectInstrument> subjects;
+
+        @ApiModelProperty("操作人")
+        private Long operator;
+    }
+
+    @Data
+    public static class AddSubjectInstrument {
+
+        @ApiModelProperty("内容平台声部ID")
+        @NotNull(message = "内容平台声部ID不能为空")
+        private Long cbsSubjectId;
+
+        @ApiModelProperty("乐器ID")
+        private List<Long> instrumentIds;
+    }
+
+    @Data
+    public static class CbsSubject{
+        @ApiModelProperty("声部ID")
+        private Long id;
+
+        @ApiModelProperty("名称")
+        private String name;
+
+        @ApiModelProperty("编码")
+        private String code;
+
+        @ApiModelProperty("是否启用")
+        private Boolean enableFlag;
+
+        @ApiModelProperty("乐器列表")
+        private List<Instrument> instruments;
+    }
+
+
+    @Data
+    @ApiModel(" Instrument-乐器设置")
+    public static class Instrument {
+
+        @ApiModelProperty("乐器ID")
+        private Integer id;
+
+        @ApiModelProperty("乐器名称")
+        private String name;
+
+        @ApiModelProperty("是否已被添加过")
+        private Boolean added = false;
+    }
+
+    @Data
+    @ApiModel(" SubjectList-声部表")
+    public static class CbsSubjectQuery extends CbsSubjectWrapper.SubjectQuery {
+
+        @ApiModelProperty("当前声部ID")
+        private Long subjectId;
+
+        @ApiModelProperty("是否移除被使用过的声部")
+        private Boolean removeUsed = false;
+    }
+}