## 版本 - `@objectstack/*@17.0.0-rc.1`(service-automation 17.0.0-rc.1) - 复现于 os-project-titanwind-ehr,2026-07-31 ## 现象 含 `approval` 节点的 record_change 流:**提交审批与审批决策跨进程重启时,决策静默失效**—— 1. 进程 A:record_change 触发 `qif_approval` 流,`approval` 节点挂起,`sys_approval_request` 落库(带 `flow_run_id`),镜像字段 stage=qc_director/status=pending; 2. **dev 进程重启**(进程 B,同一 DB); 3. 审批人在 Console 上「批准」→ `sys_approval_request.status` 翻成 `approved` **落库成功、UI toast 成功**; 4. 但流**永不 resume**:下一节点的 approval request 不创建,记录镜像字段停在 `qc_director / approved` 成僵尸;**日志零报错**(`resume(runId)` 找不到 run 疑似被静默吞掉)。 对照:同一进程内提交+审批的全链路正常(实测 NCR 三级流 ①→② 推进无恙)——问题只出在跨重启。 ## 定位 - #1518(persist suspended flow runs / durable resume across restarts)2026-06-02 标记 **COMPLETED** 关闭; - 但 17.0.0-rc.1 的 `service-automation/dist/index.js` 里 `suspendedRuns = new Map()` **仍是纯内存**,resume 查不到即止; - dist 里出现的 `sys_automation_run` 标识符,在运行库中**根本没建表**(`no such table: sys_automation_run`)——持久化对象未注册或未走 schema 同步。 ## 影响 审批流是天然的长挂起(人到岗才批,中间隔发版/重启是常态)。当前行为=**每次发版都可能把在途审批全部变僵尸**,且审批人侧毫无感知(approve 明明成功),属数据一致性级别的问题。 ## 期望 1. 挂起 run 持久化 + 重启后可 resume(#1518 承诺的行为真正落地); 2. 短期兜底:`resume(runId)` 找不到 run 时**必须显式报错**(approve 接口应失败或至少告警),不能落一半状态静默成功。
版本
@objectstack/*@17.0.0-rc.1(service-automation 17.0.0-rc.1)现象
含
approval节点的 record_change 流:提交审批与审批决策跨进程重启时,决策静默失效——qif_approval流,approval节点挂起,sys_approval_request落库(带flow_run_id),镜像字段 stage=qc_director/status=pending;sys_approval_request.status翻成approved落库成功、UI toast 成功;qc_director / approved成僵尸;日志零报错(resume(runId)找不到 run 疑似被静默吞掉)。对照:同一进程内提交+审批的全链路正常(实测 NCR 三级流 ①→② 推进无恙)——问题只出在跨重启。
定位
service-automation/dist/index.js里suspendedRuns = new Map()仍是纯内存,resume 查不到即止;sys_automation_run标识符,在运行库中根本没建表(no such table: sys_automation_run)——持久化对象未注册或未走 schema 同步。影响
审批流是天然的长挂起(人到岗才批,中间隔发版/重启是常态)。当前行为=每次发版都可能把在途审批全部变僵尸,且审批人侧毫无感知(approve 明明成功),属数据一致性级别的问题。
期望
resume(runId)找不到 run 时必须显式报错(approve 接口应失败或至少告警),不能落一半状态静默成功。