驰骋 BPM 流程事件体系技术文档
| 项目 | 内容 |
|---|---|
| 文档名称 | 驰骋 BPM 流程事件体系技术文档 |
| 文档编号 | ZTE-CCBPM-FLOW-EVENT-2026-001 |
| 版本号 | V1.0 |
| 密级 | 内部公开 |
| 编制日期 | 2026-07-20 |
| 编制依据 | EventListNode / EventListFlow、ExecEvent、FlowEventBase、FrmEvent、PushMsg、EventList.xml |
| 适用范围 | 流程事件设计思想宣讲、二次开发选型、消息推送配置与实施评估 |
修订记录
| 版本 | 日期 | 修订人 | 说明 |
|---|---|---|---|
| V1.0 | 2026-07-20 | — | 初版:事件定义、节点/流程事件划分、设计主张、源码映射与实践说明 |
摘要
驰骋 BPM 主张:流程引擎负责“怎么流转”,事件体系负责“流转时业务怎么介入”。
在用户点击发送、退回、移交、结束、删除等操作时,引擎在固定生命周期点抛出事件;事件既可驱动消息推送,也可挂接业务脚本 / 外挂 DLL / WebAPI,实现“配置优先、代码兜底”的二开闭环。
本文说明驰骋 BPM 对流程事件的设计思想与主张,重点记录关键设计决策,并以 CCFlow(.NET)/ JFlow(Java) 的实现对齐说明。
一、设计主张:事件是流程与业务的契约
1.1 什么是流程事件
流程事件 = 操作流程时发生的动作节点上的“可挂接点”。
典型操作包括:发送、退回、移交、撤销、结束流程、删除实例等。
驰骋 BPM 将事件明确分为两类:
| 类别 | 绑定对象 | 触发粒度 | 典型用途 |
|---|---|---|---|
| 节点事件 | 具体节点(WF_Node / Sys_FrmEvent.NodeID) | 节点办理动作前后 | 发送校验、到岗消息、退回提醒、打开初始化 |
| 流程事件 | 流程模板(WF_Flow / Sys_FrmEvent.FlowNo) | 实例生命周期 | 建单初始化、结束归档、删除清理 |
主张一:不要把业务逻辑塞进引擎内核;把业务挂在事件上。引擎保持稳定,业务按事件扩展。
1.2 为什么要定义事件
驰骋 BPM 认为事件只有两个核心价值,且必须同时具备:
- 用于发送消息
把“谁该被通知、何时通知、用什么通道通知”从代码中剥离,配置到事件上(邮件、短信、企业微信、钉钉、站内消息等)。 - 用于流程二开、运行业务脚本
在发送前校验、发送后同步第三方、结束后写业务库、删除前拦截等,全部通过事件脚本 / 外挂实现,避免改引擎源码。
主张二:消息与业务脚本共用同一套事件时钟。同一时刻既可推消息,也可跑脚本,二者解耦、可独立配置。
1.3 与“硬编码回调”的区别
| 传统做法 | 驰骋 BPM 做法 |
|---|---|
在发送 API 里写死 if (nodeId==101) | 在节点上配置 SendWhen / SendSuccess |
| 每个项目改引擎 | 项目只写 FlowEventBase 子类或 SQL/WebAPI |
| 消息与业务缠在一起 | PushMsg 管消息,FrmEvent / 外挂管业务 |
二、事件分类设计(设计记录)
2.1 节点事件(Node Events)
节点事件回答的是:“这个节点上,某次人机操作前后,要不要做事?”
| 事件(业务名) | 事件标记(代码) | 设计意图 |
|---|---|---|
| 发送前 | SendWhen | 校验、改转向、改接收人;可拦截发送 |
| 发送成功 | SendSuccess | 同步待办、写外部系统、发成功提示/消息 |
| 发送失败 | SendError | 失败补偿、告警 |
| 移交后 | ShitAfter | 移交完成通知与业务同步 |
| 退回前 | ReturnBefore | 退回校验、原因完整性检查 |
| 退回后 | ReturnAfter | 退回通知、状态回写 |
| 工作打开时 | WhenReadWork | 打开初始化、已读标记、权限侧逻辑 |
| 撤销前 | UndoneBefore | 撤销可行性校验 |
| 撤销后 | UndoneAfter | 撤销后清理与通知 |
设计记录(关键决策)
- 前后对称优先
对会改变流程状态的动作(发送、退回、撤销),默认提供 Before / After。- Before:可抛错拦截(“阻止动作”)。
- After:做通知与副作用(“动作已发生”)。
- 发送拆成三态
不只“发送后”,而是SendWhen(前)+SendSuccess(成功)+SendError(失败)。
原因:发送是最高频、最易失败、最需消息的动作,必须细粒度可控。 - 工作打开也是事件
WhenReadWork把“打开表单”纳入事件时钟,支撑已读、初始化、审计,而不是只在按钮点击时才有扩展点。 - 产品扩展事件
源码在上述核心集之外,还沉淀了WorkArrive(工作到达)、催办后、抄送后、加签后、节点预警/逾期等,体现“核心事件稳定、扩展事件可演进”。
说明:移交在引擎中以 移交后(
ShitAfter) 为主落地;消息推送与业务同步通常发生在动作完成后。若项目需要移交前校验,可通过接口层或外挂前置逻辑实现,与节点 Before 事件同一思想。
2.2 流程事件(Flow Events)
流程事件回答的是:“这个流程实例从生到灭,关键时刻要不要做事?”
| 事件(业务名) | 事件标记(代码) | 设计意图 |
|---|---|---|
| 实例创建后 | FlowOnCreateWorkID | 建单初始化、写关联业务主键、生成编号 |
| 流程结束前 | FlowOverBefore | 结束前校验、归档准备;可阻止结束 |
| 流程结束后 | FlowOverAfter | 归档、回写实体、关闭外部待办、结束消息 |
| 删除前 | BeforeFlowDel | 删除保护(有子流程/有业务关联则拦截) |
| 删除后 | AfterFlowDel | 清理外部数据、清理消息 |
设计记录(关键决策)
- 实例级与节点级分离
建单、结束、删除是实例生命周期问题,不应绑死在某一个业务节点上,故独立为流程事件。 - 结束前可拦、结束后必通
FlowOverBefore允许业务否决结束;FlowOverAfter侧重归档与通知,异常不回滚已结束事实(与节点 After 同类语义)。 - 删除必须可拦截
删除是破坏性操作,BeforeFlowDel被设计为“可抛异常阻止”,避免误删导致业务数据悬空。
三、运行时架构:一条动作如何打到事件
3.1 统一调度入口
驰骋 BPM 将事件执行收敛到 ExecEvent:
- 节点动作 →
ExecEvent.DoNode(...) - 流程动作 →
ExecEvent.DoFlow(...)
发送路径示例(概念顺序):
用户点击发送
→ NodeSendOrchestrator / WorkNode
→ ExecEvent.DoNode(SendWhen) // 发送前:可拦截
→ 引擎完成路由、写待办、写轨迹
→ ExecEvent.DoNode(SendSuccess) // 发送成功:脚本 + 消息
失败时
→ ExecEvent.DoNode(SendError)
退回 / 撤销 / 移交 / 结束 / 删除同理,分别在 WorkReturn、WorkUnSend、ShiftWork、WorkFlow、流程删除链路中调用对应事件标记。
3.2 一次事件的多层执行链(设计记录)
ExecEvent 内部采用分层挂接,而不是单一回调:
| 层次 | 代表组件 | 面向人群 | 设计意图 |
|---|---|---|---|
| 全局重写 | OverrideEvent | 平台集成方 | 统一对接企微/钉钉/邮件等,不改引擎 |
| 流程外挂 | FlowEventBase 子类 | 高级二开 | 强类型、可调试、可访问引擎上下文 |
| 配置脚本 | Sys_FrmEvent + EventDoType | 实施顾问 | 少写代码,SQL/WebAPI/业务单元即可 |
| 消息推送 | WF_PushMsg / PushMsg | 业务管理员 | 与脚本解耦,按事件勾选通道与接收人 |
主张三:同一事件可“叠多层”,但责任清晰——平台层、项目层、配置层、消息层互不替代。
3.3 配置型事件的执行方式
EventDoType 体现“配置优先”:
| 值 | 含义 | 适用场景 |
|---|---|---|
Disable | 禁用 | 临时关闭 |
SQL / SP | SQL / 存储过程 | 轻量写库、校验 |
URLOfSelf / WebApi | HTTP 回调 | 对接微服务 |
WSOfSelf | WebService | 遗留系统 |
EventBase / SpecClass / BuessUnit | 类方法 / 业务单元 | 复杂逻辑 |
SFProc | 系统过程 | 可视化过程编排 |
消息侧:EventList.xml 用 IsHaveMsg 标明哪些事件适合推送(如 SendSuccess、ReturnAfter、FlowOverAfter 为 1;多数 Before 为 0)。
引擎在 ExecEvent 中对可推送事件集合做白名单处理,避免“发送前校验事件”误发业务消息。
四、两大用途深挖
4.1 用途一:发送消息
设计主张:消息不是业务代码的副产品,而是事件的一等公民。
实践要点:
- 在节点/流程上配置
PushMsg,绑定事件号(如SendSuccess、ReturnAfter、ShitAfter、FlowOverAfter)。 - 发送成功后,引擎根据接收人规则、模板、通道写入
Sys_SMS并投递。 - 退回、移交、撤销、结束后,会按策略清理或刷新旧消息,避免“已办完仍提醒”。
典型场景:
| 场景 | 建议事件 | 说明 |
|---|---|---|
| 待办到达提醒 | SendSuccess / WorkArrive | 通知下一办理人 |
| 退回提醒 | ReturnAfter | 通知被退回人 |
| 移交提醒 | ShitAfter | 通知被移交人 |
| 流程办结通知 | FlowOverAfter | 通知发起人/干系人 |
4.2 用途二:二开运行业务脚本
设计主张:二开应“挂在事件上”,而不是“改在引擎里”。
三种常用二开形态:
- 配置脚本(最快)
节点属性 / 流程属性 → 事件 → 写 SQL 或 WebAPI。 - 流程外挂类(最稳)
继承FlowEventBase,重写SendWhen、SendSuccess、FlowOverAfter等,用FlowMark绑定流程编号。
演示类:BP.App.Demo.F065。 - 全局 Override(平台级)
OverrideEvent统一处理所有流程的某类事件(如统一写待办到门户)。
外挂可访问的上下文(设计有意暴露):当前节点、WorkID、发送返回对象、接收人、可改转向的 JumpToNodeID / JumpToEmps 等——让二开“看得见引擎,但改不动内核”。
五、设计思想总结(驰骋主张)
- 事件是契约,不是补丁
先定义生命周期时钟,再让消息与业务挂接;避免项目各写一套回调。 - 节点事件管动作,流程事件管生死
发送/退回/移交属节点;建单/结束/删除属流程。边界清晰,配置不混乱。 - Before 可拦,After 可通
用异常与返回约定表达控制权,减少“事后补偿”成本。 - 消息与脚本同钟异轨
同一事件时刻,消息走PushMsg,业务走FrmEvent/ 外挂,互不绑架。 - 配置优先,代码兜底,全局可覆盖
顾问能配就不写代码;复杂逻辑进外挂;跨流程共性进OverrideEvent。 - 双栈同源
CCFlow 与 JFlow 共用同一事件语义与标记命名,降低跨语言团队协作成本。
六、以驰骋 BPM(CCFlow / JFlow)为例
6.1 产品定位
驰骋 BPM 提供两套等价实现:
| 产品 | 技术栈 | 事件核心类(示例) |
|---|---|---|
| CCFlow | .NET | BP.Sys.EventListNode / EventListFlow,BP.WF.ExecEvent,BP.WF.FlowEventBase |
| JFlow | Java | 同名语义事件标记与执行模型(与 CCFlow 对齐) |
二者在事件名称、触发时机、消息挂接方式上保持一致,企业可按技术栈选型,事件设计思想不变。
6.2 源码锚点(便于对照)
| 能力 | CCFlow 位置 |
|---|---|
| 节点事件常量 | Components/BP.En30/Sys/EvenListNode.cs |
| 流程事件常量 | Components/BP.En30/Sys/EvenListFlow.cs |
| 事件元数据(中文名/是否有消息) | CCFlow/WF/Data/XML/EventList.xml |
| 统一执行器 | Components/BP.WF/WF/ExecEvent.cs |
| 外挂基类 | Components/BP.WF/WF/FlowEventBase.cs |
| 配置事件实体 | Components/BP.En30/Sys/FrmEvent.cs |
| 消息推送 | Components/BP.WF/Template/PushMsg.cs |
| 发送触发 | NodeSendOrchestrator 中 SendWhen / SendSuccess / SendError |
| 退回触发 | WorkReturn 中 ReturnBefore / ReturnAfter |
| 移交触发 | ShiftWork 中 ShitAfter |
| 打开触发 | Dev2Interface 中 WhenReadWork |
| 结束触发 | WorkFlow 中 FlowOverBefore 等 |
| 建单触发 | Flow 中 FlowOnCreateWorkID |
| 演示外挂 | Components/BP.App/Demo/F065.cs |
6.3 落地建议(给实施与二开)
- 先配消息,再写脚本:80% 通知类需求用
PushMsg完成。 - 校验类逻辑优先挂 Before:发送前、退回前、结束前、删除前。
- 同步外部系统挂 Success / After:避免动作未成功却已写外部库。
- 多流程共性进 Override,单流程个性进 FlowEventBase。
- 不要改
ExecEvent内核:扩展应落在外挂与配置表。
6.4 一句话结论
驰骋 BPM(CCFlow / JFlow)用节点事件 + 流程事件把流程操作时刻产品化;用同一事件时钟同时支撑消息推送与业务二开。
这不是附加功能,而是引擎与业务解耦的核心设计主张。
附录 A:事件速查(与口径对齐)
A.1 节点事件(口径)
发送前、发送成功、发送失败、移交后、退回前、退回后、工作打开时、撤销前、撤销后。
A.2 流程事件(口径)
实例创建后、流程结束前、流程结束后、删除前、删除后。
A.3 引擎中额外沉淀的常用事件(扩展)
工作到达、催办后、抄送后、加签后/加签答复后、节点预警/逾期、流程回滚前/后等——用于更细的消息与运维场景,不改变“节点 / 流程二分”的总原则。

783

被折叠的 条评论
为什么被折叠?



