.流程引擎BPM设计之:流程二开的三种模式
| 项目 | 内容 |
|---|---|
| 文档名称 | .流程引擎BPM设计之:流程二开的三种模式 |
| 文档编号 | ZTE-CCBPM-FLOW-DEV2-2026-001 |
| 版本号 | V1.0 |
| 密级 | 内部公开 |
| 编制日期 | 2026-07-20 |
| 编制依据 | WaiGuaBaseFlow、FlowEventBase、ExecEvent、FrmEvent、OverrideEvent、GL_Event、Demo F065 / WGFlow_* |
| 适用范围 | 流程二开选型宣讲、项目交付规范、团队技术路线评估 |
修订记录
| 版本 | 日期 | 修订人 | 说明 |
|---|---|---|---|
| V1.0 | 2026-07-20 | --- | 初版:二开定义、三种模式、设计主张与设计记录、CCFlow/JFlow 实证 |
摘要
驰骋 BPM 主张:流程可以设计出来,业务却不能写进引擎内核。
流程设计完成后,要用脚本与流程引擎交互,在发送成功、发送前、退回、结束等生命周期点嵌入业务逻辑------这一能力,我们称为流程二开。
CCFlow / JFlow 工作流引擎为此提供了三种编写脚本的模式 :前端外挂、后端外挂、事件配置 。
团队可按场景复杂度与技术特征选型,三种模式共用同一套事件语义(如 SendWhen / SendSuccess),互为补充、互不排斥。
本文说明驰骋 BPM 对「流程二开」的设计思想与主张,重点记录关键设计决策,并以 驰骋 BPM(CCFlow / JFlow) 为实现对照。
一、什么是流程二开
1.1 定义
流程二开 = 流程设计出来之后,用脚本与流程引擎交互,实现相关业务逻辑的过程。
典型场景:在发送成功 时做业务同步、在发送前 做校验拦截、在流程结束后 写台账------不是改引擎源码,而是在固定挂接点嵌入执行一段脚本。
| 对比项 | 改引擎 | 流程二开 |
|---|---|---|
| 改动位置 | 内核发送/退回代码 | 外挂 / 事件脚本 |
| 升级成本 | 高,难合并 | 低,核心可独立升级 |
| 职责边界 | 引擎与业务缠在一起 | 引擎管流转,二开管业务 |
| 可交付性 | 难复用 | 可按流程模板绑定交付 |
1.2 驰骋的主张
主张一:引擎稳定,业务外挂。
流程引擎只回答「怎么流转」;「流转时业务做什么」交给二开。
主张二:同一套事件时钟,三种写法。不发明三套事件名;前端外挂、后端外挂、事件配置都认
SendWhen、SendSuccess、FlowOverAfter等同一语义。
主张三:按团队选模式,不按产品逼模式。前端强、后端强、配置优先------三种路径都合法,按场景与团队技术特征选择。
二、三种模式总览
| 模式 | 一句话 | 谁写 | 适合什么团队 | 典型载体 |
|---|---|---|---|---|
| 前端外挂 | 在浏览器侧挂流程脚本 | 前端 / 全栈 | Vue/TS 能力强,重交互校验 | WGFlow_{流程号}、OverrideFiles |
| 后端外挂 | 在服务端挂强类型事件类 | 后端 | C# / Java 能力强,重事务与集成 | FlowEventBase 子类、DLL/程序集 |
| 事件配置 | 在设计器里配执行体 | 实施 / 低代码 | 希望少写代码、快速上线 | Sys_FrmEvent + GenerDBSrc(SQL / WebApi / 过程等) |
管理端把「前后端外挂」与「事件配置」并置(事件列表工具栏可见「前后端外挂」),产品语义上三者是并列的二开入口,不是互相替代。
运行时分层(设计示意)
用户点击发送
├─ ① 前端外挂:WGFlow_* / beforeSend ← 可拦截(UI 侧)
└─ ② HTTP → 流程引擎发送编排
└─ ExecEvent(统一调度)
├─ OverrideEvent(全局后端拦截)
├─ FlowEventBase(流程级后端外挂)
├─ FrmEvents / GenerDBSrc(事件配置)
└─ PushMsgs(消息推送,同事件标记)
└─ ③ 前端 SendSuccess / afterSend ← 发送成功后的前端副作用
设计记录 R1 :二开挂接点与消息推送共用事件标记,但执行职责分离------消息走
PushMsg,业务走外挂/配置,避免「发消息的代码里夹业务」。
三、模式一:前端外挂
3.1 设计意图
前端外挂回答的是:「用户还在页面上时,要不要先校验、先提示、先改交互?」
适合:
- 发送前的表单完整性、金额/天数等即时校验
- 发送成功后的前端提示、局部刷新、调用浏览器侧能力
- 自定义工具栏按钮、打开表单后的 UI 初始化
不适合单独承担:强事务写库、跨系统强一致同步(应交后端外挂或事件配置中的服务端执行体)。
3.2 设计记录
| 编号 | 决策 | 说明 |
|---|---|---|
| F1 | 约定优于配置注册 | 类名必须以 WGFlow_ 开头,并绑定流程号;工厂扫描发现即可,减少手工注册表 |
| F2 | 前后端事件名对齐 | 前端同样提供 SendWhen / SendSuccess / ReturnBefore 等,降低「学两套事件」的成本 |
| F3 | 不改核心,改外挂目录 | 外挂与 OverrideFiles 落在应用扩展区,升级引擎不覆盖业务脚本 |
| F4 | 可拦截、可放行 | 返回 err@... 或钩子返回 false 可阻断操作;成功路径再触发 SendSuccess |
3.3 能力边界(宣传口径)
- 轻量钩子 :如
beforeSend/afterSend,适合快速嵌入 - 流程外挂类:继承流程外挂基类,按流程号完整覆盖生命周期
- 字段级脚本:经典 JSLib / 表单字段脚本,属于更细粒度的前端扩展,可与流程外挂并存
主张四:前端外挂管「人机交互边界」,不管「系统真相边界」。
交互可拦在浏览器;业务真相以服务端事件为准。
四、模式二:后端外挂
4.1 设计意图
后端外挂回答的是:「引擎已经进入服务端生命周期,业务要以强类型、可调试的方式介入。」
适合:
- 发送前复杂规则、可改跳转节点 / 接收人
- 发送成功后写第三方待办、同步 ERP/主数据
- 需要访问引擎运行时变量(当前节点、WorkID、发送返回对象等)
- 平台级全局拦截(所有流程统一审计、统一组织策略)
4.2 设计记录
| 编号 | 决策 | 说明 |
|---|---|---|
| B1 | 一个子类绑定一个(组)流程模板 | 通过 FlowMark(如 ,065,)注册,避免「一个上帝类管全世界」 |
| B2 | 基类暴露引擎变量 | 子类可直接使用当前节点、WorkID、发送对象、系统参数等,降低「自己再查一遍引擎状态」的成本 |
| B3 | 程序集扫描即可用 | 类放入 BP.*.dll(CCFlow)或对应包(JFlow),由工厂反射发现,部署即生效 |
| B4 | 全局与流程级分层 | 全局 OverrideEvent / 可重写文件做平台定制;FlowEventBase 做流程级二开 |
| B5 | 统一错误协议 | 返回 err@... 阻止发送;与前端拦截语义一致,运维可读 |
源码注释中的产品原话(设计思想直述):
集成该基类的子类,可以重写事件的方法与基类交互;一个子类必须与一个流程模版绑定;基类里有很多流程运行过程中的变量,可辅助编写复杂业务逻辑。
4.3 与「改引擎」的本质区别
后端外挂写的是业务程序集 ,不是改 NodeSend 内核。
引擎升级时,业务 DLL / 包可独立保留------这是驰骋坚持「可二开而不改核」的技术承诺。
五、模式三:事件配置
5.1 设计意图
事件配置回答的是:「没有专职开发时,实施人员能否在设计器里把业务挂上?」
适合:
- SQL 校验 / 存储过程
- WebApi 同步外部系统
- 指向已有事件类、业务单元(BuessUnit)
- 节点事件、流程事件、表单事件的快速挂接
5.2 设计记录
| 编号 | 决策 | 说明 |
|---|---|---|
| C1 | 配置优先、代码兜底 | 能配就不强制写 DLL;复杂逻辑再落到 EventBase / 后端外挂 |
| C2 | 事件源三分 | 表单 / 节点 / 流程三类 EventSource,挂接点与业务对象对齐 |
| C3 | 执行体数据源化 | 现行主路径收敛到 GenerDBSrc(如 SFProc),SQL、WebApi、过程等统一编排 |
| C4 | 与外挂并列入口 | 设计器事件列表提供「前后端外挂」入口,明确:配置与代码二开是同一产品能力的两翼 |
| C5 | 事件清单产品化 | 每个事件有名称与业务说明,实施可按清单勾选,而不是背事件码 |
5.3 能力边界
事件配置擅长「标准化连接」:查库、调接口、调过程。
当逻辑需要大量分支、强类型重构、深度使用引擎变量时,应升级到后端外挂 ;当逻辑主要服务页面交互时,应落到前端外挂。
主张五:低代码不是弱代码,而是把「简单集成」从程序员日程里解放出来。
六、如何选型(场景 × 团队)
| 场景 | 更推荐 | 原因 |
|---|---|---|
| 发送前弹窗校验、禁用按钮、字段联动 | 前端外挂 | 反馈即时,无需先打到服务端 |
| 发送成功同步 ERP、写业务台账、改跳转人 | 后端外挂 | 强一致、可事务、可调试 |
| 一条 SQL / 一个 WebApi 就能完成 | 事件配置 | 实施可配,交付最快 |
| 全公司统一审计、统一组织策略 | 后端全局外挂 | 一次拦截,全流程生效 |
| 前端团队强、后端人手紧 | 前端外挂 + 事件配置 | 交互前端扛,集成配置扛 |
| 后端团队强、要长期演进 | 后端外挂为主 | 可测试、可重构、可版本管理 |
| 实施为主、少开发 | 事件配置为主 | 设计器闭环 |
设计记录 R2:三种模式允许叠加。
同一
SendWhen可以:前端先拦 → 后端再拦 → 配置再执行。顺序固定、语义清晰,叠加不是混乱,而是分层。
七、设计思想小结(宣传要点)
- 二开是一等公民:流程设计完成不等于项目完成;业务挂接点是产品能力,不是售后补丁。
- 事件语义统一:前端、后端、配置认同一套时钟,降低培训与协作成本。
- 核心不可污:升级路径建立在「业务在外、引擎在内」之上。
- 模式服务团队:不是强迫全员写 DLL,也不是强迫全员只配 SQL。
- 消息与业务解耦:同一事件点可推消息,也可跑脚本,二者独立配置。
八、以驰骋 BPM(CCFlow / JFlow)为例
以下用驰骋 BPM 开源引擎 CCFlow(.NET) 与 JFlow(Java) 说明上述思想如何落地。二者事件模型同源:事件名、二开分层、执行调度思想一致,差异主要在语言与程序集/包机制。
8.1 统一调度:ExecEvent
服务端由 ExecEvent 统一执行节点/流程/表单事件。节点发送时,大致顺序为:
- 全局拦截(如
OverrideEvent) - 流程事件实体(
FlowEventBase后端外挂) - 配置事件(
FrmEvents→ GenerDBSrc) - 消息推送(
PushMsgs,同事件标记)
这直接对应本文「后端外挂 + 事件配置」的服务端分层。
8.2 前端外挂示例(CCFlow Vue3)
- 基类:
WaiGuaBaseFlow(类名必须以WGFlow_开头) - 约定:
WGFlow_064绑定流程064 - 发送链路:工具栏先调
SendWhen,服务端成功后再调SendSuccess - 轻量替代:
DataUser/OverrideFiles下的beforeSend/afterSend等钩子
含义:前端外挂不是「随便写个 onClick」,而是与后端同源的事件协议。
8.3 后端外挂示例(CCFlow)
Demo F065 : FlowEventBase:
FlowMark = ",065,"绑定流程 065- 重写
SendWhen/SendSuccess - 注释明确标注为「后端外挂」;返回
err@...可阻止发送 - 类需进入
BP.*.dll才能被反射解析
JFlow 侧以 Java 包 + 同类 FlowEventBase 思想对应,事件方法与标记保持一致,便于跨语言团队按同一文档实施。
8.4 事件配置示例(设计器)
- 节点属性 →「节点事件」;流程属性 →「流程事件」
- 写入
Sys_FrmEvent,执行体走 GenerDBSrc(SQL / WebApi / SFProc / EventBase / BuessUnit 等) - 事件列表工具栏提供「前后端外挂」帮助入口,产品上承认:配置与代码二开并存
举例:
| 挂接点 | 配置做法 | 外挂做法 |
|---|---|---|
节点发送前 SendWhen |
SQL 校验金额是否超限 | FlowEventBase.SendWhen 复杂规则 + 改接收人 |
节点发送成功 SendSuccess |
WebApi 同步 ERP | 后端外挂写第三方待办 |
流程结束 FlowOverAfter |
过程归档 | 前端外挂提示 + 后端外挂关外部待办 |
8.5 一句话对照
| 思想 | 在 CCFlow / JFlow 中的落点 |
|---|---|
| 流程二开 | 事件挂接脚本,而不是改发送内核 |
| 前端外挂 | WGFlow_* / OverrideFiles |
| 后端外挂 | FlowEventBase + 程序集/包扫描 |
| 事件配置 | Sys_FrmEvent + GenerDBSrc |
| 统一语义 | SendWhen / SendSuccess / FlowOverAfter 等 |
结语
驰骋 BPM 对流程二开的态度很明确:
把流程设计好,把业务挂上去;挂的方式可以是前端外挂、后端外挂,或事件配置------按场景选,按团队选,但不要改引擎。
以 CCFlow / JFlow 为证:三种模式不是营销口号,而是源码里可运行、可演示、可交付的工程现实。
附录:关键源码索引(便于二次开发)
| 主题 | CCFlow / Vue3 路径(示例) |
|---|---|
| 前端外挂基类 | Vue3/src/bp/UIEntity/WaiGuaBaseFlow.ts |
| 前端外挂 Demo | Vue3/src/App/Demo/WGFlow_*.ts |
| 后端事件基类 | CCFlow/Components/BP.WF/WF/FlowEventBase.cs |
| 后端外挂 Demo | CCFlow/Components/BP.App/Demo/F065.cs |
| 事件执行入口 | CCFlow/Components/BP.WF/WF/ExecEvent.cs |
| 全局拦截 | CCFlow/Components/BP.WF/OverrideEvent.cs |
| 事件配置实体 | CCFlow/Components/BP.En30/Sys/FrmEvent.cs |
| 管理端事件列表 | Vue3/src/WF/Admin/FrmLogic/MapData/FrmEvent/GL_Event.ts |
| 节点/流程/表单事件清单 | EvenListNode / EvenListFlow / EvenListFrm |
本文档属于「.流程引擎BPM设计之」系列,侧重设计思想与主张;具体 API 以当期产品帮助与源码为准。