feat(08-05-contract-detail-workspace): 完成合同详情与终止状态治理

这个提交包含在:
2026-08-08 02:02:52 +08:00
父节点 7546d372d6
当前提交 21851774dd
共修改 25 个文件,包含 2516 行新增和 1021 行删除
@@ -497,6 +497,30 @@ const secondContractRegistryItem = {
offlineArchiveNo: "OFF-2026-W3-02",
};
const contractRegistryDetail = {
...contractRegistryItem,
terminatedAt: null,
terminatedReason: null,
terminatedBy: null,
terminator: null,
documentRefs: [],
history: [
{
id: "audit-contract-wave3",
action: "CONTRACT_REGISTRY_CREATED",
summary: "创建合同台账",
createdAt: "2026-05-20T09:00:00.000Z",
actor: { id: visualMe.id, employeeNo: visualMe.employeeNo, name: visualMe.name },
},
],
};
const secondContractRegistryDetail = {
...contractRegistryDetail,
...secondContractRegistryItem,
history: contractRegistryDetail.history,
};
const purchaseDetail = {
id: "purchase-wave3",
requestNo: "CG20260527001",
@@ -997,6 +1021,16 @@ async function mockWave3Apis(page: Page) {
return;
}
if (request.method() === "GET" && ["/api/contracts-registry/contract-wave3", "/api/contracts-registry/contract-wave3-second"].includes(pathName)) {
await fulfillJson(route, { item: pathName.endsWith("-second") ? secondContractRegistryDetail : contractRegistryDetail });
return;
}
if (pathName === "/api/contracts-registry/contract-wave3" && request.method() === "PATCH") {
await fulfillJson(route, { item: { ...contractRegistryDetail, status: "archived", persistedStatus: "archived" } });
return;
}
if (pathName === "/api/contracts-registry") {
await fulfillJson(route, { items: [contractRegistryItem, secondContractRegistryItem] });
return;
@@ -1409,19 +1443,18 @@ test("Wave3 PC 详情和通知中心视觉截图", async ({ page }) => {
const contractRows = page.getByTestId("contracts-registry-table").getByTestId("contracts-registry-row");
await expect(contractRows).toHaveCount(2);
await expect(contractRows.first()).toBeVisible();
await page.getByRole("button", { name: "筛选", exact: true }).click();
await expect(page.getByTestId("contracts-advanced-filters")).toBeVisible();
await page.getByRole("button", { name: "新增合同" }).click();
await expect(page.getByTestId("contracts-editor-panel")).toBeVisible();
await page.getByRole("button", { name: "关闭" }).click();
await expect(contractRows).toHaveCount(2);
await page.getByTestId("contracts-registry-table").getByRole("button", { name: "更多" }).first().click();
await page.getByRole("menuitem", { name: "归档" }).click();
await page.getByRole("button", { name: "更多筛选", exact: true }).click();
await expect(page.getByLabel("到期开始日期")).toBeVisible();
await expect(page.getByRole("button", { name: "编辑", exact: true })).toHaveCount(0);
await expect(page.getByRole("button", { name: "更多", exact: true })).toHaveCount(0);
await page.getByTestId("contracts-registry-table").getByRole("link", { name: "查看详情" }).first().click();
await expect(page).toHaveURL(/\/contracts-registry\/contract-wave3$/);
await expect(page.getByText("状态与下一步", { exact: true })).toBeVisible();
await expect(page.getByText("涉密资料请登记线下归档位置", { exact: true })).toBeVisible();
await page.getByRole("button", { name: "归档", exact: true }).click();
await expect(page.getByTestId("action-confirm-dialog")).toContainText("确认归档");
await page.getByTestId("action-confirm-cancel").click();
await expect(page.getByTestId("action-confirm-dialog")).toHaveCount(0);
await page.locator(".ops-command-bar__actions").getByRole("button", { name: "更多" }).click();
await expect(page.getByRole("menuitem", { name: "导出 CSV" })).toBeVisible();
await page.screenshot({ path: screenshotPath("04-pc-contracts-registry.png"), fullPage: true });
});
@@ -1464,7 +1497,7 @@ test("/contracts-registry 在 768x1024 与 1024x768 下操作列可达", async (
expect(["auto", "scroll"]).toContain(metrics.overflowX);
expect(metrics.scrollWidth).toBeGreaterThanOrEqual(metrics.clientWidth);
expect(metrics.documentOverflow).toBeLessThanOrEqual(2);
const operation = table.getByRole("button", { name: "更多" }).first();
const operation = table.getByRole("link", { name: "查看详情" }).first();
await expect(operation).toBeVisible();
await operation.click({ trial: true });
await page.screenshot({
@@ -1474,24 +1507,27 @@ test("/contracts-registry 在 768x1024 与 1024x768 下操作列可达", async (
}
});
test("合同长表单从记录 A 切换到记录 B 时支持取消保持与确认放弃", async ({ page }) => {
test("合同详情编辑离开路由时支持取消保持与确认放弃", async ({ page }) => {
await page.setViewportSize({ width: 1280, height: 900 });
await page.goto("/contracts-registry");
const table = page.getByTestId("contracts-registry-table");
const editButtons = table.getByRole("button", { name: "编辑", exact: true });
await editButtons.first().click();
const counterparty = page.getByPlaceholder("合同对方名称");
await table.getByRole("link", { name: "查看详情" }).first().click();
await expect(page).toHaveURL(/\/contracts-registry\/contract-wave3$/);
await page.getByRole("button", { name: "编辑", exact: true }).first().click();
const counterparty = page.getByTestId("contract-counterparty");
await counterparty.fill("合成未保存合同相对方");
await editButtons.nth(1).click();
await page.getByRole("link", { name: "返回合同列表" }).click();
await expect(page.getByTestId("unsaved-changes-dialog")).toContainText("合同表单尚未保存");
await page.getByTestId("unsaved-changes-continue").click();
await expect(page).toHaveURL(/\/contracts-registry$/);
await expect(page).toHaveURL(/\/contracts-registry\/contract-wave3$/);
await expect(counterparty).toHaveValue("合成未保存合同相对方");
await editButtons.nth(1).click();
await page.getByRole("link", { name: "返回合同列表" }).click();
await page.getByTestId("unsaved-changes-discard").click();
await expect(counterparty).toHaveValue(secondContractRegistryItem.counterpartyName);
await expect(page).toHaveURL(/\/contracts-registry$/);
await page.getByTestId("contracts-registry-table").getByRole("link", { name: "查看详情" }).nth(1).click();
await expect(page.getByText(secondContractRegistryItem.counterpartyName, { exact: true })).toBeVisible();
});
test("Wave3 移动关键页视觉截图", async ({ page }) => {