完成文件备份相关的功能

This commit is contained in:
chenxudong 2025-02-28 14:13:13 +08:00
parent dd85e18e76
commit 4f51521354
3 changed files with 90 additions and 33 deletions

View File

@ -34,4 +34,6 @@ public class FileBackupLog {
private String fileName; private String fileName;
private Integer source; private Integer source;
private Date fileCreateTime;
} }

View File

@ -147,6 +147,7 @@ public class FileRecycleServiceImpl implements FileRecycleService {
.setCreateTime(new Date()) .setCreateTime(new Date())
.setFileName(saveFileName) .setFileName(saveFileName)
.setFileCode(commonService.getFileCode(fileSysPath)) .setFileCode(commonService.getFileCode(fileSysPath))
.setFileCreateTime(edFileInfo.getCreatedTime())
.setSource(FileBackupSource.SYS_BACKUP.code); .setSource(FileBackupSource.SYS_BACKUP.code);
if (backup.getBackupSuccess()) { if (backup.getBackupSuccess()) {
@ -169,6 +170,7 @@ public class FileRecycleServiceImpl implements FileRecycleService {
.setFileTime(FileUtil.lastModifiedTime(fileSysPath).getTime()) .setFileTime(FileUtil.lastModifiedTime(fileSysPath).getTime())
.setCreateTime(new Date()) .setCreateTime(new Date())
.setFileCode(commonService.getFileCode(fileSysPath)) .setFileCode(commonService.getFileCode(fileSysPath))
.setFileCreateTime(edFileInfo.getCreatedTime())
.setFileName(saveFileName); .setFileName(saveFileName);
if (backup.getBackupSuccess()) { if (backup.getBackupSuccess()) {
fileBackupLog.setBackupSuccess(true); fileBackupLog.setBackupSuccess(true);

View File

@ -9,17 +9,21 @@ import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.electromagnetic.industry.software.common.enums.EleDataTypeEnum;
import com.electromagnetic.industry.software.common.enums.FileBackupSource;
import com.electromagnetic.industry.software.common.enums.UserOperationModuleEnum; import com.electromagnetic.industry.software.common.enums.UserOperationModuleEnum;
import com.electromagnetic.industry.software.common.pojo.BackupFileResLog; import com.electromagnetic.industry.software.common.pojo.BackupFileResLog;
import com.electromagnetic.industry.software.common.resp.ElectromagneticResult; import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
import com.electromagnetic.industry.software.common.util.IdWorker; import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.manage.config.ElePropertyConfig; import com.electromagnetic.industry.software.manage.config.ElePropertyConfig;
import com.electromagnetic.industry.software.manage.mapper.EdFileInfoMapper;
import com.electromagnetic.industry.software.manage.mapper.FileBackupLogMapper; import com.electromagnetic.industry.software.manage.mapper.FileBackupLogMapper;
import com.electromagnetic.industry.software.manage.mapper.UserAccessLogMapper; import com.electromagnetic.industry.software.manage.mapper.UserAccessLogMapper;
import com.electromagnetic.industry.software.manage.pojo.models.EdFileInfo;
import com.electromagnetic.industry.software.manage.pojo.models.FileBackupLog; import com.electromagnetic.industry.software.manage.pojo.models.FileBackupLog;
import com.electromagnetic.industry.software.manage.pojo.models.UserAccessLog; import com.electromagnetic.industry.software.manage.pojo.models.UserAccessLog;
import com.electromagnetic.industry.software.manage.service.FileSystemService; import com.electromagnetic.industry.software.manage.service.FileSystemService;
import org.springframework.scheduling.annotation.Scheduled; import com.electromagnetic.industry.software.manage.service.serviceimpl.CommonService;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -29,6 +33,7 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
@Component @Component
public class BackupTask extends ServiceImpl<FileBackupLogMapper, FileBackupLog> { public class BackupTask extends ServiceImpl<FileBackupLogMapper, FileBackupLog> {
@ -39,24 +44,94 @@ public class BackupTask extends ServiceImpl<FileBackupLogMapper, FileBackupLog>
private FileSystemService fileSystemService; private FileSystemService fileSystemService;
@Resource @Resource
private UserAccessLogMapper userAccessLogMapper; private UserAccessLogMapper userAccessLogMapper;
@Resource
private FileBackupLogMapper fileBackupLogMapper;
@Resource
private EdFileInfoMapper edFileInfoMapper;
@Resource
private CommonService commonService;
private static List<File> filter(long time, String dir) {
FileFilter filter = file -> file.lastModified() < time;
return FileUtil.loopFiles(dir, filter);
}
// @Scheduled(cron = "0 0 1 * * ?") // @Scheduled(cron = "0 0 1 * * ?")
public void backup() { public void backup() {
long lastFileTime = getLastFileTime();
List<File> files = filter(lastFileTime, elePropertyConfig.getPrjDir());
for (File file : files) {
String fileCode = getFileCode(file);
Date reqStartTime = new Date();
BackupFileResLog resLog = backup(file.getAbsolutePath());
Date reqEndTime = new Date();
// this.saveOrUpdate(resDb); // 首先查看备份失败的文件
List<String> failBackFailFileIds = getFailBackFile();
for (String id : failBackFailFileIds) {
EdFileInfo fileInfo = this.edFileInfoMapper.selectOne(Wrappers.<EdFileInfo>lambdaQuery()
.select(EdFileInfo.class, file -> !file.getColumn().equals("file_content"))
.eq(EdFileInfo::getId, id));
String sysFilePath = commonService.getFileSysPath(fileInfo.getFilePath(), fileInfo.getDataOwn());
long startTime = System.currentTimeMillis();
BackupFileResLog resLog = backup(sysFilePath);
long endTime = System.currentTimeMillis();
fileBackupLogMapper.update(null, Wrappers.<FileBackupLog>lambdaUpdate()
.eq(FileBackupLog::getFileId, id)
.set(FileBackupLog::getFileCode, fileInfo.getFileCode())
.set(FileBackupLog::getFileName, fileInfo.getFileName() + "." + fileInfo.getFileType())
.set(FileBackupLog::getStartTime, startTime)
.set(FileBackupLog::getEndTime, endTime)
.set(FileBackupLog::getDuration, endTime - startTime)
.set(FileBackupLog::getFailInfoDetail, resLog.getFailInfoDetail())
.set(FileBackupLog::isBackupSuccess, resLog.getBackupSuccess()));
}
// 查找最大备份时间
Date fileMaxCreateTime = getFileMaxCreateTime();
fileMaxCreateTime = DateUtil.offsetHour(fileMaxCreateTime, -1);
// 需要备份的文件
List<EdFileInfo> edFileInfos = edFileInfoMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class)
.select(EdFileInfo.class, file -> !file.getColumn().equals("file_content"))
.eq(EdFileInfo::getDataType, EleDataTypeEnum.FILE.code)
.gt(EdFileInfo::getCreatedTime, fileMaxCreateTime));
for (EdFileInfo edFileInfo : edFileInfos) {
long count = fileBackupLogMapper.selectCount(Wrappers.<FileBackupLog>lambdaQuery().eq(FileBackupLog::getFileId, edFileInfo.getId()));
if (count > 0) {
continue;
}
String fileSysPath = commonService.getFileSysPath(edFileInfo.getFilePath(), edFileInfo.getDataOwn());
long startTime = System.currentTimeMillis();
BackupFileResLog resLog = backup(fileSysPath);
long endTime = System.currentTimeMillis();
FileBackupLog backupLog = new FileBackupLog()
.setId(IdWorker.getSnowFlakeIdString())
.setFileId(edFileInfo.getId())
.setFileCode(edFileInfo.getFileCode())
.setBackupSuccess(resLog.getBackupSuccess())
.setCreateTime(new Date())
.setStartTime(startTime)
.setEndTime(endTime)
.setDuration(endTime - startTime)
.setFailInfoDetail(resLog.getFailInfoDetail())
.setFileTime(FileUtil.lastModifiedTime(fileSysPath).getTime())
.setFileName(edFileInfo.getFileName() + "." + edFileInfo.getFileType())
.setFileCreateTime(edFileInfo.getCreatedTime())
.setSource(FileBackupSource.SYS_BACKUP.code);
fileBackupLogMapper.insert(backupLog);
} }
} }
@Scheduled(cron = "0 0 3 * * ?") private Date getFileMaxCreateTime() {
List<FileBackupLog> fileBackupLogs = fileBackupLogMapper.selectList(Wrappers.<FileBackupLog>lambdaQuery().orderByDesc(FileBackupLog::getFileCreateTime).last("limit 1"));
if (CollUtil.isNotEmpty(fileBackupLogs)) {
return fileBackupLogs.get(0).getFileCreateTime();
}
return new Date();
}
public List<String> getFailBackFile() {
List<FileBackupLog> fileBackupLogs = fileBackupLogMapper.selectList(Wrappers.<FileBackupLog>lambdaQuery()
.select(FileBackupLog::getFileId)
.eq(FileBackupLog::isBackupSuccess, false));
return fileBackupLogs.stream().map(FileBackupLog::getFileId).collect(Collectors.toList());
}
// @Scheduled(cron = "0 0 3 * * ?")
public void deleteTmpFile() { public void deleteTmpFile() {
DateTime backDaysTime = DateUtil.offsetDay(new Date(), elePropertyConfig.getTmpFileStoreDays()); DateTime backDaysTime = DateUtil.offsetDay(new Date(), -elePropertyConfig.getTmpFileStoreDays());
FileFilter filter = file -> file.lastModified() < backDaysTime.getTime(); FileFilter filter = file -> file.lastModified() < backDaysTime.getTime();
List<File> files = FileUtil.loopFiles(elePropertyConfig.getTmpDir(), filter); List<File> files = FileUtil.loopFiles(elePropertyConfig.getTmpDir(), filter);
for (File file : files) { for (File file : files) {
@ -84,28 +159,6 @@ public class BackupTask extends ServiceImpl<FileBackupLogMapper, FileBackupLog>
} }
} }
private static List<File> filter(long time, String dir) {
FileFilter filter = file -> file.lastModified() < time;
return FileUtil.loopFiles(dir, filter);
}
private String getFileCode(File file) {
String fileName = file.getName();
int index = fileName.lastIndexOf(".");
return fileName.substring(index + 1);
}
private long getLastFileTime() {
List<FileBackupLog> eleFileBackupLogs = this.baseMapper.selectList(Wrappers.lambdaQuery(FileBackupLog.class)
.select(FileBackupLog::getFileTime)
.orderByDesc(FileBackupLog::getFileTime)
.last("limit 1"));
if (CollUtil.isEmpty(eleFileBackupLogs)) {
return 0L;
}
return eleFileBackupLogs.get(0).getFileTime();
}
public BackupFileResLog backup(String filePath) { public BackupFileResLog backup(String filePath) {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("file", new File(filePath)); map.put("file", new File(filePath));