知识库绑定工况库,知识库搜索、审批流程展示工况库

This commit is contained in:
2025-12-10 15:14:45 +08:00
parent 5cb62925ed
commit b3219dd39d
18 changed files with 343 additions and 70 deletions

View File

@@ -1,7 +1,9 @@
package com.sdm.common.entity.pojo.task; package com.sdm.common.entity.pojo.task;
import com.sdm.common.common.SdmResponse; import com.sdm.common.common.SdmResponse;
import lombok.Data;
@Data
public class TaskBaseInfo { public class TaskBaseInfo {
public String taskName; public String taskName;
@@ -14,4 +16,8 @@ public class TaskBaseInfo {
public String version; public String version;
public Long poolId;
public Long fileId;
} }

View File

@@ -8,6 +8,7 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
/** /**
* 文件元数据传输对象(用于接口返回给前端) * 文件元数据传输对象(用于接口返回给前端)
@@ -107,6 +108,9 @@ public class FileMetadataInfoResp implements Serializable {
@Schema(description = "分析方向名称(展示用)") @Schema(description = "分析方向名称(展示用)")
private String analysisDirectionName; private String analysisDirectionName;
@Schema(description= "仿真任务池信息列表")
private List<PoolInfo> poolInfos;
@Schema(description = "完整访问URL拼接minio网关地址 + objectKey") @Schema(description = "完整访问URL拼接minio网关地址 + objectKey")
private String fileUrl; private String fileUrl;

View File

@@ -0,0 +1,42 @@
package com.sdm.common.entity.resp.data;
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 io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 文件与工况任务绑定关系
* </p>
*
* @author author
* @since 2025-12-02
*/
@Data
public class FileSimulationMappingResp implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Long fileId;
private Long simulationPoolId;
private String simulationPoolVersion;
private String simulationPoolTaskId;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}

View File

@@ -0,0 +1,15 @@
package com.sdm.common.entity.resp.data;
import com.sdm.common.entity.pojo.task.TaskBaseInfo;
import lombok.Data;
import java.util.List;
@Data
public class PoolInfo {
private Long simulationPoolId;
private String simulationPoolName;
private String simulationPoolVersion;
private List<String> simulationPoolTaskIds;
private List<TaskBaseInfo> taskBaseInfoList;
}

View File

@@ -71,11 +71,11 @@ public class SimuluationTaskPoolFeignClientImpl implements ISimuluationTaskPoolF
} }
@Override @Override
public SdmResponse<Map<String, TaskBaseInfo>> getTaskPoolTaskMap( long poolId, String version) public SdmResponse<Map<String, TaskBaseInfo>> getTaskPoolTaskMap( long poolId)
{ {
SdmResponse response; SdmResponse response;
try { try {
response = simuluationTaskPoolFeignClient.getTaskPoolTaskMap(poolId, version); response = simuluationTaskPoolFeignClient.getTaskPoolTaskMap(poolId);
if (!response.isSuccess()) { if (!response.isSuccess()) {
response = SdmResponse.failed("获取分析项库"); response = SdmResponse.failed("获取分析项库");
} }

View File

@@ -30,7 +30,7 @@ public interface ISimuluationTaskPoolFeignClient {
@GetMapping(value = "/taskpool/getTaskPoolTaskMap") @GetMapping(value = "/taskpool/getTaskPoolTaskMap")
@ResponseBody @ResponseBody
SdmResponse<Map<String, TaskBaseInfo>> getTaskPoolTaskMap(@RequestParam("poolName") long poolId, @RequestParam("version")String version); SdmResponse<Map<String, TaskBaseInfo>> getTaskPoolTaskMap(@RequestParam("poolId") long poolId);
} }

View File

@@ -4,6 +4,7 @@ package com.sdm.data.controller;
import com.sdm.common.common.SdmResponse; import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.data.GetFileSimulationMappingReq; import com.sdm.common.entity.req.data.GetFileSimulationMappingReq;
import com.sdm.common.entity.resp.data.FileMetadataInfoResp; import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import com.sdm.common.entity.resp.data.FileSimulationMappingResp;
import com.sdm.common.feign.inter.data.IFileSimulationMappingFeignClient; import com.sdm.common.feign.inter.data.IFileSimulationMappingFeignClient;
import com.sdm.common.entity.req.data.SaveFileSimulationMappingReq; import com.sdm.common.entity.req.data.SaveFileSimulationMappingReq;
import com.sdm.common.log.annotation.SysLog; import com.sdm.common.log.annotation.SysLog;
@@ -58,7 +59,4 @@ public class FileSimulationMappingController implements IFileSimulationMappingFe
public SdmResponse<Map<String, List<FileMetadataInfoResp>>> batchGetFileSimulationMappingBySimulationPoolIdAndVersion(@RequestBody GetFileSimulationMappingReq getFileSimulationMappingReq){ public SdmResponse<Map<String, List<FileMetadataInfoResp>>> batchGetFileSimulationMappingBySimulationPoolIdAndVersion(@RequestBody GetFileSimulationMappingReq getFileSimulationMappingReq){
return fileSimulationMappingService.batchGetFileSimulationMappingBySimulationPoolIdAndVersion(getFileSimulationMappingReq); return fileSimulationMappingService.batchGetFileSimulationMappingBySimulationPoolIdAndVersion(getFileSimulationMappingReq);
} }
} }

View File

@@ -1,24 +1,18 @@
package com.sdm.data.model.entity; package com.sdm.data.model.entity;
import com.baomidou.mybatisplus.annotation.*; import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.sdm.common.entity.req.data.SimulationPoolInfo;
import com.sdm.common.entity.resp.data.PoolInfo;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
* <p>
* 文件元数据信息表存储MinIO文件的元数据及层级关系
* </p>
*
* @author author
* @since 2025-10-29
*/
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@Accessors(chain = true) @Accessors(chain = true)
@@ -219,5 +213,12 @@ public class FileMetadataInfo implements Serializable {
@TableField(value = "analysisDirectionName", insertStrategy = FieldStrategy.NEVER,select = false,updateStrategy = FieldStrategy.NEVER) @TableField(value = "analysisDirectionName", insertStrategy = FieldStrategy.NEVER,select = false,updateStrategy = FieldStrategy.NEVER)
private String analysisDirectionName; private String analysisDirectionName;
@Schema(description = "关联工况库信息")
@TableField(exist = false)
private List<SimulationPoolInfo> simulationPoolInfoList;
@Schema(description= "仿真任务池信息列表")
@TableField(exist = false)
private List<PoolInfo> poolInfos;
} }

