- 新增 SERVE_CLIENT_DIST/CLIENT_DIST_DIR 配置 - 开启后注册 @fastify/static 并对非 /api GET(html) 回退 index.html - docker-compose.yml 与 README 补充用法
9.8 KiB
9.8 KiB
| 1 | ID | Title | Description | Acceptance | Test_Method | Tools | Dev_Status | Review1_Status | Regression_Status | Files | Dependencies | Notes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | E1 | CSV快照收口(试运行上线版) | 新建P4试运行上线版执行合同快照承接全部前后端与联动工作 | 新CSV通过校验且依赖关系正确旧快照不改动 | python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-02-08_21-50-09-p4-trialrun-ready.csv | manual | DONE | DONE | DONE | issues/2026-02-08_21-50-09-p4-trialrun-ready.csv | [] | none |
| 3 | E2 | 前端UI组件基线(成熟复用) | 引入UI primitives与移动端44px触控规范并保持现有token策略 | 三大业务页可复用组件且typecheck与build通过 | cd client && npm run typecheck && npm run build | manual | DONE | DONE | DONE | client/src/components/ui/* | client/src/lib/* | client/src/styles/mobile-touch.css | client/src/index.css | client/tailwind.config.js | client/package.json | ["E1"] | 本地拷贝shadcn风格组件子集并记录来源/许可证与回滚路径 |
| 4 | E3 | 前端布局导航收敛 | 统一Sidebar与Topbar交互视觉响应式与权限菜单体验 | 四角色菜单正确窄屏可用路由守卫无闪烁 | manual: 按server与client README启动联调并验证employee manager finance finance_mgr菜单与守卫 | manual | DONE | TODO | TODO | client/src/layouts/AppShellLayout.tsx | client/src/components/navigation/* | client/src/components/common/PageHeader.tsx | client/src/router/* | ["E2"] | none |
| 5 | E4 | 待办页精修(列表详情动作) | 用UI primitives收敛待办列表与详情动作区统一加载空态错误并补data-testid | approve reject return transfer动作可用且动作后列表详情刷新一致 | cd client && npm run typecheck && npm run build | manual | DONE | DONE | DONE | client/src/pages/WorkflowTasksPage.tsx | client/src/pages/WorkflowTaskDetailPage.tsx | client/src/api/workflow.ts | ["E3"] | 为E2E补稳定选择器data-testid |
| 6 | E5 | 报销页精修(列表详情联动) | 收敛报销列表详情展示并优化支付凭证与票据区块一致性并补data-testid | employee可create submit withdraw且finance可pay并填写凭证字段 | cd client && npm run typecheck && npm run build | manual | DONE | DONE | DONE | client/src/pages/ReimbursementsPage.tsx | client/src/pages/ReimbursementDetailPage.tsx | client/src/api/reimbursements.ts | ["E3"] | 为E2E补稳定选择器data-testid |
| 7 | E6 | 票据中心精修(OCR与预览) | 收敛上传列表详情并强化OCR状态展示绑定与签名预览交互并补data-testid | OCR_PROVIDER=mock联调可轮询pending_ocr且ocr_failed展示原因且预览可用 | cd client && npm run typecheck && npm run build | manual | DONE | DONE | DONE | client/src/pages/InvoicePoolPage.tsx | client/src/api/invoicePool.ts | client/src/api/http.ts | ["E3"] | 为E2E补稳定选择器data-testid |
| 8 | E7 | 委派管理前端页(运营可用) | 新增委派管理页与API封装支持创建列表撤销并加菜单入口与守卫 | 可创建委派撤销后delegate不可代办且无权限用户403提示正确 | manual: manager创建委派让delegate代办一次后撤销再验证PERM_002 | manual | DONE | TODO | TODO | client/src/pages/DelegationsPage.tsx | client/src/api/delegations.ts | client/src/router/index.tsx | client/src/components/navigation/Sidebar.tsx | ["E3"] | 权限码沿用expense.proxy_manage |
| 9 | E8 | 默认账号与失败体验收敛 | 补dev seed默认账号文档并让前端对网络失败给出可操作提示(含“忘记密码请联系管理员重置”) | 登录页后端不可达提示服务未启动且README列出默认账号且SYS_001提示可读 | manual: 停后端访问登录页看到提示并按README默认账号登录成功 | manual | DONE | TODO | TODO | client/src/pages/LoginPage.tsx | client/src/api/errorMessages.ts | server/README.md | client/README.md | ["E1"] | 仅写dev seed账号不写生产密码与密钥 |
| 10 | E9 | DB索引补强(试运行性能) | 为列表分页与筛选补组合索引以降低试运行慢查询风险 | 迁移可重复执行且回归全绿 | cd server && npm run prisma:migrate:deploy && ./scripts/regression-all.sh | manual | DONE | TODO | TODO | server/prisma/schema.prisma | server/prisma/migrations/* | ["E1"] | 新增组合索引仅增不破回滚成本低 |
| 11 | E10 | 后端安全基线(上线级) | 增加安全头与关键接口限流并完善上传校验与日志脱敏约定 | 限流触发行为正确安全头存在上传非法类型被拒绝且不泄露token | manual: curl压测login并验证429与headers并做一次上传非法类型校验 | manual | DONE | TODO | TODO | server/src/app.js | server/src/config.js | server/src/routes/auth.js | server/src/routes/invoicePool.js | server/README.md | server/package.json | ["E1"] | 优先使用@fastify/helmet与@fastify/rate-limit并写回滚说明 |
| 12 | E11 | 可观测性基线(ready与作业统计) | 新增/ready进行DB探活并为OCR与委派回收作业输出结构化统计 | ready可反映db状态且作业日志输出claimed updated audited等计数便于排障 | manual: 启动服务curl /ready并触发一次job观察日志字段 | manual | DONE | TODO | TODO | server/src/app.js | server/src/jobs/delegationRevokeJob.js | server/src/jobs/ocrJob.js | server/README.md | ["E10"] | 不引入外部监控先提供最小可观测字段 |
| 13 | E12 | 单域部署(server托管client静态) | 支持server托管client dist实现同域cookie并提供开关与SPA回退 | 开启后通过server根路径访问前端且登录刷新正常 | manual: cd client && npm run build 然后SERVE_CLIENT_DIST=true启动server访问http://127.0.0.1:3000完成登录 | manual | DONE | TODO | TODO | server/src/app.js | server/src/config.js | server/README.md | docker-compose.yml | ["E10"] | 优先复用@fastify/static并用正则fallback避开/api |
| 14 | E13 | 部署与运维包(试运行) | 提供deploy/trialrun含env模板compose示例反向代理示例与启动停止runbook | 按runbook可在新机器完成启动升级迁移与回滚演练一次 | manual: 按deploy/trialrun/runbook执行docker compose启动并验证ready与登录与回归入口 | manual | TODO | TODO | TODO | deploy/trialrun/* | docker-compose.yml | server/.env.example | server/README.md | client/README.md | ["E12"] | 先覆盖试运行环境后续再细化生产 |
| 15 | E14 | 备份与恢复演练(DB+文件) | 提供DB(pg_dump)与文件存储(票据上传目录)备份恢复脚本并把演练步骤写入runbook | 可生成DB+文件备份并在空库与空存储恢复后通过smoke与登录验证 | manual: 执行备份脚本后restore到新库与新存储目录并跑smoke-test | manual | TODO | TODO | TODO | scripts/backup-db.sh | scripts/restore-db.sh | scripts/backup-storage.sh | scripts/restore-storage.sh | deploy/trialrun/* | server/README.md | ["E13"] | 脚本读取DATABASE_URL与STORAGE_DIR不写死密码并输出可审计日志 |
| 16 | E15 | Playwright E2E(上线门禁) | 引入Playwright覆盖主链路登录待办审批报销提交票据上传OCR轮询绑定预览支付登出 | 本地与CI均可稳定跑通且失败输出可定位trace与截图 | cd client && npm run test:e2e | manual | TODO | TODO | TODO | client/playwright.config.ts | client/tests/e2e/* | client/package.json | client/README.md | client/src/pages/* | ["E12","E4","E5","E6","E8"] | 测试环境OCR_PROVIDER=mock且OCR_POLL_CRON改为秒级以保证E2E稳定 |
| 17 | E16 | CI集成E2E与全链门禁 | 新增ci-e2e工作流在PR与nightly跑E2E并保留现有最小门禁与后端回归 | PR能跑min+e2e smoke nightly跑regression+e2e全量 | manual: GitHub Actions workflow_dispatch触发并通过 | manual | TODO | TODO | TODO | .github/workflows/ci-e2e.yml | .github/workflows/ci-minimal.yml | .github/workflows/ci-regression.yml | ["E15"] | CI中OCR默认mock避免外部凭据不稳定 |
| 18 | E17 | 账号与角色管理API(后端运营) | 新增system.users下的员工创建启用禁用重置密码角色分配接口并写审计 | system.users可完成一轮创建与禁用与角色分配且审计完整 | manual: curl或postman完成创建禁用改角色与重置密码并验证权限阻断 | manual | TODO | TODO | TODO | server/src/routes/users.js | server/src/app.js | server/src/constants/permissions.js | server/README.md | server/package.json | ["E10"] | 禁止自注册仅运营接口并记录回滚策略 |
| 19 | E18 | 账号与角色管理页(前端最小可运营) | 新增系统用户管理页与API封装并加菜单入口与守卫 | 具备system.users账号可管理普通账号且无权限用户403 | manual: admin登录进入用户管理页完成创建与禁用与重置密码 | manual | TODO | TODO | TODO | client/src/pages/UserManagementPage.tsx | client/src/api/users.ts | client/src/router/index.tsx | client/src/components/navigation/Sidebar.tsx | ["E17","E3"] | 页面先满足运营闭环不做复杂组织管理 |
| 20 | E19 | 上线发布清单与回滚策略收口 | 把试运行上线步骤门禁回归备份回滚监控要点写成可执行checklist | 按清单可完成一次发布并可在10分钟内回滚到上个版本 | manual: 按runbook checklist执行一次演练并记录证据 | manual | TODO | TODO | TODO | server/README.md | client/README.md | deploy/trialrun/* | ["E9","E11","E13","E14","E16","E18"] | 形成可审计可回滚的发布闭环 |
| 21 | E20 | 试运行引导管理员账号(bootstrap) | 新增试运行引导脚本创建首个管理员账号用于后续运营(管理员重置密码策略) | 空库可通过脚本创建管理员且可登录并进入用户管理页 | manual: 空库migrate后运行seed:trialrun并用管理员账号调用/login与进入前端用户管理页 | manual | TODO | TODO | TODO | server/src/scripts/seed-trialrun.js | server/package.json | server/README.md | deploy/trialrun/* | ["E1"] | 避免使用seed-dev默认弱口令;密码由env提供或首次启动输出一次性口令 |
| 22 | E21 | 服务优雅停机(单机部署) | 补齐SIGTERM/SIGINT优雅退出(停止job/关闭HTTP/断开DB)并写入runbook | 容器stop或Ctrl+C退出时无Unhandled且能在超时前完成close | manual: 本地启动server后发送SIGTERM观察日志并确认端口释放 | manual | TODO | TODO | TODO | server/src/index.js | server/README.md | deploy/trialrun/* | ["E1"] | 单机同样需要保证升级/重启过程中连接与作业可控 |