7.0 KiB
7.0 KiB
| 1 | ID | Title | Description | Acceptance | Test_Method | Tools | Dev_Status | Review1_Status | Regression_Status | Files | Dependencies | Notes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | M1 | 核实与合同建档 | 记录 R5 真机反馈三项问题的核实结论,并将审批组织测试口径从临时互审修正为正式运行:majianyong 是员工可见直属主管;wangshunli 是后台公司负责人,使用 ceo+admin,不配置为普通 manager;不部署、不关闭主 R5。 | 1) Issue CSV 校验通过;2) admin 不自动获得业务审批权;3) wangshunli 自审应禁止;4) 中文头像取首字;5) 报销进入移动底部一级入口且详情页隐藏底部 Tab;6) 正式测试数据配置另拆 Issue,不混入本轮代码。 | 流程级验证:读取 docs/需求-统一审批中心规约.md、docs/product-design-rules.md、docs/reimbursement-invoice-rules.md;只读核实公网 wangshunli/majianyong 当前角色与直属上级;命令:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-10_17-47-39-r5-real-device-feedback-mobile-ux.csv。 | python3|ssh|manual | DONE | DONE | DONE | issues/2026-05-10_17-47-39-r5-real-device-feedback-mobile-ux.csv | [] | 本轮不新增 schema、不部署;主 R5 仍需部署后公网 smoke 与企业微信真机记录。正式配置默认:员工直属主管 majianyong;majianyong 直属领导 wangshunli;普通员工单据仅高额/高风险/例外进入 wangshunli 二审。已另建正式审批组织配置合同 issues/2026-05-10_18-25-33-formal-approval-org-config.csv。回滚路径:回滚本合同和本轮代码提交。 |
| 3 | M2 | 审批自审拦截与提示 | 在 workflow 动作入口统一禁止申请人/提交人审批自己的单据,覆盖单任务、批量通过、批量驳回、退回和转审;同时要求审批动作来自正式业务审批角色,admin 的 * 权限不能单独作为业务审批依据;提交阶段缺直属主管时阻断半截流程。 | 1) 自审返回 workflow=self_approval_not_allowed;2) 报销 owner/submitter、请假 owner、采购 applicant/submitter、差旅 applicant/submitter 均被识别;3) admin-only 审批人或转审目标不被视为业务审批人;4) 缺直属主管返回 no_actionable_approver;5) 非申请人审批不回归;6) 前端错误文案可理解。 | 流程级验证:申请人同时具备审批角色 -> 单任务与批量审批均被拒绝;admin-only 不能以系统管理权限审批;缺直属主管的提交/预检被阻断;非申请人审批仍可通过。命令:cd server && npm run prisma:validate;命令:cd server && node --check src/routes/workflow.js;命令:cd server && npm test -- tests/unit/routes/workflow.batch.test.js tests/unit/routes/workflow.transfer.test.js tests/unit/utils/workflow.test.js。 | node|vitest | DONE | DONE | DONE | server/src/routes/workflow.js|server/src/utils/workflow.js|server/src/services/feeControl.js|server/tests/unit/routes/workflow.batch.test.js|server/tests/unit/routes/workflow.transfer.test.js|server/tests/unit/utils/workflow.test.js|client/src/api/errorMessages.ts | ["M1"] | 已通过 prisma:validate、node --check workflow.js/utils/feeControl、workflow.batch/transfer/task-detail/utils 单测 23 passed。涉及 workflow 权限和审批规则,review 重点:不得阻断转审给非本人、不得影响已办详情、不得让 admin-only 绕过正式业务角色;回滚路径:回退 workflow 自审/业务角色拦截、缺主管阻断、前端错误映射和新增测试。 |
| 4 | M3 | 中文头像首字规则 | 调整 EmployeeAvatar fallback:中文/CJK 姓名默认显示首字;英文/拼音继续显示两段首字母;空姓名仍显示员工。 | 1) 王顺利显示王;2) 张三显示张;3) Wang Shunli 显示 WS;4) 空姓名显示员工;5) 不影响真实头像图片展示。 | 流程级验证:企业微信 UA 打开 /mobile/me,个人信息头像 fallback 显示首字;命令:cd client && npm run typecheck;命令:cd client && npm run test:e2e -- r5-real-device-feedback-mobile-ux.spec.ts --workers=1。 | typescript|playwright | DONE | DONE | DONE | client/src/components/common/EmployeeAvatar.tsx|client/tests/e2e/r5-real-device-feedback-mobile-ux.spec.ts | ["M1"] | 已通过 client typecheck/build 与 r5-real-device-feedback-mobile-ux.spec.ts;纯前端显示规则,无 API 变更;回滚路径:恢复 buildInitials 原逻辑。 |
| 5 | M4 | 移动报销导航与深层页交互 | 将报销设为移动底部一级入口,票据上传降为首页/报销内快捷入口;报销详情隐藏底部 Tab,并提供顶部返回和吸底主操作。 | 1) /mobile/reimbursements 底部报销 Tab 选中;2) /mobile/reimbursements/:id 不显示底部 Tab;3) 草稿/驳回详情页首屏或吸底区域可见提交审批和添加发票;4) 无横向滚动或遮挡。 | 流程级验证:企业微信 UA -> /mobile -> 报销 -> 新建/进入详情 -> 验证底部导航、返回和吸底操作;命令:cd client && npm run typecheck;命令:cd client && npm run build;命令:cd client && npm run test:e2e -- r89-mobile-login-navigation.spec.ts r109-mobile-reimbursement-feedback.spec.ts r110-mobile-pc-routing.spec.ts r111-invoice-reimbursement-guard.spec.ts r124-mobile-entry-matrix.spec.ts r5-real-device-feedback-mobile-ux.spec.ts --workers=1。 | typescript|playwright | DONE | DONE | DONE | client/src/features/mobile/navigation.ts|client/src/components/mobile/MobileBottomNav.tsx|client/src/layouts/AppShellLayout.tsx|client/src/pages/MobileReimbursementDetailPage.tsx|client/tests/e2e/*.ts | ["M2","M3"] | 已通过 client typecheck/build 和移动报销 E2E 10 passed;不删除 /mobile/capture;仅从底部一级 Tab 移除。回滚路径:恢复 MOBILE_NAV_ITEMS、AppShellLayout 底部导航显示规则和详情页操作区。 |
| 6 | M5 | 自动化视觉验证与 R5 证据回填 | 执行本轮后端、前端、E2E 与视觉检查,截图输出到 output/playwright/r5-real-device-feedback-mobile-ux/;回填主 R5 Notes 但不标 DONE。 | 1) 后端 workflow 检查通过;2) 前端 typecheck/build 通过;3) 关键 E2E 和新增视觉用例通过;4) 主 R5 记录本轮仍需部署后公网 smoke 和企业微信真机;5) git diff --check 通过。 | 流程级验证:执行 M2-M4 所列命令;命令:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-10_17-47-39-r5-real-device-feedback-mobile-ux.csv;命令:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv;命令:git diff --check。 | python3|git|playwright | DONE | DONE | DONE | issues/2026-05-10_17-47-39-r5-real-device-feedback-mobile-ux.csv|issues/2026-05-10_12-39-37-release-readiness-live-smoke.csv|issues/2026-05-10_18-25-33-formal-approval-org-config.csv|docs/trialrun/real-device-public-checklist.md|output/playwright/r5-real-device-feedback-mobile-ux | ["M2","M3","M4"] | 本轮本地完成且不部署;截图输出到 output/playwright/r5-real-device-feedback-mobile-ux/。部署后需重跑 LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-live-smoke-readiness.sh 并补企业微信真机验收。 |