OANEXT2 增加测试业务闭环验证
这个提交包含在:
@@ -4,7 +4,7 @@
|
||||
"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 数据;只需删除本地脱敏报告或环境变量即可。"
|
||||
"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。"
|
||||
"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 PLAYWRIGHT_OCR_BATCH_MAX_SAMPLES=3 PLAYWRIGHT_OCR_BATCH_STOP_WHEN_COVERED=1 npx playwright test tests/e2e/manual/live-invoice-ocr-batch.spec.ts --workers=1 --reporter=list;隐私扫描。","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/oinv1-redacted-batch-api-coverage-stop-20260523-continue/summary.json","[""OINV1-3""]","完成:按用户“够用即可”纠偏,批量脚本支持 max samples 和覆盖即停止,默认 API 状态轮询避免 UI 详情刷新误判 OCR 耗时。公网小样本 planned=3、actual=2、stopReason=coverage_satisfied,覆盖 available 和 duplicate_or_same_invoice,隐私扫描未命中真实票面值;未提交报销、未审批、未付款。远端脱敏查询显示最近真实 OCR completeLagSec=3,几分钟假象来自 UI 批量等待方式。回滚:恢复 helper/spec 改动;公网 smoke 票据按审计保留。"
|
||||
"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 测试数据,不能替代真实业务发票合规判断。"
|
||||
"OINV1-5","报销闭环测试数据准备","在 OCR smoke 可解释通过后,评估是否用 TEST/SMOKE 标记创建一条报销测试闭环,覆盖绑定票据、提交、审批、付款批次、回单和 AP 导出;真实业务闭环仍需人工最终验收。","若执行自动闭环,必须带 TEST/SMOKE marker,报告脱敏;若不执行,输出人工步骤和数据准备要求;不得执行真实银行付款。","受影响流程:票据池 -> 报销 -> 审批 -> 付款/AP;验证步骤:OA_TEST_SMOKE_BUSINESS_WRITE=1 LIVE_SMOKE_BASE_URL=https://oa.hyinda.com node scripts/qa/run-oa-test-smoke-business-loop.mjs;检查 artifacts/qa-flow/oa-test-smoke-business-loop-20260523-magi/summary.json。","node|bash","DONE","DONE","DONE","scripts/qa/run-oa-test-smoke-business-loop.mjs;artifacts/qa-flow/oa-test-smoke-business-loop-20260523-magi/summary.json","[""OINV1-4""]","完成:公网 TEST/SMOKE 报销闭环已通过,使用已有可用票据或合成 general PDF 票据池项满足提交规则,不上传新的真实票面原图;完成提交、审批、付款批次、合成回单、OA 内已付款、AP 导出。付款仍由线下银行完成,自动化结果不替代真实业务发票合规判断。"
|
||||
"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 基线;公网上传和脚本改造按用户确认继续。"
|
||||
"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 票据审计规则处理测试上传记录。"
|
||||
"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、未提交报销、未付款。"
|
||||
|
||||
|
@@ -4,7 +4,7 @@
|
||||
"OANEXT2-2","第一优先级:批量 OCR 报告脱敏加固","若用户采纳,优先实施 OINV1-3:改造或新增 QA-only 批量 OCR 报告逻辑,避免真实发票号、销售方、金额、完整文件名、完整路径和票面原图进入日志、附件或 summary。","批量 OCR 报告只输出 alias、状态、耗时、字段命中布尔值、重复/已使用/失败可解释原因;隐私扫描通过;不改变生产业务 API/schema。","受影响流程:真实 PDF 样本 -> 公网上传 OCR -> 脱敏报告;验证步骤:node/ts 语法检查;Playwright 单票 smoke;报告隐私扫描;validate OINV1。","playwright|node|git","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;artifacts/qa-flow/oinv1-redacted-batch-smoke-20260523-205755","[""OANEXT2-1""]","用户选择 A;已完成脱敏加固和最小公网验证。回滚:恢复测试脚本改动;不影响生产 API/schema 或既有业务数据。"
|
||||
"OANEXT2-3","第二优先级:代表小样本 PDF OCR smoke","在 OANEXT2-2 脱敏加固后,从 /tmp SAMPLE-PDF-xxx 别名池选取 2-3 张代表 PDF 报销候选样本执行公网 OCR smoke;默认不提交报销、不审批、不付款。105 张全量仅作为后续可选压力/覆盖专项,不作为启用前必跑门禁。","输出小样本脱敏 summary:总数、成功数、重复/已用数、失败/超时数、字段命中率和可解释失败分类;报告不含票面值、完整路径或原始 payload;发现不可解释失败进入修复合同。","受影响流程:PDF 样本池 -> 公网票据上传 -> OCR/重复终态 -> 脱敏统计;验证步骤:PLAYWRIGHT_MANUAL=1 PLAYWRIGHT_OCR_LIVE=1 PLAYWRIGHT_OCR_ALLOW_DUPLICATE=1 PLAYWRIGHT_OCR_BATCH_MAX_SAMPLES=3 PLAYWRIGHT_OCR_BATCH_STOP_WHEN_COVERED=1 执行批量 OCR Playwright;隐私扫描。","playwright|bash","DONE","DONE","DONE","artifacts/qa-flow/oinv1-redacted-batch-api-coverage-stop-20260523-continue/summary.json;client/tests/e2e/manual/live-invoice-ocr-batch.spec.ts;client/tests/e2e/helpers/liveInvoiceOcr.ts","[""OANEXT2-2""]","完成:公网小样本 planned=3、actual=2、stopReason=coverage_satisfied,覆盖可用终态和重复/相同发票终态;默认 API 轮询,UI 复核可通过 PLAYWRIGHT_OCR_BATCH_TRANSPORT=ui 单独执行。未提交报销、未审批、未付款。105 张全量继续作为后续可选压力/覆盖专项。"
|
||||
"OANEXT2-4","第三优先级:权限矩阵自动负例","补齐 OALAUNCH1-5/OANEXT1-3:用 OA-only smoke 账号自动验证员工、主管、财务、HR、CEO、管理员的入口可用性和普通员工越权负例。","普通员工不能访问财务/AP、合同敏感附件、他人审批、管理入口、审计导出、高敏或冻结模块;角色必要入口可用;报告脱敏且可作为 OALAUNCH_PERMISSION_EVIDENCE。","受影响流程:多角色登录 -> 页面入口 -> API 直连负例 -> 权限报告;验证步骤:LIVE_SMOKE_BASE_URL=https://oa.hyinda.com OA_PERMISSION_MATRIX_REPORT_DIR=artifacts/qa-flow/oa-permission-matrix-20260523-magi node scripts/qa/check-oa-permission-matrix.mjs;隐私扫描。","node|bash","DONE","DONE","DONE","scripts/qa/check-oa-permission-matrix.mjs;artifacts/qa-flow/oa-permission-matrix-20260523-magi/summary.json;artifacts/qa-flow/oa-final-launch-readiness-20260523-220358/summary.json","[""OANEXT2-1""]","完成:公网只读权限矩阵 PASS_PERMISSION_MATRIX_READY,覆盖 7 个 OA-only smoke 角色、40 个正向探针、24 个负向探针;员工/主管/普通财务越权拒绝,财务主管系统审计能力按既有权限模型视为授权,admin 以 portal 能力和导航验证为系统管理员且非业务审批/财务角色。报告脱敏;未改权限模型、未创建业务数据、未执行付款。"
|
||||
"OANEXT2-5","第四优先级:TEST/SMOKE 业务闭环自动化","在不使用真实付款、不导入银行流水、不写 ERP 的前提下,准备用 TEST/SMOKE 标记自动跑 OA 主办域闭环:报销/OCR、审批、付款批次、银行回单附件、AP 导出、采购/费用、项目/合同关联。","自动化测试数据有 TEST/SMOKE marker;不含真实合同正文、敏感报价、银行流水原件或票面原图;可验证流程技术闭环,但不替代真实业务人工验收。","受影响流程:报销 -> 审批 -> 付款批次 -> 回单 -> AP;采购/费用 -> 项目/合同;验证步骤:复用 reimbursement-payment-batch-flow、run-oa-real-use-daily 或新增 QA-only flow;报告脱敏。","playwright|bash","TODO","TODO","TODO","client/tests/e2e/reimbursement-payment-batch-flow.spec.ts;scripts/qa/run-oa-real-use-daily.sh;artifacts/qa-flow","[""OANEXT2-2"",""OANEXT2-4""]","执行前需要用户确认是否允许公网创建 TEST/SMOKE 业务测试数据。实际付款仍由线下银行渠道完成,自动化不得触发真实支付。"
|
||||
"OANEXT2-5","第四优先级:TEST/SMOKE 业务闭环自动化","在不使用真实付款、不导入银行流水、不写 ERP 的前提下,准备用 TEST/SMOKE 标记自动跑 OA 主办域闭环:报销/OCR、审批、付款批次、银行回单附件、AP 导出、采购/费用、项目/合同关联。","自动化测试数据有 TEST/SMOKE marker;不含真实合同正文、敏感报价、银行流水原件或票面原图;可验证流程技术闭环,但不替代真实业务人工验收。","受影响流程:报销 -> 审批 -> 付款批次 -> 回单 -> AP;采购/费用 -> 项目/合同;验证步骤:OA_TEST_SMOKE_BUSINESS_WRITE=1 LIVE_SMOKE_BASE_URL=https://oa.hyinda.com node scripts/qa/run-oa-test-smoke-business-loop.mjs;隐私扫描。","node|bash","DONE","DONE","DONE","scripts/qa/run-oa-test-smoke-business-loop.mjs;artifacts/qa-flow/oa-test-smoke-business-loop-20260523-magi/summary.json","[""OANEXT2-2"",""OANEXT2-4""]","完成:用户已在 OANEXT2-13 选择 A,公网创建 TEST/SMOKE/OANEXT2 测试业务数据;最终报告 PASS_TEST_SMOKE_BUSINESS_LOOP_READY。覆盖项目、合同台账、报销提交审批、付款批次、合成回单、OA 内已付款标记、AP 导出、采购审批、采购归档与项目/合同关联;未执行真实银行付款、未接支付服务、未写 ERP、未导入银行流水、未上传真实票面原图。早期失败尝试留下少量 TEST/SMOKE 草稿/台账数据,按审计保留。"
|
||||
"OANEXT2-6","第五优先级:真实业务人工闭环证据包","补齐 OAOPS1-3/4/5/6 和 OALAUNCH1-3:用 1 条真实报销、1 条采购/费用、1 条合同台账和每日问题登记形成正式启用前人工证据。","真实报销完成 OCR、提交、审批、付款批次、回单、已付款和 AP 导出;采购/费用完成审批并关联项目或合同;合同台账有编号、负责人、归档位置和权限检查;问题登记机制可执行。","受影响流程:真实业务 -> OA 记录 -> 财务/审计 -> 最终启用汇总;验证步骤:人工在公网 OA 操作;运行 run-oa-final-launch-readiness.sh 并提供 OALAUNCH_BUSINESS_EVIDENCE。","manual|bash","TODO","TODO","TODO","issues/2026-05-22_20-09-22-oa-real-use-stabilization-v1.csv;issues/2026-05-23_16-49-39-oa-final-launch-readiness-v1.csv","[""OANEXT2-5""]","真实票据、合同正文、敏感报价、银行流水原件和未脱敏票面不得进入仓库/聊天/自动化报告。"
|
||||
"OANEXT2-7","第六优先级:备份恢复演练方案与执行门禁","补齐 OALAUNCH1-6/OANEXT1-4:规划并执行影子库或隔离恢复验证,确认备份可定位、可访问、可恢复,不影响公网生产库。","有备份集合/介质引用、恢复演练证据、RTO/RPO、负责人、关键表/附件/登录/报销详情/AP 抽样结果;失败则暂停正式启用。","受影响流程:备份检查 -> 影子恢复 -> 数据验证 -> Go/No-Go;验证步骤:按 OPS runbook 执行;证据路径传入 OALAUNCH_BACKUP_EVIDENCE。","manual|ops","TODO","TODO","TODO","docs/trialrun/OPS7运维交接Runbook.md;docs/ops/非功能基线.md;docs/需求-资产管理规约.md","[""OANEXT2-6""]","必须人工批准范围;不得重置公网数据库,不得 destructive restore。回滚/清理:仅删除影子库、临时恢复目录和临时凭据,公网生产库不回滚不覆盖。涉及恢复/权限修复后需只读 reviewer subagent。"
|
||||
"OANEXT2-8","第七优先级:7 天稳定化启动与每日收口","补齐 OALAUNCH1-4/OANEXT1-6:确认起始日期,连续 7 天执行 OAOPS1 每日只读巡检和人工日收口。","连续 7 天报告可读;无不可解释 blocker;非阻断 finding 有 owner、完成日期或接受理由;Day 7 可进入最终 Go/No-Go。","受影响流程:每日巡检 -> 问题登记 -> blocker 修复/绕行 -> Day 7 汇总;验证步骤:LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-oa-real-use-daily.sh;Day 7 运行 run-oa-final-launch-readiness.sh。","bash|manual","TODO","TODO","TODO","scripts/qa/run-oa-real-use-daily.sh;scripts/qa/run-oa-final-launch-readiness.sh;artifacts/qa-flow/oa-real-use-daily-*","[""OANEXT2-4"",""OANEXT2-6"",""OANEXT2-7""]","需要用户选择起始日期;不能用旧报告凑连续 7 天。建议在批量 OCR 和权限负例通过后启动。"
|
||||
|
||||
|
在新工单中引用
屏蔽一个用户