实例级流程预测接口说明¶
对应实现:
obpm-core预测引擎;obpm-runtime详情页 / 流程图 / 待办提示;obpm-manager管理员风险清单。
功能规格见同目录 实例级流程预测功能详细描述.md。
约束:预测仅用于界面提示与消息预警,不干预真实流程流转;不向第三方系统开放预测 API。
拆分:详情页预测、流程图叠加、待办提示为 Runtime 内部 UI 接口;管理员风险清单为 Manager 流程监控接口,与运行时登录用户、DES 加密路径分离。
1. 通用约定¶
1.1 服务与基础路径¶
Runtime(详情页 / 流程图 / 待办)
| 项 | 值 |
|---|---|
| 模块 | Runtime 工作流 |
| Controller | cn.myapps.runtime.workflow.controller.WorkflowController |
| 基础路径 | /api/runtime/{applicationId} |
| 兼容别名 | /api/authtime/{applicationId} |
| Content-Type | application/json |
| 鉴权 | 需已登录前台用户(accessToken,与现有 Runtime 接口相同) |
applicationId、docId 与现网其它 Runtime 接口一致:路径上为 按当前用户 ID 加密后的密文,服务端用 DesUtil.decryptTextByUserId 解密。instanceId 为流程实例 ID(T_FLOWSTATERT.ID),明文传递。
Manager(管理员风险清单)
| 项 | 值 |
|---|---|
| 模块 | Manager 流程监控 |
| Controller | cn.myapps.manager.authtime.controller.flow.FlowInterventionController |
| 基础路径 | {manager-context}/api/authtime |
| Content-Type | application/json |
| 鉴权 | 需管理员 adminToken(与现有流程监控接口相同) |
domainid、applicationid 为明文企业域 id / 软件 id,**不**做 DES 加密。applicationid 仅用于选库。
1.2 统一响应包¶
成功时 HTTP 200,body 为 Resource:
| 字段 | 类型 | 说明 |
|---|---|---|
errcode |
int | 0 成功 |
errmsg |
string | 提示,成功为 "ok" |
data |
object | 业务数据,见各接口 |
业务失败(实例不存在、无权限看见预测面板)仍返回 errcode=0,在 data.visible=false 中表达,避免前端把权限问题当成系统错误。
1.3 可见范围¶
| 角色 | 预测详情(Runtime 详情页) | 风险清单(Manager 流程监控) |
|---|---|---|
| 单据申请人(发起人 / 作者) | 可见 | 不可见 |
| 当前审批处理人 | 可见 | 不可见 |
| 管理员(超管 / 域管 / 开发者) | 可见 | 可见(管理控制台,adminToken) |
| 其它人 | visible=false |
未登录管理端则无法调用 |
1.4 SLA 风险枚举¶
slaRisk |
slaRiskLabel |
含义 |
|---|---|---|
NORMAL |
正常 | 预测完成时间 ≤ SLA 截止,或未配置 SLA |
RISK |
存在超时风险 | 预测完成略晚于 SLA(逾期不超过剩余 SLA 窗口的 20%) |
HIGH |
高概率超时 | 预测完成明显晚于 SLA,或 SLA 已过仍未结束 |
这是**事前预警**,与节点 deadline 事后超时提醒并存,互不替代。
1.5 时长展示¶
remainingDurationText 由工作分钟格式化:
< 1h:45m< 1d:14h20m、8h≥ 1d:1d2h
剩余分钟按**工作日历**累加得到预计完成时刻;无日历时退化为自然分钟。
2. 获取实例预测(详情页主接口)¶
流程详情页预测面板、流程图灰色虚线的主数据源。
2.1 基本信息¶
| 项 | 值 |
|---|---|
| Method | GET |
| Path | /api/runtime/{applicationId}/documents/{docId}/workflows/{instanceId}/prediction |
| 别名 | /api/authtime/{applicationId}/documents/{docId}/workflows/{instanceId}/prediction |
| Controller 方法 | WorkflowController.getFlowPrediction |
| 服务 | WorkflowRunTimeService.getFlowPrediction → FlowPredictionService.getPrediction |
2.2 路径参数¶
| 参数 | 必填 | 说明 |
|---|---|---|
applicationId |
是 | 软件 ID(加密) |
docId |
是 | 文档 ID(加密) |
instanceId |
是 | 流程实例 ID(FlowStateRT.id) |
无 Query、无 Body。
2.3 成功 data 字段¶
无权限时:
实例不存在时:
可见时:
{
"visible": true,
"remainingMinutes": 860,
"remainingDurationText": "14h20m",
"predictedFinishTime": "2026-09-09 16:30:00",
"slaDeadline": "2026-09-09 18:00:00",
"slaRisk": "NORMAL",
"slaRiskLabel": "正常",
"currentNodeId": "1001",
"sampleSize": 42,
"lowSample": false,
"style": "dashed-gray",
"predictedPath": [
{
"nodeId": "1001",
"nodeName": "部门经理",
"probability": 1.0,
"current": true,
"complete": false,
"avgMinutes": 90,
"predictedApprovers": [
{ "id": "U001", "name": "张三", "probability": 0.62 }
]
},
{
"nodeId": "1002",
"nodeName": "财务审核",
"probability": 1.0,
"current": false,
"complete": false,
"avgMinutes": 180,
"predictedApprovers": []
},
{
"nodeId": "1003",
"nodeName": "归档",
"probability": 1.0,
"current": false,
"complete": true,
"avgMinutes": 0,
"predictedApprovers": []
}
],
"predictedRelations": [
{
"startNodeId": "1001",
"endNodeId": "1002",
"probability": 1.0,
"deterministic": true
}
]
}
顶层字段¶
| 字段 | 类型 | 说明 |
|---|---|---|
visible |
boolean | 当前用户是否可看预测面板 |
message |
string | 不可用原因(可选) |
remainingMinutes |
int | 预计剩余工作分钟 |
remainingDurationText |
string | 展示用剩余时长 |
predictedFinishTime |
string | 预计完成时刻,yyyy-MM-dd HH:mm:ss,可能为 null |
slaDeadline |
string | SLA 截止时刻,同上;无 SLA 为 null |
slaRisk |
string | NORMAL / RISK / HIGH |
slaRiskLabel |
string | 中文标签 |
currentNodeId |
string | 当前节点 ID |
sampleSize |
int | 同模板历史实例样本量 |
lowSample |
boolean | 样本量 < 5 时为 true,前端可提示“历史样本少,偏差可能较大” |
style |
string | 固定 dashed-gray,前端用灰色虚线画预测边 |
predictedPath |
array | 最可能后续节点序列(含当前节点) |
predictedRelations |
array | 预测边上的概率,用于叠加到流程图 |
predictedPath[]¶
| 字段 | 类型 | 说明 |
|---|---|---|
nodeId |
string | 节点 ID |
nodeName |
string | 节点名称 |
probability |
number | 走到该节点的路径概率,0~1,保留三位小数 |
current |
boolean | 是否当前节点 |
complete |
boolean | 是否结束节点 |
avgMinutes |
int | 该节点计入剩余的工作分钟(当前节点已扣除已消耗时长) |
predictedApprovers |
array | 预测处理人,最多 3 个;**不等于**实际待办接收人 |
predictedApprovers[]¶
| 字段 | 类型 | 说明 |
|---|---|---|
id |
string | 用户 ID |
name |
string | 用户名称 |
probability |
number | 历史/配置占比,0~1 |
predictedRelations[]¶
| 字段 | 类型 | 说明 |
|---|---|---|
startNodeId |
string | 边起点 |
endNodeId |
string | 边终点 |
probability |
number | 该分支概率。确定性条件为 1.0;未判定网关为历史频次,如 0.87 / 0.13 |
deterministic |
boolean | true 表示表单条件已能确定该边;false 表示概率分支 |
2.4 前端用法¶
- 预测面板:展示
remainingDurationText、predictedFinishTime、slaRiskLabel。 - 流程图:在已走实线之外,用灰色虚线绘制
predictedRelations,边上标注probability * 100+%。 lowSample=true时给出精度提示。- 不要用本接口结果改提交、改下一节点、改审批人。
2.5 缓存与重算¶
结果写入 T_FLOWPREDICTION。详情页优先读快照;流程每走到新节点会在 StateMachine.updateFlowState 后自动重算。快照不存在时本接口会现场计算并落库。
3. 管理员风险清单¶
管理控制台「流程监控 → 风险清单」页签的数据源。与 Runtime 详情页预测接口分离:不走运行时登录用户,不加密软件 id。
3.1 基本信息¶
| 项 | 值 |
|---|---|
| Method | GET |
| Path | /api/authtime/domain/{domainid}/applicationid/{applicationid}/workflow/predictions/risks |
| 完整路径 | {manager-context}/api/authtime/domain/{domainid}/applicationid/{applicationid}/workflow/predictions/risks |
| Controller | FlowInterventionController.queryFlowPredictionRisks |
| 服务 | new FlowPredictionServiceImpl(applicationid).queryRiskList(domainid) |
未登录管理员:data.visible=false。已登录管理员返回当前域内 slaRisk 为 RISK 或 HIGH 的快照,最多 200 条,按 lastUpdated 倒序。
Runtime **不再**提供 /api/runtime/{applicationId}/workflows/predictions/risks。
3.2 路径参数¶
| 参数 | 必填 | 说明 |
|---|---|---|
domainid |
是 | 企业域 ID(明文) |
applicationid |
是 | 软件 ID(明文),用于选库 |
无 Query、无 Body。
3.3 成功 data¶
无权限:
有权限:
{
"visible": true,
"datas": [
{
"id": "预测快照ID",
"flowStateId": "流程实例ID",
"docId": "文档ID",
"flowId": "流程模板ID",
"currentNodeId": "当前节点ID",
"remainingMinutes": 860,
"predictedFinishTime": "2026-09-09T16:30:00.000+08:00",
"slaDeadline": "2026-09-09T18:00:00.000+08:00",
"slaRisk": "HIGH",
"sampleSize": 12,
"resultJson": "{...完整预测 JSON 字符串...}",
"alertSent": true,
"lastUpdated": "2026-09-08T19:00:00.000+08:00"
}
]
}
| 字段 | 类型 | 说明 |
|---|---|---|
visible |
boolean | 是否已登录管理端管理员 |
datas |
array | FlowPredictionSnapshot 列表 |
datas[].flowStateId |
string | 流程实例 ID,管理端可打开流程监控详情 |
datas[].docId |
string | 文档 ID |
datas[].slaRisk |
string | 仅 RISK / HIGH |
datas[].resultJson |
string | 与第 2 节 data 同结构的 JSON 文本 |
datas[].alertSent |
boolean | 是否已发过同档事前预警,避免重复骚扰 |
日期字段由 Jackson 按默认时区序列化,前端按 Date 解析即可。
4. 流程图接口扩展(叠加预测路径)¶
未新增路径,在现有新流程图接口的 data 上增加 prediction。
| 项 | 值 |
|---|---|
| Method | GET |
| Path | /api/runtime/{applicationId}/documents/{docId}/workflows/{instanceId}/newflowchart |
| Controller 方法 | WorkflowController.getNewWorkflowChart |
原有 data.flow 不变。能算出预测时额外带:
{
"flow": { },
"prediction": {
"visible": true,
"remainingDurationText": "14h20m",
"predictedRelations": [ ],
"style": "dashed-gray"
}
}
prediction 字段集与第 2 节可见时的 data 相同。预测失败时仅缺少 prediction,不影响原流程图。
前端可只请求本接口:用 flow 画已走路径,用 prediction.predictedRelations 画灰色虚线。
5. 待办卡片提示(既有待办接口扩展)¶
未新增待办 URL。WorkProcessBean.getPendingList 会按 docId 回填预测字段。
5.1 相关接口¶
| Method | Path | 说明 |
|---|---|---|
GET |
/api/runtime/{applicationId}/flowcenters/pendings |
流程中心待办列表 |
5.2 WorkVO 新增字段¶
| 字段 | JSON 名 | 类型 | 说明 |
|---|---|---|---|
| 预计完成时间 | predictedFinishTime |
datetime | yyyy-MM-dd HH:mm:ss(GMT+8) |
| 剩余时长文案 | remainingDurationText |
string | 如 14h20m |
| 风险码 | slaRisk |
string | NORMAL / RISK / HIGH |
| 风险中文 | slaRiskLabel |
string | 正常 / 存在超时风险 / 高概率超时 |
无快照时上述字段为空,待办列表仍照常返回。
流程中心
FlowCenterRunTimeServiceImpl.getPendings目前手工组装 map。若卡片要展示预测,需在组装处增加上述 4 个map.put。WorkVO与WorkProcessBean侧数据已具备。
6. 非 HTTP 输出¶
设计要求预测结果**不能**给第三方系统调用,因此没有开放 API、没有独立 token。以下为内部副作用,不是对外接口。
6.1 节点变更自动重算¶
挂点:StateMachine.updateFlowState 末尾。
任务完成、跳转、网关执行等导致实例更新后都会调用。异常只记日志,**不回滚、不阻断**真实流转。
6.2 消息中心事前预警¶
当 slaRisk 为 RISK 或 HIGH,且同档预警尚未发送时,向申请人与当前处理人发站内消息。
| 项 | 值 |
|---|---|
| 主题类型 | Notification.SUBJECT_TYPE_PREDICTION_SLA = 8 |
| 标题 | 流程超时风险预警: + slaRiskLabel |
| 渠道 | 复用现有 Notification(站内信等) |
同一风险档只发一次;风险降回 NORMAL 后清除已发标记,再次升高可再发。
7. Java 服务接口(供模块内调用)¶
包:cn.myapps.core.runtime.workflow.prediction.FlowPredictionService
实现:FlowPredictionServiceImpl(applicationId),与现有 Runtime Process 一样按软件直接 new,不经加密 ProcessFactory。
| 方法 | 说明 |
|---|---|
refresh(FlowStateRT) |
按内存中的实例重算并落库,可能发预警 |
refreshQuietly(FlowStateRT) |
同上,吞掉异常 |
getPrediction(applicationId, docId, instanceId, user, params) |
详情页 JSON(Runtime 调用) |
queryRiskList(domainId) |
管理员风险清单(Manager 调用,传入企业域 id) |
fillPendingHints(Collection<WorkVO>) |
给待办列表填预测字段 |
WorkflowRunTimeService(Runtime 用)仅增加:
JSONObject getFlowPrediction(String applicationId, String docId, String instanceId, IFrontEndUser user)
管理员风险清单 **不**挂在 WorkflowRunTimeService / WorkflowController 上。Manager 由 FlowInterventionController 直接 new FlowPredictionServiceImpl(applicationid)。
8. 落库¶
表名:T_FLOWPREDICTION(应用库,随 AbstractApplicationInitDAO.initTables 自动建表/补列)。
| 列 | 说明 |
|---|---|
ID |
主键 |
FLOWSTATERT_ID |
流程实例 ID,按此更新 |
DOC_ID |
文档 ID |
FLOWID |
流程模板 ID |
CURRENT_NODEID |
计算时当前节点 |
REMAINING_MINUTES |
剩余工作分钟 |
PREDICTED_FINISH |
预计完成时刻 |
SLA_DEADLINE |
SLA 截止 |
SLA_RISK |
NORMAL / RISK / HIGH |
SAMPLE_SIZE |
历史样本量 |
RESULT_JSON |
完整预测 JSON |
ALERT_SENT |
1 已发事前预警 |
LAST_UPDATED |
最近计算时间 |
APPLICATIONID / DOMAINID |
软件 / 域 |
历史耗时来自本系统 T_RELATIONHIS、T_FLOWHISTORY,不接入外部数据集。
T_FLOWPREDICTION 只随 AbstractApplicationInitDAO.initTables() 补齐(保存默认数据源、管理端同步数据表单、或 .sync/*.init_default_datasource)。Runtime 启动和预测接口访问都不会自动建表。已有库可走上述 initTables 路径,或手工执行:
CREATE TABLE IF NOT EXISTS T_FLOWPREDICTION (
ID VARCHAR(100) NOT NULL PRIMARY KEY,
FLOWSTATERT_ID VARCHAR(100),
DOC_ID VARCHAR(100),
FLOWID VARCHAR(100),
CURRENT_NODEID VARCHAR(100),
REMAINING_MINUTES INT,
PREDICTED_FINISH DATETIME,
SLA_DEADLINE DATETIME,
SLA_RISK VARCHAR(100),
SAMPLE_SIZE INT,
RESULT_JSON LONGTEXT,
ALERT_SENT INT,
LAST_UPDATED DATETIME,
APPLICATIONID VARCHAR(100),
DOMAINID VARCHAR(100),
KEY IDX_FLOWPREDICTION_FS (FLOWSTATERT_ID),
KEY IDX_FLOWPREDICTION_DOC (DOC_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
9. 接口一览¶
| 能力 | Method | Path | 模块 |
|---|---|---|---|
| 实例预测面板 | GET | /api/runtime/{applicationId}/documents/{docId}/workflows/{instanceId}/prediction |
Runtime |
| 流程图叠加预测 | GET | /api/runtime/{applicationId}/documents/{docId}/workflows/{instanceId}/newflowchart |
Runtime(原接口扩展) |
| 管理员风险清单 | GET | /api/authtime/domain/{domainid}/applicationid/{applicationid}/workflow/predictions/risks |
Manager |
| 待办卡片提示 | GET | /api/runtime/{applicationId}/flowcenters/pendings |
Runtime(原接口扩展字段) |
以上均不对第三方开放。第三方如需预测,应按产品约束自行用原始流程历史二次计算,不要调用上述内部接口。