CaseVideoServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  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 lombok.extern.slf4j.Slf4j;
  22. import org.apache.commons.lang3.StringUtils;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.beans.factory.annotation.Value;
  25. import org.springframework.scheduling.annotation.Async;
  26. import org.springframework.stereotype.Service;
  27. import org.springframework.web.multipart.MultipartFile;
  28. import java.io.File;
  29. import java.io.IOException;
  30. import java.util.ArrayList;
  31. import java.util.LinkedHashSet;
  32. import java.util.List;
  33. import java.util.concurrent.ThreadPoolExecutor;
  34. /**
  35. * <p>
  36. * 服务实现类
  37. * </p>
  38. *
  39. * @author
  40. * @since 2022-07-29
  41. */
  42. @Slf4j
  43. @Service
  44. public class CaseVideoServiceImpl extends ServiceImpl<ICaseVideoMapper, CaseVideo> implements ICaseVideoService {
  45. @Autowired
  46. UploadToOssUtil uploadToOssUtil;
  47. @Autowired
  48. ICaseVideoFolderService videoFolderService;
  49. @Autowired
  50. ICaseService caseService;
  51. @Autowired
  52. UploadService uploadService;
  53. @Value("${upload.query-path}")
  54. private String queryPath;
  55. @Value("${spring.profiles.active}")
  56. private String environment;
  57. @Autowired
  58. RedisUtil redisUtil;
  59. @Override
  60. public List<CaseVideo> getAllList(Integer folderId) {
  61. if(folderId == null){
  62. throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
  63. }
  64. QueryWrapper<CaseVideo> wrapper = new QueryWrapper<>();
  65. wrapper.lambda().eq(CaseVideo::getFolderId,folderId);
  66. wrapper.lambda().orderByAsc(CaseVideo::getSort);
  67. wrapper.lambda().orderByAsc(CaseVideo::getCreateTime);
  68. return this.list(wrapper);
  69. }
  70. @Override
  71. public CaseVideoFolder uploadAddVideo(MultipartFile[] files, Integer folderId,Integer caseId) throws IOException {
  72. if(files.length <=0 || caseId == null){
  73. throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
  74. }
  75. CaseEntity caseEntity = caseService.getById(caseId);
  76. if(caseEntity == null){
  77. throw new BusinessException(ResultCode.CASE_NOT_EXIST);
  78. }
  79. CaseVideoFolder videoFolder = videoFolderService.getByIdIfNotNew(folderId,caseId);
  80. if(videoFolder == null){
  81. throw new BusinessException(ResultCode.FOLDER_NOT_EXIST);
  82. }
  83. redisUtil.set(RedisKeyUtil.mergerVideoKey + videoFolder.getVideoFolderId(), "0");
  84. //替换文件夹中文件
  85. List<CaseVideo> videoList = new ArrayList<>();
  86. Integer sort = 1;
  87. LinkedHashSet<String> filePathSet = new LinkedHashSet<>();
  88. for (MultipartFile file : files) {
  89. String localPath = uploadService.uploadFile(file, videoFolder.getVideoFolderId());
  90. if(StringUtils.isEmpty(localPath)){
  91. throw new BusinessException(ResultCode.UPLOAD_ERROR);
  92. }
  93. filePathSet.add(localPath);
  94. CaseVideo caseVideo = new CaseVideo();
  95. caseVideo.setFolderId(videoFolder.getVideoFolderId());
  96. caseVideo.setVideoPath(localPath);
  97. caseVideo.setVideoName(file.getName());
  98. caseVideo.setSort(sort);
  99. videoList.add(caseVideo);
  100. sort++;
  101. }
  102. if (videoList.size() <= 0) {
  103. return videoFolder;
  104. }
  105. this.saveBatch(videoList);
  106. runThread(filePathSet,videoFolder,this);
  107. return videoFolder;
  108. }
  109. public void runThread(LinkedHashSet<String> filePathSet,CaseVideoFolder videoFolder,ICaseVideoService caseVideoService){
  110. new Thread(new Runnable() {
  111. @Override
  112. public void run() {
  113. LinkedHashSet<String> filePathSetAll = new LinkedHashSet<>();
  114. LinkedHashSet<String> ossDelList = new LinkedHashSet<>();
  115. String mergeLocalPath = null;
  116. String mergeLocalPathImg = null;
  117. try {
  118. String mergeVideoUrl = null;
  119. if (StringUtils.isNotBlank(videoFolder.getVideoMergeUrl())) {
  120. mergeVideoUrl = videoFolder.getVideoMergeUrl().replace(queryPath, "/home/");
  121. uploadToOssUtil.downFormAli(videoFolder.getVideoMergeUrl().replace(queryPath, ""), mergeVideoUrl);
  122. ossDelList.add(videoFolder.getVideoMergeUrl());
  123. }
  124. caseVideoService.deleteByFolderId(videoFolder.getVideoFolderId());
  125. redisUtil.set(RedisKeyUtil.mergerVideoKey + videoFolder.getVideoFolderId(), "10");
  126. redisUtil.set(RedisKeyUtil.mergerVideoKey + videoFolder.getVideoFolderId(), "20");
  127. if (StringUtils.isNotBlank(mergeVideoUrl)) {
  128. filePathSetAll.add(mergeVideoUrl);
  129. }
  130. filePathSetAll.addAll(filePathSet);
  131. Boolean newCover = true;
  132. if(StringUtils.isNotBlank(videoFolder.getVideoFolderCover()) && uploadToOssUtil.existKey(videoFolder.getVideoFolderCover().replace(queryPath,""))){
  133. newCover = false;
  134. }
  135. String mergeLocalName = VideoUtil.mergeVideo(filePathSetAll, String.format(FilePath.VIDEO_LOCAL_PATH,environment),newCover);
  136. redisUtil.set(RedisKeyUtil.mergerVideoKey + videoFolder.getVideoFolderId(), "30");
  137. if (mergeLocalName == null) {
  138. updateCaseVideoStatus(videoFolder.getVideoFolderId(), -1);
  139. redisUtil.set(RedisKeyUtil.mergerVideoKey + videoFolder.getVideoFolderId(), "-1");
  140. return;
  141. }
  142. mergeLocalPath = String.format(FilePath.VIDEO_LOCAL_PATH,environment) + "/" + mergeLocalName;
  143. String ossKey = String.format(FilePath.VIDEO_OSS_PATH,environment, videoFolder.getVideoFolderId()) + "/" + mergeLocalName;
  144. uploadToOssUtil.uploadOss(mergeLocalPath, ossKey);
  145. if (!uploadToOssUtil.existKey(ossKey)) {
  146. updateCaseVideoStatus(videoFolder.getVideoFolderId(), -1);
  147. redisUtil.set(RedisKeyUtil.mergerVideoKey + videoFolder.getVideoFolderId(), "-1");
  148. return;
  149. }
  150. if(newCover){
  151. mergeLocalPathImg = String.format(FilePath.VIDEO_LOCAL_PATH,environment) + "/" + mergeLocalName.replace(".mp4", ".jpg");
  152. String ossKeyImg = String.format(FilePath.VIDEO_OSS_PATH, environment,videoFolder.getVideoFolderId()) + "/" + mergeLocalName.replace(".mp4", ".jpg");
  153. uploadToOssUtil.uploadOss(mergeLocalPathImg, ossKeyImg);
  154. if (!uploadToOssUtil.existKey(ossKeyImg)) {
  155. updateCaseVideoStatus(videoFolder.getVideoFolderId(), -1);
  156. redisUtil.set(RedisKeyUtil.mergerVideoKey + videoFolder.getVideoFolderId(), "-1");
  157. return;
  158. }
  159. videoFolder.setVideoFolderCover(queryPath + ossKeyImg);
  160. }
  161. redisUtil.set(RedisKeyUtil.mergerVideoKey + videoFolder.getVideoFolderId(), "70");
  162. videoFolder.setVideoMergeUrl(queryPath + ossKey);
  163. videoFolderService.updateById(videoFolder);
  164. updateCaseVideoStatus(videoFolder.getVideoFolderId(), 1);
  165. //删除oss原资源
  166. for (String path : ossDelList) {
  167. uploadService.deleteOssUrl(path);
  168. }
  169. redisUtil.set(RedisKeyUtil.mergerVideoKey + videoFolder.getVideoFolderId(), "100");
  170. }catch (Exception e){
  171. updateCaseVideoStatus(videoFolder.getVideoFolderId(), -1);
  172. redisUtil.set(RedisKeyUtil.mergerVideoKey + videoFolder.getVideoFolderId(), "-1");
  173. log.info("合并视频出错:",e);
  174. }finally {
  175. for (String path : filePathSetAll) {
  176. FileUtil.del(path);
  177. }
  178. FileUtil.del(mergeLocalPath);
  179. FileUtil.del(mergeLocalPathImg);
  180. }
  181. }
  182. }).start();
  183. }
  184. private void updateCaseVideoStatus(Integer folderId, Integer status) {
  185. LambdaUpdateWrapper<CaseVideo> wrapper = new LambdaUpdateWrapper<>();
  186. wrapper.in(CaseVideo::getFolderId,folderId)
  187. .set(CaseVideo::getUploadStatus,status);
  188. this.update(wrapper);
  189. LambdaUpdateWrapper<CaseVideoFolder> wrapperFolder = new LambdaUpdateWrapper<>();
  190. wrapperFolder.eq(CaseVideoFolder::getVideoFolderId,folderId)
  191. .set(CaseVideoFolder::getUploadStatus,status);
  192. videoFolderService.update(wrapperFolder);
  193. }
  194. @Override
  195. public String uploadAddVideoProgress(Integer folderId) {
  196. String redisKey = RedisKeyUtil.mergerVideoKey+folderId;
  197. if(redisUtil.hasKey(redisKey)){
  198. return redisUtil.get(redisKey);
  199. }
  200. return "0";
  201. }
  202. @Override
  203. public void deleteByFolderId(Integer videoFolderId) {
  204. LambdaQueryWrapper<CaseVideo> wrapper = new LambdaQueryWrapper<>();
  205. wrapper.eq(CaseVideo::getFolderId,videoFolderId);
  206. List<CaseVideo> list = this.list(wrapper);
  207. if(list.size() <=0){
  208. return;
  209. }
  210. for (CaseVideo caseVideo : list) {
  211. this.delete(caseVideo.getVideoId());
  212. }
  213. }
  214. @Override
  215. public void delete(Integer videoId) {
  216. CaseVideo caseVideo = this.getById(videoId);
  217. this.removeById(videoId);
  218. uploadService.deleteOssUrl(caseVideo.getVideoPath());
  219. uploadService.deleteOssUrl(caseVideo.getVideoCover());
  220. }
  221. }