CaseVideoServiceImpl.java 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. package com.fdkankan.fusion.service.impl;
  2. import cn.hutool.core.io.FileUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  6. import com.fdkankan.fusion.common.ResultCode;
  7. import com.fdkankan.fusion.common.FilePath;
  8. import com.fdkankan.fusion.common.util.RedisKeyUtil;
  9. import com.fdkankan.fusion.common.util.UploadToOssUtil;
  10. import com.fdkankan.fusion.common.util.VideoUtil;
  11. import com.fdkankan.fusion.entity.CaseEntity;
  12. import com.fdkankan.fusion.entity.CaseVideoFolder;
  13. import com.fdkankan.fusion.exception.BusinessException;
  14. import com.fdkankan.fusion.entity.CaseVideo;
  15. import com.fdkankan.fusion.mapper.ICaseVideoMapper;
  16. import com.fdkankan.fusion.service.ICaseService;
  17. import com.fdkankan.fusion.service.ICaseVideoFolderService;
  18. import com.fdkankan.fusion.service.ICaseVideoService;
  19. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  20. import com.fdkankan.redis.util.RedisUtil;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.beans.factory.annotation.Value;
  23. import org.springframework.stereotype.Service;
  24. import org.springframework.web.multipart.MultipartFile;
  25. import java.io.IOException;
  26. import java.util.ArrayList;
  27. import java.util.LinkedHashSet;
  28. import java.util.List;
  29. /**
  30. * <p>
  31. * 服务实现类
  32. * </p>
  33. *
  34. * @author
  35. * @since 2022-07-29
  36. */
  37. @Service
  38. public class CaseVideoServiceImpl extends ServiceImpl<ICaseVideoMapper, CaseVideo> implements ICaseVideoService {
  39. @Autowired
  40. UploadToOssUtil uploadToOssUtil;
  41. @Autowired
  42. ICaseVideoFolderService videoFolderService;
  43. @Autowired
  44. ICaseService caseService;
  45. @Autowired
  46. UploadService uploadService;
  47. @Value("${upload.query-path}")
  48. private String queryPath;
  49. @Autowired
  50. RedisUtil redisUtil;
  51. @Override
  52. public List<CaseVideo> getAllList(Integer folderId) {
  53. if(folderId == null){
  54. throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
  55. }
  56. QueryWrapper<CaseVideo> wrapper = new QueryWrapper<>();
  57. wrapper.lambda().eq(CaseVideo::getFolderId,folderId);
  58. wrapper.lambda().orderByAsc(CaseVideo::getSort);
  59. wrapper.lambda().orderByAsc(CaseVideo::getCreateTime);
  60. return this.list(wrapper);
  61. }
  62. @Override
  63. public CaseVideoFolder uploadAddVideo(MultipartFile[] files, Integer folderId,Integer caseId) throws IOException {
  64. if(files.length <=0 || caseId == null){
  65. throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
  66. }
  67. CaseEntity caseEntity = caseService.getById(caseId);
  68. if(caseEntity == null){
  69. throw new BusinessException(ResultCode.CASE_NOT_EXIST);
  70. }
  71. CaseVideoFolder videoFolder = videoFolderService.getByIdIfNotNew(folderId,caseId);
  72. if(videoFolder == null){
  73. throw new BusinessException(ResultCode.FOLDER_NOT_EXIST);
  74. }
  75. uploadService.deleteOssUrl(videoFolder.getVideoMergeUrl());
  76. uploadService.deleteOssUrl(videoFolder.getVideoFolderCover());
  77. this.deleteByFolderId(folderId);
  78. redisUtil.set(RedisKeyUtil.mergerVideoKey+videoFolder.getVideoFolderId(),"10");
  79. runThread(files,videoFolder,this);
  80. return videoFolder;
  81. }
  82. private void runThread(MultipartFile[] files,CaseVideoFolder videoFolder,ICaseVideoService caseVideoService){
  83. new Runnable() {
  84. @Override
  85. public void run() {
  86. //替换文件夹中文件
  87. List<CaseVideo> videoList = new ArrayList<>();
  88. Integer sort = 1;
  89. LinkedHashSet<String> filePathSet = new LinkedHashSet<>();
  90. for (MultipartFile file : files) {
  91. String ossPath = uploadService.uploadFile(file, true, String.format(FilePath.VIDEO_OSS_PATH,videoFolder.getVideoFolderId())+"/",filePathSet);
  92. String suffixName = ossPath.substring(ossPath.lastIndexOf("."));
  93. CaseVideo caseVideo = new CaseVideo();
  94. caseVideo.setFolderId(videoFolder.getVideoFolderId());
  95. caseVideo.setVideoPath(ossPath);
  96. caseVideo.setVideoName(file.getName());
  97. caseVideo.setVideoCover(ossPath.replace(suffixName,".jpg"));
  98. caseVideo.setSort(sort);
  99. videoList.add(caseVideo);
  100. sort ++;
  101. }
  102. caseVideoService.saveBatch(videoList);
  103. if(videoList.size() <=0){
  104. return;
  105. }
  106. if(videoList.size() ==1){
  107. updateCaseVideoStatus(videoFolder.getVideoFolderId(),1);
  108. videoFolder.setVideoMergeUrl(videoList.get(0).getVideoPath());
  109. videoFolder.setVideoFolderCover(videoList.get(0).getVideoCover());
  110. videoFolderService.updateById(videoFolder);
  111. redisUtil.set(RedisKeyUtil.mergerVideoKey+videoFolder.getVideoFolderId(),"100");
  112. return;
  113. }
  114. redisUtil.set(RedisKeyUtil.mergerVideoKey+videoFolder.getVideoFolderId(),"20");
  115. String mergeLocalName = VideoUtil.mergeVideo(filePathSet, FilePath.VIDEO_LOCAL_PATH);
  116. redisUtil.set(RedisKeyUtil.mergerVideoKey+videoFolder.getVideoFolderId(),"30");
  117. if(mergeLocalName == null){
  118. updateCaseVideoStatus(videoFolder.getVideoFolderId(),-1);
  119. redisUtil.set(RedisKeyUtil.mergerVideoKey+videoFolder.getVideoFolderId(),"-1");
  120. return;
  121. }
  122. String mergeLocalPath = FilePath.VIDEO_LOCAL_PATH +"/"+mergeLocalName;
  123. String ossKey = String.format(FilePath.VIDEO_OSS_PATH,videoFolder.getVideoFolderId()) +"/"+mergeLocalName;
  124. String mergeLocalPathImg = FilePath.VIDEO_LOCAL_PATH +"/"+mergeLocalName.replace(".mp4",".jpg");
  125. String ossKeyImg = String.format(FilePath.VIDEO_OSS_PATH,videoFolder.getVideoFolderId()) +"/"+mergeLocalName.replace(".mp4",".jpg");
  126. uploadToOssUtil.upload(mergeLocalPath,ossKey);
  127. uploadToOssUtil.upload(mergeLocalPathImg,ossKeyImg);
  128. if(!uploadToOssUtil.existKey(ossKey)&& !uploadToOssUtil.existKey(ossKeyImg)){
  129. updateCaseVideoStatus(videoFolder.getVideoFolderId(),-1);
  130. redisUtil.set(RedisKeyUtil.mergerVideoKey+videoFolder.getVideoFolderId(),"-1");
  131. return;
  132. }
  133. redisUtil.set(RedisKeyUtil.mergerVideoKey+videoFolder.getVideoFolderId(),"70");
  134. videoFolder.setVideoMergeUrl(queryPath + ossKey);
  135. videoFolder.setVideoFolderCover(queryPath + ossKeyImg);
  136. videoFolderService.updateById(videoFolder);
  137. FileUtil.del(FilePath.VIDEO_LOCAL_PATH);
  138. redisUtil.set(RedisKeyUtil.mergerVideoKey+videoFolder.getVideoFolderId(),"100");
  139. updateCaseVideoStatus(videoFolder.getVideoFolderId(),1);
  140. }
  141. }.run();
  142. }
  143. private void updateCaseVideoStatus(Integer folderId, Integer status) {
  144. LambdaUpdateWrapper<CaseVideo> wrapper = new LambdaUpdateWrapper<>();
  145. wrapper.in(CaseVideo::getFolderId,folderId)
  146. .set(CaseVideo::getUploadStatus,status);
  147. this.update(wrapper);
  148. LambdaUpdateWrapper<CaseVideoFolder> wrapperFolder = new LambdaUpdateWrapper<>();
  149. wrapperFolder.eq(CaseVideoFolder::getVideoFolderId,folderId)
  150. .set(CaseVideoFolder::getUploadStatus,status);
  151. this.update(wrapper);
  152. }
  153. @Override
  154. public String uploadAddVideoProgress(Integer folderId) {
  155. String redisKey = RedisKeyUtil.mergerVideoKey+folderId;
  156. if(redisUtil.hasKey(redisKey)){
  157. return redisUtil.get(redisKey);
  158. }
  159. return "0";
  160. }
  161. @Override
  162. public void deleteByFolderId(Integer videoFolderId) {
  163. LambdaQueryWrapper<CaseVideo> wrapper = new LambdaQueryWrapper<>();
  164. wrapper.eq(CaseVideo::getFolderId,videoFolderId);
  165. List<CaseVideo> list = this.list(wrapper);
  166. if(list.size() <=0){
  167. return;
  168. }
  169. for (CaseVideo caseVideo : list) {
  170. this.delete(caseVideo.getVideoId());
  171. }
  172. }
  173. @Override
  174. public void delete(Integer videoId) {
  175. CaseVideo caseVideo = this.getById(videoId);
  176. this.removeById(videoId);
  177. uploadService.deleteOssUrl(caseVideo.getVideoPath());
  178. uploadService.deleteOssUrl(caseVideo.getVideoCover());
  179. }
  180. }