View File

@@ -1,6 +1,7 @@
package com.sdm.data.model.req; package com.sdm.data.model.req;
import com.alibaba.fastjson2.annotation.JSONField; import com.alibaba.fastjson2.annotation.JSONField;
import com.sdm.common.entity.req.data.SimulationPoolInfo;
import com.sdm.common.entity.req.data.UploadFilesReq; import com.sdm.common.entity.req.data.UploadFilesReq;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@@ -31,6 +32,9 @@ public class UpdateFileReq {
@Schema(description = "关联项目id") @Schema(description = "关联项目id")
private String projectId; private String projectId;
@Schema(description = "关联工况库信息")
private List<SimulationPoolInfo> simulationPoolInfoList;
/** /**
* 关联分析项目id * 关联分析项目id
* *
@@ -44,24 +48,6 @@ public class UpdateFileReq {
@Schema(description = "备注信息") @Schema(description = "备注信息")
private String remarks; private String remarks;
/**
* 所属工况库id
*/
@Schema(description = "所属工况库id")
private Integer simulationPoolId;
/**
* 工况库版本
*/
@Schema(description = "工况库版本")
private String simulationPoolVersion;
/**
* 关联工况
*/
@Schema(description = "关联工况")
private List<String> simulationPoolTaskIds;
@Schema(description = "知识库文件审批模板id") @Schema(description = "知识库文件审批模板id")
private String templateId; private String templateId;

View File

@@ -3,6 +3,7 @@ package com.sdm.data.service;
import com.sdm.common.common.SdmResponse; import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.data.GetFileSimulationMappingReq; import com.sdm.common.entity.req.data.GetFileSimulationMappingReq;
import com.sdm.common.entity.resp.data.FileMetadataInfoResp; import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import com.sdm.common.entity.resp.data.FileSimulationMappingResp;
import com.sdm.data.model.entity.FileSimulationMapping; import com.sdm.data.model.entity.FileSimulationMapping;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.sdm.common.entity.req.data.SaveFileSimulationMappingReq; import com.sdm.common.entity.req.data.SaveFileSimulationMappingReq;
@@ -19,7 +20,6 @@ import java.util.Map;
* @since 2025-12-02 * @since 2025-12-02
*/ */
public interface IFileSimulationMappingService extends IService<FileSimulationMapping> { public interface IFileSimulationMappingService extends IService<FileSimulationMapping> {
void saveFileSimulationMapping(Long fileId,Integer simulationPoolId,String simulationPoolVersion,List<String> simulationPoolTaskIds);
SdmResponse batchSaveFileSimulationMapping(List<SaveFileSimulationMappingReq> saveFileSimulationMappingReq); SdmResponse batchSaveFileSimulationMapping(List<SaveFileSimulationMappingReq> saveFileSimulationMappingReq);
@@ -34,4 +34,10 @@ public interface IFileSimulationMappingService extends IService<FileSimulationMa
* @return taskFileMapping; key: 工况任务ID; value: 文件信息列表 * @return taskFileMapping; key: 工况任务ID; value: 文件信息列表
*/ */
SdmResponse<Map<String, List<FileMetadataInfoResp>>> batchGetFileSimulationMappingBySimulationPoolIdAndVersion(GetFileSimulationMappingReq getFileSimulationMappingReq); SdmResponse<Map<String, List<FileMetadataInfoResp>>> batchGetFileSimulationMappingBySimulationPoolIdAndVersion(GetFileSimulationMappingReq getFileSimulationMappingReq);
/**
* 根据文件id查询绑定的工况Pool的ID和工况任务ID
* @return
*/
List<FileSimulationMappingResp> getFileSimulationMappingByFileId(List<Long> fileIds);
} }

View File

@@ -3,6 +3,7 @@ package com.sdm.data.service.impl;
import com.sdm.common.common.SdmResponse; import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.data.GetFileSimulationMappingReq; import com.sdm.common.entity.req.data.GetFileSimulationMappingReq;
import com.sdm.common.entity.resp.data.FileMetadataInfoResp; import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import com.sdm.common.entity.resp.data.FileSimulationMappingResp;
import com.sdm.data.model.entity.FileMetadataInfo; import com.sdm.data.model.entity.FileMetadataInfo;
import com.sdm.data.model.entity.FileSimulationMapping; import com.sdm.data.model.entity.FileSimulationMapping;
import com.sdm.data.dao.FileSimulationMappingMapper; import com.sdm.data.dao.FileSimulationMappingMapper;
@@ -10,6 +11,7 @@ import com.sdm.common.entity.req.data.SaveFileSimulationMappingReq;
import com.sdm.data.service.IFileMetadataInfoService; import com.sdm.data.service.IFileMetadataInfoService;
import com.sdm.data.service.IFileSimulationMappingService; import com.sdm.data.service.IFileSimulationMappingService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import io.jsonwebtoken.lang.Collections;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -33,26 +35,14 @@ public class FileSimulationMappingServiceImpl extends ServiceImpl<FileSimulation
@Autowired @Autowired
IFileMetadataInfoService fileMetadataInfoService; IFileMetadataInfoService fileMetadataInfoService;
public void saveFileSimulationMapping(Long fileId, Integer simulationPoolId, String simulationPoolVersion, List<String> simulationPoolTaskIds) {
// 先删除原先所有的文件绑定关系
this.lambdaUpdate().eq(FileSimulationMapping::getFileId, fileId).remove();
// 再新增新的文件绑定关系
for (String simulationPoolTaskId : simulationPoolTaskIds) {
FileSimulationMapping fileSimulationMapping = new FileSimulationMapping();
fileSimulationMapping.setFileId(fileId);
fileSimulationMapping.setSimulationPoolId(simulationPoolId);
fileSimulationMapping.setSimulationPoolVersion(simulationPoolVersion);
fileSimulationMapping.setSimulationPoolTaskId(simulationPoolTaskId);
this.save(fileSimulationMapping);
}
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public SdmResponse batchSaveFileSimulationMapping(List<SaveFileSimulationMappingReq> saveFileSimulationMappingReqList) { public SdmResponse batchSaveFileSimulationMapping(List<SaveFileSimulationMappingReq> saveFileSimulationMappingReqList) {
List<Long> fileIds = new ArrayList<>();
List<FileSimulationMapping> fileSimulationMappings = new ArrayList<>(); List<FileSimulationMapping> fileSimulationMappings = new ArrayList<>();
for (SaveFileSimulationMappingReq fileSimulationMappingReq : saveFileSimulationMappingReqList) { for (SaveFileSimulationMappingReq fileSimulationMappingReq : saveFileSimulationMappingReqList) {
fileSimulationMappingReq.getFileIds().forEach(fileId -> { fileSimulationMappingReq.getFileIds().forEach(fileId -> {
fileIds.add(fileId);
FileSimulationMapping fileSimulationMapping = new FileSimulationMapping(); FileSimulationMapping fileSimulationMapping = new FileSimulationMapping();
fileSimulationMapping.setFileId(fileId); fileSimulationMapping.setFileId(fileId);
fileSimulationMapping.setSimulationPoolId(fileSimulationMappingReq.getSimulationPoolId()); fileSimulationMapping.setSimulationPoolId(fileSimulationMappingReq.getSimulationPoolId());
@@ -61,6 +51,8 @@ public class FileSimulationMappingServiceImpl extends ServiceImpl<FileSimulation
fileSimulationMappings.add(fileSimulationMapping); fileSimulationMappings.add(fileSimulationMapping);
}); });
} }
// 先删除原先所有的文件绑定关系
this.lambdaUpdate().in(FileSimulationMapping::getFileId, fileIds).remove();
this.saveBatch(fileSimulationMappings); this.saveBatch(fileSimulationMappings);
return SdmResponse.success(); return SdmResponse.success();
} }
@@ -114,4 +106,19 @@ public class FileSimulationMappingServiceImpl extends ServiceImpl<FileSimulation
return SdmResponse.success(simulationPoolTaskId2Files); return SdmResponse.success(simulationPoolTaskId2Files);
} }
public List<FileSimulationMappingResp> getFileSimulationMappingByFileId(List<Long> fileIds){
if(Collections.isEmpty(fileIds)){
return Collections.emptyList();
}
List<FileSimulationMapping> fileSimulationMappings = this.lambdaQuery().in(FileSimulationMapping::getFileId, fileIds).list();
List<FileSimulationMappingResp> resp = new ArrayList<>();
fileSimulationMappings.forEach(fileSimulationMapping -> {
FileSimulationMappingResp fileSimulationMappingResp = new FileSimulationMappingResp();
BeanUtils.copyProperties(fileSimulationMapping, fileSimulationMappingResp);
resp.add(fileSimulationMappingResp);
});
return resp;
}
} }

