5.0 KiB
5.0 KiB
| 1 | ID | Title | Description | Acceptance | Test_Method | Tools | Dev_Status | Review1_Status | Regression_Status | Files | Dependencies | Notes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | A1 | R72 执行合同建档与范围冻结 | 创建并校验 R72 合同,仅承接“报销撤回后释放已绑定发票回票池”这一条闭环修复,并补对应后端回归;不承接 OCR 提取、重复发票查重、票池工作台增强、Prisma 迁移或审批流重构。 | issues/2026-04-28_19-34-41-r72-reimbursement-withdraw-invoice-release.csv 列完整且通过校验;A2-A4 依赖顺序清晰;Notes 明确本轮无 schema 变更且只做最小状态释放。 | 命令:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-04-28_19-34-41-r72-reimbursement-withdraw-invoice-release.csv。检查:12 列完整、Dependencies 为 JSON 数组字符串、Files 为实际路径或哨兵值。 | manual | DONE | DONE | DONE | issues/2026-04-28_19-34-41-r72-reimbursement-withdraw-invoice-release.csv | [] | 回滚路径:删除本 CSV;不影响业务运行。2026-04-28:合同已写入并通过 validate_issues_csv.py 校验。 |
| 3 | A2 | 报销撤回时释放已绑定发票并补后端回归 | 在 server 侧保持现有“仅 reviewing 可撤回、仅申请人/提交人可撤回、审批人已处理后不可撤回”规则不变;当报销从 reviewing 撤回到 draft 时,自动把 linked_reimbursement_id 命中的 bound 发票恢复为 available,并清空 linked_reimbursement_id / linked_item_id;补 focused route test 覆盖 submit 后撤回再重绑的核心闭环。 | POST /api/reimbursements/:id/withdraw 成功后,关联 bound 发票状态回到 available,linked_reimbursement_id 与 linked_item_id 归空;原有 withdraw 拒绝条件不回归;同一张发票可再次用于该报销或其他草稿报销绑定;不新增数据库字段,不改变提交前必须绑定发票规则。 | 命令:cd server && npm run prisma:validate && node --check src/routes/reimbursements.js && npm test -- tests/unit/routes/reimbursements.withdraw.test.js。业务:员工已有 reviewing 报销且已绑定发票 -> 撤回 -> 发票回到票池可绑定 -> 再次绑定同张发票成功。 | manual | DONE | DONE | DONE | server/src/routes/reimbursements.js|server/tests/unit/routes/reimbursements.withdraw.test.js | ["A1"] | 涉及报销状态流与票据绑定关系,回滚路径:撤回 withdraw 中的 invoicePool.updateMany 释放逻辑及新增测试;无 schema 迁移。2026-04-28:withdraw 成功路径已补发票释放,响应追加 unboundInvoiceCount;新增单测覆盖“撤回后重绑成功”与“审批人已处理时不释放”。 |
| 4 | A3 | 撤回释放闭环 reviewer 复核 | 对 A2 做独立行为复核,确认修复只影响撤回成功路径,不放宽 withdraw 权限、不绕过审批已处理阻断,也不误释放其他报销单绑定的发票。 | review 结论覆盖:withdraw 权限边界、reviewing->draft 状态转换、invoice_pool 释放 where 条件是否只命中当前报销、失败路径下发票状态是否保持原状、与 delete 释放逻辑是否一致。 | 人工 review:对照 server/src/routes/reimbursements.js 中 delete/withdraw 两段释放逻辑与新增测试断言,输出 reviewer 结论;若发现跨报销误释放、失败路径提前释放或权限回归,则 A4 前必须先修复。 | manual | DONE | DONE | DONE | server/src/routes/reimbursements.js|server/tests/unit/routes/reimbursements.withdraw.test.js | ["A2"] | 本 Issue 只输出 review 结论,不新增业务需求。2026-04-28 reviewer 结论:withdraw 仍保留 owner/submitter 与 reviewing 状态约束,释放 where 仍限定 linked_reimbursement_id + status=bound,失败路径在 processedTaskCount>0 时不会触发发票释放,与 delete 路由释放字段保持一致。 |
| 5 | A4 | R72 定向回归与状态回填 | 执行 R72 定向自动化回归,并把本轮开发、review、regression 状态回填到 Issue CSV;确认该修复不影响既有报销详情与发票绑定能力。 | A2/A3 测试与复核通过后,本 CSV 状态回填完整;withdraw 释放闭环通过;既有 invoice upload/bind 与 reimbursement detail 相关测试不回归。 | 命令:cd server && npm run prisma:validate && node --check src/routes/reimbursements.js && npm test -- tests/unit/routes/reimbursements.withdraw.test.js tests/unit/routes/reimbursements.detail.test.js tests/unit/routes/invoicePool.travel-bind.test.js。业务:撤回释放后,同张发票重新出现在可绑定集合,不影响已存在详情展示字段。 | manual | DONE | DONE | DONE | issues/2026-04-28_19-34-41-r72-reimbursement-withdraw-invoice-release.csv|server/tests/unit/routes/reimbursements.withdraw.test.js|server/tests/unit/routes/reimbursements.detail.test.js|server/tests/unit/routes/invoicePool.travel-bind.test.js | ["A2","A3"] | 已知不在本轮范围:client build chunk warnings、OCR 可信度分层、重复发票查重。2026-04-28:prisma validate 通过;reimbursements.withdraw/detail 与 invoicePool.travel-bind 共 3 个测试文件 7 条用例通过。 |