节点事件管动作前后,流程事件管实例全生命周期。本文整理一套事件体系的设计决策、执行链与两大用途。
该 BPM 平台主张:流程引擎负责“怎么流转”,事件体系负责“流转时业务怎么介入”。 在用户点击发送、退回、移交、结束、删除等操作时,引擎在固定生命周期点抛出事件;事件既可驱动消息推送,也可挂接业务脚本 / 外挂 DLL / WebAPI,实现“配置优先、代码兜底”的二开闭环。
本文说明该 BPM 平台对流程事件的设计思想与主张,重点记录关键设计决策,并以 该引擎(.NET)/ 该引擎(Java) 的实现对齐说明。
流程事件 = 操作流程时发生的动作节点上的“可挂接点”。 典型操作包括:发送、退回、移交、撤销、结束流程、删除实例等。
该 BPM 平台将事件明确分为两类:
类别 | 绑定对象 | 触发粒度 | 典型用途 |
|---|---|---|---|
节点事件 | 具体节点(WF_Node / Sys_FrmEvent.NodeID) | 节点办理动作前后 | 发送校验、到岗消息、退回提醒、打开初始化 |
流程事件 | 流程模板(WF_Flow / Sys_FrmEvent.FlowNo) | 实例生命周期 | 建单初始化、结束归档、删除清理 |
主张一:不要把业务逻辑塞进引擎内核;把业务挂在事件上。引擎保持稳定,业务按事件扩展。
该 BPM 平台认为事件只有两个核心价值,且必须同时具备:
主张二:消息与业务脚本共用同一套事件时钟。同一时刻既可推消息,也可跑脚本,二者解耦、可独立配置。
传统做法 | 该 BPM 平台做法 |
|---|---|
在发送 API 里写死 if (nodeId==101) | 在节点上配置 SendWhen / SendSuccess |
每个项目改引擎 | 项目只写 FlowEventBase 子类或 SQL/WebAPI |
消息与业务缠在一起 | PushMsg 管消息,FrmEvent / 外挂管业务 |
节点事件回答的是:“这个节点上,某次人机操作前后,要不要做事?”
事件(业务名) | 事件标记(代码) | 设计意图 |
|---|---|---|
发送前 | SendWhen | 校验、改转向、改接收人;可拦截发送 |
发送成功 | SendSuccess | 同步待办、写外部系统、发成功提示/消息 |
发送失败 | SendError | 失败补偿、告警 |
移交后 | ShitAfter | 移交完成通知与业务同步 |
退回前 | ReturnBefore | 退回校验、原因完整性检查 |
退回后 | ReturnAfter | 退回通知、状态回写 |
工作打开时 | WhenReadWork | 打开初始化、已读标记、权限侧逻辑 |
撤销前 | UndoneBefore | 撤销可行性校验 |
撤销后 | UndoneAfter | 撤销后清理与通知 |
设计记录(关键决策)
SendWhen(前)+ SendSuccess(成功)+ SendError(失败)。
原因:发送是最高频、最易失败、最需消息的动作,必须细粒度可控。WhenReadWork 把“打开表单”纳入事件时钟,支撑已读、初始化、审计,而不是只在按钮点击时才有扩展点。WorkArrive(工作到达)、催办后、抄送后、加签后、节点预警/逾期等,体现“核心事件稳定、扩展事件可演进”。说明:移交在引擎中以 移交后(
ShitAfter) 为主落地;消息推送与业务同步通常发生在动作完成后。若项目需要移交前校验,可通过接口层或外挂前置逻辑实现,与节点 Before 事件同一思想。
流程事件回答的是:“这个流程实例从生到灭,关键时刻要不要做事?”
事件(业务名) | 事件标记(代码) | 设计意图 |
|---|---|---|
实例创建后 | FlowOnCreateWorkID | 建单初始化、写关联业务主键、生成编号 |
流程结束前 | FlowOverBefore | 结束前校验、归档准备;可阻止结束 |
流程结束后 | FlowOverAfter | 归档、回写实体、关闭外部待办、结束消息 |
删除前 | BeforeFlowDel | 删除保护(有子流程/有业务关联则拦截) |
删除后 | AfterFlowDel | 清理外部数据、清理消息 |
设计记录(关键决策)
FlowOverBefore 允许业务否决结束;FlowOverAfter 侧重归档与通知,异常不回滚已结束事实(与节点 After 同类语义)。BeforeFlowDel 被设计为“可抛异常阻止”,避免误删导致业务数据悬空。该 BPM 平台将事件执行收敛到 ExecEvent:
ExecEvent.DoNode(...)ExecEvent.DoFlow(...)发送路径示例(概念顺序):
用户点击发送
→ NodeSendOrchestrator / WorkNode
→ ExecEvent.DoNode(SendWhen) // 发送前:可拦截
→ 引擎完成路由、写待办、写轨迹
→ ExecEvent.DoNode(SendSuccess) // 发送成功:脚本 + 消息
失败时
→ ExecEvent.DoNode(SendError)退回 / 撤销 / 移交 / 结束 / 删除同理,分别在 WorkReturn、WorkUnSend、ShiftWork、WorkFlow、流程删除链路中调用对应事件标记。
ExecEvent 内部采用分层挂接,而不是单一回调:
一次事件的分层执行链对照:
步骤 | 环节 | 说明 |
|---|---|---|
1 | 操作发生 | 发送 / 退回 / 移交 / 结束等动作触发 |
2 | OverrideEvent 全局重写 | 平台集成方统一对接,不改引擎 |
3 | FlowEventBase 流程外挂 | 高级二开,强类型、可调试 |
4 | FrmEvent 配置型脚本 | SQL / WebAPI / 业务单元,配置优先 |
5 | 消息判断 | 事件允许消息则走 PushMsg 推送,否则直接返回脚本结果 |
层次 | 代表组件 | 面向人群 | 设计意图 |
|---|---|---|---|
全局重写 | OverrideEvent | 平台集成方 | 统一对接企微/钉钉/邮件等,不改引擎 |
流程外挂 | FlowEventBase 子类 | 高级二开 | 强类型、可调试、可访问引擎上下文 |
配置脚本 | Sys_FrmEvent + EventDoType | 实施顾问 | 少写代码,SQL/WebAPI/业务单元即可 |
消息推送 | WF_PushMsg / PushMsg | 业务管理员 | 与脚本解耦,按事件勾选通道与接收人 |
主张三:同一事件可“叠多层”,但责任清晰——平台层、项目层、配置层、消息层互不替代。
EventDoType 体现“配置优先”:
值 | 含义 | 适用场景 |
|---|---|---|
Disable | 禁用 | 临时关闭 |
SQL / SP | SQL / 存储过程 | 轻量写库、校验 |
URLOfSelf / WebApi | HTTP 回调 | 对接微服务 |
WSOfSelf | WebService | 遗留系统 |
EventBase / SpecClass / BuessUnit | 类方法 / 业务单元 | 复杂逻辑 |
SFProc | 系统过程 | 可视化过程编排 |
消息侧:EventList.xml 用 IsHaveMsg 标明哪些事件适合推送(如 SendSuccess、ReturnAfter、FlowOverAfter 为 1;多数 Before 为 0)。
引擎在 ExecEvent 中对可推送事件集合做白名单处理,避免“发送前校验事件”误发业务消息。
设计主张:消息不是业务代码的副产品,而是事件的一等公民。
实践要点:
PushMsg,绑定事件号(如 SendSuccess、ReturnAfter、ShitAfter、FlowOverAfter)。Sys_SMS 并投递。典型场景:
场景 | 建议事件 | 说明 |
|---|---|---|
待办到达提醒 | SendSuccess / WorkArrive | 通知下一办理人 |
退回提醒 | ReturnAfter | 通知被退回人 |
移交提醒 | ShitAfter | 通知被移交人 |
流程办结通知 | FlowOverAfter | 通知发起人/干系人 |
设计主张:二开应“挂在事件上”,而不是“改在引擎里”。
三种常用二开形态:
FlowEventBase,重写 SendWhen、SendSuccess、FlowOverAfter 等,用 FlowMark 绑定流程编号。
演示类:BP.App.Demo.F065。OverrideEvent 统一处理所有流程的某类事件(如统一写待办到门户)。外挂可访问的上下文(设计有意暴露):当前节点、WorkID、发送返回对象、接收人、可改转向的 JumpToNodeID / JumpToEmps 等——让二开“看得见引擎,但改不动内核”。
PushMsg,业务走 FrmEvent / 外挂,互不绑架。OverrideEvent。该 BPM 平台 提供两套等价实现:
产品 | 技术栈 | 事件核心类(示例) |
|---|---|---|
该引擎 | .NET | BP.Sys.EventListNode / EventListFlow,流程组件.ExecEvent,流程组件.FlowEventBase |
该引擎 | Java | 同名语义事件标记与执行模型(与该引擎对齐) |
二者在事件名称、触发时机、消息挂接方式上保持一致,企业可按技术栈选型,事件设计思想不变。
能力 | 该引擎位置 |
|---|---|
节点事件常量 | Components/基础框架组件/Sys/EvenListNode.cs |
流程事件常量 | Components/基础框架组件/Sys/EvenListFlow.cs |
事件元数据(中文名/是否有消息) | 引擎源码模块 |
统一执行器 | Components/流程组件/WF/ExecEvent.cs |
外挂基类 | Components/流程组件/WF/FlowEventBase.cs |
配置事件实体 | Components/基础框架组件/Sys/FrmEvent.cs |
消息推送 | Components/流程组件/Template/PushMsg.cs |
发送触发 | NodeSendOrchestrator 中 SendWhen / SendSuccess / SendError |
退回触发 | WorkReturn 中 ReturnBefore / ReturnAfter |
移交触发 | ShiftWork 中 ShitAfter |
打开触发 | Dev2Interface 中 WhenReadWork |
结束触发 | WorkFlow 中 FlowOverBefore 等 |
建单触发 | Flow 中 FlowOnCreateWorkID |
演示外挂 | Components/BP.App/Demo/F065.cs |
PushMsg 完成。 ExecEvent 内核:扩展应落在外挂与配置表。该 BPM 平台(该引擎)用节点事件 + 流程事件把流程操作时刻产品化;用同一事件时钟同时支撑消息推送与业务二开。 这不是附加功能,而是引擎与业务解耦的核心设计主张。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。