diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EdFileFavorite.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EdFileFavorite.java index 4ac9077..db67506 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EdFileFavorite.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EdFileFavorite.java @@ -4,11 +4,17 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.electromagnetic.industry.software.common.enums.EffectFlagEnum; +import com.electromagnetic.industry.software.common.util.EleCommonUtil; +import com.electromagnetic.industry.software.common.util.IdWorker; +import com.electromagnetic.industry.software.common.util.UserThreadLocal; import lombok.Data; +import java.util.Date; + @Data @TableName("ed_file_favorite") -public class EdFileFavorite { +public class EdFileFavorite extends BaseModel{ @TableId(type = IdType.ASSIGN_UUID) private String id; @@ -19,4 +25,15 @@ public class EdFileFavorite { @TableField("file_id") private String fileId; + public void newInit() { + String userId = UserThreadLocal.getUserId(); + String newId = IdWorker.getSnowFlakeIdString(); + Date now = new Date(); + this.setId(newId); + this.setCreatedTime(now); + this.setCreatedBy(userId); + this.setUpdatedTime(now); + this.setUpdatedBy(userId); + this.setEffectFlag(EffectFlagEnum.EFFECT.code); + } } diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EdFileRelation.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EdFileRelation.java index f834312..499fb85 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EdFileRelation.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EdFileRelation.java @@ -2,13 +2,18 @@ package com.electromagnetic.industry.software.manage.pojo.models; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import com.electromagnetic.industry.software.common.enums.EffectFlagEnum; +import com.electromagnetic.industry.software.common.util.IdWorker; +import com.electromagnetic.industry.software.common.util.UserThreadLocal; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.Date; + @EqualsAndHashCode(callSuper = true) @Data @TableName("ed_file_relation") -public class EdFileRelation extends BaseModel { +public class EdFileRelation extends BaseModel{ private String id; @@ -29,21 +34,15 @@ public class EdFileRelation extends BaseModel { */ private String relationship; -// /** -// * 创建者 用户id -// */ -// @TableField(value = "created_by") -// private String createdBy; -// -// @TableField(value = "created_at", fill = FieldFill.INSERT) -// private Date createdAt; -// -// /** -// * 更新者 用户id -// */ -// @TableField(value = "updated_by") -// private String updatedBy; -// -// @TableField(value = "updated_at", fill = FieldFill.UPDATE) -// private Date updatedAt; + public void newInit() { + String userId = UserThreadLocal.getUserId(); + String newId = IdWorker.getSnowFlakeIdString(); + Date now = new Date(); + this.setId(newId); + this.setCreatedTime(now); + this.setCreatedBy(userId); + this.setUpdatedTime(now); + this.setUpdatedBy(userId); + this.setEffectFlag(EffectFlagEnum.EFFECT.code); + } } diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/EdFileFavoriteService.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/EdFileFavoriteService.java index 95d3310..80069c5 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/EdFileFavoriteService.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/EdFileFavoriteService.java @@ -4,4 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.electromagnetic.industry.software.manage.pojo.models.EdFileFavorite; public interface EdFileFavoriteService extends IService { + + /** + * 逻辑删除 + * @param userId + * @param fileId + * @return + */ + public boolean logicRemove (String userId, String fileId); + } diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/CommonService.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/CommonService.java index 84d4130..daec140 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/CommonService.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/CommonService.java @@ -1,6 +1,7 @@ package com.electromagnetic.industry.software.manage.service.serviceimpl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.tree.Tree; 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.util.IdUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -30,12 +32,15 @@ import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import java.io.File; +import java.io.IOException; import java.util.*; import java.util.stream.Collectors; import static com.electromagnetic.industry.software.common.cons.ElectromagneticConstants.*; +import static com.electromagnetic.industry.software.common.enums.FileRepeatEnum.*; @Component public class CommonService { @@ -592,4 +597,168 @@ public class CommonService { } 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 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 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; + } + } diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileFavoriteServiceImpl.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileFavoriteServiceImpl.java index 3ebae53..f47b9ae 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileFavoriteServiceImpl.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileFavoriteServiceImpl.java @@ -1,6 +1,10 @@ package com.electromagnetic.industry.software.manage.service.serviceimpl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.electromagnetic.industry.software.common.enums.EffectFlagEnum; import com.electromagnetic.industry.software.manage.mapper.EdFileFavoriteMapper; import com.electromagnetic.industry.software.manage.pojo.models.EdFileFavorite; import com.electromagnetic.industry.software.manage.service.EdFileFavoriteService; @@ -8,4 +12,19 @@ import org.springframework.stereotype.Service; @Service public class EdFileFavoriteServiceImpl extends ServiceImpl implements EdFileFavoriteService { + + /** + * 逻辑删除 + * @param userId + * @param fileId + * @return + */ + public boolean logicRemove (String userId, String fileId) { + LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate(EdFileFavorite.class) + .eq(EdFileFavorite::getUserId, userId) + .eq(EdFileFavorite::getFileId, fileId) + .set(EdFileFavorite::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code); + return update(updateWrapper); + } + } diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileInfoServiceImpl.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileInfoServiceImpl.java index 02a2a8b..fb2595a 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileInfoServiceImpl.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileInfoServiceImpl.java @@ -866,94 +866,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl 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 = 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 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(true); + return commonService.upload(parentId, file, strategy, dataOwnCode); } /** @@ -1247,77 +1160,6 @@ public class EdFileInfoServiceImpl extends ServiceImpl 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) { String currentUserId = UserThreadLocal.getUserId(); for (int i = 1; i <= totalChunks; i++) { diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileRelationServiceImpl.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileRelationServiceImpl.java index 34eadcb..cbed1c2 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileRelationServiceImpl.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileRelationServiceImpl.java @@ -8,10 +8,7 @@ import cn.hutool.crypto.SecureUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.electromagnetic.industry.software.common.enums.EffectFlagEnum; -import com.electromagnetic.industry.software.common.enums.EleDataSaveStatusEnum; -import com.electromagnetic.industry.software.common.enums.EleDataTypeEnum; -import com.electromagnetic.industry.software.common.enums.PublishEnum; +import com.electromagnetic.industry.software.common.enums.*; import com.electromagnetic.industry.software.common.exception.BizException; import com.electromagnetic.industry.software.common.resp.ElectromagneticResult; import com.electromagnetic.industry.software.common.util.*; @@ -37,7 +34,6 @@ import static com.electromagnetic.industry.software.common.cons.ElectromagneticC @Service public class EdFileRelationServiceImpl extends ServiceImpl implements EdFileRelationService { - private final EleLog log = new EleLog(EdFileInfoServiceImpl.class); @Resource EdFileInfoMapper edFileInfoMapper; @Resource @@ -50,6 +46,7 @@ public class EdFileRelationServiceImpl extends ServiceImpl list = this.list(queryWrapper); - if (!list.isEmpty()) { + EdFileRelation relation = this.getOne(queryWrapper); + if (relation != null && relation.getEffectFlag().equals(EffectFlagEnum.EFFECT.code)) { throw new BizException("请勿重复建立关系"); } - edFileRelation.setId(IdWorker.getSnowFlakeIdString()); - edFileRelation.setCreatedBy(UserThreadLocal.getUserId()); - boolean isSaved = this.save(edFileRelation); + boolean isSaved; + if (relation != null) { + relation.setRelationship(edFileRelation.getRelationship()); + relation.setEffectFlag(EffectFlagEnum.EFFECT.code); + isSaved = this.updateById(relation); + } else { + EdFileRelation newRelation = new EdFileRelation(); + newRelation.newInit(); + BeanUtils.copyProperties(edFileRelation, newRelation); + isSaved = this.save(newRelation); + } if (isSaved) { - EdFileInfo fileInfo = edFileInfoMapper.selectById(edFileRelation.getId()); - UserThreadLocal.setSuccessInfo(Optional.ofNullable(fileInfo).map(EdFileInfo::getParentId).orElse(""), edFileRelation.getId(), StrFormatter.format("关联了文件")); + UserThreadLocal.setSuccessInfo("", edFileRelation.getId(), StrFormatter.format("关联了文件")); } return isSaved; } @@ -87,10 +91,17 @@ public class EdFileRelationServiceImpl extends ServiceImpl getEdges(String id) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(EdFileRelation::getId1, id) - .or() - .eq(EdFileRelation::getId2, id); + queryWrapper.eq(EdFileRelation::getEffectFlag, EffectFlagEnum.EFFECT.code) + .and(wrapper -> wrapper.eq(EdFileRelation::getId1, id) + .or() + .eq(EdFileRelation::getId2, id)); + List list = this.list(queryWrapper); List edges = new ArrayList<>(); for (EdFileRelation edFileRelation : list) { @@ -214,7 +228,6 @@ public class EdFileRelationServiceImpl extends ServiceImpl uploadResult = commonService.upload(parentId, file, FileRepeatEnum.NEW.code, dataOwnCode); + Assert.notNull(uploadResult.getData(), "上传失败"); + String relatedFileId = (String) uploadResult.getData(); + // 创建文件关系 + EdFileRelation relation = new EdFileRelation(); + relation.newInit(); + relation.setId1(id); + relation.setId2(relatedFileId); + relation.setRelationship(desc); + createRelation(relation); + UserThreadLocal.setSuccessInfo("", id, StrFormatter.format("建立了文件 {} 与文件 {} 的关系", id, relatedFileId)); return ElectromagneticResultUtil.success(true); } } diff --git a/electromagnetic-common/pom.xml b/electromagnetic-common/pom.xml index bc6e346..39d1e96 100644 --- a/electromagnetic-common/pom.xml +++ b/electromagnetic-common/pom.xml @@ -31,8 +31,8 @@ org.bouncycastle - bcprov-jdk16 - 1.46 + bcprov-jdk18on + 1.77 cn.hutool