打印了JENKINS节点日志
This commit is contained in:
parent
3b77cf7539
commit
af95532706
@ -15,10 +15,10 @@ import com.qqchen.deploy.backend.system.repository.IUserRepository;
|
|||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceDTO;
|
import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceDTO;
|
||||||
import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceStartRequest;
|
import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceStartRequest;
|
||||||
|
import com.qqchen.deploy.backend.workflow.dto.WorkflowNodeLogDTO;
|
||||||
import com.qqchen.deploy.backend.workflow.dto.inputmapping.ApprovalInputMapping;
|
import com.qqchen.deploy.backend.workflow.dto.inputmapping.ApprovalInputMapping;
|
||||||
import com.qqchen.deploy.backend.workflow.dto.outputs.ApprovalOutputs;
|
import com.qqchen.deploy.backend.workflow.dto.outputs.ApprovalOutputs;
|
||||||
import com.qqchen.deploy.backend.workflow.entity.WorkflowDefinition;
|
import com.qqchen.deploy.backend.workflow.entity.WorkflowDefinition;
|
||||||
import com.qqchen.deploy.backend.workflow.entity.WorkflowNodeLog;
|
|
||||||
import com.qqchen.deploy.backend.workflow.model.NodeContext;
|
import com.qqchen.deploy.backend.workflow.model.NodeContext;
|
||||||
import com.qqchen.deploy.backend.workflow.repository.IWorkflowDefinitionRepository;
|
import com.qqchen.deploy.backend.workflow.repository.IWorkflowDefinitionRepository;
|
||||||
import com.qqchen.deploy.backend.workflow.service.IWorkflowInstanceService;
|
import com.qqchen.deploy.backend.workflow.service.IWorkflowInstanceService;
|
||||||
@ -1028,7 +1028,7 @@ public class DeployServiceImpl implements IDeployService {
|
|||||||
result.setNodeId(nodeId);
|
result.setNodeId(nodeId);
|
||||||
|
|
||||||
// 查询日志
|
// 查询日志
|
||||||
List<WorkflowNodeLog> logs = workflowNodeLogService.getNodeLogs(processInstanceId, nodeId);
|
List<WorkflowNodeLogDTO> logs = workflowNodeLogService.getNodeLogs(processInstanceId, nodeId);
|
||||||
|
|
||||||
if (logs.isEmpty()) {
|
if (logs.isEmpty()) {
|
||||||
// 判断是过期还是还没有日志
|
// 判断是过期还是还没有日志
|
||||||
|
|||||||
@ -1,66 +0,0 @@
|
|||||||
package com.qqchen.deploy.backend.workflow.entity;
|
|
||||||
|
|
||||||
import com.qqchen.deploy.backend.framework.domain.Entity;
|
|
||||||
import com.qqchen.deploy.backend.workflow.enums.LogLevel;
|
|
||||||
import com.qqchen.deploy.backend.workflow.enums.LogSource;
|
|
||||||
import jakarta.persistence.*;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 工作流节点日志实体
|
|
||||||
*
|
|
||||||
* @author qqchen
|
|
||||||
* @since 2025-11-03
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@Table(name = "workflow_node_log")
|
|
||||||
@jakarta.persistence.Entity
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
|
||||||
public class WorkflowNodeLog extends Entity<Long> {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 流程实例ID(Flowable processInstanceId)
|
|
||||||
*/
|
|
||||||
@Column(name = "process_instance_id", nullable = false, length = 64)
|
|
||||||
private String processInstanceId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 节点ID(Flowable nodeId, 例如: sid_xxx)
|
|
||||||
*/
|
|
||||||
@Column(name = "node_id", nullable = false, length = 64)
|
|
||||||
private String nodeId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 日志序号(保证同一节点内日志有序,从1开始递增)
|
|
||||||
*/
|
|
||||||
@Column(name = "sequence_id", nullable = false)
|
|
||||||
private Long sequenceId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 时间戳(Unix毫秒)
|
|
||||||
*/
|
|
||||||
@Column(nullable = false)
|
|
||||||
private Long timestamp;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 日志级别(INFO, WARN, ERROR, DEBUG)
|
|
||||||
*/
|
|
||||||
@Column(nullable = false, length = 10)
|
|
||||||
@Enumerated(EnumType.STRING)
|
|
||||||
private LogLevel level;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 日志来源(JENKINS, FLOWABLE, SHELL, NOTIFICATION)
|
|
||||||
*/
|
|
||||||
@Column(nullable = false, length = 20)
|
|
||||||
@Enumerated(EnumType.STRING)
|
|
||||||
private LogSource source;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 日志内容
|
|
||||||
*/
|
|
||||||
@Column(columnDefinition = "TEXT", nullable = false)
|
|
||||||
private String message;
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -1,49 +0,0 @@
|
|||||||
package com.qqchen.deploy.backend.workflow.repository;
|
|
||||||
|
|
||||||
import com.qqchen.deploy.backend.framework.repository.IBaseRepository;
|
|
||||||
import com.qqchen.deploy.backend.workflow.entity.WorkflowNodeLog;
|
|
||||||
import org.springframework.data.domain.Page;
|
|
||||||
import org.springframework.data.domain.Pageable;
|
|
||||||
import org.springframework.data.jpa.repository.Query;
|
|
||||||
import org.springframework.data.repository.query.Param;
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 工作流节点日志 Repository
|
|
||||||
*
|
|
||||||
* @author qqchen
|
|
||||||
* @since 2025-11-03
|
|
||||||
*/
|
|
||||||
@Repository
|
|
||||||
public interface IWorkflowNodeLogRepository extends IBaseRepository<WorkflowNodeLog, Long> {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据流程实例ID和节点ID查询日志(按序号排序)
|
|
||||||
*/
|
|
||||||
List<WorkflowNodeLog> findByProcessInstanceIdAndNodeIdOrderBySequenceIdAsc(
|
|
||||||
String processInstanceId, String nodeId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据流程实例ID和节点ID分页查询日志
|
|
||||||
*/
|
|
||||||
Page<WorkflowNodeLog> findByProcessInstanceIdAndNodeIdOrderBySequenceIdAsc(
|
|
||||||
String processInstanceId, String nodeId, Pageable pageable);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据流程实例ID查询所有节点的日志
|
|
||||||
*/
|
|
||||||
List<WorkflowNodeLog> findByProcessInstanceIdOrderBySequenceIdAsc(String processInstanceId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除节点的所有日志
|
|
||||||
*/
|
|
||||||
void deleteByProcessInstanceIdAndNodeId(String processInstanceId, String nodeId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 统计节点的日志数量
|
|
||||||
*/
|
|
||||||
long countByProcessInstanceIdAndNodeId(String processInstanceId, String nodeId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
package com.qqchen.deploy.backend.workflow.service;
|
package com.qqchen.deploy.backend.workflow.service;
|
||||||
|
|
||||||
import com.qqchen.deploy.backend.workflow.entity.WorkflowNodeLog;
|
import com.qqchen.deploy.backend.workflow.dto.WorkflowNodeLogDTO;
|
||||||
import com.qqchen.deploy.backend.workflow.enums.LogLevel;
|
import com.qqchen.deploy.backend.workflow.enums.LogLevel;
|
||||||
import com.qqchen.deploy.backend.workflow.enums.LogSource;
|
import com.qqchen.deploy.backend.workflow.enums.LogSource;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
@ -45,12 +45,12 @@ public interface IWorkflowNodeLogService {
|
|||||||
/**
|
/**
|
||||||
* 查询节点的所有日志
|
* 查询节点的所有日志
|
||||||
*/
|
*/
|
||||||
List<WorkflowNodeLog> getNodeLogs(String processInstanceId, String nodeId);
|
List<WorkflowNodeLogDTO> getNodeLogs(String processInstanceId, String nodeId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页查询节点日志
|
* 分页查询节点日志
|
||||||
*/
|
*/
|
||||||
Page<WorkflowNodeLog> getNodeLogs(String processInstanceId, String nodeId, Pageable pageable);
|
Page<WorkflowNodeLogDTO> getNodeLogs(String processInstanceId, String nodeId, Pageable pageable);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除节点日志
|
* 删除节点日志
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
package com.qqchen.deploy.backend.workflow.service.impl;
|
package com.qqchen.deploy.backend.workflow.service.impl;
|
||||||
|
|
||||||
import com.qqchen.deploy.backend.framework.utils.RedisUtil;
|
import com.qqchen.deploy.backend.framework.utils.RedisUtil;
|
||||||
import com.qqchen.deploy.backend.workflow.entity.WorkflowNodeLog;
|
import com.qqchen.deploy.backend.workflow.dto.WorkflowNodeLogDTO;
|
||||||
import com.qqchen.deploy.backend.workflow.enums.LogLevel;
|
import com.qqchen.deploy.backend.workflow.enums.LogLevel;
|
||||||
import com.qqchen.deploy.backend.workflow.enums.LogSource;
|
import com.qqchen.deploy.backend.workflow.enums.LogSource;
|
||||||
import com.qqchen.deploy.backend.workflow.service.IWorkflowNodeLogService;
|
import com.qqchen.deploy.backend.workflow.service.IWorkflowNodeLogService;
|
||||||
@ -122,7 +122,7 @@ public class WorkflowNodeLogServiceImpl implements IWorkflowNodeLogService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<WorkflowNodeLog> getNodeLogs(String processInstanceId, String nodeId) {
|
public List<WorkflowNodeLogDTO> getNodeLogs(String processInstanceId, String nodeId) {
|
||||||
try {
|
try {
|
||||||
String streamKey = buildStreamKey(processInstanceId, nodeId);
|
String streamKey = buildStreamKey(processInstanceId, nodeId);
|
||||||
|
|
||||||
@ -139,7 +139,7 @@ public class WorkflowNodeLogServiceImpl implements IWorkflowNodeLogService {
|
|||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 转换为实体
|
// 转换为 DTO
|
||||||
return records.stream()
|
return records.stream()
|
||||||
.map(record -> convertToWorkflowNodeLog(processInstanceId, nodeId, record))
|
.map(record -> convertToWorkflowNodeLog(processInstanceId, nodeId, record))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
@ -152,8 +152,8 @@ public class WorkflowNodeLogServiceImpl implements IWorkflowNodeLogService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Page<WorkflowNodeLog> getNodeLogs(String processInstanceId, String nodeId, Pageable pageable) {
|
public Page<WorkflowNodeLogDTO> getNodeLogs(String processInstanceId, String nodeId, Pageable pageable) {
|
||||||
List<WorkflowNodeLog> allLogs = getNodeLogs(processInstanceId, nodeId);
|
List<WorkflowNodeLogDTO> allLogs = getNodeLogs(processInstanceId, nodeId);
|
||||||
|
|
||||||
int start = (int) pageable.getOffset();
|
int start = (int) pageable.getOffset();
|
||||||
int end = Math.min(start + pageable.getPageSize(), allLogs.size());
|
int end = Math.min(start + pageable.getPageSize(), allLogs.size());
|
||||||
@ -162,7 +162,7 @@ public class WorkflowNodeLogServiceImpl implements IWorkflowNodeLogService {
|
|||||||
return new PageImpl<>(Collections.emptyList(), pageable, allLogs.size());
|
return new PageImpl<>(Collections.emptyList(), pageable, allLogs.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
List<WorkflowNodeLog> pageContent = allLogs.subList(start, end);
|
List<WorkflowNodeLogDTO> pageContent = allLogs.subList(start, end);
|
||||||
return new PageImpl<>(pageContent, pageable, allLogs.size());
|
return new PageImpl<>(pageContent, pageable, allLogs.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -179,11 +179,11 @@ public class WorkflowNodeLogServiceImpl implements IWorkflowNodeLogService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将 Redis Stream Record 转换为 WorkflowNodeLog 实体
|
* 将 Redis Stream Record 转换为 WorkflowNodeLogDTO
|
||||||
*/
|
*/
|
||||||
private WorkflowNodeLog convertToWorkflowNodeLog(String processInstanceId, String nodeId,
|
private WorkflowNodeLogDTO convertToWorkflowNodeLog(String processInstanceId, String nodeId,
|
||||||
MapRecord<String, Object, Object> record) {
|
MapRecord<String, Object, Object> record) {
|
||||||
WorkflowNodeLog log = new WorkflowNodeLog();
|
WorkflowNodeLogDTO log = new WorkflowNodeLogDTO();
|
||||||
log.setProcessInstanceId(processInstanceId);
|
log.setProcessInstanceId(processInstanceId);
|
||||||
log.setNodeId(nodeId);
|
log.setNodeId(nodeId);
|
||||||
|
|
||||||
|
|||||||
@ -659,29 +659,9 @@ CREATE TABLE workflow_node_instance
|
|||||||
CONSTRAINT FK_workflow_node_instance_instance FOREIGN KEY (workflow_instance_id) REFERENCES workflow_instance (id)
|
CONSTRAINT FK_workflow_node_instance_instance FOREIGN KEY (workflow_instance_id) REFERENCES workflow_instance (id)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流节点实例表';
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流节点实例表';
|
||||||
|
|
||||||
-- 工作流节点日志表
|
-- ⚠️ workflow_node_log 表已废弃
|
||||||
CREATE TABLE workflow_node_log
|
-- 日志现在存储在 Redis Stream 中,保留 7 天后自动删除
|
||||||
(
|
-- 详见 WorkflowNodeLogServiceImpl(基于 RedisUtil)
|
||||||
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
|
|
||||||
create_by VARCHAR(255) NULL COMMENT '创建人',
|
|
||||||
create_time DATETIME(6) NULL COMMENT '创建时间',
|
|
||||||
deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)',
|
|
||||||
update_by VARCHAR(255) NULL COMMENT '更新人',
|
|
||||||
update_time DATETIME(6) NULL COMMENT '更新时间',
|
|
||||||
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
|
|
||||||
|
|
||||||
process_instance_id VARCHAR(64) NOT NULL COMMENT '流程实例ID(Flowable processInstanceId)',
|
|
||||||
node_id VARCHAR(64) NOT NULL COMMENT '节点ID(Flowable nodeId, 例如: sid_xxx)',
|
|
||||||
sequence_id BIGINT NOT NULL COMMENT '日志序号(保证同一节点内日志有序,从1开始递增)',
|
|
||||||
timestamp BIGINT NOT NULL COMMENT '时间戳(Unix毫秒)',
|
|
||||||
level VARCHAR(10) NOT NULL COMMENT '日志级别(INFO, WARN, ERROR, DEBUG)',
|
|
||||||
source VARCHAR(20) NOT NULL COMMENT '日志来源(JENKINS, FLOWABLE, SHELL, NOTIFICATION)',
|
|
||||||
message TEXT NOT NULL COMMENT '日志内容',
|
|
||||||
|
|
||||||
INDEX idx_process_node_seq (process_instance_id, node_id, sequence_id),
|
|
||||||
INDEX idx_process_seq (process_instance_id, sequence_id),
|
|
||||||
INDEX idx_timestamp (timestamp)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流节点日志表';
|
|
||||||
|
|
||||||
-- --------------------------------------------------------------------------------------
|
-- --------------------------------------------------------------------------------------
|
||||||
-- 项目管理相关表
|
-- 项目管理相关表
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user