修改:只有知识库文件需要审核; 修改/删除/ 审核中数据给前端展示;修改抛异常事务不生效问题修改;systerm审批回调日志增加

This commit is contained in:
yangyang01000846
2025-11-11 12:59:07 +08:00
parent f5116bb15a
commit 525bc8b1cc
3 changed files with 143 additions and 86 deletions

View File

@@ -69,7 +69,13 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
private static final List<DirTypeEnum> INIT_DIR = List.of(
DirTypeEnum.KNOWLEDGE_BASE_DIR, DirTypeEnum.PROJECT_NODE_DIR,
DirTypeEnum.AVATAR_DIR, DirTypeEnum.SIMULATION_PARAMETER_DIR, DirTypeEnum.TRAIN_MODEL_DIR);
// fileData 知识库文件列表可见的数据
private final List<Integer> fileDatdList = Arrays.asList(
NumberConstants.ZERO,
NumberConstants.TWO,
NumberConstants.THREE,
NumberConstants.FOUR
);
@Value("${fileSystem.minio}")
private String type;
@@ -541,25 +547,41 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
return SdmResponse.failed("文件不存在");
}
// 文件夹
FileMetadataInfo dirMetadataInfo = fileMetadataInfoService.lambdaQuery().eq(FileMetadataInfo::getId, deleteFileMetadataInfo.getParentId()).eq(FileMetadataInfo::getDataType, DataTypeEnum.DIRECTORY.getValue()).one();
String deleteFileMinioObejctKey = deleteFileMetadataInfo.getObjectKey();
boolean hasDeletePermission = fileUserPermissionService.hasFilePermission(deleteFileMetadataInfo.getId(), ThreadLocalContext.getUserId(), FilePermissionEnum.DELETE);
if (!hasDeletePermission) {
return SdmResponse.failed("没有删除权限");
}
// 发送审批电子流,成功继续西面操作,失败直接返回
// String templateId, String templateName,String approveContents,int approveAction1新增 2修改 3删除
String approveContents = getApproveContents(delFileId, "知识库文件删除", NumberConstants.THREE, deleteFileMetadataInfo, null);
Pair<Boolean, String> approvePair = launchFileDataApprove(req.getTemplateId(), req.getTemplateName(), approveContents, NumberConstants.THREE);
if(!approvePair.getLeft()|| org.apache.commons.lang3.StringUtils.isBlank(approvePair.getRight())) {
log.error("delFile approveInit failed, params :{}", JSONObject.toJSONString(req));
throw new RuntimeException("文件删除,创建审批流失败,cidFlowId:"+approvePair.getRight());
// 知识库
if(dirMetadataInfo!=null&&Objects.equals(NumberConstants.ONE, dirMetadataInfo.getDirType())){
// 发送审批电子流,成功继续西面操作,失败直接返回
// String templateId, String templateName,String approveContents,int approveAction1新增 2修改 3删除
String approveContents = getApproveContents(delFileId, "知识库文件删除", NumberConstants.THREE, deleteFileMetadataInfo, null);
Pair<Boolean, String> approvePair = launchFileDataApprove(req.getTemplateId(), req.getTemplateName(), approveContents, NumberConstants.THREE);
if(!approvePair.getLeft()|| org.apache.commons.lang3.StringUtils.isBlank(approvePair.getRight())) {
log.error("delFile approveInit failed, params :{}", JSONObject.toJSONString(req));
throw new RuntimeException("文件删除,创建审批流失败,cidFlowId:"+approvePair.getRight());
}
deleteFileMetadataInfo.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
deleteFileMetadataInfo.setApproveType(ApproveFileDataTypeEnum.DELETE_REVIEWING.getCode());
deleteFileMetadataInfo.setCidFlowId(approvePair.getRight());
fileMetadataInfoService.updateById(deleteFileMetadataInfo);
return SdmResponse.success("操作成功,删除文件待审批");
}else{
// 删除MinIO文件
minioService.deleteFile(deleteFileMetadataInfo.getObjectKey());
// 删除数据库记录
fileMetadataInfoService.removeById(deleteFileMetadataInfo.getId());
fileStorageService.remove(new LambdaQueryWrapper<FileStorage>().eq(FileStorage::getFileId, deleteFileMetadataInfo.getId()));
fileMetadataExtensionService.remove(new LambdaQueryWrapper<FileMetadataExtension>().eq(FileMetadataExtension::getTFilemetaId, deleteFileMetadataInfo.getId()));
fileUserPermissionService.remove(new LambdaQueryWrapper<FileUserPermission>().eq(FileUserPermission::getTFilemetaId, deleteFileMetadataInfo.getId()));
return SdmResponse.success("操作成功");
}
deleteFileMetadataInfo.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
deleteFileMetadataInfo.setApproveType(ApproveFileDataTypeEnum.DELETE_REVIEWING.getCode());
deleteFileMetadataInfo.setCidFlowId(approvePair.getRight());
fileMetadataInfoService.updateById(deleteFileMetadataInfo);
return SdmResponse.success("操作成功,删除文件待审批");
} catch (Exception e) {
log.error("删除文件失败", e);
throw new RuntimeException("删除文件失败: " + e.getMessage(), e);
@@ -600,7 +622,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
.in(FileMetadataInfo::getId, fileIdList)
.eq(FileMetadataInfo::getIsLatest, FileIsLastEnum.YES.getValue())
// 这里是知识库文件只展示已经审批通过的文件
.eq(FileMetadataInfo::getApproveType, NumberConstants.ZERO)
.in(FileMetadataInfo::getApproveType,fileDatdList)
.list();
PageDataResp<List<FileMetadataInfo>> page = new PageDataResp<>();
page.setData(files);
@@ -650,7 +672,8 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
.eq(ObjectUtils.isNotEmpty(req.getQueryTarget()), FileMetadataInfo::getDataType, req.getQueryTarget())
.like(ObjectUtils.isNotEmpty(req.getFileName()), FileMetadataInfo::getOriginalName, req.getFileName())
.eq(FileMetadataInfo::getIsLatest, FileIsLastEnum.YES.getValue())
.eq(FileMetadataInfo::getApproveType, NumberConstants.ZERO)
// 审核完成 ,元数据修改审核中,文件修改审核中,删除文件审核中
.in(FileMetadataInfo::getApproveType,fileDatdList)
.list();
if (ObjectUtils.isEmpty(list)) {
list.forEach(fileMetadataInfo -> {
@@ -989,8 +1012,14 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
// 创建目录元数据并保存到数据库
FileMetadataInfo fileInfo = createFileMetadata(fileMinioObjectKey, req.getFileName(), req.getFileType(),
req.getProjectId(), req.getAnalysisDirectionId(), req.getRemarks(), dirMetadataInfo.getId(), req.getFile().getSize());
fileInfo.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
fileInfo.setApproveType(ApproveFileDataTypeEnum.UPLOAD_REVIEWING.getCode());
// 只有知识库的文件需要审核
// 1 知识库文件夹
boolean isknowledge = Objects.equals(NumberConstants.ONE, dirMetadataInfo.getDirType());
if(isknowledge){
fileInfo.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
fileInfo.setApproveType(ApproveFileDataTypeEnum.UPLOAD_REVIEWING.getCode());
}
fileMetadataInfoService.save(fileInfo);
// 需要保存文件的历史版本记录同一文件的所有版本共享一个ID
@@ -1017,23 +1046,24 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
.orElse(null);
}
// 调用审批流,开启审批; 上面先入库拿到主键id,审批流创建失败后再回退数据
// String templateId, String templateName,String approveContents,int approveAction1新增 2修改 3删除
String approveContents = getApproveContents(fileInfo.getId(), "知识库文件新增", NumberConstants.ONE, fileInfo, null);
Pair<Boolean,String> approvePair = launchFileDataApprove(req.getTemplateId(), req.getTemplateName(), approveContents, NumberConstants.ONE);
if(!approvePair.getLeft()|| org.apache.commons.lang3.StringUtils.isBlank(approvePair.getRight())) {
log.error("uploadFiles create approveInit failed, params :{}", JSONObject.toJSONString(req));
// - 回退MinIO中已上传的文件删除该文件。catch 里统一操作了
//- 新增 file_metadata_info 信息不入表。
//- 向前端返回“上传文件失败”
throw new RuntimeException("文件上传,创建审批流失败,cidFlowId:"+approvePair.getRight());
if(isknowledge){
String approveContents = getApproveContents(fileInfo.getId(), "知识库文件新增", NumberConstants.ONE, fileInfo, null);
Pair<Boolean,String> approvePair = launchFileDataApprove(req.getTemplateId(), req.getTemplateName(), approveContents, NumberConstants.ONE);
if(!approvePair.getLeft()|| org.apache.commons.lang3.StringUtils.isBlank(approvePair.getRight())) {
log.error("uploadFiles create approveInit failed, params :{}", JSONObject.toJSONString(req));
// - 回退MinIO中已上传的文件删除该文件。catch 里统一操作了
//- 新增 file_metadata_info 信息不入表
//- 向前端返回“上传文件失败”。
throw new RuntimeException("文件上传,创建审批流失败,cidFlowId:"+approvePair.getRight());
}
// cid流程id
fileInfo.setCidFlowId(approvePair.getRight());
}
// 需要保存文件的历史版本记录同一文件的所有版本共享一个ID
fileInfo.setFileGroupId(fileInfo.getId());
// cid流程id
fileInfo.setCidFlowId(approvePair.getRight());
fileMetadataInfoService.updateById(fileInfo);
// 创建文件扩展信息并保存到数据库
@@ -1133,12 +1163,14 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
}
}
@Transactional(rollbackFor = Exception.class)
public SdmResponse updateFile(UpdateFileReq req) {
FileMetadataInfo fileMetadataInfo = fileMetadataInfoService.lambdaQuery().eq(FileMetadataInfo::getId, req.getId()).one();
if (fileMetadataInfo == null) {
return SdmResponse.failed("文件不存在");
}
// 文件夹
FileMetadataInfo dirMetadataInfo = fileMetadataInfoService.lambdaQuery().eq(FileMetadataInfo::getId, fileMetadataInfo.getParentId()).eq(FileMetadataInfo::getDataType, DataTypeEnum.DIRECTORY.getValue()).one();
boolean hasUploadPermission = fileUserPermissionService.hasFilePermission(fileMetadataInfo.getId(), ThreadLocalContext.getUserId(), FilePermissionEnum.UPLOAD);
if (!hasUploadPermission) {
return SdmResponse.failed("没有更新权限");
@@ -1148,41 +1180,48 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
Long versionNo = fileMetadataInfo.getVersionNo();
// 修改待审批的元数据主键id
if (ObjectUtils.isEmpty(req.getFile())) {
FileMetadataInfo tempFileMetadataInfo = new FileMetadataInfo();
BeanUtils.copyProperties(fileMetadataInfo, tempFileMetadataInfo);
// 不需要上传minio新文件只更新文件元数据
tempFileMetadataInfo.setProjectId(req.getProjectId());
tempFileMetadataInfo.setAnalysisDirectionId(req.getAnalysisDirectionId());
tempFileMetadataInfo.setRemarks(req.getRemarks());
// 知识库,增加审批的逻辑,先将原始数据改成待审核状态
if(dirMetadataInfo!=null&&Objects.equals(NumberConstants.ONE, dirMetadataInfo.getDirType())){
FileMetadataInfo tempFileMetadataInfo = new FileMetadataInfo();
BeanUtils.copyProperties(fileMetadataInfo, tempFileMetadataInfo);
// 不需要上传minio新文件只更新文件元数据
tempFileMetadataInfo.setProjectId(req.getProjectId());
tempFileMetadataInfo.setAnalysisDirectionId(req.getAnalysisDirectionId());
tempFileMetadataInfo.setRemarks(req.getRemarks());
// 增加审批的逻辑,先将原始数据改成待审核状态
fileMetadataInfo.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
fileMetadataInfo.setApproveType(ApproveFileDataTypeEnum.MODIFY_METADATA_REVIEWING.getCode());
// 获取前后变化的file信息
String approveContents = getApproveContents(fileMetadataInfo.getId(), "知识库文件元数据修改",
NumberConstants.TWO, fileMetadataInfo, tempFileMetadataInfo);
// 本次待审核的数据
fileMetadataInfo.setTempMetadata(JSONObject.toJSONString(tempFileMetadataInfo));
// String templateId, String templateName,String approveContents,int approveAction1新增 2修改 3删除
Pair<Boolean, String> approvePair = launchFileDataApprove(req.getTemplateId(), req.getTemplateName(), approveContents, NumberConstants.TWO);
if(!approvePair.getLeft()||org.apache.commons.lang3.StringUtils.isBlank(approvePair.getRight())){
log.error("updateFile meteData approveInit failed, params :{}", JSONObject.toJSONString(req));
// 失败数据还未入表
throw new RuntimeException("文件元数据修改失败,创建审批流失败,cidFlowId:"+approvePair.getRight());
fileMetadataInfo.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
fileMetadataInfo.setApproveType(ApproveFileDataTypeEnum.MODIFY_METADATA_REVIEWING.getCode());
// 获取前后变化的file信息
String approveContents = getApproveContents(fileMetadataInfo.getId(), "知识库文件元数据修改",
NumberConstants.TWO, fileMetadataInfo, tempFileMetadataInfo);
// 本次待审核的数据
fileMetadataInfo.setTempMetadata(JSONObject.toJSONString(tempFileMetadataInfo));
// String templateId, String templateName,String approveContents,int approveAction1新增 2修改 3删除
Pair<Boolean, String> approvePair = launchFileDataApprove(req.getTemplateId(), req.getTemplateName(), approveContents, NumberConstants.TWO);
if(!approvePair.getLeft()||org.apache.commons.lang3.StringUtils.isBlank(approvePair.getRight())){
log.error("updateFile meteData approveInit failed, params :{}", JSONObject.toJSONString(req));
// 失败数据还未入表
throw new RuntimeException("文件元数据修改失败,创建审批流失败,cidFlowId:"+approvePair.getRight());
}
// 审批中的cidFlowId
fileMetadataInfo.setCidFlowId(approvePair.getRight());
}else {
// 其他场景修改
// 不需要上传minio新文件只更新文件元数据
fileMetadataInfo.setProjectId(req.getProjectId());
fileMetadataInfo.setAnalysisDirectionId(req.getAnalysisDirectionId());
fileMetadataInfo.setRemarks(req.getRemarks());
}
// 审批中的cidFlowId
fileMetadataInfo.setCidFlowId(approvePair.getRight());
fileMetadataInfoService.updateById(fileMetadataInfo);
} else {
// 需要上传minio新文件更新文件元数据
uploadAndUpdateFile(req, oldFileMinioObjectKey, fileMetadataInfo, versionNo, fileGroupId);
uploadAndUpdateFile(req, oldFileMinioObjectKey, fileMetadataInfo, versionNo, fileGroupId,dirMetadataInfo);
}
return SdmResponse.success("更新成功");
}
@Transactional(rollbackFor = Exception.class)
public void uploadAndUpdateFile(UpdateFileReq req, String oldFileMinioObjectKey, FileMetadataInfo fileMetadataInfo, Long versionNo, Long fileGroupId) {
public void uploadAndUpdateFile(UpdateFileReq req, String oldFileMinioObjectKey, FileMetadataInfo fileMetadataInfo, Long versionNo, Long fileGroupId,FileMetadataInfo dirMetadataInfo) {
String newFileMinioObjectKey = "";
try {
// 保留历史文件版本,新增一条文件版本记录
@@ -1204,31 +1243,36 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
newFileMinioObjectKey = getFileMinioObjectKey(oldFileMinioObjectKey.substring(0, oldFileMinioObjectKey.lastIndexOf(fileMetadataInfo.getOriginalName().substring(0, fileMetadataInfo.getOriginalName().lastIndexOf('.')))) + modifiedFileName);
minioService.uploadFile(req.getFile(), newFileMinioObjectKey, null);
// 创建目录元数据并保存到数据库
FileMetadataInfo fileInfo = createFileMetadata(newFileMinioObjectKey, req.getFileName(), req.getFileType(),
req.getProjectId(), req.getAnalysisDirectionId(), req.getRemarks(), fileMetadataInfo.getParentId(), req.getFile().getSize());
fileInfo.setFileGroupId(fileGroupId);
fileInfo.setVersionNo(versionNo + 1);
// 修改了文件,增加审批相关字段
// 增加审批的逻辑,先将原始数据改成待审核状态
fileInfo.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
fileInfo.setApproveType(ApproveFileDataTypeEnum.MODIFY_REVIEWING.getCode());
fileMetadataInfoService.save(fileInfo);
// 获取前后变化的file信息
String approveContents = getApproveContents(fileInfo.getId(), "知识库文件修改",
NumberConstants.TWO,fileMetadataInfo , fileInfo);
Pair<Boolean, String> approvePair = launchFileDataApprove(req.getTemplateId(), req.getTemplateName(), approveContents, NumberConstants.TWO);
if(!approvePair.getLeft()||org.apache.commons.lang3.StringUtils.isBlank(approvePair.getRight())){
log.error("uploadAndUpdateFile updateFile approveInit failed, params :{}", JSONObject.toJSONString(req));
// 失败数据回退删除--事务回滚
throw new RuntimeException("文件修改失败,创建审批流失败,cidFlowId:"+approvePair.getRight());
// 知识库修改
if(dirMetadataInfo!=null&&Objects.equals(NumberConstants.ONE, dirMetadataInfo.getDirType())){
// 修改了文件,增加审批相关字段
// 增加审批的逻辑,先将原始数据改成待审核状态
fileInfo.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
fileInfo.setApproveType(ApproveFileDataTypeEnum.MODIFY_REVIEWING.getCode());
// 新增的一条暂时不展示
fileInfo.setIsLatest(false);
}
fileMetadataInfoService.save(fileInfo);
// 知识库创建审批流
if(dirMetadataInfo!=null&&Objects.equals(NumberConstants.ONE, dirMetadataInfo.getDirType())){
// 获取前后变化的file信息
String approveContents = getApproveContents(fileInfo.getId(), "知识库文件修改",
NumberConstants.TWO,fileMetadataInfo , fileInfo);
Pair<Boolean, String> approvePair = launchFileDataApprove(req.getTemplateId(), req.getTemplateName(), approveContents, NumberConstants.TWO);
if(!approvePair.getLeft()||org.apache.commons.lang3.StringUtils.isBlank(approvePair.getRight())){
log.error("uploadAndUpdateFile updateFile approveInit failed, params :{}", JSONObject.toJSONString(req));
// 失败数据回退删除--事务回滚
throw new RuntimeException("文件修改失败,创建审批流失败,cidFlowId:"+approvePair.getRight());
}
// cid流程id
fileInfo.setCidFlowId(approvePair.getRight());
fileMetadataInfoService.updateById(fileInfo);
}
// cid流程id
fileInfo.setCidFlowId(approvePair.getRight());
fileMetadataInfoService.updateById(fileInfo);
// 创建文件扩展信息并保存到数据库
List<FileMetadataExtension> fileMetadataExtensionList = new ArrayList<>();
@@ -1248,9 +1292,12 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
// 创建默认权限记录
createFilePermission(fileInfo.getId());
// 设置历史版本文件为非最新
fileMetadataInfo.setIsLatest(false);
fileMetadataInfoService.updateById(fileMetadataInfo);
// 非知识库的,设置 历史版本 文件为非最新
if(!(dirMetadataInfo!=null&&Objects.equals(NumberConstants.ONE, dirMetadataInfo.getDirType()))){
fileMetadataInfo.setIsLatest(false);
fileMetadataInfoService.updateById(fileMetadataInfo);
}
} catch (Exception e) {
minioService.deleteFile(newFileMinioObjectKey);
log.error("更新文件失败", e);

View File

@@ -27,12 +27,26 @@ public class ModifyFileApproveStrategy implements ApproveStrategy {
IFileMetadataExtensionService fileMetadataExtensionService = context.getFileMetadataExtensionService();
IFileUserPermissionService fileUserPermissionService = context.getFileUserPermissionService();
// 最新的历史版本为
FileMetadataInfo historyMetaData = service.lambdaQuery()
.eq(FileMetadataInfo::getFileGroupId, metadata.getFileGroupId())
.orderByDesc(FileMetadataInfo::getUpdateTime)
.last("limit 1")
.one();
// 审批通过
if (NumberConstants.TWO == status) {
metadata.setApprovalStatus(null);
metadata.setApproveType(ApproveFileDataTypeEnum.COMPLETED.getCode());
// 设置成最新的文件
metadata.setIsLatest(true);
service.updateById(metadata);
// 历史的设置成非最新
if (historyMetaData != null) {
historyMetaData.setIsLatest(false);
service.updateById(historyMetaData);
}
return true;
}
@@ -45,14 +59,6 @@ public class ModifyFileApproveStrategy implements ApproveStrategy {
fileMetadataExtensionService.remove(new LambdaQueryWrapper<FileMetadataExtension>().eq(FileMetadataExtension::getTFilemetaId, metadata.getId()));
fileUserPermissionService.remove(new LambdaQueryWrapper<FileUserPermission>().eq(FileUserPermission::getTFilemetaId, metadata.getId()));
// 恢复历史版本为最新
FileMetadataInfo historyMetaData = service.lambdaQuery()
.eq(FileMetadataInfo::getFileGroupId, metadata.getFileGroupId())
.orderByDesc(FileMetadataInfo::getUpdateTime)
.last("limit 1")
.one();
if (historyMetaData != null) {
historyMetaData.setTempMetadata(null);
historyMetaData.setIsLatest(true);

View File

@@ -1,11 +1,13 @@
package com.sdm.system.controller;
import com.alibaba.fastjson2.JSON;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.system.LaunchApproveReq;
import com.sdm.common.feign.inter.system.IApproveFeignClient;
import com.sdm.system.model.entity.ApproveFlowBean;
import com.sdm.system.service.ISimulatinoApprovalService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -17,6 +19,7 @@ import org.springframework.web.bind.annotation.*;
* @author author
* @since 2025-09-22
*/
@Slf4j
@RestController
@RequestMapping("/systemApprove")
@Tag(name = "系统评审")
@@ -37,6 +40,7 @@ public class SystemApproveController implements IApproveFeignClient {
*/
@PostMapping("/approveStatusNotice")
public SdmResponse systemApproveNotice(@RequestBody ApproveFlowBean flowBean) {
log.info("approveStatusNotice start,remote param:{}", JSON.toJSONString(flowBean));
return approveServer.receiveApprovalResult(flowBean.cidFlowId,flowBean.approveStatus);
}