BPM SLA 示例
workflow-demo 给 wd_leave_approval 的两个人工审批节点各挂了一条 SLA:
| SLA | 绑定节点 | 业务含义 | demo 截止时间 |
|---|---|---|---|
wd_manager_approve_sla | task_manager_approve | 主管审批 | PT30S |
wd_hr_approve_sla | task_hr_approve | HR 审批 | PT30S |
PT30S 是演示和 E2E 专用值,为了在 1 分钟内观察 overdue;生产配置应改成 PT24H、PT8H 等真实时长。
配置结构
事实源是 plugins/workflow-demo/config/sla.json:
{
"slaKey": "wd_manager_approve_sla",
"name:zh-CN": "主管审批 SLA",
"targetType": "NODE",
"targetKey": "task_manager_approve",
"processKey": "wd_leave_approval",
"nodeId": "task_manager_approve",
"domainCode": "wd_leave_request",
"modelCode": "wd_leave_request",
"deadlineMode": "FIXED",
"deadlineValue": "PT30S",
"timeoutSeconds": 30,
"warningBeforeSeconds": 10,
"businessCalendar": false,
"warningRules": [
{
"beforeSeconds": 10,
"eventType": "sla_warning",
"notifyTargets": ["assignee"]
}
],
"suspendPolicy": "pause",
"escalationTargetType": "role_parent",
"escalationTargetValue": "wd_manager",
"enabled": true
}字段口径:
| 字段 | 作用 |
|---|---|
targetType: NODE | SLA 跟流程节点绑定,不是跟整条流程绑定 |
targetKey / nodeId | 都指向 designerJson.nodes[].id,本例是 task_manager_approve |
processKey | 限定流程定义 wd_leave_approval |
deadlineMode: FIXED + deadlineValue | 用 ISO-8601 时长计算截止时间 |
timeoutSeconds | demo/E2E 可读的秒数口径 |
warningBeforeSeconds / warningRules | 配置层表达预警意图;当前硬验证以 SLA record 状态为准 |
suspendPolicy: pause | 流程挂起时暂停计时,恢复后继续 |
escalationTargetType / escalationTargetValue | 超时升级目标,主管节点指向 wd_manager,HR 节点指向 wd_hr |
从任务激活到 SLA record
运行时链路:
wd:submit_leave_request
-> Smart Engine 创建 userTask
-> 发布 task_assigned BPM event
-> SlaActivationListener 按 NODE + activityId 查 SLA config
-> SlaRecordService.createRecord(...)
-> ab_sla_record.status = running
-> SlaSchedulerService 每 15 秒扫描 active records
-> 超过 deadlineTime 后 status = overdue关键实现:
SlaActivationListener只监听task_assigned事件;没有匹配targetType=NODE + targetKey=<activityId>的配置就跳过。deadlineValue由Duration.parse(...)计算;PT30S表示当前时间 + 30 秒。SlaRecordService.calculateProgress(...)会扣掉totalPausedMs,所以suspendPolicy: pause不把挂起时间算进逾期。SlaSchedulerService使用@Scheduled(fixedRate = 15000)扫描,因此 demo 里 30 秒 SLA 通常需要再给最多 15 秒调度延迟。
监控与 API
SLA 配置管理在 SlaConfigController,运行记录在 BpmMonitorController:
| 操作 | 端点 | 权限 |
|---|---|---|
| 列配置 | GET /api/bpm/sla-configs | BPM_SLA_MANAGE |
| 按目标查配置 | GET /api/bpm/sla-configs/by-target?targetType=NODE&targetKey=task_manager_approve | BPM_SLA_MANAGE |
| 查实例 SLA 记录 | GET /api/bpm/monitor/instances/{processInstanceId}/sla | BPM_MONITOR_READ |
| 查 SLA 记录列表 | GET /api/bpm/monitor/sla-records?status=overdue | BPM_MONITOR_READ |
| 查监控 dashboard | GET /api/bpm/monitor/dashboard | BPM_MONITOR_READ |
在任务中心里,SLA 是统计卡和任务运营信号;记录级 running / overdue 状态以 /bpm/sla-monitor drill-down 和监控 API 为准。在详情页 bpm-panel 中,它和流程图、操作、历史一起帮助定位当前卡在哪个节点。


E2E 验证口径
web-admin/tests/e2e/workflow-demo/wd-leave-sla-escalation.spec.ts 是当前最清晰的 SLA 真链路:
- 用管理员准备角色用户、申请人和请假余额。
- 申请人提交
days=1的年假,规则路由到task_manager_approve。 - 从业务记录
wd_req_process_instance取流程实例 id。 - 调
GET /api/bpm/tasks/by-process/{instanceId}确认主管任务 active。 - 立刻调
GET /api/bpm/monitor/instances/{instanceId}/sla,确认对应 SLA record 初始状态是running。 - 故意不让主管处理,等待
PT30S+ 调度延迟。 - 轮询同一个 SLA endpoint,直到出现
status=overdue。
这条测试只声明已经验证的事实:record 创建、running → overdue、任务未处理时业务状态仍停留在待审批。不要把未截图或未测试的 UI 通知写成已完成。
截图和 seed
先生成一批待办:
cd docs/screenshot-seeds
node seed_workflow_demo.mjs --base-url=http://127.0.0.1:5173 --storage-state=tests/storage/admin.json --min-requests=12要专门抓逾期截图时,新提交一条 days=1 的申请后不要处理主管任务,等待 45-60 秒,再打开任务中心或监控端点。若本地调度器未运行,页面不会变成 overdue;先检查后端日志里是否有 SLA scheduler scanning。