zouxuan 1 سال پیش
والد
کامیت
c424f8bc81

+ 105 - 0
mec-application/src/main/java/com/ym/mec/web/controller/open/OpenSysMusicScoreController.java

@@ -0,0 +1,105 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.biz.dal.dto.MusicScoreDto;
+import com.ym.mec.biz.dal.entity.SysMusicScore;
+import com.ym.mec.biz.dal.entity.SysMusicScoreCategories;
+import com.ym.mec.biz.dal.enums.ClientTypeEnum;
+import com.ym.mec.biz.dal.page.SysExamSongQueryInfo;
+import com.ym.mec.biz.service.SysMusicScoreService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RequestMapping("${app-config.url.web:}/sysMusicScore")
+@Api(tags = "曲库")
+@RestController
+public class SysMusicScoreController extends BaseController {
+
+    @Autowired
+    private SysMusicScoreService sysMusicScoreService;
+
+    @ApiOperation(value = "修改")
+    @PostMapping("/update")
+    @PreAuthorize("@pcs.hasPermissions('sysMusicScore/update')")
+    public Object update(@RequestBody MusicScoreDto musicScoreDto) {
+        sysMusicScoreService.updateMusicScore(musicScoreDto);
+        return succeed();
+    }
+
+    @ApiOperation(value = "修改样式")
+    @PostMapping("/updateExtStyleConfigJson")
+    @PreAuthorize("@pcs.hasPermissions('sysMusicScore/updateExtStyleConfigJson')")
+    public Object updateExtStyleConfigJson(Integer sysMusicScoreId,String extStyleConfigJson) {
+        sysMusicScoreService.updateExtStyleConfigJson(sysMusicScoreId, extStyleConfigJson);
+        return succeed();
+    }
+
+    @ApiOperation(value = "启用/停用")
+    @PostMapping("/show")
+    @PreAuthorize("@pcs.hasPermissions('sysMusicScore/show')")
+    public Object update(Integer sysMusicScoreId,Integer showFlag) {
+        SysMusicScore sysMusicScore = sysMusicScoreService.get(sysMusicScoreId);
+        if(sysMusicScore == null){
+            throw new BizException("曲目信息不存在");
+        }
+        sysMusicScore.setShowFlag(showFlag);
+        sysMusicScoreService.update(sysMusicScore);
+        return succeed();
+    }
+
+    @ApiOperation(value = "新增")
+    @PostMapping("/add")
+    @PreAuthorize("@pcs.hasPermissions('sysMusicScore/add')")
+    public Object add(@RequestBody MusicScoreDto musicScoreDto) {
+        sysMusicScoreService.add(musicScoreDto);
+        return succeed();
+    }
+
+    @ApiOperation(value = "删除")
+    @PostMapping("/del")
+    @PreAuthorize("@pcs.hasPermissions('sysMusicScore/del')")
+    public Object del(Integer id) {
+        sysMusicScoreService.del(id);
+        return succeed();
+    }
+
+    @ApiOperation(value = "分页查询")
+    @GetMapping("/queryPage")
+    @PreAuthorize("@pcs.hasPermissions('sysMusicScore/queryPage')")
+    public Object queryPage(SysExamSongQueryInfo queryInfo) {
+        return succeed(sysMusicScoreService.queryMusicScorePage(queryInfo));
+    }
+
+    @ApiOperation(value = "分页查询")
+    @GetMapping("/queryPage2")
+    public Object queryPage2(SysExamSongQueryInfo queryInfo) {
+        queryInfo.setType("COMMON");
+        queryInfo.setShowFlag(1);
+        queryInfo.setClientType(ClientTypeEnum.SMART_PRACTICE);
+        return succeed(sysMusicScoreService.queryMusicScorePageInfo(queryInfo));
+    }
+    
+    private void getAllCategoryIdList(List<Integer> categoryIdList, List<SysMusicScoreCategories> sysMusicScoreCategoriesList){
+    	
+    	if(sysMusicScoreCategoriesList != null && sysMusicScoreCategoriesList.size() > 0){
+    		for(SysMusicScoreCategories sysMusicScoreCategories : sysMusicScoreCategoriesList){
+    			categoryIdList.add(sysMusicScoreCategories.getId());
+    			getAllCategoryIdList(categoryIdList, sysMusicScoreCategories.getSysMusicScoreCategoriesList());
+    		}
+    	}
+    }
+
+    @ApiOperation(value = "转码")
+    @PostMapping("/transcod")
+    @PreAuthorize("@pcs.hasPermissions('sysMusicScore/transcod')")
+    public Object transcod(Integer sysMusicScoreId) {
+        sysMusicScoreService.transcod(sysMusicScoreId);
+        return succeed();
+    }
+}

