知识库绑定工况库,知识库搜索、审批流程展示工况库
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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("获取分析项库");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 approveAction:1:新增 2:修改 3:删除
|
// String templateId, String templateName,String approveContents,int approveAction:1:新增 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 重试结果
|
||||||
|
|||||||
@@ -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
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -127,3 +127,4 @@ security:
|
|||||||
paths:
|
paths:
|
||||||
- /run/deliverableApproveCallback
|
- /run/deliverableApproveCallback
|
||||||
- /run/getSimulationKeyResultFileIds
|
- /run/getSimulationKeyResultFileIds
|
||||||
|
- /run/generateReportInternal
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user