什么是 BPM
BPM(Business Process Management)是 Epicor ERP 中实现业务自动化规则的核心机制。通过 BPM,你可以在数据创建、修改、删除等关键节点上自动执行校验、计算、通知等操作,而无需修改底层代码。
典型的应用场景包括:
- 销售订单提交时自动校验库存并发出预警
- 采购订单审批流程中根据金额自动路由到不同审批层级
- 工单完成时自动计算实际成本与标准成本的差异
- 客户资料修改时自动记录变更日志
BPM 的基本组成
一个完整的 BPM 由以下部分组成:
- 触发器(Trigger):定义何时触发 BPM,支持的触发时机包括:
- Before(数据变更前)—— 适合做数据校验
- After(数据变更后)—— 适合做后续处理
- In-Transaction(事务中)—— 适合关联数据查询
- Method Directive(方法调用时)—— 拦截特定方法
- 条件(Condition):可选的筛选条件,只有满足条件时才执行
- 方法指令(Method Directive):具体的执行动作,支持赋值、调用函数、执行内联 C# 代码等
实战案例:销售订单行折扣校验
需求:当销售员在订单行输入超过 30% 的折扣时,自动发出警告邮件给销售主管。
步骤 1:创建 Method Directive
进入 系统管理 → 业务流程管理 → 方法指令维护,选择 SalesOrder.Update 方法,新建一个 Directive:
方法名:SalesOrder.Update
触发时机:In-Transaction
条件:ttOrderDtl.DiscountPercent > 30
步骤 2:添加方法指令
在 Directive 下添加以下方法指令:
- Set Variable:将订单号、行号、客户名赋给临时变量
- Invoke BO Method:调用邮件发送方法
BO: Epicor.Mfg.Core.Session 方法: SendMail 参数: To = "sales-manager@company.com" Subject = "大额折扣审批提醒 - " + 订单号 Body = "订单 {0} 的第 {1} 行折扣为 {2}%,请及时审批"
BPM 中使用内联 C# 代码时,注意 Epicor 会对其进行编译缓存。修改代码后需要在服务器端清除缓存或重启 AppServer 才能生效。
高级技巧:使用 ABL(Advanced Business Logic)
对于复杂的业务逻辑,可以使用内联 C# 代码(Custom Code)。BPM 的 Custom Code 中可以直接访问以下对象:
// 获取当前 BPM 上下文
var ds = (SalesOrderDataSet) this.DataSet;
// 遍历订单行
foreach (var row in ds.OrderDtl.Where(r => r.Added() || r.Updated()))
{
if (row.DiscountPercent > 30)
{
// 自定义处理逻辑
CallContext.Current.ExceptionManager.AddBLException(
$"订单行 {row.LineNum} 折扣 {row.DiscountPercent}% 超过限制,需要审批");
}
}
调试与排查
BPM 调试的常用方法:
- 启用 跟踪日志(Trace Log):在 System Settings 中将 BPM Trace Level 设为 Verbose
- 使用 BPM Monitor:实时查看 BPM 执行情况
- 查看 SSRS BPM 报表:分析 BPM 的执行频率和耗时
- 善用
EpiDataView事件日志进行断点式调试
最佳实践
- 保持 BPM 逻辑简单,复杂逻辑应考虑放在 UD(User Defined)表或自定义程序中
- 使用有意义的命名规范(如
SO_DiscountWarning_Validate) - 为每个 BPM 添加注释说明业务意图,方便后续维护
- 在测试环境充分验证后再部署到生产环境
- 避免在 Before 触发器中执行耗时的外部调用(如 API 请求)