+ 221 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/MusicSheetWrapper.java

@@ -0,0 +1,221 @@
+package com.dayaedu.cbs.domain.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.dayaedu.cbs.common.enums.school.EMusicSheetType;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+import java.util.Optional;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 曲谱表
+ * 2023-12-29 00:05:53
+ */
+@ApiModel(value = "MusicSheetWrapper对象", description = "曲谱表查询对象")
+public class MusicSheetWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" MusicSheetQuery-曲谱表")
+    public static class MusicSheetQuery implements QueryInfo {
+
+    	@ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static MusicSheetQuery from(String json) {
+            return JSON.parseObject(json, MusicSheetQuery.class);
+        }
+    }
+
+	@ApiModel(" MusicSheet-曲谱表")
+    public static class MusicSheet {
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static MusicSheet from(String json) {
+            return JSON.parseObject(json, MusicSheet.class);
+        }
+	}
+
+    @Data
+    @ApiModel(" AddMusicSheet-曲谱新增/修改表")
+    public class AddMusicSheet {
+
+
+        @ApiModelProperty("主键")
+        private Long id;
+
+        @ApiModelProperty("曲谱分类ID")
+        private Long musicCategoryId;
+
+        @ApiModelProperty("曲谱封面图")
+        @NotBlank(message = "曲谱封面图不能为空")
+        private String musicCover;
+
+        @ApiModelProperty("曲谱名称")
+        @NotBlank(message = "曲谱名称不能为空")
+        private String name;
+
+        @ApiModelProperty("描述")
+        private String remark;
+
+        @ApiModelProperty("曲谱乐器(多个,用逗号分隔)")
+        private String musicalInstrumentIds;
+
+        @ApiModelProperty("作曲人")
+        @NotBlank(message = "音乐人不能为空")
+        private String composer;
+
+        @ApiModelProperty("曲谱类型(SINGLE:单曲 CONCERT:合奏)")
+        @NotNull(message = "曲谱类型不能为空")
+        private EMusicSheetType musicSheetType;
+
+        @ApiModelProperty("是否使用系统节拍器(0:否;1:是)")
+        private Boolean isUseSystemBeat;
+
+        @ApiModelProperty("是否可评测(0:否;1:是)")
+        private Boolean isEvaluated;
+
+        @ApiModelProperty("是否可转谱(0:否; 1:是)")
+        private Boolean isConvertibleScore;
+
+        @ApiModelProperty("是否展示指法(0:否;1:是)")
+        private Boolean isShowFingering;
+
+        @ApiModelProperty("是否播入节拍器(0: 否 1:是)")
+        private Boolean isPlayBeat;
+
+        @ApiModelProperty("多声轨选择")
+        private String multiTracksSelection;
+
+        @ApiModelProperty("播放速度")
+        private Integer playSpeed;
+
+        @ApiModelProperty("播放模式(MIDI;MP3)")
+        private String playMode;
+
+        @ApiModelProperty("XML文件")
+        private String xmlFileUrl;
+
+        @ApiModelProperty("MIDI文件(保留字段)")
+        private String midiFileUrl;
+
+        @ApiModelProperty("曲谱JSON")
+        private String musicJson;
+
+        @ApiModelProperty("曲谱缓存JSON(后续使用)")
+        private String musicSvgJson;
+
+        @ApiModelProperty("曲谱缓存")
+        private String musicSvg;
+
+        @ApiModelProperty("简谱缓存")
+        private String musicJianSvg;
+
+        @ApiModelProperty("首调缓存")
+        private String musicFirstSvg;
+
+        @ApiModelProperty("谱面图片JSON(后续使用)")
+        private String musicImgJson;
+
+        @ApiModelProperty("五线谱图片")
+        private String musicImg;
+
+        @ApiModelProperty("首调图片")
+        private String musicFirstImg;
+
+        @ApiModelProperty("固定调图片")
+        private String musicJianImg;
+
+        @ApiModelProperty("谱面参数设置")
+        private String extConfigJson;
+
+        @ApiModelProperty("谱面样式参数设置")
+        private String extStyleConfigJson;
+
+        @ApiModelProperty("可用类型(PLATFORM: 平台; ORG: 机构; PERSON: 个人)")
+        private String availableType;
+
+        @ApiModelProperty("来源类型(PLATFORM: 平台; ORG: 机构; PERSON: 个人)")
+        private String sourceType;
+
+        @ApiModelProperty("音频类型(HOMEMODE: 自制 COMMON: 普通)")
+        private String audioType;
+
+        @ApiModelProperty("曲目状态(0:停用,1:启用)")
+        private Boolean status;
+
+        @ApiModelProperty("停用原因")
+        private String reason;
+
+
+        @ApiModelProperty("更新人")
+        private Long updateBy;
+
+        @ApiModelProperty("更新时间")
+        private Date updateTime;
+
+        @ApiModelProperty("创建人")
+        private Long createBy;
+
+        @ApiModelProperty("创建时间")
+        private Date createTime;
+
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" MusicSheet-管乐迷曲谱表")
+    public static class MecMusicSheet extends MusicSheet {
+
+        @ApiModelProperty("曲目分类")
+        private String categoriesName;
+
+        @ApiModelProperty("可见会员等级,用于判断是否收费")
+        private String rankIds;
+
+        @ApiModelProperty("排序值")
+        private Integer order;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static MusicSheet from(String json) {
+            return JSON.parseObject(json, MusicSheet.class);
+        }
+    }
+}

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

