@flowlab/all
Version:
A cool library focusing on handling various flows
913 lines (785 loc) • 23 kB
Markdown
## 数据处理与审批工作流
主要组件包括:
1. **核心部分**:
- FlowLab: 入口类,提供创建工作流和注册节点的能力
- Workflow: 工作流实例,支持添加步骤、条件分支和执行
2. **引擎部分**:
- NodeRegistry: 节点注册中心
- StatusTracker: 状态跟踪器
- Scheduler: 调度器
- ErrorHandler: 错误处理器
- Runner: 运行器
3. **节点部分**:
- BaseNode: 基础节点
- ConditionNode: 条件节点
- SubWorkflowNode: 子工作流节点
4. **持久化部分**:
- Persistence: 持久化接口
- MemoryPersistence: 内存持久化实现
- RedisPersistence: Redis持久化实现
我将构建一个包含所有这些组件的API文档,然后创建一个全面的使用示例。</think># FlowLab API 文档
根据您提供的代码文件,我对 FlowLab 工作流系统进行了详细分析。下面是完整的 API 文档(中文版)及使用示例。
<!-- MARK: Core
-->
## 1. 核心模块 (Core)
<!-- MARK: FlowLab
-->
### 1.1 FlowLab 类
FlowLab 是整个工作流系统的入口类,提供创建工作流和注册节点的核心能力。
```typescript
class FlowLab {
/**
* 创建一个新的工作流实例
* @param name 工作流名称
* @returns 返回一个新的 Workflow 实例
*/
static create(name: string): Workflow;
/**
* 注册一个节点(基础方式:名称 + 函数 + 可选描述)
* @param name 节点名称
* @param fn 节点执行函数
* @param description 可选的节点描述
* @returns 返回注册的节点条目
*/
static registerNode<Input = any, Output = any, Context = any>(
name: string,
fn: NodeFunction<Input, Output, Context>,
description?: string
): NodeRegistryEntry<Input, Output, Context>;
/**
* 注册一个节点(高级方式:带 metadata 对象)
* @param metadata 节点元数据对象
* @param fn 节点执行函数
* @returns 返回注册的节点条目
*/
static registerNodeWithMeta<Input = any, Output = any, Context = any>(
metadata: NodeMetadata,
fn: NodeFunction<Input, Output, Context>
): NodeRegistryEntry<Input, Output, Context>;
/**
* 获取所有已注册的节点
* @returns 返回所有注册节点的数组
*/
static getAllRegisteredNodes(): NodeRegistryEntry<any, any, any>[];
}
```
<!-- MARK: Workflow
-->
### 1.2 Workflow 类
Workflow 是工作流的核心类,支持链式调用添加各种节点和执行工作流。
```typescript
class Workflow {
/**
* 构造函数
* @param name 工作流名称
*/
constructor(name: string);
/**
* 添加一个顺序执行的节点
* @param name 节点名称
* @param fn 节点执行函数
* @param options 可选节点配置(重试次数、超时等)
* @returns 返回当前 Workflow 实例,支持链式调用
*/
addStep(
name: string,
fn: NodeFunction,
options?: NodeOptions
): this;
/**
* 添加并行执行的多个节点
* @param steps 节点配置数组
* @returns 返回当前 Workflow 实例,支持链式调用
*/
addParallelStep(
steps: {
name: string;
fn: NodeFunction;
options?: NodeOptions;
}[]
): this;
/**
* 添加条件分支节点
* @param condition 条件函数,返回分支名称或布尔值
* @param branches 分支路径映射表
* @returns 返回当前 Workflow 实例,支持链式调用
*/
addCondition(
condition: (input: any, context: WorkflowContext) => string | boolean,
branches: Record<string, Workflow>
): this;
/**
* 添加子工作流节点
* @param name 子工作流节点名称
* @param workflow 子工作流实例
* @returns 返回当前 Workflow 实例,支持链式调用
*/
addSubWorkflow(name: string, workflow: Workflow): this;
/**
* 执行工作流
* @param input 工作流输入数据
* @param context 可选的执行上下文(用户ID、租户ID等)
* @returns 返回工作流执行结果 Promise
*/
run(input: any, context?: WorkflowContext): Promise<any>;
}
```
<!-- MARK: Engine
-->
## 2. 引擎模块 (Engine)
<!-- MARK: NodeRegistry
-->
### 2.1 NodeRegistry 类
NodeRegistry 是节点注册中心,负责管理系统中所有可用的节点。
```typescript
class NodeRegistry {
/**
* 注册一个新的节点函数(基础方式)
* @param name 节点名称
* @param fn 节点执行函数
* @param description 可选描述
* @returns 返回注册的节点条目
*/
static register<Input = any, Output = any, Context = any>(
name: string,
fn: NodeFunction<Input, Output, Context>,
description?: string
): NodeRegistryEntry<Input, Output, Context>;
/**
* 注册一个新的节点函数(高级方式)
* @param metadata 节点元数据对象
* @param fn 节点执行函数
* @returns 返回注册的节点条目
*/
static register<Input = any, Output = any, Context = any>(
metadata: NodeMetadata,
fn: NodeFunction<Input, Output, Context>
): NodeRegistryEntry<Input, Output, Context>;
/**
* 获取指定名称的节点函数
* @param name 节点名称
* @returns 返回节点函数或 undefined
*/
static getNodeFunction(name: string): NodeFunction | undefined;
/**
* 获取指定名称的节点元数据
* @param name 节点名称
* @returns 返回节点元数据或 undefined
*/
static getNodeMetadata(name: string): NodeMetadata | undefined;
/**
* 获取所有已注册的节点
* @returns 返回所有注册节点的数组
*/
static getAllNodes(): NodeRegistryEntry<any, any, any>[];
/**
* 检查节点是否已存在
* @param name 节点名称
* @returns 返回是否存在的布尔值
*/
static exists(name: string): boolean;
}
```
<!-- MARK: StatusTracker
-->
### 2.2 StatusTracker 类
StatusTracker 负责跟踪工作流中各节点的执行状态。
```typescript
class StatusTracker {
/**
* 构造函数
* @param workflowName 工作流名称
*/
constructor(workflowName: string);
/**
* 更新节点状态
* @param nodeName 节点名称
* @param status 状态值(PENDING/RUNNING/COMPLETED/FAILED/SKIPPED)
*/
update(nodeName: string, status: TaskStatus): void;
/**
* 获取节点状态
* @param nodeName 节点名称
* @returns 返回节点状态或 undefined
*/
getStatus(nodeName: string): TaskStatus | undefined;
/**
* 获取所有节点的状态
* @returns 返回节点状态映射表
*/
getAll(): TaskStatusMap;
/**
* 重置所有状态
*/
reset(): void;
}
```
<!-- MARK: 调度器
-->
### 2.3 Scheduler 类
Scheduler 提供工作流延迟执行和立即执行的能力。
```typescript
class Scheduler {
/**
* 延迟执行工作流
* @param delay 延迟时间(毫秒)
* @param workflow 要执行的工作流
* @param input 初始输入数据
* @param context 执行上下文
*/
static scheduleWithDelay(
delay: number,
workflow: Workflow,
input: any,
context?: Record<string, any>
): void;
/**
* 立即执行工作流
* @param workflow 要执行的工作流
* @param input 初始输入数据
* @param context 执行上下文
* @returns 执行结果 Promise
*/
static runNow(
workflow: Workflow,
input: any,
context?: Record<string, any>
): Promise<any>;
}
```
<!-- MARK: 错误处理
-->
### 2.4 ErrorHandler 类
ErrorHandler 负责统一处理工作流执行过程中的错误。
```typescript
class ErrorHandler {
/**
* 注册全局错误处理函数
* @param handler 错误处理函数
*/
static register(handler: TaskErrorHandler): void;
/**
* 处理节点执行错误
* @param taskName 节点名称
* @param error 错误对象
*/
static handleNodeError(taskName: string, error: unknown): void;
}
```
<!-- MARK: Runner
-->
### 2.5 Runner 类
Runner 负责执行一组工作流步骤(顺序、并行、条件、子流程)。
```typescript
class Runner {
/**
* 构造函数
* @param steps 工作流步骤数组
* @param workflowName 工作流名称
* @param context 执行上下文
*/
constructor(steps: Step[], workflowName: string, context: Record<string, any>);
/**
* 执行完整工作流
* @param input 初始输入数据
* @returns 执行结果 Promise
*/
execute(input: any): Promise<any>;
}
```
<!-- MARK: - - Nodes -。
-->
## 3. 节点模块 (Nodes)
<!-- MARK: BaseNode
-->
### 3.1 BaseNode 类
BaseNode 是最基本的执行节点,包含重试、超时和条件控制功能。
```typescript
class BaseNode {
/**
* 构造函数
* @param name 节点名称
* @param fn 节点执行函数
* @param options 节点配置选项
*/
constructor(name: string, fn: NodeFunction, options?: NodeOptions);
/**
* 执行节点函数
* @param input 输入数据
* @param context 执行上下文
* @returns 执行结果 Promise
*/
execute(input: any, context: any): Promise<any>;
}
```
<!-- MARK: 条件节点
-->
### 3.2 ConditionNode 类
ConditionNode 用于根据条件选择执行分支。
```typescript
class ConditionNode {
/**
* 构造函数
* @param name 节点名称
* @param conditionFn 条件函数
* @param branches 分支映射表
*/
constructor(
name: string,
conditionFn: (input: any, context: any) => string | boolean,
branches: Record<string, Workflow>
);
/**
* 解析应该执行的分支
* @param input 输入数据
* @param context 执行上下文
* @returns 分支名称或布尔值
*/
resolveBranch(input: any, context: any): Promise<string | boolean>;
/**
* 获取指定的分支工作流
* @param branch 分支名称或布尔值
* @returns 返回对应的工作流或 undefined
*/
getBranch(branch: string | boolean): Workflow | undefined;
}
```
<!-- MARK: 子工作流
-->
### 3.3 SubWorkflowNode 类
SubWorkflowNode 用于嵌套执行另一个工作流。
```typescript
class SubWorkflowNode {
/**
* 构造函数
* @param name 节点名称
* @param workflow 子工作流实例
*/
constructor(name: string, workflow: Workflow);
/**
* 执行子工作流
* @param input 输入数据
* @param context 执行上下文
* @returns 执行结果 Promise
*/
run(input: any, context: any): Promise<void>;
}
```
<!-- MARK: - -持久化
-->
## 4. 持久化模块 (Persistence)
<!-- MARK: Persistence
-->
### 4.1 Persistence 模块
Persistence 是持久化入口模块,允许注入不同的持久化引擎。
```typescript
const Persistence = {
/**
* 设置持久化引擎
* @param p 持久化引擎实例
*/
use(p: PersistenceEngine): void;
/**
* 获取当前使用的持久化引擎
* @returns 当前持久化引擎
*/
current(): PersistenceEngine;
};
```
<!-- MARK: Memory
-->
### 4.2 MemoryPersistence 类
MemoryPersistence 是基于内存的持久化实现,适用于本地开发和测试。
```typescript
class MemoryPersistence implements PersistenceEngine {
/**
* 保存工作流快照
* @param workflowId 工作流ID
* @param snapshot 工作流快照
*/
async save(workflowId: string, snapshot: WorkflowSnapshot): Promise<void>;
/**
* 加载工作流快照
* @param workflowId 工作流ID
* @returns 返回工作流快照或 null
*/
async load(workflowId: string): Promise<WorkflowSnapshot | null>;
/**
* 更新节点状态
* @param workflowId 工作流ID
* @param nodeId 节点ID
* @param status 节点状态
*/
async updateStatus(workflowId: string, nodeId: string, status: TaskState): Promise<void>;
/**
* 清除工作流快照
* @param workflowId 工作流ID
*/
async clear(workflowId: string): Promise<void>;
}
```
<!-- MARK: Redis
-->
### 4.3 RedisPersistence 类
RedisPersistence 是基于 Redis 的持久化实现,适用于分布式环境。
```typescript
class RedisPersistence implements PersistenceEngine {
/**
* 构造函数
* @param redisUrl Redis 连接 URL
*/
constructor(redisUrl?: string);
/**
* 保存工作流快照
* @param workflowId 工作流ID
* @param snapshot 工作流快照
*/
async save(workflowId: string, snapshot: WorkflowSnapshot): Promise<void>;
/**
* 加载工作流快照
* @param workflowId 工作流ID
* @returns 返回工作流快照或 null
*/
async load(workflowId: string): Promise<WorkflowSnapshot | null>;
/**
* 更新节点状态
* @param workflowId 工作流ID
* @param nodeId 节点ID
* @param status 节点状态
*/
async updateStatus(workflowId: string, nodeId: string, status: TaskState): Promise<void>;
/**
* 清除工作流快照
* @param workflowId 工作流ID
*/
async clear(workflowId: string): Promise<void>;
}
```
<!-- MARK: - -Types
-->
## 5. 类型定义
<!-- MARK: Node
-->
### 5.1 节点类型
```typescript
// 节点执行函数
type NodeFunction<Input = any, Output = any, Context = any> = (
input: Input,
context: Context
) => Promise<Output>;
// 节点元数据
interface NodeMetadata {
name: string;
description?: string;
}
// 节点注册条目
interface NodeRegistryEntry<Input = any, Output = any, Context = any> {
metadata: NodeMetadata;
nodeFunction: NodeFunction<Input, Output, Context>;
}
// 节点选项
interface NodeOptions {
retries?: number;
timeout?: number;
condition?: (input: any, context?: any) => boolean;
}
```
<!-- MARK: 工作流类型
-->
### 5.2 工作流类型
```typescript
// 步骤类型
type Step =
| { type: 'step'; node: any }
| { type: 'parallel'; nodes: any[] }
| { type: 'condition'; node: any }
| { type: 'subworkflow'; node: any };
// 工作流上下文
interface WorkflowContext {
tenantId?: string;
userId?: string;
userRole?: string;
traceId?: string;
locale?: string;
[key: string]: any;
}
```
<!-- MARK: 错误处理类型
-->
### 5.3 状态与错误处理类型
```typescript
// 任务状态
type TaskStatus = 'PENDING' | 'RUNNING' | 'COMPLETED' | 'FAILED' | 'SKIPPED';
// 任务状态映射
interface TaskStatusMap {
[nodeName: string]: TaskStatus;
}
// 错误信息
interface TaskErrorInfo {
taskName: string;
message: string;
raw: unknown;
timestamp: string;
}
// 错误处理函数
type TaskErrorHandler = (errorInfo: TaskErrorInfo) => void;
```
<!-- MARK: 持久化类型
-->
### 5.4 持久化类型
```typescript
// 任务状态
type TaskState = 'PENDING' | 'RUNNING' | 'COMPLETED' | 'FAILED';
// 工作流快照
interface WorkflowSnapshot {
workflowId: string;
name: string;
data: any;
states: Record<string, TaskState>;
updatedAt: string;
}
// 持久化引擎接口
interface PersistenceEngine {
save(workflowId: string, snapshot: WorkflowSnapshot): Promise<void>;
load(workflowId: string): Promise<WorkflowSnapshot | null>;
updateStatus(workflowId: string, nodeId: string, status: TaskState): Promise<void>;
clear(workflowId: string): Promise<void>;
}
```
## 使用示例:数据处理与审批工作流
下面是一个完整的示例,演示了如何使用 FlowLab 构建一个包含数据处理、条件判断和审批流程的工作流系统:
```typescript
import {
FlowLab,
Workflow,
NodeRegistry,
StatusTracker,
Scheduler,
ErrorHandler,
Persistence
} from '@flowlab/core';
import { RedisPersistence } from '@flowlab/core';
// 1. 注册自定义错误处理器
ErrorHandler.register((errorInfo) => {
console.error(`[监控报警] 节点 ${errorInfo.taskName} 执行失败: ${errorInfo.message}`);
// 可以在这里集成第三方监控或通知系统,如 Sentry、钉钉、邮件等
});
// 2. 配置持久化引擎(可选)
// 默认使用内存存储,适合开发和测试
// 生产环境可以切换到 Redis 等分布式存储
// Persistence.use(new RedisPersistence('redis://localhost:6379'));
// 3. 注册各种节点(处理函数)
// 3.1 数据获取节点
FlowLab.registerNode(
'fetchUserData',
async (userId, context) => {
console.log(`[节点日志] 正在获取用户数据: ${userId}`);
// 模拟数据库查询
await new Promise(resolve => setTimeout(resolve, 300));
return {
id: userId,
name: '张三',
age: 30,
score: 85,
applyAmount: 10000
};
},
'从数据库获取用户信息'
);
// 3.2 数据转换节点
FlowLab.registerNode(
'transformData',
async (userData, context) => {
console.log(`[节点日志] 正在转换用户数据: ${userData.id}`);
return {
...userData,
creditScore: userData.score * 1.2, // 信用分计算
risk: userData.score < 60 ? 'high' : userData.score < 80 ? 'medium' : 'low' // 风险等级
};
},
'转换用户数据并计算信用分'
);
// 3.3 风险评估节点
FlowLab.registerNode(
'riskAssessment',
async (userData, context) => {
console.log(`[节点日志] 风险评估: ${userData.id}, 风险等级: ${userData.risk}`);
// 模拟外部系统调用
await new Promise(resolve => setTimeout(resolve, 500));
const approved = userData.risk !== 'high';
return {
...userData,
initialApproved: approved,
comments: approved ? '自动审批通过' : '高风险,需要人工审核'
};
},
'进行风险评估并生成初步审批结果'
);
// 3.4 自动审批节点
FlowLab.registerNode(
'autoApproval',
async (userData, context) => {
console.log(`[节点日志] 自动审批: ${userData.id}`);
return {
...userData,
approved: true,
approver: 'system',
approvalTime: new Date().toISOString()
};
},
'自动审批通过流程'
);
// 3.5 人工审批节点(模拟)
FlowLab.registerNode(
'manualApproval',
async (userData, context) => {
console.log(`[节点日志] 人工审批: ${userData.id}`);
// 模拟人工审批
await new Promise(resolve => setTimeout(resolve, 1000));
const approved = Math.random() > 0.3; // 70% 概率通过
return {
...userData,
approved,
approver: '审批人员ID-' + Math.floor(Math.random() * 1000),
approvalTime: new Date().toISOString(),
comments: approved ? '人工审批通过' : '人工审批拒绝,额度过高'
};
},
'人工审批流程'
);
// 3.6 通知节点
FlowLab.registerNode(
'sendNotification',
async (userData, context) => {
const status = userData.approved ? '已通过' : '已拒绝';
console.log(`[节点日志] 发送通知: 用户 ${userData.id} 的申请${status}`);
// 模拟发送通知
await new Promise(resolve => setTimeout(resolve, 200));
return {
...userData,
notificationSent: true,
notificationTime: new Date().toISOString()
};
},
'发送审批结果通知'
);
// 3.7 数据归档节点
FlowLab.registerNodeWithMeta(
{
name: 'archiveData',
description: '将审批数据归档到数据库'
},
async (userData, context) => {
console.log(`[节点日志] 归档数据: ${userData.id}, 审批结果: ${userData.approved ? '通过' : '拒绝'}`);
// 模拟数据存储
await new Promise(resolve => setTimeout(resolve, 300));
return {
...userData,
archived: true,
archiveTime: new Date().toISOString()
};
}
);
// 4. 构建工作流
// 4.1 创建主工作流
const mainWorkflow = FlowLab.create('贷款审批流程')
.addStep('fetchUserData', NodeRegistry.getNodeFunction('fetchUserData'))
.addStep('transformData', NodeRegistry.getNodeFunction('transformData'))
.addStep('riskAssessment', NodeRegistry.getNodeFunction('riskAssessment'));
// 4.2 创建自动审批子流程
const autoApprovalFlow = FlowLab.create('自动审批流程')
.addStep('autoApproval', NodeRegistry.getNodeFunction('autoApproval'))
.addStep('sendNotification', NodeRegistry.getNodeFunction('sendNotification'))
.addStep('archiveData', NodeRegistry.getNodeFunction('archiveData'));
// 4.3 创建人工审批子流程
const manualApprovalFlow = FlowLab.create('人工审批流程')
.addStep('manualApproval', NodeRegistry.getNodeFunction('manualApproval'), {
// 添加重试和超时配置
retries: 2,
timeout: 10000
})
.addStep('sendNotification', NodeRegistry.getNodeFunction('sendNotification'))
.addStep('archiveData', NodeRegistry.getNodeFunction('archiveData'));
// 4.4 添加条件分支到主流程
mainWorkflow.addCondition(
(data, context) => {
// 根据风险等级和初步审批结果选择流程分支
if (data.initialApproved && data.applyAmount <= 5000) {
return 'auto'; // 低风险小额自动通过
}
return 'manual'; // 其他情况走人工审批
},
{
'auto': autoApprovalFlow,
'manual': manualApprovalFlow
}
);
// 5. 添加并行执行的数据分析步骤(可选)
const dataAnalysisWorkflow = FlowLab.create('数据分析流程')
.addParallelStep([
{
name: 'userProfileAnalysis',
fn: async (data, context) => {
console.log(`[节点日志] 用户画像分析: ${data.id}`);
return { profileComplete: true };
}
},
{
name: 'marketSegmentation',
fn: async (data, context) => {
console.log(`[节点日志] 市场细分分析: ${data.id}`);
return { segment: 'premium' };
}
}
]);
// 将数据分析作为子流程添加到主流程
mainWorkflow.addSubWorkflow('dataAnalysis', dataAnalysisWorkflow);
// 6. 执行工作流
async function runApprovalProcess(userId) {
try {
// 6.1 创建执行上下文
const context = {
traceId: `trace-${Date.now()}`,
tenantId: 'company-A',
userRole: 'admin'
};
// 6.2 立即执行
console.log(`[工作流] 开始执行贷款审批流程,用户ID: ${userId}`);
const result = await mainWorkflow.run(userId, context);
console.log(`[工作流] 审批流程执行完成,结果:`, result);
// 6.3 延迟执行(可用于定时任务)
/*
Scheduler.scheduleWithDelay(
5000, // 5秒后执行
mainWorkflow,
userId,
context
);
*/
return result;
} catch (error) {
console.error(`[工作流] 审批流程执行失败: ${error.message}`);
throw error;
}
}
// 7. 查看已注册的所有节点
console.log('系统已注册节点列表:');
FlowLab.getAllRegisteredNodes().forEach(node => {
console.log(`- ${node.metadata.name}: ${node.metadata.description || '无描述'}`);
});
// 8. 调用执行入口
runApprovalProcess('user123')
.then(finalResult => {
console.log('流程最终执行结果:', finalResult);
})
.catch(err => {
console.error('流程执行异常:', err);
});
```
此示例展示了 FlowLab 的核心功能,包括:
1. 节点注册与管理
2. 工作流构建(顺序、并行、条件分支、子流程)
3. 错误处理与监控
4. 持久化配置
5. 调度执行(立即/延迟)
您可以根据实际需求调整和扩展这个示例。