LDF 收口部署财务回单闭环

这个提交包含在:
2026-05-17 10:41:35 +08:00
父节点 ab5ab4deed
当前提交 426a96816a
共修改 5 个文件,包含 69 行新增和 14 行删除
@@ -47,6 +47,13 @@ type PaymentBatch = {
};
};
type ReceiptAttachment = {
id: string;
originalName: string;
mimeType: string;
fileSize: number;
};
type FinanceLedgerResponse = {
total: number;
items: Array<{
@@ -304,6 +311,25 @@ async function createPaymentBatch(api: APIRequestContext, input: { reimbursement
return data.item;
}
async function uploadPaymentBatchReceipt(api: APIRequestContext, batchId: string, marker: string) {
const receiptName = `${markerPrefix.toLowerCase()}-bank-receipt-${marker.slice(-8)}.pdf`;
const response = await api.post(`/api/payment-batches/${batchId}/receipt-attachments`, {
multipart: {
file: {
name: receiptName,
mimeType: "application/pdf",
buffer: Buffer.from(`%PDF-1.4\n${issueId} bank receipt ${marker}\n%%EOF\n`, "utf8"),
},
},
});
const data = await parseData<{ items: ReceiptAttachment[] }>(response, "upload payment batch receipt");
const item = data.items[0];
if (!item?.id) {
throw new Error("receipt_upload_missing_item");
}
return item;
}
async function expectPostRejected(api: APIRequestContext, pathName: string, data: unknown, label: string) {
const response = await api.post(pathName, { data });
expect(response.ok(), `${label} should be rejected`).toBe(false);
@@ -448,6 +474,23 @@ test.describe("P2-FIN-LIVE 公网付款批次短窗口", () => {
})).item;
expect(batch.reviewRequirement.completedReviewCount).toBeGreaterThanOrEqual(1);
const missingReceiptExecuteStatus = await expectPostRejected(
finance.api,
`/api/payment-batches/${batch.id}/execute`,
{},
"bank payment execute without receipt",
);
expect(missingReceiptExecuteStatus).toBe(409);
const receipt = await uploadPaymentBatchReceipt(finance.api, batch.id, marker);
const receiptList = await apiGetData<{ items: ReceiptAttachment[] }>(
finance.api,
`/api/payment-batches/${batch.id}/receipt-attachments`,
);
expect(receiptList.items.some((item) => item.id === receipt.id)).toBe(true);
const receiptDownload = await finance.api.get(`/api/payment-batches/${batch.id}/receipt-attachments/${receipt.id}/file`);
expect(receiptDownload.status(), "bank receipt download should succeed").toBe(200);
batch = (await apiPostData<{ item: PaymentBatch }>(finance.api, `/api/payment-batches/${batch.id}/execute`, {})).item;
expect(batch.status).toBe("executed");
@@ -472,6 +515,9 @@ test.describe("P2-FIN-LIVE 公网付款批次短窗口", () => {
);
await expectAuditAction(admin.api, "PAYMENT_BATCH_CREATED", (item) => item.targetId === batch.id);
await expectAuditAction(admin.api, "PAYMENT_BATCH_REVIEWED", (item) => item.targetId === batch.id);
await expectAuditAction(admin.api, "PAYMENT_BATCH_RECEIPT_UPLOADED", (item) =>
item.targetId === batch.id && Array.isArray(item.extra?.attachmentIds),
);
await expectAuditAction(admin.api, "PAYMENT_BATCH_EXECUTED", (item) => item.targetId === batch.id);
await expectAuditAction(admin.api, "REIMBURSEMENT_PAYMENT_MARKED", (item) => item.targetId === reimbursement.id);
await expectAuditAction(admin.api, "EXPORT_AP_OPERATIONS", (item) => item.actorId === finance.me.id);
@@ -479,6 +525,9 @@ test.describe("P2-FIN-LIVE 公网付款批次短窗口", () => {
summary.stages.payment = {
batchId: batch.id,
batchStatus: batch.status,
receiptAttachmentId: receipt.id,
missingReceiptExecuteStatus,
receiptDownloadStatus: receiptDownload.status(),
reimbursementStatus: paid.status,
invoiceStatus: invoice.status,
ledgerPaymentStatus: ledgerItem?.payment.status ?? "missing",
+6 -3
查看文件
@@ -27,7 +27,8 @@ DCL7 已删除本文件中 R70-R91 的长流水历史,避免旧环境、旧开
- 2026-05-16 P2-FIN-LIVE-DECISION 已完成公网付款批次启用窗口决策:live smoke/PDF OCR readiness 通过,付款批次公网关闭态只读门禁通过;初始结论为 `HOLD_FOR_WINDOW`,随后用户批准立即短窗口、现有 live smoke 测试账号和新建测试报销,进入 `P2-FIN-LIVE`。
- 2026-05-17 P2-FIN-LIVE 已按用户批准完成公网付款批次短窗口受控测试:使用现有 live smoke 测试账号新建专用测试报销,临时打开 `payment_batch_v1`,完成付款批次创建、复核、执行、AP 导出和审计核验后强制回到 `flag_force_off`;未部署,不接真实支付,不写 ERP 实时凭证,不开放图片 OCR。
- 2026-05-17 PRELAUNCH 已按“系统尚未正式使用”的新前提完成正式启用前公网预回归:公网 `/ready`、public bundle、live smoke、PDF live OCR、远端 Caddy/compose/migration 只读基线、隔离核心业务流、付款批次公网 PRELAUNCH 窗口、公网移动矩阵和企业微信 UA/渲染矩阵均形成证据;公网测试数据均带 `PRELAUNCH` marker。最终 `payment_batch_v1=flag_force_off`,未部署、不接真实支付、不写 ERP 实时凭证、不开放图片 OCR。浏览器全链路 `all` 中报销 PDF 因样票重复记可解释 `SKIP`,采购分流程功能报告通过但手工 live spec 存在长等待/退出码稳定性缺口,后续作为 QA 自动化维护项。
- 2026-05-17 CASHIER-VOUCHER-V1 已按“无 ERP/独立财务系统、只有代账”的新业务前提完成正式启用前财务闭环补强:新增付款批次银行回单附件、复核后补凭证、银行渠道执行前回单阻断和 PC 付款批次详情操作区;业务口径为 `wangzhiling` 出纳执行、`wangshunli` 管理员复核,后续正式流程是 OA 内审批/台账/付款批次 + 银行对公付款回单 + 月度代账交接。本轮未部署,公网 `payment_batch_v1` 状态未改变,不接真实支付、不写 ERP、不开放图片 OCR、不导入银行流水;下一步需另建 `LAUNCH-DEPLOY-FINANCE`、`FIN-PROD-ENABLE` 和 `ACCOUNTING-HANDOFF-V1` 合同。
- 2026-05-17 CASHIER-VOUCHER-V1 已按“无 ERP/独立财务系统、只有代账”的新业务前提完成正式启用前财务闭环补强:新增付款批次银行回单附件、复核后补凭证、银行渠道执行前回单阻断和 PC 付款批次详情操作区;业务口径为 `wangzhiling` 出纳执行、`wangshunli` 管理员复核,后续正式流程是 OA 内审批/台账/付款批次 + 银行对公付款回单 + 月度代账交接。CASHV 代码已由 `LAUNCH-DEPLOY-FINANCE` 部署到公网,不接真实支付、不写 ERP、不开放图片 OCR、不导入银行流水;下一步需另建或延续 `FIN-PROD-ENABLE` 和 `ACCOUNTING-HANDOFF-V1` 合同。
- 2026-05-17 LAUNCH-DEPLOY-FINANCE 已按用户要求完成“本地全流程/页面门禁 -> 部署 -> 公网复检”:本地基础代码门禁、业务流、PC/移动/企业微信页面矩阵均通过;部署 commit `ab5ab4d` 到 `https://oa.hyinda.com`,`SYNC_ENV=0` 未覆盖远端 env,新增回单附件 migration 已应用;公网 readiness、PDF live OCR、移动/企业微信矩阵和 CASHV 短窗口均通过。CASHV 公网测试报销 `BX-20260517-0025` 完成无回单执行阻断、上传/下载回单、付款执行、AP 导出和审计核验;最终 `payment_batch_v1=flag_force_off`,正式常开仍需 `FIN-PROD-ENABLE`。
## 关键证据索引
@@ -62,7 +63,8 @@ DCL7 已删除本文件中 R70-R91 的长流水历史,避免旧环境、旧开
| P2-FIN-LIVE-DECISION | 已收口:公网付款批次启用窗口决策完成,初始结论 `HOLD_FOR_WINDOW`;readiness 和 flag-off 证据通过,后续由用户批准进入 P2-FIN-LIVE 短窗口 | `issues/2026-05-16_22-49-05-p2-fin-payment-batch-live-decision.csv` |
| P2-FIN-LIVE | 已收口:公网短窗口受控测试 PASS;专用测试报销 `BX-20260517-0022` 付款闭环到 paid,票据 archived,AP 台账 paid,导出和审计核验通过;公网移动矩阵 6 passed,企业微信渲染矩阵 8 passed;最终 `payment_batch_v1=flag_force_off` | `issues/2026-05-16_23-42-08-p2-fin-payment-batch-live-enable.csv`、`artifacts/qa-flow/p2-fin-live-20260517-001022/summary.json`、`artifacts/qa-flow/p2-fin-live-20260517-001022/live-result.json` |
| PRELAUNCH | 已收口:正式启用前公网预回归完成;公网 readiness/PDF live OCR、远端只读基线、隔离核心业务流、PRELAUNCH 付款批次窗口、公网移动和企业微信渲染矩阵通过;最终 `payment_batch_v1=flag_force_off` | `issues/2026-05-17_00-46-49-prelaunch-production-readiness.csv`、`artifacts/qa-flow/p2-fin-live-20260517-014144/live-result.json`、`artifacts/qa-flow/p2-safe-regression-20260517-014436/summary.json`、`artifacts/prelaunch/browser-business/report.md`、`artifacts/prelaunch/browser-business-purchase-rerun/report.md` |
| CASHIER-VOUCHER-V1 | 已收口:正式启用前财务闭环与银行回单附件完成;后端 focused 回归 12 tests passed,前端 typecheck/build 通过,本地隔离 reimbursement 业务域 10 passed/1 skipped,governance 业务域 9 passed;未部署,公网 `payment_batch_v1` 未改变 | `issues/2026-05-17_09-04-37-cashier-payment-voucher-v1.csv`、`artifacts/qa-flow/business-flow-20260517-091904/summary.txt`、`artifacts/qa-flow/business-flow-20260517-092824/summary.txt` |
| CASHIER-VOUCHER-V1 | 已收口:正式启用前财务闭环与银行回单附件完成;后端 focused 回归 12 tests passed,前端 typecheck/build 通过,本地隔离 reimbursement 业务域 10 passed/1 skipped,governance 业务域 9 passed;已由 LDF 部署 | `issues/2026-05-17_09-04-37-cashier-payment-voucher-v1.csv`、`artifacts/qa-flow/business-flow-20260517-091904/summary.txt`、`artifacts/qa-flow/business-flow-20260517-092824/summary.txt` |
| LAUNCH-DEPLOY-FINANCE | 已收口:CASHV 部署和公网复检完成;本地全流程/页面门禁通过,公网 readiness/PDF live OCR、移动/企业微信矩阵和 CASHV 短窗口通过;最终 `payment_batch_v1=flag_force_off` | `issues/2026-05-17_09-38-55-launch-deploy-finance.csv`、`artifacts/qa-flow/business-flow-20260517-094407/summary.txt`、`artifacts/qa-flow/live-smoke-readiness-20260517-102904/summary.json`、`artifacts/qa-flow/p2-fin-live-20260517-103450/live-result.json` |
## 当前门禁
@@ -87,7 +89,8 @@ DCL7 已删除本文件中 R70-R91 的长流水历史,避免旧环境、旧开
| P2-FIN-LIVE-DECISION | 已完成,未部署 | `check-live-smoke-env --strict` 通过,`check-payment-batch-flag-off --json` 通过,财务/员工/admin 对付款批次公网只读访问均为 409 `payment_batch_v1_disabled / flag_force_off`;初始 `HOLD_FOR_WINDOW`,后续用户批准立即短窗口并由 P2-FIN-LIVE 承接 |
| P2-FIN-LIVE 公网短窗口 | 通过,未部署,最终关闭 | `run-p2-fin-live-window.sh` PASS:live-env strict PASS,pre flag-off PASS,公网付款批次 live spec 1 passed,移动矩阵 6 passed,企业微信渲染矩阵 8 passed,final flag-off check PASS;测试中只临时开启 `payment_batch_v1`,未开启 `erp_sync`,未接真实支付,最终恢复 409 `payment_batch_v1_disabled / flag_force_off` |
| PRELAUNCH 正式启用前预回归 | 通过,含 QA 稳定性观察项,未部署 | 公网 live readiness PASS,远端 Caddy active、compose db/server Up、Prisma migration up to date;脱敏数据清点 activeEmployees=12、activeWecomBindings=5、pendingWorkflowTasks=7;`run-p2-fin-live-window.sh` PRELAUNCH PASS,测试报销 `BX-20260517-0024` 付款闭环 paid、票据 archived、AP 台账 paid;`run-p2-safe-regression.sh` PASS。浏览器 `all` 长链路中 PDF 样票重复和采购超时按证据分流:采购分流程报告 PASS,本地隔离 procurement PASS,记录为手工 live spec 稳定性维护项,不作为业务 P0/P1 阻断。 |
| CASHIER-VOUCHER-V1 财务闭环与银行回单附件 | 通过,未部署 | 新增付款批次回单附件模型/API/PC 操作区,银行渠道执行付款前必须上传回单,复核后仍可补凭证号/付款日期/付款渠道;`prisma validate`、`node --check`、后端 focused 单测、前端 typecheck/build、隔离 reimbursement 业务流和 governance 权限直连业务流均通过。正式启用前仍需另行部署、设置 `payment_batch_v1=force_on` 并完成代账交接 SOP。 |
| CASHIER-VOUCHER-V1 财务闭环与银行回单附件 | 通过,已部署 | 新增付款批次回单附件模型/API/PC 操作区,银行渠道执行付款前必须上传回单,复核后仍可补凭证号/付款日期/付款渠道;`prisma validate`、`node --check`、后端 focused 单测、前端 typecheck/build、隔离 reimbursement 业务流和 governance 权限直连业务流均通过;已由 LDF 部署并完成公网 CASHV 短窗口复检。正式启用前仍需设置 `payment_batch_v1=force_on` 并完成代账交接 SOP。 |
| LAUNCH-DEPLOY-FINANCE 部署与公网复检 | 通过,最终关闭付款批次 | 本地业务流 auth/reimbursement/approval/leave/procurement/governance 通过,本地 PC/移动/企业微信矩阵通过;部署 commit `ab5ab4d`,`SYNC_ENV=0`,新增 migration `20260517090437_cashier_payment_receipts` 已应用,公网 readiness/PDF live OCR 通过,公网移动/企微矩阵通过;CASHV 短窗口验证无回单执行 409、回单上传/下载、付款 executed、报销 paid、票据 archived、AP 台账 paid、AP 导出 200 和审计可查;最终 `payment_batch_v1=flag_force_off`。 |
## R7EP / OPS8 / QAF8 / UX8 / P2T 预检推进
+5 -4
查看文件
@@ -48,7 +48,8 @@
| `P2-FIN-LIVE-DECISION` | `issues/2026-05-16_22-49-05-p2-fin-payment-batch-live-decision.csv` | `EVIDENCE` | 公网付款批次启用窗口决策已收口;readiness 和 flag-off 只读门禁通过,初始结论 `HOLD_FOR_WINDOW`,随后用户批准进入 `P2-FIN-LIVE` |
| `P2-FIN-LIVE` | `issues/2026-05-16_23-42-08-p2-fin-payment-batch-live-enable.csv` | `EVIDENCE` | 公网付款批次短窗口受控测试已收口;测试报销、付款批次、AP 导出和审计核验通过,最终 `payment_batch_v1=flag_force_off`,未部署 |
| `PRELAUNCH` | `issues/2026-05-17_00-46-49-prelaunch-production-readiness.csv` | `EVIDENCE` | 正式启用前公网预回归已收口;公网 readiness、远端只读基线、隔离核心业务流、付款批次 PRELAUNCH 窗口、移动/企业微信矩阵和 Go/No-Go 摘要完成;最终 `payment_batch_v1=flag_force_off`,未部署 |
| `CASHIER-VOUCHER-V1` | `issues/2026-05-17_09-04-37-cashier-payment-voucher-v1.csv` | `EVIDENCE` | 正式启用前财务闭环与银行回单附件已收口;新增付款批次银行回单附件、复核后补凭证和银行渠道执行前回单阻断;未部署,公网 `payment_batch_v1` 状态未改变 |
| `CASHIER-VOUCHER-V1` | `issues/2026-05-17_09-04-37-cashier-payment-voucher-v1.csv` | `EVIDENCE` | 正式启用前财务闭环与银行回单附件已收口;新增付款批次银行回单附件、复核后补凭证和银行渠道执行前回单阻断;已由 `LAUNCH-DEPLOY-FINANCE` 部署到公网 |
| `LAUNCH-DEPLOY-FINANCE` | `issues/2026-05-17_09-38-55-launch-deploy-finance.csv` | `EVIDENCE` | CASHV 部署与公网复检已收口;本地全流程/页面门禁、受控部署、migration 应用、公网 readiness、PDF live OCR、移动/企微矩阵和 CASHV 短窗口均通过;最终 `payment_batch_v1=flag_force_off` |
旧 Issue CSV 保留为历史审计证据:不删除、不批量回写、不移动到 `docs/archive/` 或其他归档目录。新连续合同如替代旧合同,只在新合同 `Notes` 或文档索引中说明 supersedes。
@@ -56,8 +57,8 @@
| Doc_ID | Path | Category | Authority | Status | Owner | Related_Issues | Evidence | Supersedes | Last_Audited | Audit_Method | Risk | Notes |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `IDX` | `docs/文档索引.md` | 入口索引 | 最高文档入口 | `CURRENT` | product/dev | `GOV8,QAOPS9,P2D,P2-ORG,P2-FIN-DECISION,P2-FIN-V1,P2-OCR-SAMPLE,P2Q,P2AUTO,P2AF,P2-FIN-LIVE-DECISION,P2-FIN-LIVE,PRELAUNCH,CASHIER-VOUCHER-V1` | `rg` | none | 2026-05-17 | `node scripts/qa/audit-docs.mjs --check-registry` | medium | 判断当前该读什么 |
| `REG` | `docs/文档事实源状态矩阵.md` | 文档台账 | 文档分类和状态事实源 | `CURRENT` | product/dev | `GOV8,QAOPS9,P2D,P2-ORG,P2-FIN-DECISION,P2-FIN-V1,P2-OCR-SAMPLE,P2Q,P2AUTO,P2AF,P2-FIN-LIVE-DECISION,P2-FIN-LIVE,PRELAUNCH,CASHIER-VOUCHER-V1` | `audit-docs` | none | 2026-05-17 | `audit-docs --check-registry` | medium | 判断文档权威性 |
| `IDX` | `docs/文档索引.md` | 入口索引 | 最高文档入口 | `CURRENT` | product/dev | `GOV8,QAOPS9,P2D,P2-ORG,P2-FIN-DECISION,P2-FIN-V1,P2-OCR-SAMPLE,P2Q,P2AUTO,P2AF,P2-FIN-LIVE-DECISION,P2-FIN-LIVE,PRELAUNCH,CASHIER-VOUCHER-V1,LAUNCH-DEPLOY-FINANCE` | `rg` | none | 2026-05-17 | `node scripts/qa/audit-docs.mjs --check-registry` | medium | 判断当前该读什么 |
| `REG` | `docs/文档事实源状态矩阵.md` | 文档台账 | 文档分类和状态事实源 | `CURRENT` | product/dev | `GOV8,QAOPS9,P2D,P2-ORG,P2-FIN-DECISION,P2-FIN-V1,P2-OCR-SAMPLE,P2Q,P2AUTO,P2AF,P2-FIN-LIVE-DECISION,P2-FIN-LIVE,PRELAUNCH,CASHIER-VOUCHER-V1,LAUNCH-DEPLOY-FINANCE` | `audit-docs` | none | 2026-05-17 | `audit-docs --check-registry` | medium | 判断文档权威性 |
| `PRD-MVP` | `docs/海音达OA-MVP需求规格说明书.md` | 需求事实源 | PRD 主事实源 | `CURRENT` | product | `REQ8,P2T,GOV8` | Issue CSV | `docs/requirements-specification.md` | 2026-05-13 | `rg` | high | 定义做什么、不做什么和验收口径 |
| `PRODUCT-SCOPE` | `docs/产品口径.md` | 需求事实源 | 产品边界事实源 | `CURRENT` | product | `REQ8,P2T` | `rg` | none | 2026-05-13 | `rg` | high | 记录已拍板产品边界 |
| `DESIGN-UI` | `docs/产品设计规则.md` | 设计事实源 | PC/移动/企业微信设计事实源 | `CURRENT` | design/frontend | `MIA7,MIF7,GOV8,DG8,DG9` | Playwright/视觉审查/DG8/DG9 | none | 2026-05-13 | `rg` | high | 页面改动必须读取;DG8 后飞书为主 UI/布局参考;DG9 后按页面分层和样板选型 |
@@ -162,4 +163,4 @@
- `ME6-3` 代表性企业微信真机门禁已关闭。
- MIF7-1..7 与 MIF7T 已完成本地整改、公网部署、公网匿名复检和带凭据 live smoke/OCR 复检。
- R7E 真实扩大试运行阶段验收、P2 排序、R7E 收口、QAOPS8 上线硬化阶段收口、QAOPS9 上线硬化连续合同、PRELAUNCH 正式启用前公网预回归和 CASHIER-VOUCHER-V1 财务闭环与银行回单附件均已完成,当前 P0/P1 阻断为 0;P2D 已完成决策分流,P2-ORG 只读巡检已完成且无需写修复合同;P2-FIN-LIVE 和 PRELAUNCH 均验证付款批次公网短窗口并回到 `payment_batch_v1=flag_force_off`;CASHIER-VOUCHER-V1 代码尚未部署,后续部署最新代码、正式常开付款批次和代账交接 SOP 必须另建或延续对应连续合同。
- R7E 真实扩大试运行阶段验收、P2 排序、R7E 收口、QAOPS8 上线硬化阶段收口、QAOPS9 上线硬化连续合同、PRELAUNCH 正式启用前公网预回归、CASHIER-VOUCHER-V1 财务闭环与银行回单附件以及 LAUNCH-DEPLOY-FINANCE 部署复检均已完成,当前 P0/P1 阻断为 0;P2D 已完成决策分流,P2-ORG 只读巡检已完成且无需写修复合同;P2-FIN-LIVE、PRELAUNCH 和 LDF 均验证付款批次公网短窗口并回到 `payment_batch_v1=flag_force_off`;后续正式常开付款批次和代账交接 SOP 必须另建或延续对应连续合同。
+5 -3
查看文件
@@ -20,7 +20,7 @@
## 最近事实源链
R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> MIF7/MIF7T(公网部署与带凭据公网复检已收口) -> DG8 -> DG9 -> R7E -> FBA -> QAOPS9/P2D -> P2-ORG -> P2-FIN-DECISION -> P2-FIN-V1 -> P2-OCR-SAMPLE -> P2Q -> P2AUTO -> P2AF -> P2-FIN-LIVE-DECISION -> P2-FIN-LIVE -> PRELAUNCH -> CASHIER-VOUCHER-V1。
R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> MIF7/MIF7T(公网部署与带凭据公网复检已收口) -> DG8 -> DG9 -> R7E -> FBA -> QAOPS9/P2D -> P2-ORG -> P2-FIN-DECISION -> P2-FIN-V1 -> P2-OCR-SAMPLE -> P2Q -> P2AUTO -> P2AF -> P2-FIN-LIVE-DECISION -> P2-FIN-LIVE -> PRELAUNCH -> CASHIER-VOUCHER-V1 -> LAUNCH-DEPLOY-FINANCE。
- R6、PC6、PA6、FL6、AP6、RI6、LP6 已完成并部署。
- ME6 自动化、公网视觉矩阵和 `ME6-3` 代表性企业微信真机门禁已完成。
@@ -42,7 +42,8 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M
- P2-FIN-LIVE-DECISION 是 P2AF 后付款批次公网启用窗口决策合同:公网 readiness 和 flag-off 只读门禁通过,初始结论为 `HOLD_FOR_WINDOW`;随后用户批准立即短窗口、现有 live smoke 测试账号和新建测试报销,已进入并完成 `P2-FIN-LIVE`。
- P2-FIN-LIVE 已按用户批准完成公网付款批次短窗口受控测试:使用 live smoke 测试账号新建专用测试报销,临时打开 `payment_batch_v1`,完成创建/复核/执行、AP 导出和审计核验后强制回到 `flag_force_off`;不部署、不接真实支付、不写 ERP 实时凭证,不开放图片 OCR。
- PRELAUNCH 是未正式使用前的正式启用准备合同:公网作为准生产预启用环境承载带 `PRELAUNCH` marker 的测试数据和自动化回归;公网 readiness、远端只读基线、隔离核心业务流、付款批次 PRELAUNCH 窗口、移动/企业微信自动化和 Go/No-Go 摘要已完成。最终 `payment_batch_v1=flag_force_off`,未部署、不接真实支付、不写 ERP 实时凭证、不开放图片 OCR;采购公网手工 live spec 长等待/退出码问题作为 QA 自动化稳定性维护项。
- CASHIER-VOUCHER-V1 是正式启用前财务闭环与代账交接第一轮实现合同:基于“无 ERP/独立财务系统、只有代账”的业务事实,将付款闭环固定为 OA 内审批/台账/付款批次 + 银行对公付款回单附件 + 月度代账交接;已新增批次级银行回单附件模型/API/PC 操作区、复核后补凭证和银行渠道执行前回单阻断,未部署,公网 `payment_batch_v1` 状态未改变,不接真实支付、不写 ERP、不开放图片 OCR、不导入银行流水。
- CASHIER-VOUCHER-V1 是正式启用前财务闭环与代账交接第一轮实现合同:基于“无 ERP/独立财务系统、只有代账”的业务事实,将付款闭环固定为 OA 内审批/台账/付款批次 + 银行对公付款回单附件 + 月度代账交接;已新增批次级银行回单附件模型/API/PC 操作区、复核后补凭证和银行渠道执行前回单阻断,代码已由 `LAUNCH-DEPLOY-FINANCE` 部署到公网,不接真实支付、不写 ERP、不开放图片 OCR、不导入银行流水。
- LAUNCH-DEPLOY-FINANCE 是 CASHIER-VOUCHER-V1 后的部署与公网复检合同:先完成本地基础门禁、业务流、PC/移动/企业微信页面矩阵,再以 `SYNC_ENV=0` 部署到 `https://oa.hyinda.com`;新增银行回单附件 migration 已应用,公网 readiness、PDF live OCR、移动/企业微信矩阵和 CASHV 短窗口均通过,最终 `payment_batch_v1=flag_force_off`,正式常开仍需 `FIN-PROD-ENABLE`。
## 当前活跃治理流
@@ -71,7 +72,8 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M
| `P2-FIN-LIVE-DECISION` | `issues/2026-05-16_22-49-05-p2-fin-payment-batch-live-decision.csv` | 已收口:公网启用窗口决策完成,初始结论 `HOLD_FOR_WINDOW`,后续用户批准并进入 `P2-FIN-LIVE` | 公网 readiness、付款批次 flag-off 只读门禁、窗口/参与人/回滚联系人/测试数据前置、后续 P2-FIN-LIVE 启动条件 | 不在决策合同中打开公网 `payment_batch_v1`、不写付款批次、不部署、不接真实支付、不写 ERP 实时凭证 |
| `P2-FIN-LIVE` | `issues/2026-05-16_23-42-08-p2-fin-payment-batch-live-enable.csv` | 已收口:公网短窗口付款批次受控测试通过,最终 `payment_batch_v1=flag_force_off` | 公网测试报销、PDF 样票绑定、审批到 approved、付款批次创建/复核/执行、AP 导出审计、权限边界、移动/企业微信自动化 | 不保持公网开启、不部署、不接真实支付、不写 ERP 实时凭证、不开放图片 OCR |
| `PRELAUNCH` | `issues/2026-05-17_00-46-49-prelaunch-production-readiness.csv` | 已收口:正式启用前公网预回归完成,最终 `payment_batch_v1=flag_force_off` | 公网环境基线、远端只读状态、PRELAUNCH 测试数据、核心业务自动化、付款批次公网窗口、移动/企业微信矩阵、启用范围和 Go/No-Go 摘要 | 不部署、不执行生产恢复、不重置数据库、不打印远端 env、不接真实支付、不写 ERP 实时凭证、不开放图片 OCR |
| `CASHIER-VOUCHER-V1` | `issues/2026-05-17_09-04-37-cashier-payment-voucher-v1.csv` | 已收口:正式启用前财务闭环与银行回单附件完成,未部署 | 付款批次银行回单附件、复核后补凭证、银行渠道执行前回单阻断、管理员复核审计、出纳执行、代账交接前置 | 不接真实支付、不接 ERP、不开放图片 OCR、不导入银行流水、不部署 |
| `CASHIER-VOUCHER-V1` | `issues/2026-05-17_09-04-37-cashier-payment-voucher-v1.csv` | 已收口:正式启用前财务闭环与银行回单附件完成,已由 LDF 部署 | 付款批次银行回单附件、复核后补凭证、银行渠道执行前回单阻断、管理员复核审计、出纳执行、代账交接前置 | 不接真实支付、不接 ERP、不开放图片 OCR、不导入银行流水 |
| `LAUNCH-DEPLOY-FINANCE` | `issues/2026-05-17_09-38-55-launch-deploy-finance.csv` | 已收口:CASHV 部署与公网复检完成,最终 `payment_batch_v1=flag_force_off` | 本地全流程/页面门禁、受控部署、migration 应用、公网 readiness、PDF live OCR、移动/企微矩阵、CASHV 公网短窗口 | 不正式常开付款批次、不接真实支付、不接 ERP、不开放图片 OCR、不重置数据库 |
旧 Issue CSV 不删除、不批量回写、不移动到归档目录。若新治理流替代旧合同,只在新 CSV 的 `Notes` 或本索引说明 supersedes,旧文件保留历史审计语义。
@@ -3,7 +3,7 @@
"LDF-1","本地基础代码门禁","部署前先跑后端、前端、迁移和 CASHV focused 门禁,确认最新代码可构建、可迁移、可回归。","1) 工作区干净或仅本合同变更;2) prisma validate 通过;3) paymentBatches/apOperations/exports node --check 通过;4) paymentBatches/exports/financeLedger focused 单测通过;5) client typecheck/build 通过;6) git diff --check 通过。","受影响流程:付款批次回单附件、AP 台账、导出、报销付款、前端付款批次页;验证步骤:cd server && npm run prisma:validate;cd server && node --check src/routes/paymentBatches.js src/routes/apOperations.js src/routes/exports.js;cd server && npm test -- tests/unit/routes/paymentBatches.reimbursement.test.js tests/unit/routes/exports.apOperations.test.js tests/unit/services/financeLedger.test.js;cd client && npm run typecheck && npm run build;git diff --check。","npm|node|git","DONE","DONE","DONE","server/prisma/schema.prisma|server/prisma/migrations/20260517090437_cashier_payment_receipts/migration.sql|server/src/routes/paymentBatches.js|client/src/pages/PaymentBatchesPage.tsx|client/src/api/paymentBatches.ts","[""LDF-0""]","完成:prisma validate PASS;paymentBatches/apOperations/exports node --check PASS;focused 单测 3 files/12 tests passed;client typecheck/build PASS;仅本合同 CSV 为未提交变更。"
"LDF-2","本地正式启用范围业务流回归","在本地隔离临时库跑正式启用范围业务流,覆盖 PC 业务、审批、报销、付款批次回单、请假、采购、权限和企业微信入口自动化。","1) auth、reimbursement、approval、leave、procurement、governance 均通过;2) reimbursement 覆盖付款批次银行回单上传后执行;3) 权限直连无越权;4) 报告写入 artifacts/qa-flow;5) 如扩展模块失败但不属正式启用范围,必须记录为后续维护项,不能阻断本合同部署。","受影响流程:登录/企业微信入口 -> 报销/PDF OCR/mock -> 审批 -> 付款批次回单 -> 请假 -> 采购 -> 权限直连;验证步骤:QA_ISSUE_ID=LDF BUSINESS_FLOW_GROUPS=auth,reimbursement,approval,leave,procurement,governance bash scripts/qa/run-business-flow-gates.sh local。","bash|playwright","DONE","DONE","DONE","scripts/qa/run-business-flow-gates.sh|client/tests/e2e","[""LDF-1""]","完成:报告 artifacts/qa-flow/business-flow-20260517-094407/summary.txt;auth 12 passed;reimbursement 10 passed/1 skipped,含付款批次银行回单上传后执行;approval 3 passed;leave 6 passed;procurement 1 passed;governance 9 passed。"
"LDF-3","本地 PC、移动和企业微信页面矩阵","部署前跑本地 PC/移动/企业微信 UA 页面矩阵,确认页面布局、导航、移动入口和企业微信渲染无阻断。","1) 项目级视觉或核心页面矩阵通过;2) 移动 320/360/375/390/393/414/430 视口矩阵通过;3) 企业微信 UA/渲染矩阵通过;4) 无横向滚动、PC 壳误入移动页或关键按钮遮挡;5) 视觉报告或 Playwright 结果可追溯。","受影响流程:PC 工作台/财务/审批/报销页面,/mobile 首页、报销、审批、请假、采购、通知、企业微信 UA;验证步骤:QA_ISSUE_ID=LDF bash scripts/qa/run-web-gates.sh qg6-visual-matrix-local;cd client && E2E_BASE_URL=<local-url> npx playwright test tests/e2e/dg7-mobile-information-dedupe.spec.ts tests/e2e/r124-mobile-entry-matrix.spec.ts tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts --workers=1 --reporter=list 或采用同等本地报告。","bash|playwright","DONE","DONE","DONE","client/src/layouts/AppShellLayout.tsx|client/src/lib/runtimeContext.ts|client/tests/e2e/r110-mobile-pc-routing.spec.ts|client/tests/e2e|scripts/qa/run-web-gates.sh","[""LDF-1""]","完成:QG6 视觉矩阵 PASS,报告 artifacts/qa-flow/LDF-visual-matrix-20260517-095505/summary.json;R108 移动企微视觉 PASS,修复 /mobile/approvals?taskId 深层页底部导航遮挡;R109 移动报销反馈 PASS;R110 手机/PC 路由分流 PASS,补充 /leave-requests?action=create -> /mobile/leave?view=form,普通 /leave-requests 保持请假记录默认视图;自动化不能替代未来真实企业微信最终确认。"
"LDF-4","受控部署最新代码到公网","本地门禁通过后,用部署脚本把 ab80d48 及本合同回填提交部署到公网,应用新增回单附件 migration,保持远端 env 不覆盖。","1) 部署脚本成功;2) 远端 compose config、init、Prisma migrate status、/ready、external deps smoke、runtime smoke 均通过;3) SYNC_ENV=0;4) 不打印远端 env 或 secret;5) 不执行数据库重置或生产恢复。","受影响流程:公网运行时、Prisma migration、Caddy 反代后的 OA 服务;验证步骤:SYNC_ENV=0 bash deploy/trialrun/deploy.sh;部署脚本内置 /ready、external deps smoke、runtime smoke 和 public bundle 检查。","bash|ssh|rsync|docker","TODO","TODO","TODO","deploy/trialrun/deploy.sh|server/prisma/migrations/20260517090437_cashier_payment_receipts/migration.sql","[""LDF-2"",""LDF-3""]","如部署失败,停止公网业务验证并保留部署日志;不做数据库重置。"
"LDF-5","公网部署后 readiness 与核心业务复检","部署后先跑公网 readiness、public bundle、live smoke、PDF live OCR 和移动/企业微信自动化,确认公网系统基础可用。","1) /ready 通过;2) public bundle 文案扫描通过;3) live smoke 和 PDF live OCR 通过或可解释 SKIP;4) 公网移动矩阵通过;5) 企业微信 UA/渲染矩阵通过。","受影响流程:公网登录、企业微信配置、PDF OCR、移动入口、企业微信 UA;验证步骤:set -a && source ~/.hyb-oa/live-smoke.env && set +a;QA_ISSUE_ID=LDF LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-live-smoke-readiness.sh;cd client && E2E_BASE_URL=https://oa.hyinda.com npx playwright test tests/e2e/dg7-mobile-information-dedupe.spec.ts tests/e2e/r124-mobile-entry-matrix.spec.ts tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts --workers=1 --reporter=list。","bash|node|playwright","TODO","TODO","TODO","scripts/qa/run-live-smoke-readiness.sh|client/tests/e2e","[""LDF-4""]","公网真实企业微信真机最终确认可在 FIN-PROD-ENABLE 或启用公告前补。"
"LDF-6","公网 CASHV 受控验证","部署后用公网测试账号短窗口验证新回单附件能力:创建测试报销、审批、临时开启 payment_batch_v1、上传银行回单、执行付款、核验 AP/审计,并最终恢复关闭态。","1) 只使用测试账号和测试报销;2) 回单附件上传/下载或列表可用;3) 银行渠道执行前回单阻断已覆盖;4) 付款批次执行后报销 paid、票据 archived、AP 台账 paid、审计可查;5) 最终 payment_batch_v1 恢复 force_off,除非另有 FIN-PROD-ENABLE 批准。","受影响流程:公网报销审批 -> 出纳付款批次 -> 管理员/复核 -> 银行回单 -> OA 已付款标记 -> AP 导出/审计 -> flag 回滚;验证步骤:P2_FIN_LIVE_APPROVED=1 QA_ISSUE_ID=LDF P2_FIN_LIVE_MARKER_PREFIX=LDF LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-p2-fin-live-window.sh;必要时补手工确认回单附件区和审计动作。","bash|playwright","TODO","TODO","TODO","scripts/qa/run-p2-fin-live-window.sh|client/tests/e2e/manual/p2-fin-live-payment-batch.spec.ts|client/src/pages/PaymentBatchesPage.tsx","[""LDF-5""]","本合同只做部署后受控测试,默认最终关闭 payment_batch_v1;正式常开另建 FIN-PROD-ENABLE。"
"LDF-7","收口回填与提交","回填 LDF CSV、文档索引、事实源矩阵和人工试运行报告,提交中文 commit,明确部署状态和下一步 FIN-PROD-ENABLE/ACCOUNTING-HANDOFF-V1。","1) CSV 状态按证据回填;2) docs/文档索引.md、docs/文档事实源状态矩阵.md、docs/trialrun/人工试运行报告.md 更新;3) validate、audit-docs、rg、git diff --check 通过;4) 中文 commit 引用 LDF;5) 最终说明公网 commit、/ready、public bundle、live smoke、付款批次最终 flag 状态。","流程级验证:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-17_09-38-55-launch-deploy-finance.csv;node scripts/qa/audit-docs.mjs --check-registry;rg -n 'LDF|LAUNCH-DEPLOY-FINANCE|CASHIER-VOUCHER|银行回单|payment_batch_v1|FIN-PROD-ENABLE|ACCOUNTING-HANDOFF' docs issues;git diff --check;git status --short。","python3|node|rg|git","TODO","TODO","TODO","issues/2026-05-17_09-38-55-launch-deploy-finance.csv|docs/文档索引.md|docs/文档事实源状态矩阵.md|docs/trialrun/人工试运行报告.md","[""LDF-6""]","none"
"LDF-4","受控部署最新代码到公网","本地门禁通过后,用部署脚本把 ab80d48 及本合同回填提交部署到公网,应用新增回单附件 migration,保持远端 env 不覆盖。","1) 部署脚本成功;2) 远端 compose config、init、Prisma migrate status、/ready、external deps smoke、runtime smoke 均通过;3) SYNC_ENV=0;4) 不打印远端 env 或 secret;5) 不执行数据库重置或生产恢复。","受影响流程:公网运行时、Prisma migration、Caddy 反代后的 OA 服务;验证步骤:SYNC_ENV=0 bash deploy/trialrun/deploy.sh;部署脚本内置 /ready、external deps smoke、runtime smoke 和 public bundle 检查。","bash|ssh|rsync|docker","DONE","DONE","DONE","deploy/trialrun/deploy.sh|server/prisma/migrations/20260517090437_cashier_payment_receipts/migration.sql","[""LDF-2"",""LDF-3""]","完成:首次部署镜像构建成功但 Prisma status 发现 20260517090437_cashier_payment_receipts 未应用并安全停止;已修复 deploy.sh 使 init 显式执行 migrate/seed;重跑 SYNC_ENV=0 部署 PASS,远端 env 未同步,migration 应用成功,Prisma status up to date,部署后 live smoke 3 passed,public bundle scanned=57 focused=4 findings=0;部署 commit ab5ab4d。"
"LDF-5","公网部署后 readiness 与核心业务复检","部署后先跑公网 readiness、public bundle、live smoke、PDF live OCR 和移动/企业微信自动化,确认公网系统基础可用。","1) /ready 通过;2) public bundle 文案扫描通过;3) live smoke 和 PDF live OCR 通过或可解释 SKIP;4) 公网移动矩阵通过;5) 企业微信 UA/渲染矩阵通过。","受影响流程:公网登录、企业微信配置、PDF OCR、移动入口、企业微信 UA;验证步骤:set -a && source ~/.hyb-oa/live-smoke.env && set +a;QA_ISSUE_ID=LDF LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-live-smoke-readiness.sh;cd client && E2E_BASE_URL=https://oa.hyinda.com npx playwright test tests/e2e/dg7-mobile-information-dedupe.spec.ts tests/e2e/r124-mobile-entry-matrix.spec.ts tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts --workers=1 --reporter=list。","bash|node|playwright","DONE","DONE","DONE","scripts/qa/run-live-smoke-readiness.sh|client/tests/e2e","[""LDF-4""]","完成:报告 artifacts/qa-flow/live-smoke-readiness-20260517-102904;publicReady=true,wecom=ready,liveSmokeReady=true,liveOcrReady=true;public bundle scanned=57 focused=4 findings=0;live smoke 3 passed;真实 PDF OCR 1 passed,样票重复为可解释终态;pending OCR 因本地 DATABASE_URL 未注入按规则 SKIP;公网移动/企业微信 UA 组合 14 passed,覆盖 320/360/375/390/393/414/430。"
"LDF-6","公网 CASHV 受控验证","部署后用公网测试账号短窗口验证新回单附件能力:创建测试报销、审批、临时开启 payment_batch_v1、上传银行回单、执行付款、核验 AP/审计,并最终恢复关闭态。","1) 只使用测试账号和测试报销;2) 回单附件上传/下载或列表可用;3) 银行渠道执行前回单阻断已覆盖;4) 付款批次执行后报销 paid、票据 archived、AP 台账 paid、审计可查;5) 最终 payment_batch_v1 恢复 force_off,除非另有 FIN-PROD-ENABLE 批准。","受影响流程:公网报销审批 -> 出纳付款批次 -> 管理员/复核 -> 银行回单 -> OA 已付款标记 -> AP 导出/审计 -> flag 回滚;验证步骤:P2_FIN_LIVE_APPROVED=1 QA_ISSUE_ID=LDF P2_FIN_LIVE_MARKER_PREFIX=LDF LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-p2-fin-live-window.sh;必要时补手工确认回单附件区和审计动作。","bash|playwright","DONE","DONE","DONE","scripts/qa/run-p2-fin-live-window.sh|client/tests/e2e/manual/p2-fin-live-payment-batch.spec.ts|client/src/pages/PaymentBatchesPage.tsx","[""LDF-5""]","完成:报告 artifacts/qa-flow/p2-fin-live-20260517-103450;pre flag-off PASS;临时 force_on 后测试报销 BX-20260517-0025 审批到 approved;银行渠道无回单执行返回 409;回单上传成功、列表命中、下载 200;付款批次 executed,报销 paid,票据 archived,AP 台账 paid,AP 导出 200,PAYMENT_BATCH_RECEIPT_UPLOADED/PAYMENT_BATCH_EXECUTED/REIMBURSEMENT_PAYMENT_MARKED/EXPORT_AP_OPERATIONS 审计可查;公网移动矩阵 6 passed、企业微信渲染矩阵 8 passed;最终 payment_batch_v1=flag_force_off。"
"LDF-7","收口回填与提交","回填 LDF CSV、文档索引、事实源矩阵和人工试运行报告,提交中文 commit,明确部署状态和下一步 FIN-PROD-ENABLE/ACCOUNTING-HANDOFF-V1。","1) CSV 状态按证据回填;2) docs/文档索引.md、docs/文档事实源状态矩阵.md、docs/trialrun/人工试运行报告.md 更新;3) validate、audit-docs、rg、git diff --check 通过;4) 中文 commit 引用 LDF;5) 最终说明公网 commit、/ready、public bundle、live smoke、付款批次最终 flag 状态。","流程级验证:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-17_09-38-55-launch-deploy-finance.csv;node scripts/qa/audit-docs.mjs --check-registry;rg -n 'LDF|LAUNCH-DEPLOY-FINANCE|CASHIER-VOUCHER|银行回单|payment_batch_v1|FIN-PROD-ENABLE|ACCOUNTING-HANDOFF' docs issues;git diff --check;git status --short。","python3|node|rg|git","DONE","DONE","DONE","issues/2026-05-17_09-38-55-launch-deploy-finance.csv|docs/文档索引.md|docs/文档事实源状态矩阵.md|docs/trialrun/人工试运行报告.md|client/tests/e2e/manual/p2-fin-live-payment-batch.spec.ts","[""LDF-6""]","完成:CSV、索引、事实源矩阵和人工试运行报告已回填;部署 commit ab5ab4d;公网 https://oa.hyinda.com /ready、public bundle、live smoke、PDF live OCR、移动/企微矩阵和 CASHV 短窗口均通过;最终 payment_batch_v1=flag_force_off;下一步为 FIN-PROD-ENABLE 正式常开和 ACCOUNTING-HANDOFF-V1 代账交接 SOP。"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
3 LDF-1 本地基础代码门禁 部署前先跑后端、前端、迁移和 CASHV focused 门禁,确认最新代码可构建、可迁移、可回归。 1) 工作区干净或仅本合同变更;2) prisma validate 通过;3) paymentBatches/apOperations/exports node --check 通过;4) paymentBatches/exports/financeLedger focused 单测通过;5) client typecheck/build 通过;6) git diff --check 通过。 受影响流程:付款批次回单附件、AP 台账、导出、报销付款、前端付款批次页;验证步骤:cd server && npm run prisma:validate;cd server && node --check src/routes/paymentBatches.js src/routes/apOperations.js src/routes/exports.js;cd server && npm test -- tests/unit/routes/paymentBatches.reimbursement.test.js tests/unit/routes/exports.apOperations.test.js tests/unit/services/financeLedger.test.js;cd client && npm run typecheck && npm run build;git diff --check。 npm|node|git DONE DONE DONE server/prisma/schema.prisma|server/prisma/migrations/20260517090437_cashier_payment_receipts/migration.sql|server/src/routes/paymentBatches.js|client/src/pages/PaymentBatchesPage.tsx|client/src/api/paymentBatches.ts ["LDF-0"] 完成:prisma validate PASS;paymentBatches/apOperations/exports node --check PASS;focused 单测 3 files/12 tests passed;client typecheck/build PASS;仅本合同 CSV 为未提交变更。
4 LDF-2 本地正式启用范围业务流回归 在本地隔离临时库跑正式启用范围业务流,覆盖 PC 业务、审批、报销、付款批次回单、请假、采购、权限和企业微信入口自动化。 1) auth、reimbursement、approval、leave、procurement、governance 均通过;2) reimbursement 覆盖付款批次银行回单上传后执行;3) 权限直连无越权;4) 报告写入 artifacts/qa-flow;5) 如扩展模块失败但不属正式启用范围,必须记录为后续维护项,不能阻断本合同部署。 受影响流程:登录/企业微信入口 -> 报销/PDF OCR/mock -> 审批 -> 付款批次回单 -> 请假 -> 采购 -> 权限直连;验证步骤:QA_ISSUE_ID=LDF BUSINESS_FLOW_GROUPS=auth,reimbursement,approval,leave,procurement,governance bash scripts/qa/run-business-flow-gates.sh local。 bash|playwright DONE DONE DONE scripts/qa/run-business-flow-gates.sh|client/tests/e2e ["LDF-1"] 完成:报告 artifacts/qa-flow/business-flow-20260517-094407/summary.txt;auth 12 passed;reimbursement 10 passed/1 skipped,含付款批次银行回单上传后执行;approval 3 passed;leave 6 passed;procurement 1 passed;governance 9 passed。
5 LDF-3 本地 PC、移动和企业微信页面矩阵 部署前跑本地 PC/移动/企业微信 UA 页面矩阵,确认页面布局、导航、移动入口和企业微信渲染无阻断。 1) 项目级视觉或核心页面矩阵通过;2) 移动 320/360/375/390/393/414/430 视口矩阵通过;3) 企业微信 UA/渲染矩阵通过;4) 无横向滚动、PC 壳误入移动页或关键按钮遮挡;5) 视觉报告或 Playwright 结果可追溯。 受影响流程:PC 工作台/财务/审批/报销页面,/mobile 首页、报销、审批、请假、采购、通知、企业微信 UA;验证步骤:QA_ISSUE_ID=LDF bash scripts/qa/run-web-gates.sh qg6-visual-matrix-local;cd client && E2E_BASE_URL=<local-url> npx playwright test tests/e2e/dg7-mobile-information-dedupe.spec.ts tests/e2e/r124-mobile-entry-matrix.spec.ts tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts --workers=1 --reporter=list 或采用同等本地报告。 bash|playwright DONE DONE DONE client/src/layouts/AppShellLayout.tsx|client/src/lib/runtimeContext.ts|client/tests/e2e/r110-mobile-pc-routing.spec.ts|client/tests/e2e|scripts/qa/run-web-gates.sh ["LDF-1"] 完成:QG6 视觉矩阵 PASS,报告 artifacts/qa-flow/LDF-visual-matrix-20260517-095505/summary.json;R108 移动企微视觉 PASS,修复 /mobile/approvals?taskId 深层页底部导航遮挡;R109 移动报销反馈 PASS;R110 手机/PC 路由分流 PASS,补充 /leave-requests?action=create -> /mobile/leave?view=form,普通 /leave-requests 保持请假记录默认视图;自动化不能替代未来真实企业微信最终确认。
6 LDF-4 受控部署最新代码到公网 本地门禁通过后,用部署脚本把 ab80d48 及本合同回填提交部署到公网,应用新增回单附件 migration,保持远端 env 不覆盖。 1) 部署脚本成功;2) 远端 compose config、init、Prisma migrate status、/ready、external deps smoke、runtime smoke 均通过;3) SYNC_ENV=0;4) 不打印远端 env 或 secret;5) 不执行数据库重置或生产恢复。 受影响流程:公网运行时、Prisma migration、Caddy 反代后的 OA 服务;验证步骤:SYNC_ENV=0 bash deploy/trialrun/deploy.sh;部署脚本内置 /ready、external deps smoke、runtime smoke 和 public bundle 检查。 bash|ssh|rsync|docker TODO DONE TODO DONE TODO DONE deploy/trialrun/deploy.sh|server/prisma/migrations/20260517090437_cashier_payment_receipts/migration.sql ["LDF-2","LDF-3"] 如部署失败,停止公网业务验证并保留部署日志;不做数据库重置。 完成:首次部署镜像构建成功但 Prisma status 发现 20260517090437_cashier_payment_receipts 未应用并安全停止;已修复 deploy.sh 使 init 显式执行 migrate/seed;重跑 SYNC_ENV=0 部署 PASS,远端 env 未同步,migration 应用成功,Prisma status up to date,部署后 live smoke 3 passed,public bundle scanned=57 focused=4 findings=0;部署 commit ab5ab4d。
7 LDF-5 公网部署后 readiness 与核心业务复检 部署后先跑公网 readiness、public bundle、live smoke、PDF live OCR 和移动/企业微信自动化,确认公网系统基础可用。 1) /ready 通过;2) public bundle 文案扫描通过;3) live smoke 和 PDF live OCR 通过或可解释 SKIP;4) 公网移动矩阵通过;5) 企业微信 UA/渲染矩阵通过。 受影响流程:公网登录、企业微信配置、PDF OCR、移动入口、企业微信 UA;验证步骤:set -a && source ~/.hyb-oa/live-smoke.env && set +a;QA_ISSUE_ID=LDF LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-live-smoke-readiness.sh;cd client && E2E_BASE_URL=https://oa.hyinda.com npx playwright test tests/e2e/dg7-mobile-information-dedupe.spec.ts tests/e2e/r124-mobile-entry-matrix.spec.ts tests/e2e/r6-wecom-mobile-rendering-hardening.spec.ts --workers=1 --reporter=list。 bash|node|playwright TODO DONE TODO DONE TODO DONE scripts/qa/run-live-smoke-readiness.sh|client/tests/e2e ["LDF-4"] 公网真实企业微信真机最终确认可在 FIN-PROD-ENABLE 或启用公告前补。 完成:报告 artifacts/qa-flow/live-smoke-readiness-20260517-102904;publicReady=true,wecom=ready,liveSmokeReady=true,liveOcrReady=true;public bundle scanned=57 focused=4 findings=0;live smoke 3 passed;真实 PDF OCR 1 passed,样票重复为可解释终态;pending OCR 因本地 DATABASE_URL 未注入按规则 SKIP;公网移动/企业微信 UA 组合 14 passed,覆盖 320/360/375/390/393/414/430。
8 LDF-6 公网 CASHV 受控验证 部署后用公网测试账号短窗口验证新回单附件能力:创建测试报销、审批、临时开启 payment_batch_v1、上传银行回单、执行付款、核验 AP/审计,并最终恢复关闭态。 1) 只使用测试账号和测试报销;2) 回单附件上传/下载或列表可用;3) 银行渠道执行前回单阻断已覆盖;4) 付款批次执行后报销 paid、票据 archived、AP 台账 paid、审计可查;5) 最终 payment_batch_v1 恢复 force_off,除非另有 FIN-PROD-ENABLE 批准。 受影响流程:公网报销审批 -> 出纳付款批次 -> 管理员/复核 -> 银行回单 -> OA 已付款标记 -> AP 导出/审计 -> flag 回滚;验证步骤:P2_FIN_LIVE_APPROVED=1 QA_ISSUE_ID=LDF P2_FIN_LIVE_MARKER_PREFIX=LDF LIVE_SMOKE_BASE_URL=https://oa.hyinda.com bash scripts/qa/run-p2-fin-live-window.sh;必要时补手工确认回单附件区和审计动作。 bash|playwright TODO DONE TODO DONE TODO DONE scripts/qa/run-p2-fin-live-window.sh|client/tests/e2e/manual/p2-fin-live-payment-batch.spec.ts|client/src/pages/PaymentBatchesPage.tsx ["LDF-5"] 本合同只做部署后受控测试,默认最终关闭 payment_batch_v1;正式常开另建 FIN-PROD-ENABLE。 完成:报告 artifacts/qa-flow/p2-fin-live-20260517-103450;pre flag-off PASS;临时 force_on 后测试报销 BX-20260517-0025 审批到 approved;银行渠道无回单执行返回 409;回单上传成功、列表命中、下载 200;付款批次 executed,报销 paid,票据 archived,AP 台账 paid,AP 导出 200,PAYMENT_BATCH_RECEIPT_UPLOADED/PAYMENT_BATCH_EXECUTED/REIMBURSEMENT_PAYMENT_MARKED/EXPORT_AP_OPERATIONS 审计可查;公网移动矩阵 6 passed、企业微信渲染矩阵 8 passed;最终 payment_batch_v1=flag_force_off。
9 LDF-7 收口回填与提交 回填 LDF CSV、文档索引、事实源矩阵和人工试运行报告,提交中文 commit,明确部署状态和下一步 FIN-PROD-ENABLE/ACCOUNTING-HANDOFF-V1。 1) CSV 状态按证据回填;2) docs/文档索引.md、docs/文档事实源状态矩阵.md、docs/trialrun/人工试运行报告.md 更新;3) validate、audit-docs、rg、git diff --check 通过;4) 中文 commit 引用 LDF;5) 最终说明公网 commit、/ready、public bundle、live smoke、付款批次最终 flag 状态。 流程级验证:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-17_09-38-55-launch-deploy-finance.csv;node scripts/qa/audit-docs.mjs --check-registry;rg -n 'LDF|LAUNCH-DEPLOY-FINANCE|CASHIER-VOUCHER|银行回单|payment_batch_v1|FIN-PROD-ENABLE|ACCOUNTING-HANDOFF' docs issues;git diff --check;git status --short。 python3|node|rg|git TODO DONE TODO DONE TODO DONE issues/2026-05-17_09-38-55-launch-deploy-finance.csv|docs/文档索引.md|docs/文档事实源状态矩阵.md|docs/trialrun/人工试运行报告.md issues/2026-05-17_09-38-55-launch-deploy-finance.csv|docs/文档索引.md|docs/文档事实源状态矩阵.md|docs/trialrun/人工试运行报告.md|client/tests/e2e/manual/p2-fin-live-payment-batch.spec.ts ["LDF-6"] none 完成:CSV、索引、事实源矩阵和人工试运行报告已回填;部署 commit ab5ab4d;公网 https://oa.hyinda.com /ready、public bundle、live smoke、PDF live OCR、移动/企微矩阵和 CASHV 短窗口均通过;最终 payment_batch_v1=flag_force_off;下一步为 FIN-PROD-ENABLE 正式常开和 ACCOUNTING-HANDOFF-V1 代账交接 SOP。