R77-A2/A3: 回填live OCR收口与试运行结论

这个提交包含在:
2026-04-29 09:56:54 +08:00
父节点 f78acceba2
当前提交 5f68acfcc3
共修改 5 个文件,包含 34 行新增和 10 行删除
@@ -1,4 +1,4 @@
"ID","Title","Description","Acceptance","Test_Method","Tools","Dev_Status","Review1_Status","Regression_Status","Files","Dependencies","Notes"
"A1","服务端 OCR PDF 感知修复","让 invoice_pool OCR job 按 `mime_type` 区分 PDF 与图片:图片继续走当前 `ImageBase64` 路径;PDF 调腾讯 `VatInvoiceOCR` 时显式传 `IsPdf=true` 与 `PdfPageNumber=1`,并补齐最小可观测性,便于区分 `pdf_native` 与 `image_native` 调用模式。","1) 真实 PDF 发票经应用链路不再因缺少 PDF 参数而报 `FailedOperation.ImageDecodeFailed`;2) 不新增数据库 schema 与前端人工步骤;3) OCR 失败时保留业务可读错误,便于后续 live 报告区分问题类型。","命令:`cd server && npm run prisma:validate`;`cd server && node --check src/services/ocr/tencent.js`;`cd server && node --check src/services/ocr/index.js`;`cd server && node --check src/jobs/ocrJob.js`。业务:使用旧项目 `/home/shunli/shenzhou-business-suite/.env` 的腾讯凭证以运行时注入方式启动本地服务,上传真实 PDF 发票,验证自动 OCR 后进入可绑定或给出明确失败原因。","manual|playwright","DONE","DONE","TODO","server/src/jobs/ocrJob.js|server/src/services/ocr/index.js|server/src/services/ocr/tencent.js","[]","已完成:补齐 PDF 调用参数、支持 `VatInvoiceInfos` 返回结构归一化、记录 `pdf_native` / `image_native` 调用模式,并在干净本地 trialrun DB `hyb_oa_manual_trialrun_20260429093000` 上以真实 PDF 发票验证通过。默认策略仍为 `PDF first`,不引入前端默认转图;不把真实腾讯密钥写入仓库。回滚路径:恢复为仅图片参数调用。"
"A2","Live OCR 单张与批量复测","在 A1 基础上重跑单张与批量真实票样的 Playwright 辅助复核,确认 `上传 -> OCR -> 可绑定` 主链路在真实腾讯环境下能稳定闭环,并更新报告。","1) 用户提供的 PDF 发票至少 1 张经 live 链路成功识别;2) 批量脚本能输出每张票的成功/失败状态与原因;3) 报告中不再把当前问题归因到 `SecretIdNotFound` 或缺 PDF 参数。","命令:`cd client && PLAYWRIGHT_MANUAL=1 PLAYWRIGHT_OCR_LIVE=1 PLAYWRIGHT_OCR_LIVE_FILE=/home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf E2E_BASE_URL=http://127.0.0.1:<port> npx playwright test tests/e2e/manual/live-invoice-ocr.spec.ts --workers=1 --reporter=list`;`cd client && PLAYWRIGHT_MANUAL=1 PLAYWRIGHT_OCR_LIVE=1 PLAYWRIGHT_OCR_LIVE_BATCH=1 E2E_BASE_URL=http://127.0.0.1:<port> npx playwright test tests/e2e/manual/live-invoice-ocr-batch.spec.ts --workers=1 --reporter=list`。业务:验证真实 PDF 上传后自动 OCR、进入 available、可绑定到报销单。","playwright|manual","DOING","TODO","TODO","client/tests/e2e/manual/live-invoice-ocr.spec.ts|client/tests/e2e/manual/live-invoice-ocr-batch.spec.ts|artifacts/r70/live-ocr-batch-report.md","[""A1""]","进展:单张 live 业务链路已成功跑通;batch 业务结果也已成功进入 `available` 并回填报告。当前剩余问题是本地 Playwright runner 在 reporter 收尾阶段存在退出挂起,因此仍保留 `DOING`,后续需稳定 batch 辅助脚本收尾。腾讯凭证继续从旧项目运行时注入,优先使用已验证可用的 `/home/shunli/shenzhou-business-suite/.env`;`.env.local` 已知无效,不再作为默认主候选。"
"A3","覆盖矩阵与试运行结论回填","将 R77 的实现结果同步回填到覆盖矩阵、试运行报告与当前合同,明确 OCR 域是否已经达到可试运行标准,以及剩余外部专项边界。","1) coverage matrix、manual trialrun report 与 R77 CSV 结论一致;2) 能明确回答报销/票据/OCR 域是否已具备试运行条件;3) 企微、HTTPS、多角色并发仍保持在外部专项,不与 R77 OCR 收口混淆。","业务:汇总 A1-A2 结果,回填 `artifacts/r75/coverage-matrix.csv`、`artifacts/r70/manual-trialrun-report.md` 与本合同状态;必要时补充 checklist 中与 live OCR 相关的操作说明。","manual","DOING","TODO","TODO","artifacts/r75/coverage-matrix.csv|artifacts/r70/manual-trialrun-report.md|artifacts/r70/manual-trialrun-checklist.md|issues/2026-04-29_09-19-07-r77-ocr-pdf-first.csv","[""A2""]","已同步更新 live OCR 报告、coverage matrix 与 manual trialrun report,把旧的 `SecretIdNotFound` / `ImageDecodeFailed` 结论替换为当前真实成功路径。若 A2 后续仅剩 runner 收尾问题,则 R77 不再扩展企微、HTTPS、并发验证范围;这些项继续留在 R76/R78 外部专项。"
"A1","服务端 OCR PDF 感知修复","让 invoice_pool OCR job 按 `mime_type` 区分 PDF 与图片:图片继续走当前 `ImageBase64` 路径;PDF 调腾讯 `VatInvoiceOCR` 时显式传 `IsPdf=true` 与 `PdfPageNumber=1`,并补齐最小可观测性,便于区分 `pdf_native` 与 `image_native` 调用模式。","1) 真实 PDF 发票经应用链路不再因缺少 PDF 参数而报 `FailedOperation.ImageDecodeFailed`;2) 不新增数据库 schema 与前端人工步骤;3) OCR 失败时保留业务可读错误,便于后续 live 报告区分问题类型。","命令:`cd server && npm run prisma:validate`;`cd server && node --check src/services/ocr/tencent.js`;`cd server && node --check src/services/ocr/index.js`;`cd server && node --check src/jobs/ocrJob.js`。业务:使用旧项目 `/home/shunli/shenzhou-business-suite/.env` 的腾讯凭证以运行时注入方式启动本地服务,上传真实 PDF 发票,验证自动 OCR 后进入可绑定或给出明确失败原因。","manual|playwright","DONE","DONE","DONE","server/src/jobs/ocrJob.js|server/src/services/ocr/index.js|server/src/services/ocr/tencent.js","[]","已完成:补齐 PDF 调用参数、支持 `VatInvoiceInfos` 返回结构归一化、记录 `pdf_native` / `image_native` 调用模式,并在干净本地 trialrun DB `hyb_oa_manual_trialrun_20260429093000` 上以真实 PDF 发票验证通过。2026-04-29 已再通过 live 单张 + batch Playwright 复跑验证主链路闭环。默认策略仍为 `PDF first`,不引入前端默认转图;不把真实腾讯密钥写入仓库。回滚路径:恢复为仅图片参数调用。"
"A2","Live OCR 单张与批量复测","在 A1 基础上重跑单张与批量真实票样的 Playwright 辅助复核,确认 `上传 -> OCR -> 可绑定` 主链路在真实腾讯环境下能稳定闭环,并更新报告。","1) 用户提供的 PDF 发票至少 1 张经 live 链路成功识别;2) 批量脚本能输出每张票的成功/失败状态与原因;3) 报告中不再把当前问题归因到 `SecretIdNotFound` 或缺 PDF 参数。","命令:`cd client && PLAYWRIGHT_MANUAL=1 PLAYWRIGHT_OCR_LIVE=1 PLAYWRIGHT_OCR_LIVE_FILE=/home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf E2E_BASE_URL=http://127.0.0.1:<port> npx playwright test tests/e2e/manual/live-invoice-ocr.spec.ts --workers=1 --reporter=list`;`cd client && PLAYWRIGHT_MANUAL=1 PLAYWRIGHT_OCR_LIVE=1 PLAYWRIGHT_OCR_LIVE_BATCH=1 E2E_BASE_URL=http://127.0.0.1:<port> npx playwright test tests/e2e/manual/live-invoice-ocr-batch.spec.ts --workers=1 --reporter=list`。业务:验证真实 PDF 上传后自动 OCR、进入 available、可绑定到报销单。","playwright|manual","DONE","DONE","DONE","client/tests/e2e/manual/live-invoice-ocr.spec.ts|client/tests/e2e/manual/live-invoice-ocr-batch.spec.ts|artifacts/r70/live-ocr-batch-report.md","[""A1""]","2026-04-29 在 `http://127.0.0.1:3001` 上复跑通过:单张 `live-invoice-ocr.spec.ts` 1 passed (26.2s),batch `live-invoice-ocr-batch.spec.ts` 1 passed (14.1s),runner 正常退出;最新 batch 报告已回填 `artifacts/r70/live-ocr-batch-report.md`。腾讯凭证继续从旧项目运行时注入,优先使用已验证可用的 `/home/shunli/shenzhou-business-suite/.env`;`.env.local` 已知无效,不再作为默认主候选。"
"A3","覆盖矩阵与试运行结论回填","将 R77 的实现结果同步回填到覆盖矩阵、试运行报告与当前合同,明确 OCR 域是否已经达到可试运行标准,以及剩余外部专项边界。","1) coverage matrix、manual trialrun report 与 R77 CSV 结论一致;2) 能明确回答报销/票据/OCR 域是否已具备试运行条件;3) 企微、HTTPS、多角色并发仍保持在外部专项,不与 R77 OCR 收口混淆。","业务:汇总 A1-A2 结果,回填 `artifacts/r75/coverage-matrix.csv`、`artifacts/r70/manual-trialrun-report.md` 与本合同状态;必要时补充 checklist 中与 live OCR 相关的操作说明。","manual","DONE","DONE","DONE","artifacts/r75/coverage-matrix.csv|artifacts/r70/manual-trialrun-report.md|artifacts/r70/manual-trialrun-checklist.md|issues/2026-04-29_09-19-07-r77-ocr-pdf-first.csv","[""A2""]","已同步更新 live OCR 报告、coverage matrix、manual trialrun report 与 checklist。当前结论:员工侧 `上传 -> OCR -> available -> 绑定 -> 提交报销` 主链路已具备本地试运行条件;企微、HTTPS、多角色并发与财务支付后链路仍保持外部/后续专项,不与 R77 OCR 收口混淆。"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 A1 服务端 OCR PDF 感知修复 让 invoice_pool OCR job 按 `mime_type` 区分 PDF 与图片:图片继续走当前 `ImageBase64` 路径;PDF 调腾讯 `VatInvoiceOCR` 时显式传 `IsPdf=true` 与 `PdfPageNumber=1`,并补齐最小可观测性,便于区分 `pdf_native` 与 `image_native` 调用模式。 1) 真实 PDF 发票经应用链路不再因缺少 PDF 参数而报 `FailedOperation.ImageDecodeFailed`;2) 不新增数据库 schema 与前端人工步骤;3) OCR 失败时保留业务可读错误,便于后续 live 报告区分问题类型。 命令:`cd server && npm run prisma:validate`;`cd server && node --check src/services/ocr/tencent.js`;`cd server && node --check src/services/ocr/index.js`;`cd server && node --check src/jobs/ocrJob.js`。业务:使用旧项目 `/home/shunli/shenzhou-business-suite/.env` 的腾讯凭证以运行时注入方式启动本地服务,上传真实 PDF 发票,验证自动 OCR 后进入可绑定或给出明确失败原因。 manual|playwright DONE DONE TODO DONE server/src/jobs/ocrJob.js|server/src/services/ocr/index.js|server/src/services/ocr/tencent.js [] 已完成:补齐 PDF 调用参数、支持 `VatInvoiceInfos` 返回结构归一化、记录 `pdf_native` / `image_native` 调用模式,并在干净本地 trialrun DB `hyb_oa_manual_trialrun_20260429093000` 上以真实 PDF 发票验证通过。默认策略仍为 `PDF first`,不引入前端默认转图;不把真实腾讯密钥写入仓库。回滚路径:恢复为仅图片参数调用。 已完成:补齐 PDF 调用参数、支持 `VatInvoiceInfos` 返回结构归一化、记录 `pdf_native` / `image_native` 调用模式,并在干净本地 trialrun DB `hyb_oa_manual_trialrun_20260429093000` 上以真实 PDF 发票验证通过。2026-04-29 已再通过 live 单张 + batch Playwright 复跑验证主链路闭环。默认策略仍为 `PDF first`,不引入前端默认转图;不把真实腾讯密钥写入仓库。回滚路径:恢复为仅图片参数调用。
3 A2 Live OCR 单张与批量复测 在 A1 基础上重跑单张与批量真实票样的 Playwright 辅助复核,确认 `上传 -> OCR -> 可绑定` 主链路在真实腾讯环境下能稳定闭环,并更新报告。 1) 用户提供的 PDF 发票至少 1 张经 live 链路成功识别;2) 批量脚本能输出每张票的成功/失败状态与原因;3) 报告中不再把当前问题归因到 `SecretIdNotFound` 或缺 PDF 参数。 命令:`cd client && PLAYWRIGHT_MANUAL=1 PLAYWRIGHT_OCR_LIVE=1 PLAYWRIGHT_OCR_LIVE_FILE=/home/shunli/Projects/hyb-oa/artifacts/北京悦海堂餐饮管理有限公司_发票金额1683.00元.pdf E2E_BASE_URL=http://127.0.0.1:<port> npx playwright test tests/e2e/manual/live-invoice-ocr.spec.ts --workers=1 --reporter=list`;`cd client && PLAYWRIGHT_MANUAL=1 PLAYWRIGHT_OCR_LIVE=1 PLAYWRIGHT_OCR_LIVE_BATCH=1 E2E_BASE_URL=http://127.0.0.1:<port> npx playwright test tests/e2e/manual/live-invoice-ocr-batch.spec.ts --workers=1 --reporter=list`。业务:验证真实 PDF 上传后自动 OCR、进入 available、可绑定到报销单。 playwright|manual DOING DONE TODO DONE TODO DONE client/tests/e2e/manual/live-invoice-ocr.spec.ts|client/tests/e2e/manual/live-invoice-ocr-batch.spec.ts|artifacts/r70/live-ocr-batch-report.md ["A1"] 进展:单张 live 业务链路已成功跑通;batch 业务结果也已成功进入 `available` 并回填报告。当前剩余问题是本地 Playwright runner 在 reporter 收尾阶段存在退出挂起,因此仍保留 `DOING`,后续需稳定 batch 辅助脚本收尾。腾讯凭证继续从旧项目运行时注入,优先使用已验证可用的 `/home/shunli/shenzhou-business-suite/.env`;`.env.local` 已知无效,不再作为默认主候选。 2026-04-29 在 `http://127.0.0.1:3001` 上复跑通过:单张 `live-invoice-ocr.spec.ts` 1 passed (26.2s),batch `live-invoice-ocr-batch.spec.ts` 1 passed (14.1s),runner 正常退出;最新 batch 报告已回填 `artifacts/r70/live-ocr-batch-report.md`。腾讯凭证继续从旧项目运行时注入,优先使用已验证可用的 `/home/shunli/shenzhou-business-suite/.env`;`.env.local` 已知无效,不再作为默认主候选。
4 A3 覆盖矩阵与试运行结论回填 将 R77 的实现结果同步回填到覆盖矩阵、试运行报告与当前合同,明确 OCR 域是否已经达到可试运行标准,以及剩余外部专项边界。 1) coverage matrix、manual trialrun report 与 R77 CSV 结论一致;2) 能明确回答报销/票据/OCR 域是否已具备试运行条件;3) 企微、HTTPS、多角色并发仍保持在外部专项,不与 R77 OCR 收口混淆。 业务:汇总 A1-A2 结果,回填 `artifacts/r75/coverage-matrix.csv`、`artifacts/r70/manual-trialrun-report.md` 与本合同状态;必要时补充 checklist 中与 live OCR 相关的操作说明。 manual DOING DONE TODO DONE TODO DONE artifacts/r75/coverage-matrix.csv|artifacts/r70/manual-trialrun-report.md|artifacts/r70/manual-trialrun-checklist.md|issues/2026-04-29_09-19-07-r77-ocr-pdf-first.csv ["A2"] 已同步更新 live OCR 报告、coverage matrix 与 manual trialrun report,把旧的 `SecretIdNotFound` / `ImageDecodeFailed` 结论替换为当前真实成功路径。若 A2 后续仅剩 runner 收尾问题,则 R77 不再扩展企微、HTTPS、并发验证范围;这些项继续留在 R76/R78 外部专项。 已同步更新 live OCR 报告、coverage matrix、manual trialrun report 与 checklist。当前结论:员工侧 `上传 -> OCR -> available -> 绑定 -> 提交报销` 主链路已具备本地试运行条件;企微、HTTPS、多角色并发与财务支付后链路仍保持外部/后续专项,不与 R77 OCR 收口混淆。