diff --git a/common/src/main/java/com/sdm/common/common/Constants.java b/common/src/main/java/com/sdm/common/common/Constants.java index 29fc175d..eaa07fad 100644 --- a/common/src/main/java/com/sdm/common/common/Constants.java +++ b/common/src/main/java/com/sdm/common/common/Constants.java @@ -50,72 +50,6 @@ public class Constants { } } - @Schema(description = "文件业务类型枚举") - public enum FileBizType { - /** - * 模型文件 - */ - @Schema(description = "模型文件", example = "1") - MODEL_FILE(1), - - /** - * 仿真报告 - */ - @Schema(description = "仿真报告", example = "2") - REPORT_FILE(2), - - /** - * 计算文件 - */ - @Schema(description = "计算文件", example = "3") - COMPUTE_FILE(3), - - /** - * 曲线文件 - */ - @Schema(description = "曲线文件", example = "4") - CURVE_FILE(4), - /** - * 云图文件 - */ - @Schema(description = "云图文件", example = "5") - CLOUD_FILE(5), - - /** - * 网格文件 - */ - @Schema(description = "网格文件", example = "6") - GRID_FILE(6), - - /** - * 计算过程文件 - */ - @Schema(description = "计算过程文件", example = "7") - COMPUTE_PROCESS_FILE(7), - - /** - * 项目文件 - */ - @Schema(description = "项目 文件", example = "6") - PROJECT_FILE(101), - - /** - * 学科文件 - */ - @Schema(description = "学科 文件", example = "7") - DISCIPLINE_MAJOR_FILE(102); - - int value; - - FileBizType(int i) { - value = i; - } - - public int getValue() { - return value; - } - } - @Schema(description = "文件夹类型枚举") public enum DirType { /** diff --git a/common/src/main/java/com/sdm/common/entity/enums/FileBizTypeEnum.java b/common/src/main/java/com/sdm/common/entity/enums/FileBizTypeEnum.java new file mode 100644 index 00000000..39da2f07 --- /dev/null +++ b/common/src/main/java/com/sdm/common/entity/enums/FileBizTypeEnum.java @@ -0,0 +1,70 @@ +package com.sdm.common.entity.enums; + +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "文件业务类型枚举") + +public enum FileBizTypeEnum { + /** + * 模型文件 + */ + @Schema(description = "模型文件", example = "1") + MODEL_FILE(1), + + /** + * 仿真报告 + */ + @Schema(description = "仿真报告", example = "2") + REPORT_FILE(2), + + /** + * 计算文件 + */ + @Schema(description = "计算文件", example = "3") + COMPUTE_FILE(3), + + /** + * 曲线文件 + */ + @Schema(description = "曲线文件", example = "4") + CURVE_FILE(4), + /** + * 云图文件 + */ + @Schema(description = "云图文件", example = "5") + CLOUD_FILE(5), + + /** + * 网格文件 + */ + @Schema(description = "网格文件", example = "6") + GRID_FILE(6), + + /** + * 计算过程文件 + */ + @Schema(description = "计算过程文件", example = "7") + COMPUTE_PROCESS_FILE(7), + + /** + * 项目文件 + */ + @Schema(description = "项目 文件", example = "101") + PROJECT_FILE(101), + + /** + * 学科文件 + */ + @Schema(description = "学科 文件", example = "102") + DISCIPLINE_MAJOR_FILE(102); + + int value; + + FileBizTypeEnum(int i) { + value = i; + } + + public int getValue() { + return value; + } +} diff --git a/data/src/main/java/com/sdm/data/model/entity/FileMetadataInfo.java b/data/src/main/java/com/sdm/data/model/entity/FileMetadataInfo.java index 49c480c6..a4df95f4 100644 --- a/data/src/main/java/com/sdm/data/model/entity/FileMetadataInfo.java +++ b/data/src/main/java/com/sdm/data/model/entity/FileMetadataInfo.java @@ -77,7 +77,7 @@ public class FileMetadataInfo implements Serializable { @TableField("fileStatus") private Integer fileStatus; - @Schema(description= "文件数据类型(仅文件有效,data_type=1时非空,标识模型文件/仿真报告/计算文件/结果曲线/结果云图)") + @Schema(description= "文件业务类型(1:模型文件 2:仿真报告、3:计算文件、4:曲线文件、5:云图文件,6:网格文件,7:计算过程文件)") @TableField("fileType") private Integer fileType; diff --git a/data/src/main/java/com/sdm/data/model/entity/FileStorage.java b/data/src/main/java/com/sdm/data/model/entity/FileStorage.java index 12d3ac76..bffb38a1 100644 --- a/data/src/main/java/com/sdm/data/model/entity/FileStorage.java +++ b/data/src/main/java/com/sdm/data/model/entity/FileStorage.java @@ -58,9 +58,9 @@ public class FileStorage implements Serializable { @TableField("fileSuffix") private String fileSuffix; - @ApiModelProperty(value = "文件业务类型(如模型文件、仿真报告、计算文件、曲线文件、云图文件)") + @ApiModelProperty(value = "文件业务类型(1:模型文件 2:仿真报告、3:计算文件、4:曲线文件、5:云图文件,6:网格文件,7:计算过程文件)") @TableField("fileBizType") - private String fileBizType; + private Integer fileBizType; @ApiModelProperty(value = "文件大小(字节数,存储占用计算依据)") @TableField("fileSize") diff --git a/data/src/main/java/com/sdm/data/model/req/GetSimulationTaskFileReq.java b/data/src/main/java/com/sdm/data/model/req/GetSimulationTaskFileReq.java index bcc29029..87e7a50a 100644 --- a/data/src/main/java/com/sdm/data/model/req/GetSimulationTaskFileReq.java +++ b/data/src/main/java/com/sdm/data/model/req/GetSimulationTaskFileReq.java @@ -1,7 +1,7 @@ package com.sdm.data.model.req; import com.fasterxml.jackson.annotation.JsonFormat; -import com.sdm.common.common.Constants; +import com.sdm.common.entity.enums.FileBizTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -12,7 +12,7 @@ public class GetSimulationTaskFileReq extends BaseReq { @Schema(description = "文件所属项目节点uuid") private String uuid; - @Schema(description = "文件类型", implementation = Constants.FileBizType.class) + @Schema(description = "文件类型", implementation = FileBizTypeEnum.class) Integer fileBizType; @Schema(description = "文件名") diff --git a/data/src/main/java/com/sdm/data/model/req/QueryBigFileReq.java b/data/src/main/java/com/sdm/data/model/req/QueryBigFileReq.java index 99803aaa..2cc62fd1 100644 --- a/data/src/main/java/com/sdm/data/model/req/QueryBigFileReq.java +++ b/data/src/main/java/com/sdm/data/model/req/QueryBigFileReq.java @@ -40,6 +40,6 @@ public class QueryBigFileReq extends BaseReq{ private String fileSuffix; @Schema(description = "文件业务类型(1:模型文件 2:仿真报告、3:计算文件、4:曲线文件、5:云图文件,6:网格文件,7:计算过程文件)") - private String fileBizType; + private Integer fileBizType; } diff --git a/data/src/main/java/com/sdm/data/model/req/UploadFilesReq.java b/data/src/main/java/com/sdm/data/model/req/UploadFilesReq.java index 37e337f9..e8aaaa4c 100644 --- a/data/src/main/java/com/sdm/data/model/req/UploadFilesReq.java +++ b/data/src/main/java/com/sdm/data/model/req/UploadFilesReq.java @@ -1,7 +1,7 @@ package com.sdm.data.model.req; import com.alibaba.fastjson2.annotation.JSONField; -import com.sdm.common.common.Constants; +import com.sdm.common.entity.enums.FileBizTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import org.springframework.web.multipart.MultipartFile; @@ -58,7 +58,7 @@ public class UploadFilesReq { @Schema(description = "文件名") private String fileName; - @Schema(description = "文件类型 1:模型文件 2:仿真报告 3:计算文件 4:曲线文件 5:云图文件",implementation = Constants.FileBizType.class) + @Schema(description = "文件类型 1:模型文件 2:仿真报告 3:计算文件 4:曲线文件 5:云图文件",implementation = FileBizTypeEnum.class) private Integer fileType; /** diff --git a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java index 9e1cd1bc..a0b898ce 100644 --- a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java +++ b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java @@ -99,6 +99,9 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { @Autowired private DataStorageAnalysis dataStorageAnalysis; + @Autowired + IFileStorageService fileStorageService; + @Autowired private ApproveStrategyFactory approveStrategyFactory; @@ -154,7 +157,8 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { minioService, fileMetadataInfoService, fileMetadataExtensionService, - fileUserPermissionService + fileUserPermissionService, + fileStorageService ); // 获取并执行审批结果 @@ -486,20 +490,24 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { } String dirMinioObjectKey = deleteDirMetadataInfo.getObjectKey(); + Long deleteDirId = deleteDirMetadataInfo.getId(); - boolean hasDeletePermission = fileUserPermissionService.hasFilePermission(deleteDirMetadataInfo.getId(), ThreadLocalContext.getUserId(), Constants.FilePermission.DELETE); + boolean hasDeletePermission = fileUserPermissionService.hasFilePermission(deleteDirId, ThreadLocalContext.getUserId(), Constants.FilePermission.DELETE); if (!hasDeletePermission) { return SdmResponse.failed("没有删除权限"); } - // mysql数据库批量删除文件信息 - LambdaQueryWrapper fileMetaDataQuery = new LambdaQueryWrapper<>(); - fileMetaDataQuery.select(FileMetadataInfo::getId).likeRight(FileMetadataInfo::getObjectKey, dirMinioObjectKey); - List deleteFileIdList = fileMetadataInfoService.listObjs(fileMetaDataQuery, id -> (Long) id); + // 数据库批量删除文件信息 + LambdaQueryWrapper fileMetaDataQuery = new LambdaQueryWrapper<>(); + fileMetaDataQuery.select(FileStorage::getFileId).eq(FileStorage::getDirId, deleteDirId); + List deleteFileIdList = fileStorageService.listObjs(fileMetaDataQuery, id -> (Long) id); + + fileMetadataInfoService.removeByIds(deleteFileIdList); fileMetadataExtensionService.lambdaUpdate().in(FileMetadataExtension::getTFilemetaId, deleteFileIdList).remove(); + fileStorageService.lambdaUpdate().eq(FileStorage::getDirId, deleteDirId).remove(); - // mysql数据库批量删除权限信息 + // 数据库批量删除权限信息 fileUserPermissionService.lambdaUpdate().in(FileUserPermission::getTFilemetaId, deleteFileIdList).remove(); // minio文件系统批量删除文件 @@ -986,13 +994,33 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { fileInfo.setFileGroupId(fileInfo.getId()); fileMetadataInfoService.updateById(fileInfo); + // 循环查询当前文件每一级父目录id,并保存为一条file_storage,用户后续文件搜索统计 + Long parentDirId = dirMetadataInfo.getId(); + FileStorage fileStorage = new FileStorage(); + + fileStorage.setFileId(fileInfo.getId()); + fileStorage.setFileName(fileInfo.getOriginalName()); + fileStorage.setUserId(ThreadLocalContext.getUserId()); + fileStorage.setFileBizType(fileInfo.getFileType()); + // 文件后缀 + fileStorage.setFileSuffix(getSuffixWithoutDot(fileInfo.getOriginalName())); + fileStorage.setFileSize(req.getFile().getSize()); + while (parentDirId != null) { + fileStorage.setDirId(parentDirId); + fileStorageService.save(fileStorage); + parentDirId = fileMetadataInfoService.lambdaQuery().eq(FileMetadataInfo::getId, parentDirId).oneOpt() + .map(FileMetadataInfo::getParentId) + .orElse(null); + } + + + // 调用审批流,开启审批; 上面先入库拿到主键id,审批流创建失败后再回退数据 // String templateId, String templateName,String approveContents,int approveAction:1:新增 2:修改 3:删除 String approveContents = getApproveContents(fileInfo.getId(), "知识库文件新增", NumberConstants.ONE, fileInfo, null); boolean approveResult = launchFileDataApprove(req.getTemplateId(), req.getTemplateName(), approveContents, NumberConstants.ONE); if(!approveResult){ log.error("uploadFiles create approveInit failed, params :{}", JSONObject.toJSONString(req)); - fileMetadataInfoService.removeById(fileInfo.getId()); // - 回退MinIO中已上传的文件(删除该文件)。catch 里统一操作了 //- 新增 file_metadata_info 信息不入表。 //- 向前端返回“上传文件失败”。 @@ -1027,6 +1055,14 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { } } + public static String getSuffixWithoutDot(String fileName) { + int lastDotIndex = fileName.lastIndexOf('.'); + if (lastDotIndex == -1) { + return ""; // 无后缀名时返回空字符串 + } + return fileName.substring(lastDotIndex + 1); + } + @Override public SdmResponse downloadRecord(AddDownloadRecordReq req) { return null; diff --git a/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/ApproveContext.java b/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/ApproveContext.java index 8bb67336..7e5367d4 100644 --- a/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/ApproveContext.java +++ b/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/ApproveContext.java @@ -1,10 +1,7 @@ package com.sdm.data.service.impl.dataFileHandle; import com.sdm.data.model.entity.FileMetadataInfo; -import com.sdm.data.service.IFileMetadataExtensionService; -import com.sdm.data.service.IFileMetadataInfoService; -import com.sdm.data.service.IFileUserPermissionService; -import com.sdm.data.service.IMinioService; +import com.sdm.data.service.*; import lombok.AllArgsConstructor; import lombok.Data; @@ -17,4 +14,5 @@ public class ApproveContext { private IFileMetadataInfoService fileMetadataInfoService; private IFileMetadataExtensionService fileMetadataExtensionService; private IFileUserPermissionService fileUserPermissionService; + private IFileStorageService fileStorageService; } diff --git a/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/DeleteApproveStrategy.java b/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/DeleteApproveStrategy.java index 941070c8..62f3fa45 100644 --- a/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/DeleteApproveStrategy.java +++ b/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/DeleteApproveStrategy.java @@ -5,11 +5,9 @@ import com.sdm.common.entity.constants.NumberConstants; import com.sdm.common.entity.enums.ApproveFileDataTypeEnum; import com.sdm.data.model.entity.FileMetadataExtension; import com.sdm.data.model.entity.FileMetadataInfo; +import com.sdm.data.model.entity.FileStorage; import com.sdm.data.model.entity.FileUserPermission; -import com.sdm.data.service.IFileMetadataExtensionService; -import com.sdm.data.service.IFileMetadataInfoService; -import com.sdm.data.service.IFileUserPermissionService; -import com.sdm.data.service.IMinioService; +import com.sdm.data.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -26,6 +24,7 @@ public class DeleteApproveStrategy implements ApproveStrategy { IMinioService minioService = context.getMinioService(); IFileMetadataExtensionService fileMetadataExtensionService = context.getFileMetadataExtensionService(); IFileUserPermissionService fileUserPermissionService = context.getFileUserPermissionService(); + IFileStorageService fileStorageService = context.getFileStorageService(); // 审批通过 if (NumberConstants.TWO == status) { @@ -33,6 +32,7 @@ public class DeleteApproveStrategy implements ApproveStrategy { minioService.deleteFile(metadata.getObjectKey()); // 删除数据库记录 service.removeById(metadata.getId()); + fileStorageService.remove(new LambdaQueryWrapper().eq(FileStorage::getFileId, metadata.getId())); fileMetadataExtensionService.remove(new LambdaQueryWrapper().eq(FileMetadataExtension::getTFilemetaId, metadata.getId())); fileUserPermissionService.remove(new LambdaQueryWrapper().eq(FileUserPermission::getTFilemetaId, metadata.getId())); diff --git a/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/UploadApproveStrategy.java b/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/UploadApproveStrategy.java index 5388534f..2e8f0c15 100644 --- a/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/UploadApproveStrategy.java +++ b/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/UploadApproveStrategy.java @@ -5,11 +5,9 @@ import com.sdm.common.entity.constants.NumberConstants; import com.sdm.common.entity.enums.ApproveFileDataTypeEnum; import com.sdm.data.model.entity.FileMetadataExtension; import com.sdm.data.model.entity.FileMetadataInfo; +import com.sdm.data.model.entity.FileStorage; import com.sdm.data.model.entity.FileUserPermission; -import com.sdm.data.service.IFileMetadataExtensionService; -import com.sdm.data.service.IFileMetadataInfoService; -import com.sdm.data.service.IFileUserPermissionService; -import com.sdm.data.service.IMinioService; +import com.sdm.data.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -24,6 +22,7 @@ public class UploadApproveStrategy implements ApproveStrategy { IMinioService minioService = context.getMinioService(); IFileMetadataExtensionService fileMetadataExtensionService = context.getFileMetadataExtensionService(); IFileUserPermissionService fileUserPermissionService = context.getFileUserPermissionService(); + IFileStorageService fileStorageService = context.getFileStorageService(); // 审批通过 @@ -40,6 +39,7 @@ public class UploadApproveStrategy implements ApproveStrategy { minioService.deleteFile(metadata.getObjectKey()); // 删除数据库记录 service.removeById(metadata.getId()); + fileStorageService.remove(new LambdaQueryWrapper().eq(FileStorage::getFileId, metadata.getId())); fileMetadataExtensionService.remove(new LambdaQueryWrapper().eq(FileMetadataExtension::getTFilemetaId, metadata.getId())); fileUserPermissionService.remove(new LambdaQueryWrapper().eq(FileUserPermission::getTFilemetaId, metadata.getId())); return true; diff --git a/project/src/main/resources/mapper/SimulationProjectMapper.xml b/project/src/main/resources/mapper/SimulationProjectMapper.xml index 28668f4f..e76089c0 100644 --- a/project/src/main/resources/mapper/SimulationProjectMapper.xml +++ b/project/src/main/resources/mapper/SimulationProjectMapper.xml @@ -5,10 +5,10 @@ insert into simulation_node - (uuid,nodeName,nodeCode,englishName,nodeType,nodeSubType,nodeStatus,parentId,folderId,nodeLevel,beginTime,endTime,finishTime,progress, + (uuid,ownRootNodeUuid,nodeName,nodeCode,englishName,nodeType,nodeSubType,nodeStatus,parentId,folderId,nodeLevel,beginTime,endTime,finishTime,progress, achieveStatus,nodeVersion,tenantId,description,detailImgUrl,creator,create_time,tag1,tag2,tag3,tag4,tag5,tag6,tag7,tag8,tag9,tag10) values - (#{addNode.uuid},#{addNode.nodeName},#{addNode.nodeCode},#{addNode.englishName},#{addNode.nodeType},#{addNode.nodeSubType},'0',#{addNode.parentId}, + (#{addNode.uuid},#{addNode.ownRootNodeUuid},#{addNode.nodeName},#{addNode.nodeCode},#{addNode.englishName},#{addNode.nodeType},#{addNode.nodeSubType},'0',#{addNode.parentId}, '',1,#{addNode.beginTime},#{addNode.endTime},'',1,#{addNode.achieveStatus},'1',#{addNode.tenantId},#{addNode.description}, #{addNode.detailImgUrl},#{addNode.creator},#{addNode.createTime},#{addNode.Tag1,typeHandler=com.sdm.project.handler.ListStringTypeHandler},#{addNode.Tag2,typeHandler=com.sdm.project.handler.ListStringTypeHandler}, #{addNode.Tag3,typeHandler=com.sdm.project.handler.ListStringTypeHandler},#{addNode.Tag4,typeHandler=com.sdm.project.handler.ListStringTypeHandler},