FINPROD ACCTH 启用付款批次并收口代账交接
这个提交包含在:
@@ -95,6 +95,7 @@ const baseUrl = process.env.LIVE_SMOKE_BASE_URL?.trim() || "https://oa.hyinda.co
|
||||
const reportDir = process.env.P2_FIN_LIVE_REPORT_DIR?.trim() ||
|
||||
path.resolve(process.cwd(), "..", "artifacts/qa-flow/p2-fin-live-local");
|
||||
const summaryPath = path.join(reportDir, "live-result.json");
|
||||
const finalFlagState = process.env.P2_FIN_LIVE_FINAL_STATE?.trim() === "force_on" ? "force_on" : "force_off";
|
||||
|
||||
function nowMarker() {
|
||||
return `${markerPrefix}-${Date.now()}-${Math.random().toString(16).slice(2, 8)}`;
|
||||
@@ -363,11 +364,11 @@ async function expectAuditAction(
|
||||
.toBe(true);
|
||||
}
|
||||
|
||||
test.describe("P2-FIN-LIVE 公网付款批次短窗口", () => {
|
||||
test.describe("公网付款批次受控验收", () => {
|
||||
test.skip(process.env.E2E_MODE !== "live", "仅在 live 模式下执行");
|
||||
test.describe.configure({ mode: "serial" });
|
||||
|
||||
test("公网付款批次 flag-on 闭环后强制回滚到 flag-off", async ({}, testInfo) => {
|
||||
test("公网付款批次 flag-on 闭环后按 final mode 收口", async ({}, testInfo) => {
|
||||
test.setTimeout(420_000);
|
||||
if (process.env.P2_FIN_LIVE_APPROVED !== "1") {
|
||||
throw new Error("P2_FIN_LIVE_APPROVED=1 is required for public write test");
|
||||
@@ -377,12 +378,14 @@ test.describe("P2-FIN-LIVE 公网付款批次短窗口", () => {
|
||||
const marker = nowMarker();
|
||||
const summary: LiveSummary = {
|
||||
issueId,
|
||||
mode: "p2-fin-live",
|
||||
mode: finalFlagState === "force_on" ? "fin-prod-enable" : "p2-fin-live",
|
||||
status: "RUNNING",
|
||||
baseUrl,
|
||||
marker,
|
||||
startedAt: new Date().toISOString(),
|
||||
stages: {},
|
||||
stages: {
|
||||
finalFlagState,
|
||||
},
|
||||
};
|
||||
|
||||
const clients: AuthenticatedApiClient[] = [];
|
||||
@@ -543,13 +546,29 @@ test.describe("P2-FIN-LIVE 公网付款批次短窗口", () => {
|
||||
} finally {
|
||||
if (admin) {
|
||||
try {
|
||||
const rolledBack = await forcePaymentBatchOff(admin.api, `${issueId} rollback ${marker}`);
|
||||
summary.stages.rollback = { paymentFlagAfterRollback: snapshotFlag(rolledBack) };
|
||||
expect(rolledBack.effectiveEnabled).toBe(false);
|
||||
if (finalFlagState === "force_on" && !caughtError) {
|
||||
const paymentFlag = await loadFlag(admin.api, "payment_batch_v1");
|
||||
const finalPaymentFlag =
|
||||
paymentFlag.overrideMode === "force_on" && paymentFlag.effectiveEnabled
|
||||
? paymentFlag
|
||||
: await updateFlag(admin.api, "payment_batch_v1", "force_on", `${issueId} keep force_on ${marker}`);
|
||||
const finalErpFlag = await loadFlag(admin.api, "erp_sync");
|
||||
summary.stages.finalState = {
|
||||
paymentFlag: snapshotFlag(finalPaymentFlag),
|
||||
erpSyncEffectiveEnabled: finalErpFlag.effectiveEnabled,
|
||||
};
|
||||
expect(finalPaymentFlag.effectiveEnabled).toBe(true);
|
||||
expect(finalPaymentFlag.overrideMode).toBe("force_on");
|
||||
expect(finalErpFlag.effectiveEnabled).toBe(false);
|
||||
} else {
|
||||
const rolledBack = await forcePaymentBatchOff(admin.api, `${issueId} rollback ${marker}`);
|
||||
summary.stages.rollback = { paymentFlagAfterRollback: snapshotFlag(rolledBack) };
|
||||
expect(rolledBack.effectiveEnabled).toBe(false);
|
||||
}
|
||||
} catch (error) {
|
||||
rollbackError = error;
|
||||
summary.status = "FAIL";
|
||||
summary.stages.rollback = { error: sanitizeError(error) };
|
||||
summary.stages.finalState = { error: sanitizeError(error) };
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
在新工单中引用
屏蔽一个用户