package org.jeecg.modules.doc.component; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.util.RedisUtil; import org.jeecg.modules.doc.constant.Constant; import org.jeecg.modules.doc.entity.DocFile; import org.jeecg.modules.doc.entity.DocFilePath; import org.jeecg.modules.doc.mapper.DocFileMapper; import org.jeecg.modules.doc.mapper.DocFilePathMapper; import org.jeecg.modules.doc.service.IDocFilePathService; import org.jeecg.modules.doc.service.IFiletransferService; import org.jeecg.modules.doc.service.IRecoveryFileService; import org.jeecg.modules.doc.vo.CopyFile; import org.jeecg.modules.doc.vo.QiwenFile; import org.jeecg.modules.doc.util.UFOPUtils; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.Future; /** * 功能描述:异步任务业务类(@Async也可添加在方法上) */ @Slf4j @Component @Async("asyncTaskExecutor") public class AsyncTaskComp { @Resource IDocFilePathService userFileService; @Resource IRecoveryFileService recoveryFileService; @Resource IFiletransferService filetransferService; @Resource DocFilePathMapper userFileMapper; @Resource DocFileMapper fileMapper; @Resource DocFileDealComp fileDealComp; @Resource RedisUtil redisUtil; public Long getFilePointCount(String fileId) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(DocFilePath::getFileId, fileId); long count = userFileMapper.selectCount(lambdaQueryWrapper); return count; } public Future deleteUserFile(String userFileId) { DocFilePath userFile = userFileService.getById(userFileId); if (userFile.getIsDir() == Constant.IS_DIR) { LambdaQueryWrapper userFileLambdaQueryWrapper = new LambdaQueryWrapper<>(); userFileLambdaQueryWrapper.eq(DocFilePath::getDeleteBatchNum, userFile.getDeleteBatchNum()).eq(DocFilePath::getIsDir, Constant.IS_NOT_DIR); List list = userFileService.list(userFileLambdaQueryWrapper); recoveryFileService.deleteUserFileByDeleteBatchNum(userFile.getDeleteBatchNum()); for (DocFilePath userFileItem : list) { Object o = redisUtil.get(CacheConstant.DOC_FILE_DELETE_CACHE + ":" + userFileItem.getFileId()); if (o != null) continue; Long filePointCount = getFilePointCount(userFileItem.getFileId()); if (filePointCount != null && filePointCount == 0 && userFileItem.getIsDir() == Constant.IS_NOT_DIR) { DocFile fileBean = fileMapper.selectById(userFileItem.getFileId()); try { filetransferService.deleteFile(fileBean); fileMapper.deleteById(fileBean.getFileId()); redisUtil.set(CacheConstant.DOC_FILE_DELETE_CACHE +":" + userFileItem.getFileId(), userFileItem.getFileId(),60*60*24L); } catch (Exception e) { log.error("删除本地文件失败:" + JSON.toJSONString(fileBean)); } } } } else { recoveryFileService.deleteUserFileByDeleteBatchNum(userFile.getDeleteBatchNum()); Long filePointCount = getFilePointCount(userFile.getFileId()); if (filePointCount != null && filePointCount == 0 && userFile.getIsDir() == Constant.IS_NOT_DIR) { DocFile fileBean = fileMapper.selectById(userFile.getFileId()); try { filetransferService.deleteFile(fileBean); fileMapper.deleteById(fileBean.getFileId()); } catch (Exception e) { log.error("删除本地文件失败:" + JSON.toJSONString(fileBean)); } } } return new AsyncResult("deleteUserFile"); } public Future checkESUserFileId(String userFileId) { DocFilePath userFile = userFileMapper.selectById(userFileId); if (userFile == null) { // fileDealComp.deleteESByUserFileId(userFileId); } return new AsyncResult("checkUserFileId"); } public Future saveUnzipFile(DocFilePath userFile, DocFile fileBean, int unzipMode, String entryName, String filePath) { String unzipUrl = UFOPUtils.getTempFile(fileBean.getFileUrl()).getAbsolutePath().replace("." + userFile.getExtendName(), ""); String totalFileUrl = unzipUrl + entryName; File currentFile = new File(totalFileUrl); String fileId = null; if (!currentFile.isDirectory()) { FileInputStream fis = null; String md5Str = UUID.randomUUID().toString(); try { fis = new FileInputStream(currentFile); md5Str = DigestUtils.md5Hex(fis); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(fis); } FileInputStream fileInputStream = null; try { Map param = new HashMap<>(); param.put("identifier", md5Str); List list = fileMapper.selectByMap(param); if (list != null && !list.isEmpty()) { //文件已存在 fileId = list.get(0).getFileId(); } else { //文件不存在 fileInputStream = new FileInputStream(currentFile); CopyFile createFile = new CopyFile(); System.out.println("totalFileUrl::" + totalFileUrl); createFile.setExtendName(FilenameUtils.getExtension(totalFileUrl)); String saveFileUrl =new LocalStorageCopier().copy(fileInputStream, createFile); DocFile tempFileBean = new DocFile(saveFileUrl, currentFile.length(), md5Str, userFile.getUpdateBy()); ; fileMapper.insert(tempFileBean); fileId = tempFileBean.getFileId(); } } catch (IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(fileInputStream); System.gc(); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } currentFile.delete(); } } QiwenFile qiwenFile = null; if (unzipMode == 0) { qiwenFile = new QiwenFile(userFile.getFilePath(), entryName, currentFile.isDirectory()); } else if (unzipMode == 1) { qiwenFile = new QiwenFile(userFile.getFilePath() + "/" + userFile.getFileName(), entryName, currentFile.isDirectory()); } else if (unzipMode == 2) { qiwenFile = new QiwenFile(filePath, entryName, currentFile.isDirectory()); } System.out.println("qiwenFile:::" + qiwenFile.getPath()); DocFilePath saveUserFile = new DocFilePath(qiwenFile, userFile.getUpdateBy(), fileId); System.out.println("saveUserFile:::" + saveUserFile.toString()); DocFilePath parent = fileDealComp.getParent(saveUserFile.getFilePath()); if (parent != null) { System.out.println("parent::"+parent.toString()); saveUserFile.setParentId(parent.getPathId()); } String fileName = fileDealComp.getRepeatFileName(saveUserFile, saveUserFile.getFilePath()); saveUserFile.setFileName(fileName); if (saveUserFile.getIsDir() == Constant.IS_DIR && !fileName.equals(saveUserFile.getFileName())) { //如果是目录,而且重复,什么也不做 } else { System.out.println(saveUserFile.toString()); userFileMapper.insert(saveUserFile); } return new AsyncResult("saveUnzipFile"); } }