文件
hyb-oa/issues/2026-05-09_10-47-33-ocr-realtime-ux-v2.csv
T

12 行
7.7 KiB
CSV

ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes
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保留历史快照。"
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;不新增数据库迁移。"
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。"
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。"
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""]","解决顶部/中部/底部重复识别提示。"
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迁移,避免状态机变更风险。"
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""]","真机文件选择无法完全自动化,保留人工验收项。"
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""]","只读检查,不修改数据。"
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""]","审计输出用于后续决策。"
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。"