diff --git a/1-sql/2026-02-03/project/simulation_task.sql b/1-sql/2026-02-03/project/simulation_task.sql new file mode 100644 index 00000000..b770c7d2 --- /dev/null +++ b/1-sql/2026-02-03/project/simulation_task.sql @@ -0,0 +1,2 @@ +ALTER TABLE simulation_task MODIFY COLUMN exe_status varchar(20) DEFAULT '1' NOT NULL COMMENT '执行状态'; +ALTER TABLE simulation_task MODIFY COLUMN achieve_status varchar(20) DEFAULT '0' NULL; \ No newline at end of file diff --git a/common/src/main/java/com/sdm/common/entity/enums/AttachFileTypeEnum.java b/common/src/main/java/com/sdm/common/entity/enums/AttachFileTypeEnum.java new file mode 100644 index 00000000..59f0eae5 --- /dev/null +++ b/common/src/main/java/com/sdm/common/entity/enums/AttachFileTypeEnum.java @@ -0,0 +1,30 @@ +package com.sdm.common.entity.enums; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.List; + +@Schema(description = "附件文件夹名称枚举") +public enum AttachFileTypeEnum { + /** + * 项目附件文件夹名称 + */ + PROJECT_FILE("项目文件"), + + /** + * 需求附件文件夹名称 + */ + DEMAND_FILE("需求附件"); + + String value; + + AttachFileTypeEnum(String i) { + value = i; + } + + public String getValue() { + return value; + } + + +} diff --git a/common/src/main/java/com/sdm/common/entity/req/data/BatchCreateNormalDirReq.java b/common/src/main/java/com/sdm/common/entity/req/data/BatchCreateNormalDirReq.java index 9296c809..737f1230 100644 --- a/common/src/main/java/com/sdm/common/entity/req/data/BatchCreateNormalDirReq.java +++ b/common/src/main/java/com/sdm/common/entity/req/data/BatchCreateNormalDirReq.java @@ -11,7 +11,6 @@ import java.util.List; @Schema(description = "批量创建普通文件夹请求参数") public class BatchCreateNormalDirReq { - @NotNull(message = "父节点UUID") @Schema(description = "父节点UUID", requiredMode = Schema.RequiredMode.REQUIRED) private String parentUUId; diff --git a/project/src/main/java/com/sdm/project/model/req/ProjectTreeReq.java b/project/src/main/java/com/sdm/project/model/req/ProjectTreeReq.java index e8ce27a4..d03a776b 100644 --- a/project/src/main/java/com/sdm/project/model/req/ProjectTreeReq.java +++ b/project/src/main/java/com/sdm/project/model/req/ProjectTreeReq.java @@ -31,5 +31,6 @@ public class ProjectTreeReq { @JsonProperty(value = "tag10") private String tag10; + private String filterDiscipline; } diff --git a/project/src/main/java/com/sdm/project/model/req/ProjectTreeTagReq.java b/project/src/main/java/com/sdm/project/model/req/ProjectTreeTagReq.java index 38699764..fa0280d9 100644 --- a/project/src/main/java/com/sdm/project/model/req/ProjectTreeTagReq.java +++ b/project/src/main/java/com/sdm/project/model/req/ProjectTreeTagReq.java @@ -17,6 +17,8 @@ public class ProjectTreeTagReq { private String projectNodeId; + private String filterDiscipline; + /** * 根据projectNodeId和phaseNodeId构建 diff --git a/project/src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java b/project/src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java index 6074a74e..5f62a803 100644 --- a/project/src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java +++ b/project/src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java @@ -143,4 +143,6 @@ public class SpdmTaskListReq { private Long userId; + private String filterDiscipline; + } diff --git a/project/src/main/java/com/sdm/project/service/impl/DemandServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/DemandServiceImpl.java index 5ea51679..0dde96ee 100644 --- a/project/src/main/java/com/sdm/project/service/impl/DemandServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/DemandServiceImpl.java @@ -8,10 +8,7 @@ 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.enums.DirTypeEnum; -import com.sdm.common.entity.enums.FilePermissionEnum; -import com.sdm.common.entity.enums.MessageTemplateEnum; -import com.sdm.common.entity.enums.ValueTypeEnum; +import com.sdm.common.entity.enums.*; import com.sdm.common.entity.req.data.*; import com.sdm.common.entity.req.system.SendMsgReq; import com.sdm.common.entity.req.system.UserQueryReq; @@ -200,8 +197,29 @@ public class DemandServiceImpl extends BaseService implements IDemandService { } } + // 项目层级文件夹和需求文件夹中,新增一层【需求附件】文件夹 + String projectNodeId = req.getProjectId(); BatchCreateNormalDirReq batchCreateNormalDirReq = new BatchCreateNormalDirReq(); - batchCreateNormalDirReq.setParentUUId(req.getProjectId()); + SdmResponse fileMetadataInfoResp = dataFeignClient.queryFileMetadataInfo(projectNodeId, NodeTypeEnum.PROJECT.getValue(), 0L); + if (fileMetadataInfoResp.getData() == null) { + log.error("fileMetadataInfoResp为空,projectNodeId为:{}",projectNodeId); + return SdmResponse.failed("新增需求失败!"); + } + // 查询需求附件的uuid,元数据表中【parentId是project的元数据主键id且originalName为:需求附件】 + FileMetadataInfoResp projectMetadataInfo = fileMetadataInfoResp.getData(); + SdmResponse> listSdmResponse = dataFeignClient.listDir(DirTypeEnum.PROJECT_NODE_DIR.getValue(), projectMetadataInfo.getId()); + if (!listSdmResponse.isSuccess() || CollectionUtils.isEmpty(listSdmResponse.getData())) { + log.error("listSdmResponse为空,project的元数据主键id为:{}",projectMetadataInfo.getId()); + return SdmResponse.failed("新增需求失败!"); + } + List childrenMetadataInfoList = listSdmResponse.getData(); + FileMetadataInfoResp demandAttachFileMetadataInfoResp = childrenMetadataInfoList.stream().filter(metadataInfo -> AttachFileTypeEnum.DEMAND_FILE.getValue().equals(metadataInfo.getOriginalName())).findFirst().orElse(null); + if (ObjectUtils.isEmpty(demandAttachFileMetadataInfoResp)) { + log.error("未查询到需求附件文件夹,当前项目下的子文件夹为:{}",childrenMetadataInfoList); + return SdmResponse.failed("新增需求失败!"); + } + Long demandAttachFileMetadataInfoId = demandAttachFileMetadataInfoResp.getId(); + batchCreateNormalDirReq.setParentId(demandAttachFileMetadataInfoId); FolderItemReq folderItemReq = new FolderItemReq(); folderItemReq.setFolderName(req.getDemandName()); folderItemReq.setFolderUuid(req.getUuid()); diff --git a/project/src/main/java/com/sdm/project/service/impl/LyricInternalServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/LyricInternalServiceImpl.java index da68ccdf..940229f9 100644 --- a/project/src/main/java/com/sdm/project/service/impl/LyricInternalServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/LyricInternalServiceImpl.java @@ -5,12 +5,14 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.sdm.common.common.SdmResponse; import com.sdm.common.common.ThreadLocalContext; +import com.sdm.common.entity.enums.AttachFileTypeEnum; 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.SpdmNodeListReq; import com.sdm.common.entity.req.system.UserQueryReq; +import com.sdm.common.entity.resp.data.FileMetadataInfoResp; import com.sdm.common.entity.resp.system.CIDUserResp; import com.sdm.common.feign.impl.data.DataClientFeignClientImpl; import com.sdm.common.feign.impl.system.SysUserFeignClientImpl; @@ -616,9 +618,35 @@ public class LyricInternalServiceImpl implements ILyricInternalService { List updatePermissionList) { // 批量创建文件夹 if (CollectionUtils.isNotEmpty(createDirItemList)) { + // project的uuid,createDirItemList中每一项project的uuid都一样,取第一个即可 + String projectNodeId = createDirItemList.get(0).getParentDirNodeInfo().getUuId(); + if (StringUtils.isBlank(projectNodeId)) { + log.error("projectNodeId为空,createDirItemList:{}",createDirItemList); + return; + } + SdmResponse fileMetadataInfoResp = dataFeignClient.queryFileMetadataInfo(projectNodeId, NodeTypeEnum.PROJECT.getValue(), 0L); + if (fileMetadataInfoResp.getData() == null) { + log.error("fileMetadataInfoResp为空,projectNodeId为:{}",projectNodeId); + return; + } + // 查询需求附件的uuid,元数据表中【parentId是project的元数据主键id且originalName为:需求附件】 + FileMetadataInfoResp projectMetadataInfo = fileMetadataInfoResp.getData(); + SdmResponse> listSdmResponse = dataFeignClient.listDir(DirTypeEnum.PROJECT_NODE_DIR.getValue(), projectMetadataInfo.getId()); + if (!listSdmResponse.isSuccess() || CollectionUtils.isEmpty(listSdmResponse.getData())) { + log.error("listSdmResponse为空,project的元数据主键id为:{}",projectMetadataInfo.getId()); + return; + } + List childrenMetadataInfoList = listSdmResponse.getData(); + FileMetadataInfoResp demandAttachFileMetadataInfoResp = childrenMetadataInfoList.stream().filter(metadataInfo -> AttachFileTypeEnum.DEMAND_FILE.getValue().equals(metadataInfo.getOriginalName())).findFirst().orElse(null); + if (ObjectUtils.isEmpty(demandAttachFileMetadataInfoResp)) { + log.error("未查询到需求附件文件夹,当前项目下的子文件夹为:{}",childrenMetadataInfoList); + return; + } + Long demandAttachFileMetadataInfoId = demandAttachFileMetadataInfoResp.getId(); for (BatchCreateDirItem batchCreateDirItem : createDirItemList) { BatchCreateNormalDirReq batchCreateNormalDirReq = new BatchCreateNormalDirReq(); - batchCreateNormalDirReq.setParentUUId(batchCreateDirItem.getParentDirNodeInfo().getUuId()); + // 2026-02-03 这里要挂在【需求附件】文件夹下了 + batchCreateNormalDirReq.setParentId(demandAttachFileMetadataInfoId); List folderItemReqList = new ArrayList<>(); for (DirNodeInfo dirNodeInfo : batchCreateDirItem.getChildDirNodeInfos()) { FolderItemReq folderItemReq = new FolderItemReq(); diff --git a/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java index 15487d1a..f02061d6 100644 --- a/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java @@ -9,6 +9,7 @@ import com.sdm.common.common.SdmResponse; import com.sdm.common.common.ThreadLocalContext; import com.sdm.common.entity.ExportExcelFormat; import com.sdm.common.entity.constants.TagConstant; +import com.sdm.common.entity.enums.AttachFileTypeEnum; import com.sdm.common.entity.enums.DirTypeEnum; import com.sdm.common.entity.enums.FilePermissionEnum; import com.sdm.common.entity.enums.NodeTypeEnum; @@ -19,6 +20,7 @@ import com.sdm.common.entity.req.system.UserListReq; 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.BatchCreateNormalDirResp; import com.sdm.common.entity.resp.project.SimulationNodeResp; import com.sdm.common.entity.resp.project.SimulationRunResp; import com.sdm.common.entity.resp.system.CIDStaffResp; @@ -218,7 +220,7 @@ public class NodeServiceImpl extends ServiceImpl NodeTypeEnum.PHASE.getValue().equals(node.getNodeType())).findFirst().orElse(null); if (ObjectUtils.isNotEmpty(phaseNode)) { List managerList = nodeMapper.getNodeMemberListByNodeIdList(Collections.singletonList(phaseNode.getParentId())); @@ -1136,6 +1138,24 @@ public class NodeServiceImpl extends ServiceImpl folderItemReqList = new ArrayList<>(); + FolderItemReq folderItemReq = new FolderItemReq(); + folderItemReq.setFolderName(AttachFileTypeEnum.PROJECT_FILE.getValue()); + folderItemReq.setFolderUuid(RandomUtil.generateString(32)); + folderItemReqList.add(folderItemReq); + batchCreateNormalDirReq.setFolderItems(folderItemReqList); + log.info("创建【项目文件】文件夹请求参数:{}", batchCreateNormalDirReq); + try { + SdmResponse response = dataFeignClient.batchCreateNormalDirs(batchCreateNormalDirReq); + log.info("创建【项目文件】文件夹响应:{}", response); + } catch (Exception e) { + log.error("创建【项目文件】文件夹接口失败", e); + } } private void updatePermission(Long userId,String uuid) { @@ -3328,6 +3348,18 @@ public class NodeServiceImpl extends ServiceImpl demandAttachFolderItemReqList = new ArrayList<>(); + BatchCreateNormalDirReq demandAttachBatchCreateNormalDirReq = new BatchCreateNormalDirReq(); + demandAttachBatchCreateNormalDirReq.setParentUUId(projectNodeId); + FolderItemReq demandAttachFolderItemReq = new FolderItemReq(); + demandAttachFolderItemReq.setFolderName(AttachFileTypeEnum.DEMAND_FILE.getValue()); + demandAttachFolderItemReq.setFolderUuid(RandomUtil.generateString(32)); + demandAttachFolderItemReqList.add(demandAttachFolderItemReq); + demandAttachBatchCreateNormalDirReq.setFolderItems(demandAttachFolderItemReqList); + log.info("批量创建需求附件文件夹请求参数:{}", demandAttachBatchCreateNormalDirReq); + BatchCreateNormalDirResp batchCreateNormalDirResp; + try { + SdmResponse response = dataFeignClient.batchCreateNormalDirs(demandAttachBatchCreateNormalDirReq); + log.info("批量创建需求附件文件夹响应:{}", response); + if (!response.isSuccess() || ObjectUtils.isEmpty(response.getData())) { + log.error("调用批量创建需求附件文件夹接口失败,原因为:{}", response.getMessage()); + return SdmResponse.failed("创建需求附件文件夹失败:,原因为:" + response.getMessage()); + } + batchCreateNormalDirResp = response.getData(); + } catch (Exception e) { + log.error("调用批量创建需求附件文件夹接口失败", e); + return SdmResponse.failed("创建需求附件文件夹失败:" + e.getMessage()); + } + + if (ObjectUtils.isEmpty(batchCreateNormalDirResp)) { + log.error("batchCreateNormalDirResp为空"); + return SdmResponse.failed("创建需求附件文件夹失败"); + } + List successList = batchCreateNormalDirResp.getSuccessList(); + if (CollectionUtils.isEmpty(successList)) { + log.error("successList为空"); + return SdmResponse.failed("创建需求附件文件夹失败"); + } + // 需求附件文件夹的元数据主键id + Long demandBatchMetadataInfoId = successList.get(0).getId(); BatchCreateNormalDirReq batchCreateNormalDirReq = new BatchCreateNormalDirReq(); - batchCreateNormalDirReq.setParentUUId(projectNodeId); + batchCreateNormalDirReq.setParentId(demandBatchMetadataInfoId); List folderItemReqList = new ArrayList<>(); for (DirNodeInfo dirNodeInfo : demandDirNodeList) { FolderItemReq folderItemReq = new FolderItemReq(); diff --git a/project/src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java index 681259d6..f767c876 100644 --- a/project/src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java @@ -458,6 +458,7 @@ public class ProjectServiceImpl extends BaseService implements IProjectService { return SdmResponse.success(new ArrayList<>()); } log.info("查询到的节点为:{}", taskTreeNodeList.stream().map(ProjectNodePo::getId).toList()); + taskTreeReq.setFilterDiscipline(req.getFilterDiscipline()); taskTreeTaskList = mapper.getTaskListByTag(taskTreeReq); if (CollectionUtils.isNotEmpty(taskTreeTaskList)) { log.info("查询到的任务为:{}", taskTreeTaskList.stream().map(TaskNodePo::getId).toList()); diff --git a/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java index 0aacd788..c256908e 100644 --- a/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java @@ -29,6 +29,7 @@ import com.sdm.common.entity.req.task.TaskExportExcelParam; import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.project.SpdmTaskVo; import com.sdm.common.entity.resp.project.TaskNodeExtraPo; +import com.sdm.common.entity.resp.system.CIDStaffResp; import com.sdm.common.entity.resp.system.CIDUserResp; import com.sdm.common.entity.resp.system.SysUserGroupDetailResp; import com.sdm.common.feign.impl.data.DataClientFeignClientImpl; @@ -2772,13 +2773,19 @@ public class TaskServiceImpl implements ITaskService { log.info("项目成员为空"); return SdmResponse.success(); } - List userList = (List) ((JSONObject) sdmResponse.getData()).get("data"); + List userList = (List) ((JSONObject) sdmResponse.getData()).get("data"); if (CollectionUtils.isEmpty(userList)) { log.info("项目成员为空"); return SdmResponse.success(); } - List userIdList = userList.stream().map(CIDUserResp::getUserId).distinct().toList(); - Map userMap = userList.stream().collect(Collectors.toMap(CIDUserResp::getUserId, CIDUserResp::getNickname)); + List userIdList = userList.stream().map(CIDStaffResp::getUserId).distinct().toList(); + Map userMap = userList.stream() + .filter(resp -> Objects.nonNull(resp.getUserId()) && Objects.nonNull(resp.getUserInfo())) + .collect(Collectors.toMap( + CIDStaffResp::getUserId, + resp -> resp.getUserInfo().getNickname(), + (oldValue, newValue) -> newValue // 重复key处理:保留新值 + )); req.setUserIds(userIdList); List userGroupTaskCompleteStatistics = mapper.getUserTaskCompleteStatistics(req); // 按用户分组统计任务状态 @@ -2826,13 +2833,19 @@ public class TaskServiceImpl implements ITaskService { log.info("项目成员为空"); return SdmResponse.success(); } - List userList = (List) ((JSONObject) sdmResponse.getData()).get("data"); + List userList = (List) ((JSONObject) sdmResponse.getData()).get("data"); if (CollectionUtils.isEmpty(userList)) { log.info("项目成员为空"); return SdmResponse.success(); } - List userIdList = userList.stream().map(CIDUserResp::getUserId).distinct().toList(); - Map userMap = userList.stream().collect(Collectors.toMap(CIDUserResp::getUserId, CIDUserResp::getNickname)); + List userIdList = userList.stream().map(CIDStaffResp::getUserId).distinct().toList(); + Map userMap = userList.stream() + .filter(resp -> Objects.nonNull(resp.getUserId()) && Objects.nonNull(resp.getUserInfo())) + .collect(Collectors.toMap( + CIDStaffResp::getUserId, + resp -> resp.getUserInfo().getNickname(), + (oldValue, newValue) -> newValue // 重复key处理:保留新值 + )); req.setUserIds(userIdList); List userGroupDifficultyStatistics = mapper.getUserDifficultyStatistics(req); // 按用户分组统计任务状态 diff --git a/project/src/main/resources/mapper/SimulationProjectMapper.xml b/project/src/main/resources/mapper/SimulationProjectMapper.xml index 72dcbf04..b4b7cc67 100644 --- a/project/src/main/resources/mapper/SimulationProjectMapper.xml +++ b/project/src/main/resources/mapper/SimulationProjectMapper.xml @@ -695,6 +695,9 @@ and tag10 like #{searchKey10} + + and (discipline = #{req.filterDiscipline} or discipline = '' or discipline = null) + diff --git a/project/src/main/resources/mapper/SimulationTaskMapper.xml b/project/src/main/resources/mapper/SimulationTaskMapper.xml index f1d20c8c..2b2fe2a3 100644 --- a/project/src/main/resources/mapper/SimulationTaskMapper.xml +++ b/project/src/main/resources/mapper/SimulationTaskMapper.xml @@ -571,6 +571,11 @@ and STR_TO_DATE(finish_time,'%Y-%m-%d %H:%i:%s') <= #{req.finishETime} ]]> + + + and (discipline = #{req.filterDiscipline} or discipline = '' or discipline = null) + + @@ -678,6 +683,11 @@ and STR_TO_DATE(finish_time,'%Y-%m-%d %H:%i:%s') <= #{req.finishETime} ]]> + + + and (discipline = #{req.filterDiscipline} or discipline = '' or discipline = null) + +