Data模块审批流程重构

This commit is contained in:
2025-12-17 14:13:13 +08:00
parent 23309a01fd
commit 7b921878b7
8 changed files with 342 additions and 219 deletions

View File

@@ -47,7 +47,7 @@ public interface FileMetadataConvert {
@Named("childrenResp")
@Mappings({
@Mapping(target = "children", ignore = true),
@Mapping(target = "mergeSameNameChildren", ignore = true),
@Mapping(target = "totalName", ignore = true),
@Mapping(target = "fileUrl", ignore = true),
@Mapping(target = "creatorName", ignore = true),

View File

@@ -13,7 +13,7 @@ import java.util.List;
public class FileMetadataChildrenDTO extends FileMetadataInfoResp {
@Schema(description = "子节点列表")
private List<FileMetadataInfoResp> children;
private List<FileMetadataInfoResp> mergeSameNameChildren;
/**
* 聚合文件ID列表

View File

@@ -0,0 +1,23 @@
package com.sdm.data.model.enums;
public enum ApproveFileActionENUM {
ADD(1, "新增"),
MODIFY(2, "修改"),
DELETE(3, "删除");
private int code;
private String description;
ApproveFileActionENUM(int code, String description) {
this.code = code;
this.description = description;
}
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
}

View File

@@ -1,30 +0,0 @@
package com.sdm.data.schedule;
import com.sdm.common.utils.SpringUtils;
import com.sdm.data.dao.SystemMapper;
import com.sdm.data.service.IDataFileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
/**
* @Author xuyundi
* @Date 2024/2/27
* @Note
*/
@Slf4j
@Component
public class InitSystemDirectory {
@Autowired
private IDataFileService IDataFileService;
@Resource
private SystemMapper systemMapper;
public void postConstruct() {
}
}

View File

@@ -0,0 +1,161 @@
package com.sdm.data.service.approve;
import com.alibaba.fastjson2.JSONObject;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.common.ThreadLocalContext;
import com.sdm.common.entity.constants.NumberConstants;
import com.sdm.common.entity.enums.ApprovalFileDataStatusEnum;
import com.sdm.common.entity.enums.ApproveFileDataTypeEnum;
import com.sdm.common.entity.enums.ApproveTypeEnum;
import com.sdm.common.entity.req.system.LaunchApproveReq;
import com.sdm.common.feign.inter.system.IApproveFeignClient;
import com.sdm.data.model.bo.ApprovalFileDataContentsModel;
import com.sdm.data.model.entity.FileMetadataInfo;
import com.sdm.data.model.enums.ApproveFileActionENUM;
import com.sdm.data.service.IFileMetadataInfoService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
/**
* 审批执行器 - 抽取执行和状态更新逻辑
*/
@Component
@Slf4j
public class FileApproveExecutor {
@Autowired
private IApproveFeignClient approveFeignClient;
@Autowired
private IFileMetadataInfoService fileMetadataInfoService;
/**
* 发起审批并更新文件状态
*
* @param builder 审批请求构建器
* @param filesToUpdate 待更新文件列表
* @param fileApproveType 文件审批类型
*
* @return cidFlowId
* @throws RuntimeException 审批创建失败时抛出
*/
public String launchApproveAndUpdateStatus(FileApproveRequestBuilder builder,
List<FileMetadataInfo> filesToUpdate,
ApproveFileDataTypeEnum fileApproveType) {
String approveContents = buildApproveContents(builder);
Pair<Boolean, String> result = doLaunchApprove(
builder.getTemplateId(),
builder.getTemplateName(),
approveContents,
builder.getApproveFileActionENUM().getCode(),
builder.getApproveType()
);
if (!result.getLeft() || StringUtils.isBlank(result.getRight())) {
log.warn("launchApproveAndUpdateStatus failed:{}", JSONObject.toJSONString(builder));
throw new RuntimeException("创建审批流失败, cidFlowId: " + result.getRight());
}
String cidFlowId = result.getRight();
updateFileApproveStatus(filesToUpdate, cidFlowId, fileApproveType);
return cidFlowId;
}
/**
* 仅发起审批,不更新状态(供需要自定义状态更新的场景使用)
*/
public Pair<Boolean, String> launchApproveOnly(FileApproveRequestBuilder builder) {
String approveContents = buildApproveContents(builder);
return doLaunchApprove(
builder.getTemplateId(),
builder.getTemplateName(),
approveContents,
builder.getApproveFileActionENUM().getCode(),
builder.getApproveType()
);
}
private void updateFileApproveStatus(List<FileMetadataInfo> files,
String cidFlowId,
ApproveFileDataTypeEnum approveType) {
if (CollectionUtils.isEmpty(files)) {
return;
}
for (FileMetadataInfo file : files) {
file.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
file.setApproveType(approveType.getCode());
file.setCidFlowId(cidFlowId);
}
fileMetadataInfoService.updateBatchById(files);
}
// 发起仿真知识库文件审核 true 成功 false失败
private Pair<Boolean, String> doLaunchApprove(String templateId, String templateName, String approveContents, int approveAction, ApproveTypeEnum approveTypeEnum) {
boolean result = false;
String cidFlowId = "";
LaunchApproveReq req = new LaunchApproveReq();
try {
// 评审流程模版ID 前端传过来
req.templateId = templateId;
// 模版名称 前端传过来
req.templateName = templateName;
// 审批内容 拼接json str {"id": "111","contents": "用户xx于YYYY-MM-dd hh:mm:ss 提交 xx 新增知识库文件"}
req.approveContents = approveContents;
// 评审动作 1新增 2修改 3删除
req.approveAction = approveAction;
// 审批类型 1仿真地图审批 2知识库审批 3:流程模板审批 4交付物审批
req.approveType = approveTypeEnum.getCode();
// 审批主题
req.approveTitle = approveTypeEnum.getDescription();
// 租户ID
req.tenantId = ThreadLocalContext.getTenantId();
// 用户ID
req.userId = ThreadLocalContext.getUserId();
// 审批创建者
req.creator = ThreadLocalContext.getUserId();
SdmResponse response = approveFeignClient.launchApproval(req);
if (response.isSuccess()) {
// 成功
result = true;
cidFlowId = Optional.ofNullable(response.getData())
.map(Object::toString)
.orElse("");
}
} catch (Exception e) {
log.error("launchFileDataApprove error :{},", e);
} finally {
if (!result) {
log.warn("launchFileDataApprove fileData failed:{}", JSONObject.toJSONString(req));
}
}
return Pair.of(result, cidFlowId);
}
private String buildApproveContents(FileApproveRequestBuilder builder) {
ApprovalFileDataContentsModel contentsModel = new ApprovalFileDataContentsModel();
contentsModel.setIds(builder.getFileIds());
contentsModel.setContents(builder.getContents());
contentsModel.setApproveAction(builder.getApproveFileActionENUM().getCode());
if(CollectionUtils.isNotEmpty(builder.getBeforeData())){
contentsModel.setBeforeData(builder.getBeforeData());
}
// 只有修改有 afterData 值
if(Objects.equals(NumberConstants.TWO, builder.getApproveFileActionENUM().getCode()) && CollectionUtils.isNotEmpty(builder.getAfterData())){
contentsModel.setAfterData(builder.getAfterData());
}
// 转换为 JSON 字符串并返回
return JSONObject.toJSONString(contentsModel);
}
}

View File

@@ -0,0 +1,25 @@
package com.sdm.data.service.approve;
import com.sdm.common.entity.enums.ApproveTypeEnum;
import com.sdm.data.model.entity.FileMetadataInfo;
import com.sdm.data.model.enums.ApproveFileActionENUM;
import lombok.Builder;
import lombok.Data;
import java.util.List;
/**
* 审批请求构建器 - 抽取构建逻辑
*/
@Data
@Builder
public class FileApproveRequestBuilder {
private List<Long> fileIds;
private String contents;
private ApproveTypeEnum approveType;
private ApproveFileActionENUM approveFileActionENUM;
private String templateId;
private String templateName;
private List<FileMetadataInfo> beforeData;
private List<FileMetadataInfo> afterData;
}

View File

@@ -2,7 +2,6 @@ package com.sdm.data.service.impl;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.common.ThreadLocalContext;
@@ -40,7 +39,6 @@ import com.sdm.data.service.IFileMetadataInfoService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -313,7 +311,7 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
children.add(childDto);
}
dto.setChildren(children);
dto.setMergeSameNameChildren(children);
dto.setFileIds(children.stream().map(FileMetadataInfoResp::getId).toList());
result.add(dto);
}
@@ -321,13 +319,13 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
// 根据children中的最大创建时间对result进行倒序排序
result.sort((dto1, dto2) -> {
LocalDateTime maxCreateTime1 = dto1.getChildren().stream()
LocalDateTime maxCreateTime1 = dto1.getMergeSameNameChildren().stream()
.map(FileMetadataInfoResp::getCreateTime)
.filter(Objects::nonNull)
.max(LocalDateTime::compareTo)
.orElse(LocalDateTime.MIN);
LocalDateTime maxCreateTime2 = dto2.getChildren().stream()
LocalDateTime maxCreateTime2 = dto2.getMergeSameNameChildren().stream()
.map(FileMetadataInfoResp::getCreateTime)
.filter(Objects::nonNull)
.max(LocalDateTime::compareTo)
@@ -402,7 +400,7 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
private List<Long> extractDirIdsFromResponse(SdmResponse<List<FileMetadataChildrenDTO>> response) {
if (response.isSuccess() && ObjectUtils.isNotEmpty(response.getData())) {
return response.getData().stream()
.flatMap(dto -> dto.getChildren().stream())
.flatMap(dto -> dto.getMergeSameNameChildren().stream())
.map(FileMetadataInfoResp::getId)
.toList();
}

View File

@@ -40,9 +40,12 @@ import com.sdm.data.model.bo.ApprovalFileDataContentsModel;
import com.sdm.data.model.entity.*;
import com.sdm.common.entity.resp.data.PoolInfo;
import com.sdm.data.model.enums.ApproveFileActionENUM;
import com.sdm.data.model.req.*;
import com.sdm.data.model.resp.KKFileViewURLFromMinioResp;
import com.sdm.data.service.*;
import com.sdm.data.service.approve.FileApproveExecutor;
import com.sdm.data.service.approve.FileApproveRequestBuilder;
import com.sdm.data.service.impl.dataFileHandle.ApproveContext;
import com.sdm.data.service.impl.dataFileHandle.ApproveStrategy;
import com.sdm.data.service.impl.dataFileHandle.ApproveStrategyFactory;
@@ -145,6 +148,9 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
@Autowired
private ISimuluationTaskPoolFeignClient isSimuluationTaskPoolFeignClient;
@Autowired
private FileApproveExecutor fileApproveExecutor;
@Autowired
@Qualifier(value = "nonSensitiveTaskPool")
private Executor nonSensitiveTaskPool;
@@ -561,17 +567,23 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
// 知识库
if(dirMetadataInfo!=null&&Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType())){
// 发送审批电子流,成功继续西面操作,失败直接返回
// String templateId, String templateName,String approveContents,int approveAction1新增 2修改 3删除
String approveContents = getApproveContents(List.of(delFileId), "知识库文件删除", NumberConstants.THREE, List.of(deleteFileMetadataInfo), null);
Pair<Boolean, String> approvePair = launchFileDataApprove(req.getTemplateId(), req.getTemplateName(), approveContents, NumberConstants.THREE, ApproveTypeEnum.KNOWLEDGE_APPROVE);
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());
FileApproveRequestBuilder deleteFileApproveRequestBuilder = FileApproveRequestBuilder.builder()
.fileIds(List.of(delFileId))
.contents("知识库文件删除")
.approveType(ApproveTypeEnum.KNOWLEDGE_APPROVE)
.approveFileActionENUM(ApproveFileActionENUM.DELETE)
.beforeData(List.of(deleteFileMetadataInfo))
.templateId(req.getTemplateId())
.templateName(req.getTemplateName())
.build();
if(CollectionUtils.isNotEmpty(deleteFileApproveRequestBuilder.getBeforeData())){
setCreatorNames(deleteFileApproveRequestBuilder.getBeforeData());
setProjectName(deleteFileApproveRequestBuilder.getBeforeData());
setAnalysisDirectionName(deleteFileApproveRequestBuilder.getBeforeData());
setSimulationPoolAndTaskInfo(deleteFileApproveRequestBuilder.getBeforeData());
}
deleteFileMetadataInfo.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
deleteFileMetadataInfo.setApproveType(ApproveFileDataTypeEnum.DELETE_REVIEWING.getCode());
deleteFileMetadataInfo.setCidFlowId(approvePair.getRight());
fileMetadataInfoService.updateById(deleteFileMetadataInfo);
fileApproveExecutor.launchApproveAndUpdateStatus(deleteFileApproveRequestBuilder, List.of(deleteFileMetadataInfo), ApproveFileDataTypeEnum.DELETE_REVIEWING);
return SdmResponse.success("操作成功,删除文件待审批");
}else{
// 删除MinIO文件
@@ -1362,20 +1374,8 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
FileMetadataInfo fileInfo = createFileMetadata(fileMinioObjectKey, originalName, req.getFileType(),
req.getProjectId(), req.getAnalysisDirectionId(), req.getRemarks(), dirMetadataInfo.getId(), req.getFile().getSize()
);
// 只有知识库的文件需要审核
// 1 知识库文件夹
boolean isknowledge = Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType());
if(isknowledge){
fileInfo.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
fileInfo.setApproveType(ApproveFileDataTypeEnum.UPLOAD_REVIEWING.getCode());
}
fileMetadataInfoService.save(fileInfo);
// 需要保存文件的历史版本记录同一文件的所有版本共享一个ID
fileInfo.setFileGroupId(fileInfo.getId());
fileMetadataInfoService.updateById(fileInfo);
// 循环查询当前文件每一级父目录id,并保存为一条file_storage,用户后续文件搜索统计
Long parentDirId = dirMetadataInfo.getId();
FileStorage fileStorage = new FileStorage();
@@ -1412,26 +1412,6 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
}
}
// 调用审批流,开启审批; 上面先入库拿到主键id,审批流创建失败后再回退数据
// String templateId, String templateName,String approveContents,int approveAction1新增 2修改 3删除
if(isknowledge){
String approveContents = getApproveContents(List.of(fileInfo.getId()), "知识库文件新增", NumberConstants.ONE, List.of(fileInfo), null);
Pair<Boolean,String> approvePair = launchFileDataApprove(req.getTemplateId(), req.getTemplateName(), approveContents, NumberConstants.ONE, ApproveTypeEnum.KNOWLEDGE_APPROVE);
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());
fileMetadataInfoService.updateById(fileInfo);
// 创建文件扩展信息并保存到数据库
List<FileMetadataExtension> fileMetadataExtensionList = new ArrayList<>();
List<UploadFilesReq.FileMetadataExtensionRequest> fileMetadataExtensionRequestList = req.getFileMetadataExtensionRequest();
@@ -1450,6 +1430,32 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
// 创建默认权限记录
createFilePermission(fileInfo.getId());
// 只有知识库的文件需要审核
if( Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType())){
FileApproveRequestBuilder uploadFileApproveRequestBuilder = FileApproveRequestBuilder.builder()
.fileIds(List.of(fileInfo.getId()))
.contents("知识库文件新增")
.approveType(ApproveTypeEnum.KNOWLEDGE_APPROVE)
.approveFileActionENUM(ApproveFileActionENUM.ADD)
.beforeData(List.of(fileInfo))
.templateId(req.getTemplateId())
.templateName(req.getTemplateName())
.build();
if(CollectionUtils.isNotEmpty(uploadFileApproveRequestBuilder.getBeforeData())){
setCreatorNames(uploadFileApproveRequestBuilder.getBeforeData());
setProjectName(uploadFileApproveRequestBuilder.getBeforeData());
setAnalysisDirectionName(uploadFileApproveRequestBuilder.getBeforeData());
setSimulationPoolAndTaskInfo(uploadFileApproveRequestBuilder.getBeforeData());
}
fileApproveExecutor.launchApproveAndUpdateStatus(uploadFileApproveRequestBuilder, List.of(fileInfo), ApproveFileDataTypeEnum.UPLOAD_REVIEWING);
}
// 需要保存文件的历史版本记录同一文件的所有版本共享一个ID
fileInfo.setFileGroupId(fileInfo.getId());
fileMetadataInfoService.updateById(fileInfo);
JSONObject jsonObject = new JSONObject();
jsonObject.put("fileId", fileInfo.getId());
return SdmResponse.success(jsonObject);
@@ -1562,27 +1568,40 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
FileMetadataInfo tempFileMetadataInfo = new FileMetadataInfo();
BeanUtils.copyProperties(fileMetadataInfo, tempFileMetadataInfo);
// 不需要上传minio新文件只更新文件元数据
// 本次待审核的数据
tempFileMetadataInfo.setProjectId(req.getProjectId());
tempFileMetadataInfo.setAnalysisDirectionId(req.getAnalysisDirectionId());
tempFileMetadataInfo.setRemarks(req.getRemarks());
tempFileMetadataInfo.setSimulationPoolInfoList(req.getSimulationPoolInfoList());
fileMetadataInfo.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
fileMetadataInfo.setApproveType(ApproveFileDataTypeEnum.MODIFY_METADATA_REVIEWING.getCode());
// 获取前后变化的file信息
String approveContents = getApproveContents(List.of(fileMetadataInfo.getId()), "知识库文件元数据修改",
NumberConstants.TWO, List.of(fileMetadataInfo), List.of(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, ApproveTypeEnum.KNOWLEDGE_APPROVE);
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());
//发起审批
FileApproveRequestBuilder updateFileMetaIntoApproveRequestBuilder = FileApproveRequestBuilder.builder()
.fileIds(List.of(fileMetadataInfo.getId()))
.contents("知识库文件元数据修改")
.approveType(ApproveTypeEnum.KNOWLEDGE_APPROVE)
.approveFileActionENUM(ApproveFileActionENUM.MODIFY)
.beforeData(List.of(fileMetadataInfo))
.afterData(List.of(tempFileMetadataInfo))
.templateId(req.getTemplateId())
.templateName(req.getTemplateName())
.build();
if(CollectionUtils.isNotEmpty(updateFileMetaIntoApproveRequestBuilder.getBeforeData())){
setCreatorNames(updateFileMetaIntoApproveRequestBuilder.getBeforeData());
setProjectName(updateFileMetaIntoApproveRequestBuilder.getBeforeData());
setAnalysisDirectionName(updateFileMetaIntoApproveRequestBuilder.getBeforeData());
setSimulationPoolAndTaskInfo(updateFileMetaIntoApproveRequestBuilder.getBeforeData());
}
// 审批中的cidFlowId
fileMetadataInfo.setCidFlowId(approvePair.getRight());
// 只有修改有 afterData 值
if (CollectionUtils.isNotEmpty(updateFileMetaIntoApproveRequestBuilder.getAfterData())) {
setCreatorNames(updateFileMetaIntoApproveRequestBuilder.getAfterData());
setProjectName(updateFileMetaIntoApproveRequestBuilder.getAfterData());
setAnalysisDirectionName(updateFileMetaIntoApproveRequestBuilder.getAfterData());
setSimulationPoolAndTaskInfo(updateFileMetaIntoApproveRequestBuilder.getAfterData());
}
fileApproveExecutor.launchApproveAndUpdateStatus(updateFileMetaIntoApproveRequestBuilder, List.of(fileMetadataInfo), ApproveFileDataTypeEnum.MODIFY_METADATA_REVIEWING);
}else {
// 其他场景修改
// 不需要上传minio新文件只更新文件元数据
@@ -1627,15 +1646,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
);
fileInfo.setFileGroupId(fileGroupId);
fileInfo.setVersionNo(versionNo + 1);
// 知识库修改
if(dirMetadataInfo!=null&&Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType())){
// 修改了文件,增加审批相关字段
// 增加审批的逻辑,先将原始数据改成待审核状态
fileInfo.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
fileInfo.setApproveType(ApproveFileDataTypeEnum.MODIFY_REVIEWING.getCode());
// 新增的一条暂时不展示
fileInfo.setIsLatest(false);
}
fileMetadataInfoService.save(fileInfo);
//绑定文件和工况库的关系
@@ -1652,23 +1663,6 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
}
}
// 知识库创建审批流
if(dirMetadataInfo!=null&&Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType())){
// 获取前后变化的file信息
String approveContents = getApproveContents(List.of(fileInfo.getId()), "知识库文件修改",
NumberConstants.TWO,List.of(fileMetadataInfo) , List.of(fileInfo));
Pair<Boolean, String> approvePair = launchFileDataApprove(req.getTemplateId(), req.getTemplateName(), approveContents, NumberConstants.TWO, ApproveTypeEnum.KNOWLEDGE_APPROVE);
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);
}
// 创建文件扩展信息并保存到数据库
List<FileMetadataExtension> fileMetadataExtensionList = new ArrayList<>();
List<UploadFilesReq.FileMetadataExtensionRequest> fileMetadataExtensionRequestList = req.getFileMetadataExtensionRequest();
@@ -1708,8 +1702,40 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
// 创建默认权限记录
createFilePermission(fileInfo.getId());
// 知识库的,设置 历史版本 文件为非最新
if(!(dirMetadataInfo!=null&&Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType()))){
// 知识库创建审批流
boolean isKnowledge = dirMetadataInfo != null && Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType());
// 知识库修改
if(isKnowledge){
// 新增的一条暂时不展示
fileInfo.setIsLatest(false);
FileApproveRequestBuilder uploadAndUpdateFileApproveRequestBuilder = FileApproveRequestBuilder.builder()
.fileIds(List.of(fileInfo.getId()))
.contents("知识库文件修改")
.approveType(ApproveTypeEnum.KNOWLEDGE_APPROVE)
.approveFileActionENUM(ApproveFileActionENUM.MODIFY)
.beforeData(List.of(fileMetadataInfo))
.afterData(List.of(fileInfo))
.templateId(req.getTemplateId())
.templateName(req.getTemplateName())
.build();
if(CollectionUtils.isNotEmpty(uploadAndUpdateFileApproveRequestBuilder.getBeforeData())){
setCreatorNames(uploadAndUpdateFileApproveRequestBuilder.getBeforeData());
setProjectName(uploadAndUpdateFileApproveRequestBuilder.getBeforeData());
setAnalysisDirectionName(uploadAndUpdateFileApproveRequestBuilder.getBeforeData());
setSimulationPoolAndTaskInfo(uploadAndUpdateFileApproveRequestBuilder.getBeforeData());
}
// 只有修改有 afterData 值
if (CollectionUtils.isNotEmpty(uploadAndUpdateFileApproveRequestBuilder.getAfterData())) {
setCreatorNames(uploadAndUpdateFileApproveRequestBuilder.getAfterData());
setProjectName(uploadAndUpdateFileApproveRequestBuilder.getAfterData());
setAnalysisDirectionName(uploadAndUpdateFileApproveRequestBuilder.getAfterData());
setSimulationPoolAndTaskInfo(uploadAndUpdateFileApproveRequestBuilder.getAfterData());
}
fileApproveExecutor.launchApproveAndUpdateStatus(uploadAndUpdateFileApproveRequestBuilder, List.of(fileInfo), ApproveFileDataTypeEnum.UPLOAD_REVIEWING);
}else {
// 非知识库的,设置 历史版本 文件为非最新
fileMetadataInfo.setIsLatest(false);
fileMetadataInfoService.updateById(fileMetadataInfo);
}
@@ -2134,82 +2160,6 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
}
}
// 发起仿真知识库文件审核 true 成功 false失败
private Pair<Boolean,String> launchFileDataApprove(String templateId, String templateName, String approveContents, int approveAction, ApproveTypeEnum approveTypeEnum)
{
boolean result = false;
String cidFlowId="";
LaunchApproveReq req = new LaunchApproveReq();
try {
// 评审流程模版ID 前端传过来
req.templateId = templateId;
// req.templateId = "P202511041416483446SFON";
// 模版名称 前端传过来
req.templateName = templateName;
// req.templateName = "仿真知识文档评审";
// 审批内容 拼接json str {"id": "111","contents": "用户xx于YYYY-MM-dd hh:mm:ss 提交 xx 新增知识库文件"}
req.approveContents = approveContents;
// 评审动作 1新增 2修改 3删除
req.approveAction = approveAction;
// 审批类型 1仿真地图审批 2知识库审批 3:流程模板审批 4交付物审批
req.approveType = approveTypeEnum.getCode();
// 审批主题
req.approveTitle = approveTypeEnum.getDescription();
// 租户ID
req.tenantId = ThreadLocalContext.getTenantId();
// req.tenantId = 1979091834410176514l;
// 用户ID
req.userId = ThreadLocalContext.getUserId();
// req.userId = 1979078323595476993l;
// 审批创建者
req.creator = ThreadLocalContext.getUserId();
// req.creator = 1979078323595476993l;
SdmResponse response = approveFeignClient.launchApproval(req);
if(response.isSuccess()){
// 成功
result = true;
cidFlowId = Optional.ofNullable(response.getData())
.map(Object::toString)
.orElse("");
}
} catch (Exception e) {
log.error("launchFileDataApprove error :{},",e);
}finally {
if(!result){
log.warn("launchFileDataApprove fileData failed:{}",JSONObject.toJSONString(req));
}
}
return Pair.of(result,cidFlowId);
}
/**
* 生成包含 id 和 contents 的 JSON 字符串--审批创建的 approveContents
*/
public String getApproveContents(List<Long> ids, String contents,Integer approveAction,List<FileMetadataInfo> beforeDatas,List<FileMetadataInfo> afterDatas) {
ApprovalFileDataContentsModel contentsModel = new ApprovalFileDataContentsModel();
contentsModel.setIds(ids);
contentsModel.setContents(contents);
contentsModel.setApproveAction(approveAction);
if(CollectionUtils.isNotEmpty(beforeDatas)){
setCreatorNames(beforeDatas);
setProjectName(beforeDatas);
setAnalysisDirectionName(beforeDatas);
setSimulationPoolAndTaskInfo(beforeDatas);
}
contentsModel.setBeforeData(beforeDatas);
// 只有修改有 afterData 值
if(Objects.equals(NumberConstants.TWO,approveAction)){
if(CollectionUtils.isNotEmpty(afterDatas)){
setCreatorNames(afterDatas);
setProjectName(afterDatas);
setAnalysisDirectionName(afterDatas);
setSimulationPoolAndTaskInfo(afterDatas);
}
contentsModel.setAfterData(afterDatas);
}
// 转换为 JSON 字符串并返回
return JSONObject.toJSONString(contentsModel);
}
private void setCreatorNames(List<FileMetadataInfo> list) {
try {
@@ -2545,32 +2495,28 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
if (isKnowledge) {
// 构建审批内容
String approveContents = "";
approveContents = getApproveContents(
succBusinessIds,"知识库文件批量新增", NumberConstants.ONE,succFileMetadataInfos,null );
// 发起审批
Pair<Boolean, String> approvePair = launchFileDataApprove(
firstFile.getTemplateId(),
firstFile.getTemplateName(),
approveContents,
NumberConstants.ONE,
ApproveTypeEnum.KNOWLEDGE_APPROVE
);
// 审批创建失败:抛出异常
if (!approvePair.getLeft() || org.apache.commons.lang3.StringUtils.isBlank(approvePair.getRight())) {
CoreLogger.error("callBackknowledgeFile create approveInit failed, params :{}", JSONObject.toJSONString(approvePair));
throw new RuntimeException("文件上传,创建审批流失败,cidFlowId:"+approvePair.getRight());
FileApproveRequestBuilder batchUploadFileApproveRequestBuilder = FileApproveRequestBuilder.builder()
.fileIds(succBusinessIds)
.contents("知识库文件批量新增")
.approveType(ApproveTypeEnum.KNOWLEDGE_APPROVE)
.approveFileActionENUM(ApproveFileActionENUM.ADD)
.beforeData(succFileMetadataInfos)
.templateId(firstFile.getTemplateId())
.templateName(firstFile.getTemplateName())
.build();
if(CollectionUtils.isNotEmpty(batchUploadFileApproveRequestBuilder.getBeforeData())){
setCreatorNames(batchUploadFileApproveRequestBuilder.getBeforeData());
setProjectName(batchUploadFileApproveRequestBuilder.getBeforeData());
setAnalysisDirectionName(batchUploadFileApproveRequestBuilder.getBeforeData());
setSimulationPoolAndTaskInfo(batchUploadFileApproveRequestBuilder.getBeforeData());
}
cidFlowId = approvePair.getRight();
fileApproveExecutor.launchApproveAndUpdateStatus(batchUploadFileApproveRequestBuilder, succFileMetadataInfos, ApproveFileDataTypeEnum.UPLOAD_REVIEWING);
}
// 3. 批量更新文件状态(上传完成)
FileMetadataInfo updateEntity = new FileMetadataInfo();
updateEntity.setUploadStatus(NumberConstants.ONE_STR);
// 知识库文件关联审批流ID
if ((isKnowledge) && org.apache.commons.lang3.StringUtils.isNotBlank(cidFlowId)) {
updateEntity.setCidFlowId(cidFlowId);
}
// 执行更新
fileMetadataInfoService.update(updateEntity, Wrappers.lambdaQuery(FileMetadataInfo.class)
.in(FileMetadataInfo::getId, succBusinessIds)