671 lines
22 KiB
Markdown
671 lines
22 KiB
Markdown
# 工作流引擎改造方案设计文档
|
||
|
||
## 1. 现状分析
|
||
|
||
### 1.1 现有组件
|
||
|
||
1. 工作流引擎核心组件
|
||
- `AbstractNodeExecutor`: 节点执行器抽象类,提供基础的节点执行逻辑
|
||
- `WorkflowGraph`: 工作流图模型,管理节点和转换关系
|
||
- `INodeExecutor`: 节点执行器接口
|
||
- `WorkflowInstance`: 工作流实例实体
|
||
- `NodeInstance`: 节点实例实体
|
||
|
||
2. 数据模型
|
||
```sql
|
||
-- 工作流定义表
|
||
CREATE TABLE wf_workflow_definition (
|
||
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 '乐观锁版本号',
|
||
|
||
code VARCHAR(100) NOT NULL COMMENT '工作流编码',
|
||
name VARCHAR(100) NOT NULL COMMENT '工作流名称',
|
||
description VARCHAR(255) NULL COMMENT '工作流描述',
|
||
status TINYINT NOT NULL COMMENT '工作流状态(0:草稿,1:已发布,2:已禁用)',
|
||
version_no INT NOT NULL DEFAULT 1 COMMENT '版本号',
|
||
node_config TEXT NULL COMMENT '节点配置(JSON)',
|
||
transition_config TEXT NULL COMMENT '流转配置(JSON)',
|
||
form_definition TEXT NULL COMMENT '表单定义(JSON)',
|
||
graph_definition TEXT NULL COMMENT '图形信息(JSON)',
|
||
enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用',
|
||
|
||
CONSTRAINT UK_workflow_definition_code_version UNIQUE (code, version_no)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流定义表';
|
||
|
||
-- 工作流实例表
|
||
CREATE TABLE wf_workflow_instance (
|
||
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 '乐观锁版本号',
|
||
|
||
workflow_definition_id BIGINT NOT NULL COMMENT '工作流定义ID',
|
||
business_key VARCHAR(100) NOT NULL COMMENT '业务标识',
|
||
status TINYINT NOT NULL COMMENT '状态(0:已创建,1:等待执行,2:执行中,3:已完成,4:执行失败,5:已取消,6:已暂停,7:已终止)',
|
||
start_time DATETIME(6) NULL COMMENT '开始时间',
|
||
end_time DATETIME(6) NULL COMMENT '结束时间',
|
||
error TEXT NULL COMMENT '错误信息',
|
||
|
||
CONSTRAINT FK_workflow_instance_definition FOREIGN KEY (workflow_definition_id) REFERENCES wf_workflow_definition (id)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流实例表';
|
||
|
||
-- 节点实例表
|
||
CREATE TABLE wf_node_instance (
|
||
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 '乐观锁版本号',
|
||
|
||
workflow_instance_id BIGINT NOT NULL COMMENT '工作流实例ID',
|
||
node_id VARCHAR(100) NOT NULL COMMENT '节点ID',
|
||
node_type TINYINT NOT NULL COMMENT '节点类型(0:开始节点,1:结束节点,2:任务节点,3:网关节点,4:子流程节点,5:Shell脚本节点,6:审批节点,7:Jenkins任务节点,8:Git操作节点)',
|
||
name VARCHAR(100) NOT NULL COMMENT '节点名称',
|
||
status TINYINT NOT NULL COMMENT '状态(0:已创建,1:等待执行,2:执行中,3:已完成,4:执行失败,5:已取消,6:已暂停,7:已终止)',
|
||
start_time DATETIME(6) NULL COMMENT '开始时间',
|
||
end_time DATETIME(6) NULL COMMENT '结束时间',
|
||
config TEXT NULL COMMENT '节点配置(JSON)',
|
||
description TEXT NULL COMMENT '节点描述',
|
||
input TEXT NULL COMMENT '输入参数(JSON)',
|
||
output TEXT NULL COMMENT '输出结果(JSON)',
|
||
error TEXT NULL COMMENT '错误信息',
|
||
pre_node_id VARCHAR(100) NULL COMMENT '前置节点ID',
|
||
|
||
CONSTRAINT FK_node_instance_workflow FOREIGN KEY (workflow_instance_id) REFERENCES wf_workflow_instance (id)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='节点实例表';
|
||
|
||
-- 工作流变量表
|
||
CREATE TABLE wf_workflow_variable (
|
||
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 '乐观锁版本号',
|
||
|
||
workflow_instance_id BIGINT NOT NULL COMMENT '工作流实例ID',
|
||
name VARCHAR(100) NOT NULL COMMENT '变量名',
|
||
value TEXT NULL COMMENT '变量值',
|
||
type VARCHAR(20) NOT NULL COMMENT '变量类型',
|
||
|
||
CONSTRAINT FK_workflow_variable_instance FOREIGN KEY (workflow_instance_id) REFERENCES wf_workflow_instance (id),
|
||
CONSTRAINT UK_workflow_variable_instance_name UNIQUE (workflow_instance_id, name)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流变量表';
|
||
|
||
-- 工作流日志表
|
||
CREATE TABLE wf_log (
|
||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||
workflow_instance_id BIGINT NOT NULL COMMENT '工作流实例ID',
|
||
node_id VARCHAR(50) NULL COMMENT '节点ID',
|
||
level VARCHAR(10) NOT NULL COMMENT '日志级别',
|
||
message TEXT NOT NULL COMMENT '日志内容',
|
||
detail TEXT,
|
||
create_time DATETIME NOT NULL,
|
||
create_by VARCHAR(50),
|
||
update_time DATETIME,
|
||
update_by VARCHAR(50),
|
||
version INT DEFAULT 0,
|
||
deleted BOOLEAN DEFAULT FALSE,
|
||
CONSTRAINT FK_workflow_log_instance FOREIGN KEY (workflow_instance_id) REFERENCES wf_workflow_instance (id)
|
||
);
|
||
|
||
-- 工作流权限表
|
||
CREATE TABLE wf_workflow_permission (
|
||
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
|
||
workflow_definition_id BIGINT NOT NULL COMMENT '工作流定义ID',
|
||
type VARCHAR(50) NOT NULL COMMENT '权限类型',
|
||
user_id BIGINT COMMENT '用户ID',
|
||
role_id BIGINT COMMENT '角色ID',
|
||
department_id BIGINT COMMENT '部门ID',
|
||
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
create_by BIGINT NOT NULL COMMENT '创建人',
|
||
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
update_by BIGINT NOT NULL COMMENT '更新人',
|
||
version INT NOT NULL DEFAULT 0 COMMENT '版本号',
|
||
deleted TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
|
||
INDEX idx_workflow_definition_id (workflow_definition_id),
|
||
INDEX idx_user_id (user_id),
|
||
INDEX idx_role_id (role_id),
|
||
INDEX idx_department_id (department_id)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工作流权限';
|
||
|
||
-- 节点类型表
|
||
CREATE TABLE wf_node_type (
|
||
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 '乐观锁版本号',
|
||
|
||
code VARCHAR(100) NOT NULL COMMENT '节点类型编码',
|
||
name VARCHAR(100) NOT NULL COMMENT '节点类型名称',
|
||
description TEXT NULL COMMENT '节点类型描述',
|
||
category VARCHAR(50) NOT NULL COMMENT '节点类型分类',
|
||
icon VARCHAR(100) NULL COMMENT '节点图标',
|
||
color VARCHAR(20) NULL COMMENT '节点颜色',
|
||
executors TEXT NULL COMMENT '执行器列表(JSON)',
|
||
config_schema TEXT NULL COMMENT '节点配置模式(JSON)',
|
||
default_config TEXT NULL COMMENT '默认配置(JSON)',
|
||
enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用',
|
||
|
||
CONSTRAINT UK_node_type_code UNIQUE (code)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='节点类型表';
|
||
|
||
## 2. 改造目标
|
||
|
||
### 2.1 核心需求
|
||
1. 支持审批节点
|
||
2. 实现实时日志
|
||
3. 工作流状态持久化
|
||
4. 支持程序重启后恢复执行
|
||
|
||
### 2.2 技术要求
|
||
1. 遵循现有代码规范
|
||
2. 保持向后兼容
|
||
3. 确保高可用性
|
||
4. 支持并发执行
|
||
|
||
## 3. 详细设计
|
||
|
||
### 3.1 数据库改造
|
||
|
||
#### 3.1.1 修改现有表
|
||
```sql
|
||
-- 修改工作流实例表,添加执行状态字段
|
||
ALTER TABLE wf_workflow_instance
|
||
ADD COLUMN current_node_id varchar(100) COMMENT '当前执行的节点ID',
|
||
ADD COLUMN execution_status varchar(32) COMMENT '执行状态';
|
||
|
||
-- 修改节点实例表,添加重试相关字段
|
||
ALTER TABLE wf_node_instance
|
||
ADD COLUMN retry_count INT DEFAULT 0 COMMENT '重试次数',
|
||
ADD COLUMN max_retry_count INT DEFAULT 0 COMMENT '最大重试次数',
|
||
ADD COLUMN retry_interval INT DEFAULT 0 COMMENT '重试间隔(秒)',
|
||
ADD COLUMN last_retry_time TIMESTAMP COMMENT '最后重试时间';
|
||
```
|
||
|
||
#### 3.1.2 新增审批相关表
|
||
```sql
|
||
-- 审批配置表
|
||
CREATE TABLE wf_approval_config (
|
||
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 '乐观锁版本号',
|
||
|
||
project_id VARCHAR(64) NOT NULL COMMENT '项目ID',
|
||
env_type VARCHAR(20) NOT NULL COMMENT '环境类型',
|
||
approval_type VARCHAR(20) NOT NULL COMMENT '审批类型(SINGLE/MULTI/ANY)',
|
||
approver_ids TEXT NOT NULL COMMENT '审批人ID列表(JSON)',
|
||
required_count INT NOT NULL COMMENT '需要的审批人数',
|
||
timeout_hours INT NOT NULL COMMENT '审批超时时间(小时)',
|
||
enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用',
|
||
|
||
CONSTRAINT UK_approval_config_project_env UNIQUE (project_id, env_type)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='审批配置表';
|
||
|
||
-- 审批实例表
|
||
CREATE TABLE wf_approval_instance (
|
||
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 '乐观锁版本号',
|
||
|
||
node_instance_id VARCHAR(64) NOT NULL COMMENT '节点实例ID',
|
||
workflow_instance_id VARCHAR(64) NOT NULL COMMENT '工作流实例ID',
|
||
project_id VARCHAR(64) NOT NULL COMMENT '项目ID',
|
||
env_type VARCHAR(20) NOT NULL COMMENT '环境类型',
|
||
status VARCHAR(20) NOT NULL COMMENT '状态(PENDING/APPROVED/REJECTED/TIMEOUT)',
|
||
initiator_id VARCHAR(64) NOT NULL COMMENT '发起人ID',
|
||
approved_time DATETIME(6) NULL COMMENT '审批通过时间',
|
||
approver_id VARCHAR(64) NULL COMMENT '审批人ID',
|
||
comment TEXT NULL COMMENT '审批意见',
|
||
|
||
INDEX idx_workflow_instance (workflow_instance_id),
|
||
INDEX idx_node_instance (node_instance_id)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='审批实例表';
|
||
|
||
-- 审批记录表
|
||
CREATE TABLE wf_approval_record (
|
||
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 '乐观锁版本号',
|
||
|
||
approval_instance_id BIGINT NOT NULL COMMENT '审批实例ID',
|
||
approver_id VARCHAR(64) NOT NULL COMMENT '审批人ID',
|
||
action VARCHAR(20) NOT NULL COMMENT '审批动作(APPROVE/REJECT)',
|
||
comment TEXT NULL COMMENT '审批意见',
|
||
|
||
CONSTRAINT FK_approval_record_instance FOREIGN KEY (approval_instance_id)
|
||
REFERENCES wf_approval_instance (id),
|
||
INDEX idx_approval_instance (approval_instance_id)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='审批记录表';
|
||
|
||
### 3.2 代码改造
|
||
|
||
#### 3.2.1 新增枚举
|
||
```java
|
||
/**
|
||
* 节点类型枚举扩展
|
||
*/
|
||
public enum NodeTypeEnum {
|
||
SCRIPT, // 脚本节点
|
||
HTTP, // HTTP请求节点
|
||
APPROVAL, // 审批节点
|
||
// ... 其他节点类型
|
||
}
|
||
|
||
/**
|
||
* 审批类型枚举
|
||
*/
|
||
public enum ApprovalTypeEnum {
|
||
SINGLE, // 单人审批
|
||
MULTI, // 多人会签
|
||
ANY // 任意人审批
|
||
}
|
||
|
||
/**
|
||
* 审批状态枚举
|
||
*/
|
||
public enum ApprovalStatusEnum {
|
||
PENDING, // 待审批
|
||
APPROVED, // 已通过
|
||
REJECTED, // 已拒绝
|
||
TIMEOUT // 已超时
|
||
}
|
||
```
|
||
|
||
#### 3.2.2 实体类
|
||
```java
|
||
/**
|
||
* 审批配置实体
|
||
*/
|
||
@Data
|
||
@EqualsAndHashCode(callSuper = true)
|
||
@Entity
|
||
@Table(name = "wf_approval_config")
|
||
@LogicDelete
|
||
public class ApprovalConfig extends BaseEntity<Long> {
|
||
@Column(nullable = false)
|
||
private String projectId;
|
||
|
||
@Column(nullable = false)
|
||
@Enumerated(EnumType.STRING)
|
||
private String envType;
|
||
|
||
@Column(nullable = false)
|
||
@Enumerated(EnumType.STRING)
|
||
private ApprovalTypeEnum approvalType;
|
||
|
||
@Column(nullable = false)
|
||
private String approverIds;
|
||
|
||
@Column(nullable = false)
|
||
private Integer requiredCount;
|
||
|
||
@Column(nullable = false)
|
||
private Integer timeoutHours;
|
||
}
|
||
|
||
/**
|
||
* 审批实例实体
|
||
*/
|
||
@Data
|
||
@EqualsAndHashCode(callSuper = true)
|
||
@Entity
|
||
@Table(name = "wf_approval_instance")
|
||
@LogicDelete
|
||
public class ApprovalInstance extends BaseEntity<Long> {
|
||
@Column(nullable = false)
|
||
private String nodeInstanceId;
|
||
|
||
@Column(nullable = false)
|
||
private String workflowInstanceId;
|
||
|
||
@Column(nullable = false)
|
||
private String projectId;
|
||
|
||
@Column(nullable = false)
|
||
@Enumerated(EnumType.STRING)
|
||
private String envType;
|
||
|
||
@Column(nullable = false)
|
||
@Enumerated(EnumType.STRING)
|
||
private ApprovalStatusEnum status;
|
||
|
||
@Column(nullable = false)
|
||
private String initiatorId;
|
||
|
||
private LocalDateTime approvedTime;
|
||
private String approverId;
|
||
private String comment;
|
||
}
|
||
```
|
||
|
||
#### 3.2.3 Repository接口
|
||
```java
|
||
/**
|
||
* 审批配置Repository
|
||
*/
|
||
@Repository
|
||
public interface IApprovalConfigRepository extends IBaseRepository<ApprovalConfig, Long> {
|
||
ApprovalConfig findByProjectIdAndEnvType(String projectId, String envType);
|
||
}
|
||
|
||
/**
|
||
* 审批实例Repository
|
||
*/
|
||
@Repository
|
||
public interface IApprovalInstanceRepository extends IBaseRepository<ApprovalInstance, Long> {
|
||
List<ApprovalInstance> findByStatus(ApprovalStatusEnum status);
|
||
ApprovalInstance findByWorkflowInstanceIdAndNodeInstanceId(String workflowInstanceId, String nodeInstanceId);
|
||
}
|
||
```
|
||
|
||
#### 3.2.4 Service接口
|
||
```java
|
||
/**
|
||
* 审批服务接口
|
||
*/
|
||
public interface IApprovalService {
|
||
/**
|
||
* 创建审批实例
|
||
*/
|
||
ApprovalInstance createApprovalInstance(String nodeInstanceId, String workflowInstanceId,
|
||
String projectId, ApprovalConfig config);
|
||
|
||
/**
|
||
* 处理审批结果
|
||
*/
|
||
void handleApproval(Long approvalInstanceId, String approverId,
|
||
boolean approved, String comment);
|
||
|
||
/**
|
||
* 检查审批状态
|
||
*/
|
||
ApprovalStatusEnum checkApprovalStatus(Long approvalInstanceId);
|
||
|
||
/**
|
||
* 发送审批通知
|
||
*/
|
||
void sendApprovalNotifications(ApprovalInstance instance);
|
||
}
|
||
```
|
||
|
||
#### 3.2.5 工作流执行管理器
|
||
```java
|
||
/**
|
||
* 工作流执行管理器
|
||
*/
|
||
@Component
|
||
@Slf4j
|
||
public class WorkflowExecutionManager {
|
||
|
||
@Resource
|
||
private ThreadPoolExecutor workflowExecutor;
|
||
|
||
@Resource
|
||
private WorkflowInstanceRepository instanceRepository;
|
||
|
||
@PostConstruct
|
||
public void init() {
|
||
// 初始化线程池
|
||
workflowExecutor = new ThreadPoolExecutor(
|
||
10, 20, 60L, TimeUnit.SECONDS,
|
||
new LinkedBlockingQueue<>(100),
|
||
new ThreadFactoryBuilder().setNameFormat("workflow-executor-%d").build()
|
||
);
|
||
|
||
// 恢复运行中的工作流
|
||
resumeRunningWorkflows();
|
||
}
|
||
|
||
// ... 其他方法实现
|
||
}
|
||
```
|
||
|
||
#### 3.2.6 审批节点执行器
|
||
```java
|
||
/**
|
||
* 审批节点执行器
|
||
*/
|
||
@Component
|
||
@Slf4j
|
||
public class ApprovalNodeExecutor extends AbstractNodeExecutor {
|
||
|
||
@Resource
|
||
private IApprovalService approvalService;
|
||
|
||
@Override
|
||
public NodeTypeEnum getNodeType() {
|
||
return NodeTypeEnum.APPROVAL;
|
||
}
|
||
|
||
@Override
|
||
protected void doExecute(WorkflowInstance workflowInstance, NodeInstance nodeInstance) {
|
||
// ... 实现审批节点执行逻辑
|
||
}
|
||
}
|
||
```
|
||
|
||
### 3.3 实时日志实现
|
||
|
||
#### 3.3.1 日志收集器
|
||
```java
|
||
/**
|
||
* 日志收集器
|
||
*/
|
||
@Component
|
||
@Slf4j
|
||
public class ProcessLogManager {
|
||
|
||
@Resource
|
||
private WorkflowLogService workflowLogService;
|
||
|
||
private final Map<String, CircularBuffer> logBuffers = new ConcurrentHashMap<>();
|
||
private final Map<String, List<Consumer<String>>> subscribers = new ConcurrentHashMap<>();
|
||
|
||
// ... 实现日志收集和推送逻辑
|
||
}
|
||
```
|
||
|
||
#### 3.3.2 SSE控制器
|
||
```java
|
||
/**
|
||
* 日志SSE控制器
|
||
*/
|
||
@RestController
|
||
@RequestMapping("/api/v1/logs")
|
||
@Tag(name = "工作流日志", description = "工作流日志相关接口")
|
||
public class LogController {
|
||
|
||
@GetMapping(value = "/{nodeInstanceId}/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
|
||
public SseEmitter streamLogs(@PathVariable String nodeInstanceId) {
|
||
// ... 实现SSE日志推送
|
||
}
|
||
}
|
||
```
|
||
|
||
## 4. 开发计划
|
||
|
||
### 4.1 核心功能改造
|
||
|
||
#### 4.1.1 工作流引擎核心
|
||
1. **状态管理优化**
|
||
- 实现工作流实例状态机,支持更细粒度的状态转换
|
||
- 增加节点实例的状态追踪和历史记录
|
||
- 添加工作流暂停/恢复机制
|
||
|
||
2. **并发控制增强**
|
||
- 实现基于数据库的分布式锁
|
||
- 添加节点级别的并发控制
|
||
- 优化多实例并行执行的性能
|
||
|
||
3. **错误处理机制**
|
||
- 完善节点执行失败的重试机制
|
||
- 实现节点回滚功能
|
||
- 添加全局异常处理和日志记录
|
||
- 支持自定义错误处理策略
|
||
|
||
#### 4.1.2 审批功能实现
|
||
1. **审批节点开发**
|
||
- 实现审批节点执行器
|
||
- 支持多种审批模式(单人、多人、任意人)
|
||
- 添加审批超时处理机制
|
||
- 实现审批回调通知
|
||
|
||
2. **审批流程管理**
|
||
- 开发审批配置管理接口
|
||
- 实现审批人动态配置
|
||
- 支持审批规则的版本控制
|
||
- 添加审批历史查询功能
|
||
|
||
3. **审批UI组件**
|
||
- 开发审批任务列表
|
||
- 实现审批详情页面
|
||
- 添加审批操作接口
|
||
- 支持审批意见和附件上传
|
||
|
||
### 4.2 新增功能
|
||
|
||
#### 4.2.1 工作流监控
|
||
1. **实时监控**
|
||
- 实现工作流执行状态实时展示
|
||
- 添加节点执行时间统计
|
||
- 支持执行瓶颈分析
|
||
- 实现资源使用监控
|
||
|
||
2. **报警机制**
|
||
- 添加执行超时告警
|
||
- 实现错误率监控告警
|
||
- 支持自定义告警规则
|
||
- 集成多种告警通道(邮件、短信、webhook等)
|
||
|
||
#### 4.2.2 工作流分析
|
||
1. **统计分析**
|
||
- 实现工作流执行趋势分析
|
||
- 添加节点执行效率分析
|
||
- 支持审批效率统计
|
||
- 开发自定义报表功能
|
||
|
||
2. **可视化展示**
|
||
- 实现工作流执行路径可视化
|
||
- 添加状态转换图表展示
|
||
- 支持审批流程可视化
|
||
- 开发数据大屏功能
|
||
|
||
### 4.3 性能优化
|
||
|
||
1. **数据库优化**
|
||
- 优化表结构和索引
|
||
- 实现分库分表方案
|
||
- 添加缓存机制
|
||
- 优化大数据量查询性能
|
||
|
||
2. **执行引擎优化**
|
||
- 优化线程池管理
|
||
- 实现节点执行预热
|
||
- 添加资源限流机制
|
||
- 优化内存使用
|
||
|
||
### 4.4 开发排期
|
||
|
||
#### Phase 1: 核心功能改造(4周)
|
||
- Week 1-2: 工作流引擎核心改造
|
||
- Week 3-4: 审批功能实现
|
||
|
||
#### Phase 2: 新增功能开发(3周)
|
||
- Week 1-2: 工作流监控功能
|
||
- Week 3: 工作流分析功能
|
||
|
||
#### Phase 3: 性能优化(2周)
|
||
- Week 1: 数据库优化
|
||
- Week 2: 执行引擎优化
|
||
|
||
#### Phase 4: 测试与上线(1周)
|
||
- Day 1-3: 功能测试与bug修复
|
||
- Day 4-5: 性能测试与优化
|
||
- Day 6-7: 准备上线与部署
|
||
|
||
### 4.5 风险评估
|
||
|
||
1. **技术风险**
|
||
- 分布式环境下的状态一致性
|
||
- 大规模并发下的性能表现
|
||
- 复杂工作流的稳定性保证
|
||
|
||
2. **项目风险**
|
||
- 开发周期可能超出预期
|
||
- 新旧版本兼容性问题
|
||
- 现有业务的平滑迁移
|
||
|
||
### 4.6 后续规划
|
||
|
||
1. **功能扩展**
|
||
- 支持更多类型的节点
|
||
- 添加工作流模板功能
|
||
- 实现工作流版本管理
|
||
- 支持跨系统工作流
|
||
|
||
2. **生态建设**
|
||
- 开发SDK工具包
|
||
- 提供更多开箱即用的组件
|
||
- 完善开发文档
|
||
- 建设示例中心
|
||
|
||
## 5. 注意事项
|
||
|
||
1. 数据迁移
|
||
- 需要处理已有的运行中工作流
|
||
- 确保数据一致性
|
||
|
||
2. 性能考虑
|
||
- 控制线程池大小
|
||
- 合理设置日志缓冲区
|
||
- 定期清理历史数据
|
||
|
||
3. 监控告警
|
||
- 添加工作流执行监控
|
||
- 配置审批超时告警
|
||
- 监控系统资源使用
|
||
|
||
## 6. 后续优化
|
||
|
||
1. 功能优化
|
||
- 支持更多审批策略
|
||
- 优化日志查询性能
|
||
- 添加工作流统计分析
|
||
|
||
2. 性能优化
|
||
- 引入分布式锁
|
||
- 优化数据库查询
|
||
- 添加缓存机制
|
||
|
||
3. 运维优化
|
||
- 完善监控指标
|
||
- 优化日志清理
|
||
- 添加性能诊断工具
|