From 589a248cc3da7e2cbc01b75c8111ea6aef99fa7a Mon Sep 17 00:00:00 2001 From: shunli Date: Mon, 9 Feb 2026 17:55:24 +0800 Subject: [PATCH] =?UTF-8?q?chore(issues):=20=E6=9B=B4=E6=96=B0P5=E8=93=9D?= =?UTF-8?q?=E5=9B=BEv3=E7=8A=B6=E6=80=81(F6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - F6 标记 DONE(报销明细编辑器联动验证通过) --- issues/2026-02-09_13-39-02-p5-blueprint-v3.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/issues/2026-02-09_13-39-02-p5-blueprint-v3.csv b/issues/2026-02-09_13-39-02-p5-blueprint-v3.csv index 60fd9d74..1372a82b 100644 --- a/issues/2026-02-09_13-39-02-p5-blueprint-v3.csv +++ b/issues/2026-02-09_13-39-02-p5-blueprint-v3.csv @@ -4,7 +4,7 @@ F2,费用类型只读API(expense-types),"补齐费用类型查询接口(en F3,费用类型管理API(system.settings),"新增费用类型增改启停接口,并写入 audit_logs","finance_mgr/admin 可启停费用类型;禁用后不出现在 enabled 查询;审计日志包含变更摘要","manual: curl 调用创建/禁用/启用并查询验证;同时查询 /api/audit-logs 筛选 action",manual,DONE,DONE,DONE,"server/src/routes/expenseTypes.js | server/src/routes/audit.js | server/src/constants/permissions.js","[""F2""]","只做最小可运营;复杂排序/导入后置" F4,报销单编辑与删除(补齐CRUD),"补齐 PATCH/DELETE 报销单能力(仅 draft/rejected 可编辑;仅 draft 可删除);删除 draft 必须自动解绑其绑定票据并回到 available","状态/权限校验正确;删除不影响其他实体;删除 draft 时 invoice_pool 自动解绑;workflow/audit 证据一致","cd server && ./scripts/regression-workflow-actions.sh",manual,DONE,DONE,DONE,"server/src/routes/reimbursements.js | server/scripts/regression-workflow-actions.sh","[""F1""]","复用现有 ensureOwnOrCanViewAll 与 AppError 体系" F5,报销明细CRUD与总金额重算,"新增报销明细 items 的增改删;每次变更事务内重算 reimbursement_forms.total_amount","items CRUD 只允许 draft/rejected;total_amount=items.sum;submit 按 total_amount 匹配 approval_rule","cd server && ./scripts/regression-workflow-actions.sh",manual,DONE,DONE,DONE,"server/src/routes/reimbursements.js | server/scripts/regression-workflow-actions.sh","[""F2"",""F4""]","金额字段统一 toMoneyString;避免浮点误差" -F6,前端报销编辑器(明细+费用类型),"在报销详情页补齐明细编辑能力(费用类型下拉+日期+金额+说明),并保持现有提交/撤回/支付闭环","employee 可完整填写明细并提交;列表/详情金额一致;typecheck/build/e2e 通过","cd client && npm run typecheck && npm run build && npm run test:e2e",manual,TODO,TODO,TODO,"client/src/pages/ReimbursementDetailPage.tsx | client/src/api/reimbursements.ts | client/src/api/expenseTypes.ts","[""F3"",""F5""]","UI继续复用现有 shadcn 风格组件;加 data-testid" +F6,前端报销编辑器(明细+费用类型),"在报销详情页补齐明细编辑能力(费用类型下拉+日期+金额+说明),并保持现有提交/撤回/支付闭环","employee 可完整填写明细并提交;列表/详情金额一致;typecheck/build/e2e 通过","cd client && npm run typecheck && npm run build && npm run test:e2e",manual,DONE,DONE,DONE,"client/src/pages/ReimbursementDetailPage.tsx | client/src/api/reimbursements.ts | client/src/api/expenseTypes.ts","[""F3"",""F5""]","UI继续复用现有 shadcn 风格组件;加 data-testid" F7,代提交(expense.proxy_submit),"允许 administration 为员工 owner 创建/提交报销(submitter=行政,owner=员工):POST /api/reimbursements 支持 ownerEmployeeId;强制 delegation_grants 有效期校验;workflow 解析以 owner 为基准;必要时补齐 administration 角色最小权限(expense.create/submit/withdraw/invoice.upload)","无授权时 403;有授权可 create/submit 且审批人按 owner.direct_manager 解析;own 口径包含 submitter_id=me;audit_logs 记录 proxy 行为","cd server && ./scripts/regression-workflow-actions.sh",manual,DONE,DONE,DONE,"server/src/routes/reimbursements.js | server/src/utils/delegation.js | server/src/routes/workflow.js | server/src/constants/permissions.js | server/scripts/regression-workflow-actions.sh","[""F5""]","前端可后置:先保证后端权限链/审计链正确" F8,行政代上传(owner≠uploaded_by),"放开 invoice-pool/upload 跨 owner 上传:system.users 允许;administration 需具备 expense.proxy_submit 且存在有效 delegation_grants(scope=reimbursement_submit/all);并写 audit_logs","行政可为已授权员工上传;未授权拒绝;owner/uploaded_by 记录正确;发票归属与可见性规则不被破坏;审计可追踪","cd server && ./scripts/regression-ocr.sh && ./scripts/regression-audit.sh",manual,DONE,DONE,DONE,"server/src/routes/invoicePool.js | server/src/utils/delegation.js | server/src/routes/audit.js | server/src/constants/permissions.js","[""F7""]","保持上传不阻塞 OCR;ownerScope 查询语义不变" F9,票据解绑/重绑(bound->available),"新增 unbind 接口:仅当报销单处于 draft/rejected 时允许解绑;解绑后票据回到 available 并清理 linked_*","解绑权限与状态校验正确;解绑后可重新绑定其他报销草稿;不破坏判重约束","cd server && ./scripts/regression-workflow-actions.sh",manual,DONE,DONE,DONE,"server/src/routes/invoicePool.js | server/scripts/regression-workflow-actions.sh","[""F1""]","与 invoice_pool_status_invariants_chk 保持一致"