From d0f2e78ee78d2678ab75f3ab16af1f6de6457e9d Mon Sep 17 00:00:00 2001 From: dengqichen Date: Mon, 10 Nov 2025 09:49:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=93=E5=8D=B0=E4=BA=86JENKINS=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deploy/dto/TeamApplicationDTO.java | 3 ++ .../IRepositoryGroupRepository.java | 8 +++ .../impl/RepositoryProjectServiceImpl.java | 11 ++-- .../impl/TeamApplicationServiceImpl.java | 30 ++++++++++- .../workflow/dto/WorkflowNodeLogDTO.java | 53 +++++++++++++++++++ 5 files changed, 98 insertions(+), 7 deletions(-) create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/WorkflowNodeLogDTO.java diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/TeamApplicationDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/TeamApplicationDTO.java index 3fec62b7..8d2fa5e0 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/TeamApplicationDTO.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/dto/TeamApplicationDTO.java @@ -29,6 +29,9 @@ public class TeamApplicationDTO extends BaseDTO { @Schema(description = "部署系统ID(Jenkins系统)") private Long deploySystemId; + @Schema(description = "部署系统名称") + private String deploySystemName; + @Schema(description = "部署任务ID(Jenkins Job)") private String deployJob; diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IRepositoryGroupRepository.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IRepositoryGroupRepository.java index 7c86437f..13e524f5 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IRepositoryGroupRepository.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/repository/IRepositoryGroupRepository.java @@ -45,4 +45,12 @@ public interface IRepositoryGroupRepository extends IBaseRepository findByRepoGroupIdAndExternalSystemIdAndDeletedFalse(Long repoGroupId, Long externalSystemId); + + /** + * 根据Git系统组ID列表批量查询仓库组(用于填充扩展字段) + * + * @param repoGroupIds Git系统组ID列表 + * @return 仓库组列表 + */ + List findByRepoGroupIdIn(List repoGroupIds); } \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/RepositoryProjectServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/RepositoryProjectServiceImpl.java index 5e42e983..b76ff263 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/RepositoryProjectServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/RepositoryProjectServiceImpl.java @@ -324,20 +324,21 @@ public class RepositoryProjectServiceImpl extends BaseServiceImpl repoGroupIds = projects.stream() .map(RepositoryProjectDTO::getRepoGroupId) .filter(id -> id != null) .collect(Collectors.toSet()); - // 2. 批量查询仓库组信息 + // 2. 批量查询仓库组信息(根据 repo_group_id 字段查询,不是主键 id) Map repoGroupMap = Collections.emptyMap(); if (!repoGroupIds.isEmpty()) { - repoGroupMap = repositoryGroupRepository.findAllById(repoGroupIds).stream() - .collect(Collectors.toMap(RepositoryGroup::getId, Function.identity())); + List repoGroupIdList = new ArrayList<>(repoGroupIds); + repoGroupMap = repositoryGroupRepository.findByRepoGroupIdIn(repoGroupIdList).stream() + .collect(Collectors.toMap(RepositoryGroup::getRepoGroupId, Function.identity())); } - // 3. 填充仓库组名称 + // 3. 填充仓库组名称(使用 repo_group_id 作为 key) Map finalRepoGroupMap = repoGroupMap; projects.forEach(project -> { if (project.getRepoGroupId() != null) { diff --git a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/TeamApplicationServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/TeamApplicationServiceImpl.java index 1622b73a..afab64bc 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/TeamApplicationServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/deploy/service/impl/TeamApplicationServiceImpl.java @@ -8,7 +8,9 @@ import com.qqchen.deploy.backend.deploy.entity.Environment; import com.qqchen.deploy.backend.deploy.entity.Team; import com.qqchen.deploy.backend.deploy.entity.TeamApplication; import com.qqchen.deploy.backend.deploy.query.TeamApplicationQuery; +import com.qqchen.deploy.backend.deploy.entity.ExternalSystem; import com.qqchen.deploy.backend.deploy.repository.IApplicationRepository; +import com.qqchen.deploy.backend.deploy.repository.IExternalSystemRepository; import com.qqchen.deploy.backend.deploy.repository.IDeployRecordRepository; import com.qqchen.deploy.backend.deploy.repository.IEnvironmentRepository; import com.qqchen.deploy.backend.deploy.repository.ITeamApplicationRepository; @@ -51,6 +53,9 @@ public class TeamApplicationServiceImpl extends BaseServiceImpl使用批量查询避免N+1问题 */ @@ -110,6 +115,11 @@ public class TeamApplicationServiceImpl extends BaseServiceImpl deploySystemIds = teamApps.stream() + .map(TeamApplicationDTO::getDeploySystemId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + // 2. 批量查询团队信息 Map teamMap = new HashMap<>(); if (!teamIds.isEmpty()) { @@ -142,7 +152,15 @@ public class TeamApplicationServiceImpl extends BaseServiceImpl externalSystemMap = new HashMap<>(); + if (!deploySystemIds.isEmpty()) { + externalSystemRepository.findAllById(deploySystemIds).forEach(system -> + externalSystemMap.put(system.getId(), system) + ); + } + + // 7. 填充扩展字段 teamApps.forEach(teamApp -> { // 填充团队名称 if (teamApp.getTeamId() != null) { @@ -176,6 +194,14 @@ public class TeamApplicationServiceImpl extends BaseServiceImpl + * 日志存储在 Redis Stream 中,不再使用 MySQL,此类仅用于数据传输 + * + * @author qqchen + * @since 2025-11-03 + */ +@Data +public class WorkflowNodeLogDTO { + + /** + * 流程实例ID(Flowable processInstanceId) + */ + private String processInstanceId; + + /** + * 节点ID(Flowable nodeId, 例如: sid_xxx) + */ + private String nodeId; + + /** + * 日志序号(保证同一节点内日志有序,从1开始递增) + */ + private Long sequenceId; + + /** + * 时间戳(Unix毫秒) + */ + private Long timestamp; + + /** + * 日志级别(INFO, WARN, ERROR, DEBUG) + */ + private LogLevel level; + + /** + * 日志来源(JENKINS, FLOWABLE, SHELL, NOTIFICATION) + */ + private LogSource source; + + /** + * 日志内容 + */ + private String message; +} +