31 行
2.6 KiB
Markdown
31 行
2.6 KiB
Markdown
# 审批通过返回成功但任务状态未变的并发异常调查
|
||
|
||
## Goal
|
||
|
||
查清完整门禁中采购主链路间歇失败的根因:经理审批接口返回 200,但随后任务详情仍为 `pending`、处理历史无 `approve`。确认它是测试隔离问题还是产品缺陷;若为产品缺陷,确认影响范围(是否波及全部审批实体)及是否在生产 `b1d25d3c` 已存在。
|
||
|
||
## Background / Evidence(2026-09-26)
|
||
|
||
- 候选 `750a184b` / `34675e1a` 共 4 轮 `verify-candidate`(2 核/8G,4 worker 固定)。`procurement-flow.spec.ts:29` 在第 2、4 轮失败,第 1 轮通过;managed `retained-local` 单跑两次均通过。第 4 轮 371/372,只剩此项。
|
||
- 失败断言 `procurement-flow.spec.ts:118`:审批后 30s 内 `main` 不含「已完成」。
|
||
- 第 4 轮服务端日志(相对采购 submit):+45.6s `POST /api/workflow/tasks/024c0c17…/approve` → 200(2917ms);+48.8s 同页 `GET /api/workflow/tasks/024c0c17…` → 200(3085ms)。审批期间无 warn/error 日志。
|
||
- 失败录像:确认框「处理中…」结束后,页面仍是同一任务、状态徽标「待派发」(= task `pending`)、可执行「通过/退回/驳回」,处理历史只有「提交」。
|
||
- 静态核对:`executeApproveWorkflowTask`(`server/src/routes/workflow.js:1395`)全部写入在同一个 `$transaction` 内;任务详情 GET 直接读库、无缓存;前端 `onSuccess` 用 `refetchTask()` 刷新(`client/src/pages/WorkflowTaskDetailPage.tsx:96`),PWA 不缓存 `/api`。采购单未匹配预算池,`confirmBudgetForEntity` 不写账。审批路径及任务详情页自 `b1d25d3c` 以来仅删除 ERP 同步。
|
||
- 第 1 轮(通过)与第 2/4 轮(失败)请求序列一致,差异只能在数据层判断;managed 环境强制 `QA_KEEP_DB=0`。
|
||
|
||
## Scope
|
||
|
||
- 非 managed 本地复现:本机 `hyb-oa-db` 临时库、`QA_KEEP_DB=1`,采购主链路与 `permission-direct-access` 并发重复运行;失败后直接查库区分「写入丢失」与「读取陈旧/错读」。
|
||
- 根因确认后给出最小修复方案(测试隔离或产品代码),修复另行确认后实施。
|
||
|
||
## Out of Scope
|
||
|
||
生产/ARM 访问、真实数据写入、push/部署、放宽断言或改用重试掩盖。
|
||
|
||
## Acceptance Criteria
|
||
|
||
- [ ] 在保留库的环境复现至少一次,并记录失败单据任务/实例/历史的库内真实状态
|
||
- [ ] 给出有证据支撑的根因(代码位置 + 机制),区分测试问题与产品缺陷
|
||
- [ ] 若为产品缺陷:说明影响实体范围,及 `b1d25d3c` 是否同样存在
|
||
- [ ] 修复后 `verify-candidate` 完整通过(取得 PASS 回执)
|