文件恢复,当是单独文件时置为USING
即可,当是目录时,除了本身外,还需要将其中的子目录置为USING
文件恢复时,其原本的父目录可能已经被删除,这里就不再去判断,而是采用另一种方案:将恢复文件的父目录统一设置为根目录。
接口信息
定义Service
找到 FileInfoService 接口,在其中添加:
FileInfoService
void recoverFileBatch(String userId, String ids);
|
在 UserInfoServiceImpl 中实现该方法
FileInfoServiceImpl@Override @Transactional(rollbackFor = Exception.class) public void recoverFileBatch(String userId, String ids) { List<String> idList = Arrays.asList(ids.split(",")); LambdaQueryWrapper<FileInfo> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(FileInfo::getUserId, userId) .eq(FileInfo::getDeleted, FileDelFlagEnums.RECYCLE.getFlag()) .in(!ids.isEmpty(), FileInfo::getId, idList); List<FileInfo> fileInfoList = list(wrapper); ArrayList<String> delFileSubFolderFileIdList = new ArrayList<>(); for (FileInfo fileInfo : fileInfoList) { if (FileFolderTypeEnums.FOLDER.getType().equals(fileInfo.getFolderType())) { findAllSubFolderList(delFileSubFolderFileIdList, userId, fileInfo.getId(), FileDelFlagEnums.DEL.getFlag()); } } List<FileInfo> rootFileList = list(new LambdaQueryWrapper<FileInfo>().eq(FileInfo::getUserId, userId) .eq(FileInfo::getDeleted, FileDelFlagEnums.USING.getFlag()) .eq(FileInfo::getFilePid, Constants.ZERO_STR)); Map<String, FileInfo> rootFileMap = rootFileList.stream().collect(Collectors.toMap(FileInfo::getFilename, Function.identity(), (a, b) -> b)); if (!delFileSubFolderFileIdList.isEmpty()) { FileInfo fileInfo = new FileInfo(); fileInfo.setDeleted(FileDelFlagEnums.USING.getFlag()); baseMapper.updateFileDelFlagBatch(fileInfo, userId, delFileSubFolderFileIdList, null, FileDelFlagEnums.DEL.getFlag()); } FileInfo fileInfo = new FileInfo(); fileInfo.setDeleted(FileDelFlagEnums.USING.getFlag()); fileInfo.setFilePid(Constants.ZERO_STR); fileInfo.setUpdateTime(LocalDateTime.now()); baseMapper.updateFileDelFlagBatch(fileInfo, userId, null, idList, FileDelFlagEnums.RECYCLE.getFlag());
for (FileInfo info : fileInfoList) { FileInfo rootFileInfo = rootFileMap.get(info.getFilename()); if (null != rootFileInfo) { FileInfo updateInfo = new FileInfo(); updateInfo.setFilename(StringTools.rename(info.getFilename())); updateByMultiId(updateInfo, info.getId(), userId); } } }
|
定义Controller
在 RecycleController 下定义恢复文件方法。
RecycleController @PutMapping("/recoverFile/{ids}") public void recoverFile(HttpSession session, @PathVariable("ids") @NotEmpty String ids) { SessionWebUserVO user = (SessionWebUserVO) session.getAttribute(Constants.SESSION_KEY); fileInfoService.recoverFileBatch(user.getId(), ids); }
|