SubflowActivity
分类: 通用步骤
命名空间: CMS.Plugin.FlowManagement.Abstractions.FlowBusiness.Activitys
基类: BusinessActivity
模块: FlowManagement.Abstractions
概述
SubflowActivity(子流程)是用于在主流程中启动和执行子流程的特殊节点。通过指定子流程的流程编号,可以在主流程执行过程中调用另一个独立的流程,实现流程的模块化和复用。子流程节点支持父子流程之间的参数传递,可以将主流程的数据传递给子流程,也可以将子流程的执行结果返回给主流程。
子流程是流程设计中的重要模式,它允许将复杂的业务逻辑分解为多个独立的、可复用的流程模块,提高流程的可维护性和可扩展性。
业务场景
适用场景
- 流程复用: 将常用的业务逻辑封装为子流程,在多个主流程中复用
- 流程模块化: 将复杂流程分 解为多个子流程,降低单个流程的复杂度
- 动态流程: 根据业务条件动态选择要执行的子流程
- 标准化操作: 将标准化的操作流程封装为子流程,确保执行一致性
- 流程嵌套: 支持多层嵌套的子流程调用
在系统中的作用
SubflowActivity 在 LMES 流程系统中扮演着流程组合器的角色:
- 启动和管理子流程的执行
- 处理父子流程之间的参数传递
- 维护父子流程的关联关系
- 支持流程的模块化设计
- 提供流程复用机制
与其他节点的协作
- BusinessActivity: 子流程中的业务节点,正常执行业务逻辑
- 主流程节点: SubflowActivity 作为主流程中的一个节点,与其他节点协作
- 参数映射: 通过 Mapping 配置实现父子流程的数据交换
配置说明
基本配置
| 属性名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| ProcessflowID | int | 是 | 0 | 子流程编号,需要启动的子流程的流程编号 |
| IsEmbedded | bool | 否 | true | 是否将子流程定义嵌套入父流程 |
| Mapping | ParameterMapCollection | 否 | 空集合 | 参数对照表,父子流程做参数传递的参数对照表 |
| ExtendedProperty | BusinessPropertyCollection | 否 | 空集合 | 步骤扩展属性 |
配置项详解
ProcessflowID
说明: 子流程的流程编号,指定要启动的子流程。这是子流程节点最重要的配置项。
取值范围: 大于 0 的整数,对应系统中已定义的流程编号
注意事项:
- 必须确保指定的流程编号在系统中存在
- 子流程必须是已发布的流程
- 可以通过流程上下文动态指定流程编号
IsEmbedded
说明: 是否将子流程定义嵌套入父流程。当设置为 true 时,子流程的定义会嵌入到父流程中。
取值范围: true 或 false
注意事项:
- 默认为 true,推荐使用默认值
- 嵌套模式下,子流程的修改不会影响已运行的父流程实例
- 非嵌套模式下,子流程的修改会影响所有引用它的父流程
Mapping
说明: 参数对照表,定义父子流程之间的参数映射关系。通过映射配置,可以将父流程的数据传递给子流程,也可以将子流程的结果返回给父流程。
取值范围: ParameterMapCollection 对象,包含多个参数映射项
映射项结构:
- SourceKey: 源参数键(父流程中的键名)
- TargetKey: 目标参数键(子流程中的键名)
- Direction: 映射方向(Input/Output/Both)
- Input: 从父流程传递到子流程
- Output: 从子流程返回到父流程
- Both: 双向传递
注意事项:
- 参数键名通常以 "_Value" 结尾
- 映射方向决定了数据传递的时机
- 可以配置多个参数映射
流程上下文
输入参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| 父流程数据 | any | 通过 Mapping 配置传递给子流程的数据 |
| @ParentCase | string | 父流程实例号(系统自动设置) |
| @ParentTask | int | 父流程对应任务号(系统自动设置) |
输出参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| 子流程结果 | any | 通过 Mapping 配置从子流程返回的数据 |
| @SubflowCase | string | 子流程实例号(系统自动设置) |
系统参数
SubflowActivity 定义了三个系统参数常量:
- ParameterParentCase (
@ParentCase): 父流程实例号 - ParameterParentTask (
@ParentTask): 父流程对应任务号 - ParameterSubflowCase (
@SubflowCase): 子流程实例号
这些参数由系统自动管理,用于维护父子流程的关联关系。
数据流转说明
-
启动子流程前:
- 根据 Mapping 配置,将父流程的数据复制到子流程上下文
- 设置系统参数(@ParentCase、@ParentTask)
-
子流程执行:
- 子流程在独立的上下文中执行
- 可以访问从父流程传递的参数
-
子流程完成后:
- 根据 Mapping 配置,将子流程的结果复制回父流程上下文
- 设置子流程实例号(@SubflowCase)
业务逻辑说明
处理流程
SubflowActivity 的执行流程如下:
-
EnterAsync: 进入子流程节点
- 创建新的工作项(FlowItem)
- 设置工作项属性:
- StartTime:当前时间
- TaskName:节点名称
- Alias:节点别名
- PartName:固定为 "System"
- LevelCode:继承父流程的级别代码
- KeyInfo 和 KeyLabel:从当前任务或事件参数获取
- 记录父流程信息:
- ParentCaseID:父流程实例号
- ParentInstanceName:父流程名称
- ParentTask:父流程任务号
- 将工作项添加到流程实例
- 更新当前工作项 ID
- 记录进入日志
-
启动子流程:
- 根据 ProcessflowID 加载子流程定义
- 创建子流程实例
- 根据 Mapping 配置传递参数
- 启动子流程执行
-
等待子流程完成:
- 子流程在独立的线程或任务中执行
- 主流程等待子流程完成
-
子流程完成:
- 根据 Mapping 配置获取子流程结果
- 将结果写入父流程上下文
- 继续执行父流程的后续节点
流程图
[主流程节点1]
↓
[SubflowActivity]
↓ (启动子流程)
┌─────────────────┐
│ 子流程开始 │
│ ↓ │
│ 子流程节点1 │
│ ↓ │
│ 子流程节点2 │
│ ↓ │
│ 子流程结束 │
└─────────────────┘
↓ (子流程完成)
[主流程节点2]
参数映射机制
参数映射的执行时机:
-
Input 映射: 在启动子流程前执行
子流程上下文[TargetKey] = 父流程上下文[SourceKey] -
Output 映射: 在子流程完成后执行
父流程上下文[SourceKey] = 子流程上下文[TargetKey] -
Both 映射: 同时执行 Input 和 Output 映射
依赖服务
| 服务接口 | 用途 | 说明 |
|---|---|---|
| Flow | 流程实例 | 访问父流程上下文和工作项 |
| Flow.Logger | 日志记录器 | 记录子流程的执行日志 |
| 流程引擎 | 子流程管理 | 加载和执行子流程 |