解决合并冲突
This commit is contained in:
commit
89821b83f5
|
|
@ -6,9 +6,11 @@ import com.electromagnetic.industry.software.common.enums.EffectFlagEnum;
|
||||||
import com.electromagnetic.industry.software.common.util.IdWorker;
|
import com.electromagnetic.industry.software.common.util.IdWorker;
|
||||||
import com.electromagnetic.industry.software.common.util.UserThreadLocal;
|
import com.electromagnetic.industry.software.common.util.UserThreadLocal;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@Data
|
@Data
|
||||||
@TableName("ed_file_relation")
|
@TableName("ed_file_relation")
|
||||||
public class EdFileRelation extends BaseModel{
|
public class EdFileRelation extends BaseModel{
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package com.electromagnetic.industry.software.manage.service.serviceimpl;
|
package com.electromagnetic.industry.software.manage.service.serviceimpl;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.io.FileUtil;
|
||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
import cn.hutool.core.lang.tree.Tree;
|
import cn.hutool.core.lang.tree.Tree;
|
||||||
import cn.hutool.core.lang.tree.TreeNodeConfig;
|
import cn.hutool.core.lang.tree.TreeNodeConfig;
|
||||||
|
|
@ -8,6 +9,7 @@ import cn.hutool.core.lang.tree.TreeUtil;
|
||||||
import cn.hutool.core.text.StrFormatter;
|
import cn.hutool.core.text.StrFormatter;
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.hutool.crypto.SecureUtil;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
|
|
@ -30,12 +32,15 @@ import jakarta.annotation.PostConstruct;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static com.electromagnetic.industry.software.common.cons.ElectromagneticConstants.*;
|
import static com.electromagnetic.industry.software.common.cons.ElectromagneticConstants.*;
|
||||||
|
import static com.electromagnetic.industry.software.common.enums.FileRepeatEnum.*;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class CommonService {
|
public class CommonService {
|
||||||
|
|
@ -136,6 +141,31 @@ public class CommonService {
|
||||||
return count == 0;
|
return count == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void resetFileInfoName(EdFileInfo fileInfo) {
|
||||||
|
String fileName = fileInfo.getFileName();
|
||||||
|
String parentId = fileInfo.getParentId();
|
||||||
|
for (int i = 0; i < 1000; ++i) {
|
||||||
|
long count = edFileInfoMapper.selectCount(Wrappers.lambdaQuery(EdFileInfo.class)
|
||||||
|
.eq(EdFileInfo::getFileName, fileName)
|
||||||
|
.eq(EdFileInfo::getFileType, fileInfo.getFileType())
|
||||||
|
.eq(EdFileInfo::getParentId, parentId)
|
||||||
|
.eq(EdFileInfo::getDataType, EleDataTypeEnum.FILE.code)
|
||||||
|
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code));
|
||||||
|
if (count > 0) {
|
||||||
|
fileName = fileName + APPEND_NEW_FILE_NAME;
|
||||||
|
} else {
|
||||||
|
fileInfo.setFileName(fileName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isFolder(String id) {
|
||||||
|
EdFileInfo fileInfo = edFileInfoMapper.selectById(id);
|
||||||
|
Assert.notNull(fileInfo, StrFormatter.format("文件不存在,ID为{}", id));
|
||||||
|
return fileInfo.getDataType().equals(EleDataTypeEnum.FOLDER.code);
|
||||||
|
}
|
||||||
|
|
||||||
public String getFileSysPath(String id) {
|
public String getFileSysPath(String id) {
|
||||||
EdFileInfo fileInfo = edFileInfoMapper.selectById(id);
|
EdFileInfo fileInfo = edFileInfoMapper.selectById(id);
|
||||||
int dataOwnCode = fileInfo.getDataOwn();
|
int dataOwnCode = fileInfo.getDataOwn();
|
||||||
|
|
@ -567,4 +597,168 @@ public class CommonService {
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public ElectromagneticResult<?> upload(String parentId, MultipartFile file, Integer strategy, int dataOwnCode) {
|
||||||
|
Assert.isTrue(FileRepeatEnum.contains(strategy), "解决重名文件参数错误");
|
||||||
|
String fileName = file.getOriginalFilename();
|
||||||
|
String mainName = FileUtil.mainName(fileName);
|
||||||
|
String suffix = FileUtil.getSuffix(fileName);
|
||||||
|
Assert.isTrue(StrUtil.isNotEmpty(suffix), "文件类型不能为空");
|
||||||
|
String destPath = getDbPathById(parentId);
|
||||||
|
String strategyStr = FileRepeatEnum.getDesc(strategy);
|
||||||
|
Assert.isTrue(!file.isEmpty(), StrFormatter.format("文件 {} 为空,文件上传到 {} 失败,同名同后缀的处理方式为 {}", fileName, destPath, strategyStr));
|
||||||
|
Assert.isTrue(EleCommonUtil.isFileNameValid(file.getOriginalFilename()), StrFormatter.format("文件 {} {},上传到 {} 失败,同名同后缀的处理方式为 {}", fileName, NAME_VALID_MSG, destPath, strategyStr));
|
||||||
|
// 查找下一层,看是否存在顶级定义相关文件,如果存在,则该层属于管理员层级定义的,不允许上传文件
|
||||||
|
LambdaQueryWrapper<EdFileInfo> queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class)
|
||||||
|
.eq(EdFileInfo::getParentId, parentId)
|
||||||
|
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)
|
||||||
|
.eq(EdFileInfo::getDataType, EleDataTypeEnum.FOLDER.code);
|
||||||
|
DataOwnEnum obj = DataOwnEnum.getEnumByCode(dataOwnCode);
|
||||||
|
switch (Objects.requireNonNull(obj)) {
|
||||||
|
case USER_FILE, USER_PRJ -> queryWrapper.eq(EdFileInfo::getDataOwn, DataOwnEnum.USER_PRJ.code);
|
||||||
|
case SYS_FILE, SYS_PRJ -> queryWrapper.eq(EdFileInfo::getDataOwn, DataOwnEnum.SYS_PRJ.code);
|
||||||
|
case REPO_PRJ, REPO_FILE -> queryWrapper.eq(EdFileInfo::getDataOwn, DataOwnEnum.REPO_PRJ.code);
|
||||||
|
default -> ElectromagneticResultUtil.fail("-1", "参数错误");
|
||||||
|
}
|
||||||
|
|
||||||
|
long dirCount = edFileInfoMapper.selectCount(queryWrapper);
|
||||||
|
Assert.isTrue(dirCount == 0, "文件 {} 上传到 {} 失败,层级结构不允许上传文件,同名同后缀的处理方式为 {}", fileName, destPath, strategyStr);
|
||||||
|
EdFileInfo newEdFileInfo = new EdFileInfo();
|
||||||
|
newEdFileInfo.newInit();
|
||||||
|
EdFileInfo finalEdFileInfo;
|
||||||
|
// 首先检查是否是同名文件
|
||||||
|
try {
|
||||||
|
Assert.isTrue(EleCommonUtil.isFileNameValid(fileName), NAME_VALID_MSG);
|
||||||
|
Long count = edFileInfoMapper.selectCount(Wrappers.lambdaQuery(EdFileInfo.class)
|
||||||
|
.eq(EdFileInfo::getParentId, parentId)
|
||||||
|
.eq(EdFileInfo::getFileName, mainName)
|
||||||
|
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)
|
||||||
|
.eq(EdFileInfo::getFileType, suffix));
|
||||||
|
if (count > 0) {
|
||||||
|
finalEdFileInfo = handUploadRepeatFile(parentId, file, strategy, dataOwnCode);
|
||||||
|
} else {
|
||||||
|
EdFileInfo parentFolderInfo = edFileInfoMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class)
|
||||||
|
.eq(EdFileInfo::getId, parentId)
|
||||||
|
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code));
|
||||||
|
|
||||||
|
String codePathByDbPath = getCodePathByDbPath(parentFolderInfo.getFilePath());
|
||||||
|
String fileCode = createFileCode(codePathByDbPath, suffix, FILE_START_VERSION, newEdFileInfo.getFileTime());
|
||||||
|
newEdFileInfo.setParentId(parentId)
|
||||||
|
.setFileCode(fileCode)
|
||||||
|
.setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code)
|
||||||
|
.setDataOwn(dataOwnCode)
|
||||||
|
.setFileName(mainName)
|
||||||
|
.setFileContent(EleCommonUtil.parse(file.getInputStream(), suffix))
|
||||||
|
.setFileType(suffix)
|
||||||
|
.setFileVersion(FILE_START_VERSION)
|
||||||
|
.setFileSize(file.getSize())
|
||||||
|
.setFilePath(parentFolderInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newEdFileInfo.getId())
|
||||||
|
.setDataType(EleDataTypeEnum.FILE.code)
|
||||||
|
.setDataStatus(PublishEnum.PUBLISHED.getCode())
|
||||||
|
.setEffectFlag(EffectFlagEnum.EFFECT.code);
|
||||||
|
edFileInfoMapper.insertOrUpdate(newEdFileInfo);
|
||||||
|
String fileDestPath = getFileSysPath(newEdFileInfo.getId());
|
||||||
|
FileUtil.writeFromStream(file.getInputStream(), fileDestPath);
|
||||||
|
EleCommonUtil.encryptFile(fileDestPath, SecureUtil.aes(FILE_SEC_PASSWD.getBytes()));
|
||||||
|
finalEdFileInfo = newEdFileInfo;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
String info = StrFormatter.format("文件 {} 为上传到 {} 失败,原因 {},同名同后缀的处理方式为 {}", fileName, destPath, e.getMessage(), strategyStr);
|
||||||
|
newEdFileInfo.setParentId(parentId)
|
||||||
|
.setFileName(mainName)
|
||||||
|
.setSaveStatus(EleDataSaveStatusEnum.FAIL.code)
|
||||||
|
.setFileType(suffix)
|
||||||
|
.setFileVersion(0)
|
||||||
|
.setFileCode("")
|
||||||
|
.setDataOwn(dataOwnCode)
|
||||||
|
.setFileSize(file.getSize())
|
||||||
|
.setDataType(EleDataTypeEnum.FILE.code)
|
||||||
|
.setDataStatus(PublishEnum.PUBLISHED.getCode())
|
||||||
|
.setEffectFlag(EffectFlagEnum.NOT_EFFECTIVE.code);
|
||||||
|
edFileInfoMapper.insertOrUpdate(newEdFileInfo);
|
||||||
|
log.error(info, e);
|
||||||
|
throw new BizException(info);
|
||||||
|
}
|
||||||
|
UserThreadLocal.setSuccessInfo(Optional.ofNullable(finalEdFileInfo).map(EdFileInfo::getParentId).orElse(""),
|
||||||
|
Optional.ofNullable(finalEdFileInfo).map(EdFileInfo::getFileId).orElse(""),
|
||||||
|
"文件 {} 为上传到 {} 成功,同名同后缀的处理方式为 {},存入的文件名为 {}",
|
||||||
|
fileName,
|
||||||
|
destPath,
|
||||||
|
strategyStr,
|
||||||
|
Optional.ofNullable(finalEdFileInfo).map(EdFileInfo::getFileName).orElse(fileName) + "." + Optional.ofNullable(finalEdFileInfo).map(EdFileInfo::getFileType).orElse(suffix));
|
||||||
|
return ElectromagneticResultUtil.success(newEdFileInfo.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public EdFileInfo handUploadRepeatFile(String parentId, MultipartFile file, Integer strategy, int dataOwnCode) throws IOException {
|
||||||
|
String fileName = file.getOriginalFilename();
|
||||||
|
String mainName = FileUtil.mainName(fileName);
|
||||||
|
String suffix = FileUtil.getSuffix(fileName);
|
||||||
|
EdFileInfo newEdFileInfo = new EdFileInfo();
|
||||||
|
newEdFileInfo.newInit();
|
||||||
|
String timeStr = EleCommonUtil.getNowTimeStr();
|
||||||
|
newEdFileInfo.setFileName(mainName)
|
||||||
|
.setFileType(suffix)
|
||||||
|
.setFileContent(EleCommonUtil.parse(file.getInputStream(), suffix))
|
||||||
|
.setFileTime(timeStr)
|
||||||
|
.setFileSize(file.getSize())
|
||||||
|
.setDataType(EleDataTypeEnum.FILE.code)
|
||||||
|
.setDataStatus(PublishEnum.PUBLISHED.getCode())
|
||||||
|
.setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code)
|
||||||
|
.setDataOwn(dataOwnCode)
|
||||||
|
.setEffectFlag(EffectFlagEnum.EFFECT.code);
|
||||||
|
if (strategy == REVERSION.code) {
|
||||||
|
// 版本更新
|
||||||
|
// step1:找到同名文件的MySQL对象
|
||||||
|
List<EdFileInfo> parentFileInfos = edFileInfoMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class)
|
||||||
|
.eq(EdFileInfo::getParentId, parentId)
|
||||||
|
.eq(EdFileInfo::getFileName, mainName)
|
||||||
|
.eq(EdFileInfo::getFileType, suffix));
|
||||||
|
EdFileInfo parentFileInfo = edFileInfoMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class)
|
||||||
|
.eq(EdFileInfo::getId, parentId)
|
||||||
|
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code));
|
||||||
|
Integer maxFileVersion = Collections.max(parentFileInfos, Comparator.comparing(EdFileInfo::getFileVersion)).getFileVersion();
|
||||||
|
// 找到当前展示的版本
|
||||||
|
EdFileInfo effectFileInfo = parentFileInfos.stream().filter(e -> e.getEffectFlag().equals(EffectFlagEnum.EFFECT.code)).toList().get(0);
|
||||||
|
String codePathByDbPath = getCodePathByDbPath(effectFileInfo.getFilePath());
|
||||||
|
String fileCode = createFileCode(codePathByDbPath, suffix, FILE_START_VERSION, timeStr);
|
||||||
|
// 将原有效的版本置为false
|
||||||
|
edFileInfoMapper.update(new EdFileInfo(), Wrappers.lambdaUpdate(EdFileInfo.class)
|
||||||
|
.set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code)
|
||||||
|
.eq(EdFileInfo::getId, effectFileInfo.getId()));
|
||||||
|
// 新增文件
|
||||||
|
newEdFileInfo.setFileId(effectFileInfo.getFileId())
|
||||||
|
.setParentId(parentId)
|
||||||
|
.setFileCode(fileCode)
|
||||||
|
.setFileVersion(maxFileVersion + 1)
|
||||||
|
.setPreVersion(maxFileVersion)
|
||||||
|
.setFilePath(parentFileInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newEdFileInfo.getId())
|
||||||
|
.setFileCode(fileCode);
|
||||||
|
} else if (strategy == NEW.code) {
|
||||||
|
// 文件名加”_1“,存为新文件
|
||||||
|
EdFileInfo parentFileInfo = edFileInfoMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class)
|
||||||
|
.eq(EdFileInfo::getId, parentId)
|
||||||
|
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code));
|
||||||
|
String codePathByDbPath = getCodePathByDbPath(parentFileInfo.getFilePath());
|
||||||
|
String fileCode = createFileCode(codePathByDbPath, suffix, FILE_START_VERSION, newEdFileInfo.getFileTime());
|
||||||
|
newEdFileInfo.setParentId(parentId)
|
||||||
|
.setFileCode(fileCode)
|
||||||
|
.setFileVersion(FILE_START_VERSION)
|
||||||
|
.setFileSize(file.getSize())
|
||||||
|
.setFilePath(parentFileInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newEdFileInfo.getId())
|
||||||
|
.setFileCode(fileCode);
|
||||||
|
resetFileInfoName(newEdFileInfo);
|
||||||
|
} else if (strategy == IGNORE.code) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
throw new BizException("参数错误");
|
||||||
|
}
|
||||||
|
edFileInfoMapper.insert(newEdFileInfo);
|
||||||
|
String fileDestPath = getFileSysPath(newEdFileInfo.getId());
|
||||||
|
fileSystemService.save(file.getInputStream(), fileDestPath);
|
||||||
|
EleCommonUtil.encryptFile(fileDestPath, SecureUtil.aes(FILE_SEC_PASSWD.getBytes()));
|
||||||
|
return newEdFileInfo;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -829,8 +829,8 @@ public class EdFileInfoServiceImpl extends ServiceImpl<EdFileInfoMapper, EdFileI
|
||||||
.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e));
|
.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e));
|
||||||
maps.putAll(edFileInfos);
|
maps.putAll(edFileInfos);
|
||||||
}
|
}
|
||||||
List<EdFileInfo> resFiles = new ArrayList<>(maps.values());
|
Set<EdFileInfo> resFiles = new HashSet<>(maps.values());
|
||||||
String prjId = resFiles.get(0).getFilePath().split(MYSQL_FILE_PATH_SPLIT)[0];
|
String prjId = resFiles.stream().findFirst().get().getFilePath().split(MYSQL_FILE_PATH_SPLIT)[0];
|
||||||
List<EdFileInfo> prjFolders = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class)
|
List<EdFileInfo> prjFolders = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class)
|
||||||
.likeRight(EdFileInfo::getFilePath, prjId + MYSQL_FILE_PATH_SPLIT)
|
.likeRight(EdFileInfo::getFilePath, prjId + MYSQL_FILE_PATH_SPLIT)
|
||||||
.eq(EdFileInfo::getDataType, EleDataTypeEnum.FOLDER.code)
|
.eq(EdFileInfo::getDataType, EleDataTypeEnum.FOLDER.code)
|
||||||
|
|
@ -846,10 +846,10 @@ public class EdFileInfoServiceImpl extends ServiceImpl<EdFileInfoMapper, EdFileI
|
||||||
List<EdFileInfo> files = resFiles.stream().filter(e -> e.getDataType().equals(EleDataTypeEnum.FILE.code)).toList();
|
List<EdFileInfo> files = resFiles.stream().filter(e -> e.getDataType().equals(EleDataTypeEnum.FILE.code)).toList();
|
||||||
for (EdFileInfo edFileInfo : files) {
|
for (EdFileInfo edFileInfo : files) {
|
||||||
String filePath = commonService.getFileSysPath(edFileInfo.getId()); // file
|
String filePath = commonService.getFileSysPath(edFileInfo.getId()); // file
|
||||||
String destPath = userDownloadDataDir + File.separator + EXPORT_PRJ_NAME + "_" + nowTimeStr + File.separator + commonService.getDbPath(edFileInfo.getFilePath());
|
String destPath = userDownloadDataDir + File.separator + EXPORT_PRJ_NAME + "_" + nowTimeStr + File.separator + EXPORT_PRJ_NAME + File.separator + edFileInfo.getId();
|
||||||
fileSystemService.copyFile(filePath, destPath);
|
fileSystemService.copyFile(filePath, destPath);
|
||||||
}
|
}
|
||||||
String json = JSONUtil.toJsonStr(files);
|
String json = JSONUtil.toJsonStr(resFiles);
|
||||||
String mysqlFilePath = userDownloadDataDir + File.separator + EXPORT_PRJ_NAME + "_" + nowTimeStr + File.separator + PRJ_INFO + ".json";
|
String mysqlFilePath = userDownloadDataDir + File.separator + EXPORT_PRJ_NAME + "_" + nowTimeStr + File.separator + PRJ_INFO + ".json";
|
||||||
fileSystemService.writeStringToFile(mysqlFilePath, json);
|
fileSystemService.writeStringToFile(mysqlFilePath, json);
|
||||||
return files.stream().map(EdFileInfo::getId).toList();
|
return files.stream().map(EdFileInfo::getId).toList();
|
||||||
|
|
@ -866,94 +866,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl<EdFileInfoMapper, EdFileI
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public ElectromagneticResult<?> upload(String parentId, MultipartFile file, Integer strategy, int dataOwnCode) {
|
public ElectromagneticResult<?> upload(String parentId, MultipartFile file, Integer strategy, int dataOwnCode) {
|
||||||
Assert.isTrue(FileRepeatEnum.contains(strategy), "解决重名文件参数错误");
|
return commonService.upload(parentId, file, strategy, dataOwnCode);
|
||||||
String fileName = file.getOriginalFilename();
|
|
||||||
String mainName = FileUtil.mainName(fileName);
|
|
||||||
String suffix = FileUtil.getSuffix(fileName);
|
|
||||||
Assert.isTrue(StrUtil.isNotEmpty(suffix), "文件类型不能为空");
|
|
||||||
String destPath = commonService.getDbPathById(parentId);
|
|
||||||
String strategyStr = FileRepeatEnum.getDesc(strategy);
|
|
||||||
Assert.isTrue(!file.isEmpty(), StrFormatter.format("文件 {} 为空,文件上传到 {} 失败,同名同后缀的处理方式为 {}", fileName, destPath, strategyStr));
|
|
||||||
Assert.isTrue(EleCommonUtil.isFileNameValid(file.getOriginalFilename()), StrFormatter.format("文件 {} {},上传到 {} 失败,同名同后缀的处理方式为 {}", fileName, NAME_VALID_MSG, destPath, strategyStr));
|
|
||||||
// 查找下一层,看是否存在顶级定义相关文件,如果存在,则该层属于管理员层级定义的,不允许上传文件
|
|
||||||
LambdaQueryWrapper<EdFileInfo> queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class)
|
|
||||||
.eq(EdFileInfo::getParentId, parentId)
|
|
||||||
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)
|
|
||||||
.eq(EdFileInfo::getDataType, EleDataTypeEnum.FOLDER.code);
|
|
||||||
DataOwnEnum obj = DataOwnEnum.getEnumByCode(dataOwnCode);
|
|
||||||
switch (Objects.requireNonNull(obj)) {
|
|
||||||
case USER_FILE, USER_PRJ -> queryWrapper.eq(EdFileInfo::getDataOwn, DataOwnEnum.USER_PRJ.code);
|
|
||||||
case SYS_FILE, SYS_PRJ -> queryWrapper.eq(EdFileInfo::getDataOwn, DataOwnEnum.SYS_PRJ.code);
|
|
||||||
case REPO_PRJ, REPO_FILE -> queryWrapper.eq(EdFileInfo::getDataOwn, DataOwnEnum.REPO_PRJ.code);
|
|
||||||
default -> ElectromagneticResultUtil.fail("-1", "参数错误");
|
|
||||||
}
|
|
||||||
|
|
||||||
long dirCount = this.baseMapper.selectCount(queryWrapper);
|
|
||||||
Assert.isTrue(dirCount == 0, "文件 {} 上传到 {} 失败,层级结构不允许上传文件,同名同后缀的处理方式为 {}", fileName, destPath, strategyStr);
|
|
||||||
EdFileInfo newEdFileInfo = new EdFileInfo();
|
|
||||||
newEdFileInfo.newInit();
|
|
||||||
EdFileInfo finalEdFileInfo;
|
|
||||||
// 首先检查是否是同名文件
|
|
||||||
try {
|
|
||||||
Assert.isTrue(EleCommonUtil.isFileNameValid(fileName), NAME_VALID_MSG);
|
|
||||||
Long count = this.baseMapper.selectCount(Wrappers.lambdaQuery(EdFileInfo.class)
|
|
||||||
.eq(EdFileInfo::getParentId, parentId)
|
|
||||||
.eq(EdFileInfo::getFileName, mainName)
|
|
||||||
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)
|
|
||||||
.eq(EdFileInfo::getFileType, suffix));
|
|
||||||
if (count > 0) {
|
|
||||||
finalEdFileInfo = handUploadRepeatFile(parentId, file, strategy, dataOwnCode);
|
|
||||||
} else {
|
|
||||||
EdFileInfo parentFolderInfo = this.baseMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class)
|
|
||||||
.eq(EdFileInfo::getId, parentId)
|
|
||||||
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code));
|
|
||||||
|
|
||||||
String codePathByDbPath = commonService.getCodePathByDbPath(parentFolderInfo.getFilePath());
|
|
||||||
String fileCode = commonService.createFileCode(codePathByDbPath, suffix, FILE_START_VERSION, newEdFileInfo.getFileTime());
|
|
||||||
newEdFileInfo.setParentId(parentId)
|
|
||||||
.setFileCode(fileCode)
|
|
||||||
.setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code)
|
|
||||||
.setDataOwn(dataOwnCode)
|
|
||||||
.setFileName(mainName)
|
|
||||||
.setFileContent(EleCommonUtil.parse(file.getInputStream(), suffix))
|
|
||||||
.setFileType(suffix)
|
|
||||||
.setFileVersion(FILE_START_VERSION)
|
|
||||||
.setFileSize(file.getSize())
|
|
||||||
.setFilePath(parentFolderInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newEdFileInfo.getId())
|
|
||||||
.setDataType(EleDataTypeEnum.FILE.code)
|
|
||||||
.setDataStatus(PublishEnum.PUBLISHED.getCode())
|
|
||||||
.setEffectFlag(EffectFlagEnum.EFFECT.code);
|
|
||||||
this.saveOrUpdate(newEdFileInfo);
|
|
||||||
String fileDestPath = commonService.getFileSysPath(newEdFileInfo.getId());
|
|
||||||
FileUtil.writeFromStream(file.getInputStream(), fileDestPath);
|
|
||||||
EleCommonUtil.encryptFile(fileDestPath, SecureUtil.aes(FILE_SEC_PASSWD.getBytes()));
|
|
||||||
finalEdFileInfo = newEdFileInfo;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
String info = StrFormatter.format("文件 {} 为上传到 {} 失败,原因 {},同名同后缀的处理方式为 {}", fileName, destPath, e.getMessage(), strategyStr);
|
|
||||||
newEdFileInfo.setParentId(parentId)
|
|
||||||
.setFileName(mainName)
|
|
||||||
.setSaveStatus(EleDataSaveStatusEnum.FAIL.code)
|
|
||||||
.setFileType(suffix)
|
|
||||||
.setFileVersion(0)
|
|
||||||
.setFileCode("")
|
|
||||||
.setDataOwn(dataOwnCode)
|
|
||||||
.setFileSize(file.getSize())
|
|
||||||
.setDataType(EleDataTypeEnum.FILE.code)
|
|
||||||
.setDataStatus(PublishEnum.PUBLISHED.getCode())
|
|
||||||
.setEffectFlag(EffectFlagEnum.NOT_EFFECTIVE.code);
|
|
||||||
this.saveOrUpdate(newEdFileInfo);
|
|
||||||
log.error(info, e);
|
|
||||||
throw new BizException(info);
|
|
||||||
}
|
|
||||||
UserThreadLocal.setSuccessInfo(Optional.ofNullable(finalEdFileInfo).map(EdFileInfo::getParentId).orElse(""),
|
|
||||||
Optional.ofNullable(finalEdFileInfo).map(EdFileInfo::getFileId).orElse(""),
|
|
||||||
"文件 {} 为上传到 {} 成功,同名同后缀的处理方式为 {},存入的文件名为 {}",
|
|
||||||
fileName,
|
|
||||||
destPath,
|
|
||||||
strategyStr,
|
|
||||||
Optional.ofNullable(finalEdFileInfo).map(EdFileInfo::getFileName).orElse(fileName) + "." + Optional.ofNullable(finalEdFileInfo).map(EdFileInfo::getFileType).orElse(suffix));
|
|
||||||
return ElectromagneticResultUtil.success(newEdFileInfo.getId());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1247,77 +1160,6 @@ public class EdFileInfoServiceImpl extends ServiceImpl<EdFileInfoMapper, EdFileI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public EdFileInfo handUploadRepeatFile(String parentId, MultipartFile file, Integer strategy, int dataOwnCode) throws IOException {
|
|
||||||
String fileName = file.getOriginalFilename();
|
|
||||||
String mainName = FileUtil.mainName(fileName);
|
|
||||||
String suffix = FileUtil.getSuffix(fileName);
|
|
||||||
EdFileInfo newEdFileInfo = new EdFileInfo();
|
|
||||||
newEdFileInfo.newInit();
|
|
||||||
String timeStr = EleCommonUtil.getNowTimeStr();
|
|
||||||
newEdFileInfo.setFileName(mainName)
|
|
||||||
.setFileType(suffix)
|
|
||||||
.setFileContent(EleCommonUtil.parse(file.getInputStream(), suffix))
|
|
||||||
.setFileTime(timeStr)
|
|
||||||
.setFileSize(file.getSize())
|
|
||||||
.setDataType(EleDataTypeEnum.FILE.code)
|
|
||||||
.setDataStatus(PublishEnum.PUBLISHED.getCode())
|
|
||||||
.setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code)
|
|
||||||
.setDataOwn(dataOwnCode)
|
|
||||||
.setEffectFlag(EffectFlagEnum.EFFECT.code);
|
|
||||||
if (strategy == REVERSION.code) {
|
|
||||||
// 版本更新
|
|
||||||
// step1:找到同名文件的MySQL对象
|
|
||||||
List<EdFileInfo> parentFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class)
|
|
||||||
.eq(EdFileInfo::getParentId, parentId)
|
|
||||||
.eq(EdFileInfo::getFileName, mainName)
|
|
||||||
.eq(EdFileInfo::getFileType, suffix));
|
|
||||||
EdFileInfo parentFileInfo = this.baseMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class)
|
|
||||||
.eq(EdFileInfo::getId, parentId)
|
|
||||||
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code));
|
|
||||||
Integer maxFileVersion = Collections.max(parentFileInfos, Comparator.comparing(EdFileInfo::getFileVersion)).getFileVersion();
|
|
||||||
// 找到当前展示的版本
|
|
||||||
EdFileInfo effectFileInfo = parentFileInfos.stream().filter(e -> e.getEffectFlag().equals(EffectFlagEnum.EFFECT.code)).toList().get(0);
|
|
||||||
String codePathByDbPath = commonService.getCodePathByDbPath(effectFileInfo.getFilePath());
|
|
||||||
String fileCode = commonService.createFileCode(codePathByDbPath, suffix, FILE_START_VERSION, timeStr);
|
|
||||||
// 将原有效的版本置为false
|
|
||||||
this.baseMapper.update(new EdFileInfo(), Wrappers.lambdaUpdate(EdFileInfo.class)
|
|
||||||
.set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code)
|
|
||||||
.eq(EdFileInfo::getId, effectFileInfo.getId()));
|
|
||||||
// 新增文件
|
|
||||||
newEdFileInfo.setFileId(effectFileInfo.getFileId())
|
|
||||||
.setParentId(parentId)
|
|
||||||
.setFileCode(fileCode)
|
|
||||||
.setFileVersion(maxFileVersion + 1)
|
|
||||||
.setPreVersion(maxFileVersion)
|
|
||||||
.setFilePath(parentFileInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newEdFileInfo.getId())
|
|
||||||
.setFileCode(fileCode);
|
|
||||||
} else if (strategy == NEW.code) {
|
|
||||||
// 文件名加”_1“,存为新文件
|
|
||||||
EdFileInfo parentFileInfo = this.baseMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class)
|
|
||||||
.eq(EdFileInfo::getId, parentId)
|
|
||||||
.eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code));
|
|
||||||
String codePathByDbPath = commonService.getCodePathByDbPath(parentFileInfo.getFilePath());
|
|
||||||
String fileCode = commonService.createFileCode(codePathByDbPath, suffix, FILE_START_VERSION, newEdFileInfo.getFileTime());
|
|
||||||
newEdFileInfo.setParentId(parentId)
|
|
||||||
.setFileCode(fileCode)
|
|
||||||
.setFileVersion(FILE_START_VERSION)
|
|
||||||
.setFileSize(file.getSize())
|
|
||||||
.setFilePath(parentFileInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newEdFileInfo.getId())
|
|
||||||
.setFileCode(fileCode);
|
|
||||||
resetFileInfoName(newEdFileInfo);
|
|
||||||
} else if (strategy == IGNORE.code) {
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
throw new BizException("参数错误");
|
|
||||||
}
|
|
||||||
this.baseMapper.insert(newEdFileInfo);
|
|
||||||
String fileDestPath = commonService.getFileSysPath(newEdFileInfo.getId());
|
|
||||||
fileSystemService.save(file.getInputStream(), fileDestPath);
|
|
||||||
EleCommonUtil.encryptFile(fileDestPath, SecureUtil.aes(FILE_SEC_PASSWD.getBytes()));
|
|
||||||
return newEdFileInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String doSysFileMerge(String identifier, String fileName, Integer totalChunks, int dataOwnCode) {
|
private String doSysFileMerge(String identifier, String fileName, Integer totalChunks, int dataOwnCode) {
|
||||||
String currentUserId = UserThreadLocal.getUserId();
|
String currentUserId = UserThreadLocal.getUserId();
|
||||||
for (int i = 1; i <= totalChunks; i++) {
|
for (int i = 1; i <= totalChunks; i++) {
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,12 @@
|
||||||
package com.electromagnetic.industry.software.manage.service.serviceimpl;
|
package com.electromagnetic.industry.software.manage.service.serviceimpl;
|
||||||
|
|
||||||
import cn.hutool.core.io.FileUtil;
|
|
||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
import cn.hutool.core.text.StrFormatter;
|
import cn.hutool.core.text.StrFormatter;
|
||||||
import cn.hutool.core.util.StrUtil;
|
|
||||||
import cn.hutool.crypto.SecureUtil;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
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.*;
|
import com.electromagnetic.industry.software.common.enums.*;
|
||||||
import com.electromagnetic.industry.software.common.exception.BizException;
|
import com.electromagnetic.industry.software.common.exception.BizException;
|
||||||
import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
|
|
||||||
import com.electromagnetic.industry.software.common.util.*;
|
import com.electromagnetic.industry.software.common.util.*;
|
||||||
import com.electromagnetic.industry.software.manage.mapper.EdFileInfoMapper;
|
import com.electromagnetic.industry.software.manage.mapper.EdFileInfoMapper;
|
||||||
import com.electromagnetic.industry.software.manage.mapper.EdFileRelationMapper;
|
import com.electromagnetic.industry.software.manage.mapper.EdFileRelationMapper;
|
||||||
|
|
@ -20,7 +16,6 @@ import com.electromagnetic.industry.software.manage.pojo.models.Edge;
|
||||||
import com.electromagnetic.industry.software.manage.pojo.req.CheckNameUniqueRequest;
|
import com.electromagnetic.industry.software.manage.pojo.req.CheckNameUniqueRequest;
|
||||||
import com.electromagnetic.industry.software.manage.pojo.resp.FileRelationViewVO;
|
import com.electromagnetic.industry.software.manage.pojo.resp.FileRelationViewVO;
|
||||||
import com.electromagnetic.industry.software.manage.pojo.resp.FileSimpleInfoVO;
|
import com.electromagnetic.industry.software.manage.pojo.resp.FileSimpleInfoVO;
|
||||||
import com.electromagnetic.industry.software.manage.service.EdFileInfoService;
|
|
||||||
import com.electromagnetic.industry.software.manage.service.EdFileRelationService;
|
import com.electromagnetic.industry.software.manage.service.EdFileRelationService;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue