创建文件需要存到filestorge

This commit is contained in:
2025-11-10 10:30:25 +08:00
parent 216316b9c4
commit f579579da7
12 changed files with 134 additions and 96 deletions

View File

@@ -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 {
/**

View File

@@ -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;
}
}

View File

@@ -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;

View File

@@ -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")

View File

@@ -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 = "文件名")

View File

@@ -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;
}

View File

@@ -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;
/**

View File

@@ -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<FileMetadataInfo> fileMetaDataQuery = new LambdaQueryWrapper<>();
fileMetaDataQuery.select(FileMetadataInfo::getId).likeRight(FileMetadataInfo::getObjectKey, dirMinioObjectKey);
List<Long> deleteFileIdList = fileMetadataInfoService.listObjs(fileMetaDataQuery, id -> (Long) id);
// 数据库批量删除文件信息
LambdaQueryWrapper<FileStorage> fileMetaDataQuery = new LambdaQueryWrapper<>();
fileMetaDataQuery.select(FileStorage::getFileId).eq(FileStorage::getDirId, deleteDirId);
List<Long> 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 approveAction1新增 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;

View File

@@ -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;
}

View File

@@ -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<FileStorage>().eq(FileStorage::getFileId, metadata.getId()));
fileMetadataExtensionService.remove(new LambdaQueryWrapper<FileMetadataExtension>().eq(FileMetadataExtension::getTFilemetaId, metadata.getId()));
fileUserPermissionService.remove(new LambdaQueryWrapper<FileUserPermission>().eq(FileUserPermission::getTFilemetaId, metadata.getId()));

View File

@@ -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<FileStorage>().eq(FileStorage::getFileId, metadata.getId()));
fileMetadataExtensionService.remove(new LambdaQueryWrapper<FileMetadataExtension>().eq(FileMetadataExtension::getTFilemetaId, metadata.getId()));
fileUserPermissionService.remove(new LambdaQueryWrapper<FileUserPermission>().eq(FileUserPermission::getTFilemetaId, metadata.getId()));
return true;

View File

@@ -5,10 +5,10 @@
<insert id="batchAddSimulationNodes" useGeneratedKeys="true" keyProperty="id">
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
<foreach collection='list' item='addNode' index='index' separator=','>
(#{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},