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.fdkankan.fusion.common.ResultCode;
import com.fdkankan.fusion.common.FilePath;
import com.fdkankan.fusion.common.ResultCode;
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.request.CaseParam;
import com.fdkankan.fusion.request.CaseVideoParam;
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 org.apache.commons.lang3.StringUtils;
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.File;
import java.io.IOException;
import java.lang.reflect.Field;
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;
@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 void 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);
}
videoFolderService.deleteMergeUrl(videoFolder.getVideoMergeUrl());
this.deleteByFolderId(folderId);
//替换文件夹中文件
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);
CaseVideo caseVideo = new CaseVideo();
caseVideo.setFolderId(videoFolder.getVideoFolderId());
caseVideo.setVideoPath(ossPath);
caseVideo.setVideoName(file.getName());
caseVideo.setSort(sort);
videoList.add(caseVideo);
sort ++;
}
this.saveBatch(videoList);
String mergeLocalName = VideoUtil.mergeVideo(filePathSet, FilePath.VIDEO_LOCAL_PATH);
if(mergeLocalName == null){
throw new BusinessException(ResultCode.MERGER_VIDEO_ERROR);
}
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);
videoFolder.setVideoMergeUrl(queryPath + ossKey);
videoFolder.setVideoFolderCover(queryPath + ossKeyImg);
videoFolderService.updateById(videoFolder);
FileUtil.del(mergeLocalPath);
FileUtil.del(mergeLocalPathImg);
}
@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);
try {
String replace = caseVideo.getVideoPath().replace(queryPath, "");
uploadToOssUtil.delete(replace);
}catch (Exception e){
e.printStackTrace();
}
}
}