@@ -4426,8 +4426,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         Map<String, Object> params = new HashMap<>(16);
 		if (StringUtils.isNotEmpty(queryInfo.getMonth())) {
 			Date month = DateUtil.stringToDate(queryInfo.getMonth(), DateUtil.ISO_YEAR_MONTH_FORMAT);
-			params.put("startTime", DateUtil.getFirstDayOfMonth(month));
-			params.put("endTime", DateUtil.getLastDayOfMonth(month));
+			params.put("startTime", DateUtil.dateToString(DateUtil.getFirstDayOfMonth(month),DateUtil.ISO_EXPANDED_DATE_FORMAT));
+			params.put("endTime", DateUtil.dateToString(DateUtil.getLastDayOfMonth(month),DateUtil.ISO_EXPANDED_DATE_FORMAT));
 		}
 		if(StringUtils.isNotEmpty(queryInfo.getOrganIds())){
 			List<Integer> collect = Arrays.stream(queryInfo.getOrganIds().split(",")).map(Integer::parseInt).collect(Collectors.toList());

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

@@ -410,6 +410,9 @@ public class ExportServiceImpl implements ExportService {
 
     private HttpResponseResult exportCourseIncome(Map<String, Object> info){
         ExportCourseScheduleQueryInfo queryInfo = JSONObject.parseObject(JSONObject.toJSONString(info), ExportCourseScheduleQueryInfo.class);
+        if (StringUtils.isEmpty(queryInfo.getMonth())) {
+            throw new BizException("请选择导出时间");
+        }
         SysUser sysUser = sysUserService.getUser();
         String organId = organizationService.getEmployeeOrgan(sysUser.getId(),queryInfo.getOrganIds(),sysUser.getIsSuperAdmin());
         queryInfo.setOrganIds(organId);

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/open/SysMusicScoreOpenService.java

@@ -0,0 +1,32 @@
+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;
+import com.ym.mec.biz.dal.page.SysExamSongQueryInfo;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.BaseService;
+
+public interface SysMusicScoreService extends BaseService<Integer, SysMusicScore> {
+
+    void updateMusicScore(MusicScoreDto musicScoreDto);
+
+    void add(MusicScoreDto musicScoreDto);
+
+    void del(Integer id);
+
+    List<SysMusicScore> queryMusicScoreAll(SysExamSongQueryInfo queryInfo);
+
+    PageInfo<SysMusicScore> queryMusicScorePage(SysExamSongQueryInfo queryInfo);
+    
+    PageInfo<SysMusicScore> queryMusicScorePageInfo(SysExamSongQueryInfo queryInfo);
+
+    void transcod(Integer sysMusicScoreId);
+
+    int updateExtStyleConfigJson(Integer id, String extStyleConfigJson);
+
+    Map<Long, SysMusicScore> getMapByIds(List<Long> musicSheetIds);
+}

+ 458 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/open/impl/SysMusicScoreOpenServiceImpl.java

@@ -0,0 +1,458 @@
+package com.ym.mec.biz.service.impl;
+
+
+import static com.ym.mec.biz.dal.enums.ClientTypeEnum.SMART_PRACTICE;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+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;
+import com.ym.mec.biz.dal.entity.SysMusicScoreChangeLog;
+import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.biz.service.UploadFileService;
+import com.ym.mec.common.entity.UploadReturnBean;
+import com.ym.mec.common.service.IdGeneratorService;
+import com.ym.mec.util.file.FileUtil;
+import com.ym.mec.util.shell.ScriptUtil;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.MusicScoreDto;
+import com.ym.mec.biz.dal.entity.SysMusicScore;
+import com.ym.mec.biz.dal.entity.SysMusicScoreAccompaniment;
+import com.ym.mec.biz.dal.entity.SysMusicScoreCategories;
+import com.ym.mec.biz.dal.page.SysExamSongQueryInfo;
+import com.ym.mec.biz.service.SysMusicScoreCategoriesService;
+import com.ym.mec.biz.service.SysMusicScoreService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.util.collection.MapUtil;
+
+@Service
+public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicScore> implements SysMusicScoreService {
+
+    @Autowired
+    private SysMusicScoreDao sysMusicScoreDao;
+    @Autowired
+    private SysMusicScoreAccompanimentDao sysMusicScoreAccompanimentDao;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private SysMusicScoreCategoriesDao sysMusicScoreCategoriesDao;
+    @Autowired
+    private SubjectDao subjectDao;
+    @Autowired
+    private SysMusicScoreCategoriesService sysMusicScoreCategoriesService;
+    @Autowired
+    private SysMusicScoreChangeLogDao sysMusicScoreChangeLogDao;
+    @Autowired
+    private IdGeneratorService idGeneratorService;
+    @Autowired
+    private UploadFileService uploadFileService;
+    @Autowired
+    private OrganizationService organizationService;
+
+    @Override
+    public BaseDAO<Integer, SysMusicScore> getDAO() {
+        return sysMusicScoreDao;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateMusicScore(MusicScoreDto musicScoreDto) {
+        SysMusicScore sysMusicScore = musicScoreDto.getSysMusicScore();
+        sysMusicScoreDao.update(sysMusicScore);
+        List<Integer> delExamSongAccompanimentIds = musicScoreDto.getDelExamSongAccompanimentIds();
+        if (delExamSongAccompanimentIds != null && delExamSongAccompanimentIds.size() > 0) {
+            sysMusicScoreAccompanimentDao.batchDel(delExamSongAccompanimentIds);
+        }
+        List<SysMusicScoreAccompaniment> sysMusicScoreAccompaniments = musicScoreDto.getSysMusicScoreAccompaniments();
+        if (sysMusicScoreAccompaniments != null && sysMusicScoreAccompaniments.size() > 0) {
+            List<Integer> subjectIdList = sysMusicScoreAccompaniments.stream().map(e -> e.getSubjectId()).collect(Collectors.toList());
+            subjectIdList.removeAll(Collections.singleton(null));
+
+            if (subjectIdList.size() > 0) {
+                List<Integer> idList = sysMusicScoreAccompaniments.stream().map(e -> e.getId()).collect(Collectors.toList());
+                List<Integer> subjectIds = sysMusicScoreAccompanimentDao.findSubjectByMusicScoreId(sysMusicScore.getId(), idList);
+                int subjectSize = subjectIds.size() + subjectIdList.size();
+                subjectIdList.addAll(subjectIds);
+                int size = new HashSet<>(subjectIdList).size();
+                if (size < subjectSize && !musicScoreDto.getMultitrack()) {
+                    throw new BizException("操作失败:请勿提交重复的伴奏声部");
+                }
+            }
+            //获取需要修改的伴奏
+            List<SysMusicScoreAccompaniment> updateCollect = sysMusicScoreAccompaniments.stream().filter(e -> e.getId() != null).collect(Collectors.toList());
+            if (updateCollect.size() > 0) {
+                sysMusicScoreAccompanimentDao.batchUpdate(updateCollect, sysMusicScore.getIsOpenMetronome());
+            }
+            //获取需要新增的伴奏
+            List<SysMusicScoreAccompaniment> addCollect = sysMusicScoreAccompaniments.stream().filter(e -> e.getId() == null).collect(Collectors.toList());
+            if (addCollect.size() > 0) {
+                sysMusicScoreAccompanimentDao.batchInsert(addCollect, sysMusicScore.getId(), sysMusicScore.getIsOpenMetronome());
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void add(MusicScoreDto musicScoreDto) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("请登录");
+        }
+        SysMusicScore sysMusicScore = musicScoreDto.getSysMusicScore();
+        sysMusicScore.setCreateUserId(sysUser.getId());
+        sysMusicScoreDao.insert(sysMusicScore);
+        List<SysMusicScoreAccompaniment> sysMusicScoreAccompaniments = musicScoreDto.getSysMusicScoreAccompaniments();
+        if (sysMusicScoreAccompaniments != null && sysMusicScoreAccompaniments.size() > 0) {
+            sysMusicScoreAccompaniments.forEach(e -> {
+                e.setIsOpenMetronome(sysMusicScore.getIsOpenMetronome());
+            });
+            sysMusicScoreAccompanimentDao.batchInsert(sysMusicScoreAccompaniments, sysMusicScore.getId(), sysMusicScore.getIsOpenMetronome());
+        }
+        Integer categoriesId = sysMusicScore.getMusicScoreCategoriesId();
+        if (categoriesId != null && sysMusicScore.getClientType() == SMART_PRACTICE) {
+            while (true) {
+                SysMusicScoreCategories categories = sysMusicScoreCategoriesDao.get(categoriesId);
+                if (categories.getParentId() == 0) {
+                    categories.setMusicScoreNum(categories.getMusicScoreNum() + 1);
+                    sysMusicScoreCategoriesDao.update(categories);
+                    return;
+                }
+                categoriesId = categories.getParentId();
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void del(Integer id) {
+        SysMusicScore sysMusicScore = sysMusicScoreDao.get(id);
+        if (sysMusicScore == null) {
+            throw new BizException("曲目不存在");
+        }
+        sysMusicScoreDao.delete(id);
+        sysMusicScoreAccompanimentDao.deleteBySongId(id);
+        Integer categoriesId = sysMusicScore.getMusicScoreCategoriesId();
+        if (categoriesId != null && sysMusicScore.getClientType() == SMART_PRACTICE) {
+            while (true) {
+                SysMusicScoreCategories categories = sysMusicScoreCategoriesDao.get(categoriesId);
+                if (categories.getParentId() == 0) {
+                    Integer musicScoreNum = categories.getMusicScoreNum() - 1;
+                    if (musicScoreNum < 0) {
+                        musicScoreNum = 0;
+                    }
+                    categories.setMusicScoreNum(musicScoreNum);
+                    sysMusicScoreCategoriesDao.update(categories);
+                    return;
+                }
+                categoriesId = categories.getParentId();
+            }
+        }
+    }
+
+    private String getParentTreeName(Integer categoriesId) {
+        StringBuffer sb = new StringBuffer();
+        while (true) {
+            SysMusicScoreCategories categories = sysMusicScoreCategoriesDao.get(categoriesId);
+            if (sb.length() == 0) {
+                sb.append(categories.getName());
+            } else {
+                sb.insert(0, "/");
+                sb.insert(0, categories.getName());
+            }
+            if (categories.getParentId() == 0) {
+                return sb.toString();
+            }
+            categoriesId = categories.getParentId();
+        }
+    }
+
+    private void dealMusicScoreParam(SysExamSongQueryInfo queryInfo){
+        queryInfo.setOrganId(organizationService.getEmployeeOrgan(queryInfo.getOrganId()));
+        if(queryInfo.getCategoriesId() != null){
+            List<Integer> categoriesIdList = new ArrayList<>();
+            Integer categoriesId = Integer.parseInt(queryInfo.getCategoriesId());
+
+            SysMusicScoreCategories sysMusicScoreCategories = sysMusicScoreCategoriesService.get(categoriesId);
+
+            if(sysMusicScoreCategories == null){
+                throw new BizException("分类找不到");
+            }
+            categoriesIdList.add(categoriesId);
+            sysMusicScoreCategories = sysMusicScoreCategoriesService.getChildTree(sysMusicScoreCategories);
+            getAllCategoryIdList(categoriesIdList, sysMusicScoreCategories.getSysMusicScoreCategoriesList());
+
+            queryInfo.setCategoriesIdList(categoriesIdList);
+        }
+    }
+
+    private void dealMusicScoreData(List<SysMusicScore> rows){
+        if (rows != null && rows.size() > 0) {
+            Set<Integer> categoriesIds = rows.stream().map(e -> e.getMusicScoreCategoriesId()).collect(Collectors.toSet());
+            //获取分部列表
+            Map<Integer, String> organMap = MapUtil.convertMybatisMap(sysMusicScoreCategoriesDao.queryOrganByIds(categoriesIds));
+            //获取声部列表
+            Set<Integer> subjectIds = rows.stream().map(e -> e.getSubjectId()).collect(Collectors.toSet());
+            subjectIds.removeAll(Collections.singleton(null));
+            Map<Long, String> subjectMap = new HashMap();
+            if (subjectIds.size() > 0) {
+                String ids = StringUtils.join(subjectIds, ",");
+                subjectMap = MapUtil.convertMybatisMap(subjectDao.findBySubjecIds(ids));
+            }
+            Map<Integer, String> map = new HashMap<>(categoriesIds.size());
+            for (Integer categoriesId : categoriesIds) {
+                if(null != categoriesId){
+                    map.put(categoriesId, getParentTreeName(categoriesId));
+                }
+            }
+            for (SysMusicScore row : rows) {
+                row.setCategoriesName(map.get(row.getMusicScoreCategoriesId()));
+                row.setOrganName(organMap.get(row.getMusicScoreCategoriesId()));
+                row.setSubjectName(subjectMap.get(row.getSubjectId()));
+            }
+        }
+    }
+
+    @Override
+    public List<SysMusicScore> queryMusicScoreAll(SysExamSongQueryInfo queryInfo) {
+        //封装查询参数
+        dealMusicScoreParam(queryInfo);
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<SysMusicScore> rows = findAll(params);
+        //处理查询结果
+        dealMusicScoreData(rows);
+        return rows;
+    }
+
+    @Override
+    public PageInfo<SysMusicScore> queryMusicScorePage(SysExamSongQueryInfo queryInfo) {
+        //封装查询参数
+        dealMusicScoreParam(queryInfo);
+
+        PageInfo<SysMusicScore> sysMusicScorePageInfo = queryPage(queryInfo);
+        List<SysMusicScore> rows = sysMusicScorePageInfo.getRows();
+        //处理查询结果
+        dealMusicScoreData(rows);
+        return sysMusicScorePageInfo;
+    }
+
+    @Override
+    public PageInfo<SysMusicScore> queryMusicScorePageInfo(SysExamSongQueryInfo queryInfo) {
+        if (queryInfo.getCategoriesId() != null) {
+            List<Integer> categoriesIdList = new ArrayList<>();
+            Integer categoriesId = null;
+            if (StringUtils.isNotEmpty(queryInfo.getCategoriesId())) {
+                categoriesId = Integer.parseInt(queryInfo.getCategoriesId());
+            }
+            //List<SysMusicScoreCategories> scoreCategories = sysMusicScoreCategoriesService.queryTree(musicScoreQueryInfo);
+
+            SysMusicScoreCategories sysMusicScoreCategories = sysMusicScoreCategoriesService.get(categoriesId);
+
+            if (sysMusicScoreCategories == null) {
+                throw new BizException("分类找不到");
+            }
+            categoriesIdList.add(categoriesId);
+            sysMusicScoreCategories = sysMusicScoreCategoriesService.getChildTree(sysMusicScoreCategories);
+            getAllCategoryIdList(categoriesIdList, sysMusicScoreCategories.getSysMusicScoreCategoriesList());
+
+            queryInfo.setCategoriesIdList(categoriesIdList);
+        }
+        return this.queryPage(queryInfo);
+    }
+
+    @Override
+    public void transcod(Integer sysMusicScoreId) {
+        SysMusicScoreTranscod obj = sysMusicScoreDao.getTranscod(sysMusicScoreId);
+        if (obj == null) {
+            throw new BizException("曲目信息不存在");
+        }
+        List<SysMusicScoreMetronomeTranscod> metronomeTranscod = sysMusicScoreDao.getMetronomeTranscod(sysMusicScoreId);
+        obj.setAccompanimentList(metronomeTranscod);
+        //
+        String old = JSONObject.toJSONString(obj);
+        boolean flag = false;
+        String url = doTranscod(obj.getUrl());
+        if (StringUtils.isNotEmpty(url)) {
+            obj.setUrl(url);
+            flag = true;
+        }
+        String metronomeUrl = doTranscod(obj.getMetronomeUrl());
+        if (StringUtils.isNotEmpty(metronomeUrl)) {
+            obj.setMetronomeUrl(metronomeUrl);
+            flag = true;
+        }
+        if (flag) {
+            //更新obj
+            SysMusicScore sysMusicScore = new SysMusicScore();
+            sysMusicScore.setId(obj.getId());
+            sysMusicScore.setUrl(obj.getUrl());
+            sysMusicScore.setMetronomeUrl(obj.getMetronomeUrl());
+            sysMusicScoreDao.update(sysMusicScore);
+        }
+
+        for (SysMusicScoreMetronomeTranscod o : metronomeTranscod) {
+            Boolean subFlag = false;
+            String mp3Url = doTranscod(o.getMp3Url());
+            if (StringUtils.isNotEmpty(mp3Url)) {
+                o.setMp3Url(mp3Url);
+                flag = true;
+                subFlag = true;
+            }
+            String metronomeMp3Url = doTranscod(o.getMetronomeMp3Url());
+            if (StringUtils.isNotEmpty(metronomeMp3Url)) {
+                o.setMetronomeMp3Url(metronomeMp3Url);
+                flag = true;
+                subFlag = true;
+            }
+            if (subFlag) {
+                SysMusicScoreAccompaniment accompaniment = new SysMusicScoreAccompaniment();
+                accompaniment.setExamSongId(o.getId());
+                accompaniment.setMp3Url(o.getMp3Url());
+                accompaniment.setMetronomeMp3Url(o.getMetronomeMp3Url());
+                sysMusicScoreDao.updateAccompanimentBySongId(accompaniment);
+            }
+        }
+        if (!flag) {
+            return;
+        }
+        obj.setAccompanimentList(metronomeTranscod);
+        String now = JSONObject.toJSONString(obj);
+
+        //记录日志
+        SysMusicScoreChangeLog log = new SysMusicScoreChangeLog();
+        log.setSysMusicScoreId(obj.getId());
+        log.setChangeBefore(old);
+        log.setChangeAfter(now);
+        sysMusicScoreChangeLogDao.insert(log);
+    }
+
+    @Override
+	public int updateExtStyleConfigJson(Integer id, String extStyleConfigJson) {
+		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
+     * @return
+     */
+    private String doTranscod(String fileUrl) {
+        String transcodUrl = "";
+        if (StringUtils.isEmpty(fileUrl)) {
+            return transcodUrl;
+        }
+        //文件扩展名
+        String expand = FileUtil.getFileExpandByPath(fileUrl);
+        //将远程文件写入本地临时文件路径
+        String tempFileName = getTempFileName(expand);
+        File tempFile = new File(tempFileName);
+        //转码后文件路径
+        String tempTranscodFileName = getTempFileName(expand);
+        try {
+            URL url = new URL(fileUrl);
+            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+            //设置超时间为3秒
+            conn.setConnectTimeout(3 * 1000);
+            //防止屏蔽程序抓取而返回403错误
+            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
+
+            FileUtil.inputStreamToFile(conn.getInputStream(), tempFile);
+
+            String script = "ffmpeg -i " + tempFileName + " -vn -c:a libmp3lame -b:a 320k -ac 2 " + tempTranscodFileName;
+            int i = ScriptUtil.callScript(script);
+            if (i == 0) {
+                //转码成功
+                FileInputStream inputStream = new FileInputStream(tempTranscodFileName);
+                UploadReturnBean uploadReturnBean = uploadFileService.uploadFile(inputStream, expand);
+                transcodUrl = uploadReturnBean.getUrl();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            //删除服务器中的文件
+            if (tempFile.exists()) {
+                tempFile.delete();
+            }
+            File tempTranscodFile = new File(tempTranscodFileName);
+            if (tempTranscodFile.exists()) {
+                tempTranscodFile.delete();
+            }
+        }
+        return transcodUrl;
+    }
+
+    /**
+     * 通过网络文件路径获取临时文件路径
+     *
+     * @param fileUrl
+     * @return
+     */
+    String tempPath = "/usr/temp";
+
+    private String getTempFileName(String expand) {
+        //没有目录则创建
+        File file = new File(tempPath);
+        if (!file.exists()) {
+            file.mkdirs();
+        }
+        //.mp3
+        String fileName = tempPath + File.separator + idGeneratorService.generatorId("tempFile");
+        if (StringUtils.isNotEmpty(expand)) {
+            fileName += "." + expand;
+        }
+        return fileName;
+    }
+
+    private void getAllCategoryIdList(List<Integer> categoryIdList, List<SysMusicScoreCategories> sysMusicScoreCategoriesList) {
+
+        if (sysMusicScoreCategoriesList != null && sysMusicScoreCategoriesList.size() > 0) {
+            for (SysMusicScoreCategories sysMusicScoreCategories : sysMusicScoreCategoriesList) {
+                categoryIdList.add(sysMusicScoreCategories.getId());
+                getAllCategoryIdList(categoryIdList, sysMusicScoreCategories.getSysMusicScoreCategoriesList());
+            }
+        }
+
+    }
+
+}