feat(08-05-contract-detail-workspace): 完成合同详情与终止状态治理
这个提交包含在:
@@ -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 }) => {
|
||||
|
||||
在新工单中引用
屏蔽一个用户