> response = simuluationNodeFeignClient.getAllNodeByProjectIdAndType(List.of(uuid), queryNodeType);
Long tenantId = ThreadLocalContext.getTenantId();
if (!response.isSuccess()) {
log.error("获取节点信息失败");
diff --git a/data/src/main/java/com/sdm/data/service/impl/DimensionTemplateServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/DimensionTemplateServiceImpl.java
index 9b7de3cb..f9d152b6 100644
--- a/data/src/main/java/com/sdm/data/service/impl/DimensionTemplateServiceImpl.java
+++ b/data/src/main/java/com/sdm/data/service/impl/DimensionTemplateServiceImpl.java
@@ -16,11 +16,15 @@ import com.sdm.common.entity.req.data.UploadFilesReq;
import com.sdm.common.entity.req.project.DelNodeReq;
import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.resp.AllNodeByProjectIdAndTypeResp;
+import com.sdm.common.entity.resp.PageDataResp;
+import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.feign.impl.project.SimulationNodeFeignClientImpl;
import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
import com.sdm.common.utils.CidSysUserUtil;
import com.sdm.common.utils.PageUtils;
+import com.sdm.data.convert.FileMetadataConvert;
+import com.sdm.data.model.dto.FileMetadataChildrenDTO;
import com.sdm.data.model.entity.DimensionTemplate;
import com.sdm.data.dao.DimensionTemplateMapper;
import com.sdm.data.model.entity.DimensionTemplateHierarchy;
@@ -36,16 +40,15 @@ 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.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.*;
-import java.util.stream.Stream;
+import java.util.stream.Collectors;
/**
*
@@ -179,7 +182,7 @@ public class DimensionTemplateServiceImpl extends ServiceImpl> getSimulationNodeTree(GetSimulationNodeTreeReq req) {
+ public SdmResponse> getSimulationNodeTree(GetSimulationNodeTreeReq req) {
Long tenantId = ThreadLocalContext.getTenantId();
// 根据展示维度获取展示节点类型顺序
Long dimensionTemplateId = req.getDimensionTemplateId();
@@ -189,26 +192,26 @@ public class DimensionTemplateServiceImpl extends ServiceImpl uuids = new ArrayList<>();
List resultDir = new ArrayList<>();
- if (ObjectUtils.isEmpty(req.getFileId())) {
+ if (ObjectUtils.isEmpty(req.getFileIds())) {
// 选中维度了,没有选节点,按照模版,展示模版的第一层节点数据
String rootNodeType = dimensionNodeTyepOrderList.get(0);
SdmResponse> allNodeByNodeTypeResponse = simuluationNodeFeignClient.getAllNodeByNodeType(null, rootNodeType);
if (!allNodeByNodeTypeResponse.isSuccess()) {
log.error("获取节点信息失败");
- return SdmResponse.success();
+ return SdmResponse.success(Collections.emptyList());
}
uuids.addAll(allNodeByNodeTypeResponse.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList());
} else {
// 选中维度了,也选中了节点,按照模版,展示该节点下的普通文件夹、任务、算列、按照展示模版指定的下一层节点文件夹
- Long fileId = req.getFileId();
+ List fileIds = req.getFileIds();
// 1、先获取普通文件夹
List dirInfos = fileMetadataInfoService
.lambdaQuery()
.eq(FileMetadataInfo::getTenantId, tenantId)
- .eq(FileMetadataInfo::getParentId, fileId)
+ .in(FileMetadataInfo::getParentId, fileIds)
.eq(FileMetadataInfo::getDataType, DataTypeEnum.DIRECTORY.getValue())
.isNull(FileMetadataInfo::getRelatedResourceUuid)
.list();
@@ -216,46 +219,48 @@ public class DimensionTemplateServiceImpl extends ServiceImpl nodeDirInfos = fileMetadataInfoService.lambdaQuery().in(FileMetadataInfo::getId, fileIds).list();
+ if(CollectionUtils.isNotEmpty(nodeDirInfos)) {
+ String chooseNodeType = nodeDirInfos.get(0).getRelatedResourceUuidOwnType();
+ List chooseUuids = nodeDirInfos.stream().map(FileMetadataInfo::getRelatedResourceUuid).toList();
- // chooseUuid和chooseNodeType不为空,并且是node节点类型,才是节点文件夹,才需要查询子节点文件夹文件
- if (ObjectUtils.isNotEmpty(chooseUuid) && ObjectUtils.isNotEmpty(chooseNodeType) && NodeTypeEnum.isNodeType(chooseNodeType)) {
- // 从dimensionNodeTyepOrderList中获取chooseNodeType下一个位置的数据,有可能chooseNodeType所在位置就是最后一层节点,SdmResponse返回空数据
- int index = dimensionNodeTyepOrderList.indexOf(chooseNodeType);
- if (index == -1) {
- return SdmResponse.failed("选中节点类型不在数据展示维度中");
- }
-
- // 判断是否是最后一层节点,如果是最后一层节点,则不需要查询子节点文件
- if (index != dimensionNodeTyepOrderList.size() - 1) {
- // 获取dimensionNodeTyepOrderList的index+1位置的节点类型
- String nextNodeType = dimensionNodeTyepOrderList.get(index + 1);
- SdmResponse> allNodeByProjectIdAndType = simuluationNodeFeignClient.getAllNodeByProjectIdAndType(chooseUuid, nextNodeType);
- if (allNodeByProjectIdAndType.isSuccess() && ObjectUtils.isNotEmpty(allNodeByProjectIdAndType.getData())) {
- uuids.addAll(allNodeByProjectIdAndType.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList());
+ // chooseUuid和chooseNodeType不为空,并且是node节点类型,才是节点文件夹,才需要查询子节点文件夹文件
+ if (ObjectUtils.isNotEmpty(chooseUuids) && ObjectUtils.isNotEmpty(chooseNodeType) && NodeTypeEnum.isNodeType(chooseNodeType)) {
+ // 从dimensionNodeTyepOrderList中获取chooseNodeType下一个位置的数据,有可能chooseNodeType所在位置就是最后一层节点,SdmResponse返回空数据
+ int index = dimensionNodeTyepOrderList.indexOf(chooseNodeType);
+ if (index == -1) {
+ return SdmResponse.failed("选中节点类型不在数据展示维度中");
}
+ // 判断是否是最后一层节点,如果是最后一层节点,则不需要查询子节点文件
+ if (index != dimensionNodeTyepOrderList.size() - 1) {
+ // 获取dimensionNodeTyepOrderList的index+1位置的节点类型
+ String nextNodeType = dimensionNodeTyepOrderList.get(index + 1);
+ SdmResponse> allNodeByProjectIdAndType = simuluationNodeFeignClient.getAllNodeByProjectIdAndType(chooseUuids, nextNodeType);
+ if (allNodeByProjectIdAndType.isSuccess() && ObjectUtils.isNotEmpty(allNodeByProjectIdAndType.getData())) {
+ uuids.addAll(allNodeByProjectIdAndType.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList());
+ }
+
+ }
+
+ // 3、获取当前节点下的任务、算列
+ SdmResponse> nodeTaskList = simuluationNodeFeignClient.getNodeTaskList(chooseUuids);
+ if (nodeTaskList.isSuccess()) {
+ uuids.addAll(nodeTaskList.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList());
+ log.info("获取节点下task的uudis:{}", uuids);
+ }
+
+ SdmResponse> taskRunList = simuluationNodeFeignClient.getTaskRunList(chooseUuids);
+ if (taskRunList.isSuccess()) {
+ uuids.addAll(taskRunList.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList());
+ log.info("获取节点下taskRun的uudis:{}", uuids);
+ }
}
}
-
- // 3、获取当前节点下的任务、算列
- SdmResponse> nodeTaskList = simuluationNodeFeignClient.getNodeTaskList(chooseUuid);
- if (nodeTaskList.isSuccess()) {
- uuids.addAll(nodeTaskList.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList());
- log.info("获取节点下task的uudis:{}", uuids);
- }
-
- SdmResponse> taskRunList = simuluationNodeFeignClient.getTaskRunList(chooseUuid);
- if (taskRunList.isSuccess()) {
- uuids.addAll(taskRunList.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList());
- log.info("获取节点下taskRun的uudis:{}", uuids);
- }
}
if (CollectionUtils.isEmpty(uuids)) {
- return SdmResponse.success(resultDir);
+ return SdmResponse.success(Collections.emptyList());
}
List nodeDirInfos = fileMetadataInfoService.lambdaQuery()
@@ -263,64 +268,156 @@ public class DimensionTemplateServiceImpl extends ServiceImpl mergedResult = mergeNodeDirInfos(resultDir);
+ return SdmResponse.success(mergedResult);
}
+ /**
+ * 根据originalName合并FileMetadataInfo列表,并处理bucketName生成totalName
+ * @param nodeDirInfos 需要合并的FileMetadataInfo列表
+ * @return 合并后的结果
+ */
+ private List mergeNodeDirInfos(List nodeDirInfos) {
+ // 按originalName分组
+ Map> groupedByOriginalName = nodeDirInfos.stream()
+ .collect(Collectors.groupingBy(FileMetadataInfo::getOriginalName));
+
+ List result = new ArrayList<>();
+
+ // 对每组进行处理
+ for (Map.Entry> entry : groupedByOriginalName.entrySet()) {
+ List group = entry.getValue();
+
+ if (!group.isEmpty()) {
+ // 使用第一个作为基础对象
+ FileMetadataInfo baseInfo = group.get(0);
+
+ // 创建包含children的DTO对象
+ FileMetadataChildrenDTO dto = FileMetadataConvert.INSTANCE.convertToFileMetadataChildrenDTO(baseInfo);
+
+ // 转换children列表,并为每个child设置totalName
+ List children = new ArrayList<>();
+ for (FileMetadataInfo fileInfo : group) {
+ FileMetadataChildrenDTO childDto = FileMetadataConvert.INSTANCE.convertToFileMetadataChildrenDTO(fileInfo);
+
+ // 设置totalName(从bucketName中提取)
+ String objectKey = fileInfo.getObjectKey();
+ String baseDirPath = DirTypeEnum.PROJECT_NODE_DIR.getDirName() + "/";
+ if (objectKey != null && objectKey.startsWith(baseDirPath)) {
+ String totalName = objectKey.substring(baseDirPath.length());
+ childDto.setTotalName(totalName);
+ }
+
+ children.add(childDto);
+ }
+
+ dto.setChildren(children);
+ result.add(dto);
+ }
+ }
+
+ return result;
+ }
+
+
+ /**
+ * 获取节点文件列表
+ * 按照显示维度展示后,会打乱原本的文件夹父子关系,需要重新构建父子关系:
+ * 先调用 getSimulationNodeTree 按照维度查询项目子节点node,根据node-uuid获取fileId
+ * @param req 请求参数
+ * @return 文件列表
+ */
@Override
public SdmResponse listSimulationNodeFiles(ListSimulationNodeTreeReq req) {
Long tenantId = ThreadLocalContext.getTenantId();
- // 按照显示维度展示后,会打乱原本的文件夹父子关系,需要重新构建父子关系:
- // 1、先调用 getSimulationNodeTree 按照维度查询项目子节点node,根据node-uuid获取fileId
- // 2、再查询原本的普通文件夹信息,需要isProjectDimension=true 只查询普通文件夹,不查询节点文件夹,union all 查询node的fileId 后 分页查询
- Long parentDirId;
- List dirInfos = null;
- if(ObjectUtils.isEmpty(req.getFileId())){
+
+ // 处理空参数情况
+ if (ObjectUtils.isEmpty(req.getFileId()) && ObjectUtils.isEmpty(req.getFileIds())) {
// 第一次进入数据总览页面,右侧不展示文件和文件夹
return SdmResponse.success();
}
- if(0L==req.getFileId()){
+ // 处理根目录情况
+ if (0L == req.getFileId()) {
// 和前端规定 0=触发根目录按钮,相当于获取左侧文件树的根节点文件夹
- GetSimulationNodeTreeReq getSimulationNodeTreeReq = new GetSimulationNodeTreeReq();
- getSimulationNodeTreeReq.setDimensionTemplateId(req.getDimensionTemplateId());
- getSimulationNodeTreeReq.setFileId(null);
- SdmResponse> nodeDirInfos = getSimulationNodeTree(getSimulationNodeTreeReq);
- if (nodeDirInfos.isSuccess() && ObjectUtils.isNotEmpty(nodeDirInfos.getData())) {
- dirInfos = nodeDirInfos.getData().stream().map(FileMetadataInfo::getId).toList();
- }
-
- PageHelper.startPage(req.getCurrent(), req.getSize());
- List fileMetadataInfos = fileMetadataInfoService.listSimulationNodeDir(dirInfos, req.isFilterEmptyData(), tenantId);
-
- PageInfo page = new PageInfo<>(fileMetadataInfos);
- return PageUtils.getJsonObjectSdmResponse(fileMetadataInfos, page);
+ return handleRootDirectory(req, tenantId);
}
- //fileId 不为空也不为0,是右侧点击进入文件夹下一层级查询
- parentDirId = req.getFileId();
- Optional parentDirInfo = fileMetadataInfoService.lambdaQuery().eq(FileMetadataInfo::getId, parentDirId).eq(FileMetadataInfo::getTenantId, tenantId).oneOpt();
- if (!parentDirInfo.isPresent()) {
- return SdmResponse.failed("父文件夹不存在");
- }
+ // 处理普通目录情况
+ return handleNormalDirectory(req, tenantId);
+ }
- // relatedResourceUuid和relatedResourceUuidOwnType不为空才是节点文件夹,才需要查询子节点文件夹文件
+ private SdmResponse handleRootDirectory(ListSimulationNodeTreeReq req, Long tenantId) {
GetSimulationNodeTreeReq getSimulationNodeTreeReq = new GetSimulationNodeTreeReq();
getSimulationNodeTreeReq.setDimensionTemplateId(req.getDimensionTemplateId());
- getSimulationNodeTreeReq.setFileId(parentDirId);
- SdmResponse> nodeDirInfos = getSimulationNodeTree(getSimulationNodeTreeReq);
- if (nodeDirInfos.isSuccess() && ObjectUtils.isNotEmpty(nodeDirInfos.getData())) {
- dirInfos = nodeDirInfos.getData().stream().map(FileMetadataInfo::getId).toList();
+ getSimulationNodeTreeReq.setFileIds(null);
+
+ SdmResponse> nodeDirInfos = getSimulationNodeTree(getSimulationNodeTreeReq);
+ List dirInfos = extractDirIdsFromResponse(nodeDirInfos);
+
+ // 获取所有数据
+ List allFileMetadataInfos = fileMetadataInfoService.listSimulationNodeDir(dirInfos, req.isFilterEmptyData(), tenantId);
+
+ return processAndPageResults(allFileMetadataInfos, req);
+ }
+
+ private SdmResponse handleNormalDirectory(ListSimulationNodeTreeReq req, Long tenantId) {
+ GetSimulationNodeTreeReq getSimulationNodeTreeReq = new GetSimulationNodeTreeReq();
+ getSimulationNodeTreeReq.setDimensionTemplateId(req.getDimensionTemplateId());
+ getSimulationNodeTreeReq.setFileIds(req.getFileIds());
+
+ SdmResponse> nodeDirInfos = getSimulationNodeTree(getSimulationNodeTreeReq);
+ List dirInfos = extractDirIdsFromResponse(nodeDirInfos);
+
+ // 获取所有数据
+ List allFileMetadataInfos = fileMetadataInfoService.listSimulationNodeFiles(
+ req.getFileIds(),
+ dirInfos,
+ req.isFilterEmptyData(),
+ tenantId);
+
+ return processAndPageResults(allFileMetadataInfos, req);
+ }
+
+ private List extractDirIdsFromResponse(SdmResponse> response) {
+ if (response.isSuccess() && ObjectUtils.isNotEmpty(response.getData())) {
+ return response.getData().stream()
+ .flatMap(dto -> dto.getChildren().stream())
+ .map(FileMetadataInfoResp::getId)
+ .toList();
}
+ return Collections.emptyList();
+ }
-
- PageHelper.startPage(req.getCurrent(), req.getSize());
- List fileMetadataInfos = fileMetadataInfoService.listSimulationNodeFiles(parentDirId, dirInfos,req.isFilterEmptyData(),tenantId);
+ private SdmResponse processAndPageResults(List fileMetadataInfos, ListSimulationNodeTreeReq req) {
+ // 设置创建者名称
setCreatorNames(fileMetadataInfos);
- PageInfo page = new PageInfo<>(fileMetadataInfos);
- return PageUtils.getJsonObjectSdmResponse(fileMetadataInfos, page);
+ // 使用 mergeNodeDirInfos 处理所有数据
+ List mergedResults = mergeNodeDirInfos(fileMetadataInfos);
+
+ // 手动分页
+ int pageSize = req.getSize();
+ int currentPage = req.getCurrent();
+ int fromIndex = (currentPage - 1) * pageSize;
+ int toIndex = Math.min(fromIndex + pageSize, mergedResults.size());
+
+ List pagedResults = new ArrayList<>();
+ if (fromIndex < mergedResults.size()) {
+ pagedResults = mergedResults.subList(fromIndex, toIndex);
+ }
+
+ PageInfo pageInfo = new PageInfo<>(pagedResults);
+ pageInfo.setTotal(mergedResults.size());
+ pageInfo.setPageNum(currentPage);
+ pageInfo.setPageSize(pageSize);
+
+ return PageUtils.getJsonObjectSdmResponse(pagedResults, pageInfo);
}
+
private void setCreatorNames(List list) {
try {
if (ObjectUtils.isNotEmpty(list)) {
diff --git a/data/src/main/java/com/sdm/data/service/impl/FileMetadataInfoServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/FileMetadataInfoServiceImpl.java
index 6a08a4bf..463bf03b 100644
--- a/data/src/main/java/com/sdm/data/service/impl/FileMetadataInfoServiceImpl.java
+++ b/data/src/main/java/com/sdm/data/service/impl/FileMetadataInfoServiceImpl.java
@@ -24,7 +24,7 @@ public class FileMetadataInfoServiceImpl extends ServiceImpl listSimulationNodeFiles(Long parentId, List fileIds, boolean isFilterEmptyData,Long tenantId) {
- return this.baseMapper.listSimulationNodeFiles(parentId, fileIds, isFilterEmptyData,tenantId);
+ public List listSimulationNodeFiles(List parentIds, List fileIds, boolean isFilterEmptyData, Long tenantId) {
+ return this.baseMapper.listSimulationNodeFiles(parentIds, fileIds, isFilterEmptyData,tenantId);
}
}
diff --git a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java
index fd8fb399..83555923 100644
--- a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java
+++ b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java
@@ -813,7 +813,8 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
// 数据库批量删除文件信息
LambdaQueryWrapper fileMetaDataQuery = new LambdaQueryWrapper<>();
fileMetaDataQuery.select(FileStorage::getFileId).eq(FileStorage::getDirId, deleteDirId);
- List deleteFileIdList = fileStorageService.listObjs(fileMetaDataQuery, id -> (Long) id);
+ List deleteFileIdList = fileStorageService.list(fileMetaDataQuery).stream().map(FileStorage::getFileId).collect(Collectors.toList());
+
deleteFileIdList.add(deleteDirId);
if(ObjectUtils.isNotEmpty(deleteFileIdList)){
diff --git a/data/src/main/resources/mapper/FileMetadataInfoMapper.xml b/data/src/main/resources/mapper/FileMetadataInfoMapper.xml
index 18b91862..0767c00a 100644
--- a/data/src/main/resources/mapper/FileMetadataInfoMapper.xml
+++ b/data/src/main/resources/mapper/FileMetadataInfoMapper.xml
@@ -26,7 +26,11 @@
SELECT distinct file_metadata_info.*
FROM file_metadata_info
- WHERE parentId = #{parentId}
+ WHERE parentId IN (
+
+ #{parentId}
+
+ )
and tenantId = #{tenantId}
AND dataType = 2
AND isLatest = true
diff --git a/project/repomix-output.xml b/project/repomix-output.xml
new file mode 100644
index 00000000..11a97de2
--- /dev/null
+++ b/project/repomix-output.xml
@@ -0,0 +1,22163 @@
+This file is a merged representation of a subset of the codebase, containing specifically included files, combined into a single document by Repomix.
+
+
+This section contains a summary of this file.
+
+
+This file contains a packed representation of a subset of the repository's contents that is considered the most important context.
+It is designed to be easily consumable by AI systems for analysis, code review,
+or other automated processes.
+
+
+
+The content is organized as follows:
+1. This summary section
+2. Repository information
+3. Directory structure
+4. Repository files (if enabled)
+5. Multiple file entries, each consisting of:
+ - File path as an attribute
+ - Full contents of the file
+
+
+
+- This file should be treated as read-only. Any changes should be made to the
+ original repository files, not this packed version.
+- When processing this file, use the file path to distinguish
+ between different files in the repository.
+- Be aware that this file may contain sensitive information. Handle it with
+ the same level of security as you would the original repository.
+
+
+
+- Some files may have been excluded based on .gitignore rules and Repomix's configuration
+- Binary files are not included in this packed representation. Please refer to the Repository Structure section for a complete list of file paths, including binary files
+- Only files matching these patterns are included: **/src/main/java/**/*.java, **/src/main/resources/**/*.yml, **/pom.xml
+- Files matching patterns in .gitignore are excluded
+- Files matching default ignore patterns are excluded
+- Files are sorted by Git change count (files with more changes are at the bottom)
+
+
+
+
+
+pom.xml
+src/main/java/com/sdm/project/common/ApprovalStatusEnum.java
+src/main/java/com/sdm/project/common/DemandStatusTypeEnum.java
+src/main/java/com/sdm/project/common/KeyResultTypeEnum.java
+src/main/java/com/sdm/project/common/MemberTypeEnum.java
+src/main/java/com/sdm/project/common/RunPerformanceStatusEnum.java
+src/main/java/com/sdm/project/common/RunStatusEnum.java
+src/main/java/com/sdm/project/common/TaskAchieveStatusEnum.java
+src/main/java/com/sdm/project/common/TaskExeStatusEnum.java
+src/main/java/com/sdm/project/common/TaskOperationTypeEnum.java
+src/main/java/com/sdm/project/common/TaskQryTypeEnum.java
+src/main/java/com/sdm/project/common/VersionEnum.java
+src/main/java/com/sdm/project/config/DecryptEnvironmentPostProcessor.java
+src/main/java/com/sdm/project/config/mybatis/DatabasePlugin.java
+src/main/java/com/sdm/project/config/mybatis/DBContextHolder.java
+src/main/java/com/sdm/project/config/mybatis/DBTypeEnum.java
+src/main/java/com/sdm/project/config/mybatis/DynamicDataSource.java
+src/main/java/com/sdm/project/config/mybatis/MybatisPlusConfig.java
+src/main/java/com/sdm/project/config/OkHttpConfiguration.java
+src/main/java/com/sdm/project/config/RedisConfig.java
+src/main/java/com/sdm/project/config/RequestConfig.java
+src/main/java/com/sdm/project/config/ScheduledTaskConfig.java
+src/main/java/com/sdm/project/config/SwaggerConfig.java
+src/main/java/com/sdm/project/controller/SimulationAnalysisController.java
+src/main/java/com/sdm/project/controller/SimulationDemandController.java
+src/main/java/com/sdm/project/controller/SimulationNodeController.java
+src/main/java/com/sdm/project/controller/SimulationProjectController.java
+src/main/java/com/sdm/project/controller/SimulationRunController.java
+src/main/java/com/sdm/project/controller/SimulationTaskController.java
+src/main/java/com/sdm/project/controller/YAModelController.java
+src/main/java/com/sdm/project/dao/SimulationBaseQuantitiesMapper.java
+src/main/java/com/sdm/project/dao/SimulationBaseUnitsMapper.java
+src/main/java/com/sdm/project/dao/SimulationDemandMapper.java
+src/main/java/com/sdm/project/dao/SimulationKeyResultMapper.java
+src/main/java/com/sdm/project/dao/SimulationNodeMapper.java
+src/main/java/com/sdm/project/dao/SimulationPerformanceMapper.java
+src/main/java/com/sdm/project/dao/SimulationProjectMapper.java
+src/main/java/com/sdm/project/dao/SimulationRunMapper.java
+src/main/java/com/sdm/project/dao/SimulationTaskAttentionMapper.java
+src/main/java/com/sdm/project/dao/SimulationTaskExtraMapper.java
+src/main/java/com/sdm/project/dao/SimulationTaskMapper.java
+src/main/java/com/sdm/project/dao/SimulationTaskMemberMapper.java
+src/main/java/com/sdm/project/filter/AuthFilter.java
+src/main/java/com/sdm/project/handler/ListStringTypeHandler.java
+src/main/java/com/sdm/project/model/bo/ApprovalDeliverableContentsModel.java
+src/main/java/com/sdm/project/model/bo/BaseBean.java
+src/main/java/com/sdm/project/model/bo/CidTaskNode.java
+src/main/java/com/sdm/project/model/bo/CurveParamDto.java
+src/main/java/com/sdm/project/model/bo/ModifyProjectNode.java
+src/main/java/com/sdm/project/model/bo/ModifyTaskNode.java
+src/main/java/com/sdm/project/model/bo/PerformanceInfo.java
+src/main/java/com/sdm/project/model/bo/ProjectExtraNode.java
+src/main/java/com/sdm/project/model/bo/ProjectInfo.java
+src/main/java/com/sdm/project/model/bo/ProjectMemberNode.java
+src/main/java/com/sdm/project/model/bo/ProjectNode.java
+src/main/java/com/sdm/project/model/bo/ProjectNodeInfo.java
+src/main/java/com/sdm/project/model/bo/ProjectNodeTree.java
+src/main/java/com/sdm/project/model/bo/TaskExtraNode.java
+src/main/java/com/sdm/project/model/bo/TaskInfo.java
+src/main/java/com/sdm/project/model/bo/TaskMemberNode.java
+src/main/java/com/sdm/project/model/bo/TaskNode.java
+src/main/java/com/sdm/project/model/bo/TaskNodeTag.java
+src/main/java/com/sdm/project/model/bo/TaskNodeTree.java
+src/main/java/com/sdm/project/model/entity/SimulationBaseQuantities.java
+src/main/java/com/sdm/project/model/entity/SimulationBaseUnits.java
+src/main/java/com/sdm/project/model/entity/SimulationDemand.java
+src/main/java/com/sdm/project/model/entity/SimulationNode.java
+src/main/java/com/sdm/project/model/entity/SimulationRun.java
+src/main/java/com/sdm/project/model/entity/SimulationRunKeyResult.java
+src/main/java/com/sdm/project/model/entity/SimulationTask.java
+src/main/java/com/sdm/project/model/entity/SimulationTaskAttention.java
+src/main/java/com/sdm/project/model/entity/SimulationTaskExtra.java
+src/main/java/com/sdm/project/model/entity/SimulationTaskMember.java
+src/main/java/com/sdm/project/model/po/NodeAllBase.java
+src/main/java/com/sdm/project/model/po/PerformanceNodeExtraPo.java
+src/main/java/com/sdm/project/model/po/PerformanceNodePo.java
+src/main/java/com/sdm/project/model/po/ProjectNodeDetailPo.java
+src/main/java/com/sdm/project/model/po/ProjectNodeExtraPo.java
+src/main/java/com/sdm/project/model/po/ProjectNodeMemberPo.java
+src/main/java/com/sdm/project/model/po/ProjectNodePo.java
+src/main/java/com/sdm/project/model/po/RunNodePo.java
+src/main/java/com/sdm/project/model/po/TaskNodeExtraPo.java
+src/main/java/com/sdm/project/model/po/TaskNodeMemberPo.java
+src/main/java/com/sdm/project/model/po/TaskNodePo.java
+src/main/java/com/sdm/project/model/po/TaskRunPo.java
+src/main/java/com/sdm/project/model/req/AddProjectNodeBatchReq.java
+src/main/java/com/sdm/project/model/req/AddProjectReq.java
+src/main/java/com/sdm/project/model/req/CommonGetCompleteStatisticsReq.java
+src/main/java/com/sdm/project/model/req/DeliverableApproveReq.java
+src/main/java/com/sdm/project/model/req/DelProjectNodeReq.java
+src/main/java/com/sdm/project/model/req/DelProjectReq.java
+src/main/java/com/sdm/project/model/req/GetNodeDetailReq.java
+src/main/java/com/sdm/project/model/req/GetProjectDetailReq.java
+src/main/java/com/sdm/project/model/req/GetProjectListReq.java
+src/main/java/com/sdm/project/model/req/GetRunVersionReq.java
+src/main/java/com/sdm/project/model/req/GetTaskDetailReq.java
+src/main/java/com/sdm/project/model/req/GetUserGroupTaskCompleteStatisticsReq.java
+src/main/java/com/sdm/project/model/req/GetWorkstationApproveStatusReq.java
+src/main/java/com/sdm/project/model/req/KeyResultReq.java
+src/main/java/com/sdm/project/model/req/PerformanceCompleteStatisticsReq.java
+src/main/java/com/sdm/project/model/req/PerformanceInfoReq.java
+src/main/java/com/sdm/project/model/req/ProjectNodeListReq.java
+src/main/java/com/sdm/project/model/req/ProjectTreeReq.java
+src/main/java/com/sdm/project/model/req/ProjectTreeTagReq.java
+src/main/java/com/sdm/project/model/req/SpdmAddDemandReq.java
+src/main/java/com/sdm/project/model/req/SpdmAddNodeReq.java
+src/main/java/com/sdm/project/model/req/SpdmAddTaskRunReq.java
+src/main/java/com/sdm/project/model/req/SpdmAnalysisPerformanceListReq.java
+src/main/java/com/sdm/project/model/req/SpdmAnalysisRunListReq.java
+src/main/java/com/sdm/project/model/req/SpdmAnalysisTaskListReq.java
+src/main/java/com/sdm/project/model/req/SpdmDeleteDemandReq.java
+src/main/java/com/sdm/project/model/req/SpdmDeleteNodeReq.java
+src/main/java/com/sdm/project/model/req/SpdmDeleteProjectDetailReq.java
+src/main/java/com/sdm/project/model/req/SpdmDeleteProjectReq.java
+src/main/java/com/sdm/project/model/req/SpdmDemandExtraReq.java
+src/main/java/com/sdm/project/model/req/SpdmDemandListReq.java
+src/main/java/com/sdm/project/model/req/SpdmDemandRelateMemberReq.java
+src/main/java/com/sdm/project/model/req/SpdmEditDemandReq.java
+src/main/java/com/sdm/project/model/req/SpdmEditNodeForDataReq.java
+src/main/java/com/sdm/project/model/req/SpdmEditNodeReq.java
+src/main/java/com/sdm/project/model/req/SpdmEditTaskForDataReq.java
+src/main/java/com/sdm/project/model/req/SpdmNodeDetailReq.java
+src/main/java/com/sdm/project/model/req/SpdmNodeExtraReq.java
+src/main/java/com/sdm/project/model/req/SpdmNodeParamReq.java
+src/main/java/com/sdm/project/model/req/SpdmNodeRelateMemberReq.java
+src/main/java/com/sdm/project/model/req/SpdmNodeReq.java
+src/main/java/com/sdm/project/model/req/SpdmProjectNodeEditReq.java
+src/main/java/com/sdm/project/model/req/SpdmSyncCidTaskReq.java
+src/main/java/com/sdm/project/model/req/SpdmTaskAttentionReq.java
+src/main/java/com/sdm/project/model/req/SpdmTaskCountReq.java
+src/main/java/com/sdm/project/model/req/SpdmTaskIssue.java
+src/main/java/com/sdm/project/model/req/SpdmTaskIssueReq.java
+src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java
+src/main/java/com/sdm/project/model/req/SpdmTaskOpr.java
+src/main/java/com/sdm/project/model/req/SpdmTaskOprReq.java
+src/main/java/com/sdm/project/model/req/SpdmTaskReq.java
+src/main/java/com/sdm/project/model/req/SpdmTaskRunReq.java
+src/main/java/com/sdm/project/model/req/TaskCompleteStatisticsReq.java
+src/main/java/com/sdm/project/model/req/TaskEditNodeReq.java
+src/main/java/com/sdm/project/model/req/TaskHandleReq.java
+src/main/java/com/sdm/project/model/req/UpdateProjectLeaderReq.java
+src/main/java/com/sdm/project/model/req/UpdateProjectNodeBatchReq.java
+src/main/java/com/sdm/project/model/req/UserDifficultCompleteStatisticsReq.java
+src/main/java/com/sdm/project/model/req/UserTaskCompleteStatisticsReq.java
+src/main/java/com/sdm/project/model/req/UserWorkloadReq.java
+src/main/java/com/sdm/project/model/req/YA/DeleteModelNodeInfoReq.java
+src/main/java/com/sdm/project/model/req/YA/GetModelNodeInfoReq.java
+src/main/java/com/sdm/project/model/req/YA/GetTaskSimulatinFileReq.java
+src/main/java/com/sdm/project/model/req/YA/ProjectTaskInfo.java
+src/main/java/com/sdm/project/model/req/YA/SaveKeyResultNodeInfoReq.java
+src/main/java/com/sdm/project/model/req/YA/SaveModelNodeInfoReq.java
+src/main/java/com/sdm/project/model/req/YA/SaveReportNodeInfoReq.java
+src/main/java/com/sdm/project/model/req/YA/SyncCidProjectReq.java
+src/main/java/com/sdm/project/model/req/YA/SyncCidTaskReq.java
+src/main/java/com/sdm/project/model/resp/FlowInfoDto.java
+src/main/java/com/sdm/project/model/resp/GetAllRunResultByTaskIdResp.java
+src/main/java/com/sdm/project/model/resp/KeyResultAndTaskInfoResp.java
+src/main/java/com/sdm/project/model/resp/RunResultResp.java
+src/main/java/com/sdm/project/model/resp/RunVersionInfoResp.java
+src/main/java/com/sdm/project/model/resp/TaskCountResp.java
+src/main/java/com/sdm/project/model/resp/TasKPerformanceResp.java
+src/main/java/com/sdm/project/model/resp/TaskWorkDaysResp.java
+src/main/java/com/sdm/project/model/resp/UserWorkloadResp.java
+src/main/java/com/sdm/project/model/resp/YA/BosimErrorRespond.java
+src/main/java/com/sdm/project/model/resp/YA/BosimKeyResultInfoRsp.java
+src/main/java/com/sdm/project/model/resp/YA/BosimSaveNodeInfoRsp.java
+src/main/java/com/sdm/project/model/resp/YA/BosimSaveProjectTaskRsp.java
+src/main/java/com/sdm/project/model/resp/YA/KeyResultNodeInfo.java
+src/main/java/com/sdm/project/model/vo/CommonGetCompleteFromPerformanceVo.java
+src/main/java/com/sdm/project/model/vo/CommonGetCompleteFromTaskVo.java
+src/main/java/com/sdm/project/model/vo/CommonStatisticsVo.java
+src/main/java/com/sdm/project/model/vo/SpdmAnalysisTaskVo.java
+src/main/java/com/sdm/project/model/vo/SpdmDemandExtraVo.java
+src/main/java/com/sdm/project/model/vo/SpdmDemandMemberVo.java
+src/main/java/com/sdm/project/model/vo/SpdmDemandVo.java
+src/main/java/com/sdm/project/model/vo/SpdmExportDemandVo.java
+src/main/java/com/sdm/project/model/vo/SpdmExportNewTaskVo.java
+src/main/java/com/sdm/project/model/vo/SpdmExportNodeVo.java
+src/main/java/com/sdm/project/model/vo/SpdmNewTaskVo.java
+src/main/java/com/sdm/project/model/vo/SpdmNodeDetailForDataVo.java
+src/main/java/com/sdm/project/model/vo/SpdmNodeDetailVo.java
+src/main/java/com/sdm/project/model/vo/SpdmNodeExtraVo.java
+src/main/java/com/sdm/project/model/vo/SpdmNodeMemberVo.java
+src/main/java/com/sdm/project/model/vo/SpdmNodeVo.java
+src/main/java/com/sdm/project/model/vo/SpdmTaskAttentionMemberVo.java
+src/main/java/com/sdm/project/model/vo/SpdmTaskDetailVo.java
+src/main/java/com/sdm/project/model/vo/SpdmTaskMemberVo.java
+src/main/java/com/sdm/project/model/vo/SpdmTaskVo.java
+src/main/java/com/sdm/project/model/vo/SpdmUserVo.java
+src/main/java/com/sdm/project/model/vo/UserGroupDifficultyStatisticsVo.java
+src/main/java/com/sdm/project/model/vo/UserGroupDifficultyVo.java
+src/main/java/com/sdm/project/model/vo/UserGroupProjectVo.java
+src/main/java/com/sdm/project/model/vo/UserGroupTaskCompleteStatisticsVo.java
+src/main/java/com/sdm/project/model/vo/UserGroupTaskCompleteVo.java
+src/main/java/com/sdm/project/model/vo/WorkstationApproveStatusVo.java
+src/main/java/com/sdm/project/ProjectApplication.java
+src/main/java/com/sdm/project/service/IDemandService.java
+src/main/java/com/sdm/project/service/impl/DemandServiceImpl.java
+src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java
+src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java
+src/main/java/com/sdm/project/service/impl/SimulationBaseUnitsServiceImpl.java
+src/main/java/com/sdm/project/service/impl/SimulationKeyResultServiceImpl.java
+src/main/java/com/sdm/project/service/impl/SimulationPerformanceServiceImpl.java
+src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java
+src/main/java/com/sdm/project/service/impl/SimulationTaskAttentionServiceImpl.java
+src/main/java/com/sdm/project/service/impl/SimulationTaskExtraServiceImpl.java
+src/main/java/com/sdm/project/service/impl/SimulationTaskMemberServiceImpl.java
+src/main/java/com/sdm/project/service/impl/SimulationTaskServiceImpl.java
+src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java
+src/main/java/com/sdm/project/service/INodeService.java
+src/main/java/com/sdm/project/service/IProjectService.java
+src/main/java/com/sdm/project/service/ISimulationBaseQuantitiesService.java
+src/main/java/com/sdm/project/service/ISimulationBaseUnitsService.java
+src/main/java/com/sdm/project/service/ISimulationKeyResultService.java
+src/main/java/com/sdm/project/service/ISimulationPerformanceService.java
+src/main/java/com/sdm/project/service/ISimulationRunService.java
+src/main/java/com/sdm/project/service/ISimulationTaskAttentionService.java
+src/main/java/com/sdm/project/service/ISimulationTaskExtraService.java
+src/main/java/com/sdm/project/service/ISimulationTaskMemberService.java
+src/main/java/com/sdm/project/service/ISimulationTaskService.java
+src/main/java/com/sdm/project/service/ITaskService.java
+src/main/java/com/sdm/project/service/SimulationBaseQuantitiesServiceImpl.java
+src/main/resources/application-dev.yml
+src/main/resources/application-local.yml
+src/main/resources/application-lyric.yml
+src/main/resources/application-prod.yml
+src/main/resources/application-test.yml
+src/main/resources/application.yml
+
+
+
+This section contains the contents of the repository's files.
+
+
+
+
+ 4.0.0
+
+ com.sdm
+ SDM
+ 1.0-SNAPSHOT
+
+ project
+ 0.0.1-SNAPSHOT
+ project
+ project
+
+ 17
+ UTF-8
+ UTF-8
+ 3.3.5
+
+
+
+
+ com.sdm
+ common
+ 0.0.1-SNAPSHOT
+
+
+ *
+ *
+
+
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ commons-net
+ commons-net
+ 3.11.1
+
+
+ org.apache.commons
+ commons-lang3
+ 3.14.0
+
+
+ org.aspectj
+ aspectjweaver
+
+
+ javax.annotation
+ javax.annotation-api
+ 1.3.2
+
+
+ com.squareup.okhttp3
+ okhttp
+ 4.10.0
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ org.projectlombok
+ lombok
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+package com.sdm.project.common;
+
+import lombok.Getter;
+
+@Getter
+public enum ApprovalStatusEnum {
+
+ ING("进行中", 1),
+ PASSED("评审通过", 2),
+ REJECTED("评审驳回", 3);
+
+ private final String name;
+
+ private final Integer code;
+
+ ApprovalStatusEnum(String name, Integer code) {
+ this.name = name;
+ this.code = code;
+ }
+
+}
+
+
+
+package com.sdm.project.common;
+
+import lombok.Getter;
+
+@Getter
+public enum DemandStatusTypeEnum {
+
+ UNASSIGNED("未分配", 0),
+ NOT_STARTED("未开始", 1),
+ IN_PROGRESS("进行中", 2),
+ PAUSE("暂停", 3),
+ CLOSED("已关闭", 4),
+ CLOSED_LOOP("已闭环", 5),
+ REJECTED("已驳回", 6);
+
+ private final String name;
+
+ private final Integer code;
+
+ DemandStatusTypeEnum(String name, Integer code) {
+ this.name = name;
+ this.code = code;
+ }
+
+}
+
+
+
+package com.sdm.project.common;
+
+import com.sdm.common.entity.enums.ApprovalFileDataStatusEnum;
+import lombok.Getter;
+
+import java.util.Objects;
+
+@Getter
+public enum KeyResultTypeEnum {
+ IMAGE("图片/动画", 1, "图片结果"),
+ CURVE("曲线", 2, "曲线结果"),
+ DOCUMENT("报告", 3, "报告结果"),
+ VALUE("数值", 4, "数值结果");
+
+ private final String name;
+ private final Integer keyResultType;
+ private final String dirName;
+
+ KeyResultTypeEnum(String name, Integer keyResultType, String dirName) {
+ this.name = name;
+ this.keyResultType = keyResultType;
+ this.dirName = dirName;
+ }
+
+ public static String getDirNameByType(Integer keyResultType) {
+ for (KeyResultTypeEnum status : values()) {
+ if (Objects.equals(status.getKeyResultType(), keyResultType)) {
+ return status.getDirName();
+ }
+ }
+ return null;
+ }
+}
+
+
+
+package com.sdm.project.common;
+
+import lombok.Getter;
+
+@Getter
+public enum MemberTypeEnum {
+
+ PRINCIPAL("仿真负责人", 0),
+ EXECUTOR("仿真执行人", 1),
+ THREED("3D负责人", 2),
+ ATTENTION("关注人", 3);
+
+ private final String name;
+
+ private final Integer code;
+
+ MemberTypeEnum(String name, Integer code) {
+ this.name = name;
+ this.code = code;
+ }
+
+}
+
+
+
+package com.sdm.project.common;
+
+import lombok.Getter;
+
+/**
+ * 指标完成情况状态枚举
+ */
+@Getter
+public enum RunPerformanceStatusEnum {
+
+ UNCOMPLETED("未完成", "0"),
+ NOT_STARTED("不合格", "1"),
+ RISK_CONTROL("风险可控", "2"),
+ UNANALYZED("未分析", "3"),
+ STARTED("合格", "4");
+
+ private final String name;
+
+ private final String code;
+
+ RunPerformanceStatusEnum(String name, String code) {
+ this.name = name;
+ this.code = code;
+ }
+
+}
+
+
+
+package com.sdm.project.common;
+
+import lombok.Getter;
+
+/**
+ * 算例完成情况状态枚举
+ */
+@Getter
+public enum RunStatusEnum {
+
+ UNCOMPLETED("未完成", 0),
+ RUNNING("执行中", 1),
+ COMPLETED("完成", 2),
+ FAILED("失败", 3);
+
+ private final String name;
+
+ private final Integer code;
+
+ RunStatusEnum(String name, Integer code) {
+ this.name = name;
+ this.code = code;
+ }
+
+}
+
+
+
+package com.sdm.project.common;
+
+import lombok.Getter;
+
+@Getter
+public enum TaskAchieveStatusEnum {
+
+ NO_CALCULATE ("未分析", "0"),
+ UNQUALIFIED ("不合格", "1"),
+ QUALIFIED ("合格", "2");
+
+ private final String name;
+
+ private final String code;
+
+ TaskAchieveStatusEnum(String name, String code) {
+ this.name = name;
+ this.code = code;
+ }
+
+}
+
+
+
+package com.sdm.project.common;
+
+import lombok.Getter;
+
+@Getter
+public enum TaskExeStatusEnum {
+
+ NO_STARTED("未开始", "1"),
+ IN_PROGRESS("进行中", "2"),
+ REJECTED("已驳回", "3"),
+ COMPLETED("已完成", "4"),
+ PAUSED("已暂停", "5"),
+ CLOSED("已关闭","6"),
+ POSTPONED("已延期", "7");
+
+ private final String name;
+
+ private final String code;
+
+ TaskExeStatusEnum(String name, String code) {
+ this.name = name;
+ this.code = code;
+ }
+
+}
+
+
+
+package com.sdm.project.common;
+
+import lombok.Getter;
+
+@Getter
+public enum TaskOperationTypeEnum {
+ // 驳回
+ REJECTED("已驳回", 0),
+ // 启动
+ IN_PROGRESS("进行中", 1),
+ // 暂停
+ PAUSE("暂停", 2),
+ // 工时
+ DAYS("工时", 3),
+ //关闭
+ CLOSED("已关闭", 4),
+ // 关注
+ FOLLOW("关注", 5),
+ // 取消关注
+ UN_FOLLOW("取消关注", 6);
+
+ private final String name;
+
+ private final Integer code;
+
+ TaskOperationTypeEnum(String name, Integer code) {
+ this.name = name;
+ this.code = code;
+ }
+
+}
+
+
+
+package com.sdm.project.common;
+
+public enum TaskQryTypeEnum {
+ EXEC(0, "我执行的"),
+ ATTENTION(1, "我关注的"),
+ ALL(2, "所有"),
+ ISSUE(3, "我分发的");
+
+ private final Integer code;
+ private final String desc;
+
+ TaskQryTypeEnum(Integer code, String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public static boolean isValid(Integer code) {
+ for (TaskQryTypeEnum type : values()) {
+ if (type.getCode() == code) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
+
+
+package com.sdm.project.common;
+
+import lombok.Getter;
+
+@Getter
+public enum VersionEnum {
+
+ INITIAL("初始版本", "V1.0");
+
+ private final String name;
+
+ private final String code;
+
+ VersionEnum(String name, String code) {
+ this.name = name;
+ this.code = code;
+ }
+
+}
+
+
+
+package com.sdm.project.config;
+
+import com.sdm.common.utils.AESUtil;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.env.EnvironmentPostProcessor;
+import org.springframework.core.env.*;
+import org.springframework.stereotype.Component;
+
+import java.util.Properties;
+
+@Component
+public class DecryptEnvironmentPostProcessor implements EnvironmentPostProcessor {
+ @Override
+ public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
+ Properties props = new Properties(); // 临时存储需要替换的配置
+ // 假设加密密码前缀为 "ENC(",后缀为 ")"
+ MutablePropertySources propertySources = environment.getPropertySources();
+ for (PropertySource> propertySource : propertySources) {
+ if (propertySource instanceof EnumerablePropertySource) {
+ EnumerablePropertySource> enumerablePropertySource = (EnumerablePropertySource>) propertySource;
+ String[] propertyNames = enumerablePropertySource.getPropertyNames();
+ // 遍历所有配置key:value
+ for (String propertyName : propertyNames) {
+ String propertyVal = environment.getProperty(propertyName);
+ // 根据自己写的规则来解析那些配置是需要解密的
+ if (propertyVal != null && propertyVal.startsWith("ENC(") && propertyVal.endsWith(")")) {
+ // 解析得到加密的数据
+ String encryptedValue = propertyVal.substring(4, propertyVal.length() - 1);
+ // 调用自定义工具类解密
+ String decryptedValue = null;
+ try {
+ decryptedValue = AESUtil.decode(encryptedValue);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ // 保存需要替换的配置
+ props.put(propertyName, decryptedValue);
+ }
+ }
+ }
+ }
+ // 添加解密后的属性到环境中
+ if (!props.isEmpty()) {
+ PropertiesPropertySource pps = new PropertiesPropertySource("decryptedProperties", props);
+ environment.getPropertySources().addFirst(pps);
+ }
+ }
+}
+
+
+
+package com.sdm.project.config.mybatis;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.executor.keygen.SelectKeyGenerator;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlCommandType;
+import org.apache.ibatis.plugin.*;
+import org.apache.ibatis.session.ResultHandler;
+import org.apache.ibatis.session.RowBounds;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @Author xuyundi
+ * @Date 2023/7/21
+ * @Note
+ */
+@Slf4j
+@Intercepts({
+ @Signature(type = Executor.class, method = "update", args = {
+ MappedStatement.class, Object.class}),
+ @Signature(type = Executor.class, method = "query", args = {
+ MappedStatement.class, Object.class, RowBounds.class,
+ ResultHandler.class})})
+public class DatabasePlugin implements Interceptor {
+
+ private static final String REGEX = ".*insert\\u0020.*|.*delete\\u0020.*|.*update\\u0020.*";
+
+ private static final Map cacheMap = new ConcurrentHashMap<>();
+
+ @Override
+ public Object intercept(Invocation invocation) throws Throwable {
+
+ boolean synchronizationActive = TransactionSynchronizationManager.isSynchronizationActive();
+ if (!synchronizationActive) {
+ Object[] objects = invocation.getArgs();
+ MappedStatement ms = (MappedStatement) objects[0];
+
+ DBTypeEnum databaseType = null;
+
+ if ((databaseType = cacheMap.get(ms.getId())) == null) {
+ //读方法
+ if (ms.getSqlCommandType().equals(SqlCommandType.SELECT)) {
+ //!selectKey 为自增id查询主键(SELECT LAST_INSERT_ID() )方法,使用主库
+ if (ms.getId().contains(SelectKeyGenerator.SELECT_KEY_SUFFIX)) {
+ databaseType = DBTypeEnum.MASTER;
+ } else {
+ BoundSql boundSql = ms.getSqlSource().getBoundSql(objects[1]);
+ String sql = boundSql.getSql().toLowerCase(Locale.CHINA).replaceAll("[\\t\\n\\r]", " ");
+ if (sql.matches(REGEX)) {
+ databaseType = DBTypeEnum.MASTER;
+ } else {
+ databaseType = DBTypeEnum.SLAVE;
+ }
+ }
+ } else {
+ databaseType = DBTypeEnum.MASTER;
+ }
+// log.warn("设置方法[{}] use [{}] Strategy, SqlCommandType [{}]..", ms.getId(), databaseType.name(), ms.getSqlCommandType().name());
+ cacheMap.put(ms.getId(), databaseType);
+ }
+ DBContextHolder.set(databaseType);
+ }
+
+ return invocation.proceed();
+ }
+
+ @Override
+ public Object plugin(Object target) {
+ if (target instanceof Executor) {
+ return Plugin.wrap(target, this);
+ } else {
+ return target;
+ }
+ }
+
+ @Override
+ public void setProperties(Properties properties) {
+
+ }
+
+}
+
+
+
+package com.sdm.project.config.mybatis;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @Author xuyundi
+ * @Date 2023/7/21
+ * @Note
+ */
+@Slf4j
+public class DBContextHolder {
+ private static final ThreadLocal contextHolder = new ThreadLocal<>();
+
+ private static final AtomicInteger counter = new AtomicInteger(-1);
+
+ public static void set(DBTypeEnum dbType) {
+ contextHolder.set(dbType);
+ }
+
+ public static DBTypeEnum get() {
+ return contextHolder.get();
+ }
+
+ public static void master() {
+ set(DBTypeEnum.MASTER);
+ log.info("切换到master");
+ }
+
+ public static void slave() {
+ set(DBTypeEnum.SLAVE);
+ log.info("切换到slave");
+
+ // 如果有多个从库,可通过轮询进行切换
+// int index = counter.getAndIncrement() % 2;
+// if (counter.get() > 9999) {
+// counter.set(-1);
+// }
+// if (index == 0) {
+// set(DBTypeEnum.SLAVE1);
+// log.info("切换到slave1");
+// }else {
+// set(DBTypeEnum.SLAVE2);
+// log.info("切换到slave2");
+// }
+ }
+}
+
+
+
+package com.sdm.project.config.mybatis;
+
+/**
+ * @Author xuyundi
+ * @Date 2023/7/21
+ * @Note
+ */
+public enum DBTypeEnum {
+ MASTER, SLAVE
+}
+
+
+
+package com.sdm.project.config.mybatis;
+
+import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
+import org.springframework.lang.Nullable;
+
+/**
+ * @Author xuyundi
+ * @Date 2023/7/21
+ * @Note
+ */
+public class DynamicDataSource extends AbstractRoutingDataSource {
+ @Nullable
+ @Override
+ protected Object determineCurrentLookupKey() {
+ return DBContextHolder.get();
+ }
+}
+
+
+
+package com.sdm.project.config.mybatis;
+
+import com.baomidou.mybatisplus.core.MybatisConfiguration;
+import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Author xuyundi
+ * @Date 2023/7/21
+ * @Note
+ */
+@Configuration
+@MapperScan(basePackages = "com.sdm.project.dao", sqlSessionFactoryRef = "mybatisSqlSessionFactoryAdaptor")
+public class MybatisPlusConfig {
+
+
+ @Value("${spring.datasource.slave.enable}")
+ private boolean slaveEnable;
+
+// /**
+// * mybatis-plus分页插件
+// */
+// @Bean
+// public PaginationInterceptor paginationInterceptor() {
+// PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
+// paginationInterceptor.setDialectType(DBType.MYSQL.getDb());
+// return paginationInterceptor;
+// }
+
+ @Bean(name = "masterDataSource")
+ @Qualifier("masterDataSource")
+ @ConfigurationProperties(prefix = "spring.datasource.master")
+ public DataSource masterDataSource() {
+ return DataSourceBuilder.create().build();
+ }
+
+ @Bean(name = "slaveDataSource")
+ @Qualifier("slaveDataSource")
+ @ConfigurationProperties(prefix = "spring.datasource.slave")
+ public DataSource slaveDataSource() {
+ return DataSourceBuilder.create().build();
+ }
+
+ /**
+ * 构造多数据源连接池
+ * Master 数据源连接池采用 HikariDataSource
+ * Slave 数据源连接池采用 DruidDataSource
+ *
+ * @param master
+ * @param slave
+ * @return
+ */
+ @Bean
+ @Primary
+ public DynamicDataSource dataSource(@Qualifier("masterDataSource") DataSource master,
+ @Qualifier("slaveDataSource") DataSource slave) {
+ Map
+
+
+package com.sdm.project.config;
+
+import okhttp3.ConnectionPool;
+import okhttp3.OkHttpClient;
+import okhttp3.Protocol;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.security.SecureRandom;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.Collections;
+import java.util.concurrent.TimeUnit;
+
+@Configuration
+public class OkHttpConfiguration {
+
+ @Bean
+ public OkHttpClient okHttpClient() {
+ return new OkHttpClient.Builder()
+ .sslSocketFactory(sslSocketFactory(), x509TrustManager())
+ //是否开启缓存
+ .retryOnConnectionFailure(true)
+ .connectionPool(pool())
+ .connectTimeout(60, TimeUnit.SECONDS)
+ .readTimeout(60, TimeUnit.SECONDS)
+ .writeTimeout(60, TimeUnit.SECONDS)
+ .hostnameVerifier((hostname, session) -> true)
+ .protocols(Collections.singletonList(Protocol.HTTP_1_1))
+ .build();
+ }
+
+ @Bean
+ public X509TrustManager x509TrustManager() {
+ return new X509TrustManager() {
+ @Override
+ public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+
+ }
+
+ @Override
+ public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+
+ }
+
+ @Override
+ public X509Certificate[] getAcceptedIssuers() {
+ return new X509Certificate[0];
+ }
+ };
+ }
+
+ @Bean
+ public SSLSocketFactory sslSocketFactory() {
+ try {
+ SSLContext sslContext = SSLContext.getInstance("TLS");
+ sslContext.init(null, new TrustManager[]{x509TrustManager()}, new SecureRandom());
+ return sslContext.getSocketFactory();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ @Bean
+ public ConnectionPool pool() {
+ return new ConnectionPool(5000, 300, TimeUnit.SECONDS);
+ }
+}
+
+
+
+package com.sdm.project.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+@Configuration
+public class RedisConfig {
+
+ @Bean(name = "redisTemplate")
+ public RedisTemplate
+
+
+package com.sdm.project.config;
+
+import com.sdm.project.filter.AuthFilter;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class RequestConfig {
+ @Bean
+ public AuthFilter authFilter() {
+ return new AuthFilter();
+ }
+
+ @Bean
+ public FilterRegistrationBean registrationBean() {
+ FilterRegistrationBean registration = new FilterRegistrationBean<>();
+ registration.setFilter(authFilter());
+ registration.setName("authFilter");
+ registration.addUrlPatterns("/*");
+ registration.setOrder(0);
+ return registration;
+ }
+}
+
+
+
+package com.sdm.project.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.SchedulingConfigurer;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.scheduling.config.ScheduledTaskRegistrar;
+
+/**
+ * 解决多个定时任务单线程有任务不能执行的问题
+ *
+ */
+@Configuration
+public class ScheduledTaskConfig implements SchedulingConfigurer {
+ @Override
+ public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
+ ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
+ taskScheduler.setPoolSize(5);
+ taskScheduler.initialize();
+ taskRegistrar.setTaskScheduler(taskScheduler);
+ }
+}
+
+
+
+package com.sdm.project.config;
+
+import io.swagger.v3.oas.models.ExternalDocumentation;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Info;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class SwaggerConfig {
+ @Bean
+ public OpenAPI openAPI() {
+ return new OpenAPI()
+ .info(new Info()
+ .title("SPDM系统-项目模块")
+ .description("SPDM系统-项目模块接口文档")
+ .version("V1"))
+ .externalDocs(new ExternalDocumentation()
+ .description("项目模块")
+ .url("/"));
+ }
+}
+
+
+
+package com.sdm.project.controller;
+
+import com.sdm.common.common.SdmResponse;
+import com.sdm.common.log.annotation.SysLog;
+import com.sdm.project.model.req.SpdmAnalysisPerformanceListReq;
+import com.sdm.project.model.req.SpdmAnalysisRunListReq;
+import com.sdm.project.model.req.SpdmAnalysisTaskListReq;
+import com.sdm.project.model.resp.GetAllRunResultByTaskIdResp;
+import com.sdm.project.model.resp.RunResultResp;
+import com.sdm.project.service.ITaskService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping("/analysis")
+@Tag(name = "数据分析", description = "数据分析相关接口")
+public class SimulationAnalysisController {
+
+ @Resource
+ private ITaskService taskService;
+
+ /**
+ * 数据分析(数据查询)-根据节点id获取仿真工况
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("数据分析(数据查询)-根据节点id获取仿真工况")
+ @GetMapping("/taskList")
+ @Operation(summary = "仿真工况", description = "仿真工况")
+ public SdmResponse taskList(SpdmAnalysisTaskListReq req) {
+ return taskService.analysisTaskList(req);
+ }
+
+ /**
+ * 数据分析(数据查询)-根据节点id获取指标
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("数据分析(数据查询)-根据节点id获取指标")
+ @GetMapping("/performanceList")
+ @Operation(summary = "指标", description = "指标")
+ public SdmResponse performanceList(SpdmAnalysisPerformanceListReq req) {
+ return taskService.analysisPerformanceList(req);
+ }
+
+ /**
+ * 数据分析(数据查询)-根据节点id获取算例
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("数据分析(数据查询)-根据节点id获取算例")
+ @GetMapping("/runList")
+ @Operation(summary = "算例", description = "算例")
+ public SdmResponse runList(SpdmAnalysisRunListReq req) {
+ return taskService.analysisRunList(req);
+ }
+
+
+ /**
+ * 数据分析(数据查询)-根据任务id获取所有算列结果
+ */
+ @SysLog("数据分析(数据查询)-根据任务id获取所有算列结果")
+ @GetMapping("/getAllRunResultByTaskId")
+ public SdmResponse getAllRunResultByTaskId(String taskId) {
+ return taskService.getAllRunResultByTaskId(taskId);
+ }
+
+
+}
+
+
+
+package com.sdm.project.controller;
+
+import com.sdm.common.common.SdmResponse;
+import com.sdm.common.entity.req.data.UploadFilesReq;
+import com.sdm.common.entity.req.task.DemandExportExcelFormat;
+import com.sdm.common.entity.req.task.TaskExportExcelFormat;
+import com.sdm.common.feign.inter.data.IDataFeignClient;
+import com.sdm.common.log.annotation.SysLog;
+import com.sdm.project.model.bo.ModifyProjectNode;
+import com.sdm.project.model.req.*;
+import com.sdm.project.service.IDemandService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/demand")
+@Tag(name = "仿真需求管理", description = "仿真需求管理")
+public class SimulationDemandController {
+
+ @Resource
+ private IDemandService demandService;
+
+ /**
+ * 新增需求
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("新增需求")
+ @PostMapping("/addDemand")
+ @Operation(summary = "新增需求", description = "新增需求")
+ public SdmResponse addDemand(@RequestBody @Validated SpdmAddDemandReq req) {
+ return demandService.addDemand(req);
+ }
+
+ /**
+ * 修改需求
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("修改需求")
+ @PostMapping("/editDemand")
+ @Operation(summary = "修改需求", description = "修改需求")
+ public SdmResponse editDemand(@RequestBody SpdmEditDemandReq req) {
+ return demandService.editDemand(req);
+ }
+
+ /**
+ * 删除需求
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("删除需求")
+ @PostMapping("/deleteDemand")
+ @Operation(summary = "删除需求", description = "删除需求")
+ public SdmResponse deleteDemand(@RequestBody @Validated SpdmDeleteDemandReq req) {
+ return demandService.deleteDemand(req);
+ }
+
+ /**
+ * 需求列表(我发起的、我确认的)
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("查询需求列表")
+ @GetMapping("/list")
+ @Operation(summary = "需求列表(我发起的、我确认的)", description = "需求列表(我发起的、我确认的)")
+ public SdmResponse list(@Validated SpdmDemandListReq req) {
+ return demandService.list(req);
+ }
+
+ /**
+ * 下发任务
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("下发任务")
+ @PostMapping("/issueTask")
+ @Operation(summary = "下发任务(可批量)", description = "下发任务(可批量)")
+ public SdmResponse issueTask(@RequestBody SpdmTaskIssue req) {
+ return demandService.issueTask(req);
+ }
+
+ @PostMapping(value = "/uploadDemandFiles", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public SdmResponse uploadDemandFiles(UploadFilesReq req) {
+ return demandService.uploadDemandFiles(req);
+ }
+
+ @PostMapping("/exportDemand")
+ @Operation(summary = "导出需求列表", description = "导出需求列表")
+ public SdmResponse exportDemand(@RequestBody DemandExportExcelFormat demandExportExcelFormat , HttpServletResponse httpservletResponse) {
+ return demandService.exportDemand(demandExportExcelFormat, httpservletResponse);
+ }
+
+ /**
+ * 根据需求id,查询需求详情)
+ *
+ * @param demandId
+ * @return
+ */
+ @GetMapping("/detail")
+ @Operation(summary = "根据需求id,查询需求详情", description = "根据需求id,查询需求详情")
+ public SdmResponse detail(@RequestParam @Validated String demandId) {
+ return demandService.detail(demandId);
+ }
+
+}
+
+
+
+package com.sdm.project.controller;
+
+import com.alibaba.excel.util.StringUtils;
+import com.sdm.common.common.SdmResponse;
+import com.sdm.common.entity.req.data.UploadFilesReq;
+import com.sdm.common.entity.req.project.DelNodeReq;
+import com.sdm.common.entity.req.project.ProjectExportExcelFormat;
+import com.sdm.common.entity.req.project.RenameNodeReq;
+import com.sdm.common.entity.req.project.SpdmNodeListReq;
+import com.sdm.common.entity.resp.AllNodeByProjectIdAndTypeResp;
+import com.sdm.common.entity.resp.project.SimulationNodeResp;
+import com.sdm.common.feign.inter.project.ISimulationNodeFeignClient;
+import com.sdm.common.log.annotation.SysLog;
+import com.sdm.project.model.req.*;
+import com.sdm.project.service.INodeService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotNull;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Collections;
+import java.util.List;
+
+@RestController
+@RequestMapping("/node")
+@Tag(name = "项目、阶段节点管理", description = "项目、阶段节点管理相关接口")
+public class SimulationNodeController implements ISimulationNodeFeignClient {
+
+ @Resource
+ private INodeService nodeService;
+
+ /**
+ * 新增节点
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("新增节点")
+ @PostMapping("/addNode")
+ @Operation(summary = "新增项目或阶段", description = "新增项目或阶段")
+ public SdmResponse addNode(@RequestBody @Validated SpdmAddNodeReq req) {
+ return nodeService.add(req);
+ }
+
+ /**
+ * 修改节点
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("修改节点")
+ @PostMapping("/editNode")
+ @Operation(summary = "修改项目或阶段", description = "修改项目或阶段")
+ public SdmResponse editNode(@RequestBody @Validated SpdmEditNodeReq req) {
+ return nodeService.edit(req);
+ }
+
+ /**
+ * 删除节点
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("删除节点")
+ @PostMapping("/deleteNode")
+ @Operation(summary = "删除项目或阶段", description = "删除项目或阶段")
+ public SdmResponse deleteNode(@RequestBody SpdmDeleteNodeReq req) {
+ return nodeService.delete(req);
+ }
+
+ /**
+ * 节点列表
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("查询项目列表")
+ @PostMapping("/list")
+ @Operation(summary = "项目列表", description = "项目列表")
+ public SdmResponse list(@RequestBody SpdmNodeListReq req) {
+ return nodeService.list(req);
+ }
+
+ /**
+ * 获取节点详情(项目详情)
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("查询项目详情")
+ @GetMapping("/getNodeDetail")
+ @Operation(summary = "项目详情", description = "项目详情")
+ public SdmResponse getNodeDetail(GetProjectDetailReq req) {
+ return nodeService.getNodeDetail(req);
+ }
+
+ /**
+ * 获取团队成员
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("获取团队成员")
+ @GetMapping("/getProjectMemberList")
+ @Operation(summary = "获取团队成员", description = "获取团队成员")
+ public SdmResponse getProjectMemberList(@Validated GetProjectListReq req) {
+ return nodeService.getProjectMemberList(req);
+ }
+
+ /**
+ * 根据项目查询子节点列表
+ *
+ * @param nodeId
+ * @param nodeType
+ * @return
+ */
+ @GetMapping("/getChildrenNodeList")
+ @Operation(summary = "根据项目查询子节点列表", description = "根据项目查询子节点列表")
+ public SdmResponse getChildrenNodeList(@RequestParam(value = "nodeId") String nodeId, @RequestParam(value = "nodeType") String nodeType) {
+ if (StringUtils.isBlank(nodeId) || StringUtils.isBlank(nodeType)) {
+ return SdmResponse.failed("节点id和类型都不能为空");
+ }
+ return nodeService.getChildrenNodeList(Collections.singletonList(nodeId), nodeType);
+ }
+
+
+ /**
+ * 根据节点类型获取所有节点
+ *
+ * @param nodeType 节点类型
+ * @return SdmResponse
+
+
+package com.sdm.project.controller;
+
+import com.sdm.common.common.SdmResponse;
+import com.sdm.common.entity.req.task.TaskExportExcelFormat;
+import com.sdm.common.entity.req.task.TaskTreeExportExcelFormat;
+import com.sdm.common.log.annotation.SysLog;
+import com.sdm.project.model.bo.ModifyProjectNode;
+import com.sdm.project.model.req.ProjectTreeTagReq;
+import com.sdm.project.model.req.SpdmNodeReq;
+import com.sdm.project.service.IProjectService;
+import com.sdm.project.service.ITaskService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.util.DigestUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping(value = "/project")
+@Tag(name = "仿真任务策划管理", description = "仿真任务策划管理管理相关接口")
+public class SimulationProjectController {
+
+ @Resource
+ private IProjectService projectService;
+
+ @Resource
+ private ITaskService taskService;
+
+
+ /**
+ * 操作节点(增、删、改)
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("新增修改删除任务、分析项")
+ @PostMapping("/modify")
+ @Operation(summary = "新增修改删除任务、分析项", description = "新增修改删除任务、分析项")
+ public SdmResponse modify(@RequestBody ModifyProjectNode req) {
+ return projectService.modify(req);
+ }
+
+ /**
+ * 任务分析项树
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("获取任务分析项树")
+ @PostMapping("/getTaskTree")
+ @Operation(summary = "任务分析项树", description = "任务分析项树")
+ public SdmResponse getTaskTree(@RequestBody ProjectTreeTagReq req) {
+ return projectService.getTaskTree(req);
+ }
+
+// @PostMapping("/exportTaskTree")
+// @Operation(summary = "导出任务分析项树", description = "导出任务分析项树")
+// public SdmResponse exportTaskTree(@RequestBody TaskTreeExportExcelFormat taskTreeExportExcelFormat , HttpServletResponse httpservletResponse) {
+// return projectService.exportTaskTree(taskTreeExportExcelFormat, httpservletResponse);
+// }
+
+ @PostMapping("/exportTaskTree")
+ @Operation(summary = "导出任务分析项树", description = "导出任务分析项树")
+ public SdmResponse exportTaskTree(@RequestBody TaskTreeExportExcelFormat taskTreeExportExcelFormat , HttpServletResponse httpservletResponse) {
+ return taskService.newExportTaskTree(taskTreeExportExcelFormat, httpservletResponse);
+ }
+
+
+}
+
+
+
+package com.sdm.project.controller;
+
+import com.sdm.common.common.SdmResponse;
+import com.sdm.common.entity.req.data.CreateDirReq;
+import com.sdm.common.entity.req.data.QueryDirReq;
+import com.sdm.common.entity.req.data.UploadFilesReq;
+import com.sdm.common.entity.req.project.SpdmReportReq;
+import com.sdm.common.entity.req.system.LaunchApproveReq;
+import com.sdm.common.entity.resp.PageDataResp;
+import com.sdm.common.entity.resp.data.BatchAddFileInfoResp;
+import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
+import com.sdm.common.feign.inter.project.ISimulationRunFeignClient;
+import com.sdm.common.log.annotation.SysLog;
+import com.sdm.project.model.entity.SimulationBaseQuantities;
+import com.sdm.project.model.entity.SimulationBaseUnits;
+import com.sdm.project.model.entity.SimulationRun;
+import com.sdm.project.model.entity.SimulationRunKeyResult;
+import com.sdm.project.model.req.*;
+import com.sdm.project.model.resp.FlowInfoDto;
+import com.sdm.project.model.resp.KeyResultAndTaskInfoResp;
+import com.sdm.project.model.resp.RunVersionInfoResp;
+import com.sdm.project.service.ISimulationRunService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping(value = "/run")
+@Tag(name = "仿真任务策划管理", description = "仿真任务策划管理管理相关接口")
+public class SimulationRunController implements ISimulationRunFeignClient {
+
+ @Resource
+ private ISimulationRunService runService;
+
+
+ /**
+ * 任务分析项算例树
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("获取任务分析项算例树")
+ @PostMapping("/getTaskRunTree")
+ @Operation(summary = "任务分析项算例树", description = "任务分析项算例树")
+ public SdmResponse getTaskRunTree(@RequestBody ProjectTreeTagReq req) {
+ return runService.getTaskRunTree(req);
+ }
+
+ /**
+ * 任务执行 创建算例
+ */
+ @SysLog("任务执行 创建算例")
+ @PostMapping("/addTaskRun")
+ public SdmResponse addTaskRun(@RequestBody @Validated SpdmAddTaskRunReq req) {
+ return runService.addTaskRun(req);
+ }
+
+ /**
+ * 任务执行 删除算例
+ */
+ @SysLog("任务执行 删除算例")
+ @PostMapping("/deleteTaskRun")
+ public SdmResponse deleteTaskRun(@RequestBody SpdmTaskRunReq req) {
+ return runService.deleteTaskRun(req);
+ }
+
+ /**
+ * 查询算例详情
+ */
+ @SysLog("查询算例详情")
+ @PostMapping("/queryTaskRun")
+ public SdmResponse> queryRunInfo(@RequestBody SpdmTaskRunReq req) {
+ return runService.queryTaskRun(req);
+ }
+
+ /**
+ * 创建算例文件夹
+ */
+ @PostMapping(value = "/createRunDir")
+ public SdmResponse createRunDir(@RequestBody CreateDirReq req) {
+ return runService.createRunDir(req);
+ }
+
+ /**
+ * 查询算例文件夹及文件
+ */
+ @PostMapping(value = "/queryRunDir")
+ public SdmResponse>> queryRunDir(@RequestBody QueryDirReq req) {
+ return runService.queryRunDir(req);
+ }
+
+ /**
+ * 上传算例文件
+ */
+ @PostMapping(value = "/uploadRunFiles", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public SdmResponse uploadRunFiles(UploadFilesReq req) {
+ return runService.uploadRunFiles(req);
+ }
+
+ /**
+ * 获取task下所有算例版本
+ *
+ * @return
+ */
+ @SysLog("获取任务下所有算例版本")
+ @PostMapping("/getTaskRunVersion")
+ public SdmResponse> getTaskRunVersion(@RequestBody GetRunVersionReq req) {
+ return runService.getTaskRunVersion(req);
+ }
+
+ /**
+ * 获取指定算例的版本结构
+ *
+ * @return
+ */
+ @SysLog("获取指定算例的版本结构")
+ @PostMapping("/getRunVersion")
+ public SdmResponse getRunVersion(@RequestBody GetRunVersionReq req) {
+ return runService.getRunVersion(req);
+ }
+
+ /**
+ * 任务执行后 算例录入关键结果
+ *
+ * @return
+ */
+ @SysLog("任务执行后 算例录入关键结果")
+ @PostMapping(value = "/addSimulationKeyResult", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public SdmResponse addSimulationKeyResult(KeyResultReq req) {
+ return runService.addSimulationKeyResult(req);
+ }
+
+ @SysLog("编辑算例关键结果属性")
+ @PostMapping(value = "/editSimulationKeyResult")
+ public SdmResponse editSimulationKeyResult(@RequestBody KeyResultReq req) {
+ return runService.editSimulationKeyResult(req);
+ }
+
+ /**
+ * 上传交付物-第一步 文件信息和关键结果信息批量入库
+ *
+ * @return
+ */
+ @SysLog("上传交付物-文件信息和关键结果信息批量入库")
+ @PostMapping(value = "/batchAddSimulationKeyResult")
+ public SdmResponse> batchAddSimulationKeyResult(@RequestBody KeyResultReq req) {
+ return runService.batchAddSimulationKeyResult(req);
+ }
+
+ /**
+ * 提交交付物审批
+ *
+ * @return
+ */
+ @SysLog("提交交付物审批")
+ @PostMapping(value = "/deliverableApprove")
+ public SdmResponse deliverableApprove(@RequestBody DeliverableApproveReq req) {
+ return runService.deliverableApprove(req);
+ }
+
+ /**
+ * 交付物审批回调
+ *
+ * @return
+ */
+ @SysLog("交付物审批回调")
+ @PostMapping(value = "/deliverableApproveCallback")
+ public SdmResponse deliverableApproveCallback(@RequestBody LaunchApproveReq req) {
+ return runService.deliverableApproveCallback(req);
+ }
+
+ /**
+ * 算例关键结果查询
+ *
+ * @return
+ */
+ @SysLog("算例关键结果查询")
+ @PostMapping(value = "/listSimulationKeyResult")
+ public SdmResponse>> listSimulationKeyResult(@RequestBody KeyResultReq req) {
+ return runService.listSimulationKeyResult(req);
+ }
+
+ @GetMapping(value = "/getSimulationKeyResultFileIds")
+ public SdmResponse> getSimulationKeyResultFileIds(@RequestParam String runId) {
+ return runService.getSimulationKeyResultFileIds(runId);
+ }
+
+ /**
+ * 根据交付物文件id查询相关属性和任务信息
+ *
+ * @return
+ */
+ @PostMapping(value = "/queryKeyResultAndTaskInfo")
+ public SdmResponse>> queryKeyResultAndTaskInfo(@RequestBody KeyResultReq req) {
+ return runService.queryKeyResultAndTaskInfo(req);
+ }
+
+ /**
+ * 删除算例关键结果
+ *
+ * @return
+ */
+ @SysLog("删除算例关键结果")
+ @PostMapping(value = "/deleteSimulationKeyResult")
+ public SdmResponse deleteSimulationKeyResult(@RequestBody KeyResultReq req) {
+ return runService.deleteSimulationKeyResult(req);
+ }
+
+ /**
+ * 生成自动化报告
+ *
+ * @return
+ */
+ @PostMapping("/generateReport")
+ @Operation(summary = "生成自动化报告", description = "生成自动化报告")
+ public void generateReport(@RequestBody SpdmReportReq req, HttpServletResponse response) {
+ runService.generateReport(req,response);
+ }
+
+ /**
+ * 内部调用生成报告
+ *
+ * @return
+ */
+ @PostMapping("/generateReportInternal")
+ @Operation(summary = "内部调用生成报告", description = "内部调用生成报告")
+ public SdmResponse generateReportInternal(@RequestBody SpdmReportReq req) {
+ return runService.generateReportInternal(req);
+ }
+
+ /**
+ * 任务执行 一键执行 启动流程
+ */
+ @SysLog("任务执行 一键执行 启动流程")
+ @PostMapping("/startProcessInstance")
+ public SdmResponse startProcessInstance(@RequestBody SpdmTaskRunReq req) {
+ return runService.startProcessInstance(req);
+ }
+
+ /**
+ * 任务执行 设置节点输入参数和输出参数
+ */
+ @SysLog("设置节点输入参数和输出参数")
+ @PostMapping("/saveNodeParams")
+ public SdmResponse saveNodeParams(@RequestBody SpdmNodeParamReq req) {
+ return runService.saveNodeParams(req);
+ }
+
+ /**
+ * 任务执行 查询流程节点列表
+ */
+ @SysLog("查询流程节点列表")
+ @PostMapping("/listFlowNodes")
+ public SdmResponse listFlowNodes(@RequestBody SpdmTaskRunReq req) {
+ return runService.listFlowNodes(req);
+ }
+ /**
+ * 流程关联报告
+ *
+ * @return
+ */
+ @PostMapping("/flowRelateReport")
+ @Operation(summary = "流程关联报告", description = "流程关联报告")
+ public SdmResponse flowRelateReport(@RequestBody SpdmReportReq req) {
+ return runService.flowRelateReport(req);
+ }
+
+ /**
+ * 查询物理量基表
+ * @return
+ */
+ @GetMapping("/listQuantities")
+ @Operation(summary = "查询物理量基表", description = "查询物理量基表")
+ public SdmResponse> listQuantities() {
+ return runService.listQuantities();
+ }
+
+ /**
+ * 查询单位基表
+ * @return
+ */
+ @GetMapping("/listUnits")
+ @Operation(summary = "查询单位基表", description = "查询单位基表")
+ public SdmResponse> listUnits(@RequestParam(required = false) String quantityType) {
+ return runService.listUnits(quantityType);
+ }
+
+}
+
+
+
+package com.sdm.project.controller;
+
+import com.sdm.common.common.SdmResponse;
+import com.sdm.common.entity.req.task.TaskExportExcelFormat;
+import com.sdm.common.log.annotation.SysLog;
+import com.sdm.project.model.bo.ModifyTaskNode;
+import com.sdm.project.model.req.*;
+import com.sdm.project.model.resp.TaskCountResp;
+import com.sdm.project.model.resp.TaskWorkDaysResp;
+import com.sdm.project.model.resp.UserWorkloadResp;
+import com.sdm.project.service.ISimulationTaskService;
+import com.sdm.project.service.ITaskService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping("/task")
+@Tag(name = "仿真任务管理", description = "仿真任务管理")
+public class SimulationTaskController {
+
+ @Resource
+ private ITaskService taskService;
+
+ @Autowired
+ private ISimulationTaskService simulationTaskService;
+
+ /**
+ * 修改任务
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("修改任务")
+ @PostMapping("/edit")
+ @Operation(summary = "修改任务", description = "修改任务")
+ public SdmResponse edit(@RequestBody ModifyTaskNode req) {
+ return taskService.edit(req);
+ }
+
+ /**
+ * 驳回、启动、暂停、工时、关闭、关注、取消关注、编辑
+ */
+ @SysLog("操作任务")
+ @PostMapping("/operation")
+ @Operation(summary = "操作任务", description = "操作任务")
+ public SdmResponse operation(@RequestBody SpdmTaskOpr taskOpr) {
+ return taskService.operation(taskOpr);
+ }
+
+ @SysLog("关注或取消关注任务")
+ @PostMapping("/attention")
+ @Operation(summary = "关注或取消关注任务", description = "关注或取消关注任务")
+ public SdmResponse attention(@RequestBody SpdmTaskAttentionReq req) {
+ return taskService.attention(req.getTaskId(), req.getAddUserIdList(),req.getCancelUserIdList());
+ }
+
+
+ /**
+ * 任务列表(我执行的、我关注的、所有)
+ *
+ * @param req
+ * @return
+ */
+ @SysLog("查询任务列表")
+ @PostMapping("/list")
+ @Operation(summary = "任务列表(我执行的、我关注的、所有)", description = "任务列表(我执行的、我关注的、所有)")
+ public SdmResponse list(@Validated @RequestBody SpdmTaskListReq req) {
+ return taskService.list(req);
+ }
+
+ /**
+ * 任务列表根据不同执行状态计数(我执行的、我关注的、所有)
+ * @param req
+ * @return
+ */
+ @PostMapping("/count")
+ @Operation(summary = "任务列表计数(我执行的、我关注的、所有)", description = "任务列表计数(我执行的、我关注的、所有)")
+ public SdmResponse countByStatus(@Validated @RequestBody SpdmTaskCountReq req) {
+ return taskService.countByStatus(req);
+ }
+
+ @SysLog("批量删除任务")
+ @PostMapping("/batchDelete")
+ @Operation(summary = "批量删除任务", description = "批量删除任务")
+ public SdmResponse batchDeleteTask(@RequestBody SpdmTaskOpr taskOpr) {
+ return taskService.batchDeleteTask(taskOpr);
+ }
+
+ /**
+ * 工作负载 查询执行时间在指定时间段内,指定用户执行的任务列表
+ */
+ @SysLog("查询用户工作负载")
+ @PostMapping("/listUserWorkloads")
+ @Operation(summary = "查询用户工作负载", description = "查询用户工作负载")
+ public SdmResponse> listUserWorkloadsWithinTimeFrame(@RequestBody UserWorkloadReq req) {
+ return taskService.listUserWorkloadsWithinTimeFrame(req);
+ }
+
+ @PostMapping("/listTaskWorkDays")
+ @Operation(summary = "工作负载-任务工时统计图表", description = "工作负载-任务工时统计图表")
+ public SdmResponse> listTaskWorkDays(@RequestBody UserWorkloadReq req) {
+ return taskService.listTaskWorkDays(req);
+ }
+
+ @PostMapping("/exportTask")
+ @Operation(summary = "导出任务列表", description = "导出任务列表")
+ public SdmResponse exportTask(@RequestBody TaskExportExcelFormat taskExportExcelFormat , HttpServletResponse httpservletResponse) {
+ return taskService.exportTask(taskExportExcelFormat, httpservletResponse);
+ }
+
+// /**
+// * 同步CID创建的任务
+// *
+// * @param req
+// * @return
+// */
+// @PostMapping("/synchronizeCidTask")
+// @Operation(summary = "同步CID创建的任务", description = "同步CID创建的任务")
+// public SdmResponse synchronizeCidTask(@RequestBody SpdmSyncCidTaskReq req) {
+// return taskService.synchronizeCidTask(req);
+// }
+
+ /**
+ * 获取任务详情
+ *
+ * @param req
+ * @return
+ */
+ @PostMapping("/getTaskDetail")
+ @Operation(summary = "获取任务详情", description = "获取任务详情")
+ public SdmResponse getTaskDetail(@RequestBody @Validated GetTaskDetailReq req) {
+ return taskService.getTaskDetail(req);
+ }
+
+ /**
+ * 修改任务(数据总览使用)
+ *
+ * @param req
+ * @return
+ */
+ @PostMapping("/editTaskForData")
+ @Operation(summary = "修改任务(数据总览使用)", description = "修改任务(数据总览使用)")
+ public SdmResponse editTaskForData(@RequestBody @Validated SpdmEditTaskForDataReq req) {
+ return simulationTaskService.editTaskForData(req);
+ }
+
+ /**
+ * 按工位、学科的仿真任务达成统计
+ */
+ @SysLog("按工位、学科的仿真任务达成统计")
+ @PostMapping("/getTaskCompleteStatistics")
+ @Operation(summary = "按工位、学科的仿真任务达成统计", description = "按工位、学科的仿真任务达成统计")
+ public SdmResponse getTaskCompleteStatistics(@RequestBody @Validated TaskCompleteStatisticsReq req) {
+ return taskService.getTaskCompleteStatistics(req);
+ }
+
+ /**
+ * 按工位、学科的仿真指标达成统计
+ */
+ @SysLog("按工位、学科的仿真指标达成统计")
+ @PostMapping("/getPerformanceCompleteStatistics")
+ @Operation(summary = "按工位、学科的仿真指标达成统计", description = "按工位、学科的仿真指标达成统计")
+ public SdmResponse getPerformanceCompleteStatistics(@RequestBody @Validated PerformanceCompleteStatisticsReq req) {
+ return taskService.getPerformanceCompleteStatistics(req);
+ }
+
+ /**
+ * 项目成员任务进度统计
+ */
+ @SysLog("项目成员任务进度统计")
+ @PostMapping("/getUserTaskCompleteStatistics")
+ @Operation(summary = "项目成员任务进度统计", description = "项目成员任务进度统计")
+ public SdmResponse getUserTaskCompleteStatistics(@RequestBody @Validated UserTaskCompleteStatisticsReq req) {
+ return taskService.getUserTaskCompleteStatistics(req);
+ }
+
+ /**
+ * 项目成员难度系数统计
+ *
+ */
+ @SysLog("项目成员难度系数统计")
+ @PostMapping("/getUserDifficultyStatistics")
+ @Operation(summary = "项目成员难度系数统计", description = "项目成员难度系数统计")
+ public SdmResponse getUserDifficultyStatistics(@RequestBody @Validated UserDifficultCompleteStatisticsReq req) {
+ return taskService.getUserDifficultyStatistics(req);
+ }
+
+ /**
+ * 根据需求id,查询任务列表
+ *
+ * @param req
+ * @return
+ */
+ @PostMapping("/getTaskListByDemandId")
+ @Operation(summary = "根据需求id,查询任务列表", description = "根据需求id,查询任务列表")
+ public SdmResponse getTaskListByDemandId(@RequestBody @Validated SpdmTaskListReq req) {
+ return taskService.getTaskListByDemandId(req);
+ }
+
+}
+
+
+
+package com.sdm.project.controller;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.github.pagehelper.PageInfo;
+import com.sdm.common.common.SdmResponse;
+import com.sdm.common.entity.enums.NodeTypeEnum;
+import com.sdm.common.entity.req.data.GetSimulationTaskFileReq;
+import com.sdm.common.entity.req.data.UploadFilesReq;
+
+import com.sdm.common.entity.resp.PageDataResp;
+import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
+import com.sdm.common.feign.impl.data.DataAnalysisFeignClientImpl;
+
+import com.sdm.common.feign.inter.data.IDataFeignClient;
+import com.sdm.project.common.KeyResultTypeEnum;
+import com.sdm.project.model.entity.SimulationRunKeyResult;
+import com.sdm.project.model.req.KeyResultReq;
+import com.sdm.project.model.req.YA.*;
+import com.sdm.project.model.resp.YA.BosimKeyResultInfoRsp;
+import com.sdm.project.model.resp.YA.BosimSaveNodeInfoRsp;
+import com.sdm.project.model.resp.YA.BosimSaveProjectTaskRsp;
+import com.sdm.project.model.resp.YA.KeyResultNodeInfo;
+import com.sdm.project.service.INodeService;
+import com.sdm.project.service.ITaskService;
+import com.sdm.project.service.ISimulationRunService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+@RestController
+@RequestMapping("/dataManager/tree/node")
+@Tag(name = "宜安项目数据归档", description = "宜安项目模型数据关了")
+public class YAModelController {
+
+ @Autowired
+ private IDataFeignClient dataFeignClient;
+
+ @Autowired
+ private DataAnalysisFeignClientImpl dataAnalysisFeignClient;
+
+ @Resource
+ INodeService nodeService;
+
+ @Resource
+ ITaskService taskService;
+ @Resource
+ ISimulationRunService runService;
+
+
+ /**
+ * 保存仿真模型数据
+ *
+ * @param req
+ * @return
+ */
+ @PostMapping(value = "/SaveModelNodeInfo", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ @Operation(
+ summary = "上传模型",
+ description = "仿真模型归档,支持同时上传文件和附加参数",
+ requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
+ description = "模型文件上传请求",
+ required = true,
+ content = @Content(
+ mediaType = MediaType.MULTIPART_FORM_DATA_VALUE,
+ schema = @Schema(implementation = SaveModelNodeInfoReq.class)
+ )
+ )
+ )
+ public BosimSaveNodeInfoRsp saveModelNodeInfo(SaveModelNodeInfoReq req)
+ {
+ UploadFilesReq fileReq = new UploadFilesReq();
+ fileReq.setFileName(req.getName());
+ fileReq.setProjectId(req.getProject());
+ fileReq.setFileType(1);
+ fileReq.setFile(req.getFile());
+ fileReq.setUuid(req.getScenario());
+ fileReq.setAnalysisDirectionId(req.getScenario());
+ SdmResponse uploadRespond = dataFeignClient.uploadFiles(fileReq);
+ BosimSaveNodeInfoRsp rsp = new BosimSaveNodeInfoRsp();
+ if(uploadRespond.isSuccess())
+ {
+ LinkedHashMap data = (LinkedHashMap) uploadRespond.getData();
+ rsp.setCode("200");
+ rsp.setMessage("success");
+ int fileId = (int)data.get("fileId");
+ rsp.getWorkRequest().add(String.valueOf(fileId));
+ }
+ else
+ {
+ rsp.setCode("-200");
+ rsp.setMessage(uploadRespond.getMessage());
+ }
+ return rsp;
+ }
+
+ /**
+ * 保存仿真报告
+ *
+ * @param req
+ * @return
+ */
+ @PostMapping(value = "/SaveReportNodeInfo", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ @Operation(
+ summary = "上传仿真报告",
+ description = "仿真报告归档,支持同时上传文件和附加参数",
+ requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
+ description = "仿真报告上传请求",
+ required = true,
+ content = @Content(
+ mediaType = MediaType.MULTIPART_FORM_DATA_VALUE,
+ schema = @Schema(implementation = SaveReportNodeInfoReq.class)
+ )
+ )
+ )
+ public BosimSaveNodeInfoRsp saveReportNodeInfo(SaveReportNodeInfoReq req)
+ {
+ UploadFilesReq fileReq = new UploadFilesReq();
+ fileReq.setFileName(req.getName());
+ fileReq.setProjectId(req.getProject());
+ fileReq.setFileType(2);
+ fileReq.setFile(req.getFile());
+ fileReq.setUuid(req.getScenario());
+ fileReq.setAnalysisDirectionId(req.getScenario());
+ SdmResponse uploadRespond = dataFeignClient.uploadFiles(fileReq);
+ BosimSaveNodeInfoRsp rsp = new BosimSaveNodeInfoRsp();
+ if(uploadRespond.isSuccess())
+ {
+ HashMap data = (HashMap) uploadRespond.getData();
+ rsp.setCode("200");
+ rsp.setMessage("success");
+ int fileId = (int)data.get("fileId");
+ rsp.getWorkRequest().add(String.valueOf(fileId));
+ }
+ else
+ {
+ rsp.setCode("-200");
+ rsp.setMessage(uploadRespond.getMessage());
+ }
+ return rsp;
+ }
+
+ /**
+ * 保存仿真关键结果
+ * @param req
+ * @return
+ */
+ @PostMapping(value = "/SaveKeyResultNodeInfo", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ @Operation(
+ summary = "保存仿真关键结果",
+ description = "仿真关键结果归档,支持同时上传文件和附加参数",
+ requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
+ description = "仿真关键结果上传请求",
+ required = true,
+ content = @Content(
+ mediaType = MediaType.MULTIPART_FORM_DATA_VALUE,
+ schema = @Schema(implementation = SaveReportNodeInfoReq.class)
+ )
+ )
+ )
+ public BosimSaveNodeInfoRsp saveKeyResultNodeInfo(SaveKeyResultNodeInfoReq req)
+ {
+ KeyResultReq addTaskRunReq = new KeyResultReq();
+ addTaskRunReq.setFile(req.getFile());
+ SdmResponse fileMetadataInfoResp = dataFeignClient.queryFileMetadataInfo(req.getScenario(), NodeTypeEnum.TASK.getValue(), 0L);
+ if (fileMetadataInfoResp.getData() != null) {
+ addTaskRunReq.setDirId(fileMetadataInfoResp.getData().getId());
+ }
+ addTaskRunReq.setFileName(req.getFileName());
+ addTaskRunReq.setFileType(req.getFileType());
+ addTaskRunReq.setRunId(req.getScenario());
+ addTaskRunReq.setKeyResultType(req.getCode());
+ addTaskRunReq.setName(req.getName());
+ addTaskRunReq.setQuantityType(req.getQuantityType());
+ addTaskRunReq.setValue(req.getValue());
+ addTaskRunReq.setUnits(req.getUnits());
+ SdmResponse addTaskRunResp = runService.addSimulationKeyResult(addTaskRunReq);
+
+ BosimSaveNodeInfoRsp rsp = new BosimSaveNodeInfoRsp();
+ if(addTaskRunResp.isSuccess())
+ {
+ rsp.setCode("200");
+ rsp.setMessage("success");
+ rsp.getWorkRequest().add(String.valueOf(addTaskRunResp.getData()));
+ }
+ return rsp;
+ }
+
+ @PostMapping(value = "/listKeyResultNodeInfo")
+ public BosimKeyResultInfoRsp listKeyResultNodeInfo(@RequestBody SaveKeyResultNodeInfoReq req) {
+ KeyResultReq keyResultReq = new KeyResultReq();
+ keyResultReq.setRunId(req.getScenario());
+ keyResultReq.setKeyResultType(req.getCode());
+ keyResultReq.setCurrent(req.getCurrent());
+ keyResultReq.setSize(req.getSize());
+ PageDataResp> response = runService.listSimulationKeyResult(keyResultReq).getData();
+ List resultNodeInfoList = new ArrayList<>();
+ if (CollectionUtils.isNotEmpty(response.getData())) {
+ List runKeyResults = response.getData();
+ for (SimulationRunKeyResult runKeyResult : runKeyResults) {
+ KeyResultNodeInfo keyResultNodeInfo = new KeyResultNodeInfo();
+ keyResultNodeInfo.setScenario(runKeyResult.getRunId());
+ keyResultNodeInfo.setUuid(runKeyResult.getUuid());
+ keyResultNodeInfo.setCode(runKeyResult.getKeyResultType());
+ keyResultNodeInfo.setType(KeyResultTypeEnum.getDirNameByType(runKeyResult.getKeyResultType()));
+ keyResultNodeInfo.setName(runKeyResult.getName());
+ keyResultNodeInfo.setFileId(runKeyResult.getFileId());
+ keyResultNodeInfo.setQuantityType(runKeyResult.getQuantityType());
+ keyResultNodeInfo.setUnits(runKeyResult.getUnits());
+ keyResultNodeInfo.setValue(runKeyResult.getValue());
+ resultNodeInfoList.add(keyResultNodeInfo);
+ }
+ }
+ PageInfo page = new PageInfo<>(resultNodeInfoList);
+ PageDataResp> pageDataResp = new PageDataResp<>();
+ pageDataResp.setData(resultNodeInfoList);
+ pageDataResp.setTotal( page.getTotal());
+ pageDataResp.setCurrentPage(page.getPageNum());
+ pageDataResp.setPageSize(page.getPageSize());
+
+ BosimKeyResultInfoRsp rsp = new BosimKeyResultInfoRsp();
+ rsp.setCode("200");
+ rsp.setMessage("success");
+ rsp.setData(pageDataResp);
+ return rsp;
+ }
+
+ @PostMapping("")
+ public BosimSaveNodeInfoRsp deleteModelNodeInfo(DeleteModelNodeInfoReq req)
+ {
+ return null;
+ }
+
+
+
+
+
+
+
+ @PostMapping("GetModelNodeInfoByIdAndType")
+ public void getModelNodeInfo(@RequestBody @Validated GetModelNodeInfoReq req)
+ {
+
+ }
+
+ @PostMapping("DeleteModelNodeByObjectIds")
+ public void DeleteModelNodeInfo(@RequestBody @Validated GetModelNodeInfoReq req)
+ {
+
+ }
+
+ @PostMapping("GetReportNodeInfoByIdAndType")
+ public void getReportNodeInfo(@RequestBody @Validated GetModelNodeInfoReq req)
+ {
+
+ }
+
+ @PostMapping("DeleteReportNodeByObjectIds")
+ public void DeleteReportNodeInfo(@RequestBody @Validated GetModelNodeInfoReq req)
+ {
+
+ }
+
+ @PostMapping("GetKeyResultNodeInfoByIdAndType")
+ public void getKeyResultNodeInfo(@RequestBody @Validated GetModelNodeInfoReq req)
+ {
+
+ }
+
+ @PostMapping("DeleteKeyResultNodeByObjectIds")
+ public void DeleteKeyResultNodeInfo(@RequestBody @Validated GetModelNodeInfoReq req)
+ {
+
+ }
+
+
+ /**
+ * 获取Task下模型文件信息
+ * @param outsideReq
+ * @return
+ */
+ @PostMapping("GetTaskModels")
+ public SdmResponse getTaskModels(@RequestBody @Validated GetTaskSimulatinFileReq outsideReq)
+ {
+ GetSimulationTaskFileReq req = new GetSimulationTaskFileReq();
+ req.setUuid(outsideReq.getTaskId());
+ req.setFileBizType(1);
+ req.setSize(outsideReq.getSize());
+ req.setCurrent(outsideReq.getCurrent());
+ return dataAnalysisFeignClient.getSimulationTaskFile(req);
+ }
+
+ /**
+ * 获取Task下报告文件信息
+ * @param outsideReq
+ * @return
+ */
+ @PostMapping("GetTaskReports")
+ public SdmResponse getTaskReports(@RequestBody @Validated GetTaskSimulatinFileReq outsideReq)
+ {
+ GetSimulationTaskFileReq req = new GetSimulationTaskFileReq();
+ req.setUuid(outsideReq.getTaskId());
+ req.setFileBizType(2);
+ req.setSize(outsideReq.getSize());
+ req.setCurrent(outsideReq.getCurrent());
+ return dataAnalysisFeignClient.getSimulationTaskFile(req);
+ }
+
+
+
+ public void downloadSimulationFile(long fileId)
+ {
+
+ }
+
+ @PostMapping("syncCidProject")
+ public BosimSaveProjectTaskRsp syncCidProject(@RequestBody @Validated SyncCidProjectReq req)
+ {
+ return nodeService.syncProject(req);
+ }
+
+ @PostMapping("syncCidTask")
+ public BosimSaveProjectTaskRsp syncCidTask(@RequestBody @Validated SyncCidTaskReq req)
+ {
+ return taskService.syncCidTask(req);
+ }
+
+}
+
+
+
+package com.sdm.project.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sdm.project.model.entity.SimulationBaseQuantities;
+import com.sdm.project.model.entity.SimulationBaseUnits;
+import org.apache.ibatis.annotations.Mapper;
+
+
+@Mapper
+public interface SimulationBaseQuantitiesMapper extends BaseMapper {
+
+}
+
+
+
+package com.sdm.project.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sdm.project.model.entity.SimulationBaseUnits;
+import org.apache.ibatis.annotations.Mapper;
+
+
+@Mapper
+public interface SimulationBaseUnitsMapper extends BaseMapper {
+
+}
+
+
+
+package com.sdm.project.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sdm.project.model.entity.SimulationDemand;
+import com.sdm.project.model.req.*;
+import com.sdm.project.model.vo.*;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface SimulationDemandMapper extends BaseMapper {
+
+ int addDemand(@Param("req") SpdmAddDemandReq req,@Param("tenantId") Long tenantId,@Param("jobNumber") Long jobNumber);
+
+ int addDemandMember(@Param("memberList") List memberList);
+
+ int addDemandExtra(@Param("demandExtraList") List demandExtraList);
+
+ int editDemand(@Param("req") SpdmEditDemandReq req, @Param("jobNumber") Long jobNumber);
+
+ void deleteDemandMember(@Param("demandIdList") List demandIdList);
+
+ void deleteDemandExtra(@Param("demandIdList") List demandIdList);
+
+ void deleteDemand(@Param("deleteNodeIdList") List deleteNodeIdList);
+
+ List getDemandList(@Param("tenantId") Long tenantId,@Param("req") SpdmDemandListReq req);
+
+ List getMemberList(@Param("demandIdList") List demandIdList, @Param("memberType") Integer memberType);
+
+ SpdmDemandVo getDemandByName(@Param("tenantId") Long tenantId,@Param("demandName") String demandName);
+
+ List getDemandExtraList(@Param("demandIdList") List demandIdList);
+
+ List getDemandListById(@Param("demandIdList") List demandIdList);
+
+}
+
+
+
+package com.sdm.project.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sdm.project.model.entity.SimulationRunKeyResult;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SimulationKeyResultMapper extends BaseMapper {
+
+}
+
+
+
+package com.sdm.project.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sdm.project.model.entity.SimulationNode;
+import com.sdm.project.model.po.PerformanceNodePo;
+import com.sdm.project.model.po.ProjectNodePo;
+import com.sdm.project.model.po.TaskNodeMemberPo;
+import com.sdm.project.model.po.TaskNodePo;
+import com.sdm.project.model.req.*;
+import com.sdm.project.model.vo.*;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Set;
+
+@Mapper
+public interface SimulationNodeMapper extends BaseMapper {
+
+ int addNodeBatch(@Param("addNodeList") List addNodeList);
+
+ int editNode(@Param("editNode") SpdmNodeDetailReq editNode);
+
+ int addNodeMemberBatch(@Param("addNodeMemberList") List addNodeMemberList);
+
+ int editNodeMember(@Param("editNodeMember") SpdmNodeRelateMemberReq editNodeMember);
+
+ int editNodeExtra(@Param("nodeExtra") SpdmNodeExtraReq nodeExtra);
+
+ int deleteNodeBatch(@Param("deleteNodeIdList") List deleteNodeIdList);
+
+ int deleteNodeMemberBatch(@Param("deleteNodeIdList") List deleteNodeIdList);
+
+ int deleteNodeExtraBatch(@Param("deleteNodeIdList") List deleteNodeIdList);
+
+ int addNodeExtraBatch(@Param("addNodeExtraList") List addNodeExtraList);
+
+
+ List getNodeList(@Param("nodeType") String nodeType, @Param("nodeSubType") String nodeSubType, @Param("exeStatus") String exeStatus, @Param("nodeCode") String nodeCode,
+ @Param("manager") String manager, @Param("nodeName") String nodeName, @Param("tenantId") Long tenantId, @Param("pos") int pos, @Param("limit") int limit);
+
+ int getNodeListCount(@Param("nodeType") String nodeType, @Param("nodeSubType") String nodeSubType, @Param("progressStatus") Integer progressStatus, @Param("nodeCode") String nodeCode,
+ @Param("manager") String manager, @Param("nodeName") String nodeName, @Param("tenantId") Long tenantId);
+
+
+ List getNodeExtraListByNodeIdList(@Param("nodeIdList") List nodeIdList);
+
+ List getNodeMemberListByNodeIdList(@Param("nodeIdList") List nodeIdList);
+
+ SpdmNodeDetailVo getNodeDetail(@Param("projectNodeId") String projectNodeId,@Param("tenantId") String tenantId);
+
+ List allList(@Param("nodeIdList") List deleteNodeList);
+
+ void deleteTaskBatch(List deleteNodeIdList);
+
+ void deleteTaskExtraBatch(@Param("taskIdList") List taskIdList);
+
+ void deleteTaskMemberBatch(@Param("taskIdList") List taskIdList);
+
+ void deletePerformanceBatch(@Param("performanceIdList") List performanceIdList);
+
+ void deletePerformanceExtraBatch(@Param("performanceIdList") List performanceIdList);
+
+ List getTaskListByNodeIdList(@Param("deleteNodeIdList") List deleteNodeIdList);
+
+ List getTaskMemberListByNodeIdList(@Param("nodeIdList") List nodeIdList);
+
+ List getPerformanceListByNodeIdList(@Param("taskIdList") List taskIdList);
+
+ SpdmNodeVo getNodeById(@Param("projectNodeId") String projectNodeId);
+
+ List getNodeListByNodeIdList(@Param("nodeIdList") List nodeIdList);
+
+
+ List getNodeListByIds(@Param("nodeIdList") List nodeIdList);
+
+ List getUserGroupProjectStatistics(@Param("userIds")Set userIds );
+
+ List getUserGroupTaskCompleteStatistics(@Param("req") GetUserGroupTaskCompleteStatisticsReq req);
+
+ List getUserGroupDifficultyStatistics(@Param("req") GetUserGroupTaskCompleteStatisticsReq req);
+
+ List getCommonCompleteStatisticsFromTask(@Param("req") CommonGetCompleteStatisticsReq req);
+
+ List getCommonCompleteStatisticsFromPerformance(@Param("req")CommonGetCompleteStatisticsReq req);
+
+ List getWorkstationApproveStatus(@Param("req") GetWorkstationApproveStatusReq req);
+
+ SpdmNodeVo getNodeByProjectIdAndName(@Param("projectId") String projectId, @Param("projectName") String projectName);
+
+}
+
+
+
+package com.sdm.project.dao;
+
+import com.sdm.common.entity.req.project.SimulationPerformance;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author author
+ * @since 2025-11-03
+ */
+public interface SimulationPerformanceMapper extends BaseMapper {
+
+}
+
+
+
+package com.sdm.project.dao;
+
+
+import com.sdm.common.entity.resp.project.SimulationNodeResp;
+import com.sdm.project.model.bo.*;
+import com.sdm.project.model.po.*;
+import com.sdm.project.model.req.ProjectTreeReq;
+import com.sdm.project.model.req.TaskEditNodeReq;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+@Mapper
+public interface SimulationProjectMapper {
+
+
+// int addProjectNodeVersion(@Param("version") ProjectNodeVersion version);
+
+ int deleteProjectNodeVersion(@Param("projectNodeId")String projectNodeId);
+
+// List queryProjectNodeVersion(@Param("nodeName")String nodeName,@Param("nodeVersion")String nodeVersion);
+
+
+ ProjectNodePo queryProjectBrief(@Param("projectNodeId")String projectNodeId);
+
+
+ int batchAddSimulationNodes(@Param("list") List list);
+
+ int batchAddSimulationNodeExtra(@Param("list") List list);
+
+ int batchAddSimulationNodeMember(@Param("list") List list);
+
+ int batchAddSimulationTask(@Param("list") List list);
+
+ int batchAddSimulationCidTask(@Param("list") List list);
+
+ int batchAddSimulationTaskExtra(@Param("list") List list);
+
+ int batchAddSimulationTaskMember(@Param("list") List list);
+
+ int batchAddSimulationPerformance(@Param("list") List list);
+
+ int batchAddSimulationCidPerformance(@Param("list") List list);
+
+ int batchAddSimulationPerformanceExtra(@Param("list")List list);
+
+
+
+
+
+
+
+// int batchUpdateSimulationNodes(@Param("list") List list);
+//
+// int batchUpdateSimulationNodeExtra(@Param("list") List list);
+//
+// int batchUpdateSimulationNodeMember(@Param("list") List list);
+//
+// int batchUpdateSimulationTask(@Param("list") List list);
+//
+// int batchUpdateSimulationTaskExtra(@Param("list") List list);
+//
+// int batchUpdateSimulationTaskMember(@Param("list") List list);
+//
+// int batchUpdateSimulationPerformance(@Param("list") List list);
+//
+// int batchUpdateSimulationPerformanceExtra(@Param("list")List list);
+
+
+
+ int updateProjectNode(@Param("projectNode")ProjectNodePo projectNode);
+
+ int updateProjectNodeItem(@Param("taskNode")TaskEditNodeReq taskNode);
+
+ int updateProjectNodePerformance(@Param("performanceNode")TaskEditNodeReq performanceNode);
+
+ int updateProjectNodeExtra(@Param("projectNodeExtra")ProjectNodeExtraPo projectNodeExtra);
+
+ int updateProjectNodeItemExtra(@Param("taskNodeExtra")TaskExtraNode taskNodeExtra);
+
+ int updateProjectNodeItemMember(@Param("taskNodeMember")TaskMemberNode taskNodeMember);
+
+ int updateProjectNodePerformanceExtra(@Param("projectNodePerformanceExtra")TaskExtraNode projectNodePerformanceExtra);
+
+ List queryProjectNodeList(@Param("projectName")String projectName);
+
+ List queryNodeListByNodeId(@Param("nodeId")String nodeId);
+
+ List queryNodeListByParentNodeId(@Param("nodeIdList")List nodeIdList);
+
+ List queryProjectNodeItemList(@Param("projectNodeId")String projectNodeId);
+
+ List queryProjectNodePerformanceList(@Param("projectNodeId")String projectNodeId);
+
+ List queryProjectNodeExtras(@Param("projectNodeId")String projectNodeId);
+
+ List queryProjectNodeExtrasByNodeIdList(@Param("nodeIdList")List nodeIdList);
+
+ List queryProjectNodeMembersByNodeIdList(@Param("nodeIdList")List nodeIdList);
+
+ List queryTaskNodeByNodeIdList(@Param("nodeIdList")List nodeIdList);
+
+ List queryTaskNodeExtrasByNodeIdList(@Param("taskIdList")List taskIdList);
+
+ List queryTaskNodeMembersByNodeIdList(@Param("taskIdList")List taskIdList);
+
+ List queryProjectNodeItemExtraList(@Param("projectNodeId")String projectNodeId);
+
+ List queryProjectNodePerformanceExtraList(@Param("projectNodeId")String projectNodeId);
+
+ int deleteProjectNode(@Param("nodeId")String nodeId);
+
+ int deleteProjectNodeItem(@Param("taskId")String taskId);
+
+
+ int deleteProjectNodePerformance(@Param("performanceId")String performanceId);
+
+ int deleteProjectNodeExtraInstance(@Param("extraId")String extraId);
+
+ int deleteProjectNodeItemExtraInstance(@Param("extraId")String extraId);
+
+ int deleteProjectNodePerformanceExtraInstance(@Param("extraId")String extraId);
+
+ int deleteProjectNodeAllNodes(@Param("projectNodeId")String projectNodeId);
+
+ int deleteProjectNodeAllNodeExtras(@Param("projectNodeId")String projectNodeId);
+
+ int deleteProjectNodeAllNodeMembers(@Param("projectNodeId")String projectNodeId);
+
+ int deleteProjectNodeAllTasks(@Param("projectNodeId")String projectNodeId);
+
+ int deleteProjectNodeAllTaskExtras(@Param("projectNodeId")String projectNodeId);
+
+ int deleteProjectNodeAllTaskMembers(@Param("projectNodeId")String projectNodeId);
+
+ int deleteProjectNodeAllPerformances(@Param("projectNodeId")String projectNodeId);
+
+ int deleteProjectNodeAllPerformanceExtra(@Param("projectNodeId")String projectNodeId);
+
+
+ List getNodeListByNodeIdList(@Param("nodeIdList") List nodeIdList);
+
+ List getTaskListByNodeIdList(@Param("taskIdList") List taskIdList);
+
+ List getPerformanceListByNodeIdList(@Param("taskIdList") List taskIdList);
+
+
+ void deleteNodeList(@Param("nodeIdList") List nodeIdList);
+
+ void deleteNodeExtraList(@Param("nodeIdList") List nodeIdList);
+
+ void deleteNodeMemberList(@Param("nodeIdList") List nodeIdList);
+
+ void deletePerformanceList(@Param("performanceNodeIdList") List peformanceNodeIdList);
+
+ void deletePerformanceExtraList(@Param("performanceNodeIdList") List performanceNodeIdList);
+
+ void deleteTaskList(@Param("taskIdList") List taskIdList);
+
+ void deleteTaskExtraList(@Param("taskIdList") List taskIdList);
+
+ void deleteTaskMemberList(@Param("taskIdList") List taskIdList);
+
+
+ List queryPerformanceNodeByNodeIdList(@Param("taskIdList") List taskIdList,@Param("beginTime") String beginTime,@Param("endTime") String endTime,@Param("name") String name);
+
+ List queryPerformanceNodeExtrasByNodeIdList(@Param("taskIdList") List taskIdList);
+
+// List getTaskList(@Param("tenantId") String tenantId,@Param("taskName") String taskName, @Param("taskStatus") Integer taskStatus, @Param("achieveStatus") Integer achieveStatus, @Param("nodeIdList") List nodeIdList);
+
+ List queryRunListByNodeIdList(@Param("taskIdList") List taskIdList,@Param("beginTime") String beginTime,@Param("endTime") String endTime,@Param("name") String name);
+
+ List getNodeListByTag(@Param("req") ProjectTreeReq projectTreeReq);
+
+ List getTaskListByTag(@Param("req") ProjectTreeReq taskTreeReq);
+
+ void getUserGroupProjectStatistics();
+
+ List getRunListByNodeIdList(@Param("taskIdList") List taskIdList);
+
+ List querySimulationNodeByUuids(@Param("list")List uuids);
+
+ List getNodeByIdList(@Param("nodeIdList") List nodeIdList);
+}
+
+
+
+package com.sdm.project.dao;
+
+import com.sdm.project.model.entity.SimulationRun;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author author
+ * @since 2025-11-03
+ */
+public interface SimulationRunMapper extends BaseMapper {
+
+ List findRunAndDescendantsIds(String runId);
+
+}
+
+
+
+package com.sdm.project.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sdm.project.model.entity.SimulationTaskAttention;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SimulationTaskAttentionMapper extends BaseMapper {
+
+}
+
+
+
+package com.sdm.project.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sdm.project.model.entity.SimulationTaskExtra;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author author
+ * @since 2025-09-16
+ */
+public interface SimulationTaskExtraMapper extends BaseMapper {
+
+}
+
+
+
+package com.sdm.project.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sdm.common.common.SdmResponse;
+import com.sdm.project.model.entity.SimulationTask;
+import com.sdm.project.model.po.TaskNodeExtraPo;
+import com.sdm.project.model.req.SpdmAnalysisTaskListReq;
+import com.sdm.project.model.req.*;
+import com.sdm.project.model.vo.*;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface SimulationTaskMapper extends BaseMapper {
+
+
+ SdmResponse list(SpdmTaskListReq req);
+
+ List getTaskList(@Param("tenantId") Long tenantId, @Param("req") SpdmTaskListReq req);
+
+ List getMemberList(@Param("taskIdList") List taskIdList, @Param("memberType") Integer memberType);
+
+ List getAttentionMemberList(@Param("taskIdList") List taskIdList);
+
+ List getTaskListByDemandIdList(@Param("demandIdList") List demandIdList);
+
+ SpdmTaskVo getTask(@Param("taskId") String taskId);
+
+ List taskList(@Param("req") SpdmAnalysisTaskListReq req, @Param("tenantId") Long tenantId, @Param("allNodeIdList") List allNodeIdList, @Param("pos") int pos, @Param("limit") int limit);
+
+ void deleteAttentionByUserIdList(@Param("taskId") String taskId,@Param("userIdList") List userIdList);
+
+ void saveAttentionList(@Param("attentionList") List attentionList);
+
+ int updateTask(@Param("task") SpdmTaskVo task);
+
+ List getUserExecTaskWithinTimeFrame(@Param("req") UserWorkloadReq req);
+
+ SpdmTaskVo getTaskById(@Param("id") Long id);
+
+ List getTaskCompleteStatistics(@Param("req") TaskCompleteStatisticsReq req);
+
+ List getPerformanceCompleteStatistics(@Param("req") PerformanceCompleteStatisticsReq req);
+
+ List getUserTaskCompleteStatistics(@Param("req") UserTaskCompleteStatisticsReq req);
+
+ List getUserDifficultyStatistics(@Param("req") UserDifficultCompleteStatisticsReq req);
+
+ List getTaskExtraList(@Param("taskIdList") List taskIdList);
+
+ List getTaskListByTag(@Param("req") TaskCompleteStatisticsReq req);
+
+ List getTaskListByName(@Param("taskNameList") List taskNameList);
+
+ List getTaskListByDemandId(@Param("demandId") String demandId);
+
+}
+
+
+
+package com.sdm.project.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sdm.project.model.entity.SimulationTaskMember;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SimulationTaskMemberMapper extends BaseMapper {
+
+}
+
+
+
+package com.sdm.project.filter;
+
+import com.sdm.common.filter.BaseAuthFilter;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+
+@Slf4j
+public class AuthFilter extends BaseAuthFilter {
+
+ @Override
+ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+ super.doFilter(servletRequest, servletResponse, filterChain);
+ }
+}
+
+
+
+package com.sdm.project.handler;
+
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class ListStringTypeHandler extends BaseTypeHandler> {
+
+ @Override
+ public void setNonNullParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException {
+ ps.setString(i, String.join(",", parameter));
+ }
+
+ @Override
+ public List getNullableResult(ResultSet rs, String columnName) throws SQLException {
+ if (rs.getString(columnName) == null) {
+ return new ArrayList<>();
+ }
+ return Arrays.asList(rs.getString(columnName).split(","));
+ }
+
+ @Override
+ public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+ if (rs.getString(columnIndex) == null) {
+ return new ArrayList<>();
+ }
+ return Arrays.asList(rs.getString(columnIndex).split(","));
+ }
+
+ @Override
+ public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+ if (cs.getString(columnIndex) == null) {
+ return new ArrayList<>();
+ }
+ return Arrays.asList(cs.getString(columnIndex).split(","));
+ }
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/* 交付物审批流程,传递给电子流平台内容变化的数据 */
+@Data
+public class ApprovalDeliverableContentsModel {
+ /**
+ * 任务uuid
+ */
+ private String taskId;
+ /**
+ * 难度系数
+ */
+ private Float difficult;
+
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import java.lang.reflect.Field;
+
+public class BaseBean {
+ protected void init()
+ {
+ Class cls = this.getClass();
+ Field[] fields = cls.getDeclaredFields();
+ try {
+ for (Field field : fields) {
+ Class typeClass = field.getType();
+ if (typeClass == String.class) {
+ String empty = "";
+ field.set(this, empty);
+ }
+ else if(typeClass == Byte.class)
+ {
+ field.setByte(this,(byte)0);
+ }
+ else if(typeClass == Integer.class)
+ {
+ field.setInt(this,0);
+ }
+ else if(typeClass == Long.class)
+ {
+ field.setLong(this,0);
+ }
+ else if(typeClass == Float.class)
+ {
+ field.setFloat(this,0);
+ }
+ else if(typeClass == Double.class)
+ {
+ field.setDouble(this,0);
+ }
+ }
+ }
+ catch (Exception exception)
+ {
+ exception.printStackTrace();
+ }
+ }
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.project.model.po.ProjectNodeExtraPo;
+import com.sdm.project.model.po.TaskNodeMemberPo;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class CidTaskNode extends BaseEntity {
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ private String ownRootNodeUuid;
+
+ /**
+ * 父节点id
+ */
+ private String parentId;
+
+ private String nodeId;
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private String exeStatus;
+
+ private String exeStatusValue;
+
+ /**
+ * 项目进度状态
+ */
+ private Integer progress;
+
+ private String progressStatusValue;
+
+ /**
+ * 项目达成状态(红黄绿灯)
+ */
+ private Integer achieveStatus;
+
+ private String achieveStatusValue;
+
+ /**
+ * 仿真负责人
+ */
+ private String sManager;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 标准工时
+ */
+ private Integer days;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 实际工时
+ */
+ private Integer realDays;
+
+ /**
+ * 难度系数
+ */
+ private Float difficult;
+
+ /**
+ * 审批状态
+ */
+ private String approvalStatus;
+
+ /**
+ * 确认状态
+ */
+ private String confirmStatus;
+
+
+ /**
+ * 项目经理
+ */
+ private String managers;
+
+ /**
+ * 拓展属性集合
+ */
+ private List extraList;
+
+ /**
+ * 项目详情图片
+ */
+ private String detailImgUrl;
+
+ /**
+ * 备注
+ */
+ private String description;
+
+
+ /**
+ * 达标方式
+ */
+ private String method;
+
+ private String taskId;
+
+ /**
+ * 目标值
+ */
+ private String targetValue;
+
+ /**
+ * 单位
+ */
+ private String unit;
+
+ private List children = new ArrayList<>(); //适配前端组件
+
+
+ private String nodeVersion;
+
+ private Long tenantId;
+
+ private List taskExtraNodeList;
+
+ private List memberList;
+
+ private List extras;
+
+ private List members;
+
+ private String levelType;
+
+ private String nodeLevel;
+
+ /**
+ * 仿真负责人
+ */
+ @JsonProperty(value = "pMemberList")
+ private String pMemberList;
+
+ /**
+ * 仿真执行人
+ */
+ @JsonProperty(value = "eMemberList")
+ private String eMemberList;
+
+ /**
+ * 任务名称
+ */
+ private String taskName;
+
+ /**
+ * 任务编码
+ */
+ private String taskCode;
+ private String standard;
+ private String englishName;
+ private String performanceType;
+ private String lowValue;
+ private String highValue;
+ private String analyseTarget;
+ private String confidence;
+ private String analyseSoftware;
+ private String analyseSoftwares;
+ private String department;
+ private String section;
+ private String group;
+ @JsonProperty(value = "bCapacity")
+ private String bCapacity;
+ @JsonProperty(value = "tag1")
+ private String tag1;
+
+
+
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 从曲线结果提取的参数
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class CurveParamDto {
+ @JsonProperty("max")
+ @Schema(description = "最大值")
+ private Double max;
+
+ @JsonProperty("min")
+ @Schema(description = "最小值")
+ private Double min;
+
+ @JsonProperty("unit")
+ @Schema(description = "单位")
+ private String unit;
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.project.model.po.ProjectNodeExtraPo;
+import com.sdm.project.model.po.ProjectNodeMemberPo;
+import com.sdm.project.model.req.SpdmDeleteProjectDetailReq;
+import com.sdm.project.model.req.TaskEditNodeReq;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class ModifyProjectNode extends BaseEntity {
+ String ownRootNodeUuid;
+
+ List tagMap;
+
+ List addNodeList;
+
+ List editNodeList;
+
+ List deleteNodeList;
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.project.model.req.TaskEditNodeReq;
+import lombok.Data;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class ModifyTaskNode extends BaseEntity {
+
+ List editNodeList;
+
+
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import com.sdm.common.entity.pojo.performance.PerformanceBase;
+import com.sdm.common.entity.pojo.performance.PerformanceExpand;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class PerformanceInfo extends PerformanceBase {
+ private List expands;
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class ProjectExtraNode extends BaseEntity {
+
+ private String nodeId;
+
+ private String performanceId;
+
+ private String taskId;
+
+ private String uuid;
+
+ /**
+ * 属性名
+ */
+ private String propertyName;
+
+ /**
+ * 属性值
+ */
+ private String propertyValue;
+
+ /**
+ * 值类型
+ */
+ private String valueType;
+
+ /**
+ * 属性
+ */
+ private String propertyClass;
+
+
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import com.sdm.common.entity.bo.UserInfo;
+import com.sdm.common.entity.pojo.project.ProjectBase;
+import com.sdm.common.entity.pojo.project.ProjectExpand;
+import com.sdm.common.entity.pojo.project.ProjectNodeBase;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ProjectInfo extends ProjectBase {
+ private List expands;
+
+ //状态灯颜色: 1:red 2:yellow 3:grey 4:green
+ private int projectStatus;
+ private String currentPhase;
+
+ private List projectManagers;
+
+ private List phases;
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class ProjectMemberNode extends BaseEntity {
+
+ /**
+ * 用户名
+ */
+ private String userName;
+
+ /**
+ * 工号
+ */
+ private String jobNumber;
+
+ /**
+ * 用户角色
+ */
+ private String userRole;
+
+ /**
+ * 部门
+ */
+ private String department;
+
+ /**
+ * 手机号
+ */
+ private String phone;
+
+ /**
+ * 邮箱
+ */
+ private String email;
+
+ private String taskId;
+
+ private String nodeId;
+
+ private String uuid;
+
+ private String identity;
+
+ private String name;
+
+
+
+
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.project.model.po.ProjectNodeExtraPo;
+import com.sdm.project.model.po.ProjectNodeMemberPo;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class ProjectNode extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ /**
+ * 节点名称
+ */
+ private String nodeName;
+
+
+ /**
+ * 节点编码
+ */
+ private String nodeCode;
+
+
+ /**
+ * 节点类型
+ */
+ private String nodeType;
+
+ /**
+ * 项目类型
+ */
+ private String nodeSubType;
+
+ /**
+ * 父节点id
+ */
+ private String parentId;
+
+ private String nodeId;
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private String exeStatus;
+
+ /**
+ * 项目进度状态
+ */
+ private Integer progress;
+
+ private String progressStatusValue;
+
+ /**
+ * 项目达成状态(红黄绿灯)
+ */
+ private Integer achieveStatus;
+
+ private String achieveStatusValue;
+
+ /**
+ * 仿真负责人
+ */
+ private String sManager;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 标准工时
+ */
+ private Integer days;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 实际工时
+ */
+ private Integer realDays;
+
+ /**
+ * 难度系数
+ */
+ private Float difficult;
+
+ /**
+ * 审批状态
+ */
+ private String approvalStatus;
+
+ /**
+ * 确认状态
+ */
+ private String confirmStatus;
+
+
+ /**
+ * 项目经理
+ */
+ private String managers;
+
+ /**
+ * 项目详情图片
+ */
+ private String detailImgUrl;
+
+ /**
+ * 备注
+ */
+ private String description;
+
+
+ /**
+ * 达标方式
+ */
+ private String method;
+
+ private String taskId;
+
+ /**
+ * 目标值
+ */
+ private String targetValue;
+
+ private String performanceType;
+ private String highValue;
+ private String lowValue;
+
+
+
+ /**
+ * 单位
+ */
+ private String unit;
+
+ private List children = new ArrayList<>(); //适配前端组件
+
+
+ private String nodeVersion;
+
+// private String tenantId;
+
+
+
+ /**
+ * 拓展属性集合
+ */
+ private List extras;
+
+ private List memberList;
+
+ /**
+ * 仿真执行人
+ */
+ @JsonProperty(value = "eMemberList")
+ private String eMemberList;
+ /**
+ * 仿真负责人
+ */
+ @JsonProperty(value = "pMemberList")
+ private String pMemberList;
+
+ private String levelType;
+
+ private String nodeLevel;
+
+ private String folderId;
+
+ private String taskName;
+
+ private String taskCode;
+
+ private String performanceName;
+
+ private String standard;
+ private String analyseTarget;
+ private String confidence;
+ private String analyseSoftware;
+ private String department;
+ private String section;
+ private String group;
+ @JsonProperty(value = "bCapacity")
+ private String bCapacity;
+ private String flowTemplate;
+ private String englishName;
+
+ private List analyseSoftwareList;
+
+ @JsonProperty(value = "tag1")
+ private List tag1;
+ @JsonProperty(value = "tag2")
+ private List tag2;
+ @JsonProperty(value = "tag3")
+ private List tag3;
+ @JsonProperty(value = "tag4")
+ private List tag4;
+ @JsonProperty(value = "tag5")
+ private List tag5;
+ @JsonProperty(value = "tag6")
+ private List tag6;
+ @JsonProperty(value = "tag7")
+ private List tag7;
+ @JsonProperty(value = "tag8")
+ private List tag8;
+ @JsonProperty(value = "tag9")
+ private List tag9;
+ @JsonProperty(value = "tag10")
+ private List tag10;
+
+ private Long imageFileId;
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import com.sdm.common.entity.bo.UserInfo;
+import com.sdm.common.entity.pojo.project.ProjectNodeBase;
+import com.sdm.common.entity.pojo.project.ProjectNodeExpand;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ProjectNodeInfo extends ProjectNodeBase {
+ private List expands;
+ private List members;
+ private List children;
+ private List taskInfos;
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ProjectNodeTree extends BaseBean {
+
+ public List nodeList = new ArrayList<>();
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class TaskExtraNode extends BaseEntity {
+
+ private String nodeId;
+
+ private String performanceId;
+
+ private String taskId;
+
+ private String uuid;
+
+ /**
+ * 属性名
+ */
+ private String propertyName;
+
+ /**
+ * 属性值
+ */
+ private String propertyValue;
+
+ /**
+ * 值类型
+ */
+ private String valueType;
+
+ /**
+ * 属性
+ */
+ private String propertyClass;
+
+
+
+
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import com.sdm.common.entity.bo.UserInfo;
+import com.sdm.common.entity.pojo.task.TaskBase;
+import com.sdm.common.entity.pojo.task.TaskExpand;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TaskInfo extends TaskBase {
+
+ private List expands;
+
+ private List members;
+
+ private List performanceInfos;
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class TaskMemberNode extends BaseEntity {
+
+ /**
+ * 用户名
+ */
+ private String userName;
+
+ /**
+ * 工号
+ */
+ private String jobNumber;
+
+ /**
+ * 用户角色
+ */
+ private String userRole;
+
+ /**
+ * 部门
+ */
+ private String department;
+
+ /**
+ * 手机号
+ */
+ private String phone;
+
+ /**
+ * 邮箱
+ */
+ private String email;
+
+ private String taskId;
+
+ private String nodeId;
+
+ private String uuid;
+
+ private String identity;
+
+ private String name;
+
+ private String userId;
+
+ private Integer type;
+
+
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.project.model.po.ProjectNodeExtraPo;
+import com.sdm.project.model.po.TaskNodeExtraPo;
+import com.sdm.project.model.po.TaskNodeMemberPo;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class TaskNode extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ private String ownRootNodeUuid;
+
+ /**
+ * 节点名称
+ */
+ private String nodeName;
+
+
+ /**
+ * 节点编码
+ */
+ private String nodeCode;
+
+
+ /**
+ * 节点类型
+ */
+ private String nodeType;
+
+ /**
+ * 项目类型
+ */
+ private String nodeSubType;
+
+ /**
+ * 父节点id
+ */
+ private String parentId;
+
+ private String nodeId;
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private String exeStatus;
+
+ private String exeStatusValue;
+
+ /**
+ * 项目进度状态
+ */
+ private Integer progress;
+
+ private String progressStatusValue;
+
+ /**
+ * 项目达成状态(红黄绿灯)
+ */
+ private Integer achieveStatus;
+
+ private String achieveStatusValue;
+
+ /**
+ * 仿真负责人
+ */
+ private String sManager;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 标准工时
+ */
+ private Integer days;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 实际工时
+ */
+ private Integer realDays;
+
+ /**
+ * 难度系数
+ */
+ private Float difficult;
+
+ /**
+ * 审批状态
+ */
+ private String approvalStatus;
+
+ /**
+ * 确认状态
+ */
+ private String confirmStatus;
+
+
+ /**
+ * 项目经理
+ */
+ private String managers;
+
+ /**
+ * 拓展属性集合
+ */
+ private List extraList;
+
+ /**
+ * 项目详情图片
+ */
+ private String detailImgUrl;
+
+ /**
+ * 备注
+ */
+ private String description;
+
+
+ /**
+ * 达标方式
+ */
+ private String method;
+
+ private String taskId;
+
+ /**
+ * 目标值
+ */
+ private String targetValue;
+
+ /**
+ * 单位
+ */
+ private String unit;
+
+ private List children = new ArrayList<>(); //适配前端组件
+
+
+ private String nodeVersion;
+
+ private Long tenantId;
+
+ private List taskExtraNodeList;
+
+ private List memberList;
+
+ private List extras;
+
+ private List members;
+
+ private String levelType;
+
+ private String nodeLevel;
+
+ /**
+ * 仿真负责人
+ */
+ @JsonProperty(value = "pMemberList")
+ private String pMemberList;
+
+ /**
+ * 仿真执行人
+ */
+ @JsonProperty(value = "eMemberList")
+ private String eMemberList;
+
+ /**
+ * 任务名称
+ */
+ private String taskName;
+
+
+ /**
+ * 任务编码
+ */
+ private String taskCode;
+
+ private String standard;
+
+ private String englishName;
+
+ private String performanceType;
+
+ private String lowValue;
+ private String highValue;
+
+
+
+ /**
+ * 父主键id
+ */
+ private Long ppId;
+
+
+ private String analyseTarget;
+ private String confidence;
+ private String analyseSoftware;
+ private String analyseSoftwares;
+ private String department;
+ private String section;
+ private String group;
+ @JsonProperty(value = "bCapacity")
+ private String bCapacity;
+ private String flowTemplate;
+
+ @JsonProperty(value = "tag1")
+ private List tag1;
+ @JsonProperty(value = "tag2")
+ private List tag2;
+ @JsonProperty(value = "tag3")
+ private List tag3;
+ @JsonProperty(value = "tag4")
+ private List tag4;
+ @JsonProperty(value = "tag5")
+ private List tag5;
+ @JsonProperty(value = "tag6")
+ private List tag6;
+ @JsonProperty(value = "tag7")
+ private List tag7;
+ @JsonProperty(value = "tag8")
+ private List tag8;
+ @JsonProperty(value = "tag9")
+ private List tag9;
+ @JsonProperty(value = "tag10")
+ private List tag10;
+
+// private String tags1;
+// private String tags2;
+// private String tags3;
+// private String tags4;
+// private String tags5;
+// private String tags6;
+// private String tags7;
+// private String tags8;
+// private String tags9;
+// private String tags10;
+
+ private String demandId;
+ private Long imageFileId;
+
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class TaskNodeTag {
+ String key;
+ String value;
+}
+
+
+
+package com.sdm.project.model.bo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TaskNodeTree extends BaseBean {
+
+ public List nodeList = new ArrayList<>();
+
+}
+
+
+
+package com.sdm.project.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("simulation_base_quantities")
+@ApiModel(value="SimulationBaseQuantities对象", description="物理量基表")
+public class SimulationBaseQuantities implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id")
+ private Integer id;
+
+ @TableField("label")
+ private String label;
+
+ @TableField("family")
+ private String family;
+
+ @TableField("name")
+ private String name;
+
+ @TableField("changeFlag")
+ private String changeFlag;
+
+}
+
+
+
+package com.sdm.project.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("simulation_base_units")
+@ApiModel(value="SimulationBaseUnits对象", description="单位基表")
+public class SimulationBaseUnits implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id")
+ private Integer id;
+
+ @TableField("label")
+ private String label;
+
+ @TableField("family")
+ private String family;
+
+ @TableField("name")
+ private String name;
+
+ @TableField("changeFlag")
+ private String changeFlag;
+
+}
+
+
+
+package com.sdm.project.model.entity;
+
+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;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("simulation_demand")
+@ApiModel(value="SimulationDemand对象", description="")
+public class SimulationDemand implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @TableField("uuid")
+ private String uuid;
+
+ @TableField("demand_name")
+ private String demandName;
+
+ @TableField("demand_code")
+ private String demandCode;
+
+ @TableField("demand_type")
+ private String demandType;
+
+ @TableField("sim_type")
+ private String simType;
+
+ @TableField("demand_status")
+ private String demandStatus;
+
+ @TableField("achieve_status")
+ private String achieveStatus;
+
+ @TableField("progress")
+ private Integer progress;
+
+ @TableField("approval_status")
+ private String approvalStatus;
+
+ @TableField("begin_time")
+ private String beginTime;
+
+ @TableField("end_time")
+ private String endTime;
+
+ @TableField("finish_time")
+ private String finishTime;
+
+ @TableField("project_id")
+ private String projectId;
+
+ @TableField("phase_id")
+ private String phaseId;
+
+ @TableField("node_id")
+ private String nodeId;
+
+ @TableField("tenant_id")
+ private Long tenantId;
+
+ @TableField("creator")
+ private Long creator;
+
+ @TableField("create_time")
+ private String createTime;
+
+ @TableField("updater")
+ private Long updater;
+
+ @TableField("update_time")
+ private String updateTime;
+
+ @TableField("description")
+ private String description;
+}
+
+
+
+package com.sdm.project.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ *
+ *
+ *
+ *
+ * @author author
+ * @since 2025-11-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("simulation_node")
+@ApiModel(value="SimulationNode对象", description="")
+public class SimulationNode implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @TableField("uuid")
+ private String uuid;
+
+ @ApiModelProperty(value = "所属根节点uuid")
+ @TableField("ownRootNodeUuid")
+ private String ownRootNodeUuid;
+
+ @TableField("nodeName")
+ private String nodeName;
+
+ @TableField("nodeCode")
+ private String nodeCode;
+
+ @TableField("englishName")
+ private String englishName;
+
+ @TableField("nodeType")
+ private String nodeType;
+
+ @TableField("nodeSubType")
+ private String nodeSubType;
+
+ @TableField("nodeStatus")
+ private String nodeStatus;
+
+ @TableField("parentId")
+ private String parentId;
+
+ @TableField("folderId")
+ private String folderId;
+
+ @TableField("nodeLevel")
+ private Integer nodeLevel;
+
+ @TableField("beginTime")
+ private String beginTime;
+
+ @TableField("endTime")
+ private String endTime;
+
+ @TableField("finishTime")
+ private String finishTime;
+
+ @TableField("progress")
+ private Integer progress;
+
+ @TableField("achieveStatus")
+ private Integer achieveStatus;
+
+ @TableField("nodeVersion")
+ private String nodeVersion;
+
+ @TableField("tenantId")
+ private Long tenantId;
+
+ @TableField("description")
+ private String description;
+
+ @TableField("detailImgUrl")
+ private String detailImgUrl;
+
+ @TableField("creator")
+ private Long creator;
+
+ @ApiModelProperty(value = "创建时间")
+ @TableField("create_time")
+ private String createTime;
+
+ @TableField("updater")
+ private Long updater;
+
+ @ApiModelProperty(value = "更新时间")
+ @TableField("update_time")
+ private String updateTime;
+
+ @TableField("pid")
+ private Integer pid;
+
+ @ApiModelProperty(value = "上汽大众:SVW 德国大众:VW")
+ @TableField("exe_status")
+ private String exeStatus;
+
+ @TableField("tag1")
+ private String tag1;
+
+ @TableField("tag2")
+ private String tag2;
+
+ @TableField("tag3")
+ private String tag3;
+
+ @TableField("tag4")
+ private String tag4;
+
+ @TableField("tag5")
+ private String tag5;
+
+ @TableField("tag6")
+ private String tag6;
+
+ @TableField("tag7")
+ private String tag7;
+
+ @TableField("tag8")
+ private String tag8;
+
+ @TableField("tag9")
+ private String tag9;
+
+ @TableField("tag10")
+ private String tag10;
+
+
+}
+
+
+
+package com.sdm.project.model.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ *
+ *
+ *
+ *
+ * @author author
+ * @since 2025-11-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("simulation_run")
+@ApiModel(value="SimulationRun对象", description="")
+public class SimulationRun implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @TableField("uuid")
+ private String uuid;
+
+ @TableField("runName")
+ private String runName;
+
+ @ApiModelProperty(value = "1:server 2:pbs 3:local only")
+ @TableField("type")
+ private Integer type;
+
+ @TableField("taskId")
+ private String taskId;
+
+ @ApiModelProperty(value = "流程模板id")
+ @TableField("flowTemplate")
+ private String flowTemplate;
+
+ @ApiModelProperty(value = "Run状态 0:未执行 1:执行中 2:完成 3:失败")
+ @TableField("status")
+ private Integer status;
+
+ @ApiModelProperty(value = "Run总共的流程步骤")
+ @TableField("totalStep")
+ private Integer totalStep;
+
+ @ApiModelProperty(value = "当前的流程步骤")
+ @TableField("currentStep")
+ private Integer currentStep;
+
+ @ApiModelProperty(value = "当前的流程步骤名称")
+ @TableField("currentStepName")
+ private String currentStepName;
+
+ @ApiModelProperty(value = "Run执行结果 0:gray 1:red 2:yellow 3:green")
+ @TableField("achieveStatus")
+ private Integer achieveStatus;
+
+ @ApiModelProperty(value = "run描述信息")
+ @TableField("description")
+ private String description;
+
+ @ApiModelProperty(value = "Run对应在文件系统中的路径")
+ @TableField("folderId")
+ private Long folderId;
+
+ @ApiModelProperty(value = "计算父版本Id")
+ @TableField("parentId")
+ private String parentId;
+
+ @TableField("isPersonalTemplate")
+ private String isPersonalTemplate;
+
+ @ApiModelProperty(value = "租户id")
+ @TableField("tenantId")
+ private Long tenantId;
+
+ @ApiModelProperty(value = "英文名")
+ @TableField("englishName")
+ private Long englishName;
+
+ @Schema(description= "创建者ID")
+ @TableField("creator")
+ private Long creator;
+
+ @Schema(description= "创建时间")
+ @TableField("createTime")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime createTime;
+
+ @Schema(description= "更新者ID")
+ @TableField("updater")
+ private Long updater;
+
+ @Schema(description= "创建时间")
+ @TableField("updateTime")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime updateTime;
+
+ @Schema(description = "flowable流程完成部署后的流程定义id,根据这个发起流程实例")
+ @TableField("processDefinitionId")
+ public String processDefinitionId;
+
+ @Schema(description= "流程实例id(流程引擎返回的)")
+ @TableField("flowInstanceId")
+ private String flowInstanceId;
+
+}
+
+
+
+package com.sdm.project.model.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("simulation_run_key_result")
+@ApiModel(value="simulationRunKeyResult对象", description="任务执行-图片/动画/数值/文件关键性能结果实体")
+public class SimulationRunKeyResult implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ @ApiModelProperty(value = "主键ID", example = "1")
+ private Long id;
+
+ @TableField("uuid")
+ @ApiModelProperty(value = "关键结果唯一ID", required = true)
+ private String uuid;
+
+ @TableField("runId")
+ @ApiModelProperty(value = "所属Run UUID", required = true)
+ private String runId;
+
+ @TableField("keyResultType")
+ @ApiModelProperty(value = "关键性能结果类型 1-图片/动画 2-曲线 3-报告 4-数值")
+ private Integer keyResultType;
+
+ @TableField("name")
+ @ApiModelProperty(value = "结果名称")
+ private String name;
+
+ @TableField("fileId")
+ @ApiModelProperty(value = "关联文件id")
+ private Long fileId;
+
+ @TableField("quantityType")
+ @ApiModelProperty(value = "物理量类型")
+ private String quantityType;
+
+ @TableField("units")
+ @ApiModelProperty(value = "结果单位")
+ private String units;
+
+ @TableField("max")
+ @ApiModelProperty(value = "最大数值")
+ private String max;
+
+ @TableField("min")
+ @ApiModelProperty(value = "最小数值")
+ private String min;
+
+ @TableField("value")
+ @ApiModelProperty(value = "数值")
+ private String value;
+
+ @TableField("description")
+ @ApiModelProperty(value = "描述信息")
+ private String description;
+
+ @TableField("xQuantityType")
+ @ApiModelProperty(value = "x轴物理量(曲线结果使用)")
+ private String xQuantityType;
+
+ @TableField("xUnits")
+ @ApiModelProperty(value = "x轴结果单位(曲线结果使用)")
+ private String xUnits;
+
+ @TableField("yQuantityType")
+ @ApiModelProperty(value = "y轴物理量(曲线结果使用)")
+ private String yQuantityType;
+
+ @TableField("yUnits")
+ @ApiModelProperty(value = "y轴结果单位(曲线结果使用)")
+ private String yUnits;
+
+ @TableField("creator")
+ @ApiModelProperty(value = "创建人ID")
+ private Long creator;
+
+ @TableField("createTime")
+ @ApiModelProperty(value = "创建时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime createTime;
+
+ @TableField("updater")
+ @ApiModelProperty(value = "更新人ID")
+ private Long updater;
+
+ @TableField("updateTime")
+ @ApiModelProperty(value = "更新时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime updateTime;
+
+ @Schema(description= "创建者名称,列表展示使用")
+ @TableField(value = "creatorName", insertStrategy = FieldStrategy.NEVER,select = false,updateStrategy = FieldStrategy.NEVER)
+ private String creatorName;
+
+ @Schema(description= "更新者名称,列表展示使用")
+ @TableField(value = "updaterName", insertStrategy = FieldStrategy.NEVER,select = false,updateStrategy = FieldStrategy.NEVER)
+ private String updaterName;
+
+}
+
+
+
+package com.sdm.project.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ *
+ *
+ *
+ *
+ * @author author
+ * @since 2025-11-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("simulation_task")
+@ApiModel(value="SimulationTask对象", description="")
+public class SimulationTask implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty(value = "loadcase名称")
+ @TableField("uuid")
+ private String uuid;
+
+ @ApiModelProperty(value = "loadcase所属学科名称")
+ @TableField("task_name")
+ private String taskName;
+
+ @TableField("task_code")
+ private String taskCode;
+
+ @ApiModelProperty(value = "loadcase 库名称")
+ @TableField("task_pool_name")
+ private String taskPoolName;
+
+ @TableField("task_pool_version")
+ private String taskPoolVersion;
+
+ @ApiModelProperty(value = "task所属节点Id,0表示不从属任何节点")
+ @TableField("node_id")
+ private String nodeId;
+
+ @ApiModelProperty(value = "loadcase预估的工作周期")
+ @TableField("days")
+ private Integer days;
+
+ @TableField("real_days")
+ private Integer realDays;
+
+ @ApiModelProperty(value = "loadcase参照的标准")
+ @TableField("standard")
+ private String standard;
+
+ @TableField("fold_id")
+ private String foldId;
+
+ @ApiModelProperty(value = "loadcase当前状态 1:red 2:yellow 3:grey 4:green")
+ @TableField("status")
+ private Integer status;
+
+ @TableField("achieve_status")
+ private String achieveStatus;
+
+ @ApiModelProperty(value = "loadcase开始时间")
+ @TableField("begin_time")
+ private String beginTime;
+
+ @ApiModelProperty(value = "loadcase执行结束时间")
+ @TableField("end_time")
+ private String endTime;
+
+ @TableField("finish_time")
+ private String finishTime;
+
+ @ApiModelProperty(value = "loadcase进度")
+ @TableField("progress")
+ private Integer progress;
+
+ @ApiModelProperty(value = "上汽大众:SVW 德国大众:VW")
+ @TableField("exe_status")
+ private String exeStatus;
+
+ @ApiModelProperty(value = "置信度")
+ @TableField("confidence")
+ private String confidence;
+
+ @TableField("analyse_target")
+ private String analyseTarget;
+
+ @ApiModelProperty(value = "分析软件")
+ @TableField("analyse_software")
+ private String analyseSoftware;
+
+ @TableField("approval_status")
+ private Integer approvalStatus;
+
+ @TableField("comfirm_status")
+ private String comfirmStatus;
+
+ @TableField("description")
+ private String description;
+
+ @TableField("difficult")
+ private Float difficult;
+
+ @TableField("tenant_id")
+ private String tenantId;
+
+ @TableField("pid")
+ private Integer pid;
+
+ @ApiModelProperty(value = "创建人")
+ @TableField("creator")
+ private Long creator;
+
+ @ApiModelProperty(value = "创建时间")
+ @TableField("create_time")
+ private String createTime;
+
+ @ApiModelProperty(value = "更新人")
+ @TableField("updater")
+ private Long updater;
+
+ @ApiModelProperty(value = "更新时间")
+ @TableField("update_time")
+ private String updateTime;
+
+ @ApiModelProperty(value = "部门")
+ @TableField("department")
+ private String department;
+
+ @ApiModelProperty(value = "科")
+ @TableField("sectionName")
+ private String sectionName;
+
+ @ApiModelProperty(value = "组")
+ @TableField("groupName")
+ private String groupName;
+
+ @ApiModelProperty(value = "仿真能力")
+ @TableField("bCapacity")
+ private String bCapacity;
+
+ @ApiModelProperty(value = "任务流程模板")
+ @TableField("flowTemplate")
+ private String flowTemplate;
+
+ @TableField("englishName")
+ private String englishName;
+
+ @ApiModelProperty(value = "关联的需求id")
+ @TableField("demand_id")
+ private String demandId;
+
+ @TableField("tag1")
+ private String tag1;
+
+ @TableField("tag2")
+ private String tag2;
+
+ @TableField("tag3")
+ private String tag3;
+
+ @TableField("tag4")
+ private String tag4;
+
+ @TableField("tag5")
+ private String tag5;
+
+ @TableField("tag6")
+ private String tag6;
+
+ @TableField("tag7")
+ private String tag7;
+
+ @TableField("tag8")
+ private String tag8;
+
+ @TableField("tag9")
+ private String tag9;
+
+ @TableField("tag10")
+ private String tag10;
+
+ @TableField("cidFlowId")
+ private String cidFlowId;
+
+
+}
+
+
+
+package com.sdm.project.model.entity;
+
+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;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("simulation_task_attention")
+@ApiModel(value="SimulationTaskAttention", description="")
+public class SimulationTaskAttention implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "主键ID")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty(value = "任务ID")
+ @TableField("task_id")
+ private String taskId;
+
+ @ApiModelProperty(value = "身份标识")
+ @TableField("identity")
+ private String identity;
+
+ @ApiModelProperty(value = "名称")
+ @TableField("name")
+ private String name;
+
+ @ApiModelProperty(value = "用户ID")
+ @TableField("user_id")
+ private Long userId;
+
+ @ApiModelProperty(value = "创建人")
+ @TableField("creator")
+ private String creator;
+
+ @ApiModelProperty(value = "创建时间")
+ @TableField("create_time")
+ private String createTime;
+
+ @ApiModelProperty(value = "更新人")
+ @TableField("updater")
+ private String updater;
+
+ @ApiModelProperty(value = "更新时间")
+ @TableField("update_time")
+ private String updateTime;
+
+}
+
+
+
+package com.sdm.project.model.entity;
+
+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 lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ *
+ * @author author
+ * @since 2025-09-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("simulation_task_extra")
+@ApiModel(value="SimulationTaskExtra对象", description="")
+public class SimulationTaskExtra implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @TableField("task_id")
+ private String taskId;
+
+ @TableField("property_name")
+ private String propertyName;
+
+ @TableField("property_value")
+ private String propertyValue;
+
+ @TableField("value_type")
+ private String valueType;
+
+ @TableField("property_class")
+ private String propertyClass;
+
+
+}
+
+
+
+package com.sdm.project.model.entity;
+
+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;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("simulation_task_member")
+@ApiModel(value="SimulationTaskMember", description="")
+public class SimulationTaskMember implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "主键ID")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty(value = "任务ID")
+ @TableField("task_id")
+ private String taskId;
+
+ @ApiModelProperty(value = "身份标识")
+ @TableField("identity")
+ private String identity;
+
+ @ApiModelProperty(value = "名称")
+ @TableField("name")
+ private String name;
+
+ @ApiModelProperty(value = "用户ID")
+ @TableField("user_id")
+ private Long userId;
+
+ @ApiModelProperty(value = "创建人")
+ @TableField("creator")
+ private Long creator;
+
+ @ApiModelProperty(value = "创建时间")
+ @TableField("create_time")
+ private String createTime;
+
+ @ApiModelProperty(value = "更新人")
+ @TableField("updater")
+ private Long updater;
+
+ @ApiModelProperty(value = "更新时间")
+ @TableField("update_time")
+ private String updateTime;
+
+ @ApiModelProperty(value = "类型:0-仿真负责人 1-仿真执行人")
+ @TableField("type")
+ private Integer type;
+
+}
+
+
+
+package com.sdm.project.model.po;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class NodeAllBase extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ private String pUuid;
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ /**
+ * 节点名称
+ */
+ private String nodeName;
+
+
+ /**
+ * 节点编码
+ */
+ private String nodeCode;
+
+
+ /**
+ * 节点类型
+ */
+ private String nodeType;
+
+ /**
+ * 项目类型
+ */
+ private String nodeSubType;
+
+ /**
+ * 父节点id
+ */
+ private String parentId;
+
+
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private Integer progress;
+
+ private String progressStatusValue;
+
+ /**
+ * 项目达成状态(红黄绿灯)
+ */
+ private Integer achieveStatus;
+
+ private String achieveStatusValue;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 项目经理
+ */
+ private String managers;
+
+ /**
+ * 拓展属性集合
+ */
+ private List extraList;
+
+ /**
+ * 项目详情图片
+ */
+ private String detailImgUrl;
+
+ /**
+ * 备注
+ */
+ private String description;
+
+
+ /**
+ * 任务名称
+ */
+ private String taskName;
+
+
+ /**
+ * 任务编码
+ */
+ private String taskCode;
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private String exeStatus;
+
+ private String exeStatusValue;
+
+ /**
+ * 仿真负责人
+ */
+ private String sManager;
+
+ private String nodeId;
+
+
+ /**
+ * 标准工时
+ */
+ private Integer days;
+
+ /**
+ * 实际工时
+ */
+ private Integer realDays;
+
+ /**
+ * 难度系数
+ */
+ private Float difficult;
+
+ /**
+ * 执行规范
+ */
+// private String detailImgUrl;
+
+ /**
+ * 审批状态
+ */
+ private String approvalStatus;
+
+ /**
+ * 确认状态
+ */
+ private String confirmStatus;
+
+ /**
+ * 指标名称
+ */
+ private String performanceName;
+
+ /**
+ * 达标方式
+ */
+ private String method;
+
+ /**
+ * 目标值
+ */
+ private String targetValue;
+
+ /**
+ * 单位
+ */
+ private String unit;
+
+ public List children = new ArrayList<>(); //适配前端组件
+
+ public int nodeOrder;
+
+ public String nodeVersion;
+
+ public Long tenantId;
+
+ public String members;
+
+ public String extras;
+
+ @JsonProperty(value = "tag1")
+ private String tag1;
+ @JsonProperty(value = "tag2")
+ private String tag2;
+ @JsonProperty(value = "tag3")
+ private String tag3;
+ @JsonProperty(value = "tag4")
+ private String tag4;
+ @JsonProperty(value = "tag5")
+ private String tag5;
+ @JsonProperty(value = "tag6")
+ private String tag6;
+ @JsonProperty(value = "tag7")
+ private String tag7;
+ @JsonProperty(value = "tag8")
+ private String tag8;
+ @JsonProperty(value = "tag9")
+ private String tag9;
+ @JsonProperty(value = "tag10")
+ private String tag10;
+
+}
+
+
+
+package com.sdm.project.model.po;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@Data
+public class PerformanceNodeExtraPo extends BaseEntity {
+
+ /**
+ * 所属节点id
+ */
+ private String nodeId;
+
+ private String performanceId;
+
+ private String taskId;
+
+ private String uuid;
+
+ /**
+ * 属性名
+ */
+ private String propertyName;
+
+ /**
+ * 属性值
+ */
+ private String propertyValue;
+
+ /**
+ * 值类型
+ */
+ private String valueType;
+
+ /**
+ * 属性
+ */
+ private String propertyClass;
+
+
+
+
+}
+
+
+
+package com.sdm.project.model.po;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PerformanceNodePo extends NodeAllBase {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ private String pUuid;
+
+ private String nodeId;
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ private String taskId;
+
+ private String taskName;
+
+
+ /**
+ * 指标名称
+ */
+ private String performanceName;
+
+ private String performanceType;
+ private String standard;
+ private String highValue;
+ private String lowValue;
+ private String englishName;
+ private String description;
+
+
+ private String nodeName;
+
+ /**
+ * 达标方式
+ */
+ private String method;
+
+ private String completeStatus;
+
+ /**
+ * 目标值
+ */
+ private String targetValue;
+
+ /**
+ * 单位
+ */
+ private String unit;
+
+
+ /**
+ * 拓展属性集合
+ */
+ public String extras;
+
+// public void addNodeExtra(PerformanceNodeExtraPo nodeExtra)
+// {
+// extras.add(nodeExtra);
+// }
+
+ private String folderId;
+
+ private String projectName;
+
+ private String phaseName;
+
+ private String disciplineName;
+
+ /**
+ * 仿真负责人
+ */
+ @JsonProperty(value = "pMemberList")
+ private String pMemberList = "";
+ @JsonProperty(value = "eMemberList")
+ private String eMemberList = "";
+ private String exeStatus = "";
+ private Integer achieveStatus = 0;
+ private String beginTime = "";
+ private String endTime = "";
+ private String flowTemplate = "";
+ private String analyseTarget = "";
+ private String confidence = "";
+ private Float difficult = 0F;
+ private Integer days = 0;;
+ private String analyseSoftware = "";
+ private String imageFileId = "";
+ @JsonProperty(value = "bCapacity")
+ private String bCapacity = "";
+ private String department = "";
+ private String section = "";
+ private String group = "";
+
+}
+
+
+
+package com.sdm.project.model.po;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ProjectNodeDetailPo extends BaseEntity {
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ /**
+ * 节点名称
+ */
+ private String nodeName;
+
+
+ /**
+ * 节点编码
+ */
+ private String nodeCode;
+
+
+ /**
+ * 节点类型
+ */
+ private String nodeType;
+
+ /**
+ * 项目类型
+ */
+ private String nodeSubType;
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private Integer progress;
+
+ private String progressStatusValue;
+
+ /**
+ * 项目达成状态(红黄绿灯)
+ */
+ private Integer achieveStatus;
+
+ private String achieveStatusValue;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 项目经理
+ */
+ private String managers;
+
+ /**
+ * 拓展属性集合
+ */
+ private List extraList;
+
+ /**
+ * 项目详情图片
+ */
+ private String detailImgUrl;
+
+ /**
+ * 备注
+ */
+ private String description;
+
+ /**
+ * 团队成员
+ */
+ List memberList;
+
+
+}
+
+
+
+package com.sdm.project.model.po;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@Data
+public class ProjectNodeExtraPo extends BaseEntity {
+
+ /**
+ * 所属节点id
+ */
+ private String nodeId;
+
+ private String uuid;
+
+ /**
+ * 属性名
+ */
+ private String propertyName;
+
+ /**
+ * 属性值
+ */
+ private String propertyValue;
+
+ /**
+ * 值类型
+ */
+ private String valueType;
+
+ /**
+ * 属性
+ */
+ private String propertyClass;
+
+
+ private String taskId;
+
+}
+
+
+
+package com.sdm.project.model.po;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@Data
+public class ProjectNodeMemberPo extends BaseEntity {
+
+ /**
+ * 用户名
+ */
+ private String userName;
+
+ /**
+ * 工号
+ */
+ private String jobNumber;
+
+ /**
+ * 用户角色
+ */
+ private String userRole;
+
+ /**
+ * 部门
+ */
+ private String department;
+
+ /**
+ * 手机号
+ */
+ private String phone;
+
+ /**
+ * 邮箱
+ */
+ private String email;
+
+ private String nodeId;
+
+ private String uuid;
+
+ private String identity;
+ private String name;
+
+}
+
+
+
+package com.sdm.project.model.po;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.common.entity.resp.system.CIDUserResp;
+import com.sdm.project.model.bo.ProjectNode;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class ProjectNodePo extends NodeAllBase {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ private String pUuid;
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ /**
+ * 节点名称
+ */
+ private String nodeName;
+
+
+ /**
+ * 节点编码
+ */
+ private String nodeCode;
+
+
+ /**
+ * 节点类型
+ */
+ private String nodeType;
+
+ /**
+ * 项目类型
+ */
+ private String nodeSubType;
+
+ /**
+ * 父节点id
+ */
+ private String parentId;
+
+
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private Integer progress;
+
+ private String progressStatusValue;
+
+ /**
+ * 项目达成状态(红黄绿灯)
+ */
+ private Integer achieveStatus;
+
+ private String achieveStatusValue;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 项目经理
+ */
+ private String managers;
+
+ /**
+ * 拓展属性集合
+ */
+ private String extras;
+
+ /**
+ * 项目详情图片
+ */
+ private String detailImgUrl;
+
+ /**
+ * 备注
+ */
+ private String description;
+
+ public List children = new ArrayList<>();
+
+// public void addNodeExtra(ProjectNodeExtraPo nodeExtra)
+// {
+// extras.add(nodeExtra);
+// }
+
+ public int nodeOrder;
+
+
+ public String nodeVersion;
+
+ public String members;
+
+ /**
+ * 仿真负责人
+ */
+ @JsonProperty(value = "pMemberList")
+ private List pMemberList;
+
+ private String pMembers;
+
+ /**
+ * 仿真执行人
+ */
+ @JsonProperty(value = "eMemberList")
+ private List eMemberList;
+
+ private String eMembers;
+
+ /**
+ * 拓展属性集合
+ */
+ private List extraList;
+
+ private String folderId;
+
+ @JsonProperty(value = "tag1")
+ private String tag1;
+ @JsonProperty(value = "tag2")
+ private String tag2;
+ @JsonProperty(value = "tag3")
+ private String tag3;
+ @JsonProperty(value = "tag4")
+ private String tag4;
+ @JsonProperty(value = "tag5")
+ private String tag5;
+ @JsonProperty(value = "tag6")
+ private String tag6;
+ @JsonProperty(value = "tag7")
+ private String tag7;
+ @JsonProperty(value = "tag8")
+ private String tag8;
+ @JsonProperty(value = "tag9")
+ private String tag9;
+ @JsonProperty(value = "tag10")
+ private String tag10;
+
+ private Long imageFileId;
+ private String englishName;
+}
+
+
+
+package com.sdm.project.model.po;
+
+import lombok.Data;
+
+@Data
+public class RunNodePo extends NodeAllBase {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ private String pUuid;
+
+ private String nodeId;
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ /**
+ * 算例名称
+ */
+ private String runName;
+
+ /**
+ * 算例类型
+ */
+ private Integer type;
+
+ /**
+ * 算例关联的任务id
+ */
+ private String taskId;
+
+ /**
+ * 流程模板名称
+ */
+ private String flowTemplate;
+
+ /**
+ * Run状态 0:未执行 1:执行中 2:完成 3:失败
+ */
+ private Integer status;
+
+ /**
+ * run描述信息
+ */
+ private String description;
+
+ /**
+ * Run总共的流程步骤
+ */
+ private Integer totalStep;
+
+ /**
+ * 当前的步骤
+ */
+ private Integer currentStep;
+
+
+ /**
+ * Run执行结果 0:gray 1:red 2:yellow 3:green
+ */
+ private Integer result;
+
+ /**
+ * Run对应在文件系统中的路径
+ */
+ private String folderId;
+
+ /**
+ * 父算例ID
+ */
+ private String parentId;
+
+ private Integer isPersonalTemplate;
+
+ private Long tenantId;
+
+ /**
+ * 拓展属性集合
+ */
+ public String extras;
+
+
+ /**
+ * 仿真负责人
+ */
+ private String pMembers;
+
+}
+
+
+
+package com.sdm.project.model.po;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@Data
+public class TaskNodeExtraPo extends BaseEntity {
+
+ private String uuid;
+
+ /**
+ * 所属节点id
+ */
+ private String nodeId;
+
+ private String taskId;
+
+ /**
+ * 属性名
+ */
+ private String propertyName;
+
+ /**
+ * 属性值
+ */
+ private String propertyValue;
+
+ /**
+ * 值类型
+ */
+ private String valueType;
+
+ /**
+ * 属性
+ */
+ private String propertyClass;
+
+
+
+
+}
+
+
+
+package com.sdm.project.model.po;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@Data
+public class TaskNodeMemberPo extends BaseEntity {
+
+ /**
+ * 用户名
+ */
+ private String userName;
+
+ /**
+ * 工号
+ */
+ private String jobNumber;
+
+ /**
+ * 用户角色
+ */
+ private String userRole;
+
+ /**
+ * 部门
+ */
+ private String department;
+
+ /**
+ * 手机号
+ */
+ private String phone;
+
+ /**
+ * 邮箱
+ */
+ private String email;
+
+ private String nodeId;
+
+ private String uuid;
+ private String identity;
+ private String name;
+ private String taskId;
+
+
+}
+
+
+
+package com.sdm.project.model.po;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.common.entity.resp.system.CIDUserResp;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class TaskNodePo extends NodeAllBase {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ private String pUuid;
+
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ private String nodeId;
+
+ /**
+ * 任务名称
+ */
+ private String taskName;
+
+
+ /**
+ * 任务编码
+ */
+ private String taskCode;
+
+ private String exeStatusValue;
+
+ /**
+ * 仿真负责人
+ */
+ private String sManager;
+
+
+ /**
+ * 项目进度状态
+ */
+ private Integer progress;
+
+ private String progressStatusValue;
+
+ /**
+ * 项目达成状态(红黄绿灯)
+ */
+ private Integer achieveStatus;
+
+ private String achieveStatusValue;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 标准工时
+ */
+ private Integer days;
+
+ /**
+ * 实际工时
+ */
+ private Integer realDays;
+
+ /**
+ * 难度系数
+ */
+ private Float difficult;
+
+ /**
+ * 执行规范
+ */
+// private String detailImgUrl;
+
+ /**
+ * 审批状态
+ */
+ private String approvalStatus;
+
+ /**
+ * 确认状态
+ */
+ private String confirmStatus;
+
+ /**
+ * 拓展属性集合
+ */
+ private String extras;
+
+ public List children = new ArrayList<>();
+
+// public void addNodeExtra(TaskNodeExtraPo nodeExtra)
+// {
+// extras.add(nodeExtra);
+// }
+
+ public List performances = new ArrayList<>();
+
+ public String projectNodeName;
+
+ public String nodeVersion;
+
+ public String members;
+
+ /**
+ * 仿真负责人
+ */
+ @JsonProperty(value = "pMemberList")
+ private List pMemberList;
+
+ private String pMembers;
+
+ /**
+ * 仿真执行人
+ */
+ @JsonProperty(value = "eMemberList")
+ private List eMemberList;
+
+ private String eMembers;
+
+ /**
+ * 拓展属性集合
+ */
+ private List extraList;
+
+ private String folderId;
+
+ private String standard;
+ private String analyseTarget;
+ private String confidence;
+ private String analyseSoftware;
+ private String department;
+ private String section;
+ private String sectionName;
+ private String group;
+ private String groupName;
+ @JsonProperty("bCapacity")
+ private String bCapacity;
+ private String flowTemplate;
+ private String englishName;
+ private String description;
+
+ @JsonProperty(value = "tag1")
+ private String tag1;
+ @JsonProperty(value = "tag2")
+ private String tag2;
+ @JsonProperty(value = "tag3")
+ private String tag3;
+ @JsonProperty(value = "tag4")
+ private String tag4;
+ @JsonProperty(value = "tag5")
+ private String tag5;
+ @JsonProperty(value = "tag6")
+ private String tag6;
+ @JsonProperty(value = "tag7")
+ private String tag7;
+ @JsonProperty(value = "tag8")
+ private String tag8;
+ @JsonProperty(value = "tag9")
+ private String tag9;
+ @JsonProperty(value = "tag10")
+ private String tag10;
+
+ private Long imageFileId;
+
+}
+
+
+
+package com.sdm.project.model.po;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class TaskRunPo extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ private String pUuid;
+
+ private String nodeId;
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ private String taskId;
+
+ private String taskName;
+
+
+ /**
+ * 指标名称
+ */
+ private String runName;
+
+ private String type;
+ private String standard;
+ private String highValue;
+ private String lowValue;
+ private String englishName;
+ private String description;
+
+
+ private String nodeName;
+
+ /**
+ * 达标方式
+ */
+ private String method;
+
+ /**
+ * 目标值
+ */
+ private String targetValue;
+
+ /**
+ * 单位
+ */
+ private String unit;
+
+
+ /**
+ * 拓展属性集合
+ */
+ public List extras;
+
+ public void addNodeExtra(PerformanceNodeExtraPo nodeExtra)
+ {
+ extras.add(nodeExtra);
+ }
+
+ private String folderId;
+
+ private String projectName;
+
+ private String phaseName;
+
+ private String disciplineName;
+
+ /**
+ * 仿真负责人
+ */
+ private String pMembers;
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.sdm.common.entity.pojo.project.ProjectNodeBase;
+import com.sdm.common.entity.pojo.project.ProjectNodeExpand;
+import com.sdm.common.entity.pojo.project.ProjectNodeMemberRelate;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AddProjectNodeBatchReq {
+ @NotNull(message = "projectId不能为空")
+ private Long projectId;
+
+ @NotEmpty(message = "projectNodeBases不能为空")
+ private List bases;
+
+ @NotEmpty(message = "relates不能为空")
+ private List relates;
+
+ private List expands;
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.sdm.common.entity.bo.UserInfo;
+import com.sdm.common.entity.pojo.project.ProjectBase;
+import com.sdm.common.entity.pojo.project.ProjectExpand;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AddProjectReq {
+ @NotNull(message = "projectBase不能为空")
+ private ProjectBase projectBase;
+ @NotEmpty(message = "userInfos不能为空")
+ private List userInfos;
+ private List expands;
+}
+
+
+
+package com.sdm.project.model.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * 任务/指标 完成情况统计请求参数(工位、学科)
+ */
+@Data
+@Schema(description = "任务/指标 完成情况统计请求参数(工位、学科)")
+public class CommonGetCompleteStatisticsReq {
+ @Schema(description = "查询统计类型 task/performance")
+ @NotNull
+ private String queryType;
+
+ @Schema(description = "数据返回Tag类型: tag1、tag2,tag3,tag4,tag5,tag6,tag7,tag8,tag9,tag10")
+ @NotNull
+ private String resultTagType;
+
+ @Schema(description = "标签1")
+ private String tag1;
+
+ @Schema(description = "标签2")
+ private String tag2;
+
+ @Schema(description = "标签3")
+ private String tag3;
+
+ @Schema(description = "标签4")
+ private String tag4;
+
+ @Schema(description = "标签5")
+ private String tag5;
+
+ @Schema(description = "标签6")
+ private String tag6;
+
+ @Schema(description = "标签7")
+ private String tag7;
+
+ @Schema(description = "标签8")
+ private String tag8;
+
+ @Schema(description = "标签9")
+ private String tag9;
+
+ @Schema(description = "标签10")
+ private String tag10;
+}
+
+
+
+package com.sdm.project.model.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class DeliverableApproveReq {
+
+ @Schema(description = "任务uuid")
+ private String taskId;
+
+ @Schema(description = "难度系数")
+ private Float difficult;
+
+ @Schema(description = "交付物审批模板id")
+ private String templateId;
+
+ @Schema(description = "交付物审批模板名称")
+ private String templateName;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class DelProjectNodeReq {
+ @NotBlank(message = "projectName不能为空")
+ private String projectName;
+ @NotNull(message = "nodeId不能为空")
+ private Long nodeId;
+}
+
+
+
+package com.sdm.project.model.req;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+@Data
+public class DelProjectReq {
+ @NotBlank(message = "projectName不能为空")
+ private String projectName;
+}
+
+
+
+package com.sdm.project.model.req;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class GetNodeDetailReq {
+
+ @NotNull(message = "relatedResourceUuid不能为空")
+ private String relatedResourceUuid;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class GetProjectDetailReq {
+
+ @NotNull(message = "projectNodeId不能为空")
+ private String projectNodeId;
+
+ @NotNull(message = "phaseNodeId不能为空")
+ private String phaseNodeId;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class GetProjectListReq {
+
+ @NotNull(message = "current不能为空")
+ private Integer current;
+
+ @NotNull(message = "size不能为空")
+ private Integer size;
+
+ private String projectNodeId;
+
+ private String phaseNodeId;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author xuyundi
+ * @Date 2024/3/5
+ * @Note
+ */
+@Data
+public class GetRunVersionReq {
+ /**
+ * 算例uuid
+ */
+ @Schema(description = "算例uuid")
+ private String runId;
+ /**
+ * 任务uuid
+ */
+ @Schema(description = "任务uuid")
+ private String taskId;
+}
+
+
+
+package com.sdm.project.model.req;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class GetTaskDetailReq {
+
+ @NotNull(message = "relatedResourceUuid不能为空")
+ private String relatedResourceUuid;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 用户组任务完成情况统计请求参数
+ */
+@Data
+@Schema(description = "用户组任务完成情况统计请求参数")
+public class GetUserGroupTaskCompleteStatisticsReq {
+ @Schema(description = "用户组ID")
+ @NotNull(message = "用户组ID不能为空")
+ private Long userGroupId;
+
+ @Schema(description = "用户ID")
+ private Long userId;
+
+ @Schema(description = "用户")
+ private Set userIds;
+
+ @Schema(description = "标签1")
+ private String tag1;
+
+ @Schema(description = "标签2")
+ private String tag2;
+
+ @Schema(description = "标签3")
+ private String tag3;
+
+ @Schema(description = "标签4")
+ private String tag4;
+
+ @Schema(description = "标签5")
+ private String tag5;
+
+ @Schema(description = "标签6")
+ private String tag6;
+
+ @Schema(description = "标签7")
+ private String tag7;
+
+ @Schema(description = "标签8")
+ private String tag8;
+
+ @Schema(description = "标签9")
+ private String tag9;
+
+ @Schema(description = "标签10")
+ private String tag10;
+}
+
+
+
+package com.sdm.project.model.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class GetWorkstationApproveStatusReq {
+ @Schema(description = "数据返回Tag类型: tag1、tag2,tag3,tag4,tag5,tag6,tag7,tag8,tag9,tag10")
+ @NotNull
+ private String resultTagType;
+
+ @Schema(description = "标签1")
+ private String tag1;
+
+ @Schema(description = "标签2")
+ private String tag2;
+
+ @Schema(description = "标签3")
+ private String tag3;
+
+ @Schema(description = "标签4")
+ private String tag4;
+
+ @Schema(description = "标签5")
+ private String tag5;
+
+ @Schema(description = "标签6")
+ private String tag6;
+
+ @Schema(description = "标签7")
+ private String tag7;
+
+ @Schema(description = "标签8")
+ private String tag8;
+
+ @Schema(description = "标签9")
+ private String tag9;
+
+ @Schema(description = "标签10")
+ private String tag10;
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.sdm.common.entity.BaseReq;
+import com.sdm.common.entity.enums.FileBizTypeEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+@Data
+public class KeyResultReq extends BaseReq {
+ private Long id;
+
+ private String uuid;
+
+ @Schema(description = "算例uuid")
+ private String runId;
+
+ @Schema(description = "关键性能结果类型 1-图片/动画 2-曲线 3-报告 4-数值")
+ private Integer keyResultType;
+
+ @Schema(description = "结果名称")
+ private String name;
+
+ @Schema(description = "文件id")
+ private Long fileId;
+
+ @Schema(description = "物理量")
+ private String quantityType;
+
+ @Schema(description = "结果单位")
+ private String units;
+
+ @Schema(description = "最大数值")
+ private String max;
+
+ @Schema(description = "最小数值")
+ private String min;
+
+ @Schema(description = "数值")
+ private String value;
+
+ @Schema(description = "描述信息")
+ private String description;
+
+ @Schema(description = "x轴物理量(曲线结果使用)")
+ private String xQuantityType;
+
+ @Schema(description = "x轴结果单位(曲线结果使用)")
+ private String xUnits;
+
+ @Schema(description = "y轴物理量(曲线结果使用)")
+ private String yQuantityType;
+
+ @Schema(description = "y轴结果单位(曲线结果使用)")
+ private String yUnits;
+
+
+ @Schema(description = "上传文件所在父目录id")
+ private Long dirId;
+
+ @Schema(description = "文件名")
+ private String fileName;
+
+ @Schema(description = "文件大小")
+ private Long fileSize;
+
+ @Schema(description = "文件类型",implementation = FileBizTypeEnum.class)
+ private Integer fileType;
+
+ @Schema(description = "文件")
+ private MultipartFile file;
+
+ @Schema(description = "是否仅曲线上传文件")
+ private boolean onlyFile = false;
+
+ /**
+ * -------------------------------------------------上传交付物使用参数------------------------------------------------
+ */
+ @Schema(description = "上传交付物使用,批量文件属性信息")
+ private List keyResultList;
+
+ @Schema(description = "用户勾选的所有的文件的原始名称,前端限制不能选择相同名称的文件,后端逻辑判断对应dirId下不能和历史文件名相同")
+ private List sourceFiles;
+
+ @Schema(description = "审批模板id")
+ private String templateId;
+
+ @Schema(description = "审批模板名称")
+ private String templateName;
+
+ @Schema(description = "本次新增数据的任务id,毫秒值时间戳")
+ private String uploadTaskId;
+
+ @Schema(description = "所属任务uuid")
+ private String taskId;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * 指标 完成情况统计请求参数(工位、学科)
+ */
+@Data
+@Schema(description = "按工位、学科的仿真指标达成统计")
+public class PerformanceCompleteStatisticsReq {
+
+ @Schema(description = "数据返回Tag类型: tag1、tag2,tag3,tag4,tag5,tag6,tag7,tag8,tag9,tag10")
+ @NotNull
+ private String resultTagType;
+
+ @Schema(description = "标签1")
+ private String tag1;
+
+ @Schema(description = "标签2")
+ private String tag2;
+
+ @Schema(description = "标签3")
+ private String tag3;
+
+ @Schema(description = "标签4")
+ private String tag4;
+
+ @Schema(description = "标签5")
+ private String tag5;
+
+ @Schema(description = "标签6")
+ private String tag6;
+
+ @Schema(description = "标签7")
+ private String tag7;
+
+ @Schema(description = "标签8")
+ private String tag8;
+
+ @Schema(description = "标签9")
+ private String tag9;
+
+ @Schema(description = "标签10")
+ private String tag10;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class PerformanceInfoReq implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private String value;
+
+ private String englishName;
+
+ private String highValue;
+
+ private String performanceName;
+
+ private String method;
+
+ private String unit;
+
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class ProjectNodeListReq {
+
+ /**
+ * 节点类型
+ */
+ private String projectNodeId;
+
+ /**
+ * 阶段节点id
+ */
+ private String phaseNodeId;
+
+ private String taskName;
+
+ private Integer taskStatus;
+
+ private Integer achieveStatus;
+
+ /**
+ * 所有、我发起的、我确认的、我执行的、我关注的(0、1、2、3、4)
+ */
+ @NotNull(message = "任务类型不能为空!")
+ private Integer taskType;
+
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class ProjectTreeReq {
+
+ @JsonProperty(value = "tag1")
+ private String tag1;
+ @JsonProperty(value = "tag2")
+ private String tag2;
+ @JsonProperty(value = "tag3")
+ private String tag3;
+ @JsonProperty(value = "tag4")
+ private String tag4;
+ @JsonProperty(value = "tag5")
+ private String tag5;
+ @JsonProperty(value = "tag6")
+ private String tag6;
+ @JsonProperty(value = "tag7")
+ private String tag7;
+ @JsonProperty(value = "tag8")
+ private String tag8;
+ @JsonProperty(value = "tag9")
+ private String tag9;
+ @JsonProperty(value = "tag10")
+ private String tag10;
+
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.sdm.project.model.bo.TaskNodeTag;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class ProjectTreeTagReq {
+
+ private List idMap;
+
+ private List tagMap;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class SpdmAddDemandReq extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ /**
+ * 需求的唯一标识
+ */
+ private String uuid;
+
+ /**
+ * 需求名称
+ */
+ @NotNull(message = "需求名称不能为空")
+ private String demandName;
+
+ /**
+ * 需求编码
+ */
+ private String demandCode;
+
+ /**
+ * 需求类型
+ */
+ private String demandType;
+
+ /**
+ * 仿真类型
+ */
+ private String simType;
+
+ /**
+ * 需求状态:未分配、未开始、进行中、暂停、已关闭、已闭环、已驳回
+ */
+ private String demandStatus;
+
+
+ /**
+ * 达成状态
+ */
+ private String achieveStatus;
+
+ /**
+ * 进度
+ */
+ private Integer progress;
+
+ /**
+ * 审批状态
+ */
+ private String approvalStatus;
+
+ /**
+ * 计划开始时间(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束时间(精确到秒)
+ */
+ private String endTime;
+
+ /**
+ * 实际结束时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 仿真负责人
+ */
+ @JsonProperty(value = "pMemberList")
+ private String pMemberList;
+
+ /**
+ * 仿真执行人
+ */
+ @JsonProperty(value = "eMemberList")
+ private String eMemberList;
+
+ /**
+ * 预留拓展属性
+ */
+ private List extras;
+
+ /**
+ * 项目id
+ */
+ private String projectId;
+
+ /**
+ * 阶段id
+ */
+ private String phaseId;
+
+ /**
+ * 学科id
+ */
+ private String nodeId;
+
+ /**
+ * 3D负责人
+ */
+ @JsonProperty(value = "tMemberList")
+ private String tMemberList;
+
+ /**
+ * 关注人
+ */
+ @JsonProperty(value = "aMemberList")
+ private String aMemberList;
+
+
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.sdm.project.model.bo.TaskNodeTag;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmAddNodeReq {
+
+ @NotNull(message = "addNodeList不能为空")
+ List addNodeList;
+
+ @NotNull(message = "tagMap不能为空")
+ List tagMap;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class SpdmAddTaskRunReq {
+
+ @NotBlank(message = "runName不能为空")
+ @Schema(description = "算例名称")
+ private String runName;
+
+ @Schema(description = "备注")
+ private String description;
+
+ @NotBlank(message = "flowTemplate不能为空")
+ @Schema(description = "流程模板id")
+ private String flowTemplate;
+
+// @NotNull(message = "totalStep不能为空")
+ @Schema(description = "总步骤")
+ private Integer totalStep;
+
+ @NotNull(message = "taskId不能为空")
+ @Schema(description = "任务uuid")
+ private String taskId;
+
+ @Schema(description = "父算例uuid")
+ private String parentId;
+
+ private String isPersonalTemplate;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class SpdmAnalysisPerformanceListReq extends BaseEntity {
+
+ @NotNull(message = "current不能为空")
+ private Integer current;
+
+ @NotNull(message = "size不能为空")
+ private Integer size;
+
+ @Schema( description = "项目节点id")
+ private String projectNodeId;
+
+ @Schema( description = "阶段节点id")
+ private String phaseNodeId;
+
+ @Schema( description = "专业节点id")
+ private String disciplineNodeId;
+
+ @Schema( description = "指标名称")
+ private String performanceName;
+
+ @Schema( description = "开始时间")
+ private String beginTime;
+
+ @Schema( description = "结束时间")
+ private String endTime;
+
+ @Schema( description = "名称(兼容数据总览使用)")
+ private String name;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class SpdmAnalysisRunListReq extends BaseEntity {
+
+ @NotNull(message = "current不能为空")
+ private Integer current;
+
+ @NotNull(message = "size不能为空")
+ private Integer size;
+
+ @Schema( description = "项目节点id")
+ private String projectNodeId;
+
+ @Schema( description = "阶段节点id")
+ private String phaseNodeId;
+
+ @Schema( description = "专业节点id")
+ private String disciplineNodeId;
+
+ @Schema( description = "算例名称")
+ private String runName;
+
+ @Schema( description = "开始时间")
+ private String beginTime;
+
+ @Schema( description = "结束时间")
+ private String endTime;
+
+ @Schema( description = "名称(兼容数据总览使用)")
+ private String name;
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class SpdmAnalysisTaskListReq extends BaseEntity {
+
+ @NotNull(message = "current不能为空")
+ private Integer current;
+
+ @NotNull(message = "size不能为空")
+ private Integer size;
+
+ @Schema( description = "项目节点id")
+ private String projectNodeId;
+
+ @Schema( description = "阶段节点id")
+ private String phaseNodeId;
+
+ @Schema( description = "专业节点id")
+ private String disciplineNodeId;
+
+ @Schema(description = "标签1")
+ private String tag1;
+
+ @Schema(description = "标签2")
+ private String tag2;
+
+ @Schema(description = "标签3")
+ private String tag3;
+
+ @Schema(description = "标签4")
+ private String tag4;
+
+ @Schema(description = "标签5")
+ private String tag5;
+
+ @Schema(description = "标签6")
+ private String tag6;
+
+ @Schema(description = "标签7")
+ private String tag7;
+
+ @Schema(description = "标签8")
+ private String tag8;
+
+ @Schema(description = "标签9")
+ private String tag9;
+
+ @Schema(description = "标签10")
+ private String tag10;
+
+ @Schema( description = "任务名称")
+ private String taskName;
+
+ @Schema( description = "开始时间")
+ private String beginTime;
+
+ @Schema( description = "结束时间")
+ private String endTime;
+
+ @Schema( description = "名称(兼容数据总览使用)")
+ private String name;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmDeleteDemandReq {
+
+ @NotNull(message = "删除需求的id不能为空")
+ List deleteNodeIdList;
+
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmDeleteNodeReq {
+
+ List deleteNodeIdList;
+
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import lombok.Data;
+
+@Data
+public class SpdmDeleteProjectDetailReq {
+
+ String nodeType;
+
+ String uuid;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmDeleteProjectReq {
+
+ List deleteNodeList;
+
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@Data
+public class SpdmDemandExtraReq extends BaseEntity {
+
+ /**
+ * 关联的需求id
+ */
+ private String demandId;
+
+ /**
+ * 所属节点id
+ */
+ private String nodeId;
+
+ /**
+ * 属性名
+ */
+ private String propertyName;
+
+ /**
+ * 属性值
+ */
+ private String propertyValue;
+
+ /**
+ * 值类型
+ */
+ private String valueType;
+
+ /**
+ * 属性
+ */
+ private String propertyClass;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class SpdmDemandListReq {
+
+ @NotNull(message = "current不能为空")
+ private Integer current;
+
+ @NotNull(message = "size不能为空")
+ private Integer size;
+
+ /**
+ * 需求类型,0:我发起的 1:我确认的
+ */
+ @NotNull(message = "type不能为空")
+ private Integer type;
+
+ /**
+ * 需求名称
+ */
+ private String demandName;
+
+ /**
+ * 需求类型
+ */
+ private String demandType;
+
+ /**
+ * 仿真类型
+ */
+ private String simType;
+
+ /**
+ * 需求状态
+ */
+ private String demandStatus;
+
+ /**
+ * 达成情况
+ */
+ private String achieveStatus;
+
+ private String projectId;
+
+ private String phaseId;
+
+ private String disciplineName;
+
+ /**
+ * 排序顺序 按创建时间 0-先序/1-倒序排序
+ */
+ private Integer sortOrder;
+
+
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@Data
+public class SpdmDemandRelateMemberReq extends BaseEntity {
+
+ /**
+ * 关联的需求id
+ */
+ private String demandId;
+
+ /**
+ * 成员类型,0:仿真负责人 1:仿真执行人
+ */
+ private Integer type;
+
+ /**
+ * 工号
+ */
+ private String identity;
+
+ /**
+ * 用户名
+ */
+ private String name;
+
+ private Long userId;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmEditDemandReq extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ /**
+ * 需求的唯一标识
+ */
+ private String uuid;
+
+ /**
+ * 需求名称
+ */
+ private String demandName;
+
+ /**
+ * 需求编码
+ */
+ private String demandCode;
+
+ /**
+ * 需求类型
+ */
+ private String demandType;
+
+ /**
+ * 仿真类型
+ */
+ private String simType;
+
+ /**
+ * 需求状态:未分配、未开始、进行中、暂停、已关闭、已闭环、已驳回
+ */
+ private String demandStatus;
+
+
+ /**
+ * 达成状态
+ */
+ private String achieveStatus;
+
+ /**
+ * 进度
+ */
+ private Integer progress;
+
+ /**
+ * 审批状态
+ */
+ private String approvalStatus;
+
+ /**
+ * 计划开始时间(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束时间(精确到秒)
+ */
+ private String endTime;
+
+ /**
+ * 实际结束时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 仿真负责人
+ */
+ @JsonProperty(value = "pMemberList")
+ private String pMemberList;
+
+ /**
+ * 仿真执行人
+ */
+ @JsonProperty(value = "eMemberList")
+ private String eMemberList;
+
+ /**
+ * 预留拓展属性
+ */
+ private List extras;
+
+ /**
+ * 项目id
+ */
+ private String projectId;
+
+ /**
+ * 阶段id
+ */
+ private String phaseId;
+
+ /**
+ * 学科id
+ */
+ private String nodeId;
+
+ /**
+ * 3D负责人
+ */
+ @JsonProperty(value = "tMemberList")
+ private String tMemberList;
+
+ /**
+ * 关注人
+ */
+ @JsonProperty(value = "aMemberList")
+ private String aMemberList;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmEditNodeForDataReq {
+
+ /**
+ * simulation_node关联的节点id
+ */
+ @NotBlank(message = "relatedResourceUuid不能为空")
+ private String relatedResourceUuid;
+
+ /**
+ * 节点名称
+ */
+ private String nodeName;
+
+ /**
+ * 节点编码
+ */
+ private String nodeCode;
+
+ /**
+ * 节点的英文名称
+ */
+ private String englishName;
+
+ /**
+ * 预留拓展属性
+ */
+ private List extraList;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmEditNodeReq {
+
+
+ List editNodeList;
+
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmEditTaskForDataReq {
+
+ /**
+ * simulation_node关联的节点id
+ */
+ @NotBlank(message = "relatedResourceUuid不能为空")
+ private String relatedResourceUuid;
+
+ private String uuid;
+
+ private String taskName;
+
+
+ private String taskCode;
+
+ private String taskPoolName;
+
+ private String taskPoolVersion;
+
+ private String nodeId;
+
+ private Integer days;
+
+ private Integer realDays;
+
+ private String standard;
+
+ private String foldId;
+
+ private Integer status;
+
+ private String achieveStatus;
+
+ private String beginTime;
+
+ private String endTime;
+
+ private String finishTime;
+
+ private Integer progress;
+
+ private String exeStatus;
+
+ private String confidence;
+
+ private String analyseTarget;
+
+ private String analyseSoftware;
+
+ private String approvalStatus;
+
+ private String comfirmStatus;
+
+ private String description;
+
+ private Float difficult;
+
+ private String tenantId;
+
+ private Integer pid;
+
+ private Long creator;
+
+ private String createTime;
+
+ private Long updater;
+
+
+ private String updateTime;
+
+
+ private String department;
+
+
+ private String sectionName;
+
+
+ private String groupName;
+
+
+ private String bCapacity;
+
+
+ private String flowTemplate;
+
+ private String englishName;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class SpdmNodeDetailReq extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ /**
+ * 节点名称
+ */
+ private String nodeName;
+
+ /**
+ * 节点编码
+ */
+ private String nodeCode;
+
+ /**
+ * 节点类型
+ */
+ private String nodeType;
+
+ /**
+ * 节点子类型(项目、节点、学科。。。)
+ */
+ private String nodeSubType;
+
+ /**
+ * 节点层级
+ */
+ private Integer nodeLevel;
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private Integer progressStatus;
+
+ /**
+ * 项目达成状态(红黄绿灯)
+ */
+ private Integer achieveStatus;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 项目经理 memberList
+ */
+ private String memberList;
+
+ /**
+ * 项目详情图片
+ */
+ private String detailImgUrl;
+
+ /**
+ * 备注
+ */
+ private String description;
+
+ /**
+ * 预留拓展属性
+ */
+ private List extraList;
+
+ private Long tenantId;
+
+ private String standard;
+ private String analyseTarget;
+ private String confidence;
+ private String analyseSoftware;
+ private String analyseSoftwares;
+ private String department;
+ private String section;
+ private String group;
+ private String bCapacity;
+ private String englishName;
+
+ @JsonProperty(value = "tag1")
+ private String tag1;
+ @JsonProperty(value = "tag2")
+ private String tag2;
+ @JsonProperty(value = "tag3")
+ private String tag3;
+ @JsonProperty(value = "tag4")
+ private String tag4;
+ @JsonProperty(value = "tag5")
+ private String tag5;
+ @JsonProperty(value = "tag6")
+ private String tag6;
+ @JsonProperty(value = "tag7")
+ private String tag7;
+ @JsonProperty(value = "tag8")
+ private String tag8;
+ @JsonProperty(value = "tag9")
+ private String tag9;
+ @JsonProperty(value = "tag10")
+ private String tag10;
+
+ private String exeStatus;
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@Data
+public class SpdmNodeExtraReq extends BaseEntity {
+
+ /**
+ * 所属节点id
+ */
+ private String nodeId;
+
+ /**
+ * 属性名
+ */
+ private String propertyName;
+
+ /**
+ * 属性值
+ */
+ private String propertyValue;
+
+ /**
+ * 值类型
+ */
+ private String valueType;
+
+ /**
+ * 属性
+ */
+ private String propertyClass;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class SpdmNodeParamReq {
+
+ @Schema(description = "节点uuid")
+ private String nodeUuid;
+
+ @Schema(description = "算例uuid")
+ private String runId;
+
+ @Schema(description = "用户输入的参数")
+ private Map inputParams;
+
+// @Schema(description = "上传脚本文件id")
+// private String scriptFileId;
+//
+// @Schema(description = "用户输入的正则表达式参数")
+// private String regExp;
+
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@Data
+public class SpdmNodeRelateMemberReq extends BaseEntity {
+
+ /**
+ * 关联的节点id
+ */
+ private String nodeId;
+
+ /**
+ * 工号
+ */
+ private String identity;
+
+ /**
+ * 用户名
+ */
+ private String name;
+
+ private Long userId;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.sdm.project.model.bo.ProjectNode;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmNodeReq {
+
+ List addNodeList;
+
+ List editNodeList;
+
+ List deleteNodeList;
+
+
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class SpdmProjectNodeEditReq extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ /**
+ * 当前节点所属项目根节点uuid
+ */
+ private String ownRootNodeUuid;
+
+ /**
+ * 节点名称
+ */
+ private String nodeName;
+
+ /**
+ * 节点编码
+ */
+ private String nodeCode;
+
+ /**
+ * 节点类型
+ */
+ private String nodeType;
+
+ /**
+ * 节点子类型(项目、节点、学科。。。)
+ */
+ private String nodeSubType;
+
+ /**
+ * 节点层级
+ */
+ private Integer nodeLevel;
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private Integer progressStatus;
+
+ /**
+ * 项目达成状态(红黄绿灯)
+ */
+ private Integer achieveStatus;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 项目经理 memberList
+ */
+ private String memberList;
+
+ /**
+ * 项目详情图片
+ */
+ private String detailImgUrl;
+
+ /**
+ * 备注
+ */
+ private String description;
+
+ /**
+ * 预留拓展属性
+ */
+ private List extraList;
+
+
+ private String standard;
+ private String analyseTarget;
+ private String confidence;
+ private String analyseSoftware;
+ private String analyseSoftwares;
+ private String department;
+ private String section;
+ private String group;
+ private String bCapacity;
+
+
+ @JsonProperty(value = "tag1")
+ private String tag1;
+ @JsonProperty(value = "tag2")
+ private String tag2;
+ @JsonProperty(value = "tag3")
+ private String tag3;
+ @JsonProperty(value = "tag4")
+ private String tag4;
+ @JsonProperty(value = "tag5")
+ private String tag5;
+ @JsonProperty(value = "tag6")
+ private String tag6;
+ @JsonProperty(value = "tag7")
+ private String tag7;
+ @JsonProperty(value = "tag8")
+ private String tag8;
+ @JsonProperty(value = "tag9")
+ private String tag9;
+ @JsonProperty(value = "tag10")
+ private String tag10;
+
+ private String exeStatus;
+ private List extras;
+ private String englishName;
+ private String parentId;
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.project.model.bo.CidTaskNode;
+import com.sdm.project.model.bo.TaskNode;
+import com.sdm.project.model.bo.TaskNodeTag;
+import lombok.Data;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class SpdmSyncCidTaskReq extends BaseEntity {
+
+ List taskList;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmTaskAttentionReq extends BaseEntity {
+
+ /**
+ * 关联的任务id
+ */
+ private String taskId;
+
+
+ private Long userId;
+
+ List addUserIdList;
+
+ List cancelUserIdList;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.sdm.common.validator.annotation.EnumValue;
+import com.sdm.project.common.TaskQryTypeEnum;
+import com.sdm.project.model.bo.TaskNodeTag;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class SpdmTaskCountReq {
+ /**
+ * 任务类型,0:我执行的 1:我关注的 2:所有 3-我分发的
+ */
+ @NotNull(message = "type不能为空")
+ @EnumValue(enumClass = TaskQryTypeEnum.class, message = "type任务类型无效")
+ private Integer type;
+
+ private List idMap;
+
+ /**
+ * 今明任务 筛选计划结束时间为今明两天的
+ */
+ private String todayTmrTasks;
+ /**
+ * 今天日期
+ */
+ private String todayTime;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.project.model.bo.ProjectNode;
+import com.sdm.project.model.bo.TaskNode;
+import com.sdm.project.model.bo.TaskNodeTag;
+import lombok.Data;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class SpdmTaskIssue {
+
+ List reqList;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.project.model.bo.TaskNode;
+import com.sdm.project.model.bo.TaskNodeTag;
+import lombok.Data;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class SpdmTaskIssueReq extends BaseEntity {
+
+ List idMap;
+
+ List addNodeList;
+
+ String demandId;
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.validator.annotation.EnumValue;
+import com.sdm.project.common.TaskQryTypeEnum;
+import com.sdm.project.model.bo.TaskNodeTag;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class SpdmTaskListReq {
+
+ @NotNull(message = "current不能为空")
+ private Integer current;
+
+ @NotNull(message = "size不能为空")
+ private Integer size;
+
+ /**
+ * 任务类型,0:我执行的 1:我关注的 2:所有 3-我分发的
+ */
+ @NotNull(message = "type不能为空")
+ @EnumValue(enumClass = TaskQryTypeEnum.class, message = "type任务类型无效")
+ private Integer type;
+
+ /**
+ * 任务名称
+ */
+ private String taskName;
+
+ /**
+ * 任务状态
+ */
+ private String exeStatus;
+
+ private List exeStatusList;
+
+ /**
+ * 达成情况
+ */
+ private String achieveStatus;
+
+ private List achieveStatusList;
+
+ /**
+ * 任务进度
+ */
+ private Integer progress;
+
+ /**
+ * 仿真负责人
+ */
+ @JsonProperty(value = "pMemberList")
+ private String pMemberList;
+
+ /**
+ * 仿真执行人
+ */
+ @JsonProperty(value = "eMemberList")
+ private String eMemberList;
+
+ private List idMap;
+
+ /**
+ * 计划开始时间
+ */
+ private List beginTime;
+
+ private String beginSTime;
+
+ private String beginETime;
+
+ /**
+ * 计划结束时间
+ */
+ private List endTime;
+
+ private String endSTime;
+
+ private String endETime;
+
+ /**
+ * 实际结束时间
+ */
+ private List finishTime;
+
+ private String finishSTime;
+
+ private String finishETime;
+
+ /**
+ * 今明任务 筛选计划结束时间为今明两天的
+ */
+ private String todayTmrTasks;
+ /**
+ * 今天日期
+ */
+ private String todayTime;
+
+ /**
+ * 排序顺序 按创建时间 0-先序/1-倒序排序
+ */
+ private Integer sortOrder;
+
+ private String demandId;
+
+ private Boolean convertTag = true;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class SpdmTaskOpr {
+
+ List taskIds;
+
+ SpdmTaskOprReq req;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class SpdmTaskOprReq {
+ /**
+ * 任务名称
+ */
+ private String taskId;
+
+ /**
+ * 任务状态
+ */
+ private String exeStatus;
+
+ /**
+ * 达成情况
+ */
+ private String achieveStatus;
+
+ /**
+ * 任务进度
+ */
+ private Integer progress;
+
+ /**
+ * 实际结束时间
+ */
+ private String finishTime;
+
+ /**
+ * 计划开始时间
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束时间
+ */
+ private String endTime;
+
+ /**
+ * 仿真执行人
+ */
+ @JsonProperty(value = "eMemberList")
+ private String eMemberList;
+
+ /**
+ * 任务名称
+ */
+ private String nodeName;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.project.model.bo.TaskNode;
+import com.sdm.project.model.bo.TaskNodeTag;
+import lombok.Data;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class SpdmTaskReq extends BaseEntity {
+
+ List addTaskList;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class SpdmTaskRunReq {
+
+ @Schema(description = "算例名称")
+ private String runName;
+
+ @Schema(description = "算例id")
+ private String runId;
+
+ @Schema(description = "任务uuid")
+ private String taskId;
+
+ @Schema(description = "流程模板id")
+ private String templateId;
+
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * 任务 完成情况统计请求参数(工位、学科)
+ */
+@Data
+@Schema(description = "按工位、学科的仿真任务达成统计")
+public class TaskCompleteStatisticsReq {
+
+ @Schema(description = "数据返回Tag类型: tag1、tag2,tag3,tag4,tag5,tag6,tag7,tag8,tag9,tag10")
+ @NotNull
+ private String resultTagType;
+
+ @Schema(description = "标签1")
+ private String tag1;
+
+ @Schema(description = "标签2")
+ private String tag2;
+
+ @Schema(description = "标签3")
+ private String tag3;
+
+ @Schema(description = "标签4")
+ private String tag4;
+
+ @Schema(description = "标签5")
+ private String tag5;
+
+ @Schema(description = "标签6")
+ private String tag6;
+
+ @Schema(description = "标签7")
+ private String tag7;
+
+ @Schema(description = "标签8")
+ private String tag8;
+
+ @Schema(description = "标签9")
+ private String tag9;
+
+ @Schema(description = "标签10")
+ private String tag10;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.project.model.bo.ProjectMemberNode;
+import com.sdm.project.model.bo.TaskExtraNode;
+import com.sdm.project.model.bo.TaskMemberNode;
+import com.sdm.project.model.po.ProjectNodeExtraPo;
+import lombok.Data;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class TaskEditNodeReq extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ /**
+ * 节点名称
+ */
+ private String nodeName;
+
+ /**
+ * 节点编码
+ */
+ private String nodeCode;
+
+ /**
+ * 节点类型
+ */
+ private String nodeType;
+
+ /**
+ * 节点子类型(项目、节点、学科。。。)
+ */
+ private String nodeSubType;
+
+ /**
+ * 节点层级
+ */
+ private Integer nodeLevel;
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private Integer progressStatus;
+
+ /**
+ * 项目达成状态(红黄绿灯)
+ */
+ private Integer achieveStatus;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 项目经理
+ */
+ private List nodeManager;
+
+ /**
+ * 项目详情图片
+ */
+ private String detailImgUrl;
+
+ /**
+ * 备注
+ */
+ private String description;
+
+ /**
+ * 预留拓展属性
+ */
+ private List nodeExtraList;
+
+ private Long tenantId;
+
+ private String nodeId;
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private String exeStatus;
+
+ /**
+ * 项目进度状态
+ */
+ private Integer progress;
+
+ private String progressStatusValue;
+
+
+ private String achieveStatusValue;
+
+ /**
+ * 仿真负责人
+ */
+ private String sManager;
+
+ /**
+ * 标准工时
+ */
+ private Integer days;
+
+ /**
+ * 实际工时
+ */
+ private Integer realDays;
+
+ /**
+ * 难度系数
+ */
+ private Float difficult;
+
+ /**
+ * 审批状态
+ */
+ private String approvalStatus;
+
+ /**
+ * 确认状态
+ */
+ private String confirmStatus;
+
+
+ /**
+ * 项目经理
+ */
+ private String managers;
+
+
+
+ /**
+ * 达标方式
+ */
+ private String method;
+
+ private String taskId;
+
+ /**
+ * 目标值
+ */
+ private String targetValue;
+
+ /**
+ * 单位
+ */
+ private String unit;
+
+ private String highValue;
+
+ private String lowValue;
+
+
+ private String nodeVersion;
+
+ private List taskExtraNodeList;
+
+ private List taskPerformanceExtraNodeList;
+
+ private List memberList;
+
+ /**
+ * 仿真执行人
+ */
+ @JsonProperty(value = "eMemberList")
+ private String eMemberList;
+ /**
+ * 仿真负责人
+ */
+ @JsonProperty(value = "pMemberList")
+ private String pMemberList;
+
+
+ private String performanceId;
+
+
+ /**
+ * 属性名
+ */
+ private String propertyName;
+
+ /**
+ * 属性值
+ */
+ private String propertyValue;
+
+ /**
+ * 值类型
+ */
+ private String valueType;
+
+ /**
+ * 属性
+ */
+ private String propertyClass;
+
+ /**
+ * 用户名
+ */
+ private String userName;
+
+ /**
+ * 工号
+ */
+ private String jobNumber;
+
+ /**
+ * 用户角色
+ */
+ private String userRole;
+
+ /**
+ * 部门
+ */
+ private String department;
+
+ /**
+ * 手机号
+ */
+ private String phone;
+
+ /**
+ * 邮箱
+ */
+ private String email;
+
+ private String identity;
+
+ private String name;
+
+ private List extra;
+
+ private List members;
+
+ private String levelType;
+
+
+ private String standard;
+ private String analyseTarget;
+ private String confidence;
+ private String analyseSoftware;
+ private String analyseSoftwares;
+ private String section;
+ private String group;
+ @JsonProperty(value = "bCapacity")
+ private String bCapacity;
+ private String flowTemplate;
+ private String englishName;
+ private String performanceType;
+
+ /**
+ * 关注人(id)
+ */
+ private String attentionList;
+
+ private Long imageFileId;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class TaskHandleReq {
+
+ /**
+ * 节点类型
+ */
+ private String taskId;
+
+ /**
+ * 所有、我发起的、我确认的、我执行的、我关注的(0、1、2、3、4)
+ */
+ @NotNull(message = "任务类型不能为空!")
+ private Integer taskType;
+
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.sdm.common.entity.bo.UserInfo;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class UpdateProjectLeaderReq {
+
+ @NotNull(message = "projectId不能为空")
+ private Long projectId;
+
+ @NotBlank(message = "projectName不能为空")
+ private String projectName;
+
+ private List addUsers;
+ private List delUserIds;
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.sdm.common.entity.pojo.project.ProjectNodeBase;
+import com.sdm.common.entity.pojo.project.ProjectNodeExpand;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class UpdateProjectNodeBatchReq {
+
+ private List nodeBases;
+
+ private List updateNodeExpands;
+ private List addNodeExpands;
+ private List delNodeExpandIds;
+}
+
+
+
+package com.sdm.project.model.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 项目成员任务进度统计请求参数
+ */
+@Data
+@Schema(description = "项目成员任务进度统计请求参数")
+public class UserDifficultCompleteStatisticsReq {
+
+ @Schema(description = "标签1")
+ private String tag1;
+
+ @Schema(description = "用户")
+ private List userIds;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 项目成员任务进度统计请求参数
+ */
+@Data
+@Schema(description = "项目成员任务进度统计请求参数")
+public class UserTaskCompleteStatisticsReq {
+
+ @Schema(description = "标签1")
+ private String tag1;
+
+ @Schema(description = "用户")
+ private List userIds;
+
+}
+
+
+
+package com.sdm.project.model.req;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class UserWorkloadReq {
+ /**
+ * 用户id列表
+ */
+ List userIds;
+ /**
+ * 任务uuid列表
+ */
+ List taskIds;
+
+ /**
+ * 起始时间
+ */
+ private String beginTime;
+ /**
+ * 结束时间
+ */
+ private String endTime;
+
+ private Long userId;
+
+}
+
+
+
+package com.sdm.project.model.req.YA;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@Schema(description = "仿真模型删除参数")
+public class DeleteModelNodeInfoReq {
+
+ @Schema(description = "数据类型名称")
+ private String type;
+
+ @Schema(description = "需要删除数据ObjectId")
+ private String objectId;
+
+ @Schema(description = "需要删除数据id")
+ private String id;
+
+
+}
+
+
+
+package com.sdm.project.model.req.YA;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@Schema(description = "获取仿真模型参数")
+public class GetModelNodeInfoReq {
+
+ @Schema(description = "数据类型名称")
+ private String type;
+
+ @Schema(description = "需要删除数据ObjectId")
+ private String objectId;
+
+}
+
+
+
+package com.sdm.project.model.req.YA;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+public class GetTaskSimulatinFileReq {
+
+ @Schema(description = "项目ID")
+ @NotBlank(message = "项目ID不能为空")
+ private String taskId;
+
+ @Schema(description = "当前页")
+ @NotNull(message = "当前页不能为空")
+ private Integer current;
+
+ @Schema(description = "每页数据大小")
+ @NotNull(message = "显示页大小不能为空")
+ private Integer size;
+}
+
+
+
+package com.sdm.project.model.req.YA;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class ProjectTaskInfo {
+
+ @Schema(description = "任务名称")
+ private String taskName;
+
+ @Schema(description = "taskId")
+ private String taskId;
+}
+
+
+
+package com.sdm.project.model.req.YA;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+@Data
+@Schema(description = "仿真关键结果上传参数")
+public class SaveKeyResultNodeInfoReq {
+
+ @Schema(description = "数据类型名称")
+ private String type;
+
+ @Schema(description = "数据名称")
+ private String name;
+
+ @Schema(description = "数据类型编号,参考KeyResultTypeEnum")
+ private Integer code;
+
+ @Schema(description = "仿真分析项")
+ private String scenario;
+
+ @Schema(description = "数据访问控制级别")
+ private String dataLevel;
+
+ @Schema(description = "所属项目ID")
+ private String project;
+
+ @Schema(description = "父级节点ID")
+ private String parent;
+
+ @Schema(description = "任务ID")
+ private String workRequest;
+
+ @Schema(description = "分析对象")
+ private String item;
+
+ @Schema(description = "轮次")
+ private String round;
+
+ @Schema(description = "方案Id")
+ private String version;
+
+ @Schema(description = "文件名称")
+ private String fileName;
+
+ @Schema(description = "文件类型,参考FileBizTypeEnum")
+ private Integer fileType;
+
+ @Schema(description = "数值")
+ private String value;
+
+ @Schema(description = "单位")
+ private String units;
+
+ @Schema(description = "状态")
+ private String status;
+
+ @Schema(description = "物理量")
+ private String quantityType;
+
+ @Schema(description = "文件传输对象")
+ @JSONField(serialize = false)
+ private MultipartFile file;
+
+ @Schema(description = "分页参数,当前第几页")
+ private int current;
+
+ @Schema(description = "分页参数,一页几条")
+ private int size;
+
+
+}
+
+
+
+package com.sdm.project.model.req.YA;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+@Data
+@Schema(description = "仿真模型上传参数")
+public class SaveModelNodeInfoReq {
+
+ @Schema(description = "数据类型名称")
+ private String type;
+
+ @Schema(description = "数据名称")
+ private String name;
+
+ @Schema(description = "数据类型编号")
+ private String code;
+
+ @Schema(description = "所属项目ID")
+ private String project;
+
+ @Schema(description = "父级节点ID")
+ private String parent;
+
+ @Schema(description = "仿真分析项")
+ private String scenario;
+
+ @Schema(description = "主负责人")
+ private String firstOwner;
+
+ @Schema(description = "从负责人")
+ private List secondOwner;
+
+ @Schema(description = "起止日期")
+ private String startEndData;
+
+ @Schema(description = "学科")
+ private String disciplineClassification;
+
+ @Schema(description = "格式")
+ private String format;
+
+ @Schema(description = "分析对象")
+ private String item;
+
+ @Schema(description = "文件传输对象")
+ @JSONField(serialize = false)
+ private MultipartFile file;
+
+
+}
+
+
+
+package com.sdm.project.model.req.YA;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+@Data
+@Schema(description = "仿真报告上传参数")
+public class SaveReportNodeInfoReq {
+
+ @Schema(description = "数据类型名称")
+ private String type;
+
+ @Schema(description = "数据名称")
+ private String name;
+
+ @Schema(description = "描述")
+ private String discription;
+
+ @Schema(description = "数据类型编号")
+ private String code;
+
+ @Schema(description = "所属项目ID")
+ private String project;
+
+ @Schema(description = "父级节点ID")
+ private String parent;
+
+ @Schema(description = "仿真分析项")
+ private String scenario;
+
+ @Schema(description = "文件传输对象")
+ @JSONField(serialize = false)
+ private MultipartFile file;
+
+
+}
+
+
+
+package com.sdm.project.model.req.YA;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+@Data
+public class SyncCidProjectReq {
+
+ @Schema(description = "项目名称")
+ private String projectName;
+
+ @Schema(description = "项目Id")
+ @NotBlank(message = "项目Id不能为空")
+ private String projectId;
+
+}
+
+
+
+package com.sdm.project.model.req.YA;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class SyncCidTaskReq {
+
+ @Schema(description = "项目名称")
+ private String projectName;
+
+ @Schema(description = "项目Id")
+ @NotBlank(message = "项目Id不能为空")
+ private String projectId;
+
+ @Schema(description = "项目关联的任务集合")
+ private List taskInfoList = new ArrayList<>();
+}
+
+
+
+package com.sdm.project.model.resp;
+
+import com.sdm.common.entity.flowable.dto.ProcessInstanceInfo;
+import com.sdm.common.entity.req.capability.FlowNodeDto;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FlowInfoDto {
+
+ private ProcessInstanceInfo processInfo;
+ private List flowNodeDtoList;
+
+}
+
+
+
+package com.sdm.project.model.resp;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class GetAllRunResultByTaskIdResp {
+ @Schema(description = "任务指标列表")
+ List tasKPerformanceRespList = new ArrayList<>();
+
+ @Schema(description = "工况算列运行结果")
+ List runResultResp;
+}
+
+
+
+package com.sdm.project.model.resp;
+
+import com.sdm.common.entity.resp.data.SimulationTaskResultCurveResp;
+import com.sdm.project.model.entity.SimulationTask;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class KeyResultAndTaskInfoResp {
+
+ @Schema(description = "算例uuid")
+ private String runId;
+
+ @Schema(description = "关键性能结果类型 1-图片/动画 2-曲线 3-报告 4-数值")
+ private Integer keyResultType;
+
+ @Schema(description = "结果名称")
+ private String name;
+
+ @Schema(description = "文件id")
+ private Long fileId;
+
+ @Schema(description = "物理量")
+ private String quantityType;
+
+ @Schema(description = "结果单位")
+ private String units;
+
+ @Schema(description = "最大数值")
+ private String max;
+
+ @Schema(description = "最小数值")
+ private String min;
+
+ @Schema(description = "数值")
+ private String value;
+
+ @Schema(description = "描述信息")
+ private String description;
+
+ @Schema(description = "x轴物理量(曲线结果使用)")
+ private String xQuantityType;
+
+ @Schema(description = "x轴结果单位(曲线结果使用)")
+ private String xUnits;
+
+ @Schema(description = "y轴物理量(曲线结果使用)")
+ private String yQuantityType;
+
+ @Schema(description = "y轴结果单位(曲线结果使用)")
+ private String yUnits;
+
+ @Schema(description = "任务信息")
+ private SimulationTask simulationTask;
+
+ @Schema(description = "文件信息")
+ private SimulationTaskResultCurveResp fileInfo;
+
+}
+
+
+
+package com.sdm.project.model.resp;
+
+import com.sdm.common.entity.req.project.SimulationPerformance;
+import com.sdm.project.model.entity.SimulationRun;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class RunResultResp {
+ SimulationRun simulationRun;
+ List simulationPerformance = new ArrayList<>();
+}
+
+
+
+package com.sdm.project.model.resp;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.sdm.project.model.entity.SimulationRun;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+public class RunVersionInfoResp {
+ private Integer id;
+
+ private String uuid;
+
+ @Schema(description = "算例名称")
+ private String runName;
+
+ @Schema(description = "1:server 2:pbs 3:local only")
+ private Integer type;
+
+ @Schema(description = "流程模板id")
+ private String taskId;
+
+ @Schema(description = "流程模板id")
+ private String flowTemplate;
+
+ @Schema(description = "Run状态 0:未执行 1:执行中 2:完成 3:失败")
+ private Integer status;
+
+ @Schema(description = "Run总共的流程步骤")
+ private Integer totalStep;
+
+ @Schema(description = "当前的流程步骤")
+ private Integer currentStep;
+
+ @Schema(description = "当前的流程步骤名称")
+ private String currentStepName;
+
+ @Schema(description = "Run执行结果 0:gray 1:red 2:yellow 3:green")
+ private Integer achieveStatus;
+
+ @Schema(description = "run描述信息")
+ private String description;
+
+ @Schema(description = "Run对应在文件系统中的路径")
+ private Long folderId;
+
+ @Schema(description = "计算父版本Id")
+ private String parentId;
+
+ @Schema(description = "是否个人模板")
+ private String isPersonalTemplate;
+
+ @Schema(description = "租户id")
+ private Long tenantId;
+
+ @Schema(description = "英文名")
+ private Long englishName;
+
+ @Schema(description= "创建者ID")
+ private Long creator;
+ private String creatorName;
+
+ @Schema(description= "创建时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime createTime;
+
+ @Schema(description= "更新者ID")
+ private Long updater;
+ private String updaterName;
+
+ @Schema(description= "创建时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime updateTime;
+
+ List children;
+
+}
+
+
+
+package com.sdm.project.model.resp;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class TaskCountResp {
+ @Schema(description = "总数")
+ int total;
+
+ @Schema(description = "今明任务")
+ int todayTmrTasks;
+
+ @Schema(description = "进行中")
+ int inProgress;
+
+ @Schema(description = "已逾期")
+ int postponed;
+
+ @Schema(description = "未开始")
+ int noStarted;
+
+ @Schema(description = "已完成")
+ int completed;
+
+ @Schema(description = "已关闭")
+ int closed;
+
+ @Schema(description = "已暂停")
+ int paused;
+
+ @Schema(description = "已驳回")
+ int rejected;
+
+}
+
+
+
+package com.sdm.project.model.resp;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class TasKPerformanceResp {
+ @Schema(description = "指标名称")
+ String performanceName;
+
+ @Schema(description = "单位")
+ String unit;
+
+ @Schema(description = "达成方式")
+ String method;
+
+ @Schema(description = "目标值")
+ String targetValue;
+}
+
+
+
+package com.sdm.project.model.resp;
+
+import lombok.Data;
+
+
+@Data
+public class TaskWorkDaysResp {
+ /**
+ * 任务uuid
+ */
+ private String taskId;
+ /**
+ * 任务名称
+ */
+ private String taskName;
+ /**
+ * 工时
+ */
+ private Integer days;
+
+}
+
+
+
+package com.sdm.project.model.resp;
+
+import com.sdm.project.model.entity.SimulationTask;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class UserWorkloadResp {
+
+ /**
+ * 用户id
+ */
+ private String userId;
+ /**
+ * 用户姓名
+ */
+ private String userName;
+ /**
+ * 任务数量
+ */
+ private Integer taskNum;
+ /**
+ * 任务量(未开始和进行中的)
+ */
+ private Integer workNum;
+ /**
+ * 工作饱和度 任务数量*工时
+ */
+ private double workload;
+ /**
+ * 任务列表
+ */
+ private List taskList;
+
+}
+
+
+
+package com.sdm.project.model.resp.YA;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+public class BosimErrorRespond {
+
+ @Schema(description = "错误码")
+ private int errorCode;
+
+ @Schema(description = "错误信息")
+ private String errorMsg;
+
+}
+
+
+
+package com.sdm.project.model.resp.YA;
+
+import com.sdm.common.entity.resp.PageDataResp;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class BosimKeyResultInfoRsp {
+
+ @Schema(description = "返回码")
+ private String code ;
+
+ @Schema(description = "返回信息")
+ private String message = "";
+
+ PageDataResp> data;
+}
+
+
+
+package com.sdm.project.model.resp.YA;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class BosimSaveNodeInfoRsp {
+
+ @Schema(description = "返回码")
+ private String code ;
+
+ @Schema(description = "返回信息")
+ private String message = "";
+
+ private List workRequest = new ArrayList<>();
+}
+
+
+
+package com.sdm.project.model.resp.YA;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class BosimSaveProjectTaskRsp {
+
+ @Schema(description = "返回码")
+ private String code ;
+
+ @Schema(description = "返回信息")
+ private String message = "";
+
+}
+
+
+
+package com.sdm.project.model.resp.YA;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+@Data
+@Schema(description = "仿真关键结果上传参数")
+public class KeyResultNodeInfo {
+
+ @Schema(description = "唯一uuid")
+ private String uuid;
+
+ @Schema(description = "数据类型名称")
+ private String type;
+
+ @Schema(description = "数据名称")
+ private String name;
+
+ @Schema(description = "数据类型编号,参考KeyResultTypeEnum")
+ private Integer code;
+
+ @Schema(description = "仿真分析项")
+ private String scenario;
+
+ @Schema(description = "数据访问控制级别")
+ private String dataLevel;
+
+ @Schema(description = "所属项目ID")
+ private String project;
+
+ @Schema(description = "父级节点ID")
+ private String parent;
+
+ @Schema(description = "任务ID")
+ private String workRequest;
+
+ @Schema(description = "分析对象")
+ private String item;
+
+ @Schema(description = "轮次")
+ private String round;
+
+ @Schema(description = "方案Id")
+ private String version;
+
+ @Schema(description = "文件名称")
+ private String fileName;
+
+ @Schema(description = "文件类型,参考FileBizTypeEnum")
+ private Integer fileType;
+
+ @Schema(description = "数值")
+ private String value;
+
+ @Schema(description = "单位")
+ private String units;
+
+ @Schema(description = "状态")
+ private String status;
+
+ @Schema(description = "物理量")
+ private String quantityType;
+
+ @Schema(description = "文件id")
+ private Long fileId;
+
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import lombok.Data;
+
+@Data
+public class CommonGetCompleteFromPerformanceVo {
+ private String tag;
+ private String nodeName;
+ private String completeStatus;
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import lombok.Data;
+
+@Data
+public class CommonGetCompleteFromTaskVo {
+ private String tag;
+ private String nodeName;
+ private String exeStatus;
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class CommonStatisticsVo {
+ private String name;
+ private Map statusCount = new HashMap<>();
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class SpdmAnalysisTaskVo extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ /**
+ * 任务名称
+ */
+ private String taskName;
+
+
+ /**
+ * 任务编码
+ */
+ private String taskCode;
+
+ private String nodeId;
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private String exeStatus;
+
+ private String achieveStatus;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 难度系数
+ */
+ private Float difficult;
+
+ private String projectName;
+
+ private String phaseName;
+
+ private String disciplineName;
+
+ /**
+ * 仿真负责人
+ */
+ private String pMembers;
+
+
+
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.common.entity.resp.system.CIDUserResp;
+import com.sdm.project.model.req.SpdmDemandExtraReq;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmDemandExtraVo extends BaseEntity {
+
+ /**
+ * 关联的需求id
+ */
+ private String demandId;
+
+ /**
+ * 需求拓展属性编码
+ */
+ private String propertyName;
+
+ /**
+ * 需求拓展属性值
+ */
+ private String propertyValue;
+
+
+ /**
+ * 需求拓展属性值类型
+ */
+ private String valueType;
+
+ /**
+ * 需求拓展属性class
+ */
+ private String propertyClass;
+
+
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@Data
+public class SpdmDemandMemberVo extends BaseEntity {
+
+ /**
+ * 关联的需求id
+ */
+ private String demandId;
+
+ /**
+ * 成员类型,0:仿真负责人 1:仿真执行人
+ */
+ private Integer type;
+
+ /**
+ * 工号
+ */
+ private String identity;
+
+ /**
+ * 用户名
+ */
+ private String name;
+
+ private Long userId;
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.common.entity.resp.system.CIDUserResp;
+import com.sdm.project.model.req.SpdmDemandExtraReq;
+import com.sdm.project.model.vo.SpdmDemandMemberVo;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmDemandVo extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ /**
+ * 需求的唯一标识
+ */
+ private String uuid;
+
+ /**
+ * 需求名称
+ */
+ @NotNull(message = "需求名称不能为空")
+ private String demandName;
+
+ /**
+ * 需求编码
+ */
+ private String demandCode;
+
+ /**
+ * 需求状态:未分配、未开始、进行中、暂停、已关闭、已闭环、已驳回
+ */
+ private String demandStatus;
+
+
+ /**
+ * 达成状态
+ */
+ private String achieveStatus;
+
+ /**
+ * 进度
+ */
+ private Integer progress;
+
+ /**
+ * 审批状态
+ */
+ private String approvalStatus;
+
+ /**
+ * 计划开始时间(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束时间(精确到秒)
+ */
+ private String endTime;
+
+ /**
+ * 实际结束时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 仿真负责人
+ */
+ @JsonProperty(value = "pMemberList")
+ private List pMemberList;
+
+ /**
+ * 仿真执行人
+ */
+ @JsonProperty(value = "eMemberList")
+ private List eMemberList;
+
+ /**
+ * 预留拓展属性
+ */
+ private List extraList;
+
+ private List extras;
+
+ /**
+ * 项目名称
+ */
+ private String projectId;
+
+ private String projectName;
+
+ /**
+ * 阶段名称
+ */
+ private String phaseId;
+
+ private String phaseName;
+
+ /**
+ * 学科名称
+ */
+ private String nodeId;
+
+ private String demandType;
+
+ private String simType;
+
+ /**
+ * 3D负责人
+ */
+ @JsonProperty(value = "tMemberList")
+ private List tMemberList;
+
+ /**
+ * 关注人
+ */
+ @JsonProperty(value = "aMemberList")
+ private List aMemberList;
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.common.entity.resp.system.CIDUserResp;
+import com.sdm.project.model.req.SpdmDemandExtraReq;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmExportDemandVo extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ /**
+ * 需求的唯一标识
+ */
+ private String uuid;
+
+ /**
+ * 需求名称
+ */
+ @NotNull(message = "需求名称不能为空")
+ private String demandName;
+
+ /**
+ * 需求编码
+ */
+ private String demandCode;
+
+ /**
+ * 需求状态:未分配、未开始、进行中、暂停、已关闭、已闭环、已驳回
+ */
+ private String demandStatus;
+
+
+ /**
+ * 达成状态
+ */
+ private String achieveStatus;
+
+ /**
+ * 进度
+ */
+ private Integer progress;
+
+ /**
+ * 审批状态
+ */
+ private String approvalStatus;
+
+ /**
+ * 计划开始时间(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束时间(精确到秒)
+ */
+ private String endTime;
+
+ /**
+ * 实际结束时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 仿真负责人
+ */
+ @JsonProperty(value = "pMemberList")
+ private String pMemberList;
+
+ /**
+ * 仿真执行人
+ */
+ @JsonProperty(value = "eMemberList")
+ private String eMemberList;
+
+ /**
+ * 3D负责人
+ */
+ @JsonProperty(value = "tMemberList")
+ private String tMemberList;
+
+ /**
+ * 关注人
+ */
+ @JsonProperty(value = "aMemberList")
+ private String aMemberList;
+
+ /**
+ * 预留拓展属性
+ */
+ private List extraList;
+
+ /**
+ * 项目名称
+ */
+ private String projectId;
+
+ private String projectName;
+
+ /**
+ * 阶段名称
+ */
+ private String phaseId;
+
+ private String phaseName;
+
+ /**
+ * 学科名称
+ */
+ private String nodeId;
+
+ private String demandType;
+
+ private String simType;
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.common.entity.resp.system.CIDUserResp;
+import lombok.Data;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class SpdmExportNewTaskVo extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ private String pUuid;
+
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ /**
+ * 任务名称
+ */
+ private String taskName;
+
+
+ /**
+ * 任务编码
+ */
+ private String taskCode;
+
+ private String nodeId;
+
+
+ /**
+ * 标准工时
+ */
+ private Integer days;
+
+ /**
+ * 实际工时
+ */
+ private Integer realDays;
+
+ private String standard;
+
+ private String folderId;
+
+ private Integer status;
+
+ private String achieveStatus;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 项目进度状态
+ */
+ private Integer progress;
+
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private String exeStatus;
+
+ private String confidence;
+
+ private String analyseTarget;
+ private String analyseSoftware = "";
+ private String approvalStatus;
+ private String comfirmStatus;
+ private String description;
+ /**
+ * 难度系数
+ */
+ private Float difficult;
+
+ private String department = "";
+ private String sectionName = "";
+ private String groupName = "";
+ @JsonProperty(value = "bCapacity")
+ private String bCapacity = "";
+ private String flowTemplate;
+ private String englishName;
+
+
+ /**
+ * 关联的需求id
+ */
+ private String demandId;
+
+ /**
+ * 仿真负责人
+ */
+ @JsonProperty(value = "pMemberList")
+ private String pMemberList;
+
+ /**
+ * 仿真执行人
+ */
+ @JsonProperty(value = "eMemberList")
+ private String eMemberList;
+
+ /**
+ * 0:未关注 1:已关注
+ */
+ private Integer attentionFlag;
+
+ @JsonProperty(value = "tag1")
+ private String tag1;
+ @JsonProperty(value = "tag2")
+ private String tag2;
+ @JsonProperty(value = "tag3")
+ private String tag3;
+ @JsonProperty(value = "tag4")
+ private String tag4;
+ @JsonProperty(value = "tag5")
+ private String tag5;
+ @JsonProperty(value = "tag6")
+ private String tag6;
+ @JsonProperty(value = "tag7")
+ private String tag7;
+ @JsonProperty(value = "tag8")
+ private String tag8;
+ @JsonProperty(value = "tag9")
+ private String tag9;
+ @JsonProperty(value = "tag10")
+ private String tag10;
+
+ private String machineName = "";
+ private String machineCode = "";
+ private String workspaceName = "";
+ private String workspaceCode = "";
+ private String disciplineName = "";
+ private String disciplineCode = "";
+ private String performanceName = "";
+ private String performanceCode = "";
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.common.entity.resp.system.CIDUserResp;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmExportNodeVo extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ /**
+ * 节点名称
+ */
+ private String nodeName;
+
+
+ /**
+ * 节点编码
+ */
+ private String nodeCode;
+
+
+ /**
+ * 节点类型
+ */
+ private String nodeType;
+
+ /**
+ * 项目类型
+ */
+ private String nodeSubType;
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private Integer progress;
+
+ private String progressStatusValue;
+
+ /**
+ * 项目达成状态(红黄绿灯)
+ */
+ private Integer achieveStatus;
+
+ private String achieveStatusValue;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 项目经理
+ */
+ private String memberList;
+
+ /**
+ * 拓展属性集合
+ */
+ private List extraList;
+
+ /**
+ * 项目详情图片
+ */
+ private String detailImgUrl;
+ /**
+ * 备注
+ */
+ private String description;
+
+ private CIDUserResp creatorObj;
+
+ private String exeStatus;
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.common.entity.resp.system.CIDUserResp;
+import com.sdm.project.model.po.TaskNodeExtraPo;
+import lombok.Data;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class SpdmNewTaskVo extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ private String pUuid;
+
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ /**
+ * 任务名称
+ */
+ private String taskName;
+
+
+ /**
+ * 任务编码
+ */
+ private String taskCode;
+
+ private String nodeId;
+
+
+ /**
+ * 标准工时
+ */
+ private Integer days;
+
+ /**
+ * 实际工时
+ */
+ private Integer realDays;
+
+ private String standard;
+
+ private String folderId;
+
+ private Integer status;
+
+ private String achieveStatus;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 项目进度状态
+ */
+ private Integer progress;
+
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private String exeStatus;
+
+ private String confidence;
+
+ private String analyseTarget;
+ private String analyseSoftware;
+ private Integer approvalStatus;
+ private String comfirmStatus;
+ private String description;
+ /**
+ * 难度系数
+ */
+ private Float difficult;
+
+ private String department;
+ private String sectionName;
+ private String groupName;
+ @JsonProperty(value = "bCapacity")
+ private String bCapacity;
+ private String flowTemplate;
+ private String englishName;
+
+
+ /**
+ * 关联的需求id
+ */
+ private String demandId;
+
+ /**
+ * 关联cid交付物审批流程id
+ */
+ private String cidFlowId;
+
+ /**
+ * 仿真负责人
+ */
+ @JsonProperty(value = "pMemberList")
+ private List pMemberList;
+
+ /**
+ * 仿真执行人
+ */
+ @JsonProperty(value = "eMemberList")
+ private List eMemberList;
+
+ /**
+ * 0:未关注 1:已关注
+ */
+ private Integer attentionFlag;
+
+ @JsonProperty(value = "tag1")
+ private String tag1;
+ @JsonProperty(value = "tag2")
+ private String tag2;
+ @JsonProperty(value = "tag3")
+ private String tag3;
+ @JsonProperty(value = "tag4")
+ private String tag4;
+ @JsonProperty(value = "tag5")
+ private String tag5;
+ @JsonProperty(value = "tag6")
+ private String tag6;
+ @JsonProperty(value = "tag7")
+ private String tag7;
+ @JsonProperty(value = "tag8")
+ private String tag8;
+ @JsonProperty(value = "tag9")
+ private String tag9;
+ @JsonProperty(value = "tag10")
+ private String tag10;
+
+ private List extras;
+
+ /**
+ * 关联的需求名称
+ */
+ private String demandName;
+
+
+
+
+
+
+
+
+
+ private String taskId;
+
+
+
+ /**
+ * 指标名称
+ */
+ private String performanceName;
+
+ private String performanceType;
+ private String highValue;
+ private String lowValue;
+
+
+ private String nodeName;
+
+ /**
+ * 达标方式
+ */
+ private String method;
+
+ private String completeStatus;
+
+ /**
+ * 目标值
+ */
+ private String targetValue;
+
+ /**
+ * 单位
+ */
+ private String unit;
+
+
+
+ private String projectName;
+
+ private String phaseName;
+
+ private String disciplineName;
+
+ private String imageFileId = "";
+ private String section = "";
+ private String group = "";
+
+
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.common.entity.resp.system.CIDUserResp;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmNodeDetailForDataVo extends BaseEntity {
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ /**
+ * 节点名称
+ */
+ private String nodeName;
+
+
+ /**
+ * 节点编码
+ */
+ private String nodeCode;
+
+
+ /**
+ * 节点类型
+ */
+ private String nodeType;
+
+ /**
+ * 拓展属性集合
+ */
+ private List extraList;
+
+ /**
+ * 英文名称
+ */
+ private String englishName;
+
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.common.entity.resp.system.CIDUserResp;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmNodeDetailVo extends BaseEntity {
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ /**
+ * 节点名称
+ */
+ private String nodeName;
+
+
+ /**
+ * 节点编码
+ */
+ private String nodeCode;
+
+
+ /**
+ * 节点类型
+ */
+ private String nodeType;
+
+ /**
+ * 项目类型
+ */
+ private String nodeSubType;
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private Integer progress;
+
+ private String progressStatusValue;
+
+ /**
+ * 项目达成状态(红黄绿灯)
+ */
+ private Integer achieveStatus;
+
+ private String achieveStatusValue;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 项目经理
+ */
+ private String managers;
+
+ /**
+ * 拓展属性集合
+ */
+ private List extraList;
+
+ /**
+ * 项目详情图片
+ */
+ private String detailImgUrl;
+
+ /**
+ * 备注
+ */
+ private String description;
+
+ /**
+ * 团队成员
+ */
+ List memberList;
+
+ private CIDUserResp creatorObj;
+
+ private String exeStatus;
+
+ /**
+ * 当前阶段
+ */
+ private String currentPhase;
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@Data
+public class SpdmNodeExtraVo extends BaseEntity {
+
+ /**
+ * 所属节点id
+ */
+ private String nodeId;
+
+ /**
+ * 属性名
+ */
+ private String propertyName;
+
+ /**
+ * 属性值
+ */
+ private String propertyValue;
+
+ /**
+ * 值类型
+ */
+ private String valueType;
+
+ /**
+ * 属性
+ */
+ private String propertyClass;
+
+
+
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@Data
+public class SpdmNodeMemberVo extends BaseEntity {
+
+ /**
+ * 所属节点id
+ */
+ private String nodeId;
+
+ /**
+ * 工号
+ */
+ private String identity;
+
+ /**
+ * 用户名
+ */
+ private String name;
+
+ private Long userId;
+
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.common.entity.resp.system.CIDUserResp;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SpdmNodeVo extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ /**
+ * 节点名称
+ */
+ private String nodeName;
+
+
+ /**
+ * 节点编码
+ */
+ private String nodeCode;
+
+
+ /**
+ * 节点类型
+ */
+ private String nodeType;
+
+ /**
+ * 项目类型
+ */
+ private String nodeSubType;
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private Integer progress;
+
+ private String progressStatusValue;
+
+ /**
+ * 项目达成状态(红黄绿灯)
+ */
+ private Integer achieveStatus;
+
+ private String achieveStatusValue;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 项目经理
+ */
+ private List memberList;
+
+ /**
+ * 拓展属性集合
+ */
+ private List extraList;
+
+ private List extras;
+
+ /**
+ * 项目详情图片
+ */
+ private String detailImgUrl;
+ /**
+ * 备注
+ */
+ private String description;
+
+ private CIDUserResp creatorObj;
+
+ private String exeStatus;
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@Data
+public class SpdmTaskAttentionMemberVo extends BaseEntity {
+
+ /**
+ * 关联的任务id
+ */
+ private String taskId;
+ /**
+ * 工号
+ */
+ private String identity;
+
+ /**
+ * 用户名
+ */
+ private String name;
+
+ private Long userId;
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.common.entity.resp.system.CIDUserResp;
+import com.sdm.project.model.po.NodeAllBase;
+import com.sdm.project.model.po.PerformanceNodePo;
+import com.sdm.project.model.po.ProjectNodeExtraPo;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class SpdmTaskDetailVo extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ private String pUuid;
+
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ private String nodeId;
+
+ /**
+ * 任务名称
+ */
+ private String taskName;
+
+
+ /**
+ * 任务编码
+ */
+ private String taskCode;
+
+ private String exeStatusValue;
+
+ private String exeStatus;
+
+ /**
+ * 仿真负责人
+ */
+ private String sManager;
+
+
+ /**
+ * 项目进度状态
+ */
+ private Integer progress;
+
+ private String progressStatusValue;
+
+ /**
+ * 项目达成状态(红黄绿灯)
+ */
+ private Integer achieveStatus;
+
+ private String achieveStatusValue;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 标准工时
+ */
+ private Integer days;
+
+ /**
+ * 实际工时
+ */
+ private Integer realDays;
+
+ /**
+ * 难度系数
+ */
+ private Float difficult;
+
+ /**
+ * 审批状态
+ */
+ private Integer approvalStatus;
+
+ /**
+ * 确认状态
+ */
+ private String confirmStatus;
+
+ /**
+ * 拓展属性集合
+ */
+ private String extras;
+
+ public List performances = new ArrayList<>();
+
+ public String projectNodeName;
+
+ public String nodeVersion;
+
+ public String members;
+
+ /**
+ * 仿真负责人
+ */
+ @JsonProperty(value = "pMemberList")
+ private String pMemberList;
+
+ /**
+ * 仿真执行人
+ */
+ @JsonProperty(value = "eMemberList")
+ private String eMemberList;
+
+ /**
+ * 拓展属性集合
+ */
+ private List extraList;
+
+ private String folderId;
+
+ private String standard;
+ private String analyseTarget;
+ private String confidence;
+ private String analyseSoftware;
+ private String department;
+ private String section;
+ private String sectionName;
+ private String group;
+ private String groupName;
+ @JsonProperty("bCapacity")
+ private String bCapacity;
+ private String flowTemplate;
+ private String englishName;
+ private String description;
+
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+@Data
+public class SpdmTaskMemberVo extends BaseEntity {
+
+ /**
+ * 关联的任务id
+ */
+ private String taskId;
+
+ /**
+ * 成员类型,0:仿真负责人 1:仿真执行人
+ */
+ private Integer type;
+
+ /**
+ * 工号
+ */
+ private String identity;
+
+ /**
+ * 用户名
+ */
+ private String name;
+
+ private Long userId;
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sdm.common.entity.pojo.BaseEntity;
+import com.sdm.common.entity.resp.system.CIDUserResp;
+import com.sdm.project.model.po.TaskNodeExtraPo;
+import com.sdm.project.model.vo.SpdmTaskMemberVo;
+import lombok.Data;
+
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@Data
+public class SpdmTaskVo extends BaseEntity {
+
+ /**
+ * 父节点id,第一级节点的pid为0
+ */
+ private String pid;
+
+ private String pUuid;
+
+
+ /**
+ * 当前节点id
+ */
+ private String uuid;
+
+ /**
+ * 任务名称
+ */
+ private String taskName;
+
+
+ /**
+ * 任务编码
+ */
+ private String taskCode;
+
+ private String nodeId;
+
+
+ /**
+ * 标准工时
+ */
+ private Integer days;
+
+ /**
+ * 实际工时
+ */
+ private Integer realDays;
+
+ private String standard;
+
+ private String folderId;
+
+ private Integer status;
+
+ private String achieveStatus;
+
+ /**
+ * 计划开始(精确到秒)
+ */
+ private String beginTime;
+
+ /**
+ * 计划结束(精确到秒)项目详情图片
+ */
+ private String endTime;
+
+ /**
+ * 实际完成时间(精确到秒)
+ */
+ private String finishTime;
+
+ /**
+ * 项目进度状态
+ */
+ private Integer progress;
+
+
+ /**
+ * 项目进度状态(未开始、进行中、已完成)
+ */
+ private String exeStatus;
+
+ private String confidence;
+
+ private String analyseTarget;
+ private String analyseSoftware;
+ private Integer approvalStatus;
+ private String comfirmStatus;
+ private String description;
+ /**
+ * 难度系数
+ */
+ private Float difficult;
+
+ private String department;
+ private String sectionName;
+ private String groupName;
+ @JsonProperty(value = "bCapacity")
+ private String bCapacity;
+ private String flowTemplate;
+ private String englishName;
+
+
+ /**
+ * 关联的需求id
+ */
+ private String demandId;
+
+ /**
+ * 仿真负责人
+ */
+ @JsonProperty(value = "pMemberList")
+ private List pMemberList;
+
+ /**
+ * 仿真执行人
+ */
+ @JsonProperty(value = "eMemberList")
+ private List eMemberList;
+
+ /**
+ * 0:未关注 1:已关注
+ */
+ private Integer attentionFlag;
+
+ /**
+ * 关联cid交付物审批流程id
+ */
+ private String cidFlowId;
+
+ private String tag1;
+ private String tag2;
+ private String tag3;
+ private String tag4;
+ private String tag5;
+ private String tag6;
+ private String tag7;
+ private String tag8;
+ private String tag9;
+ private String tag10;
+
+ private List extras;
+
+ /**
+ * 关联的需求名称
+ */
+ private String demandName;
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import com.sdm.common.entity.pojo.BaseEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class SpdmUserVo extends BaseEntity {
+
+ /**
+ * 关联的需求id
+ */
+ private String username;
+
+ /**
+ * 成员类型,0:仿真负责人 1:仿真执行人
+ */
+ private Integer type;
+
+ /**
+ * 工号
+ */
+ private String phone;
+
+ /**
+ * 用户名
+ */
+ private String nickname;
+ private String avatar;
+ private String email;
+ private Integer status;
+ private String idCard;
+ private String realName;
+ private String birthProvince;
+ private String birthCity;
+ private Integer sex;
+
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class UserGroupDifficultyStatisticsVo {
+ private Long userId;
+ private String userName;
+ private Map difficultyCount = new HashMap<>();
+ private Integer totalTasks;
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import lombok.Data;
+
+@Data
+public class UserGroupDifficultyVo {
+ private float difficult;
+ private Long userId;
+ private String nickname;
+ private Long groupId;
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import lombok.Data;
+
+/**
+ * 用户项目统计VO
+ */
+@Data
+public class UserGroupProjectVo {
+ private String nodeId;
+ private Long userId;
+ private String nickname;
+ private Long groupId;
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class UserGroupTaskCompleteStatisticsVo {
+ private Long userId;
+ private String userName;
+ private Map statusCount = new HashMap<>();
+ private Integer totalTasks;
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import lombok.Data;
+
+@Data
+public class UserGroupTaskCompleteVo {
+ private String exeStatus;
+ private String nickname;
+ private Long userId;
+ private Long groupId;
+}
+
+
+
+package com.sdm.project.model.vo;
+
+import lombok.Data;
+
+@Data
+public class WorkstationApproveStatusVo {
+ private String tag;
+ private String nodeName;
+ private String approvalStatus;
+}
+
+
+
+package com.sdm.project;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication(scanBasePackages = {"com.sdm.project", "com.sdm.common"})
+@EnableDiscoveryClient
+@EnableScheduling
+@EnableFeignClients(basePackages = "com.sdm.common.feign")
+public class ProjectApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ProjectApplication.class, args);
+ }
+
+}
+
+
+
+package com.sdm.project.service;
+
+import com.sdm.common.common.SdmResponse;
+import com.sdm.common.entity.req.data.UploadFilesReq;
+import com.sdm.common.entity.req.task.DemandExportExcelFormat;
+import com.sdm.common.entity.req.task.TaskExportExcelFormat;
+import com.sdm.project.model.req.*;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public interface IDemandService {
+
+ SdmResponse addDemand(SpdmAddDemandReq req);
+
+
+ SdmResponse editDemand(SpdmEditDemandReq req);
+
+ SdmResponse deleteDemand(SpdmDeleteDemandReq req);
+
+ SdmResponse list(SpdmDemandListReq req);
+
+ SdmResponse issueTask(SpdmTaskIssue req);
+
+ SdmResponse uploadDemandFiles(UploadFilesReq req);
+
+ /**
+ * 导出需求列表
+ * @param demandExportExcelFormat
+ * @param httpservletResponse
+ * @return
+ */
+ SdmResponse exportDemand(DemandExportExcelFormat demandExportExcelFormat , HttpServletResponse httpservletResponse);
+
+ SdmResponse detail(String demandId);
+
+}
+
+
+
+package com.sdm.project.service.impl;
+
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.sdm.common.common.SdmResponse;
+import com.sdm.common.common.ThreadLocalContext;
+import com.sdm.common.entity.ExportExcelFormat;
+import com.sdm.common.entity.enums.DirTypeEnum;
+import com.sdm.common.entity.enums.FilePermissionEnum;
+import com.sdm.common.entity.enums.MessageTemplateEnum;
+import com.sdm.common.entity.req.data.CreateDirReq;
+import com.sdm.common.entity.req.data.UpdatePermissionReq;
+import com.sdm.common.entity.req.data.UploadFilesReq;
+import com.sdm.common.entity.req.system.SendMsgReq;
+import com.sdm.common.entity.req.system.UserQueryReq;
+import com.sdm.common.entity.req.task.DemandExportExcelFormat;
+import com.sdm.common.entity.req.task.DemandExportExcelParam;
+import com.sdm.common.entity.resp.system.CIDUserResp;
+import com.sdm.common.feign.impl.data.DataClientFeignClientImpl;
+import com.sdm.common.feign.impl.system.MessageFeignClientImpl;
+import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
+import com.sdm.common.feign.inter.data.IDataFeignClient;
+import com.sdm.common.service.BaseService;
+import com.sdm.common.utils.RandomUtil;
+import com.sdm.common.utils.excel.ExcelUtil;
+import com.sdm.project.common.MemberTypeEnum;
+import com.sdm.project.common.TaskAchieveStatusEnum;
+import com.sdm.project.common.TaskExeStatusEnum;
+import com.sdm.project.dao.SimulationDemandMapper;
+import com.sdm.project.dao.SimulationNodeMapper;
+import com.sdm.project.dao.SimulationProjectMapper;
+import com.sdm.project.dao.SimulationTaskMapper;
+import com.sdm.project.model.bo.TaskExtraNode;
+import com.sdm.project.model.bo.TaskMemberNode;
+import com.sdm.project.model.bo.TaskNode;
+import com.sdm.project.model.po.ProjectNodePo;
+import com.sdm.project.model.po.TaskNodePo;
+import com.sdm.project.model.req.*;
+import com.sdm.project.model.vo.*;
+import com.sdm.project.service.IDemandService;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.sdm.project.service.impl.NodeServiceImpl.getTagListProperty;
+
+@Slf4j
+@Service
+public class DemandServiceImpl extends BaseService implements IDemandService {
+
+ @Autowired
+ private SimulationDemandMapper mapper;
+
+ @Autowired
+ private SimulationProjectMapper projectMapper;
+
+ @Autowired
+ private SimulationTaskMapper taskMapper;
+
+ @Autowired
+ private SimulationNodeMapper nodeMapper;
+
+ @Autowired
+ private DataClientFeignClientImpl dataClientFeignClient;
+
+ @Autowired
+ private SysUserFeignClientImpl sysUserFeignClient;
+
+ @Autowired
+ private DataClientFeignClientImpl dataFeignClient;
+
+ @Autowired
+ private MessageFeignClientImpl messageFeignClient;
+
+
+ @Transactional
+ @Override
+ public SdmResponse addDemand(SpdmAddDemandReq req) {
+ Long tenantId = ThreadLocalContext.getTenantId();
+ Long jobNumber = ThreadLocalContext.getUserId();
+ log.info("新增需求时,当前租户id为:{},工号为:{}", tenantId, jobNumber);
+ // 获取仿真负责人
+ String pMemberList = req.getPMemberList();
+ // 获取仿真执行人
+ String eMemberList = req.getEMemberList();
+ // 3D负责人
+ String threeDMemberList = req.getTMemberList();
+ // 关注人
+ String attentionMemberList = req.getAMemberList();
+ // 获取需求额外属性
+ List demandExtraList = req.getExtras();
+ String curDateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+ req.setCreateTime(curDateStr);
+ req.setUuid(RandomUtil.generateString(32));
+ SpdmDemandVo demandByName = mapper.getDemandByName(tenantId, req.getDemandName());
+ if (ObjectUtils.isNotEmpty(demandByName)) {
+ return SdmResponse.failed("需求名称:" + demandByName.getDemandName() + "已存在,请修改");
+ }
+ if (mapper.addDemand(req, tenantId, jobNumber) <= 0) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return SdmResponse.failed("新增需求失败!");
+ }
+ long demandId = req.getId();
+ log.info("需求主键id为:{}", demandId);
+ List allMemberList = new ArrayList<>();
+ String uuid = req.getUuid();
+ if (StringUtils.isNotBlank(pMemberList)) {
+ String[] pMemberArray = pMemberList.split(",");
+ for (String userId : pMemberArray) {
+ SpdmDemandRelateMemberReq spdmDemandRelateMemberReq = new SpdmDemandRelateMemberReq();
+ spdmDemandRelateMemberReq.setDemandId(uuid);
+ spdmDemandRelateMemberReq.setType(0);
+ spdmDemandRelateMemberReq.setUserId(Long.valueOf(userId));
+ spdmDemandRelateMemberReq.setCreateTime(curDateStr);
+ spdmDemandRelateMemberReq.setCreator(jobNumber);
+ allMemberList.add(spdmDemandRelateMemberReq);
+ }
+ }
+
+ if (StringUtils.isNotBlank(eMemberList)) {
+ String[] eMemberArray = eMemberList.split(",");
+ for (String userId : eMemberArray) {
+ SpdmDemandRelateMemberReq spdmDemandRelateMemberReq = new SpdmDemandRelateMemberReq();
+ spdmDemandRelateMemberReq.setDemandId(uuid);
+ spdmDemandRelateMemberReq.setType(1);
+ spdmDemandRelateMemberReq.setUserId(Long.valueOf(userId));
+ spdmDemandRelateMemberReq.setCreateTime(curDateStr);
+ spdmDemandRelateMemberReq.setCreator(jobNumber);
+ allMemberList.add(spdmDemandRelateMemberReq);
+ }
+ }
+
+ if (StringUtils.isNotBlank(threeDMemberList)) {
+ String[] threeDMemberArray = threeDMemberList.split(",");
+ for (String userId : threeDMemberArray) {
+ SpdmDemandRelateMemberReq spdmDemandRelateMemberReq = new SpdmDemandRelateMemberReq();
+ spdmDemandRelateMemberReq.setDemandId(uuid);
+ spdmDemandRelateMemberReq.setType(2);
+ spdmDemandRelateMemberReq.setUserId(Long.valueOf(userId));
+ spdmDemandRelateMemberReq.setCreateTime(curDateStr);
+ spdmDemandRelateMemberReq.setCreator(jobNumber);
+ allMemberList.add(spdmDemandRelateMemberReq);
+ }
+ }
+
+ if (StringUtils.isNotBlank(attentionMemberList)) {
+ String[] attentionMemberArray = attentionMemberList.split(",");
+ for (String userId : attentionMemberArray) {
+ SpdmDemandRelateMemberReq spdmDemandRelateMemberReq = new SpdmDemandRelateMemberReq();
+ spdmDemandRelateMemberReq.setDemandId(uuid);
+ spdmDemandRelateMemberReq.setType(3);
+ spdmDemandRelateMemberReq.setUserId(Long.valueOf(userId));
+ spdmDemandRelateMemberReq.setCreateTime(curDateStr);
+ spdmDemandRelateMemberReq.setCreator(jobNumber);
+ allMemberList.add(spdmDemandRelateMemberReq);
+ }
+ }
+
+ if (CollectionUtils.isNotEmpty(allMemberList)) {
+ if (mapper.addDemandMember(allMemberList) <= 0) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return SdmResponse.failed("新增需求关联成员失败!");
+ }
+ }
+ if (CollectionUtils.isNotEmpty(demandExtraList)) {
+ demandExtraList.forEach(demandExtra -> {
+ demandExtra.setDemandId(req.getUuid());
+ demandExtra.setCreateTime(curDateStr);
+ demandExtra.setCreator(jobNumber);
+ });
+ if (mapper.addDemandExtra(demandExtraList) <= 0) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return SdmResponse.failed("新增需求额外属性失败!");
+ }
+ }
+
+ CreateDirReq createDirReq = new CreateDirReq();
+ createDirReq.setUuId(uuid);
+ createDirReq.setParentUuId(null);
+ createDirReq.setDirName(req.getDemandName());
+ createDirReq.setDirType(DirTypeEnum.PROJECT_NODE_DIR.getValue());
+ log.info("创建需求时,调用创建文件夹的参数为:{}", createDirReq);
+ SdmResponse response = dataClientFeignClient.createDir(createDirReq);
+ log.info("创建需求时,调用创建文件夹的返回值为:{}", response);
+ // 更新文件权限
+ Long userId = ThreadLocalContext.getUserId();
+ UpdatePermissionReq updatePermissionReq = new UpdatePermissionReq();
+ updatePermissionReq.setUserId(userId);
+ updatePermissionReq.setUuid(uuid);
+ Map userPermissions = new HashMap<>();
+ userPermissions.put(userId, FilePermissionEnum.ALL.getValue());
+ updatePermissionReq.setUserPermissions(userPermissions);
+ log.info("创建需求时,更新用户权限的参数为:{}",updatePermissionReq);
+ SdmResponse updatePermissionResponse = dataFeignClient.updatePermission(updatePermissionReq);
+ log.info("创建需求时,更新用户权限的返回值为:{}",updatePermissionResponse);
+ return SdmResponse.success(req.getUuid());
+ }
+
+ @Transactional
+ @Override
+ public SdmResponse editDemand(SpdmEditDemandReq req) {
+ Long tenantId = ThreadLocalContext.getTenantId();
+ Long jobNumber = ThreadLocalContext.getUserId();
+ log.info("修改需求时,当前租户id为:{},工号为:{}", tenantId, jobNumber);
+ // 获取仿真负责人
+ String pMemberList = req.getPMemberList();
+ // 获取仿真执行人
+ String eMemberList = req.getEMemberList();
+ // 3D负责人
+ String threeDMemberList = req.getTMemberList();
+ // 关注人
+ String attentionMemberList = req.getAMemberList();
+ // 获取需求额外属性
+ List demandExtraList = req.getExtras();
+ String curDateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+ req.setUpdateTime(curDateStr);
+ if (mapper.editDemand(req, jobNumber) <= 0) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return SdmResponse.failed("修改需求失败!");
+ }
+
+ // 先删除所有成员,然后再添加
+ mapper.deleteDemandMember(Collections.singletonList(req.getUuid()));
+ List allMemberList = new ArrayList<>();
+ String uuid = req.getUuid();
+ if (StringUtils.isNotBlank(pMemberList)) {
+ String[] pMemberArray = pMemberList.split(",");
+ for (String userId : pMemberArray) {
+ SpdmDemandRelateMemberReq spdmDemandRelateMemberReq = new SpdmDemandRelateMemberReq();
+ spdmDemandRelateMemberReq.setDemandId(uuid);
+ spdmDemandRelateMemberReq.setType(0);
+ spdmDemandRelateMemberReq.setUserId(Long.valueOf(userId));
+ spdmDemandRelateMemberReq.setCreateTime(curDateStr);
+ spdmDemandRelateMemberReq.setCreator(jobNumber);
+ allMemberList.add(spdmDemandRelateMemberReq);
+ }
+ }
+
+ if (StringUtils.isNotBlank(eMemberList)) {
+ String[] eMemberArray = eMemberList.split(",");
+ for (String userId : eMemberArray) {
+ SpdmDemandRelateMemberReq spdmDemandRelateMemberReq = new SpdmDemandRelateMemberReq();
+ spdmDemandRelateMemberReq.setDemandId(uuid);
+ spdmDemandRelateMemberReq.setType(1);
+ spdmDemandRelateMemberReq.setUserId(Long.valueOf(userId));
+ spdmDemandRelateMemberReq.setCreateTime(curDateStr);
+ spdmDemandRelateMemberReq.setCreator(jobNumber);
+ allMemberList.add(spdmDemandRelateMemberReq);
+ }
+ }
+
+ if (StringUtils.isNotBlank(threeDMemberList)) {
+ String[] threeDMemberArray = threeDMemberList.split(",");
+ for (String userId : threeDMemberArray) {
+ SpdmDemandRelateMemberReq spdmDemandRelateMemberReq = new SpdmDemandRelateMemberReq();
+ spdmDemandRelateMemberReq.setDemandId(uuid);
+ spdmDemandRelateMemberReq.setType(2);
+ spdmDemandRelateMemberReq.setUserId(Long.valueOf(userId));
+ spdmDemandRelateMemberReq.setCreateTime(curDateStr);
+ spdmDemandRelateMemberReq.setCreator(jobNumber);
+ allMemberList.add(spdmDemandRelateMemberReq);
+ }
+ }
+
+ if (StringUtils.isNotBlank(attentionMemberList)) {
+ String[] attentionMemberArray = attentionMemberList.split(",");
+ for (String userId : attentionMemberArray) {
+ SpdmDemandRelateMemberReq spdmDemandRelateMemberReq = new SpdmDemandRelateMemberReq();
+ spdmDemandRelateMemberReq.setDemandId(uuid);
+ spdmDemandRelateMemberReq.setType(3);
+ spdmDemandRelateMemberReq.setUserId(Long.valueOf(userId));
+ spdmDemandRelateMemberReq.setCreateTime(curDateStr);
+ spdmDemandRelateMemberReq.setCreator(jobNumber);
+ allMemberList.add(spdmDemandRelateMemberReq);
+ }
+ }
+
+ if (CollectionUtils.isNotEmpty(allMemberList)) {
+ if (mapper.addDemandMember(allMemberList) <= 0) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return SdmResponse.failed("修改需求关联成员失败!");
+ }
+ }
+
+ // 先删除所有额外属性,然后再添加
+ mapper.deleteDemandExtra(Collections.singletonList(req.getUuid()));
+ if (CollectionUtils.isNotEmpty(demandExtraList)) {
+ demandExtraList.forEach(demandExtra -> {
+ demandExtra.setDemandId(req.getUuid());
+ demandExtra.setCreateTime(curDateStr);
+ demandExtra.setCreator(jobNumber);
+ });
+ if (mapper.addDemandExtra(demandExtraList) <= 0) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return SdmResponse.failed("修改需求额外属性失败!");
+ }
+ }
+ return SdmResponse.success();
+ }
+
+ @Transactional
+ @Override
+ public SdmResponse deleteDemand(SpdmDeleteDemandReq req) {
+ mapper.deleteDemand(req.getDeleteNodeIdList());
+ mapper.deleteDemandMember(req.getDeleteNodeIdList());
+ mapper.deleteDemandExtra(req.getDeleteNodeIdList());
+ return SdmResponse.success();
+ }
+
+ @Override
+ public SdmResponse list(SpdmDemandListReq req) {
+ Long tenantId = ThreadLocalContext.getTenantId();
+ Long jobNumber = ThreadLocalContext.getUserId();
+ if (ObjectUtils.isEmpty(tenantId) || ObjectUtils.isEmpty(jobNumber)) {
+ log.error("公司和工号都不能为空");
+ return SdmResponse.failed("公司和工号都不能为空");
+ }
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("data", new ArrayList<>());
+ List demandList = mapper.getDemandList(tenantId, req);
+ if (CollectionUtils.isEmpty(demandList)) {
+ log.error("根据tenantId:{},未查询到需求", tenantId);
+ return SdmResponse.success(jsonObject);
+ }
+ // 0:我发起的 1:我确认的
+ Integer type = req.getType();
+ if (type != 0 && type != 1) {
+ log.error("type必须为0或1");
+ return SdmResponse.success(jsonObject);
+ }
+ List demandMemberVoList = mapper.getMemberList(demandList.stream().map(SpdmDemandVo::getUuid).toList(), null);
+ if (CollectionUtils.isEmpty(demandMemberVoList)) {
+ log.error("demandList0为空");
+ return SdmResponse.success(jsonObject);
+ }
+ if (type == 0) {
+ // 创建人是当前用户
+ demandList = demandList.stream().filter(demand -> jobNumber.equals(demand.getCreator())).toList();
+ } else {
+ // 仿真负责人是当前用户
+ demandMemberVoList = demandMemberVoList.stream().filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType()) && Long.valueOf(jobNumber).equals(member.getUserId())).toList();
+ if (CollectionUtils.isNotEmpty(demandMemberVoList)) {
+ List myDemandIdList = demandMemberVoList.stream().map(SpdmDemandMemberVo::getDemandId).toList();
+ demandList = demandList.stream().filter(demand -> myDemandIdList.contains(demand.getUuid())).toList();
+ }
+ }
+ if (CollectionUtils.isEmpty(demandList)) {
+ log.error("demandList1为空");
+ return SdmResponse.success(jsonObject);
+ }
+ List taskList = taskMapper.getTaskListByDemandIdList(demandList.stream().map(SpdmDemandVo::getUuid).toList());
+ Map> taskMap = Map.of();
+ if (CollectionUtils.isNotEmpty(taskList)) {
+ taskMap = taskList.stream().collect(Collectors.groupingBy(SpdmTaskVo::getDemandId));
+ }
+ // 需求的状态和进度需要根据任务来确定
+ if (StringUtils.isNotBlank(req.getAchieveStatus()) || StringUtils.isNotBlank(req.getDemandStatus())) {
+ if (StringUtils.isNotBlank(req.getAchieveStatus())) {
+ if (CollectionUtils.isEmpty(taskList)) {
+ demandList = demandList.stream().filter(firstDemand -> req.getAchieveStatus().equals(firstDemand.getAchieveStatus())).toList();
+ } else {
+ List eachTaskList;
+ String eachStatus;
+ List newDemandList = new ArrayList<>();
+ for (SpdmDemandVo demand : demandList) {
+ eachTaskList = taskMap.get(demand.getUuid());
+ if (CollectionUtils.isEmpty(eachTaskList)) {
+ log.info("当前需求:{}没有关联的任务", demand.getId());
+ newDemandList.add(demand);
+ } else {
+ if (eachTaskList.stream().map(SpdmTaskVo::getAchieveStatus).toList().contains(TaskAchieveStatusEnum.UNQUALIFIED.getCode())) {
+ eachStatus = TaskAchieveStatusEnum.UNQUALIFIED.getCode();
+ } else if (eachTaskList.stream().map(SpdmTaskVo::getAchieveStatus).toList().contains(TaskAchieveStatusEnum.NO_CALCULATE.getCode())) {
+ eachStatus = TaskAchieveStatusEnum.NO_CALCULATE.getCode();
+ } else {
+ eachStatus = TaskAchieveStatusEnum.QUALIFIED.getCode();
+ }
+ log.info("当前需求:{}的风险状态为:{}", demand.getId(), eachStatus);
+ if (!eachStatus.equals(req.getAchieveStatus())) {
+ continue;
+ }
+ newDemandList.add(demand);
+ }
+ }
+ demandList = newDemandList;
+ }
+ }
+
+ if (CollectionUtils.isEmpty(demandList)) {
+ log.error("demandList2为空");
+ return SdmResponse.success(jsonObject);
+ }
+
+ if (StringUtils.isNotBlank(req.getDemandStatus())) {
+ if (CollectionUtils.isEmpty(taskList)) {
+ demandList = demandList.stream().filter(firstDemand -> req.getDemandStatus().equals(firstDemand.getDemandStatus())).toList();
+ } else {
+ List eachTaskList;
+ String eachStatus = "";
+ List newDemandList = new ArrayList<>();
+ for (SpdmDemandVo demand : demandList) {
+ eachTaskList = taskMap.get(demand.getUuid());
+ if (CollectionUtils.isEmpty(eachTaskList)) {
+ log.info("当前需求:{}没有关联的任务", demand.getId());
+ newDemandList.add(demand);
+ } else {
+
+
+// 有进行中就是进行中,
+// 没有进行中,有暂停就是暂停
+// 没有进行中和暂停,有延期就是延期
+// 全部已完成就已完成
+// 全部关闭就已关闭
+// 全部未开始就未开始
+// 全部驳回就驳回
+// 其他 进行中
+
+ List statusList = eachTaskList.stream().map(SpdmTaskVo::getExeStatus).toList();
+ if (statusList.contains(TaskExeStatusEnum.IN_PROGRESS.getCode())) {
+ eachStatus = TaskExeStatusEnum.IN_PROGRESS.getCode();
+ } else if (statusList.contains(TaskExeStatusEnum.PAUSED.getCode())) {
+ eachStatus = TaskExeStatusEnum.PAUSED.getCode();
+ } else if (statusList.contains(TaskExeStatusEnum.POSTPONED.getCode())) {
+ eachStatus = TaskExeStatusEnum.POSTPONED.getCode();
+ } else if (statusList.stream().allMatch(status -> TaskExeStatusEnum.COMPLETED.getCode().equals(status))) {
+ eachStatus = TaskExeStatusEnum.COMPLETED.getCode();
+ } else if (statusList.stream().allMatch(status -> TaskExeStatusEnum.CLOSED.getCode().equals(status))) {
+ eachStatus = TaskExeStatusEnum.CLOSED.getCode();
+ } else if (statusList.stream().allMatch(status -> TaskExeStatusEnum.NO_STARTED.getCode().equals(status))) {
+ eachStatus = TaskExeStatusEnum.NO_STARTED.getCode();
+ } else if (statusList.stream().allMatch(status -> TaskExeStatusEnum.REJECTED.getCode().equals(status))) {
+ eachStatus = TaskExeStatusEnum.REJECTED.getCode();
+ } else {
+ eachStatus = TaskExeStatusEnum.IN_PROGRESS.getCode();
+ }
+ log.info("当前需求:{}的需求状态为:{}", demand.getId(), eachStatus);
+ if (!eachStatus.equals(req.getDemandStatus())) {
+ continue;
+ }
+ newDemandList.add(demand);
+ }
+ }
+ demandList = newDemandList;
+ }
+ }
+ }
+ if (CollectionUtils.isEmpty(demandList)) {
+ log.error("demandList3为空");
+ return SdmResponse.success(jsonObject);
+ }
+
+ jsonObject.put("currentPage", req.getCurrent());
+ jsonObject.put("pageSize", req.getSize());
+ jsonObject.put("total", demandList.size());
+ demandList = demandList.stream().skip((long) (req.getCurrent() - 1) * req.getSize()).limit(req.getSize()).toList();
+ if (CollectionUtils.isEmpty(demandList)) {
+ log.error("demandList4为空");
+ return SdmResponse.success(jsonObject);
+ }
+ List eachTaskList;
+ String eachAchieveStatus;
+ String eachExeStatus;
+ for (SpdmDemandVo demand : demandList) {
+ eachTaskList = taskMap.get(demand.getUuid());
+ if (CollectionUtils.isEmpty(eachTaskList)) {
+ demand.setAchieveStatus("0");
+ continue;
+ }
+ if (eachTaskList.stream().map(SpdmTaskVo::getAchieveStatus).toList().contains(TaskAchieveStatusEnum.UNQUALIFIED.getCode())) {
+ eachAchieveStatus = TaskAchieveStatusEnum.UNQUALIFIED.getCode();
+ } else if (eachTaskList.stream().map(SpdmTaskVo::getAchieveStatus).toList().contains(TaskAchieveStatusEnum.NO_CALCULATE.getCode())) {
+ eachAchieveStatus = TaskAchieveStatusEnum.NO_CALCULATE.getCode();
+ } else {
+ eachAchieveStatus = TaskAchieveStatusEnum.QUALIFIED.getCode();
+ }
+ demand.setAchieveStatus(eachAchieveStatus);
+
+ List statusList = eachTaskList.stream().map(SpdmTaskVo::getExeStatus).toList();
+ if (statusList.contains(TaskExeStatusEnum.IN_PROGRESS.getCode())) {
+ eachExeStatus = TaskExeStatusEnum.IN_PROGRESS.getCode();
+ } else if (statusList.contains(TaskExeStatusEnum.PAUSED.getCode())) {
+ eachExeStatus = TaskExeStatusEnum.PAUSED.getCode();
+ } else if (statusList.contains(TaskExeStatusEnum.POSTPONED.getCode())) {
+ eachExeStatus = TaskExeStatusEnum.POSTPONED.getCode();
+ } else if (statusList.stream().allMatch(status -> TaskExeStatusEnum.COMPLETED.getCode().equals(status))) {
+ eachExeStatus = TaskExeStatusEnum.COMPLETED.getCode();
+ } else if (statusList.stream().allMatch(status -> TaskExeStatusEnum.CLOSED.getCode().equals(status))) {
+ eachExeStatus = TaskExeStatusEnum.CLOSED.getCode();
+ } else if (statusList.stream().allMatch(status -> TaskExeStatusEnum.NO_STARTED.getCode().equals(status))) {
+ eachExeStatus = TaskExeStatusEnum.NO_STARTED.getCode();
+ } else if (statusList.stream().allMatch(status -> TaskExeStatusEnum.REJECTED.getCode().equals(status))) {
+ eachExeStatus = TaskExeStatusEnum.REJECTED.getCode();
+ } else {
+ eachExeStatus = TaskExeStatusEnum.IN_PROGRESS.getCode();
+ }
+ demand.setDemandStatus(eachExeStatus);
+ }
+ Map> demandMemberMap = Map.of();
+ if (CollectionUtils.isNotEmpty(demandMemberVoList)) {
+ demandMemberMap = demandMemberVoList.stream().collect(Collectors.groupingBy(SpdmDemandMemberVo::getDemandId));
+ }
+ List eachDemandMemberList;
+ List nodeIdList = new ArrayList<>();
+ List projectIdList = demandList.stream().map(SpdmDemandVo::getProjectId).toList();
+ if (CollectionUtils.isNotEmpty(projectIdList)) {
+ nodeIdList.addAll(projectIdList);
+ }
+ List phaseIdList = demandList.stream().map(SpdmDemandVo::getPhaseId).toList();
+ if (CollectionUtils.isNotEmpty(phaseIdList)) {
+ nodeIdList.addAll(phaseIdList);
+ }
+ Map> nodeMap = Map.of();
+ if (CollectionUtils.isNotEmpty(nodeIdList)) {
+ List nodeList = nodeMapper.getNodeListByIds(nodeIdList);
+ if (CollectionUtils.isNotEmpty(nodeList)) {
+ nodeMap = nodeList.stream().collect(Collectors.groupingBy(SpdmNodeVo::getUuid));
+ }
+ }
+ List userIdList = demandMemberVoList.stream().map(SpdmDemandMemberVo::getUserId).toList();
+ Map> userMap = Map.of();
+ if (CollectionUtils.isNotEmpty(userIdList)) {
+ SdmResponse> cidUserResp = sysUserFeignClient.listUserByIds(UserQueryReq.builder().userIds(userIdList).build());
+ List userList = cidUserResp.getData();
+ if (CollectionUtils.isNotEmpty(userList)) {
+ userMap = userList.stream().collect(Collectors.groupingBy(CIDUserResp::getUserId));
+ }
+ }
+ List demandIdList = demandList.stream().map(SpdmDemandVo::getUuid).toList();
+ List demandExtraList = mapper.getDemandExtraList(demandIdList);
+ Map> demandExtraMap = Map.of();
+ if (CollectionUtils.isNotEmpty(demandExtraList)) {
+ demandExtraMap = demandExtraList.stream().collect(Collectors.groupingBy(SpdmDemandExtraVo::getDemandId));
+ }
+ for (SpdmDemandVo spdmDemandVo : demandList) {
+ spdmDemandVo.setExtras(demandExtraMap.get(spdmDemandVo.getUuid()));
+ eachTaskList = taskMap.get(spdmDemandVo.getUuid());
+ spdmDemandVo.setProgress(CollectionUtils.isEmpty(eachTaskList) ? 0 : eachTaskList.stream().mapToInt(SpdmTaskVo::getProgress).sum() / eachTaskList.size());
+ if (StringUtils.isNotBlank(spdmDemandVo.getProjectId())) {
+ spdmDemandVo.setProjectName(CollectionUtils.isNotEmpty(nodeMap.get(spdmDemandVo.getProjectId())) ? nodeMap.get(spdmDemandVo.getProjectId()).get(0).getNodeName() : "");
+ }
+ if (StringUtils.isNotBlank(spdmDemandVo.getPhaseId())) {
+ spdmDemandVo.setPhaseName(CollectionUtils.isNotEmpty(nodeMap.get(spdmDemandVo.getPhaseId())) ? nodeMap.get(spdmDemandVo.getPhaseId()).get(0).getNodeName() : "");
+ }
+ eachDemandMemberList = demandMemberMap.get(spdmDemandVo.getUuid());
+ if (CollectionUtils.isEmpty(eachDemandMemberList)) {
+ continue;
+ }
+ List spdmPUserVoList = new ArrayList<>();
+ for (Long userId : eachDemandMemberList.stream().filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType())).map(SpdmDemandMemberVo::getUserId).toList()) {
+ if (ObjectUtils.isNotEmpty(userId) && CollectionUtils.isNotEmpty(userMap.get(userId))) {
+ spdmPUserVoList.addAll(userMap.get(userId));
+ }
+ }
+ spdmDemandVo.setPMemberList(spdmPUserVoList);
+ List spdmEUserVoList = new ArrayList<>();
+ for (Long userId : eachDemandMemberList.stream().filter(member -> MemberTypeEnum.EXECUTOR.getCode().equals(member.getType())).map(SpdmDemandMemberVo::getUserId).toList()) {
+ if (ObjectUtils.isNotEmpty(userId) && CollectionUtils.isNotEmpty(userMap.get(userId))) {
+ spdmEUserVoList.addAll(userMap.get(userId));
+ }
+ }
+ spdmDemandVo.setEMemberList(spdmEUserVoList);
+
+ List spdmTUserVoList = new ArrayList<>();
+ for (Long userId : eachDemandMemberList.stream().filter(member -> MemberTypeEnum.THREED.getCode().equals(member.getType())).map(SpdmDemandMemberVo::getUserId).toList()) {
+ if (ObjectUtils.isNotEmpty(userId) && CollectionUtils.isNotEmpty(userMap.get(userId))) {
+ spdmTUserVoList.addAll(userMap.get(userId));
+ }
+ }
+ spdmDemandVo.setTMemberList(spdmTUserVoList);
+
+ List spdmAUserVoList = new ArrayList<>();
+ for (Long userId : eachDemandMemberList.stream().filter(member -> MemberTypeEnum.ATTENTION.getCode().equals(member.getType())).map(SpdmDemandMemberVo::getUserId).toList()) {
+ if (ObjectUtils.isNotEmpty(userId) && CollectionUtils.isNotEmpty(userMap.get(userId))) {
+ spdmAUserVoList.addAll(userMap.get(userId));
+ }
+ }
+ spdmDemandVo.setAMemberList(spdmAUserVoList);
+ }
+ jsonObject.put("data", demandList);
+ return SdmResponse.success(jsonObject);
+ }
+
+ @Override
+ public SdmResponse issueTask(SpdmTaskIssue issueReq) {
+ log.info("issueTask参数为:{}", issueReq);
+ Long tenantId = ThreadLocalContext.getTenantId();
+ Long jobNumber = ThreadLocalContext.getUserId();
+ SdmResponse response = SdmResponse.success();
+
+ if (CollectionUtils.isNotEmpty(issueReq.getReqList())) {
+ for (SpdmTaskIssueReq req : issueReq.getReqList()) {
+ List taskNodeList = req.getAddNodeList();
+ if (CollectionUtils.isEmpty(taskNodeList)) {
+ return SdmResponse.success(new ArrayList<>());
+ }
+
+ String parentUuid = getLastNodeId(taskNodeList.get(0));
+ log.info("下发任务时,parentId为:{}", parentUuid);
+ String demandId = req.getDemandId();
+ List projectNodeMemberList = new ArrayList<>();
+ List projectNodeExtraList = new ArrayList<>();
+ List allPerformanceList = new ArrayList<>();
+ List allPerformanceExtraList = new ArrayList<>();
+ for (TaskNode task : taskNodeList) {
+ task.setUuid(RandomUtil.generateString(32));
+ task.setDemandId(demandId);
+ task.setTaskName(task.getNodeName());
+ task.setTaskCode(task.getNodeCode());
+ task.setTenantId(tenantId);
+ String pUserIdStr = task.getPMemberList();
+ String eUserIdStr = task.getEMemberList();
+ log.info("下发的仿真负责人为:{}", pUserIdStr);
+ log.info("下发的仿真执行人为:{}", eUserIdStr);
+ if (StringUtils.isNotBlank(pUserIdStr)) {
+ String[] userIdArr = pUserIdStr.split(",");
+ for (String userId : userIdArr) {
+ TaskMemberNode taskMemberNode = new TaskMemberNode();
+ taskMemberNode.setTaskId(task.getUuid());
+ taskMemberNode.setNodeId(task.getUuid());
+ taskMemberNode.setUserId(userId);
+ taskMemberNode.setType(MemberTypeEnum.PRINCIPAL.getCode());
+ projectNodeMemberList.add(taskMemberNode);
+ }
+ }
+ if (StringUtils.isNotBlank(eUserIdStr)) {
+ String[] userIdArr = eUserIdStr.split(",");
+ for (String userId : userIdArr) {
+ TaskMemberNode taskMemberNode = new TaskMemberNode();
+ taskMemberNode.setTaskId(task.getUuid());
+ taskMemberNode.setNodeId(task.getUuid());
+ taskMemberNode.setUserId(userId);
+ taskMemberNode.setType(MemberTypeEnum.EXECUTOR.getCode());
+ projectNodeMemberList.add(taskMemberNode);
+ }
+ }
+ List extraList = task.getExtras();
+ if (CollectionUtils.isNotEmpty(extraList)) {
+ for (TaskExtraNode extra : extraList) {
+ TaskExtraNode taskExtraNode = new TaskExtraNode();
+ taskExtraNode.setTaskId(task.getUuid());
+ taskExtraNode.setNodeId(task.getUuid());
+ taskExtraNode.setPropertyName(extra.getPropertyName());
+ taskExtraNode.setPropertyValue(extra.getPropertyValue());
+ projectNodeExtraList.add(taskExtraNode);
+ }
+ }
+
+ // 指标
+ List performanceList = task.getChildren();
+ for (TaskNode performance : performanceList) {
+ performance.setTaskId(task.getUuid());
+ List performanceExtraList = performance.getExtras();
+ if (CollectionUtils.isNotEmpty(performanceExtraList)) {
+ for (TaskExtraNode extra : performanceExtraList) {
+ extra.setPerformanceId(performance.getUuid());
+ extra.setTaskId(performance.getTaskId());
+ extra.setNodeId(performance.getNodeId());
+ allPerformanceExtraList.add(extra);
+ }
+ }
+ allPerformanceList.add(performance);
+ }
+
+ }
+ String createTime = DateUtil.now();
+ Map taskNodeMap = Map.of();
+ if (CollectionUtils.isNotEmpty(taskNodeList)) {
+ taskNodeList.forEach(projectNode -> {
+ projectNode.setCreator(jobNumber);
+ projectNode.setCreateTime(createTime);
+ });
+ if (projectMapper.batchAddSimulationTask(taskNodeList) <= 0) {
+ response = SdmResponse.failed("新增任务失败");
+ return response;
+ }
+ taskNodeMap = taskNodeList.stream().collect(Collectors.groupingBy(
+ TaskNode::getUuid,
+ Collectors.collectingAndThen(
+ Collectors.toList(),
+ list -> list.get(0)
+ )
+ ));
+ for (TaskNode taskNode : taskNodeList) {
+ createDir(taskNode.getUuid(), parentUuid, taskNode.getNodeName());
+ // 发送消息通知
+ sendMessage(MessageTemplateEnum.TASK_ISSUE, taskNode.getNodeName());
+ }
+ for (TaskNode taskNode : taskNodeList) {
+ // 更新文件权限
+ UpdatePermissionReq updatePermissionReq = new UpdatePermissionReq();
+ updatePermissionReq.setUserId(jobNumber);
+ updatePermissionReq.setUuid(taskNode.getUuid());
+ Map userPermissions = new HashMap<>();
+ userPermissions.put(jobNumber, FilePermissionEnum.ALL.getValue());
+ updatePermissionReq.setUserPermissions(userPermissions);
+ log.info("下发任务时,更新用户权限的参数为:{}",updatePermissionReq);
+ SdmResponse updatePermissionResponse = dataFeignClient.updatePermission(updatePermissionReq);
+ log.info("下发任务时,更新用户权限的返回值为:{}",updatePermissionResponse);
+ }
+ }
+ if (CollectionUtils.isNotEmpty(projectNodeExtraList)) {
+ projectNodeExtraList.forEach(projectNode -> projectNode.setCreateTime(createTime));
+ if (projectMapper.batchAddSimulationTaskExtra(projectNodeExtraList) <= 0) {
+ response = SdmResponse.failed("新增任务附加属性失败");
+ }
+ }
+ if (CollectionUtils.isNotEmpty(projectNodeMemberList)) {
+ projectNodeMemberList.forEach(projectNode -> projectNode.setCreateTime(createTime));
+ if (projectMapper.batchAddSimulationTaskMember(projectNodeMemberList) <= 0) {
+ response = SdmResponse.failed("新增任务成员属性失败");
+ return response;
+ }
+ }
+
+ // 指标
+ if (CollectionUtils.isNotEmpty(allPerformanceList)) {
+ allPerformanceList.forEach(projectNode -> projectNode.setCreateTime(createTime));
+ if (projectMapper.batchAddSimulationPerformance(allPerformanceList) <= 0) {
+ response = SdmResponse.failed("新增指标失败");
+ return response;
+ }
+ for (TaskNode taskNode : allPerformanceList) {
+ UpdatePermissionReq updatePermissionReq = new UpdatePermissionReq();
+ updatePermissionReq.setUserId(jobNumber);
+ updatePermissionReq.setUuid(taskNode.getUuid());
+ Map userPermissions = new HashMap<>();
+ userPermissions.put(jobNumber, FilePermissionEnum.ALL.getValue());
+ updatePermissionReq.setUserPermissions(userPermissions);
+ log.info("下发任务时,更新用户权限的参数为:{}",updatePermissionReq);
+ SdmResponse updatePermissionResponse = dataFeignClient.updatePermission(updatePermissionReq);
+ log.info("下发任务时,更新用户权限的返回值为:{}",updatePermissionResponse);
+ }
+
+ List newTaskNodeList = projectMapper.getTaskListByNodeIdList(allPerformanceList.stream().map(TaskNode::getTaskId).toList());
+ Map taskNodePoMap = Map.of();
+ if (CollectionUtils.isNotEmpty(newTaskNodeList)) {
+ taskNodePoMap = newTaskNodeList.stream().collect(Collectors.groupingBy(
+ TaskNodePo::getUuid,
+ Collectors.collectingAndThen(
+ Collectors.toList(),
+ list -> list.get(0)
+ )
+ ));
+ }
+ for (TaskNode taskNode : allPerformanceList) {
+ if (ObjectUtils.isEmpty(taskNodePoMap.get(taskNode.getTaskId())) && ObjectUtils.isEmpty(taskNodeMap.get(taskNode.getTaskId()))) {
+ log.error("taskNodeMap不空,根据taskId:{},未查询到任务", taskNode.getTaskId());
+ response = SdmResponse.failed("新增指标时,创建文件失败");
+ return response;
+ }
+ createDir(taskNode.getUuid(),
+ ObjectUtils.isNotEmpty(taskNodePoMap.get(taskNode.getTaskId())) ? taskNodePoMap.get(taskNode.getTaskId()).getUuid() : taskNodeMap.get(taskNode.getTaskId()).getUuid(),
+ taskNode.getNodeName());
+ }
+
+ }
+ if (CollectionUtils.isNotEmpty(allPerformanceExtraList)) {
+ allPerformanceExtraList.forEach(projectNode -> projectNode.setCreateTime(createTime));
+ if (projectMapper.batchAddSimulationPerformanceExtra(allPerformanceExtraList) <= 0) {
+ response = SdmResponse.failed("新增任务指标附加属性失败");
+ return response;
+ }
+ }
+ }
+ }
+ return response;
+ }
+
+ private void sendMessage(MessageTemplateEnum templateEnum, String taskName) {
+ SendMsgReq req = new SendMsgReq();
+ req.setTitle(templateEnum.getTitle());
+ req.setContent(templateEnum.getContent(taskName));
+ req.setTenantId(ThreadLocalContext.getTenantId().toString());
+ req.setUserId(ThreadLocalContext.getUserId().toString());
+ messageFeignClient.sendMessage(req);
+ }
+
+ @Override
+ public SdmResponse uploadDemandFiles(UploadFilesReq req) {
+ return dataFeignClient.uploadFiles(req);
+ }
+
+ @Override
+ public SdmResponse exportDemand(DemandExportExcelFormat demandExportExcelFormat, HttpServletResponse httpServletResponse) {
+ SdmResponse response = new SdmResponse();
+ SpdmDemandListReq req = new SpdmDemandListReq();
+ DemandExportExcelParam params = demandExportExcelFormat.getParams();
+ if (ObjectUtils.isNotEmpty(params)) {
+ BeanUtils.copyProperties(params, req);
+ }
+ List exportExcelFormats = demandExportExcelFormat.getExcelHeaders();
+ req.setCurrent(1);
+ req.setSize(10000);
+ SdmResponse taskRespond = list(req);
+ if (taskRespond.isSuccess()) {
+ JSONObject dataObj = (JSONObject) taskRespond.getData();
+ List demandVoList = (List) dataObj.get("data");
+ List exportDemandVoList = new ArrayList<>();
+ List pMemberList;
+ String pMemberName = "";
+ List eMemberList;
+ String eMemberName = "";
+ List tMemberList;
+ String tMemberName = "";
+ List aMemberList;
+ String aMemberName = "";
+ String projectId;
+ String phaseId;
+ List nodeIdList = new ArrayList<>();
+ List projectIdList = demandVoList.stream().map(SpdmDemandVo::getProjectId).distinct().toList();
+ if (CollectionUtils.isNotEmpty(projectIdList)) {
+ nodeIdList.addAll(projectIdList);
+ }
+ List phaseIdList = demandVoList.stream().map(SpdmDemandVo::getPhaseId).distinct().toList();
+ if (CollectionUtils.isNotEmpty(phaseIdList)) {
+ nodeIdList.addAll(phaseIdList);
+ }
+ Map nodeMap = Map.of();
+ if (CollectionUtils.isNotEmpty(nodeIdList)) {
+ List nodeList = projectMapper.getNodeListByNodeIdList(nodeIdList);
+ if (CollectionUtils.isNotEmpty(nodeList)) {
+ nodeMap = nodeList.stream().collect(Collectors.groupingBy(
+ ProjectNodePo::getUuid,
+ Collectors.collectingAndThen(
+ Collectors.toList(),
+ list -> list.get(0)
+ )
+ ));
+ }
+ }
+ for (SpdmDemandVo spdmDemandVo : demandVoList) {
+ // 转换项目、阶段
+ projectId = spdmDemandVo.getProjectId();
+ if (StringUtils.isNotBlank(projectId) && ObjectUtils.isNotEmpty(nodeMap.get(projectId))) {
+ spdmDemandVo.setProjectId(nodeMap.get(projectId).getNodeName());
+ }
+ phaseId = spdmDemandVo.getPhaseId();
+ if (StringUtils.isNotBlank(phaseId) && ObjectUtils.isNotEmpty(nodeMap.get(phaseId))) {
+ spdmDemandVo.setPhaseId(nodeMap.get(phaseId).getNodeName());
+ }
+ pMemberList = spdmDemandVo.getPMemberList();
+ if (CollectionUtils.isNotEmpty(pMemberList)) {
+ pMemberName = pMemberList.stream().map(CIDUserResp::getNickname).collect(Collectors.joining(","));
+ }
+ eMemberList = spdmDemandVo.getPMemberList();
+ if (CollectionUtils.isNotEmpty(eMemberList)) {
+ eMemberName = eMemberList.stream().map(CIDUserResp::getNickname).collect(Collectors.joining(","));
+ }
+ tMemberList = spdmDemandVo.getTMemberList();
+ if (CollectionUtils.isNotEmpty(tMemberList)) {
+ tMemberName = tMemberList.stream().map(CIDUserResp::getNickname).collect(Collectors.joining(","));
+ }
+ aMemberList = spdmDemandVo.getPMemberList();
+ if (CollectionUtils.isNotEmpty(aMemberList)) {
+ aMemberName = aMemberList.stream().map(CIDUserResp::getNickname).collect(Collectors.joining(","));
+ }
+ SpdmExportDemandVo spdmExportDemandVo = new SpdmExportDemandVo();
+ BeanUtils.copyProperties(spdmDemandVo, spdmExportDemandVo);
+ spdmExportDemandVo.setPMemberList(pMemberName);
+ spdmExportDemandVo.setEMemberList(eMemberName);
+ spdmExportDemandVo.setTMemberList(tMemberName);
+ spdmExportDemandVo.setAMemberList(aMemberName);
+ exportDemandVoList.add(spdmExportDemandVo);
+ }
+ ExcelUtil.exportExcelNoMerge(JSONArray.from(exportDemandVoList), exportExcelFormats, httpServletResponse);
+ } else {
+ response = SdmResponse.failed(taskRespond.getMessage());
+ }
+ return response;
+ }
+
+ @Override
+ public SdmResponse detail(String demandId) {
+ List demandList = mapper.getDemandListById(Collections.singletonList(demandId));
+ if (CollectionUtils.isEmpty(demandList)) {
+ return SdmResponse.success(new ArrayList<>());
+ }
+ SpdmDemandVo spdmDemandVo = demandList.get(0);
+ List demandMemberVoList = mapper.getMemberList(Collections.singletonList(spdmDemandVo.getUuid()), null);
+ List demandExtraList = mapper.getDemandExtraList(Collections.singletonList(demandId));
+ Map> demandExtraMap = Map.of();
+ if (CollectionUtils.isNotEmpty(demandExtraList)) {
+ demandExtraMap = demandExtraList.stream().collect(Collectors.groupingBy(SpdmDemandExtraVo::getDemandId));
+ }
+ List nodeIdList = new ArrayList<>();
+ String projectId = spdmDemandVo.getProjectId();
+ if (StringUtils.isNotBlank(projectId)) {
+ nodeIdList.add(projectId);
+ }
+ String phaseId = spdmDemandVo.getPhaseId();
+ if (StringUtils.isNotBlank(phaseId)) {
+ nodeIdList.add(phaseId);
+ }
+ Map> nodeMap = Map.of();
+ if (CollectionUtils.isNotEmpty(nodeIdList)) {
+ List nodeList = nodeMapper.getNodeListByIds(nodeIdList);
+ if (CollectionUtils.isNotEmpty(nodeList)) {
+ nodeMap = nodeList.stream().collect(Collectors.groupingBy(SpdmNodeVo::getUuid));
+ }
+ }
+ List taskList = taskMapper.getTaskListByDemandIdList(demandList.stream().map(SpdmDemandVo::getUuid).toList());
+ Map> taskMap = Map.of();
+ if (CollectionUtils.isNotEmpty(taskList)) {
+ taskMap = taskList.stream().collect(Collectors.groupingBy(SpdmTaskVo::getDemandId));
+ }
+ spdmDemandVo.setExtras(demandExtraMap.get(spdmDemandVo.getUuid()));
+ List taskVoList = taskMap.get(spdmDemandVo.getUuid());
+ spdmDemandVo.setProgress(CollectionUtils.isEmpty(taskVoList) ? 0 : taskVoList.stream().mapToInt(SpdmTaskVo::getProgress).sum() / taskVoList.size());
+ if (StringUtils.isNotBlank(spdmDemandVo.getProjectId())) {
+ spdmDemandVo.setProjectName(CollectionUtils.isNotEmpty(nodeMap.get(spdmDemandVo.getProjectId())) ? nodeMap.get(spdmDemandVo.getProjectId()).get(0).getNodeName() : "");
+ }
+ if (StringUtils.isNotBlank(spdmDemandVo.getPhaseId())) {
+ spdmDemandVo.setPhaseName(CollectionUtils.isNotEmpty(nodeMap.get(spdmDemandVo.getPhaseId())) ? nodeMap.get(spdmDemandVo.getPhaseId()).get(0).getNodeName() : "");
+ }
+ List userIdList = demandMemberVoList.stream().map(SpdmDemandMemberVo::getUserId).toList();
+ Map> userMap = Map.of();
+ if (CollectionUtils.isNotEmpty(userIdList)) {
+ SdmResponse> cidUserResp = sysUserFeignClient.listUserByIds(UserQueryReq.builder().userIds(userIdList).build());
+ List userList = cidUserResp.getData();
+ if (CollectionUtils.isNotEmpty(userList)) {
+ userMap = userList.stream().collect(Collectors.groupingBy(CIDUserResp::getUserId));
+ }
+ }
+ if (CollectionUtils.isNotEmpty(demandMemberVoList)) {
+ List spdmPUserVoList = new ArrayList<>();
+ for (Long userId : demandMemberVoList.stream().filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType())).map(SpdmDemandMemberVo::getUserId).toList()) {
+ if (ObjectUtils.isNotEmpty(userId) && CollectionUtils.isNotEmpty(userMap.get(userId))) {
+ spdmPUserVoList.addAll(userMap.get(userId));
+ }
+ }
+ spdmDemandVo.setPMemberList(spdmPUserVoList);
+ List spdmEUserVoList = new ArrayList<>();
+ for (Long userId : demandMemberVoList.stream().filter(member -> MemberTypeEnum.EXECUTOR.getCode().equals(member.getType())).map(SpdmDemandMemberVo::getUserId).toList()) {
+ if (ObjectUtils.isNotEmpty(userId) && CollectionUtils.isNotEmpty(userMap.get(userId))) {
+ spdmEUserVoList.addAll(userMap.get(userId));
+ }
+ }
+ spdmDemandVo.setEMemberList(spdmEUserVoList);
+ List spdmTUserVoList = new ArrayList<>();
+ for (Long userId : demandMemberVoList.stream().filter(member -> MemberTypeEnum.THREED.getCode().equals(member.getType())).map(SpdmDemandMemberVo::getUserId).toList()) {
+ if (ObjectUtils.isNotEmpty(userId) && CollectionUtils.isNotEmpty(userMap.get(userId))) {
+ spdmTUserVoList.addAll(userMap.get(userId));
+ }
+ }
+ spdmDemandVo.setTMemberList(spdmTUserVoList);
+
+ List spdmAUserVoList = new ArrayList<>();
+ for (Long userId : demandMemberVoList.stream().filter(member -> MemberTypeEnum.ATTENTION.getCode().equals(member.getType())).map(SpdmDemandMemberVo::getUserId).toList()) {
+ if (ObjectUtils.isNotEmpty(userId) && CollectionUtils.isNotEmpty(userMap.get(userId))) {
+ spdmAUserVoList.addAll(userMap.get(userId));
+ }
+ }
+ spdmDemandVo.setAMemberList(spdmAUserVoList);
+ }
+ return SdmResponse.success(spdmDemandVo);
+ }
+
+ private String getLastNodeId(TaskNode taskNode) {
+ List tagListProperty;
+ String lastNodeId = "";
+ for (int i = 1; i <= 10; i++) {
+ try {
+ tagListProperty = getTagListProperty(taskNode, "tag" + i);
+ if (CollectionUtils.isNotEmpty(tagListProperty)) {
+ lastNodeId = tagListProperty.get(tagListProperty.size() - 1);
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ return projectMapper.getNodeListByNodeIdList(Collections.singletonList(lastNodeId)).get(0).getUuid();
+ }
+
+// @Override
+// public SdmResponse issueTask(SpdmTaskIssue req) {
+// log.info("issueTask参数为:{}", req);
+// List taskNodeList = req.getAddNodeList();
+// if (CollectionUtils.isEmpty(taskNodeList)) {
+// return SdmResponse.success(new ArrayList<>());
+// }
+// List idMapList = req.getIdMap();
+// idMapList = idMapList.stream().filter(idMap -> null != idMap.getKey() &&!"null".equals(idMap.getKey())).toList();
+// if (CollectionUtils.isEmpty(idMapList)) {
+// return SdmResponse.success(new ArrayList<>());
+// }
+// TaskNodeTag taskNodeTag = idMapList.get(idMapList.size() - 1);
+// List nodeListByNodeIdList = projectMapper.getNodeListByNodeIdList(Collections.singletonList(taskNodeTag.getKey()));
+// if (CollectionUtils.isEmpty(nodeListByNodeIdList)) {
+// return SdmResponse.success(new ArrayList<>());
+// }
+// long parentId = nodeListByNodeIdList.get(0).getId();
+// log.info("issueTask的idMap最后一层非空节点为:{}",taskNodeTag);
+// String demandId = req.getDemandId();
+// List projectNodeMemberList = new ArrayList<>();
+// List projectNodeExtraList = new ArrayList<>();
+// List allPerformanceList = new ArrayList<>();
+// List allPerformanceExtraList = new ArrayList<>();
+// for (TaskNode task : taskNodeList) {
+// for (TaskNodeTag tag : idMapList) {
+// try {
+// setTagProperty(task, tag.getValue(), Arrays.stream(tag.getKey().split(",")).toList());
+// } catch (Exception e) {
+// throw new RuntimeException(e);
+// }
+// }
+// task.setUuid(generateUuid());
+// task.setDemandId(demandId);
+// task.setTaskName(task.getNodeName());
+// task.setTaskCode(task.getNodeCode());
+// List taskMemberNodeList = task.getMemberList();
+// if (CollectionUtils.isNotEmpty(taskMemberNodeList)) {
+// for (TaskMemberNode member : taskMemberNodeList) {
+// TaskMemberNode taskMemberNode = new TaskMemberNode();
+// taskMemberNode.setTaskId(task.getUuid());
+// taskMemberNode.setNodeId(task.getUuid());
+// taskMemberNode.setIdentity(member.getIdentity());
+// taskMemberNode.setName(member.getName());
+// taskMemberNode.setUserId(member.getUserId());
+// taskMemberNode.setType(member.getType());
+// projectNodeMemberList.add(taskMemberNode);
+// }
+// }
+// List extraList = task.getTaskExtraNodeList();
+// if (CollectionUtils.isNotEmpty(extraList)) {
+// for (TaskExtraNode extra : extraList) {
+// TaskExtraNode taskExtraNode = new TaskExtraNode();
+// taskExtraNode.setTaskId(task.getUuid());
+// taskExtraNode.setNodeId(task.getUuid());
+// taskExtraNode.setPropertyName(extra.getPropertyName());
+// taskExtraNode.setPropertyValue(extra.getPropertyValue());
+// projectNodeExtraList.add(taskExtraNode);
+// }
+// }
+//
+// // 指标
+// List performanceList = task.getChildren();
+// for (TaskNode performance : performanceList) {
+// performance.setTaskId(task.getUuid());
+// List performanceExtraList = performance.getTaskExtraNodeList();
+// if (CollectionUtils.isNotEmpty(performanceExtraList)) {
+// for (TaskExtraNode extra : performanceExtraList) {
+// extra.setPerformanceId(performance.getUuid());
+// extra.setTaskId(performance.getTaskId());
+// extra.setNodeId(performance.getNodeId());
+// allPerformanceExtraList.add(extra);
+// }
+// }
+// allPerformanceList.add(performance);
+// }
+//
+// }
+// String jobNumber = ThreadLocalContext.getCommonHeader().getJobNumber();
+// SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+// String createTime = format.format(new Date());
+// SdmResponse response = SdmResponse.success();
+// Map taskNodeMap = Map.of();
+// if (CollectionUtils.isNotEmpty(taskNodeList)) {
+// taskNodeList.forEach(projectNode -> {
+// projectNode.setCreator(jobNumber);
+// projectNode.setCreateTime(createTime);
+// });
+// if (projectMapper.batchAddSimulationTask(taskNodeList) <= 0) {
+// response = SdmResponse.failed("新增任务失败");
+// return response;
+// }
+// taskNodeMap = taskNodeList.stream().collect(Collectors.groupingBy(
+// TaskNode::getUuid,
+// Collectors.collectingAndThen(
+// Collectors.toList(),
+// list -> list.get(0)
+// )
+// ));
+// for (TaskNode taskNode : taskNodeList) {
+// createDir(taskNode.getId(),parentId, taskNode.getNodeName());
+// }
+// }
+// if (CollectionUtils.isNotEmpty(projectNodeExtraList)) {
+// projectNodeExtraList.forEach(projectNode -> projectNode.setCreateTime(createTime));
+// if (projectMapper.batchAddSimulationTaskExtra(projectNodeExtraList) <= 0) {
+// response = SdmResponse.failed("新增任务附加属性失败");
+// }
+// }
+// if (CollectionUtils.isNotEmpty(projectNodeMemberList)) {
+// projectNodeMemberList.forEach(projectNode -> projectNode.setCreateTime(createTime));
+// if (projectMapper.batchAddSimulationTaskMember(projectNodeMemberList) <= 0) {
+// response = SdmResponse.failed("新增任务成员属性失败");
+// return response;
+// }
+// }
+//
+//
+// // 指标
+// if (CollectionUtils.isNotEmpty(allPerformanceList)) {
+// allPerformanceList.forEach(projectNode -> projectNode.setCreateTime(createTime));
+// if (projectMapper.batchAddSimulationPerformance(allPerformanceList) <= 0) {
+// response = SdmResponse.failed("新增指标失败");
+// return response;
+// }
+//
+// List newTaskNodeList = projectMapper.getTaskListByNodeIdList(allPerformanceList.stream().map(TaskNode::getTaskId).toList());
+// Map taskNodePoMap = Map.of();
+// if (CollectionUtils.isNotEmpty(newTaskNodeList)) {
+// taskNodePoMap = newTaskNodeList.stream().collect(Collectors.groupingBy(
+// TaskNodePo::getUuid,
+// Collectors.collectingAndThen(
+// Collectors.toList(),
+// list -> list.get(0)
+// )
+// ));
+// }
+// for (TaskNode taskNode : allPerformanceList) {
+// if (ObjectUtils.isEmpty(taskNodePoMap.get(taskNode.getTaskId())) && ObjectUtils.isEmpty(taskNodeMap.get(taskNode.getTaskId()))) {
+// log.error("taskNodeMap不空,根据taskId:{},未查询到任务", taskNode.getTaskId());
+// response = SdmResponse.failed("新增指标时,创建文件失败");
+// return response;
+// }
+// createDir(taskNode.getId(),
+// ObjectUtils.isNotEmpty(taskNodePoMap.get(taskNode.getTaskId())) ? taskNodePoMap.get(taskNode.getTaskId()).getId() : taskNodeMap.get(taskNode.getTaskId()).getId(),
+// taskNode.getNodeName());
+// }
+//
+// }
+// if (CollectionUtils.isNotEmpty(allPerformanceExtraList)) {
+// allPerformanceExtraList.forEach(projectNode -> projectNode.setCreateTime(createTime));
+// if (projectMapper.batchAddSimulationPerformanceExtra(allPerformanceExtraList) <= 0) {
+// response = SdmResponse.failed("新增任务指标附加属性失败");
+// return response;
+// }
+// }
+//
+// return response;
+// }
+
+
+ private void createDir(String uuid, String parentUuid, String dirName) {
+ CreateDirReq createDirReq = new CreateDirReq();
+ createDirReq.setUuId(uuid);
+ createDirReq.setParentUuId(parentUuid);
+ createDirReq.setDirName(dirName);
+ log.info("下发任务调用创建文件夹的参数为:{}", createDirReq);
+ SdmResponse response = dataClientFeignClient.createDir(createDirReq);
+ log.info("下发任务调用创建文件夹的返回值为:{}", response);
+ }
+
+}
+
+
+
+package com.sdm.project.service.impl;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sdm.common.common.ResultCode;
+import com.sdm.common.common.SdmResponse;
+import com.sdm.common.common.ThreadLocalContext;
+import com.sdm.common.entity.ExportExcelFormat;
+import com.sdm.common.entity.bo.DataDictionary;
+import com.sdm.common.entity.constants.TagConstant;
+import com.sdm.common.entity.enums.DirTypeEnum;
+import com.sdm.common.entity.enums.FilePermissionEnum;
+import com.sdm.common.entity.enums.NodeTypeEnum;
+import com.sdm.common.entity.req.data.*;
+import com.sdm.common.entity.req.project.*;
+import com.sdm.common.entity.req.system.QueryGroupDetailReq;
+import com.sdm.common.entity.req.system.UserQueryReq;
+import com.sdm.common.entity.resp.AllNodeByProjectIdAndTypeResp;
+import com.sdm.common.entity.resp.project.SimulationNodeResp;
+import com.sdm.common.entity.resp.system.CIDUserResp;
+import com.sdm.common.entity.resp.system.SysUserGroupDetailResp;
+import com.sdm.common.feign.impl.data.DataClientFeignClientImpl;
+import com.sdm.common.feign.impl.system.SysConfigFeignClientImpl;
+import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
+import com.sdm.common.feign.inter.data.IDataFeignClient;
+import com.sdm.common.log.CoreLogger;
+import com.sdm.common.utils.DateUtils;
+import com.sdm.common.utils.RandomUtil;
+import com.sdm.common.utils.excel.ExcelUtil;
+import com.sdm.project.dao.SimulationDemandMapper;
+import com.sdm.project.dao.SimulationNodeMapper;
+import com.sdm.project.dao.SimulationProjectMapper;
+import com.sdm.project.model.bo.TaskExtraNode;
+import com.sdm.project.model.bo.TaskNode;
+import com.sdm.project.model.bo.TaskNodeTag;
+import com.sdm.project.model.entity.SimulationNode;
+import com.sdm.project.model.entity.SimulationRun;
+import com.sdm.project.model.entity.SimulationTask;
+import com.sdm.project.model.entity.SimulationTaskMember;
+import com.sdm.project.model.po.PerformanceNodePo;
+import com.sdm.project.model.po.ProjectNodePo;
+import com.sdm.project.model.po.TaskNodePo;
+import com.sdm.project.model.req.*;
+import com.sdm.project.model.req.YA.SyncCidProjectReq;
+import com.sdm.project.model.resp.YA.BosimSaveProjectTaskRsp;
+import com.sdm.project.model.vo.*;
+import com.sdm.project.service.*;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import javax.annotation.Resource;
+import java.lang.reflect.Field;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class NodeServiceImpl extends ServiceImpl implements INodeService {
+
+ @Resource
+ private SimulationNodeMapper nodeMapper;
+
+ @Autowired
+ private SimulationProjectMapper mapper;
+
+ @Autowired
+ private DataClientFeignClientImpl dataClientFeignClient;
+
+ @Autowired
+ private ISimulationTaskService simulationTaskService;
+
+ @Autowired
+ private ISimulationRunService simulationRunService;
+
+ @Autowired
+ private ISimulationTaskMemberService simulationTaskMemberService;
+
+ @Resource
+ private SimulationDemandMapper demandMapper;
+
+ @Autowired
+ private SysUserFeignClientImpl sysUserFeignClient;
+
+ @Autowired
+ IProjectService projectService;
+
+ @Autowired
+ private IDataFeignClient dataFeignClient;
+
+ @Autowired
+ private SysConfigFeignClientImpl sysConfigFeignClient;
+
+ @Value("${node.batch.queryCounts:1000}")
+ private Integer queryCounts;
+
+ private HashMap idMap = new HashMap<>();
+
+ @Autowired
+ private SimulationProjectMapper projectMapper;
+
+
+ @Transactional
+ @Override
+ public SdmResponse add(SpdmAddNodeReq req) {
+ Long tenantId = ThreadLocalContext.getTenantId();
+ Long jobNumber = ThreadLocalContext.getUserId();
+ log.info("当前租户id为:{},工号为:{}", tenantId, jobNumber);
+ // 增
+ List addNodeList = req.getAddNodeList();
+ if (CollectionUtils.isEmpty(addNodeList)) {
+ return SdmResponse.failed("addNodeList不能为空!");
+ }
+ for (SpdmProjectNodeEditReq addNode : addNodeList) {
+ // 项目/阶段名称重名校验
+ if (CollectionUtils.isNotEmpty(this.lambdaQuery().eq(SimulationNode::getNodeName, addNode.getNodeName()).list())) {
+ if (NodeTypeEnum.PROJECT.getValue().equals(addNode.getNodeType())) {
+ return SdmResponse.failed("同名项目已存在,请检查");
+ }
+ }
+ if (StringUtils.isNotBlank(addNode.getEndTime()) && StringUtils.isNotBlank(addNode.getBeginTime())) {
+ if (DateUtils.parse(addNode.getEndTime(), DateUtils.PATTERN_DEFAULT).before(DateUtils.parse(addNode.getBeginTime(), DateUtils.PATTERN_DEFAULT))) {
+ return SdmResponse.failed("计划结束时间不能早于计划开始时间");
+ }
+ }
+ }
+ List tagMap = req.getTagMap();
+ // 手动回滚数据
+ addNodeList = addNode(addNodeList, tagMap, tenantId, jobNumber);
+ if (CollectionUtils.isEmpty(addNodeList)) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return SdmResponse.failed("操作节点失败,原因:新增节点时失败!");
+ }
+ for (SpdmProjectNodeEditReq addNode : addNodeList) {
+ // 更新文件权限
+ Long userId = ThreadLocalContext.getUserId();
+ UpdatePermissionReq updatePermissionReq = new UpdatePermissionReq();
+ updatePermissionReq.setUserId(userId);
+ updatePermissionReq.setUuid(addNode.getUuid());
+ Map userPermissions = new HashMap<>();
+ userPermissions.put(userId, FilePermissionEnum.ALL.getValue());
+ updatePermissionReq.setUserPermissions(userPermissions);
+ log.info("创建项目阶段时,更新用户权限的参数为:{}",updatePermissionReq);
+ SdmResponse updatePermissionResponse = dataFeignClient.updatePermission(updatePermissionReq);
+ log.info("创建项目阶段时,更新用户权限的返回值为:{}",updatePermissionResponse);
+ }
+ return SdmResponse.success(addNodeList);
+ }
+
+ @Transactional
+ @Override
+ public SdmResponse edit(SpdmEditNodeReq req) {
+ Long tenantId = ThreadLocalContext.getTenantId();
+ Long jobNumber = ThreadLocalContext.getUserId();
+ log.info("当前租户id为:{},jobNumber:{}", tenantId, jobNumber);
+ // 改
+ List editNodeList = req.getEditNodeList();
+ if (CollectionUtils.isNotEmpty(editNodeList)) {
+ for (SpdmNodeDetailReq editNode : editNodeList) {
+ // 项目/阶段名称重名校验
+ if (CollectionUtils.isNotEmpty(this.lambdaQuery().eq(SimulationNode::getNodeName, editNode.getNodeName()).ne(SimulationNode::getUuid, editNode.getUuid()).list())) {
+ if (NodeTypeEnum.PROJECT.getValue().equals(editNode.getNodeType())) {
+ return SdmResponse.failed("同名项目已存在,请检查");
+ }
+ }
+ if (StringUtils.isNotBlank(editNode.getEndTime()) && StringUtils.isNotBlank(editNode.getBeginTime())) {
+ if (DateUtils.parse(editNode.getEndTime(), DateUtils.PATTERN_DEFAULT).before(DateUtils.parse(editNode.getBeginTime(), DateUtils.PATTERN_DEFAULT))) {
+ return SdmResponse.failed("计划结束时间不能早于计划开始时间");
+ }
+ }
+ renameDirNew(editNode.getUuid(),editNode.getNodeName());
+ }
+ // 手动回滚数据
+ if (!editNode(editNodeList, tenantId, jobNumber)) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return SdmResponse.failed("操作节点失败,原因:更新节点时失败!");
+ }
+ }
+ return SdmResponse.success();
+ }
+
+ @Transactional
+ @Override
+ public SdmResponse delete(SpdmDeleteNodeReq req) {
+ log.info("node delete参数:{}", req);
+ Long tenantId = ThreadLocalContext.getTenantId();
+ log.info("当前租户id为:{}", tenantId);
+ // 删
+ List deleteNodeIdList = req.getDeleteNodeIdList();
+ if (CollectionUtils.isNotEmpty(deleteNodeIdList)) {
+ // 手动回滚数据
+ if (!deleteNode(deleteNodeIdList)) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return SdmResponse.failed("操作节点失败,原因:删除节点时失败!");
+ }
+ deleteDirNew(deleteNodeIdList);
+ }
+ return SdmResponse.success();
+ }
+
+ // 删除文件夹
+ public boolean deleteDirNew(List uuidList) {
+ for (String uuid : uuidList) {
+ DelDirReq req = new DelDirReq();
+ req.setDelUuid(uuid);
+ log.info("调用删除文件夹的参数为:{}", req);
+ SdmResponse response = dataClientFeignClient.delDir(req);
+ log.info("调用删除文件夹的返回值为:{}", response);
+ if (response.getCode() != ResultCode.SUCCESS.getCode()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+
+ private boolean deleteNode(List deleteNodeIdList) {
+ List projectNodePoList = nodeMapper.allList(deleteNodeIdList);
+ if (CollectionUtils.isEmpty(projectNodePoList)) {
+ log.error("删除节点时,未查询到节点信息");
+ return false;
+ }
+ // 删除当前节点及子节点信息
+ if (nodeMapper.deleteNodeBatch(deleteNodeIdList) <= 0) {
+ return false;
+ }
+ // 删除当前节点及子节点的额外信息
+ nodeMapper.deleteNodeExtraBatch(deleteNodeIdList);
+ // 删除当前节点及子节点的成员信息
+ nodeMapper.deleteNodeMemberBatch(deleteNodeIdList);
+ // 删除当前节点及子节点下的分析项相关信息
+ List taskNodePoList = nodeMapper.getTaskListByNodeIdList(deleteNodeIdList);
+ if (CollectionUtils.isEmpty(taskNodePoList)) {
+ return true;
+ }
+ nodeMapper.deleteTaskBatch(deleteNodeIdList);
+ List taskIdList = taskNodePoList.stream().map(TaskNodePo::getUuid).toList();
+ nodeMapper.deleteTaskExtraBatch(taskIdList);
+ nodeMapper.deleteTaskMemberBatch(taskIdList);
+ // 删除当前节点及子节点下的指标相关信息
+ List performanceNodePoList = nodeMapper.getPerformanceListByNodeIdList(taskIdList);
+ if (CollectionUtils.isEmpty(performanceNodePoList)) {
+ return true;
+ }
+ List performanceIdList = performanceNodePoList.stream().map(PerformanceNodePo::getId).toList();
+ nodeMapper.deletePerformanceBatch(performanceIdList);
+ nodeMapper.deletePerformanceExtraBatch(performanceIdList);
+ List childrenNodeList = nodeMapper.getNodeListByNodeIdList(deleteNodeIdList);
+ if (CollectionUtils.isEmpty(childrenNodeList)) {
+ return true;
+ }
+ return deleteNode(childrenNodeList.stream().map(SpdmNodeVo::getUuid).toList());
+ }
+
+ @Override
+ public SdmResponse list(SpdmNodeListReq req) {
+ int pos = (req.getCurrent() - 1) * req.getSize();
+ int limit = req.getSize();
+ Long tenantId = ThreadLocalContext.getTenantId();
+ List nodeList = nodeMapper.getNodeList(req.getNodeType(), req.getNodeSubType(), req.getExeStatus(), req.getNodeCode(), req.getManager(), req.getNodeName(),
+ tenantId, pos, limit);
+ CoreLogger.info("getNodeList param:{},tenantId:{}", JSONObject.toJSONString(req), tenantId);
+ if (CollectionUtils.isEmpty(nodeList)) {
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("data", nodeList);
+ jsonObject.put("total", 0);
+ return SdmResponse.success(jsonObject);
+ }
+ int total = nodeMapper.getNodeListCount(req.getNodeType(), req.getNodeSubType(), req.getProgressStatus(), req.getNodeCode(), req.getManager(), req.getNodeName(), ThreadLocalContext.getTenantId());
+ log.info("总数为:{}", total);
+ Integer progressStatus;
+ Integer achieveStatus;
+ // 查询节点的额外属性
+ List nodeIdList = nodeList.stream().map(SpdmNodeVo::getUuid).toList();
+ List spdmNodeMemberVoList = nodeMapper.getNodeMemberListByNodeIdList(nodeIdList);
+ if (CollectionUtils.isNotEmpty(spdmNodeMemberVoList)) {
+ List usewrIdList = spdmNodeMemberVoList.stream().map(SpdmNodeMemberVo::getUserId).distinct().toList();
+ SdmResponse> cidUserResp = sysUserFeignClient.listUserByIds(UserQueryReq.builder().userIds(usewrIdList).build());
+ List userList = cidUserResp.getData();
+
+ Map> userMap = Map.of();
+ if (CollectionUtils.isNotEmpty(userList)) {
+ userMap = userList.stream().collect(Collectors.groupingBy(CIDUserResp::getUserId));
+ }
+ String nodeId;
+ // 关联到节点上
+ Map> nodeMemberMap = spdmNodeMemberVoList.stream().collect(Collectors.groupingBy(SpdmNodeMemberVo::getNodeId));
+ for (Map.Entry> nodeMemberEntry : nodeMemberMap.entrySet()) {
+ List memberList = new ArrayList<>();
+ nodeId = nodeMemberEntry.getKey();
+ for (SpdmNodeVo spdmNodeVo : nodeList) {
+ if (nodeId.equals(spdmNodeVo.getUuid())) {
+ for (SpdmNodeMemberVo spdmNodeMemberVo : nodeMemberEntry.getValue()) {
+ if (CollectionUtils.isNotEmpty(userMap.get(spdmNodeMemberVo.getUserId()))) {
+ memberList.add(userMap.get(spdmNodeMemberVo.getUserId()).get(0));
+ }
+ }
+ spdmNodeVo.setMemberList(memberList);
+ }
+ }
+ }
+
+
+ }
+ List spdmNodeExtraVoList = nodeMapper.getNodeExtraListByNodeIdList(nodeIdList);
+ if (CollectionUtils.isNotEmpty(spdmNodeExtraVoList)) {
+ String nodeId;
+ // 关联到节点上
+ Map> nodeExtraMap = spdmNodeExtraVoList.stream().collect(Collectors.groupingBy(SpdmNodeExtraVo::getNodeId));
+ for (Map.Entry> nodeExtraEntry : nodeExtraMap.entrySet()) {
+ nodeId = nodeExtraEntry.getKey();
+ for (SpdmNodeVo spdmNodeVo : nodeList) {
+ if (nodeId.equals(spdmNodeVo.getUuid())) {
+ spdmNodeVo.setExtras(nodeExtraEntry.getValue());
+ }
+ }
+ }
+ }
+ for (SpdmNodeVo spdmNodeVo : nodeList) {
+ // TODO 转换项目进度状态
+ progressStatus = spdmNodeVo.getProgress();
+ if (ObjectUtils.isNotEmpty(progressStatus)) {
+ switch (progressStatus) {
+ case 0:
+ spdmNodeVo.setProgressStatusValue("未开始");
+ break;
+ case 1:
+ spdmNodeVo.setProgressStatusValue("进行中");
+ break;
+ case 2:
+ spdmNodeVo.setProgressStatusValue("已完成");
+ break;
+ default:
+ spdmNodeVo.setProgressStatusValue("未知");
+ break;
+ }
+ }
+ // TODO 项目达成状态(红黄绿灯)
+ achieveStatus = spdmNodeVo.getAchieveStatus();
+ if (ObjectUtils.isNotEmpty(achieveStatus)) {
+ switch (achieveStatus) {
+ case 1:
+ spdmNodeVo.setAchieveStatusValue("red");
+ break;
+ case 2:
+ spdmNodeVo.setProgressStatusValue("yellow");
+ break;
+ case 3:
+ spdmNodeVo.setProgressStatusValue("grey");
+ break;
+ case 4:
+ spdmNodeVo.setProgressStatusValue("grey");
+ break;
+ default:
+ spdmNodeVo.setProgressStatusValue("unknown");
+ break;
+ }
+ }
+ Long creator = spdmNodeVo.getCreator();
+ if (ObjectUtils.isNotEmpty(creator)) {
+ SdmResponse cidUserRespSdmResponse = sysUserFeignClient.queryUserDetail(UserQueryReq.builder().userId(creator).build());
+ if (cidUserRespSdmResponse.isSuccess()) {
+ spdmNodeVo.setCreatorObj(cidUserRespSdmResponse.getData());
+ }
+ }
+ }
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("data", nodeList);
+ jsonObject.put("total", total);
+ return SdmResponse.success(jsonObject);
+ }
+
+
+ private List addNode(List addNodeList, List tagMap, Long tenantId, Long jobNumber) {
+ log.info("addNode参数为:{}", addNodeList);
+ String curDateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+ String nodeManagerList;
+ List allNodeManagerList = new ArrayList<>();
+ List extraList;
+ List allExtraList = new ArrayList<>();
+ List currentNodeList;
+ if (CollectionUtils.isNotEmpty(tagMap)) {
+ // {key: "project", value: "Tag1"}, {key: "phase", value: "Tag2"}
+ for (TaskNodeTag tagReq : tagMap) {
+ String currentNodeType = tagReq.getKey(); // project phase
+ log.info("当前nodeType为:{},tag为:{}", currentNodeType, tagReq.getValue());
+ currentNodeList = addNodeList.stream().filter(node -> node.getNodeType().equals(currentNodeType)).toList(); // projectNodeList phaseNodeList
+ if (CollectionUtils.isEmpty(currentNodeList)) {
+ log.error("addNodeList中不存在{}类型的节点", currentNodeType);
+ continue;
+ }
+ List currentNodeIdList = new ArrayList<>();
+ for (SpdmProjectNodeEditReq addNode : currentNodeList) {
+ // idMap = {"tag1": "uuid1,uuid2", "tag2": "uuid3"}
+ if (MapUtils.isNotEmpty(idMap)) {
+ for (Map.Entry entry : idMap.entrySet()) {
+ // 之前的tag
+ // preTag = entry.getKey() = "tag1"
+ String preTag = entry.getKey();
+ log.info("preTag为:{}", preTag);
+ try {
+ // entry.getValue() = "uuid1,uuid2"
+ setTagProperty(addNode, preTag, entry.getValue());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ addNode.setUuid(RandomUtil.generateString(32));
+ // 设置 当前节点所属项目根节点uuid
+ // addNode.getPid()为空时,在创建项目,ownRootNodeUuid就是addNode本身uuid
+ // addNode.getPid()不为空时,在创建阶段,ownRootNodeUuid就是入参的pid父节点
+ addNode.setOwnRootNodeUuid(ObjectUtils.isEmpty(addNode.getPid()) ? addNode.getUuid() : addNode.getPid());
+ addNode.setCreateTime(curDateStr);
+ addNode.setCreator(jobNumber);
+ addNode.setTenantId(tenantId);
+ try {
+ // tagReq.getValue()="Tag1"
+ setTagProperty(addNode, tagReq.getValue(), addNode.getUuid());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ currentNodeIdList.add(addNode.getUuid());
+ nodeManagerList = addNode.getMemberList();
+ if (StringUtils.isNoneBlank(nodeManagerList)) {
+ for (String userId : nodeManagerList.split(",")) {
+ SpdmNodeRelateMemberReq spdmNodeRelateMemberReq = new SpdmNodeRelateMemberReq();
+ spdmNodeRelateMemberReq.setNodeId(addNode.getUuid());
+ spdmNodeRelateMemberReq.setUserId(Long.valueOf(userId));
+ spdmNodeRelateMemberReq.setCreateTime(curDateStr);
+ spdmNodeRelateMemberReq.setCreator(jobNumber);
+ allNodeManagerList.add(spdmNodeRelateMemberReq);
+ }
+ }
+ extraList = addNode.getExtras();
+ if (CollectionUtils.isNotEmpty(extraList)) {
+ extraList.forEach(extra -> {
+ extra.setNodeId(addNode.getUuid());
+ extra.setCreateTime(curDateStr);
+ extra.setCreator(jobNumber);
+ });
+ allExtraList.addAll(extraList);
+ }
+ }
+ // tagReq.getValue()= "tag1" "tag2"
+ idMap.put(tagReq.getValue(), String.join(",", currentNodeIdList));
+ }
+ }
+
+ if (nodeMapper.addNodeBatch(addNodeList) <= 0) {
+ return null;
+ }
+ Optional projectOptional = addNodeList.stream().filter(node -> NodeTypeEnum.PROJECT.getValue().equals(node.getNodeType())).findFirst();
+ if (projectOptional.isPresent()) {
+ SpdmProjectNodeEditReq projectNode = projectOptional.get();
+ // 创建项目节点的文件夹
+ createDir(projectNode.getUuid(), projectNode.getNodeType(), null, projectNode.getNodeName());
+ } else {
+ List projectNodePoList = mapper.queryNodeListByNodeId(addNodeList.get(0).getPid());
+ if (CollectionUtils.isEmpty(projectNodePoList)) {
+ log.error("根据nodeId:{},未查询到项目节点", addNodeList.get(0).getPid());
+ return null;
+ }
+ ProjectNodePo projectNodePo = projectNodePoList.get(0);
+ String projectUuid = projectNodePo.getUuid();
+ for (SpdmProjectNodeEditReq node : addNodeList) {
+ createDir(node.getUuid(), node.getNodeType(), projectUuid, node.getNodeName());
+ }
+ }
+ if (CollectionUtils.isNotEmpty(allNodeManagerList) && nodeMapper.addNodeMemberBatch(allNodeManagerList) <= 0) {
+ return null;
+ }
+ if (CollectionUtils.isNotEmpty(allExtraList) && nodeMapper.addNodeExtraBatch(allExtraList) <= 0) {
+ return null;
+ }
+ addNodeList.forEach(addNode -> addNode.setPid(addNode.getUuid()));
+ return addNodeList;
+ }
+
+ private boolean editNode(List editNodeList, Long tenantId, Long jobNumber) {
+ log.info("editNode参数为:{}", editNodeList);
+ String curDateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+ String nodeManagerList;
+ List allNodeManagerList = new ArrayList<>();
+ List extraList;
+ List allExtraList = new ArrayList<>();
+ for (SpdmNodeDetailReq editNode : editNodeList) {
+ editNode.setUpdateTime(curDateStr);
+ editNode.setUpdater(jobNumber);
+ nodeManagerList = editNode.getMemberList();
+ if (StringUtils.isNoneBlank(nodeManagerList)) {
+ for (String userId : nodeManagerList.split(",")) {
+ SpdmNodeRelateMemberReq spdmNodeRelateMemberReq = new SpdmNodeRelateMemberReq();
+ spdmNodeRelateMemberReq.setNodeId(editNode.getUuid());
+ spdmNodeRelateMemberReq.setUserId(Long.valueOf(userId));
+ spdmNodeRelateMemberReq.setCreateTime(curDateStr);
+ spdmNodeRelateMemberReq.setCreator(jobNumber);
+ allNodeManagerList.add(spdmNodeRelateMemberReq);
+ }
+ }
+ extraList = editNode.getExtraList();
+ if (CollectionUtils.isNotEmpty(extraList)) {
+ extraList.forEach(extra -> {
+ extra.setUpdateTime(curDateStr);
+ extra.setUpdater(jobNumber);
+ });
+ allExtraList.addAll(extraList);
+ }
+ }
+
+ for (SpdmNodeDetailReq editNode : editNodeList) {
+ if (nodeMapper.editNode(editNode) <= 0) {
+ return false;
+ }
+ }
+
+ // 先删除所有成员
+ nodeMapper.deleteNodeMemberBatch(editNodeList.stream().map(SpdmNodeDetailReq::getUuid).toList());
+
+ if (CollectionUtils.isNotEmpty(allNodeManagerList)) {
+ allNodeManagerList.forEach(node -> {
+ node.setCreateTime(curDateStr);
+ node.setCreator(jobNumber);
+ });
+ if (nodeMapper.addNodeMemberBatch(allNodeManagerList) <= 0) {
+ return false;
+ }
+ }
+
+ if (CollectionUtils.isNotEmpty(allExtraList)) {
+ for (SpdmNodeExtraReq nodeExtra : allExtraList) {
+ if (nodeMapper.editNodeExtra(nodeExtra) <= 0) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public SdmResponse getNodeDetail(GetProjectDetailReq req) {
+ log.info("项目详情参数为:{}", req);
+ SpdmNodeVo projectNode = nodeMapper.getNodeById(req.getProjectNodeId());
+ if (ObjectUtils.isEmpty(projectNode)) {
+ log.error("根据节点id:{},未查询到项目节点!", req.getProjectNodeId());
+ return SdmResponse.failed("根据节点id未查询到项目节点!");
+ }
+ Integer progressStatus;
+ Integer achieveStatus;
+ // 查询节点的额外属性
+
+ List spdmNodeMemberVoList = nodeMapper.getNodeMemberListByNodeIdList(Collections.singletonList(projectNode.getUuid()));
+ if (CollectionUtils.isNotEmpty(spdmNodeMemberVoList)) {
+ List usewrIdList = spdmNodeMemberVoList.stream().map(SpdmNodeMemberVo::getUserId).distinct().toList();
+ SdmResponse> cidUserResp = sysUserFeignClient.listUserByIds(UserQueryReq.builder().userIds(usewrIdList).build());
+ List userList = cidUserResp.getData();
+
+ Map> userMap = Map.of();
+ if (CollectionUtils.isNotEmpty(userList)) {
+ userMap = userList.stream().collect(Collectors.groupingBy(CIDUserResp::getUserId));
+ }
+ List memberList = new ArrayList<>();
+ for (SpdmNodeMemberVo spdmNodeMemberVo : spdmNodeMemberVoList) {
+ if (CollectionUtils.isNotEmpty(userMap.get(spdmNodeMemberVo.getUserId()))) {
+ memberList.add(userMap.get(spdmNodeMemberVo.getUserId()).get(0));
+ }
+ }
+ projectNode.setMemberList(memberList);
+ }
+ List spdmNodeExtraVoList = nodeMapper.getNodeExtraListByNodeIdList(Collections.singletonList(projectNode.getUuid()));
+ if (CollectionUtils.isNotEmpty(spdmNodeExtraVoList)) {
+ projectNode.setExtraList(spdmNodeExtraVoList);
+ }
+ // TODO 转换项目进度状态
+ progressStatus = projectNode.getProgress();
+ if (ObjectUtils.isNotEmpty(progressStatus)) {
+ switch (progressStatus) {
+ case 0:
+ projectNode.setProgressStatusValue("未开始");
+ break;
+ case 1:
+ projectNode.setProgressStatusValue("进行中");
+ break;
+ case 2:
+ projectNode.setProgressStatusValue("已完成");
+ break;
+ default:
+ projectNode.setProgressStatusValue("未知");
+ break;
+ }
+ }
+ // TODO 项目达成状态(红黄绿灯)
+ achieveStatus = projectNode.getAchieveStatus();
+ if (ObjectUtils.isNotEmpty(achieveStatus)) {
+ switch (achieveStatus) {
+ case 1:
+ projectNode.setAchieveStatusValue("red");
+ break;
+ case 2:
+ projectNode.setProgressStatusValue("yellow");
+ break;
+ case 3:
+ projectNode.setProgressStatusValue("grey");
+ break;
+ case 4:
+ projectNode.setProgressStatusValue("grey");
+ break;
+ default:
+ projectNode.setProgressStatusValue("unknown");
+ break;
+ }
+ }
+ // 创建人要返回对象
+ Long creator = projectNode.getCreator();
+ if (ObjectUtils.isNotEmpty(creator)) {
+ SdmResponse cidUserRespSdmResponse = sysUserFeignClient.queryUserDetail(UserQueryReq.builder().userId(creator).build());
+ if (cidUserRespSdmResponse.isSuccess()) {
+ projectNode.setCreatorObj(cidUserRespSdmResponse.getData());
+ }
+ }
+ SpdmNodeDetailVo spdmNodeDetailVo = new SpdmNodeDetailVo();
+ BeanUtils.copyProperties(projectNode, spdmNodeDetailVo);
+ // 设置当前阶段
+ String uuid = spdmNodeDetailVo.getUuid();
+ List phaseNodeList = this.lambdaQuery().eq(SimulationNode::getParentId, uuid).eq(SimulationNode::getNodeType, NodeTypeEnum.PHASE.getValue()).list();
+ if (CollectionUtils.isEmpty(phaseNodeList)) {
+ return SdmResponse.success(spdmNodeDetailVo);
+ }
+ phaseNodeList = phaseNodeList.stream().filter(phaseNode -> StringUtils.isNotBlank(phaseNode.getBeginTime()) && StringUtils.isNotBlank(phaseNode.getEndTime())).toList();
+ if (CollectionUtils.isEmpty(phaseNodeList)) {
+ return SdmResponse.success(spdmNodeDetailVo);
+ }
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ phaseNodeList = phaseNodeList.stream().sorted(Comparator.comparingLong(phaseNode -> {
+ try {
+ return sdf.parse(phaseNode.getBeginTime()).getTime();
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ })).toList();
+ Long currentTime = System.currentTimeMillis();
+ SimulationNode currentPhaseNode = null;
+ for (SimulationNode simulationNode : phaseNodeList) {
+ try {
+ if (currentTime >= sdf.parse(simulationNode.getBeginTime()).getTime() && currentTime <= sdf.parse(simulationNode.getEndTime()).getTime()) {
+ currentPhaseNode = simulationNode;
+ }
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ if (ObjectUtils.isNotEmpty(currentPhaseNode)) {
+ spdmNodeDetailVo.setCurrentPhase(currentPhaseNode.getNodeName());
+ return SdmResponse.success(spdmNodeDetailVo);
+ }
+
+ // 开始时间比当前时间小的里面的最大的一个
+ List bigPhaseNodeList = phaseNodeList.stream().filter(phaseNode -> {
+ try {
+ return currentTime <= sdf.parse(phaseNode.getBeginTime()).getTime();
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ }).toList();
+ if (CollectionUtils.isEmpty(bigPhaseNodeList)) {
+ SimulationNode simulationNode = phaseNodeList.stream().max(Comparator.comparingLong(phaseNode -> {
+ try {
+ return sdf.parse(phaseNode.getBeginTime()).getTime();
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ })).get();
+ spdmNodeDetailVo.setCurrentPhase(simulationNode.getNodeName());
+ return SdmResponse.success(spdmNodeDetailVo);
+ }
+ SimulationNode simulationNode = phaseNodeList.stream().min(Comparator.comparingLong(phaseNode -> {
+ try {
+ return sdf.parse(phaseNode.getBeginTime()).getTime();
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ })).get();
+ spdmNodeDetailVo.setCurrentPhase(simulationNode.getNodeName());
+ return SdmResponse.success(spdmNodeDetailVo);
+ }
+
+ @Override
+ public SdmResponse getProjectMemberList(GetProjectListReq req) {
+ JSONObject jsonObject = new JSONObject();
+ String projectNodeId = req.getProjectNodeId();
+ SpdmNodeVo spdmNodeVo = nodeMapper.getNodeById(projectNodeId);
+ if (ObjectUtils.isEmpty(spdmNodeVo)) {
+ log.error("根据projectNodeId:{},未查询到团队成员", projectNodeId);
+ jsonObject.put("data", new ArrayList());
+ return SdmResponse.success(jsonObject);
+ }
+ List allNodeIdList = new ArrayList<>();
+ allNodeIdList.add(spdmNodeVo.getUuid());
+ recursionAllNodeIdList(Collections.singletonList(spdmNodeVo.getUuid()), allNodeIdList);
+ List spdmNodeMemberVoList = nodeMapper.getNodeMemberListByNodeIdList(allNodeIdList);
+ if (CollectionUtils.isEmpty(spdmNodeMemberVoList)) {
+ log.error("allNodeIdList:{},未查询到团队成员", allNodeIdList);
+ jsonObject.put("data", new ArrayList());
+ return SdmResponse.success(jsonObject);
+ }
+ List userIdList = spdmNodeMemberVoList.stream().map(SpdmNodeMemberVo::getUserId).distinct().collect(Collectors.toList());
+ ;
+
+ // 查询node节点下的task的成员(仿真负责人和执行人)
+ List taskList = simulationTaskService.lambdaQuery().in(SimulationTask::getNodeId, allNodeIdList).list();
+ if (CollectionUtils.isNotEmpty(taskList)) {
+ List taskMemberList = simulationTaskMemberService.lambdaQuery().in(SimulationTaskMember::getTaskId, taskList.stream().map(SimulationTask::getUuid).toList()).list();
+ if (CollectionUtils.isNotEmpty(taskMemberList)) {
+ userIdList.addAll(taskMemberList.stream().map(SimulationTaskMember::getUserId).distinct().toList());
+ }
+ }
+ SdmResponse> cidUserResp = sysUserFeignClient.listUserByIds(UserQueryReq.builder().userIds(userIdList).build());
+ List userList = cidUserResp.getData();
+ if (CollectionUtils.isEmpty(userList)) {
+ log.error("getProjectMemberList未查询到用户");
+ jsonObject.put("data", new ArrayList());
+ return SdmResponse.success(jsonObject);
+ }
+ jsonObject.put("data", userList.stream().skip((long) (req.getCurrent() - 1) * req.getSize()).limit(req.getSize()).toList());
+ return SdmResponse.success(jsonObject);
+ }
+
+ private void recursionAllNodeIdList(List currentNodeIdList, List allNodeIdList) {
+ List spdmNodeVoList = nodeMapper.getNodeListByNodeIdList(currentNodeIdList);
+ if (CollectionUtils.isEmpty(spdmNodeVoList)) {
+ return;
+ }
+ List addNodeIdList = spdmNodeVoList.stream().map(SpdmNodeVo::getUuid).toList();
+ allNodeIdList.addAll(addNodeIdList);
+ recursionAllNodeIdList(addNodeIdList, allNodeIdList);
+ }
+
+ @Override
+ public SdmResponse getChildrenNodeList(List nodeIdList, String nodeType) {
+ log.info("getChildrenNodeList,nodeIdList:{},nodeType:{}", nodeIdList, nodeType);
+ List projectNodePoList = mapper.queryNodeListByParentNodeId(nodeIdList);
+ if (CollectionUtils.isEmpty(projectNodePoList)) {
+ return SdmResponse.success(new ArrayList<>());
+ }
+ // 兼容处理cid同步的数据
+ List dirtyProjectNodeList = projectNodePoList.stream().filter(projectNode -> projectNode.getUuid().equals(projectNode.getParentId())).toList();
+ if (CollectionUtils.isNotEmpty(dirtyProjectNodeList)) {
+ log.error("以下节点id:{},的uuid和parentId相同,需要处理",dirtyProjectNodeList.stream().map(ProjectNodePo::getUuid).collect(Collectors.joining(",")));
+ return SdmResponse.failed("节点:" + dirtyProjectNodeList.stream().map(ProjectNodePo::getNodeName).collect(Collectors.joining(",")) + "的数据有误,需要处理");
+ }
+ log.info("getChildrenNodeList为:{}",projectNodePoList);
+ List returnProjectNodeList = projectNodePoList.stream().filter(projectNode -> nodeType.equals(projectNode.getNodeType())).toList();
+ if (CollectionUtils.isNotEmpty(returnProjectNodeList)) {
+ return SdmResponse.success(returnProjectNodeList);
+ }
+ return getChildrenNodeList(projectNodePoList.stream().map(ProjectNodePo::getUuid).toList(), nodeType);
+ }
+
+ /**
+ * 创建文件夹
+ *
+ * @param uuid 待创建节点uuid
+ * @param uuidOwnType 待创建节点类型:node,task,run,performance
+ * @param parentUuid 父节点uuid
+ * @param dirName 待长江文件夹名称
+ */
+ private SdmResponse createDir(String uuid, String uuidOwnType, String parentUuid, String dirName) {
+ CreateDirReq createDirReq = new CreateDirReq();
+ createDirReq.setUuId(uuid);
+ createDirReq.setUuIdOwnType(uuidOwnType);
+ createDirReq.setParentUuId(ObjectUtils.isNotEmpty(parentUuid) ? parentUuid : null);
+ createDirReq.setDirName(dirName);
+ createDirReq.setDirType(DirTypeEnum.PROJECT_NODE_DIR.getValue());
+ log.info("创建项目阶段时,调用创建文件夹的参数为:{}", createDirReq);
+ SdmResponse response = dataClientFeignClient.createDir(createDirReq);
+ log.info("创建项目阶段时,调用创建文件夹的返回值为:{}", response);
+ return response;
+ }
+
+
+ @Override
+ public SdmResponse> getAllNodeByBodeType(String nodeType, Long nodeId) {
+ try {
+ List allNodeByProjectIdAndTypeRespList = new ArrayList<>();
+ List nodeList = this.lambdaQuery()
+ .eq(ObjectUtils.isNotEmpty(nodeId), SimulationNode::getId, nodeId)
+ .eq(ObjectUtils.isNotEmpty(nodeType), SimulationNode::getNodeType, nodeType)
+ .orderByDesc(SimulationNode::getCreateTime)
+ .list();
+ if (CollectionUtils.isEmpty(nodeList)) {
+ return SdmResponse.failed("未找到节点");
+ }
+
+ nodeList.forEach(simulationNode -> {
+ AllNodeByProjectIdAndTypeResp allNodeByProjectIdAndTypeResp = new AllNodeByProjectIdAndTypeResp();
+ BeanUtils.copyProperties(simulationNode, allNodeByProjectIdAndTypeResp);
+ allNodeByProjectIdAndTypeResp.setId(simulationNode.getId().longValue());
+ allNodeByProjectIdAndTypeRespList.add(allNodeByProjectIdAndTypeResp);
+ });
+
+ return SdmResponse.success(allNodeByProjectIdAndTypeRespList);
+ } catch (Exception e) {
+ return SdmResponse.failed(e.getMessage());
+ }
+ }
+
+ @Override
+ public SdmResponse> getAllNodeByProjectIdAndType(String uuid, String nextNodeType) {
+ SdmResponse> tagMapList = sysConfigFeignClient.getDictionaryData(TagConstant.DICTIONARY_TAG_KEY);
+ if (!tagMapList.isSuccess() || ObjectUtils.isEmpty(tagMapList.getData())) {
+ log.error("字典信息查询失败");
+ return SdmResponse.success();
+ }
+ // project-->tag1 phase-->tag2
+ Map TagMap = tagMapList.getData().stream().collect(Collectors.toMap(DataDictionary::getDictValue, DataDictionary::getDictName));
+
+ Optional simulationNodeOptional = this.lambdaQuery().eq(SimulationNode::getUuid, uuid).oneOpt();
+ if (!simulationNodeOptional.isPresent()) {
+ return SdmResponse.failed("未找到节点");
+ }
+
+ SimulationNode currentNode = simulationNodeOptional.get();
+ String currentNodeType = currentNode.getNodeType();
+ String currentNodeTag = TagMap.get(currentNodeType);
+
+ List simulationNodeList = this.lambdaQuery()
+ .eq(TagConstant.TAG1.equals(currentNodeTag), SimulationNode::getTag1, uuid)
+ .eq(TagConstant.TAG2.equals(currentNodeTag), SimulationNode::getTag2, uuid)
+ .eq(TagConstant.TAG3.equals(currentNodeTag), SimulationNode::getTag3, uuid)
+ .eq(TagConstant.TAG4.equals(currentNodeTag), SimulationNode::getTag4, uuid)
+ .eq(TagConstant.TAG5.equals(currentNodeTag), SimulationNode::getTag5, uuid)
+ .eq(TagConstant.TAG6.equals(currentNodeTag), SimulationNode::getTag6, uuid)
+ .eq(TagConstant.TAG7.equals(currentNodeTag), SimulationNode::getTag7, uuid)
+ .eq(TagConstant.TAG8.equals(currentNodeTag), SimulationNode::getTag8, uuid)
+ .eq(TagConstant.TAG9.equals(currentNodeTag), SimulationNode::getTag9, uuid)
+ .eq(TagConstant.TAG10.equals(currentNodeTag), SimulationNode::getTag10, uuid)
+ .eq(SimulationNode::getNodeType, nextNodeType)
+ .list();
+
+ if (CollectionUtils.isEmpty(simulationNodeList)) {
+ return SdmResponse.success();
+ }
+ List allNodeByProjectIdAndTypeRespList = new ArrayList<>();
+ simulationNodeList.forEach(simulationNode -> {
+ AllNodeByProjectIdAndTypeResp allNodeByProjectIdAndTypeResp = new AllNodeByProjectIdAndTypeResp();
+ BeanUtils.copyProperties(simulationNode, allNodeByProjectIdAndTypeResp);
+ allNodeByProjectIdAndTypeResp.setId(simulationNode.getId().longValue());
+ allNodeByProjectIdAndTypeRespList.add(allNodeByProjectIdAndTypeResp);
+ });
+
+ return SdmResponse.success(allNodeByProjectIdAndTypeRespList);
+ }
+
+ @Override
+ public SdmResponse> getNodeTaskList(String uuid) {
+ if(ObjectUtils.isEmpty(uuid)){
+ return SdmResponse.success();
+ }
+ List simulationTasks = simulationTaskService.lambdaQuery().eq(SimulationTask::getNodeId, uuid).list();
+ if(CollectionUtils.isEmpty(simulationTasks)){
+ return SdmResponse.success();
+ }
+ List allNodeByProjectIdAndTypeRespList = new ArrayList<>();
+ simulationTasks.forEach(simulationTask -> {
+ AllNodeByProjectIdAndTypeResp allNodeByProjectIdAndTypeResp = new AllNodeByProjectIdAndTypeResp();
+ allNodeByProjectIdAndTypeResp.setId(simulationTask.getId().longValue());
+ allNodeByProjectIdAndTypeResp.setUuid(simulationTask.getUuid());
+ allNodeByProjectIdAndTypeResp.setNodeName(simulationTask.getTaskName());
+ allNodeByProjectIdAndTypeResp.setNodeType(NodeTypeEnum.TASK.getValue());
+ allNodeByProjectIdAndTypeRespList.add(allNodeByProjectIdAndTypeResp);
+ });
+
+ return SdmResponse.success(allNodeByProjectIdAndTypeRespList);
+ }
+
+ @Override
+ public SdmResponse> getTaskRunList(String uuid) {
+ if(ObjectUtils.isEmpty(uuid)){
+ return SdmResponse.success();
+ }
+ List simulationRunList = simulationRunService.lambdaQuery().eq(SimulationRun::getTaskId, uuid).list();
+ if(CollectionUtils.isEmpty(simulationRunList)){
+ return SdmResponse.success();
+ }
+ List allNodeByProjectIdAndTypeRespList = new ArrayList<>();
+ simulationRunList.forEach(simulationRun -> {
+ AllNodeByProjectIdAndTypeResp allNodeByProjectIdAndTypeResp = new AllNodeByProjectIdAndTypeResp();
+ allNodeByProjectIdAndTypeResp.setId(simulationRun.getId().longValue());
+ allNodeByProjectIdAndTypeResp.setUuid(simulationRun.getUuid());
+ allNodeByProjectIdAndTypeResp.setNodeName(simulationRun.getRunName());
+ allNodeByProjectIdAndTypeResp.setNodeType(NodeTypeEnum.RUN.getValue());
+ allNodeByProjectIdAndTypeRespList.add(allNodeByProjectIdAndTypeResp);
+ });
+ return SdmResponse.success(allNodeByProjectIdAndTypeRespList);
+ }
+
+ public static void setTagProperty(Object obj, String propertyName, Object value) throws Exception {
+ Class> clazz = obj.getClass();
+ Field field = clazz.getDeclaredField(propertyName);
+ field.setAccessible(true);
+ field.set(obj, value);
+ field.setAccessible(false);
+ }
+
+ public static String getTagProperty(Object obj, String propertyName) throws Exception {
+ Class> clazz = obj.getClass();
+ Field field = clazz.getDeclaredField(propertyName);
+ field.setAccessible(true);
+ return (String) field.get(obj);
+ }
+
+ public static List getTagListProperty(Object obj, String propertyName) throws Exception {
+ Class> clazz = obj.getClass();
+ Field field = clazz.getDeclaredField(propertyName);
+ field.setAccessible(true);
+ return (List) field.get(obj);
+ }
+
+ @Override
+ public SdmResponse getUserGroupProjectStatistics(Long userGroupId, Long userId) {
+ Map userId2Nickname = getUserIdToNicknameMap(userGroupId);
+ if (MapUtils.isEmpty(userId2Nickname)) {
+ return SdmResponse.success();
+ }
+
+ Set userIds = new HashSet<>();
+ if (ObjectUtils.isEmpty(userId)) {
+ userIds = userId2Nickname.keySet();
+ }else {
+ userIds.add(userId);
+ }
+
+ List userGroupProjectStatistics = this.baseMapper.getUserGroupProjectStatistics(userIds);
+ if (CollectionUtils.isEmpty(userGroupProjectStatistics)) {
+ return SdmResponse.success(new ArrayList<>());
+ }
+
+ // 按用户ID统计项目数量
+ Map userProjectCountMap = new HashMap<>();
+ for (UserGroupProjectVo vo : userGroupProjectStatistics) {
+ Long userIdKey = vo.getUserId();
+ userProjectCountMap.put(userIdKey, userProjectCountMap.getOrDefault(userIdKey, 0) + 1);
+
+ }
+
+ // 转换为List