CCFlow 父子流程需求列表
依据代码整理:CCFlow/Components/BP.WF、Vue3/src/WF/Admin/AttrNode/SubFlow、Vue3/src/WF/WorkOpt/SubFlow.vue
一、总体架构
CCFlow 父子流程采用「节点级父子流程组件(FrmSubFlow)+ 子流程绑定配置(WF_NodeSubFlow)」双层结构:
| 层级 |
数据实体 |
作用 |
| 组件层 |
FrmSubFlow(挂接在 WF_Node) |
控制表单上子流程区域的显示、权限、汇总规则 |
| 绑定层 |
SubFlowHand/Auto/YanXu/Guide |
定义具体子流程编号、启动方式、联动与数据规则 |
子流程类型(SubFlowType)共 4 种:0 手动启动、1 自动触发、2 延续、3 前置导航。
二、功能需求明细表
(一)设计配置 --- 父子流程组件
| 功能类别 |
功能名称 |
功能说明 |
需求场景概述 |
| 组件基础 |
父子流程组件启用 |
SFSta:禁用 / 启用 / 只读;启用后自动在表单创建「父子流程」分组字段(GroupCtrlType.SubFlow) |
在审批节点表单嵌入子流程管理区域 |
| 组件基础 |
显示标签 |
SFLab,默认「子流程」,控制表单分组标题 |
按业务命名,如「关联采购单」「子项目审批」 |
| 组件基础 |
组件高度 |
SF_H,默认 300px |
控制子流程列表区域在表单中的可视高度 |
| 组件显示 |
显示方式 |
SFShowModel:表格方式 / 自由模式(代码标注暂未充分使用) |
预留不同 UI 展现风格 |
| 组件显示 |
显示控制方式 |
SFShowCtrl:可看所有子流程 / 仅看自己发起的 |
多人共办同一父流程时,限制子流程实例可见范围 |
| 组件显示 |
连接标题 |
SFCaption,默认「启动子流程」 |
手工启动入口的默认链接文字 |
| 组件显示 |
可启动子流程编号 |
SFDefInfo,多个流程编号逗号分隔 |
限制组件上允许启动的子流程范围 |
| 组件显示 |
审批格式字段 |
SFFields |
配置子流程在审核组件中的展示字段 |
| 组件显示 |
打开子流程显示 |
SFOpenType:工作查看器 / 流程轨迹 |
点击子流程实例时打开表单或轨迹图 |
| 组件联动 |
所有子流程结束规则 |
AllSubFlowOverRole:不处理 / 父流程自动下一步 / 父流程结束 |
节点绑定多个子流程时,全部完成后统一驱动父流程 |
| 组件管理 |
子流程类型入口 |
提供「手动启动 / 自动触发 / 延续子流程」三个 RefMethod 管理入口 |
流程设计器节点属性中分类维护子流程 |
| 组件管理 |
组件禁用清理 |
禁用时删除对应 GroupField(CtrlID=SubFlowND{NodeID}) |
关闭组件后表单不再显示子流程区域 |
(二)设计配置 --- 新建子流程向导(GPN_NewSubFlow)
| 功能类别 |
功能名称 |
功能说明 |
需求场景概述 |
| 向导创建 |
手工启动子流程 |
选择目标流程(排除当前父流程),创建 SubFlowType=0,跳转 SubFlowHand 编辑 |
审批人按需手工发起子流程 |
| 向导创建 |
自动触发子流程 |
创建 SubFlowType=1,节点 SubFlowAutoNum 自增,跳转 SubFlowAuto 编辑 |
发送/到达时按规则自动发起 |
| 向导创建 |
延续子流程 |
创建 SubFlowType=2,跳转 SubFlowYanXu 编辑 |
父节点发送后冻结,转入延续流程 |
| 向导创建 |
前置导航子流程 |
创建 SubFlowType=3,跳转 SubFlowGuide 编辑;对开始节点有效 |
先选子流程实例再发起父流程(如报销选采购单) |
| 向导创建 |
重复绑定校验 |
主键 {NodeID}_{SubFlowNo}_{SubFlowType},已存在则提示 |
防止同一节点重复绑定同一子流程 |
| 向导创建 |
流程分组选择 |
按 FlowSort 分组展示可选流程列表 |
大量流程时分组快速定位 |
(三)设计配置 --- 手动启动子流程(SubFlowHand)
| 功能类别 |
功能名称 |
功能说明 |
需求场景概述 |
| 基本属性 |
子流程编号/名称 |
绑定目标子流程 SubFlowNo、SubFlowName |
指定要发起的子流程模板 |
| 基本属性 |
子流程状态 |
SubFlowSta:禁用 / 启用 / 只读 |
临时关闭某个子流程入口或只读展示 |
| 基本属性 |
启动文字标签 |
SubFlowLab,覆盖默认「启动子流程」 |
如「发起投标流程」「创建合同审批」 |
| 基本属性 |
子流程模式 |
SubFlowModel:下级子流程 / 同级子流程 |
下级挂当前 WorkID;同级挂父流程 PWorkID 并记录 SL 参数 |
| 基本属性 |
轨迹显示位置 |
SubFlowShowNodeID,绑定设计器子流程图标节点 |
子流程实例显示在父流程轨迹图指定位置 |
| 基本属性 |
显示顺序 |
Idx,支持上移/下移(DoUp/DoDown) |
多个子流程时控制列表排序 |
| 节点运动 |
父流程自动运行到下一步 |
ParentFlowSendNextStepRole:不处理 / 子流程结束 / 子流程到指定节点 |
子流程完成后自动推进父流程 |
| 节点运动 |
父流程结束规则 |
ParentFlowOverRole:同上三档 |
子流程完成后自动结束父流程 |
| 节点运动 |
指定子流程节点 ID |
SubFlowNodeID,配合「到指定节点」规则 |
子流程到某审批节点即触发父流程联动 |
| 节点运动 |
同级子流程结束规则 |
IsAutoSendSLSubFlowOver:不处理 / 同级自动下一步 / 结束同级 |
平级子流程全部完成后驱动发起它的同级流程 |
| 限制规则 |
仅能被调用 1 次 |
StartOnceOnly |
同一父实例下该子流程只能发起一次 |
| 限制规则 |
结束后才可重新发起 |
CompleteReStart |
上次实例归档后才允许再次发起 |
| 限制规则 |
指定流程启动后才能启动 |
IsEnableSpecFlowStart + SpecFlowStart(逗号分隔多流程) |
子流程 B 必须在子流程 A 启动后才能发起 |
| 限制规则 |
指定流程结束后才能启动 |
IsEnableSpecFlowOver + SpecFlowOver |
子流程 B 必须在子流程 A 完成后才能发起 |
| 数据传递 |
父→子字段拷贝 |
SubFlowCopyFields,格式 @父字段=子字段@... |
发起时把父流程数据带入子流程表单 |
| 数据传递 |
子→父字段反填规则 |
BackCopyRole:不反填 / 自动匹配 / 按设置格式 / 混合 |
子流程结束后回填父流程 |
| 数据传递 |
子→父字段映射 |
ParentFlowCopyFields,格式 @子字段=父字段@... |
精确映射;签批字段建议用「按设置格式」 |
| 启动模式 |
单条手工启动 |
SubFlowStartModel=0 |
一次发起一条子流程(SubFlow.vue 表格模式) |
| 启动模式 |
简单数据源批量启动 |
SubFlowStartModel=1 |
按数据源多行批量发起 |
| 启动模式 |
分组数据源批量启动 |
SubFlowStartModel=2 |
分组展示后批量发起 |
| 启动模式 |
树形结构批量启动 |
SubFlowStartModel=3 |
树形选择后批量发起 |
| 展现模式 |
表格模式 |
SubFlowShowModel=0 |
父子行可展开表格(当前 Vue 实现) |
| 展现模式 |
列表模式 |
SubFlowShowModel=1 |
非单条启动时切换为 List 展现 |
| 配置入口 |
发起模式配置页 |
DoStartModel → SubFlowStartModel 配置 |
设计期配置批量/树形等启动方式 |
| 配置入口 |
显示模式配置页 |
DoShowModel → SubFlowShowModel 配置 |
设计期配置展现风格 |
(四)设计配置 --- 自动触发子流程(SubFlowAuto)
| 功能类别 |
功能名称 |
功能说明 |
需求场景概述 |
| 触发时机 |
调用时间 |
InvokeTime:发送时(0) / 工作到达时(1)(前端另有流程结束时选项) |
父节点发送后或工作到达时自动触发 |
| 触发时机 |
自动发送方式 |
SendModel:给当前人开始节点待办 / 发送到下一节点 |
子流程创建后停在开始节点或自动流转 |
| 触发时机 |
发送方式校验 |
选「发送到下一节点」时,下一节点接收人规则不能为「由上一步选择」 |
保证自动触发无需人工选人等 |
| 启动限制 |
仅调用 1 次 |
同手动子流程 |
防止重复自动发起 |
| 启动限制 |
结束后才可重新发起 |
同手动子流程 |
控制重复触发 |
| 启动限制 |
指定流程启动后/结束后 |
同手动子流程,支持多流程逗号分隔 |
串行依赖的自动子流程链 |
| 启动限制 |
按指定 SQL 配置 |
IsEnableSQL + SpecSQL,SQL 返回值>0 才触发 |
按表单/SQL 动态判断是否触发 |
| 启动限制 |
按平级子流程节点完成 |
IsEnableSameLevelNode + SameLevelNode(格式 流程,节点;...) |
仅平级模式;指定平级节点完成后触发 |
| 启动数据源 |
当前表单主表数据 |
DBSrcType=0,发起单个子流程并用主表赋值 |
一对一自动发起 |
| 启动数据源 |
指定 SQL 数据源 |
DBSrcType=1 + DBSrcDoc,每行发起一个子流程,列名匹配子流程字段 |
按子表明细批量自动发起(如每行物料一条子流程) |
| 节点运动 |
父流程联动规则 |
同 SubFlowHand(下一步/结束/指定节点/同级规则) |
自动子流程完成后的父流程驱动 |
| 数据传递 |
父→子 / 子→父 |
SubFlowCopyFields、BackCopyRole、ParentFlowCopyFields |
自动发起与结束时数据同步 |
| 待办控制 |
发送后隐藏父流程待办 |
SubFlowHidTodolist,设置父流程待办 IsPass=100 |
批量/自动发起子流程后,父流程待办暂时隐藏 |
| 待办控制 |
子流程结束后恢复父待办 |
所有同类型子流程结束后,恢复 IsPass=0 |
子流程全部完成后再显示父流程待办 |
| 轨迹显示 |
轨迹显示位置 |
SubFlowShowNodeID |
同手动子流程 |
(五)设计配置 --- 延续子流程(SubFlowYanXu)
| 功能类别 |
功能名称 |
功能说明 |
需求场景概述 |
| 延续特性 |
延续子流程绑定 |
节点仅可配置延续子流程;发送时转入子流程,当前节点活动冻结 |
主流程暂停,由延续流程承接后续处理 |
| 延续特性 |
子流程模式 |
下级 / 同级,建立 PWorkID 或 SLWorkID 关系 |
延续流程作为下级或平级分支 |
| 延续特性 |
延续到的节点 |
YanXuToNode,多节点逗号分隔,空则到子流程开始节点 |
延续可直接送到子流程中间节点 |
| 延续特性 |
条件表达式 |
ExpType:按 SQL / 按参数;CondExp 控制是否走延续 |
按条件决定是否进入延续流程 |
| 延续特性 |
接收人规则 |
延续子流程开始节点须能明确计算接收人(角色/部门/绑定人员等) |
发送延续流程时自动确定处理人 |
| 退回控制 |
越轨子流程退回方式 |
YBFlowReturnRole:不能退回 / 退父开始 / 退父任意 / 退父启动 / 退指定节点 |
延续子流程开始节点可退回到父流程 |
| 退回控制 |
要退回的节点 |
ReturnToNode,下拉选择父流程节点 |
配合「退指定节点」使用 |
| 运行时 |
父待办隐藏提示 |
延续启动后提示「待办不可见,需等子流程完成」 |
用户知晓父流程被挂起 |
| 运行时 |
撤销发送处理 |
WorkUnSend 中识别越轨状态并删除延续子流程 |
父流程撤销时清理延续子流程 |
(六)设计配置 --- 前置导航子流程(SubFlowGuide / SubFlowHandGuide)
| 功能类别 |
功能名称 |
功能说明 |
需求场景概述 |
| 前置导航 |
流程级前置导航 |
配合 StartGuideWay.SubFlowGuide/SubFlowGuideEntity |
开始节点先选已有子流程实例再创建父流程 |
| 前置导航 |
批量发起前置导航 |
IsSubFlowGuide + SubFlowGuideSQL(须含 No、Name 列) |
从 SQL 列表勾选多条记录批量发起子流程 |
| 前置导航 |
分组 SQL |
SubFlowGuideGroup |
导航列表按分组展示 |
| 前置导航 |
实体字段映射 |
SubFlowGuideEnNoFiled、SubFlowGuideEnNameFiled |
自定义 SQL 结果列名 |
| 前置导航 |
树形结构 |
IsTreeConstruct + ParentNo |
树形前置导航选择 |
| 批量发起 |
多选批量发起 |
SubFlowGuid_Send,线程池并发 SendSingleSubFlow |
一次选中多条记录并行发起子流程 |
| 应用场景 |
先子后父 |
费用报销选采购申请单:子流程先存在,完成后出现父流程 |
经典「先出现子流程,后出现父流程」业务 |
(七)运行时 --- 子流程组件 UI(SubFlow.vue)
| 功能类别 |
功能名称 |
功能说明 |
需求场景概述 |
| 列表展示 |
表格模式 |
父行显示子流程名称;子行展示已发起实例(发起人、标题、节点、状态、处理人、时间) |
审批表单内查看/管理子流程 |
| 列表展示 |
行展开 |
expandRowByClick,点击展开查看实例列表 |
折叠展示多个子流程绑定 |
| 列表展示 |
流程状态文本 |
草稿/新工作/归档/挂起/退回/转发/删除/加签等 |
快速识别子流程运行状态 |
| 列表展示 |
过滤草稿与 FID |
跳过 WFState=0 及 FID!=0 的记录 |
只展示有效主实例 |
| 权限控制 |
组件启用 + 子流程启用 |
SFSta=1 且 SubFlowSta=1 且非只读才可启动 |
双重开关控制 |
| 权限控制 |
跨节点只读 |
当前 FK_Node 与组件绑定节点不一致时,子流程置为只读 |
累加表单场景防止非绑定节点误操作 |
| 权限控制 |
只读模式 |
isReadonly=true 或组件/子流程只读时禁止启动 |
查看模式、已办查看 |
| 数据权限 |
显示控制 |
SFShowCtrl=0 查全部;=1 仅查 Starter=当前用户 |
多人协作时的实例隔离 |
| 启动操作 |
下级子流程启动 |
传 PWorkID=当前WorkID、PNodeID、PFlowNo、PFID |
标准父子关系 |
| 启动操作 |
同级子流程启动 |
传 PWorkID=父PWorkID,并带 SLWorkID/SLNodeID/SLFlowNo |
与父流程平级的旁支子流程 |
| 启动操作 |
平级过滤 |
按 SLWorkID 过滤,只显示当前流程发起的平级子流程 |
避免看到其他节点发起的同级子流程 |
| 启动操作 |
启动链接文字 |
使用 SubFlowLab 或默认 [启动子流程] |
可配置的业务入口文案 |
| 查看操作 |
打开子流程 |
iframe 打开 MyView,带 PageFrom=SubFlow |
在父流程内查看/处理子流程 |
| 交互 |
子流程完成后刷新 |
监听 ReloadPage 消息,关闭 iframe 并重新加载列表 |
发起子流程后自动刷新父表单组件 |
| 展现切换 |
List 模式切换 |
SubFlowStartModel!=0 时切换为 List(批量/导航模式) |
非单条手工启动走另一套 UI |
(八)运行时 --- 子流程发起与父子关系
| 功能类别 |
功能名称 |
功能说明 |
需求场景概述 |
| 关系建立 |
父子流程关联 |
SetParentInfo 写入 PWorkID/PNodeID/PFlowNo/PEmp |
建立实例级父子血缘 |
| 关系建立 |
同级子流程参数 |
AtPara 存储 SLWorkID/SLNodeID/SLFlowNo/SLEmp |
标识由哪个同级流程发起 |
| 发起校验 |
能否发起校验 |
Flow_IsCanStartThisFlow 校验开始节点人员权限 |
防止无权限人员发起子流程 |
| 发起校验 |
启动限制综合判断 |
综合 StartOnceOnly/CompleteReStart/SpecFlowStart/SpecFlowOver/SQL 等 |
手工与自动发起前统一门禁 |
| 数据初始化 |
父数据复制到子 |
创建时从父节点 Work 复制,再按 SubFlowCopyFields 映射 |
子流程表单自动带数 |
| 数据初始化 |
标题同步 |
子流程 Title 可与父流程保持一致(代码注释中的设计意图) |
列表中父子标题一致便于识别 |
| 工具栏 |
发起子流程按钮 |
节点工具栏 SubFlowStartModel!=0 时显示 SendSubFlow |
批量/导航模式从工具栏入口发起 |
| 工具栏 |
删除子流程 |
DelSubFlow → Flow_DeleteSubThread |
手工删除误发起的子流程实例 |
| 删除联动 |
删除父流程时删子流程 |
CB_IsDeleteSubFlow 选项 |
删父流程时级联删除子流程 |
(九)运行时 --- 父流程联动与待办
| 功能类别 |
功能名称 |
功能说明 |
需求场景概述 |
| 单个子流程联动 |
子流程结束→父流程下一步 |
ParentFlowSendNextStepRole=FlowOver |
一个子流程完成即推进父流程 |
| 单个子流程联动 |
子流程结束→父流程结束 |
ParentFlowOverRole=FlowOver |
子流程完成即结束父流程 |
| 单个子流程联动 |
子流程到指定节点→父流程下一步 |
ParentFlowSendNextStepRole=SpecifiedNodes + SubFlowNodeID |
子流程到某节点即触发父流程 |
| 全部子流程联动 |
全部结束→父流程下一步 |
组件 AllSubFlowOverRole=SendParentFlowToNextStep |
多子流程会签式全部完成后推进 |
| 全部子流程联动 |
全部结束→父流程结束 |
组件 AllSubFlowOverRole=OverParentFlow |
全部子流程完成后结束父流程 |
| 全部子流程联动 |
运行中子流程计数 |
Flow_NumOfSubFlowRuning 判断是否全部完成 |
防止部分完成就触发父流程 |
| 同级子流程联动 |
同级自动下一步 |
IsAutoSendSLSubFlowOver=1 |
平级子流程完成后推动发起它的流程 |
| 同级子流程联动 |
结束同级子流程 |
IsAutoSendSLSubFlowOver=2 |
平级子流程完成后结束发起流程 |
| 流程属性级 |
子流程到该节点父流程自动下一步 |
流程属性 IsToParentNextNode(子流程节点级) |
子流程到达特定节点时驱动父流程 |
| 自动发送 |
模拟父流程处理人登录发送 |
SubFlowOver_ParentFlowAutoSendNextSetp 切换用户上下文发送 |
无人值守自动推进父流程 |
| 待办恢复 |
隐藏待办后恢复 |
同类型子流程全部结束且 SubFlowHidTodolist=true 时恢复 IsPass=0 |
子流程全完成后再出现父待办 |
(十)运行时 --- 数据反填(子→父)
| 功能类别 |
功能名称 |
功能说明 |
需求场景概述 |
| 反填规则 |
不反填 |
BackCopyRole=None |
子流程与父流程数据独立 |
| 反填规则 |
字段自动匹配 |
同名字段自动 Copy |
内置表单、字段名一致时零配置 |
| 反填规则 |
按设置格式 |
ParentFlowCopyFields 精确映射 |
字段名不同或签批字段反填 |
| 反填规则 |
混合模式 |
自动匹配 + 按设置格式同时生效 |
通用字段自动、特殊字段手工映射 |
| 反填范围 |
Work + Rpt 双表更新 |
同时更新节点 Work 与流程 Rpt |
表单与报表数据一致 |
| 反填扩展 |
签批信息拷贝 |
签批字段对应 Track 记录(ActionType=22)复制到父流程 |
子流程审批意见汇总到父流程轨迹 |
(十一)运行时 --- 阻塞与发送校验
| 功能类别 |
功能名称 |
功能说明 |
需求场景概述 |
| 节点阻塞 |
指定子流程未完成不能发送 |
BlockModel=SpecSubFlow,BlockExp 配置 节点,流程;... |
父节点必须等指定子流程完成 |
| 节点阻塞 |
指定子流程未到指定节点不能发送 |
BlockModel=SpecSubFlowNode,配置 节点,流程,子流程节点 |
子流程到某节点前父流程不能往下走 |
| 节点阻塞 |
平级子流程未完成不能发送 |
BlockModel=SameLevelSubFlow |
平级分支全部完成才能继续 |
| 节点阻塞 |
阻塞错误提示 |
列出未完成子流程 ID、名称、标题、当前处理人 |
明确告知卡在哪条子流程 |
| 发送校验 |
子流程未完成阻止发送 |
发送前检查已发起子流程 WFState |
有运行中子流程时不允许父流程发送 |
| 设计校验 |
越轨/子流程发起检查 |
FlowCheckError 中检查延续子流程配置 |
发布前发现配置错误 |
(十二)运行时 --- 轨迹、审核与查看
| 功能类别 |
功能名称 |
功能说明 |
需求场景概述 |
| 轨迹图 |
子流程轨迹显示位置 |
设计器创建子流程 Icon 并绑定 SubFlowShowNodeID |
父流程轨迹图上可视化子流程 |
| 轨迹图 |
子流程节点坐标 |
X/Y 属性存储图标位置 |
设计器拖拽定位 |
| 审核组件 |
子流程审核信息汇总 |
WF_WorkOpt 中输出子流程 Track,节点名前缀「(子流程)」 |
父流程审核区展示子流程审批记录 |
| 审核组件 |
多子流程发起人去重 |
批量发起时发起人只显示一次 |
避免审核列表重复 |
| 查看父流程 |
查看父流程按钮 |
ShowParentFormEnable(处理/查看/抄送页可分别配置) |
子流程处理人跳转查看父流程 |
| 轨迹配置 |
轨迹图是否显示 |
SFTrackEnable |
组件区是否展示子流程轨迹 |
| 轨迹配置 |
历史审核是否显示 |
SFListEnable |
组件区是否展示历史审核 |
| 轨迹配置 |
显示所有步骤 |
SFIsShowAllStep |
轨迹表是否展示全部子流程步骤 |
(十三)流程/节点级扩展配置
| 功能类别 |
功能名称 |
功能说明 |
需求场景概述 |
| 节点计数 |
自动子流程数量 |
节点 SubFlowAutoNum,新建自动子流程时自增 |
标识节点是否配置了自动触发 |
| 节点计数 |
延续子流程数量 |
节点 SubFlowYanXuNum |
标识节点是否配置延续子流程 |
| 节点属性 |
发起会签子流程 |
ItIsSendDraftSubFlow 工具栏入口 |
草稿/会签场景发起子流程 |
| 流程属性 |
前置导航-父子流程模式 |
StartGuideWay.ByParentFlowModel |
流程级前置导航与父子流程集成 |
| 流程属性 |
前置导航-子流程实例列表 |
StartGuideWay.SubFlowGuide |
从开始节点选子流程实例 |
| 移动端 |
移动端子流程组件 |
CCMobile/WorkOpt/SubFlow.vue |
移动端同等父子流程能力 |
| 存储 |
统一存储表 |
所有类型子流程存 WF_NodeSubFlow,主键含类型后缀 |
一种表结构支撑四种类型 |
三、子流程类型与模式对照
#mermaid-svg-UQavMdDFuMJWL5mY{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-UQavMdDFuMJWL5mY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UQavMdDFuMJWL5mY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UQavMdDFuMJWL5mY .error-icon{fill:#552222;}#mermaid-svg-UQavMdDFuMJWL5mY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UQavMdDFuMJWL5mY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UQavMdDFuMJWL5mY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UQavMdDFuMJWL5mY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UQavMdDFuMJWL5mY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UQavMdDFuMJWL5mY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UQavMdDFuMJWL5mY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UQavMdDFuMJWL5mY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UQavMdDFuMJWL5mY .marker.cross{stroke:#333333;}#mermaid-svg-UQavMdDFuMJWL5mY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UQavMdDFuMJWL5mY p{margin:0;}#mermaid-svg-UQavMdDFuMJWL5mY .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-UQavMdDFuMJWL5mY .cluster-label text{fill:#333;}#mermaid-svg-UQavMdDFuMJWL5mY .cluster-label span{color:#333;}#mermaid-svg-UQavMdDFuMJWL5mY .cluster-label span p{background-color:transparent;}#mermaid-svg-UQavMdDFuMJWL5mY .label text,#mermaid-svg-UQavMdDFuMJWL5mY span{fill:#333;color:#333;}#mermaid-svg-UQavMdDFuMJWL5mY .node rect,#mermaid-svg-UQavMdDFuMJWL5mY .node circle,#mermaid-svg-UQavMdDFuMJWL5mY .node ellipse,#mermaid-svg-UQavMdDFuMJWL5mY .node polygon,#mermaid-svg-UQavMdDFuMJWL5mY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-UQavMdDFuMJWL5mY .rough-node .label text,#mermaid-svg-UQavMdDFuMJWL5mY .node .label text,#mermaid-svg-UQavMdDFuMJWL5mY .image-shape .label,#mermaid-svg-UQavMdDFuMJWL5mY .icon-shape .label{text-anchor:middle;}#mermaid-svg-UQavMdDFuMJWL5mY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-UQavMdDFuMJWL5mY .rough-node .label,#mermaid-svg-UQavMdDFuMJWL5mY .node .label,#mermaid-svg-UQavMdDFuMJWL5mY .image-shape .label,#mermaid-svg-UQavMdDFuMJWL5mY .icon-shape .label{text-align:center;}#mermaid-svg-UQavMdDFuMJWL5mY .node.clickable{cursor:pointer;}#mermaid-svg-UQavMdDFuMJWL5mY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-UQavMdDFuMJWL5mY .arrowheadPath{fill:#333333;}#mermaid-svg-UQavMdDFuMJWL5mY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-UQavMdDFuMJWL5mY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-UQavMdDFuMJWL5mY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UQavMdDFuMJWL5mY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-UQavMdDFuMJWL5mY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UQavMdDFuMJWL5mY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-UQavMdDFuMJWL5mY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-UQavMdDFuMJWL5mY .cluster text{fill:#333;}#mermaid-svg-UQavMdDFuMJWL5mY .cluster span{color:#333;}#mermaid-svg-UQavMdDFuMJWL5mY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-UQavMdDFuMJWL5mY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-UQavMdDFuMJWL5mY rect.text{fill:none;stroke-width:0;}#mermaid-svg-UQavMdDFuMJWL5mY .icon-shape,#mermaid-svg-UQavMdDFuMJWL5mY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UQavMdDFuMJWL5mY .icon-shape p,#mermaid-svg-UQavMdDFuMJWL5mY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-UQavMdDFuMJWL5mY .icon-shape .label rect,#mermaid-svg-UQavMdDFuMJWL5mY .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UQavMdDFuMJWL5mY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-UQavMdDFuMJWL5mY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-UQavMdDFuMJWL5mY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 父流程节点
0 下级
1 同级
FrmSubFlow 组件
手动启动 SubFlowHand
自动触发 SubFlowAuto
延续子流程 SubFlowYanXu
前置导航 SubFlowGuide
SubFlowModel
PWorkID = 父WorkID
PWorkID = 父PWorkID + SL参数
子流程实例
结束事件 SubFlowEvent
数据反填 / 父流程联动 / 待办恢复
四、典型业务场景映射
| 业务场景 |
推荐配置组合 |
| 工程主流程 + 投标子流程,投标结果回填主流程 |
手动启动 + BackCopyRole 反填 + 父流程自动下一步 |
| 采购主单按明细行自动生成审批子流程 |
自动触发 + SQL 数据源 + 批量发起 |
| 主流程暂停,转交专门审批线处理后再回来 |
延续子流程 + 父待办隐藏 + 子流程结束联动 |
| 报销前先选多张采购申请单 |
前置导航子流程 + 开始节点 SubFlowGuide |
| 并行多个子审批,全部完成后主流程才往下走 |
组件 AllSubFlowOverRole + 节点 SpecSubFlow 阻塞 |
| 同一父流程下多人各发起自己的子流程 |
SFShowCtrl=仅看自己发起的 |
五、相关代码路径
| 模块 |
路径 |
| 后端子流程模板 |
CCFlow/Components/BP.WF/Template/SFlow/ |
| 后端运行逻辑 |
CCFlow/Components/BP.WF/WF/WorkNode.cs、WorkNodePlus.cs |
| 前端配置实体 |
Vue3/src/WF/Admin/AttrNode/SubFlow/ |
| 前端运行组件 |
Vue3/src/WF/WorkOpt/SubFlow.vue |
| 父子流程组件配置 |
Vue3/src/WF/TSClass/FrmSubFlowNode.ts |
文档生成依据 CCFlow 代码库当前实现整理。