BPM SLA 示例

workflow-demowd_leave_approval 的两个人工审批节点各挂了一条 SLA:

SLA绑定节点业务含义demo 截止时间
wd_manager_approve_slatask_manager_approve主管审批PT30S
wd_hr_approve_slatask_hr_approveHR 审批PT30S

PT30S 是演示和 E2E 专用值,为了在 1 分钟内观察 overdue;生产配置应改成 PT24HPT8H 等真实时长。

配置结构

事实源是 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: NODESLA 跟流程节点绑定,不是跟整条流程绑定
targetKey / nodeId都指向 designerJson.nodes[].id,本例是 task_manager_approve
processKey限定流程定义 wd_leave_approval
deadlineMode: FIXED + deadlineValue用 ISO-8601 时长计算截止时间
timeoutSecondsdemo/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> 的配置就跳过。
  • deadlineValueDuration.parse(...) 计算;PT30S 表示当前时间 + 30 秒。
  • SlaRecordService.calculateProgress(...) 会扣掉 totalPausedMs,所以 suspendPolicy: pause 不把挂起时间算进逾期。
  • SlaSchedulerService 使用 @Scheduled(fixedRate = 15000) 扫描,因此 demo 里 30 秒 SLA 通常需要再给最多 15 秒调度延迟。

监控与 API

SLA 配置管理在 SlaConfigController,运行记录在 BpmMonitorController:

操作端点权限
列配置GET /api/bpm/sla-configsBPM_SLA_MANAGE
按目标查配置GET /api/bpm/sla-configs/by-target?targetType=NODE&targetKey=task_manager_approveBPM_SLA_MANAGE
查实例 SLA 记录GET /api/bpm/monitor/instances/{processInstanceId}/slaBPM_MONITOR_READ
查 SLA 记录列表GET /api/bpm/monitor/sla-records?status=overdueBPM_MONITOR_READ
查监控 dashboardGET /api/bpm/monitor/dashboardBPM_MONITOR_READ

在任务中心里,SLA 是统计卡和任务运营信号;记录级 running / overdue 状态以 /bpm/sla-monitor drill-down 和监控 API 为准。在详情页 bpm-panel 中,它和流程图、操作、历史一起帮助定位当前卡在哪个节点。

任务中心里的 wd_leave_approval 待办任务与 SLA 统计卡

SLA 监控 overdue drill-down 中的 task_manager_approve 记录

E2E 验证口径

web-admin/tests/e2e/workflow-demo/wd-leave-sla-escalation.spec.ts 是当前最清晰的 SLA 真链路:

  1. 用管理员准备角色用户、申请人和请假余额。
  2. 申请人提交 days=1 的年假,规则路由到 task_manager_approve
  3. 从业务记录 wd_req_process_instance 取流程实例 id。
  4. GET /api/bpm/tasks/by-process/{instanceId} 确认主管任务 active。
  5. 立刻调 GET /api/bpm/monitor/instances/{instanceId}/sla,确认对应 SLA record 初始状态是 running
  6. 故意不让主管处理,等待 PT30S + 调度延迟。
  7. 轮询同一个 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

后续步骤