package com.fdkankan.fusion.service.impl; import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.fdkankan.fusion.common.ResultCode; import com.fdkankan.fusion.common.FilePath; import com.fdkankan.fusion.common.util.RedisKeyUtil; import com.fdkankan.fusion.common.util.UploadToOssUtil; import com.fdkankan.fusion.common.util.VideoUtil; import com.fdkankan.fusion.entity.CaseEntity; import com.fdkankan.fusion.entity.CaseVideoFolder; import com.fdkankan.fusion.exception.BusinessException; import com.fdkankan.fusion.entity.CaseVideo; import com.fdkankan.fusion.mapper.ICaseVideoMapper; import com.fdkankan.fusion.service.ICaseService; import com.fdkankan.fusion.service.ICaseVideoFolderService; import com.fdkankan.fusion.service.ICaseVideoService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fdkankan.redis.util.RedisUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; /** *

* 服务实现类 *

* * @author * @since 2022-07-29 */ @Service public class CaseVideoServiceImpl extends ServiceImpl implements ICaseVideoService { @Autowired UploadToOssUtil uploadToOssUtil; @Autowired ICaseVideoFolderService videoFolderService; @Autowired ICaseService caseService; @Autowired UploadService uploadService; @Value("${upload.query-path}") private String queryPath; @Autowired RedisUtil redisUtil; @Override public List getAllList(Integer folderId) { if(folderId == null){ throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS); } QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(CaseVideo::getFolderId,folderId); wrapper.lambda().orderByAsc(CaseVideo::getSort); wrapper.lambda().orderByAsc(CaseVideo::getCreateTime); return this.list(wrapper); } @Override public CaseVideoFolder uploadAddVideo(MultipartFile[] files, Integer folderId,Integer caseId) throws IOException { if(files.length <=0 || caseId == null){ throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS); } CaseEntity caseEntity = caseService.getById(caseId); if(caseEntity == null){ throw new BusinessException(ResultCode.CASE_NOT_EXIST); } CaseVideoFolder videoFolder = videoFolderService.getByIdIfNotNew(folderId,caseId); if(videoFolder == null){ throw new BusinessException(ResultCode.FOLDER_NOT_EXIST); } uploadService.deleteOssUrl(videoFolder.getVideoMergeUrl()); uploadService.deleteOssUrl(videoFolder.getVideoFolderCover()); this.deleteByFolderId(folderId); redisUtil.set(RedisKeyUtil.mergerVideoKey+videoFolder.getVideoFolderId(),"10"); runThread(files,videoFolder,this); return videoFolder; } private void runThread(MultipartFile[] files,CaseVideoFolder videoFolder,ICaseVideoService caseVideoService){ new Runnable() { @Override public void run() { //替换文件夹中文件 List videoList = new ArrayList<>(); Integer sort = 1; LinkedHashSet filePathSet = new LinkedHashSet<>(); for (MultipartFile file : files) { String ossPath = uploadService.uploadFile(file, true, String.format(FilePath.VIDEO_OSS_PATH,videoFolder.getVideoFolderId())+"/",filePathSet); String suffixName = ossPath.substring(ossPath.lastIndexOf(".")); CaseVideo caseVideo = new CaseVideo(); caseVideo.setFolderId(videoFolder.getVideoFolderId()); caseVideo.setVideoPath(ossPath); caseVideo.setVideoName(file.getName()); caseVideo.setVideoCover(ossPath.replace(suffixName,".jpg")); caseVideo.setSort(sort); videoList.add(caseVideo); sort ++; } caseVideoService.saveBatch(videoList); if(videoList.size() <=0){ return; } if(videoList.size() ==1){ updateCaseVideoStatus(videoFolder.getVideoFolderId(),1); videoFolder.setVideoMergeUrl(videoList.get(0).getVideoPath()); videoFolder.setVideoFolderCover(videoList.get(0).getVideoCover()); videoFolderService.updateById(videoFolder); redisUtil.set(RedisKeyUtil.mergerVideoKey+videoFolder.getVideoFolderId(),"100"); return; } redisUtil.set(RedisKeyUtil.mergerVideoKey+videoFolder.getVideoFolderId(),"20"); String mergeLocalName = VideoUtil.mergeVideo(filePathSet, FilePath.VIDEO_LOCAL_PATH); redisUtil.set(RedisKeyUtil.mergerVideoKey+videoFolder.getVideoFolderId(),"30"); if(mergeLocalName == null){ updateCaseVideoStatus(videoFolder.getVideoFolderId(),-1); redisUtil.set(RedisKeyUtil.mergerVideoKey+videoFolder.getVideoFolderId(),"-1"); return; } String mergeLocalPath = FilePath.VIDEO_LOCAL_PATH +"/"+mergeLocalName; String ossKey = String.format(FilePath.VIDEO_OSS_PATH,videoFolder.getVideoFolderId()) +"/"+mergeLocalName; String mergeLocalPathImg = FilePath.VIDEO_LOCAL_PATH +"/"+mergeLocalName.replace(".mp4",".jpg"); String ossKeyImg = String.format(FilePath.VIDEO_OSS_PATH,videoFolder.getVideoFolderId()) +"/"+mergeLocalName.replace(".mp4",".jpg"); uploadToOssUtil.upload(mergeLocalPath,ossKey); uploadToOssUtil.upload(mergeLocalPathImg,ossKeyImg); if(!uploadToOssUtil.existKey(ossKey)&& !uploadToOssUtil.existKey(ossKeyImg)){ updateCaseVideoStatus(videoFolder.getVideoFolderId(),-1); redisUtil.set(RedisKeyUtil.mergerVideoKey+videoFolder.getVideoFolderId(),"-1"); return; } redisUtil.set(RedisKeyUtil.mergerVideoKey+videoFolder.getVideoFolderId(),"70"); videoFolder.setVideoMergeUrl(queryPath + ossKey); videoFolder.setVideoFolderCover(queryPath + ossKeyImg); videoFolderService.updateById(videoFolder); FileUtil.del(FilePath.VIDEO_LOCAL_PATH); redisUtil.set(RedisKeyUtil.mergerVideoKey+videoFolder.getVideoFolderId(),"100"); updateCaseVideoStatus(videoFolder.getVideoFolderId(),1); } }.run(); } private void updateCaseVideoStatus(Integer folderId, Integer status) { LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.in(CaseVideo::getFolderId,folderId) .set(CaseVideo::getUploadStatus,status); this.update(wrapper); LambdaUpdateWrapper wrapperFolder = new LambdaUpdateWrapper<>(); wrapperFolder.eq(CaseVideoFolder::getVideoFolderId,folderId) .set(CaseVideoFolder::getUploadStatus,status); this.update(wrapper); } @Override public String uploadAddVideoProgress(Integer folderId) { String redisKey = RedisKeyUtil.mergerVideoKey+folderId; if(redisUtil.hasKey(redisKey)){ return redisUtil.get(redisKey); } return "0"; } @Override public void deleteByFolderId(Integer videoFolderId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(CaseVideo::getFolderId,videoFolderId); List list = this.list(wrapper); if(list.size() <=0){ return; } for (CaseVideo caseVideo : list) { this.delete(caseVideo.getVideoId()); } } @Override public void delete(Integer videoId) { CaseVideo caseVideo = this.getById(videoId); this.removeById(videoId); uploadService.deleteOssUrl(caseVideo.getVideoPath()); uploadService.deleteOssUrl(caseVideo.getVideoCover()); } }