4.1 KiB
4.1 KiB
| 1 | ID | Title | Description | Acceptance | Test_Method | Tools | Dev_Status | Review1_Status | Regression_Status | Files | Dependencies | Notes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | R33-1-0 | 新执行合同建档与范围锁定 | 基于 R32 后 full-local 暴露的 procurement submit P2028 超时问题建立单独热补合同并锁定只修采购提交链路 | 新 CSV 校验通过 且 Notes 写明本轮只修采购 submit 不扩散到报销/差旅 submit | python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-03-24_12-37-48-r33-1-procurement-submit-timeout-hotfix.csv | manual | DONE | TODO | DONE | issues/2026-03-24_12-37-48-r33-1-procurement-submit-timeout-hotfix.csv | [] | R32 作为历史快照不回写;已完成 CSV 建档与校验;本轮不调整 Prisma transaction timeout,仅通过缩事务收口。 |
| 3 | R33-1-1 | 采购提交事务边界收紧 | 把 purchase submit 的主状态变更与通知副作用拆成事务内外两段以消除 P2028 超时 | submit 路由仍返回原有 purchaseRequestId requestNo workflowInstanceId currentTaskId budgetPoolId warnings budgetReservation 且通知 IM email 任一失败不影响 200 返回 | cd server && node --check src/routes/purchaseRequests.js | manual | DONE | TODO | DONE | server/src/routes/purchaseRequests.js|server/src/services/notifications/* | ["R33-1-0"] | 已把 recipients/createNotifications/enqueueIm/sendNotificationEmailSafe 移到事务外;另把 budget precheck 挪到事务外并把 submit 读模型缩成 PURCHASE_SUBMIT_SELECT;2026-03-24 13:11 与 13:31 `cd server && node --check src/routes/purchaseRequests.js` 通过;/tmp/hyb-oa-web-gates-server.log 不再出现 purchase submit P2028。 |
| 4 | R33-1-2 | 采购提交副作用 helper 与单测 | 提取采购提交成功后的事务外副作用 helper 并补 route 级单测证明其失败不会阻断业务提交 | 新增 __testables helper 且单测覆盖 resolveRecipients 或 enqueueImNotifications 失败时 helper 只记日志不抛致命错误 | cd server && npm test -- tests/unit/routes/purchase.submit-side-effects.test.js | manual | DONE | TODO | DONE | server/src/routes/purchaseRequests.js|server/tests/unit/routes/purchase.submit-side-effects.test.js | ["R33-1-1"] | 新增 __testables.finalizePurchaseSubmitSideEffects;2026-03-24 12:52 与 13:11 `cd server && npm test -- tests/unit/routes/purchase.submit-side-effects.test.js` 通过(2 tests passed)。 |
| 5 | R33-1-3 | 采购 E2E 失败可读性补强 | 改善 procurement-flow 在 submit 非 200 时的报错可读性避免 currentTaskId 空值误报 | submitResponse 在解析 data 前先断言 ok 非 200 时输出响应体文本并保持原有业务主链路不拆分 | cd client && npm run test:e2e -- tests/e2e/procurement-flow.spec.ts | manual | DONE | TODO | DONE | client/tests/e2e/procurement-flow.spec.ts | ["R33-1-1"] | 已补 submitResponse.ok() 失败时带响应体报错;在 `PurchaseRequestsPage.tsx` 额外修复 archiveOrderQuery 覆盖归档输入的竞态;2026-03-24 13:37 于临时环境复跑 `cd client && npm run test:e2e -- tests/e2e/procurement-flow.spec.ts` 通过(1 passed)。 |
| 6 | R33-1-4 | 恢复 procurement 与 full-local 绿灯 | 验证 procurement submit 不再触发 P2028 并恢复整套本地门禁 | procurement-flow 通过 且 bash scripts/qa/run-web-gates.sh full-local 通过且日志中不再出现 purchase submit P2028 | cd client && npm run test:e2e -- tests/e2e/procurement-flow.spec.ts && bash scripts/qa/run-web-gates.sh full-local | manual | DONE | DONE | DONE | server/src/routes/purchaseRequests.js|client/tests/e2e/procurement-flow.spec.ts|scripts/qa/run-web-gates.sh | ["R33-1-2","R33-1-3"] | 2026-03-24 13:31 full-local:procurement regression 通过,但 Playwright 仍有 procurement archive 输入竞态与 mobile-approvals-offline 失败;2026-03-24 13:46 full-local:procurement-flow 已恢复通过且 purchase submit P2028 清零,但整套门禁仍被范围外 `tests/e2e/main-flow.spec.ts` 的 OCR 状态断言阻塞,因此本项未置 DONE。2026-03-24 17:00 后已通过 R33-2 与 R33-3 继续收口范围外阻塞;同日 bash scripts/qa/run-web-gates.sh full-local 最终通过,结果为 26 passed / 3 skipped / 0 failed,且日志未再出现 purchase submit P2028,本项已完成收口。 |