7.7 KiB
7.7 KiB
| 1 | ID | Title | Description | Acceptance | Test_Method | Tools | Dev_Status | Review1_Status | Regression_Status | Files | Dependencies | Notes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | H1 | OCR v2合同与基线复核 | 新建OCR实时体验v2执行合同,替代旧F1-F8计划;记录当前PC、移动、票据中心、真实OCR样本和live smoke准备状态。 | 1) 新CSV存在且字段完整;2) Notes明确supersedes旧计划;3) 不回改旧CSV;4) 开发范围以H2-H10为准。 | 业务流程:计划替换->开发实施;步骤:validate_issues_csv.py校验本CSV。 | python|manual | DONE | DONE | DONE | issues/2026-05-09_10-47-33-ocr-realtime-ux-v2.csv | [] | supersedes issues/2026-05-09_09-33-40-ocr-realtime-and-async-ux.csv;旧CSV保留历史快照。 |
| 3 | H2 | 后端定向OCR任务 | 新增ocr.invoice定向任务和enqueueOcrInvoice(invoiceId)能力,上传与重新识别后立即投递;周期ocr.tick只做兜底。 | 1) 上传pending_ocr后尝试投递单票任务;2) retry OCR后尝试投递单票任务;3) pg-boss不可用时不阻塞HTTP;4) 定向任务只处理目标票据;5) 周期tick仍可处理pending票据。 | 业务流程:上传发票->立即入队->后台OCR;步骤:server unit tests覆盖入队、retry、pg-boss不可用、定向处理和tick兜底;node --check相关文件。 | node|pg-boss|vitest | DONE | DONE | DONE | server/src/jobs/ocrJob.js|server/src/jobs/pgBossJobs.js|server/src/routes/invoicePool.js|server/tests/unit | ["H1"] | 不把腾讯OCR同步塞进上传HTTP;不新增数据库迁移。 |
| 4 | H3 | OCR完成事件流 | 新增认证fetch-stream/SSE事件接口/api/events,发布最小化invoice.updated事件;前端只用事件触发refetch,失败回退轮询。 | 1) 事件接口需Bearer token认证;2) payload只含type、invoiceId、status、updatedAt等最小字段;3) OCR完成后发布事件;4) 连接断开不影响原轮询兜底。 | 业务流程:OCR状态变化->事件通知->前端刷新;步骤:后端单测或轻量路由测试覆盖认证和事件格式;前端Playwright覆盖事件成功与断开兜底。 | node|react|sse|playwright | DONE | DONE | DONE | server/src/routes/events.js|server/src/services/events.js|server/src/app.js|client/src/api/events.ts|client/src/hooks | ["H2"] | 不使用EventSource URL传token;fetch stream使用Authorization header。 |
| 5 | H4 | 前端OCR跟踪hook | 抽出useInvoiceOcrTracker,统一pending IDs、事件订阅、轮询兜底、状态归类、自动绑定和超长等待文案。 | 1) PC和移动报销详情共用跟踪逻辑;2) pending持续自动刷新,不再60秒停止;3) available自动绑定;4) failed/duplicate/used显示明确业务原因;5) 事件失败自动轮询。 | 业务流程:报销详情上传发票->识别完成->自动添加;步骤:Playwright mock慢OCR与事件/轮询路径断言。 | react|typescript|playwright | DONE | DONE | DONE | client/src/hooks/useInvoiceOcrTracker.ts|client/src/pages/ReimbursementDetailPage.tsx|client/src/pages/MobileReimbursementDetailPage.tsx|client/tests/e2e | ["H3"] | 保留现有React Query缓存,事件只触发refetch。 |
| 6 | H5 | 添加发票单一提示与自动添加体验 | 重构PC/移动添加发票弹窗的识别提示区,避免多处重复“识别中”;识别完成自动添加,失败或重复展示字段、原因和下一步。 | 1) 同一弹窗同一时刻只有一个主识别状态提示;2) PC上传后慢OCR 65秒仍自动添加;3) 移动端上传后自动添加;4) 失败/重复显示字段和下一步;5) 普通用户不见内部码值。 | 业务流程:添加发票弹窗->上传->识别->自动添加或处理异常;步骤:Playwright断言提示数量、自动添加、异常文案和禁用内部术语。 | react|playwright | DONE | DONE | DONE | client/src/pages/ReimbursementDetailPage.tsx|client/src/pages/MobileReimbursementDetailPage.tsx|client/src/lib/invoiceOcr.ts|client/tests/e2e | ["H4"] | 解决顶部/中部/底部重复识别提示。 |
| 7 | H6 | 重复票据语义清理 | 不新增数据库状态枚举,扩展API返回availabilityReason/availabilityMessage,区分重复、已使用、识别失败、已添加和归档。 | 1) UploadInvoiceResponse、InvoicePoolDetail、InvoicePoolListItem、InvoiceStatusItem含availabilityReason/availabilityMessage;2) 重复不再泛化为OCR失败;3) 旧字段兼容;4) 普通用户页面不显示raw error。 | 业务流程:重复发票上传或OCR后判重->展示业务原因;步骤:后端单测覆盖状态映射;前端单测或E2E断言中文文案。 | node|react|typescript|vitest | DONE | DONE | DONE | server/src/routes/invoicePool/read.js|server/src/routes/invoicePool/shared/mappers.js|server/src/routes/invoicePool.js|client/src/api/invoicePool.ts|client/src/lib/invoiceOcr.ts | ["H2"] | 不新增Prisma迁移,避免状态机变更风险。 |
| 8 | H7 | 移动端拍照与PDF文件入口 | 企业微信/手机添加发票区分拍照/选择图片与选择PDF/文件,两入口共用上传逻辑;真机PDF选择写入清单。 | 1) 移动端有两个明确入口;2) 图片入口accept=image/*且capture可用;3) PDF/文件入口accept包含application/pdf;4) 选中文件名回显不溢出;5) real-device checklist记录真机PDF检查。 | 业务流程:企业微信添加发票->拍照或选择PDF->上传识别;步骤:Playwright mobile/wecom UA断言入口、accept属性和截图;人工清单更新。 | react|playwright|manual | DONE | DONE | DONE | client/src/pages/MobileReimbursementDetailPage.tsx|docs/trialrun/real-device-public-checklist.md|client/tests/e2e | ["H5"] | 真机文件选择无法完全自动化,保留人工验收项。 |
| 9 | H8 | pending OCR卡住扫描 | 新增pending OCR扫描脚本,输出超过2/5/10分钟的票据数量、ID、上传时间、尝试次数、最后错误,不泄露图片和密钥。 | 1) 脚本可连接当前DATABASE_URL只读查询;2) 输出JSON或表格摘要;3) 不读取票据文件内容;4) release gate可调用并在无数据库时清晰SKIP。 | 业务流程:发布前OCR健康检查;步骤:node scripts/qa/check-pending-ocr.mjs --thresholds=2,5,10;无DB环境输出SKIP。 | node|prisma|manual | DONE | DONE | DONE | scripts/qa/check-pending-ocr.mjs|scripts/qa/run-live-smoke-readiness.sh|docs/trialrun-runbook.md | ["H2"] | 只读检查,不修改数据。 |
| 10 | H9 | 项目级异步UX审计 | OCR主链路完成后扫描验真、支付批次、ERP同步、导入、审批、附件上传等异步流程,输出异步UX审计CSV,不顺手改业务代码。 | 1) docs/trialrun/async-ux-audit.csv存在;2) 每项包含流程、触发、反馈、自动更新、终态、失败原因、重试入口、风险和后续Issue建议;3) 高风险不在本轮顺手改。 | 业务流程:全项目异步体验审计;步骤:静态搜索路由、jobs、页面和E2E后人工审阅CSV。 | manual|rg|docs | DONE | DONE | DONE | docs/trialrun/async-ux-audit.csv|docs/trialrun/domestic-oa-best-practices.md | ["H5","H8"] | 审计输出用于后续决策。 |
| 11 | H10 | 回归部署与公网复核 | 完成H2-H9后执行完整验证、提交、部署和公网复核;只有公网检查通过后才通知用户可测试。 | 1) server prisma validate/node --check/相关unit通过;2) client typecheck/build通过;3) Playwright PC+mobile/wecom相关用例通过;4) 真实PDF OCR smoke有结果或明确SKIP缺项;5) 部署后/ready正常并检查公网文案。 | 业务流程:实现->回归->提交->部署->公网验证;步骤:server/client回归、run-web-gates或等效脚本、deploy/deploy.sh、curl /ready、live OCR。 | bash|npm|playwright|curl|git | DONE | DONE | DONE | server|client|scripts|docs|issues|deploy | ["H2","H3","H4","H5","H6","H7","H8","H9"] | 已部署公网;/ready与公网前端文案扫描通过;live smoke和真实OCR因缺LIVE_SMOKE_*、PLAYWRIGHT_OCR_LIVE_*明确SKIP;readiness报告 artifacts/qa-flow/live-smoke-readiness-20260509-115109。 |