R71-A5 回填人工试运行结论与执行合同

这个提交包含在:
2026-04-28 19:25:00 +08:00
父节点 1c2aaedd78
当前提交 c3eee48ac0
共修改 4 个文件,包含 50 行新增和 34 行删除
+2 -1
查看文件
@@ -1,2 +1,3 @@
"ID","Role","Severity","Module","Title","Steps","Expected","Actual","Screenshot","Owner","Disposition","Status","Notes"
"R70-001","employee|manager|admin","P0|P1|P2|P3","TBD","TBD","TBD","TBD","TBD","local path or N/A","TBD","R71 candidate|won't fix|needs review|manual workaround","OPEN","none"
"R70-001","manager","P1","leave / team calendar","经理可见团队日历入口但进入后 PERM_001","1) [email protected] 登录 2) 打开 /leave-requests 3) 点击“团队日历”页签","经理可查看团队成员请假日历,用于审批和排班判断","入口可见,但内容区显示 PERM_001: 当前账号无权限执行该操作。","N/A","backend","fixed in R71","CLOSED","2026-04-28 R71:server manager 角色补齐 leave.view_all,reviewer 确认未扩大为 leave.manage;Playwright 复测显示团队日历正常加载 2026-04-27 ~ 2026-05-03 窗口数据,员工 2026-04-29 年假可见。"
"R70-002","employee","P2","reimbursements","报销提交前未提示必须绑定发票,提交失败只显示 VALID_001","1) [email protected] 登录 2) 打开 /reimbursements 并新建“空白报销” 3) 新增金额 12.34 的报销明细 4) 点击“提交报销”","提交前明确提示需先绑定发票,或失败时显示缺少发票的具体原因","页面仅提示 VALID_001: 参数校验失败;后端实际返回 details.invoices=bound_invoice_required。","N/A","frontend","fixed in R71","CLOSED","2026-04-28 R71:前端已补提交前提示与 bound_invoice_required 中文映射;人工复测使用 /home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf 完成上传 -> 绑定 -> 提交,报销单 4931211b-34b4-43b8-9e9f-917569d47c33 已进入 reviewing(BX-20260428-0001)。"
1 ID Role Severity Module Title Steps Expected Actual Screenshot Owner Disposition Status Notes
2 R70-001 employee|manager|admin manager P0|P1|P2|P3 P1 TBD leave / team calendar TBD 经理可见团队日历入口但进入后 PERM_001 TBD 1) [email protected] 登录 2) 打开 /leave-requests 3) 点击“团队日历”页签 TBD 经理可查看团队成员请假日历,用于审批和排班判断 TBD 入口可见,但内容区显示 PERM_001: 当前账号无权限执行该操作。 local path or N/A N/A TBD backend R71 candidate|won't fix|needs review|manual workaround fixed in R71 OPEN CLOSED none 2026-04-28 R71:server manager 角色补齐 leave.view_all,reviewer 确认未扩大为 leave.manage;Playwright 复测显示团队日历正常加载 2026-04-27 ~ 2026-05-03 窗口数据,员工 2026-04-29 年假可见。
3 R70-002 employee P2 reimbursements 报销提交前未提示必须绑定发票,提交失败只显示 VALID_001 1) [email protected] 登录 2) 打开 /reimbursements 并新建“空白报销” 3) 新增金额 12.34 的报销明细 4) 点击“提交报销” 提交前明确提示需先绑定发票,或失败时显示缺少发票的具体原因 页面仅提示 VALID_001: 参数校验失败;后端实际返回 details.invoices=bound_invoice_required。 N/A frontend fixed in R71 CLOSED 2026-04-28 R71:前端已补提交前提示与 bound_invoice_required 中文映射;人工复测使用 /home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf 完成上传 -> 绑定 -> 提交,报销单 4931211b-34b4-43b8-9e9f-917569d47c33 已进入 reviewing(BX-20260428-0001)。
+14 -6
查看文件
@@ -1,6 +1,6 @@
# R70 人工业务试运行清单
日期:2026-04-26
日期:2026-04-28
## 目标
@@ -23,11 +23,11 @@
## 环境记录
- 环境 URL:
- 执行日期:
- 浏览器:
- 数据库/分支:
- 执行人:
- 环境 URL:`http://192.168.123.7:3000`
- 执行日期:`2026-04-28`
- 浏览器:`Firefox (Playwright CLI)`
- 数据库/分支:`hyb_oa_manual_trialrun_20260428172231 / 2bce9c9`
- 执行人:`Codex Playwright 辅助复核`
## 员工路径
@@ -91,3 +91,11 @@
- 所有发现的问题已记录严重级别。
- P0/P1 已明确是否暂停试运行。
- `artifacts/r70/manual-trialrun-report.md` 已回填结论。
## R71 定向复测回填
- 复测时间:`2026-04-28 19:08 - 19:11 CST`
- manager:`/leave-requests` 的“团队日历”页签打开成功,显示 `2026-04-27 ~ 2026-05-03` 窗口内本部门请假数据,通过。
- employee:无发票时,报销详情页在提交按钮附近即时提示“提交前需先绑定至少 1 张发票,可在‘关联票据’区域添加。”,通过。
- employee:上传 `/home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf` -> 绑定 -> 再次提交后,报销单 `4931211b-34b4-43b8-9e9f-917569d47c33` 进入 `reviewing`,编号 `BX-20260428-0001`,通过。
- 结论:R70 初始两条问题已闭环,可恢复下一轮本地人工试运行。
+28 -27
查看文件
@@ -1,58 +1,59 @@
# R70 人工业务试运行报告
日期:2026-04-26
日期:2026-04-28
## 结论
待回填:继续试运行 / 暂停并修复 P0/P1 / 进入 R71 优化。
R70 初次试运行暂停项已在 2026-04-28 的 R71 定向修复后关闭。基于本地环境复测,经理团队日历与员工报销缺票提示/发票上传绑定提交链路均已通过,可恢复下一轮本地人工试运行。
## 执行环境
- 环境 URL:
- 分支/提交:
- 浏览器:
- 执行人:
- 执行时间:
- 环境 URL:`http://192.168.123.7:3000`
- 分支/提交:`2bce9c9 + local R71 working tree`
- 浏览器:`Firefox (Playwright CLI)`
- 执行人:`Codex Playwright 辅助复核`
- 执行时间:`2026-04-28 17:22 - 19:11 CST`
- 数据库:`hyb_oa_manual_trialrun_20260428172231`
## 角色结果
员工路径:
- 执行人:
- 结论:
- 阻断问题:
- 备注:
- 执行人:`Codex Playwright 辅助复核`
- 结论:Portal、请假、周报、待办、搜索、公告、移动入口主路径可达;R71 后报销缺票提示清晰,上传/绑定发票后可提交进入审批中。
- 阻断问题:无。
- 备注:员工请假提交成功,经理已审批通过;周报转待办并完成闭环通过;报销复测使用单据 `4931211b-34b4-43b8-9e9f-917569d47c33` 和发票 `北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf`,提交后单号为 `BX-20260428-0001`。
经理路径:
- 执行人:
- 结论:
- 阻断问题:
- 备注:
- 执行人:`Codex Playwright 辅助复核`
- 结论:Portal 管理视角、待我处理快捷审批、团队状态、项目入口与请假团队日历均可用。
- 阻断问题:无。
- 备注:经理已对员工请假单完成一次“通过”审批,审批后待办列表刷新正常;R71 复测中团队日历成功显示 `2026-04-27 ~ 2026-05-03` 窗口及员工 `2026-04-29` 年假记录。
管理员路径:
- 执行人:
- 结论:
- 阻断问题:
- 备注:
- 执行人:`Codex Playwright 辅助复核`
- 结论:主要管理入口可见且页面可达,未发现阻断问题。
- 阻断问题:无。
- 备注:人员管理、组织架构、系统设置、功能开关、审计日志均可打开并加载;审计日志可看到最近登录留痕。
## 问题汇总
- P0:
- P1:
- P2:
- P3:
- 当前开放问题:P0/P1/P2/P3 均为 0。
- 已闭环问题:`R70-001`、`R70-002` 已通过 R71 定向修复与人工复测关闭。
详细问题见 `artifacts/r70/issue-log.csv`。
## R71 候选
## R71 处理结果
- P0/P1 修复:
- P2/P3 体验优化:
- 技术优化:构建 chunk 循环与大 chunk 警告可作为独立技术优化项进入 R71/R72。
- P1 修复:server manager 角色已补齐 `leave.view_all`,reviewer 复核确认未扩成 `leave.manage`,经理团队日历路径复测通过。
- P2 修复:前端已在提交前提示“需先绑定至少 1 张发票”,并为 `bound_invoice_required` 增加可理解中文文案。
- 联动修复:人工复核中补修 `/api/invoice-pool/upload` 的 multipart 文件流挂起问题,上传 -> 绑定 -> 提交报销链路已通过。
- 技术遗留:client build 仍有 chunk 循环与大 chunk 警告,建议独立进入 R72 技术优化项,不阻断本地人工试运行。
## 风险
- 人工试运行依赖参与者真实操作,自动化通过不等于业务体验通过。
- 当前结论基于本地临时库、HTTP 本地地址和 Firefox 浏览器复核,不代表企业微信接入、HTTPS 和多用户并发场景都已验证。
- 若发现 workflow、权限、状态机、审批规则、迁移相关问题,必须单独 review 后再修复。
@@ -0,0 +1,6 @@
"ID","Title","Description","Acceptance","Test_Method","Tools","Dev_Status","Review1_Status","Regression_Status","Files","Dependencies","Notes"
"A1","R71 执行合同建档与范围冻结","创建并校验 R71 试运行后修复合同,仅承接 R70-001 经理团队日历权限阻断与 R70-002 报销提交提示不清;不承接 Prisma 迁移、审批状态机重写、通用权限中心重构。","issues/2026-04-28_18-26-58-r71-post-trialrun-fixes.csv 列完整且通过校验;A2-A5 依赖顺序清晰;Notes 明确本轮不改报销必须绑定发票规则。","命令:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-04-28_18-26-58-r71-post-trialrun-fixes.csv。检查:12 列完整、Dependencies 为 JSON 数组字符串、Files 为实际路径。","manual","DONE","DONE","DONE","issues/2026-04-28_18-26-58-r71-post-trialrun-fixes.csv","[]","回滚路径:删除本 CSV;不影响业务运行。2026-04-28:合同已写入并通过 validate_issues_csv.py 校验。"
"A2","经理团队日历权限矩阵对齐与后端回归","修复 manager 角色在 server 侧缺失 leave.view_all 导致团队日历 403 的权限矩阵漂移,并补常量/路由回归测试,确保经理可查看团队请假窗口而普通员工仍不可越权。","server 侧 manager 解析结果包含 leave.view_all;manager 访问 /api/leave-requests?scope=all&dateFrom=...&dateTo=... 不再返回 403;employee 同条件仍返回 403;不新增 leave.manage。","命令:cd server && npm run prisma:validate && node --check src/constants/permissions.js && node --check src/routes/leave.js && npm test -- tests/unit/constants/permissions.test.js tests/unit/routes/leave.list-scope.test.js。业务:manager 登录 -> 请假 -> 团队日历,页面能加载当前窗口数据。","manual","DONE","DONE","DONE","server/src/constants/permissions.js|server/src/routes/leave.js|server/tests/unit/constants/permissions.test.js|server/tests/unit/routes/leave.list-scope.test.js","[""A1""]","涉及权限模型,完成后必须进入 reviewer;2026-04-28:server manager 补齐 leave.view_all,权限单测、scope=all 路由回归与 Playwright 团队日历窗口复测通过。回滚路径:撤回 manager 的 leave.view_all 变更与新增测试。"
"A3","团队日历权限边界 reviewer 复核","对 A2 做独立 review,确认修复只放开经理读取团队日历所需权限,不引入 employee 越权、leave.manage 扩权或跨部门错误放大。","review 意见覆盖 client/server 权限矩阵一致性、/leave-requests all-scope 边界、employee 视角不可见/不可取数、manager 仅获得只读团队日历能力。","人工 review:对照 server/src/constants/permissions.js、client/src/auth/permissions.ts、client/src/pages/LeaveRequestPage.tsx、server/src/routes/leave.js 输出 review 结论;若发现高风险问题,A5 前必须先修复。","manual","DONE","DONE","DONE","server/src/constants/permissions.js|server/src/routes/leave.js|client/src/auth/permissions.ts|client/src/pages/LeaveRequestPage.tsx","[""A2""]","本 Issue 只输出 review 结论,不修改业务代码。2026-04-28 reviewer 结论:client/server 现已同时授予 manager leave.view_all;server 仍以 leave.manage 约束跨部门查询;employee 无 leave.view_all 时仍被 /leave-requests?scope=all 拒绝,未见扩权或越权泄漏。"
"A4","报销提交前置提示与缺票错误文案澄清","保持“提交前必须先绑定发票”的后端规则不变,在报销详情页补显式提示,并为 bound_invoice_required 增加清晰中文文案;人工复核中若上传新发票,接口不得卡住。","当 detail.invoices.length=0 时,提交入口附近可见明确提示;若仍收到 details.invoices=bound_invoice_required,页面显示可理解中文文案;上传新发票后可进入可绑定列表并完成绑定;不改后端校验与状态流。","命令:cd server && npm run prisma:validate && node --check src/routes/invoicePool.js && npm test -- tests/unit/routes/invoicePool.upload.test.js && cd ../client && npm run typecheck && npm run build。业务:employee 登录 -> 新建空白报销/报销详情 -> 未绑定发票时尝试提交,页面给出明确提示;上传 PDF -> 绑定发票 -> 再次提交进入审批中。","manual","DONE","DONE","DONE","client/src/pages/ReimbursementDetailPage.tsx|client/src/api/errorMessages.ts|client/src/pages/reimbursement-detail/ReimbursementActions.tsx|server/src/routes/invoicePool.js|server/tests/unit/routes/invoicePool.upload.test.js","[""A1""]","不承接票据自动绑定、报销状态机调整或发票规则放宽;2026-04-28:补齐前端缺票提示/错误映射,并修复人工复核中暴露的 multipart 文件流未消费导致上传挂起问题;回滚路径:撤回前端提示、错误映射与上传路由最小修复。"
"A5","定向回归与 R70 结论回填","完成经理团队日历与员工报销缺票提示的定向复测,更新 R70 报告和 issue-log,对已修复项回填 disposition/notes,并给出是否恢复试运行的结论。","manager 路径中团队日历可用且审批待办不回归;employee 路径中缺票提示清晰且绑定发票后可继续提交;artifacts/r70/manual-trialrun-report.md 与 artifacts/r70/issue-log.csv 已更新为最新结论。","命令:cd server && npm run prisma:validate && cd ../client && npm run typecheck && npm run build。业务:1) manager 登录 -> 待办审批 -> 请假团队日历;2) employee 登录 -> 空白报销/现有报销详情 -> 无发票提交提示 -> 上传并绑定发票后再次提交;3) 回填 R70 报告、issue-log、checklist。","manual","DONE","DONE","DONE","artifacts/r70/manual-trialrun-report.md|artifacts/r70/issue-log.csv|artifacts/r70/manual-trialrun-checklist.md","[""A2"",""A3"",""A4""]","若 A3 reviewer 未通过,则 A5 不进入执行;2026-04-28:Playwright 定向复测通过,R70 报告/issue-log/checklist 已回填为最新结论,可恢复下一轮本地人工试运行。回滚路径:仅回退文档回填。"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 A1 R71 执行合同建档与范围冻结 创建并校验 R71 试运行后修复合同,仅承接 R70-001 经理团队日历权限阻断与 R70-002 报销提交提示不清;不承接 Prisma 迁移、审批状态机重写、通用权限中心重构。 issues/2026-04-28_18-26-58-r71-post-trialrun-fixes.csv 列完整且通过校验;A2-A5 依赖顺序清晰;Notes 明确本轮不改报销必须绑定发票规则。 命令:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-04-28_18-26-58-r71-post-trialrun-fixes.csv。检查:12 列完整、Dependencies 为 JSON 数组字符串、Files 为实际路径。 manual DONE DONE DONE issues/2026-04-28_18-26-58-r71-post-trialrun-fixes.csv [] 回滚路径:删除本 CSV;不影响业务运行。2026-04-28:合同已写入并通过 validate_issues_csv.py 校验。
3 A2 经理团队日历权限矩阵对齐与后端回归 修复 manager 角色在 server 侧缺失 leave.view_all 导致团队日历 403 的权限矩阵漂移,并补常量/路由回归测试,确保经理可查看团队请假窗口而普通员工仍不可越权。 server 侧 manager 解析结果包含 leave.view_all;manager 访问 /api/leave-requests?scope=all&dateFrom=...&dateTo=... 不再返回 403;employee 同条件仍返回 403;不新增 leave.manage。 命令:cd server && npm run prisma:validate && node --check src/constants/permissions.js && node --check src/routes/leave.js && npm test -- tests/unit/constants/permissions.test.js tests/unit/routes/leave.list-scope.test.js。业务:manager 登录 -> 请假 -> 团队日历,页面能加载当前窗口数据。 manual DONE DONE DONE server/src/constants/permissions.js|server/src/routes/leave.js|server/tests/unit/constants/permissions.test.js|server/tests/unit/routes/leave.list-scope.test.js ["A1"] 涉及权限模型,完成后必须进入 reviewer;2026-04-28:server manager 补齐 leave.view_all,权限单测、scope=all 路由回归与 Playwright 团队日历窗口复测通过。回滚路径:撤回 manager 的 leave.view_all 变更与新增测试。
4 A3 团队日历权限边界 reviewer 复核 对 A2 做独立 review,确认修复只放开经理读取团队日历所需权限,不引入 employee 越权、leave.manage 扩权或跨部门错误放大。 review 意见覆盖 client/server 权限矩阵一致性、/leave-requests all-scope 边界、employee 视角不可见/不可取数、manager 仅获得只读团队日历能力。 人工 review:对照 server/src/constants/permissions.js、client/src/auth/permissions.ts、client/src/pages/LeaveRequestPage.tsx、server/src/routes/leave.js 输出 review 结论;若发现高风险问题,A5 前必须先修复。 manual DONE DONE DONE server/src/constants/permissions.js|server/src/routes/leave.js|client/src/auth/permissions.ts|client/src/pages/LeaveRequestPage.tsx ["A2"] 本 Issue 只输出 review 结论,不修改业务代码。2026-04-28 reviewer 结论:client/server 现已同时授予 manager leave.view_all;server 仍以 leave.manage 约束跨部门查询;employee 无 leave.view_all 时仍被 /leave-requests?scope=all 拒绝,未见扩权或越权泄漏。
5 A4 报销提交前置提示与缺票错误文案澄清 保持“提交前必须先绑定发票”的后端规则不变,在报销详情页补显式提示,并为 bound_invoice_required 增加清晰中文文案;人工复核中若上传新发票,接口不得卡住。 当 detail.invoices.length=0 时,提交入口附近可见明确提示;若仍收到 details.invoices=bound_invoice_required,页面显示可理解中文文案;上传新发票后可进入可绑定列表并完成绑定;不改后端校验与状态流。 命令:cd server && npm run prisma:validate && node --check src/routes/invoicePool.js && npm test -- tests/unit/routes/invoicePool.upload.test.js && cd ../client && npm run typecheck && npm run build。业务:employee 登录 -> 新建空白报销/报销详情 -> 未绑定发票时尝试提交,页面给出明确提示;上传 PDF -> 绑定发票 -> 再次提交进入审批中。 manual DONE DONE DONE client/src/pages/ReimbursementDetailPage.tsx|client/src/api/errorMessages.ts|client/src/pages/reimbursement-detail/ReimbursementActions.tsx|server/src/routes/invoicePool.js|server/tests/unit/routes/invoicePool.upload.test.js ["A1"] 不承接票据自动绑定、报销状态机调整或发票规则放宽;2026-04-28:补齐前端缺票提示/错误映射,并修复人工复核中暴露的 multipart 文件流未消费导致上传挂起问题;回滚路径:撤回前端提示、错误映射与上传路由最小修复。
6 A5 定向回归与 R70 结论回填 完成经理团队日历与员工报销缺票提示的定向复测,更新 R70 报告和 issue-log,对已修复项回填 disposition/notes,并给出是否恢复试运行的结论。 manager 路径中团队日历可用且审批待办不回归;employee 路径中缺票提示清晰且绑定发票后可继续提交;artifacts/r70/manual-trialrun-report.md 与 artifacts/r70/issue-log.csv 已更新为最新结论。 命令:cd server && npm run prisma:validate && cd ../client && npm run typecheck && npm run build。业务:1) manager 登录 -> 待办审批 -> 请假团队日历;2) employee 登录 -> 空白报销/现有报销详情 -> 无发票提交提示 -> 上传并绑定发票后再次提交;3) 回填 R70 报告、issue-log、checklist。 manual DONE DONE DONE artifacts/r70/manual-trialrun-report.md|artifacts/r70/issue-log.csv|artifacts/r70/manual-trialrun-checklist.md ["A2","A3","A4"] 若 A3 reviewer 未通过,则 A5 不进入执行;2026-04-28:Playwright 定向复测通过,R70 报告/issue-log/checklist 已回填为最新结论,可恢复下一轮本地人工试运行。回滚路径:仅回退文档回填。