test(R12-1/P25-6/P26-6/P28-6/P24-6/P29-6): 收口E2E基线与特性矩阵

关联 Issue: R12-1, P25-6, P26-6, P28-6, P24-6, P29-6
这个提交包含在:
2026-03-21 18:04:10 +08:00
父节点 9905c1c79d
当前提交 0826693a8f
共修改 5 个文件,包含 24 行新增和 9 行删除
+1 -1
查看文件
@@ -8,7 +8,7 @@ async function login(page: Page, user: { identifier: string; password: string })
await page.getByTestId("login-identifier").fill(user.identifier);
await page.getByTestId("login-password").fill(user.password);
await page.getByTestId("login-submit").click();
await expect(page).toHaveURL(/\/dashboard/);
await expect(page).toHaveURL(/\/portal/);
}
async function logout(page: Page, userDisplayName: string) {
+1 -1
查看文件
@@ -77,7 +77,7 @@ export async function login(page: Page, user: E2EUser) {
await page.getByTestId("login-identifier").fill(user.identifier);
await page.getByTestId("login-password").fill(user.password);
await page.getByTestId("login-submit").click();
await expect(page).toHaveURL(/\/dashboard/);
await expect(page).toHaveURL(/\/portal/);
}
export async function logout(page: Page, userDisplayName: string) {
+11 -6
查看文件
@@ -9,7 +9,7 @@ async function login(page: Page, user: { identifier: string; password: string })
await page.getByTestId("login-identifier").fill(user.identifier);
await page.getByTestId("login-password").fill(user.password);
await page.getByTestId("login-submit").click();
await expect(page).toHaveURL(/\/dashboard/);
await expect(page).toHaveURL(/\/portal/);
}
async function logout(page: Page, userDisplayName: string) {
@@ -31,15 +31,20 @@ test("E2E 主链路:登录→报销→待办审批→票据OCR→支付→登
await login(page, EMPLOYEE);
await page.getByRole("link", { name: "我的报销" }).click();
const createResponsePromise = page.waitForResponse((response) => {
const url = new URL(response.url());
return response.request().method() === "POST" && url.pathname === "/api/reimbursements" && response.ok();
});
await page.getByTestId("reimbursements-create").click();
await expect(page.getByTestId("reimbursements-table")).toBeVisible();
const firstRow = page.getByTestId("reimbursements-table").getByTestId("reimbursement-row").first();
await expect(firstRow).toBeVisible();
await firstRow.getByTestId("reimbursement-detail-link").click();
const createPayload = (await (await createResponsePromise).json()) as { data?: { id?: string } };
const reimbursementId = createPayload.data?.id;
if (!reimbursementId) {
throw new Error(`创建报销单后未返回 id: ${JSON.stringify(createPayload)}`);
}
await page.goto(`/reimbursements/${reimbursementId}`);
await expect(page.getByTestId("reimbursement-summary")).toBeVisible();
const reimbursementSummaryText = await page.getByTestId("reimbursement-summary").innerText();
const reimbursementId = extractId(reimbursementSummaryText, "报销ID");
// 2) employee: upload invoice and wait OCR
await page.getByRole("link", { name: "票据中心" }).click();
+1 -1
查看文件
@@ -9,7 +9,7 @@ async function login(page: Page, user: { identifier: string; password: string })
await page.getByTestId("login-identifier").fill(user.identifier);
await page.getByTestId("login-password").fill(user.password);
await page.getByTestId("login-submit").click();
await expect(page).toHaveURL(/\/dashboard/);
await expect(page).toHaveURL(/\/portal/);
}
async function logout(page: Page, userDisplayName: string) {
+10
查看文件
@@ -4,6 +4,16 @@
**范围**:`F1-F42`(含 `F19b/F19c/F19d`) + `R1-S2` + `P9A1-P9D1` + `P10E1-P10G1` + `G0-G6` + `H1` + `M1-M4` + `P13-0-P13-8` + `P14-0-P14-8` + `P15A-0-P15A-5` + `P15B-0-P15B-6` + `P16A-0-P16A-6` + `P16B-0-P16B-6` + `P16C-0-P16C-6` + `R9-0-R9-3` + `G2-0-G2-6` + `P17A-0-P17A-6` + `P17B-0-P17B-6` + `P18A-0-P18A-6` + `P18B-0-P18B-6` + `P19-0-P19-6` + `P19IM1-0-P19IM1-6` + `P19ERP1-0-P19ERP1-6` + `P19ERP2-0-P19ERP2-6` + `P19ERP3-0-P19ERP3-6` + `R10-0-R10-4` + `P19MCP1-0-P19MCP1-4` + `P19AI1-0-P19AI1-5` + `P20TRAVEL1-0-P20TRAVEL1-5` + `P20TRAVEL2-0-P20TRAVEL2-5` + `P20TRAVEL3-0-P20TRAVEL3-5` + `P21PWA1-0-P21PWA1-5` + `P21PWA2-0-P21PWA2-5` + `P22PROD1-0-P22PROD1-5` + `R11-0-R11-5`,共 278 项。
**事实源**:`issues/2026-02-09_13-39-02-p5-blueprint-v3.csv` + `issues/2026-02-09_23-30-00-p6-p8-remaining-work-master.csv` + `issues/2026-02-10_09-42-31-p9-maintenance-performance-matrix.csv` + `issues/2026-02-10_10-35-30-p10-production-hardening.csv` + `issues/2026-02-11-p11-p12-governance-mobile.csv` + `issues/2026-02-12_01-09-41-p13-l5-governance.csv` + `issues/2026-02-13_00-11-56-p14-l5-operationalization.csv` + `issues/2026-03-06_14-30-00-p15a-l5-permission-decouple.csv` + `issues/2026-03-06_14-30-00-p15b-l5-leave-v1.csv` + `issues/2026-03-07_13-47-05-p16a-l5-master-data-core.csv` + `issues/2026-03-07_16-22-07-p16b-l5-holiday-calendar.csv` + `issues/2026-03-07_17-14-39-p16c-l5-suppliers.csv` + `issues/2026-03-07_18-15-03-r9-g2-p19-roadmap-refresh.csv` + `issues/2026-03-07_18-16-00-g2-l5-cross-domain-bridge.csv` + `issues/2026-03-07_19-33-09-p17a-l5-procurement-core.csv` + `issues/2026-03-07_21-00-37-p17b-l5-procurement-budget-archive.csv` + `issues/2026-03-07_22-02-09-p18a-l5-asset-registry-core.csv` + `issues/2026-03-07_22-34-03-p18b-l5-asset-movements-inventory.csv` + `issues/2026-03-07_23-22-00-p19-l4-integration-readiness.csv` + `issues/2026-03-08_12-18-10-p19-im-1-l5-collaboration-adapter.csv` + `issues/2026-03-08_14-10-53-p19-erp-1-l5-masterdata-journal-bridge.csv` + `issues/2026-03-08_22-46-51-p19-erp-2-l5-procurement-commitment-archive.csv` + `issues/2026-03-09_00-10-00-p19-erp-3-l5-asset-ledger-summary.csv` + `issues/2026-03-09_10-15-00-r10-post-erp3-roadmap-refresh.csv` + `issues/2026-03-09_10-25-00-p19-mcp-1-l4-readonly-tools-baseline.csv` + `issues/2026-03-10_12-54-30-p19-ai-1-l5-suggestion-workbench-refresh.csv` + `issues/2026-03-10_17-32-21-p20-travel-1-l5-request-intake-refresh.csv` + `issues/2026-03-10_21-05-59-p20-travel-2-l5-corporate-payments-refresh.csv` + `issues/2026-03-11_09-57-28-p20-travel-3-l5-reconciliation-erp-bridge-refresh.csv` + `issues/2026-03-11_17-50-39-p21-pwa-1-l5-asset-scan-refresh.csv` + `issues/2026-03-12_04-32-13-p21-pwa-2-l5-offline-deeplink-refresh.csv` + `issues/2026-03-12_16-58-44-p22-prod-1-l5-production-hardening.csv` + `issues/2026-03-13_10-30-00-r11-contract-reconciliation-and-spec-refresh.csv`(执行合同)
## R12 增量能力(2026-03-21)
- **事实源**:`issues/2026-03-21_10-30-00-p25-fee-control-ap-refresh.csv`、`issues/2026-03-21_10-40-00-p26-portal-sso-im-entry-refresh.csv`、`issues/2026-03-21_10-50-00-p28-portal-search-workbench-refresh.csv`、`issues/2026-03-21_11-00-00-p24-workflow-governance-refresh.csv`、`issues/2026-03-21_11-10-00-p29-replacement-readiness-refresh.csv`
- **P25-lite 费控闭环**:新增预算控制规则中心、三域统一 `precheck`、`EntityRiskFlag` 风险项、支付批次和最小 `AP Operations` 运营视图。
- **P26-lite 统一入口**:新增 `Portal Home`、`OIDC provider` 列表、登录页统一入口和 IM 签名 deep link。
- **P28-lite 搜索与工作台**:新增全局搜索、公告管理、最近访问与 Portal 工作台卡片聚合。
- **P24-lite 流程治理**:新增工作流定义后台治理、版本发布归档、报销流程只读投影,不改现有运行时引擎。
- **P29-lite 试点切换**:新增迁移 dry-run、切换范围控制台、试点切换 runbook 与映射清单,遵循“旧单只读归档、新单由新系统接管”。
- **默认开关**:`budget_precheck_v1`、`payment_batch_v1`、`portal_home_v1`、`global_search_v1`、`announcements_v1`、`workflow_definition_admin_v1`、`cutover_console_v1` 默认 `force_off`,需 env 与 DB 开关双重开启。
**说明**:
- 本矩阵用于全局读图(审计/交接/回归覆盖追踪),不替代 `issues/*.csv` 的执行合同职责。
- UI 专项合同(如 `ui-refresh-stage7/8`)属于界面治理线,独立维护,不并入本业务主表统计。