10 KiB
10 KiB
| 1 | ID | Title | Description | Acceptance | Test_Method | Tools | Dev_Status | Review1_Status | Regression_Status | Files | Dependencies | Notes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | OINV1-0 | 建立真实发票自动化验证合同 | 基于项目 artifacts 中已有真实 PDF 发票样本,建立 OA 发票/OCR/报销自动化验证与脱敏加固合同;本合同不直接上传票面原图到报告、不提交真实报销、不执行付款。 | Issue CSV 校验通过;明确自动化范围、隐私边界、可写边界和后续人工门禁;不把真实发票号、销售方、金额、完整文件名或本地路径写入 Issue/文档/报告。 | 受影响流程:真实发票样本 -> OCR/provider 验证 -> 公网上传型 smoke -> 报销闭环准备;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-23_20-24-42-oa-invoice-automation-hardening-v1.csv。 | python3|manual | DONE | DONE | DONE | issues/2026-05-23_20-24-42-oa-invoice-automation-hardening-v1.csv | [] | 回滚/清理:仅删除本合同新增行或后续 QA-only 脚本;不删除真实发票样本。真实发票文件名和票面内容不得进入提交信息或公开报告。合同和 process gate 已通过。 |
| 3 | OINV1-1 | 真实发票样本脱敏盘点 | 盘点 artifacts 和私有 env 中配置的真实 PDF 样本,只记录数量、类型、大小区间和可用性,不记录完整文件名、销售方、发票号码、金额、完整本地路径或票面原图。 | 生成或记录脱敏样本清单;至少确认 PDF 样本数量、文件存在性、文件类型和是否可供 OCR;报告隐私扫描通过。 | 受影响流程:样本准备 -> 自动化输入 -> 隐私边界;验证步骤:rg --files | rg -i 'pdf$|发票|invoice';node scripts/qa/check-ocr-provider-samples.mjs --json 使用别名或 env 样本,不输出原始票面值。 | rg|node | DONE | DONE | DONE | artifacts;scripts/qa/check-ocr-provider-samples.mjs;artifacts/qa-flow/oinv1-provider-baseline-20260523-202701/summary.json | ["OINV1-0"] | 已用 /tmp SAMPLE-PDF-xxx 别名盘点根部 PDF 样本 2 个;summary 只含 alias、mime、size、transport/status,不含完整文件名、本地路径或票面值。 |
| 4 | OINV1-2 | OCR provider 样本只读验证 | 使用现有 check-ocr-provider-samples.mjs 直接调用 OCR provider 或在缺凭据时给出 SKIP,验证 PDF native transport、必要字段命中情况和图片 OCR 是否继续冻结。 | 脚本输出 status/decision/counts/fieldHits,不输出发票号码、销售方、金额或原始 OCR payload;缺腾讯凭据时记录 SKIP,不误判业务失败;如 provider 返回 HOLD,进入修复分析。 | 受影响流程:真实 PDF -> OCR provider -> 归一化字段 -> 决策;验证步骤:PLAYWRIGHT_OCR_LIVE_FILES=<样本列表> node scripts/qa/check-ocr-provider-samples.mjs --json。 | node | DONE | DONE | DONE | scripts/qa/check-ocr-provider-samples.mjs;server/src/services/ocr/tencent.js;artifacts/qa-flow/oinv1-provider-baseline-20260523-202701/summary.json | ["OINV1-1"] | provider 基线 status=SKIP,decision=FREEZE_BY_DEFAULT,counts total=2/pdf=2/skip=2,原因 missing_tencent_credentials;这是本地缺凭据,不是产品失败。不启用 OCR_IMAGE_OCR_EVALUATION;图片 OCR 继续冻结。回滚/清理:provider 只读验证不产生 OA 数据;只需删除本地脱敏报告或环境变量即可。 |
| 5 | OINV1-3 | 公网上传型 OCR smoke 脱敏加固方案 | 审查 live-invoice-ocr 和 batch spec 的输出,避免真实发票成功识别时把发票号、销售方、金额、完整文件名或本地路径写入日志/附件;准备 QA-only 脱敏报告格式。 | 形成实现方案并经用户确认后再改代码;脱敏报告只保留 alias、状态、耗时、字段命中布尔值、重复/已使用等可解释原因;不输出原始票面值。 | 受影响流程:公网 OA 上传 -> OCR 等待终态 -> 报告留存;验证步骤:代码审查 client/tests/e2e/manual/live-invoice-ocr*.spec.ts 和 helpers/liveInvoiceOcr.ts;改造后跑 npm/Playwright。 | manual|playwright | DONE | DONE | DONE | client/tests/e2e/manual/live-invoice-ocr.spec.ts;client/tests/e2e/manual/live-invoice-ocr-batch.spec.ts;client/tests/e2e/helpers/liveInvoiceOcr.ts;artifacts/qa-flow/live-smoke-readiness-20260523-205755/summary.json;artifacts/qa-flow/oinv1-redacted-batch-smoke-20260523-205755/summary.json | ["OINV1-2"] | 完成:用户确认 Q1-Q6 全部 A 后实施脱敏加固。单票 live OCR 输出 alias/status/duration/reasonCategory/fieldHits;批量报告写 artifacts/qa-flow/*/summary.md 和 summary.json,仅含 alias、状态、耗时、字段命中布尔值和原因分类;最小公网单票与批量 smoke 均通过。回滚:恢复 3 个 Playwright 测试文件改动;不影响生产 API/schema。 |
| 6 | OINV1-4 | 公网真实发票 OCR 小样本 smoke | 在脱敏加固后,用 OA-only/live smoke 员工账号上传 2-3 张代表 PDF 样票,验证重复票、可用票、识别失败票的用户可理解终态;不提交报销,不创建付款。105 张全量仅保留为后续可选压力/覆盖专项。 | 生成脱敏 summary;每张样票有 alias、终态、耗时和字段命中;重复/已用于报销可解释时为 PASS_WITH_FINDINGS 或 PASS_DUPLICATE_EXPLAINED;不可解释 OCR 失败记录 finding。 | 受影响流程:员工登录 -> 票据上传 -> OCR 终态 -> 票据池查看;验证步骤:PLAYWRIGHT_MANUAL=1 PLAYWRIGHT_OCR_LIVE=1 PLAYWRIGHT_OCR_ALLOW_DUPLICATE=1 npx playwright test tests/e2e/manual/live-invoice-ocr-batch.spec.ts --workers=1 --reporter=list;隐私扫描。 | playwright | TODO | TODO | TODO | client/tests/e2e/manual/live-invoice-ocr.spec.ts;client/tests/e2e/manual/live-invoice-ocr-batch.spec.ts;artifacts/qa-flow | ["OINV1-3"] | 写入边界:只允许票据上传 smoke 数据;不提交报销、不审批、不付款、不导出含敏感内容资料;报告不得含完整账号、发票号、销售方、金额、路径或票面原图。2026-05-23 用户纠偏:够用即可,启用前只跑代表小样本;代表样本能覆盖可用终态和重复/已用终态即可。已产生脱敏部分证据:sample2 报告覆盖可用终态和重复/相同发票终态,隐私扫描未命中真实票面值;但多样本 Playwright 因公网 OCR/UI 等待超过测试时限,OINV1-4 暂不置 DONE,后续应增加 max-samples/覆盖即停止后再关闭。 |
| 7 | OINV1-5 | 报销闭环测试数据准备 | 在 OCR smoke 可解释通过后,评估是否用 TEST/SMOKE 标记创建一条报销测试闭环,覆盖绑定票据、提交、审批、付款批次、回单和 AP 导出;真实业务闭环仍需人工最终验收。 | 若执行自动闭环,必须带 TEST/SMOKE marker,报告脱敏;若不执行,输出人工步骤和数据准备要求;不得执行真实银行付款。 | 受影响流程:票据池 -> 报销 -> 审批 -> 付款/AP;验证步骤:复用 reimbursement-payment-batch-flow 或 OAOPS1 真实业务门禁,必要时新建专项合同。 | playwright|manual | TODO | TODO | TODO | client/tests/e2e/reimbursement-payment-batch-flow.spec.ts;scripts/qa/run-oa-real-use-daily.sh | ["OINV1-4"] | 付款仍由线下银行完成;自动化只能创建/验证 OA 测试数据,不能替代真实业务发票合规判断。 |
| 8 | OINV1-6 | 本轮门禁和回填 | 完成合同校验、现有脚本审查、provider 样本基线和隐私检查;未获代码确认前,不改 live OCR spec;未获公网写入确认前,不运行上传型批量测试。 | validate_issues_csv、process contract、git diff --check 通过;最终回复明确哪些自动完成、哪些需要用户批准或人工验收。 | 受影响流程:合同 -> 自动基线 -> 后续实施判断;验证步骤:validate_issues_csv.py <OINV1 csv>;node scripts/qa/check-process-contract.mjs --issue <OINV1 csv> --profile general --json;git diff --check。 | python3|node|git | TODO | TODO | TODO | issues/2026-05-23_20-24-42-oa-invoice-automation-hardening-v1.csv | ["OINV1-0","OINV1-1","OINV1-2"] | 本轮可先做只读/本地 provider 基线;公网上传和脚本改造按用户确认继续。 |
| 9 | OINV1-7 | 现有单票公网 live OCR 基线 | 在不跑批量真实票的前提下,加载本机私有 live-smoke.env,使用现有单票 live OCR 测试复核公网发票上传/OCR 可解释终态;不提交报销、不审批、不付款。 | 公网 /ready、live smoke 和单票 OCR 测试通过;若样票重复或已用于报销,需给出可解释终态;报告不得输出完整发票号、销售方、金额、完整本地路径或票面原图。 | 受影响流程:员工登录 -> 单票上传 -> OCR/重复校验 -> 票据池终态;验证步骤:set -a; source /home/shunli/.hyb-oa/live-smoke.env; set +a; LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-live-smoke-readiness.sh。 | bash|playwright | DONE | DONE | DONE | artifacts/qa-flow/live-smoke-readiness-20260523-202814/summary.json;client/tests/e2e/manual/live-invoice-ocr.spec.ts | ["OINV1-0"] | 公网 live smoke 3 passed;真实 OCR 单票 1 passed;样票结果为已用于报销/不能重复添加的可解释终态,输出字段为空值,未打印票面值。回滚/清理:本轮未提交报销或付款;如需清理仅按 OA 票据审计规则处理测试上传记录。 |
| 10 | OINV1-8 | 外部报销发票样本池脱敏发现 | 用户确认上级公司资料目录存在大量发票后,按报销目录做脱敏盘点,并用 /tmp 别名软链接构建 PDF 样本池;不把完整文件名、路径、人名、销售方、金额或发票号写入仓库。 | 确认报销候选票据数量、格式分布和 PDF 样本池可用;生成只读 provider baseline;OFD/图片作为后续边界,不直接纳入当前 PDF OCR 批量验证。 | 受影响流程:外部公司资料 -> 脱敏样本池 -> OCR 批量验证准备;验证步骤:find 公司/2025年/报销 公司/2026年/报销 聚合统计;PLAYWRIGHT_OCR_LIVE_DIR=/tmp/hyb-oa-oinv1-reimbursement-pool-* node scripts/qa/check-ocr-provider-samples.mjs --json。 | find|node | DONE | DONE | DONE | external;artifacts/qa-flow/oinv1-reimbursement-pool-baseline-20260523-204037/summary.json | ["OINV1-1","OINV1-2"] | 脱敏统计:报销候选 114 个,PDF 105、OFD 6、图片 3;PDF provider baseline total=105/pdf=105/skip=105,原因 missing_tencent_credentials。回滚/清理:删除 /tmp 别名软链接目录和脱敏报告即可;未上传 OA、未提交报销、未付款。 |