View File

@@ -13,6 +13,7 @@ import com.sdm.common.entity.ExportExcelFormat;
import com.sdm.common.entity.constants.NumberConstants; import com.sdm.common.entity.constants.NumberConstants;
import com.sdm.common.entity.constants.PermConstants; import com.sdm.common.entity.constants.PermConstants;
import com.sdm.common.entity.enums.*; import com.sdm.common.entity.enums.*;
import com.sdm.common.entity.pojo.task.TaskBaseInfo;
import com.sdm.common.entity.req.data.*; import com.sdm.common.entity.req.data.*;
import com.sdm.common.entity.req.project.SpdmNodeListReq; import com.sdm.common.entity.req.project.SpdmNodeListReq;
import com.sdm.common.entity.req.system.LaunchApproveReq; import com.sdm.common.entity.req.system.LaunchApproveReq;
@@ -22,18 +23,22 @@ import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.entity.resp.data.BatchAddFileInfoResp; import com.sdm.common.entity.resp.data.BatchAddFileInfoResp;
import com.sdm.common.entity.resp.data.ChunkUploadMinioFileResp; import com.sdm.common.entity.resp.data.ChunkUploadMinioFileResp;
import com.sdm.common.entity.resp.data.FileMetadataInfoResp; import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import com.sdm.common.entity.resp.data.FileSimulationMappingResp;
import com.sdm.common.entity.resp.project.SimulationNodeResp; import com.sdm.common.entity.resp.project.SimulationNodeResp;
import com.sdm.common.entity.resp.system.CIDUserResp; import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.feign.impl.project.SimulationNodeFeignClientImpl; import com.sdm.common.feign.impl.project.SimulationNodeFeignClientImpl;
import com.sdm.common.feign.impl.system.SysUserFeignClientImpl; import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
import com.sdm.common.feign.inter.project.ISimulationNodeFeignClient; import com.sdm.common.feign.inter.project.ISimulationNodeFeignClient;
import com.sdm.common.feign.inter.system.IApproveFeignClient; import com.sdm.common.feign.inter.system.IApproveFeignClient;
import com.sdm.common.feign.inter.task.ISimuluationTaskPoolFeignClient;
import com.sdm.common.log.CoreLogger; import com.sdm.common.log.CoreLogger;
import com.sdm.common.utils.*; import com.sdm.common.utils.*;
import com.sdm.common.utils.excel.ExcelUtil; import com.sdm.common.utils.excel.ExcelUtil;
import com.sdm.data.aop.PermissionCheckAspect; import com.sdm.data.aop.PermissionCheckAspect;
import com.sdm.data.model.bo.ApprovalFileDataContentsModel; import com.sdm.data.model.bo.ApprovalFileDataContentsModel;
import com.sdm.data.model.entity.*; import com.sdm.data.model.entity.*;
import com.sdm.common.entity.resp.data.PoolInfo;
import com.sdm.data.model.req.*; import com.sdm.data.model.req.*;
import com.sdm.data.model.resp.KKFileViewURLFromMinioResp; import com.sdm.data.model.resp.KKFileViewURLFromMinioResp;
import com.sdm.data.service.*; import com.sdm.data.service.*;
@@ -139,6 +144,9 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
@Autowired @Autowired
private IFileSimulationMappingService fileSimulationMappingService; private IFileSimulationMappingService fileSimulationMappingService;
@Autowired
private ISimuluationTaskPoolFeignClient isSimuluationTaskPoolFeignClient;
@Autowired @Autowired
@Qualifier(value = "nonSensitiveTaskPool") @Qualifier(value = "nonSensitiveTaskPool")
private Executor nonSensitiveTaskPool; private Executor nonSensitiveTaskPool;
@@ -397,10 +405,18 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
} }
fileMetadataExtensionService.saveBatch(fileMetadataExtensionList); fileMetadataExtensionService.saveBatch(fileMetadataExtensionList);
//绑定文件和工况库的关系 //绑定文件和工况库的关系
if (CollectionUtils.isNotEmpty(req.getSimulationPoolInfoList())) { if (CollectionUtils.isNotEmpty(req.getSimulationPoolInfoList())) {
for (SimulationPoolInfo simulationPoolInfo : req.getSimulationPoolInfoList()) { for (SimulationPoolInfo simulationPoolInfo : req.getSimulationPoolInfoList()) {
fileSimulationMappingService.saveFileSimulationMapping(fileInfo.getId(),simulationPoolInfo.getSimulationPoolId(),simulationPoolInfo.getSimulationPoolVersion(),simulationPoolInfo.getSimulationPoolTaskIds()); for (String simulationPoolTaskId : simulationPoolInfo.getSimulationPoolTaskIds()) {
FileSimulationMapping fileSimulationMapping = new FileSimulationMapping();
fileSimulationMapping.setFileId(fileInfo.getId());
fileSimulationMapping.setSimulationPoolId(simulationPoolInfo.getSimulationPoolId());
fileSimulationMapping.setSimulationPoolVersion(simulationPoolInfo.getSimulationPoolVersion());
fileSimulationMapping.setSimulationPoolTaskId(simulationPoolTaskId);
fileSimulationMappingService.save(fileSimulationMapping);
}
} }
} }
@@ -938,6 +954,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
setCidInfos(files); setCidInfos(files);
setProjectName(files); setProjectName(files);
setAnalysisDirectionName(files); setAnalysisDirectionName(files);
setSimulationPoolAndTaskInfo(files);
PageInfo<FileMetadataInfo> page = new PageInfo<>(files); PageInfo<FileMetadataInfo> page = new PageInfo<>(files);
return PageUtils.getJsonObjectSdmResponse(files, page); return PageUtils.getJsonObjectSdmResponse(files, page);
} }
@@ -996,6 +1013,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
setCidInfos(list); setCidInfos(list);
setProjectName(list); setProjectName(list);
setAnalysisDirectionName(list); setAnalysisDirectionName(list);
setSimulationPoolAndTaskInfo(list);
PageInfo<FileMetadataInfo> page = new PageInfo<>(list); PageInfo<FileMetadataInfo> page = new PageInfo<>(list);
long total = page.getTotal(); long total = page.getTotal();
List<FileMetadataInfoResp> dtoList = list.stream().map(entity -> { List<FileMetadataInfoResp> dtoList = list.stream().map(entity -> {
@@ -1367,6 +1385,21 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
.orElse(null); .orElse(null);
} }
//绑定文件和工况库的关系
if (CollectionUtils.isNotEmpty(req.getSimulationPoolInfoList())) {
for (SimulationPoolInfo simulationPoolInfo : req.getSimulationPoolInfoList()) {
for (String simulationPoolTaskId : simulationPoolInfo.getSimulationPoolTaskIds()) {
FileSimulationMapping fileSimulationMapping = new FileSimulationMapping();
fileSimulationMapping.setFileId(fileInfo.getId());
fileSimulationMapping.setSimulationPoolId(simulationPoolInfo.getSimulationPoolId());
fileSimulationMapping.setSimulationPoolVersion(simulationPoolInfo.getSimulationPoolVersion());
fileSimulationMapping.setSimulationPoolTaskId(simulationPoolTaskId);
fileSimulationMappingService.save(fileSimulationMapping);
}
}
}
// 调用审批流,开启审批; 上面先入库拿到主键id,审批流创建失败后再回退数据 // 调用审批流,开启审批; 上面先入库拿到主键id,审批流创建失败后再回退数据
// String templateId, String templateName,String approveContents,int approveAction1新增 2修改 3删除 // String templateId, String templateName,String approveContents,int approveAction1新增 2修改 3删除
if(isknowledge){ if(isknowledge){
@@ -1402,13 +1435,6 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
} }
fileMetadataExtensionService.saveBatch(fileMetadataExtensionList); fileMetadataExtensionService.saveBatch(fileMetadataExtensionList);
//绑定文件和工况库的关系
if(CollectionUtils.isNotEmpty(req.getSimulationPoolInfoList())){
for (SimulationPoolInfo simulationPoolInfo : req.getSimulationPoolInfoList()) {
fileSimulationMappingService.saveFileSimulationMapping(fileInfo.getId(),simulationPoolInfo.getSimulationPoolId(),simulationPoolInfo.getSimulationPoolVersion(),simulationPoolInfo.getSimulationPoolTaskIds());
}
}
// 创建默认权限记录 // 创建默认权限记录
createFilePermission(fileInfo.getId()); createFilePermission(fileInfo.getId());
@@ -1517,6 +1543,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
tempFileMetadataInfo.setProjectId(req.getProjectId()); tempFileMetadataInfo.setProjectId(req.getProjectId());
tempFileMetadataInfo.setAnalysisDirectionId(req.getAnalysisDirectionId()); tempFileMetadataInfo.setAnalysisDirectionId(req.getAnalysisDirectionId());
tempFileMetadataInfo.setRemarks(req.getRemarks()); tempFileMetadataInfo.setRemarks(req.getRemarks());
tempFileMetadataInfo.setSimulationPoolInfoList(req.getSimulationPoolInfoList());
fileMetadataInfo.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey()); fileMetadataInfo.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
fileMetadataInfo.setApproveType(ApproveFileDataTypeEnum.MODIFY_METADATA_REVIEWING.getCode()); fileMetadataInfo.setApproveType(ApproveFileDataTypeEnum.MODIFY_METADATA_REVIEWING.getCode());
@@ -1588,6 +1615,22 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
fileInfo.setIsLatest(false); fileInfo.setIsLatest(false);
} }
fileMetadataInfoService.save(fileInfo); fileMetadataInfoService.save(fileInfo);
//绑定文件和工况库的关系
if (CollectionUtils.isNotEmpty(req.getSimulationPoolInfoList())) {
for (SimulationPoolInfo simulationPoolInfo : req.getSimulationPoolInfoList()) {
for (String simulationPoolTaskId : simulationPoolInfo.getSimulationPoolTaskIds()) {
FileSimulationMapping fileSimulationMapping = new FileSimulationMapping();
fileSimulationMapping.setFileId(fileInfo.getId());
fileSimulationMapping.setSimulationPoolId(simulationPoolInfo.getSimulationPoolId());
fileSimulationMapping.setSimulationPoolVersion(simulationPoolInfo.getSimulationPoolVersion());
fileSimulationMapping.setSimulationPoolTaskId(simulationPoolTaskId);
fileSimulationMappingService.save(fileSimulationMapping);
}
}
}
// 知识库创建审批流 // 知识库创建审批流
if(dirMetadataInfo!=null&&Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType())){ if(dirMetadataInfo!=null&&Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType())){
// 获取前后变化的file信息 // 获取前后变化的file信息
@@ -1643,11 +1686,6 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
// 创建默认权限记录 // 创建默认权限记录
createFilePermission(fileInfo.getId()); createFilePermission(fileInfo.getId());
//绑定文件和工况库的关系
if(ObjectUtils.isNotEmpty(req.getSimulationPoolId()) && Objects.nonNull(req.getSimulationPoolVersion()) && CollectionUtils.isNotEmpty(req.getSimulationPoolTaskIds())){
fileSimulationMappingService.saveFileSimulationMapping(fileInfo.getId(),req.getSimulationPoolId(),req.getSimulationPoolVersion(),req.getSimulationPoolTaskIds());
}
// 非知识库的,设置 历史版本 文件为非最新 // 非知识库的,设置 历史版本 文件为非最新
if(!(dirMetadataInfo!=null&&Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType()))){ if(!(dirMetadataInfo!=null&&Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType()))){
fileMetadataInfo.setIsLatest(false); fileMetadataInfo.setIsLatest(false);
@@ -2134,6 +2172,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
setCreatorNames(beforeDatas); setCreatorNames(beforeDatas);
setProjectName(beforeDatas); setProjectName(beforeDatas);
setAnalysisDirectionName(beforeDatas); setAnalysisDirectionName(beforeDatas);
setSimulationPoolAndTaskInfo(beforeDatas);
} }
contentsModel.setBeforeData(beforeDatas); contentsModel.setBeforeData(beforeDatas);
// 只有修改有 afterData 值 // 只有修改有 afterData 值
@@ -2142,6 +2181,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
setCreatorNames(afterDatas); setCreatorNames(afterDatas);
setProjectName(afterDatas); setProjectName(afterDatas);
setAnalysisDirectionName(afterDatas); setAnalysisDirectionName(afterDatas);
setSimulationPoolAndTaskInfo(afterDatas);
} }
contentsModel.setAfterData(afterDatas); contentsModel.setAfterData(afterDatas);
} }
@@ -2282,6 +2322,80 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
} }
} }
private void setSimulationPoolAndTaskInfo(List<FileMetadataInfo> list) {
if (ObjectUtils.isNotEmpty(list)) {
List<Long> fileIds = list.stream()
.map(FileMetadataInfo::getId)
.distinct()
.toList();
List<TaskBaseInfo> result = new ArrayList<>();
List<FileSimulationMappingResp> fileSimulationMappingByFileId = fileSimulationMappingService.getFileSimulationMappingByFileId(fileIds);
if(CollectionUtils.isEmpty(fileSimulationMappingByFileId)){
return;
}
fileSimulationMappingByFileId.forEach(fileSimulationMappingResp -> {
SdmResponse<Map<String, TaskBaseInfo>> taskPoolTaskMap = isSimuluationTaskPoolFeignClient.getTaskPoolTaskMap(fileSimulationMappingResp.getSimulationPoolId());
if(taskPoolTaskMap.isSuccess() && !Objects.isNull(taskPoolTaskMap.getData())) {
Map<String, TaskBaseInfo> data = taskPoolTaskMap.getData();
TaskBaseInfo taskBaseInfo = data.getOrDefault(fileSimulationMappingResp.getSimulationPoolTaskId(), null);
taskBaseInfo.setPoolId(fileSimulationMappingResp.getSimulationPoolId());
taskBaseInfo.setFileId(fileSimulationMappingResp.getFileId());
result.add(taskBaseInfo);
}
});
// 按 fileId 和 poolId 双重分组
Map<Long, Map<Long, List<TaskBaseInfo>>> fileTaskPoolMap = result.stream()
.collect(Collectors.groupingBy(
TaskBaseInfo::getFileId,
Collectors.groupingBy(TaskBaseInfo::getPoolId)
));
// 按 fileId 和 poolId 分组收集 simulationPoolTaskId
Map<Long, Map<Long, List<String>>> filePoolTaskIdsMap = fileSimulationMappingByFileId.stream()
.collect(Collectors.groupingBy(
FileSimulationMappingResp::getFileId,
Collectors.groupingBy(
FileSimulationMappingResp::getSimulationPoolId,
Collectors.mapping(FileSimulationMappingResp::getSimulationPoolTaskId, Collectors.toList())
)
));
// 为每个文件创建 PoolInfo 列表
for (FileMetadataInfo fileMetadataInfo : list) {
Long fileId = fileMetadataInfo.getId();
if (fileTaskPoolMap.containsKey(fileId)) {
Map<Long, List<TaskBaseInfo>> poolMap = fileTaskPoolMap.get(fileId);
Map<Long, List<String>> poolTaskIdsMap = filePoolTaskIdsMap.getOrDefault(fileId, new HashMap<>());
List<PoolInfo> poolInfos = new ArrayList<>();
for (Map.Entry<Long, List<TaskBaseInfo>> poolEntry : poolMap.entrySet()) {
Long poolId = poolEntry.getKey();
List<TaskBaseInfo> taskList = poolEntry.getValue();
List<String> taskIds = poolTaskIdsMap.getOrDefault(poolId, new ArrayList<>());
PoolInfo poolInfo = new PoolInfo();
poolInfo.setSimulationPoolId(poolId);
poolInfo.setSimulationPoolName("");
poolInfo.setSimulationPoolVersion("");
poolInfo.setSimulationPoolTaskIds(taskIds);
poolInfo.setTaskBaseInfoList(taskList);
if(CollectionUtils.isNotEmpty(taskList)) {
poolInfo.setSimulationPoolName(taskList.get(0).getPoolName());
poolInfo.setSimulationPoolVersion(taskList.get(0).getPoolName());
}
poolInfos.add(poolInfo);
}
fileMetadataInfo.setPoolInfos(poolInfos);
}
}
}
}

