|  | @@ -2,67 +2,51 @@ package com.ym.mec.biz.service.impl;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import com.alibaba.fastjson.JSONObject;
 | 
	
		
			
				|  |  | -import com.dayaedu.cbs.common.enums.music.EMusicAvailableType;
 | 
	
		
			
				|  |  | +import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
	
		
			
				|  |  | +import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
	
		
			
				|  |  |  import com.dayaedu.cbs.domain.wrapper.MusicSheetWrapper;
 | 
	
		
			
				|  |  |  import com.dayaedu.cbs.openfeign.client.MusicFeignClientService;
 | 
	
		
			
				|  |  |  import com.dayaedu.cbs.openfeign.wrapper.music.CbsMusicSheetApplicationExtendClientWrapper;
 | 
	
		
			
				|  |  |  import com.dayaedu.cbs.openfeign.wrapper.music.CbsMusicSheetWrapper;
 | 
	
		
			
				|  |  |  import com.microsvc.toolkit.common.response.template.R;
 | 
	
		
			
				|  |  | -import com.ym.mec.biz.dal.dao.SysMusicScoreAccompanimentDao;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.dao.SysMusicScoreCategoriesDao;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.dao.SysMusicScoreDao;
 | 
	
		
			
				|  |  | -import com.ym.mec.biz.dal.dto.MusicScoreDto;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.dto.ReasonDto;
 | 
	
		
			
				|  |  |  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.enums.YesOrNoEnum;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.page.SysExamSongQueryInfo;
 | 
	
		
			
				|  |  | -import com.ym.mec.biz.service.*;
 | 
	
		
			
				|  |  | +import com.ym.mec.biz.service.OrganizationService;
 | 
	
		
			
				|  |  | +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.entity.UploadReturnBean;
 | 
	
		
			
				|  |  |  import com.ym.mec.common.exception.BizException;
 | 
	
		
			
				|  |  |  import com.ym.mec.common.page.PageInfo;
 | 
	
		
			
				|  |  | -import com.ym.mec.common.service.IdGeneratorService;
 | 
	
		
			
				|  |  |  import com.ym.mec.common.service.impl.BaseServiceImpl;
 | 
	
		
			
				|  |  |  import com.ym.mec.util.collection.MapUtil;
 | 
	
		
			
				|  |  | -import com.ym.mec.util.file.FileUtil;
 | 
	
		
			
				|  |  | -import com.ym.mec.util.shell.ScriptUtil;
 | 
	
		
			
				|  |  |  import org.apache.commons.collections.CollectionUtils;
 | 
	
		
			
				|  |  |  import org.apache.commons.lang3.StringUtils;
 | 
	
		
			
				|  |  |  import org.springframework.beans.factory.annotation.Value;
 | 
	
		
			
				|  |  |  import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  | -import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import javax.annotation.Resource;
 | 
	
		
			
				|  |  | -import java.io.File;
 | 
	
		
			
				|  |  | -import java.io.FileInputStream;
 | 
	
		
			
				|  |  | -import java.net.HttpURLConnection;
 | 
	
		
			
				|  |  | -import java.net.URL;
 | 
	
		
			
				|  |  |  import java.util.*;
 | 
	
		
			
				|  |  | +import java.util.concurrent.LinkedBlockingQueue;
 | 
	
		
			
				|  |  | +import java.util.concurrent.ThreadPoolExecutor;
 | 
	
		
			
				|  |  | +import java.util.concurrent.TimeUnit;
 | 
	
		
			
				|  |  |  import java.util.function.Function;
 | 
	
		
			
				|  |  |  import java.util.stream.Collectors;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -import static com.ym.mec.biz.dal.enums.ClientTypeEnum.SMART_PRACTICE;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  @Service
 | 
	
		
			
				|  |  |  public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicScore> implements SysMusicScoreService {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Resource
 | 
	
		
			
				|  |  |      private SysMusicScoreDao sysMusicScoreDao;
 | 
	
		
			
				|  |  |      @Resource
 | 
	
		
			
				|  |  | -    private SysMusicScoreAccompanimentDao sysMusicScoreAccompanimentDao;
 | 
	
		
			
				|  |  | -    @Resource
 | 
	
		
			
				|  |  | -    private SysUserService sysUserService;
 | 
	
		
			
				|  |  | -    @Resource
 | 
	
		
			
				|  |  |      private SysMusicScoreCategoriesDao sysMusicScoreCategoriesDao;
 | 
	
		
			
				|  |  |      @Resource
 | 
	
		
			
				|  |  |      private SysMusicScoreCategoriesService sysMusicScoreCategoriesService;
 | 
	
		
			
				|  |  |      @Resource
 | 
	
		
			
				|  |  | -    private IdGeneratorService idGeneratorService;
 | 
	
		
			
				|  |  | -    @Resource
 | 
	
		
			
				|  |  | -    private UploadFileService uploadFileService;
 | 
	
		
			
				|  |  | -    @Resource
 | 
	
		
			
				|  |  |      private OrganizationService organizationService;
 | 
	
		
			
				|  |  |      @Resource
 | 
	
		
			
				|  |  |      private MusicFeignClientService musicFeignClientService;
 | 
	
	
		
			
				|  | @@ -80,64 +64,6 @@ public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicS
 | 
	
		
			
				|  |  |          return sysMusicScoreDao;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -    public void add(MusicScoreDto musicScoreDto) {
 | 
	
		
			
				|  |  | -        SysMusicScore sysMusicScore = musicScoreDto.getSysMusicScore();
 | 
	
		
			
				|  |  | -        sysMusicScore.setCreateUserId(sysUserService.getUserId());
 | 
	
		
			
				|  |  | -        sysMusicScoreDao.insert(sysMusicScore);
 | 
	
		
			
				|  |  | -        List<SysMusicScoreAccompaniment> sysMusicScoreAccompaniments = musicScoreDto.getSysMusicScoreAccompaniments();
 | 
	
		
			
				|  |  | -        if (CollectionUtils.isNotEmpty(sysMusicScoreAccompaniments)) {
 | 
	
		
			
				|  |  | -            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("曲目不存在");
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        Integer userId = sysUserService.getUserId();
 | 
	
		
			
				|  |  | -        if (!Objects.equals(sysMusicScore.getCreateUserId(), userId)) {
 | 
	
		
			
				|  |  | -            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) {
 | 
	
	
		
			
				|  | @@ -363,77 +289,50 @@ public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicS
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 进行转码
 | 
	
		
			
				|  |  | -     *
 | 
	
		
			
				|  |  | -     * @param fileUrl
 | 
	
		
			
				|  |  | -     * @return
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    private String doTranscod(String fileUrl) {
 | 
	
		
			
				|  |  | -        String transcodUrl = "";
 | 
	
		
			
				|  |  | -        if (StringUtils.isEmpty(fileUrl)) {
 | 
	
		
			
				|  |  | -            return transcodUrl;
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void sync() {
 | 
	
		
			
				|  |  | +        Date date = new Date();
 | 
	
		
			
				|  |  | +        // 100个线程的无界线程池
 | 
	
		
			
				|  |  | +        ThreadPoolExecutor executorService =  new ThreadPoolExecutor(50, 50,
 | 
	
		
			
				|  |  | +                0L, TimeUnit.MILLISECONDS,
 | 
	
		
			
				|  |  | +                new LinkedBlockingQueue<>());
 | 
	
		
			
				|  |  | +//        while (true) {
 | 
	
		
			
				|  |  | +        IPage<MusicSheet> page = baseMapper.selectSyncPage(new Page<>(1, -1));
 | 
	
		
			
				|  |  | +        List<MusicSheet> records = page.getRecords();
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isEmpty(records)) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        //文件扩展名
 | 
	
		
			
				|  |  | -        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();
 | 
	
		
			
				|  |  | +        for (MusicSheet record : records) {
 | 
	
		
			
				|  |  | +            if (record.getCbsMusicSheetId() != null && !DateUtil.format(record.getCreateTime(),"yyyy-MM-dd HH:mm:ss").equals("2024-06-25 00:00:00")) {
 | 
	
		
			
				|  |  | +                continue;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        return transcodUrl;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 通过网络文件路径获取临时文件路径
 | 
	
		
			
				|  |  | -     *
 | 
	
		
			
				|  |  | -     * @param fileUrl
 | 
	
		
			
				|  |  | -     * @return
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    String tempPath = "/usr/temp";
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    private String getTempFileName(String expand) {
 | 
	
		
			
				|  |  | -        //没有目录则创建
 | 
	
		
			
				|  |  | -        File file = new File(tempPath);
 | 
	
		
			
				|  |  | -        if (!file.exists()) {
 | 
	
		
			
				|  |  | -            file.mkdirs();
 | 
	
		
			
				|  |  | +            executorService.submit(() ->
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                        try {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                            syncMusicSheet(record, date);
 | 
	
		
			
				|  |  | +                        }catch (Exception e) {
 | 
	
		
			
				|  |  | +                            log.error("曲目同步异常,曲目ID:{}", record.getId(), e);
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +            );
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        //.mp3
 | 
	
		
			
				|  |  | -        String fileName = tempPath + File.separator + idGeneratorService.generatorId("tempFile");
 | 
	
		
			
				|  |  | -        if (StringUtils.isNotEmpty(expand)) {
 | 
	
		
			
				|  |  | -            fileName += "." + expand;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        curPage++;
 | 
	
		
			
				|  |  | +//        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        while (!executorService.getQueue().isEmpty()) {
 | 
	
		
			
				|  |  | +            try {
 | 
	
		
			
				|  |  | +                log.info("线程池中正在执行的任务数量:{},等待数量:{}", executorService.getActiveCount(),executorService.getQueue().size());
 | 
	
		
			
				|  |  | +                Thread.sleep(1000);
 | 
	
		
			
				|  |  | +            } catch (InterruptedException e) {
 | 
	
		
			
				|  |  | +                log.error("线程等待异常", e);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        return fileName;
 | 
	
		
			
				|  |  | +        log.info("-------------------- 曲目数据同步成功! -------------------------------");
 | 
	
		
			
				|  |  | +        executorService.shutdown();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private void getAllCategoryIdList(List<Integer> categoryIdList, List<SysMusicScoreCategories> sysMusicScoreCategoriesList) {
 |