View File

@@ -3,11 +3,17 @@ package com.sdm.data.service.impl.dataFileHandle;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.sdm.common.entity.constants.NumberConstants; import com.sdm.common.entity.constants.NumberConstants;
import com.sdm.common.entity.enums.ApproveFileDataTypeEnum; import com.sdm.common.entity.enums.ApproveFileDataTypeEnum;
import com.sdm.common.entity.req.data.SimulationPoolInfo;
import com.sdm.data.model.entity.FileMetadataInfo; import com.sdm.data.model.entity.FileMetadataInfo;
import com.sdm.data.model.entity.FileSimulationMapping;
import com.sdm.data.service.IFileMetadataInfoService; import com.sdm.data.service.IFileMetadataInfoService;
import com.sdm.data.service.IFileSimulationMappingService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
@Service @Service
@Slf4j @Slf4j
public class ModifyMetadataApproveStrategy implements ApproveStrategy { public class ModifyMetadataApproveStrategy implements ApproveStrategy {
@@ -17,6 +23,7 @@ public class ModifyMetadataApproveStrategy implements ApproveStrategy {
FileMetadataInfo metadata = context.getApproveMetadataInfos().get(0); FileMetadataInfo metadata = context.getApproveMetadataInfos().get(0);
int status = context.getApproveStatus(); int status = context.getApproveStatus();
IFileMetadataInfoService service = context.getFileMetadataInfoService(); IFileMetadataInfoService service = context.getFileMetadataInfoService();
IFileSimulationMappingService fileSimulationMappingService = context.getFileSimulationMappingService();
// 审批通过 // 审批通过
if (NumberConstants.TWO == status) { if (NumberConstants.TWO == status) {
@@ -27,6 +34,23 @@ public class ModifyMetadataApproveStrategy implements ApproveStrategy {
updateInfo.setApprovalStatus(null); updateInfo.setApprovalStatus(null);
updateInfo.setApproveType(ApproveFileDataTypeEnum.COMPLETED.getCode()); updateInfo.setApproveType(ApproveFileDataTypeEnum.COMPLETED.getCode());
service.updateById(updateInfo); service.updateById(updateInfo);
//绑定文件和工况库的关系
List<SimulationPoolInfo> simulationPoolInfoList = updateInfo.getSimulationPoolInfoList();
if (CollectionUtils.isNotEmpty(simulationPoolInfoList)) {
// 先删除原先所有的文件绑定关系
fileSimulationMappingService.lambdaUpdate().eq(FileSimulationMapping::getFileId, metadata.getId()).remove();
for (SimulationPoolInfo simulationPoolInfo : simulationPoolInfoList) {
for (String simulationPoolTaskId : simulationPoolInfo.getSimulationPoolTaskIds()) {
FileSimulationMapping fileSimulationMapping = new FileSimulationMapping();
fileSimulationMapping.setFileId(metadata.getId());
fileSimulationMapping.setSimulationPoolId(simulationPoolInfo.getSimulationPoolId());
fileSimulationMapping.setSimulationPoolVersion(simulationPoolInfo.getSimulationPoolVersion());
fileSimulationMapping.setSimulationPoolTaskId(simulationPoolTaskId);
fileSimulationMappingService.save(fileSimulationMapping);
}
}
}
return true; return true;
} }

View File

@@ -165,7 +165,20 @@ public class ProcessController implements IFlowableFeignClient {
} }
/** /**
* 用户点击"重试"按钮传入目标节点ID * 重试任务,目前只能重试当前失败的节点
*/
@PostMapping("/retryFailedNode")
public SdmResponse retryFailedNode(@RequestParam String processInstanceId, @RequestParam String failNodeId) {
log.info("开始重试任务: {}",failNodeId);
try {
processService.retryFailedNode(processInstanceId, failNodeId);
return SdmResponse.success("重试任务已提交");
} catch (Exception e) {
return SdmResponse.failed("重试失败");
}
}
/**
* 用户点击"重试"按钮传入目标节点ID ,可以从任意节点重试
* *
* @param request 重试请求参数包括流程实例ID、目标节点ID和新变量 * @param request 重试请求参数包括流程实例ID、目标节点ID和新变量
* @return 重试结果 * @return 重试结果

View File

@@ -16,8 +16,10 @@ import com.sdm.flowable.service.IProcessNodeParamService;
import com.sdm.flowable.util.Dto2BpmnConverter; import com.sdm.flowable.util.Dto2BpmnConverter;
import com.sdm.flowable.util.FlowNodeIdUtils; import com.sdm.flowable.util.FlowNodeIdUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.flowable.bpmn.model.*; import org.flowable.bpmn.model.*;
import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.Process;
import org.flowable.common.engine.api.FlowableException;
import org.flowable.engine.*; import org.flowable.engine.*;
import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstance;
@@ -203,6 +205,8 @@ public class ProcessService {
List<Execution> executions = runtimeService.createExecutionQuery() List<Execution> executions = runtimeService.createExecutionQuery()
.processInstanceId(processInstanceId).list(); .processInstanceId(processInstanceId).list();
Map<String, String> executionToActivityMap = executions.stream() Map<String, String> executionToActivityMap = executions.stream()
// 【关键】过滤掉 activityId 为 null 的记录根执行实例Root Execution代表流程实例本身的那条记录它的 activityId 通常是 null
.filter(e -> e.getActivityId() != null)
.collect(Collectors.toMap(Execution::getId, Execution::getActivityId, (v1, v2) -> v1)); .collect(Collectors.toMap(Execution::getId, Execution::getActivityId, (v1, v2) -> v1));
// 填充错误 Map // 填充错误 Map
@@ -510,6 +514,57 @@ public class ProcessService {
log.info("异步回调处理转发完成, 任务ID: {}", request.getAsyncTaskId()); log.info("异步回调处理转发完成, 任务ID: {}", request.getAsyncTaskId());
} }
/**
* 查找特定节点的死信作业ID用于后续重试操作。
* @param processInstanceId 流程实例ID
* @param activityId 节点ID
* @return
*/
private String findDeadJobId(String processInstanceId, String activityId) {
// 1. 先查出该实例下所有的死信作业 (通常不会很多)
List<Job> deadJobs = managementService.createDeadLetterJobQuery()
.processInstanceId(processInstanceId)
.list();
if (deadJobs.isEmpty()) {
throw new RuntimeException("未找到任何死信作业,请确认流程是否已结束或任务处于重试等待中");
}
// 2. 查出该实例下所有的 Execution (为了获取 ActivityId 映射)
// 这样只需要查 2 次数据库,而不是 N+1 次
List<Execution> executions = runtimeService.createExecutionQuery()
.processInstanceId(processInstanceId)
.list();
// 3. 构建 ExecutionId -> ActivityId 的映射
Map<String, String> execActivityMap = executions.stream()
.filter(e -> e.getActivityId() != null)
.collect(Collectors.toMap(Execution::getId, Execution::getActivityId, (v1, v2) -> v1));
// 4. 在内存中匹配找到对应的 Job
return deadJobs.stream()
.filter(job -> {
String actId = execActivityMap.get(job.getExecutionId());
return activityId.equals(actId);
})
.findFirst()
.map(Job::getId)
.orElseThrow(() -> new RuntimeException("在死信队列中未找到节点 [" + activityId + "] 的作业"));
}
public void retryFailedNode( String processInstanceId,String failNodeId) {
try {
// 2. 查找 Job ID (参考上面的代码)
String jobId = findDeadJobId(processInstanceId, failNodeId);
// 3. 执行重试
managementService.moveDeadLetterJobToExecutableJob(jobId, 3);
log.info("作业已恢复,等待异步执行器拾取执行...");
} catch (Exception e) {
log.error("重试节点失败, 流程ID: {}, 节点ID: {}, 异常信息: {}", processInstanceId, failNodeId, e.getMessage(), e);
throw new RuntimeException("重试失败");
}
}
/** /**
* 用户点击"重试"按钮传入目标节点ID * 用户点击"重试"按钮传入目标节点ID
* *

View File

@@ -121,5 +121,6 @@ security:
paths: paths:
- /run/deliverableApproveCallback - /run/deliverableApproveCallback
- /run/getSimulationKeyResultFileIds - /run/getSimulationKeyResultFileIds
- /run/generateReportInternal
#logging: #logging:
# config: ./config/logback.xml # config: ./config/logback.xml

View File

@@ -127,3 +127,4 @@ security:
paths: paths:
- /run/deliverableApproveCallback - /run/deliverableApproveCallback
- /run/getSimulationKeyResultFileIds - /run/getSimulationKeyResultFileIds
- /run/generateReportInternal

View File

@@ -112,7 +112,7 @@ public class SimuluationTaskPoolController implements ISimuluationTaskPoolFeignC
@GetMapping(value = "/getTaskPoolTaskMap") @GetMapping(value = "/getTaskPoolTaskMap")
@ResponseBody @ResponseBody
public SdmResponse<Map<String, TaskBaseInfo>> getTaskPoolTaskMap(@RequestParam("poolId") long poolId, @RequestParam("version")String version) public SdmResponse<Map<String, TaskBaseInfo>> getTaskPoolTaskMap(@RequestParam("poolId") long poolId)
{ {
return service.getSimulationTasksByPoolId(poolId); return service.getSimulationTasksByPoolId(poolId);
} }