优化报销审批证据布局(reimbursement-form-shared-component-migration)
这个提交包含在:
@@ -1257,6 +1257,8 @@ test("已完成审批只保留中文只读摘要", async ({ page }) => {
|
||||
await page.goto("/workflow/tasks/task-wave3-completed");
|
||||
|
||||
await expect(page.getByTestId("workflow-task-action-panel")).toBeVisible();
|
||||
await expect(page.getByTestId("reimbursement-expense-items-table")).toBeVisible();
|
||||
await expect(page.getByTestId("approval-item-evidence").getByRole("button")).toHaveCount(0);
|
||||
await expect(page.getByTestId("reimbursement-desktop-workspace")).toBeVisible();
|
||||
await expect(page.getByTestId("workflow-task-action-panel")).toContainText("审批角色:财务");
|
||||
await expect(page.getByTestId("reimbursement-desktop-workspace")).toContainText("2026年5月27日 18:10");
|
||||
@@ -1308,18 +1310,19 @@ test("报销详情固定使用上海时区并收敛只读信息", async ({ page
|
||||
await expect(page.getByTestId("reimbursement-back")).toContainText("返回报销列表");
|
||||
await expect(page.getByTestId("reimbursement-desktop-workspace")).toContainText("¥1,860.00");
|
||||
await expect(page.getByTestId("reimbursement-approval-evidence")).toContainText("¥860.00");
|
||||
await expect(page.getByTestId("approval-item-evidence").getByRole("button")).toHaveCount(0);
|
||||
await expect(page.getByTestId("approval-attachments")).toContainText("现场说明.pdf");
|
||||
await expect(page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: /查看发票原件/ })).toHaveCount(1);
|
||||
await expect(page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: /查看发票:/ })).toHaveCount(1);
|
||||
await expect(page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: /查看补充附件/ })).toHaveCount(1);
|
||||
await expect(page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: /移除|删除/ })).toHaveCount(0);
|
||||
const pcInvoicePreview = page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: /查看发票原件/ });
|
||||
const pcInvoicePreview = page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: /查看发票:/ });
|
||||
const pcMaterialPreview = page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: "查看完整材料" });
|
||||
const pcAttachmentPreview = page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: /查看补充附件/ });
|
||||
await pcInvoicePreview.focus();
|
||||
await expect(pcInvoicePreview).toBeFocused();
|
||||
await page.keyboard.press("Tab");
|
||||
await pcMaterialPreview.focus();
|
||||
await expect(pcMaterialPreview).toBeFocused();
|
||||
await page.keyboard.press("Tab");
|
||||
await expect(pcInvoicePreview).toBeFocused();
|
||||
await page.keyboard.press("Tab");
|
||||
await expect(pcAttachmentPreview).toBeFocused();
|
||||
await expect(page.getByTestId("reimbursement-workflow-progress")).toContainText("负责人复核");
|
||||
await expect(page.getByTestId("reimbursement-workflow-progress")).toContainText("付款复核");
|
||||
@@ -1332,24 +1335,25 @@ test("报销详情固定使用上海时区并收敛只读信息", async ({ page
|
||||
await page.setViewportSize({ width: 390, height: 844 });
|
||||
await page.goto("/mobile/reimbursements/reim-wave3");
|
||||
await expect(page.getByTestId("mobile-reimbursement-detail-header")).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "明细与票据" })).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "报销内容", exact: true })).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "当前办理摘要" })).toHaveCount(0);
|
||||
await expect(page.getByTestId("reimbursement-mobile-workspace")).toContainText(visualMe.name);
|
||||
await expect(page.getByTestId("reimbursement-mobile-workspace")).toContainText("¥1,860.00");
|
||||
await expect(page.getByTestId("reimbursement-approval-evidence")).toContainText("¥860.00");
|
||||
await expect(page.getByTestId("approval-item-evidence").getByRole("button")).toHaveCount(0);
|
||||
await expect(page.getByTestId("mobile-reimbursement-processing-progress")).toContainText("负责人复核");
|
||||
await expect(page.getByTestId("approval-attachments")).toContainText("现场说明.pdf");
|
||||
await expect(page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: /查看发票原件/ })).toHaveCount(1);
|
||||
await expect(page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: /查看发票:/ })).toHaveCount(1);
|
||||
await expect(page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: /查看补充附件/ })).toHaveCount(1);
|
||||
await expect(page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: /移除|删除/ })).toHaveCount(0);
|
||||
const mobileInvoicePreview = page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: /查看发票原件/ });
|
||||
const mobileInvoicePreview = page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: /查看发票:/ });
|
||||
const mobileMaterialPreview = page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: "查看完整材料" });
|
||||
const mobileAttachmentPreview = page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: /查看补充附件/ });
|
||||
await mobileInvoicePreview.focus();
|
||||
await expect(mobileInvoicePreview).toBeFocused();
|
||||
await page.keyboard.press("Tab");
|
||||
await mobileMaterialPreview.focus();
|
||||
await expect(mobileMaterialPreview).toBeFocused();
|
||||
await page.keyboard.press("Tab");
|
||||
await expect(mobileInvoicePreview).toBeFocused();
|
||||
await page.keyboard.press("Tab");
|
||||
await expect(mobileAttachmentPreview).toBeFocused();
|
||||
await expect(page.getByTestId("mobile-reimbursement-processing-progress")).toContainText("付款完成");
|
||||
await expect(page.getByTestId("mobile-reimbursement-actions")).toHaveCount(0);
|
||||
@@ -1364,7 +1368,7 @@ test("Wave3 PC 详情和通知中心视觉截图", async ({ page }) => {
|
||||
await page.goto("/reimbursements/reim-wave3");
|
||||
await expect(page.getByTestId("reimbursement-desktop-workspace")).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: `报销单 ${reimbursementDetail.formNumber}` })).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "明细与票据" })).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "报销内容" })).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "当前状态与下一步" })).toHaveCount(0);
|
||||
await expect(page.getByRole("heading", { name: "业务摘要" })).toHaveCount(0);
|
||||
await expect(page.getByRole("heading", { name: "预算与审核提示" })).toHaveCount(0);
|
||||
@@ -1551,7 +1555,7 @@ test("Wave3 移动关键页视觉截图", async ({ page }) => {
|
||||
|
||||
await page.goto("/mobile/reimbursements/reim-wave3");
|
||||
await expect(page.getByTestId("reimbursement-mobile-workspace")).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "明细与票据" })).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "报销内容", exact: true })).toBeVisible();
|
||||
await expect(page.getByRole("heading", { name: "当前办理摘要" })).toHaveCount(0);
|
||||
await expect(page.getByTestId("reimbursement-mobile-workspace")).toContainText(visualMe.name);
|
||||
await expect(page.getByTestId("approval-attachments")).toContainText("现场说明.pdf");
|
||||
|
||||
@@ -415,11 +415,11 @@ test.describe("R102 reimbursement main flow", () => {
|
||||
await page.goto(`/reimbursements/${reimbursementId}`);
|
||||
|
||||
await expect(page.getByTestId("reimbursement-desktop-workspace")).toContainText("¥168.30");
|
||||
await expect(page.getByTestId("approval-item-evidence")).toContainText("明细 1");
|
||||
await expect(page.getByTestId("approval-item-evidence")).toContainText("所属票据(0)");
|
||||
await expect(page.getByTestId("reimbursement-expense-items-table").getByRole("columnheader")).toHaveText(["序号", "费用类型", "发生日期", "费用说明", "金额", "票据", "操作"]);
|
||||
await expect(page.getByTestId("approval-item-evidence")).toContainText("未关联");
|
||||
await expect(page.getByTestId("approval-item-evidence")).toContainText("这条明细尚无对应票据");
|
||||
|
||||
await page.getByRole("button", { name: "编辑", exact: true }).click();
|
||||
await page.getByRole("button", { name: "编辑", exact: true }).first().click();
|
||||
const editor = page.getByTestId("reimbursement-header-editor");
|
||||
await editor.getByLabel("报销日期").fill("2026-05-07");
|
||||
await editor.getByLabel("报销事由").fill("办公网络费用");
|
||||
@@ -533,7 +533,7 @@ test.describe("R102 reimbursement main flow", () => {
|
||||
await expect(page.getByTestId("reimbursement-item-add")).toHaveCount(0);
|
||||
await expect(page.getByRole("combobox", { name: "关联项目" })).toHaveCount(0);
|
||||
await expect(page.getByTestId("approval-unlinked-invoices")).toContainText("R102-OTHER");
|
||||
await expect(page.getByTestId("approval-item-evidence")).toContainText("所属票据(0)");
|
||||
await expect(page.getByTestId("approval-item-evidence")).toContainText("未关联");
|
||||
await expect(page.getByText("草稿或驳回状态可移除")).toHaveCount(0);
|
||||
|
||||
await page.setViewportSize({ width: 375, height: 812 });
|
||||
@@ -566,7 +566,7 @@ test.describe("R102 reimbursement main flow", () => {
|
||||
await expect(page.getByText("只读查看")).toBeVisible();
|
||||
await expect(page.getByTestId("reimbursement-approval-evidence").getByRole("button", { name: /新增|编辑|删除/ })).toHaveCount(0);
|
||||
await expect(page.getByTestId("approval-unlinked-invoices")).toBeVisible();
|
||||
await expect(page.getByTestId("approval-item-evidence")).toContainText("所属票据(0)");
|
||||
await expect(page.getByTestId("approval-item-evidence")).toContainText("票据:未关联");
|
||||
await expect(page.getByRole("button", { name: "移除" })).toHaveCount(0);
|
||||
const routeState = await page.evaluate(() => window.history.state?.usr ?? null);
|
||||
expect(routeState?.from).toContain("status=reviewing");
|
||||
@@ -584,7 +584,7 @@ test.describe("R102 reimbursement main flow", () => {
|
||||
test("报销明细记录切换时支持取消保持与确认放弃", async ({ page }) => {
|
||||
await page.setViewportSize({ width: 1280, height: 900 });
|
||||
await page.goto(`/reimbursements/${reimbursementId}`);
|
||||
await page.getByTestId("approval-item-evidence").getByRole("button", { name: "编辑明细" }).click();
|
||||
await page.getByTestId("approval-item-evidence").getByRole("button", { name: "编辑", exact: true }).click();
|
||||
|
||||
const addItem = page.getByTestId("reimbursement-item-add");
|
||||
await addItem.click();
|
||||
|
||||
@@ -819,7 +819,7 @@ async function exerciseInvoiceGuardRecoveryAfterPrecheckConfirm(
|
||||
|
||||
const itemSelect = page.getByLabel("选择报销明细");
|
||||
await itemSelect.selectOption(targetItemId);
|
||||
await itemSelect.locator("..").getByRole("button", { name: "确认关联", exact: true }).click();
|
||||
await page.getByTestId("approval-unlinked-invoices").getByRole("button", { name: "确认关联", exact: true }).click();
|
||||
await expect.poll(() => state.invoiceItemLinkRequests).toEqual([{
|
||||
invoiceId: invoice.id,
|
||||
linkedItemId: targetItemId,
|
||||
@@ -877,7 +877,9 @@ test.describe("R111 国内报销发票与附件双端体验", () => {
|
||||
await expect(page.getByTestId("reimbursement-approval-evidence")).toContainText("12345679");
|
||||
await expect(page.getByTestId("reimbursement-approval-evidence")).not.toContainText("无代码");
|
||||
await expect(page.getByTestId("reimbursement-approval-evidence")).not.toContainText("未识别销售方");
|
||||
await expect(page.getByRole("button", { name: /查看发票原件/ })).toHaveCount(2);
|
||||
await expect(page.getByRole("button", { name: /查看发票:/ })).toHaveCount(2);
|
||||
await expect(page.getByRole("button", { name: "查看原件", exact: true })).toHaveCount(0);
|
||||
await expect(page.getByRole("button", { name: "查看附件", exact: true })).toHaveCount(0);
|
||||
|
||||
await page.locator("#reimbursement-attachment-upload").setInputFiles({
|
||||
name: "付款截图.png",
|
||||
@@ -1103,7 +1105,7 @@ test.describe("R111 国内报销发票与附件双端体验", () => {
|
||||
await page.getByTestId("reimbursement-submit").click();
|
||||
|
||||
await expect(page.getByTestId("reimbursement-action-error").first()).toContainText("1 张发票未选择报销明细");
|
||||
await expect(page.getByText("这条明细尚无对应票据,暂时无法提交;请添加票据并选择这条明细。")).toBeVisible();
|
||||
await expect(page.getByText("这条明细尚无对应票据,暂时无法提交;请在票据区添加票据并选择这条明细。")).toBeVisible();
|
||||
await expect(page.getByText("当前申报金额高于已读取的票面金额合计,暂时不能据此通过;请核对明细金额和票据是否完整。")).toBeVisible();
|
||||
await expect(page.getByText("这些票据当前没有明确费用归属,暂时无法提交;请为每张票据选择对应的报销明细。")).toBeVisible();
|
||||
await expect(page.getByText("票面金额需财务查看原件核对;这是一项审批提示,不会阻止提交。")).toBeVisible();
|
||||
@@ -1129,7 +1131,7 @@ test.describe("R111 国内报销发票与附件双端体验", () => {
|
||||
invoiceId: unlinkedInvoiceId,
|
||||
linkedItemId: "item-missing-r111",
|
||||
}]);
|
||||
await expect(page.getByText("这条明细尚无对应票据,暂时无法提交;请添加票据并选择这条明细。")).toHaveCount(0);
|
||||
await expect(page.getByText("这条明细尚无对应票据,暂时无法提交;请在票据区添加票据并选择这条明细。")).toHaveCount(0);
|
||||
await expect(page.getByText("当前申报金额高于已读取的票面金额合计,暂时不能据此通过;请核对明细金额和票据是否完整。")).toBeVisible();
|
||||
|
||||
const structuredGuardDetails = state.submitGuardDetails;
|
||||
@@ -1155,7 +1157,7 @@ test.describe("R111 国内报销发票与附件双端体验", () => {
|
||||
await page.goto(`/mobile/reimbursements/${reimbursementId}`);
|
||||
await page.getByTestId("reimbursement-submit").click();
|
||||
await expect(page.getByTestId("reimbursement-action-error")).toContainText("票据检查未通过");
|
||||
await expect(page.getByText("这条明细尚无对应票据,暂时无法提交;请添加票据并选择这条明细。")).toBeVisible();
|
||||
await expect(page.getByText("这条明细尚无对应票据,暂时无法提交;请在票据区添加票据并选择这条明细。")).toBeVisible();
|
||||
await expect(page.getByText("这些票据当前没有明确费用归属,暂时无法提交;请为每张票据选择对应的报销明细。")).toBeVisible();
|
||||
await expect(page.getByText("票面金额需财务查看原件核对;这是一项审批提示,不会阻止提交。")).toBeVisible();
|
||||
await expect(page.getByText(
|
||||
@@ -1196,7 +1198,7 @@ test.describe("R111 国内报销发票与附件双端体验", () => {
|
||||
await login(mobile.page);
|
||||
await mobile.page.goto(`/mobile/reimbursements/${reimbursementId}`);
|
||||
await expect(mobile.page.getByTestId("reimbursement-mobile-workspace")).toBeVisible();
|
||||
await expect(mobile.page.getByRole("heading", { name: "明细与票据" })).toBeVisible();
|
||||
await expect(mobile.page.getByRole("heading", { name: "报销内容", exact: true })).toBeVisible();
|
||||
|
||||
const beforeDialogMetrics = await collectVisualMetrics(mobile.page);
|
||||
expect(beforeDialogMetrics.scrollWidth).toBeLessThanOrEqual(beforeDialogMetrics.width + 2);
|
||||
@@ -1260,11 +1262,12 @@ test.describe("R111 国内报销发票与附件双端体验", () => {
|
||||
await expect(mobileEvidence).not.toContainText("无代码");
|
||||
await expect(mobileEvidence).not.toContainText("未识别销售方");
|
||||
const mobileItem = mobile.page.getByTestId("approval-item-evidence").filter({ hasText: "客户招待" }).first();
|
||||
await expect(mobileItem).toContainText("12345678");
|
||||
await expect(mobileItem).not.toContainText("12345678");
|
||||
await expect(mobileItem).not.toContainText("12345679");
|
||||
await expect(mobile.page.getByTestId("approval-unlinked-invoices")).toContainText("12345679");
|
||||
await expect(mobileEvidence.getByRole("button", { name: /查看发票原件/ })).toHaveCount(2);
|
||||
await expect(mobileEvidence.getByRole("button", { name: /查看发票:/ })).toHaveCount(2);
|
||||
await expect(mobile.page.getByRole("button", { name: "查看原件", exact: true })).toHaveCount(0);
|
||||
await expect(mobile.page.getByRole("button", { name: "查看附件", exact: true })).toHaveCount(0);
|
||||
|
||||
const maintenanceSection = mobile.page.locator("section").filter({ has: mobile.page.getByRole("heading", { name: "维护报销内容" }) });
|
||||
await expect(maintenanceSection.getByRole("button", { name: "选择附件" })).toBeVisible();
|
||||
|
||||
@@ -432,10 +432,14 @@ test.describe("R7E 审批动作二次确认", () => {
|
||||
await expect(page.getByTestId("workflow-task-summary")).toHaveCount(0);
|
||||
await expect(page.getByText("打开完整原始表单")).toHaveCount(0);
|
||||
await expect(page.getByText(/0 条/)).toHaveCount(0);
|
||||
await expect(page.getByRole("button", { name: "编辑明细" })).toHaveCount(0);
|
||||
await expect(page.getByTestId("approval-item-evidence").getByRole("button")).toHaveCount(0);
|
||||
await expect(page.getByRole("button", { name: "删除明细" })).toHaveCount(0);
|
||||
await expect(page.getByRole("button", { name: "选择明细" })).toHaveCount(0);
|
||||
await expect(page.getByText("引用到退回意见")).toHaveCount(0);
|
||||
await expect(page.getByTestId("reimbursement-return-reference-picker")).toHaveCount(0);
|
||||
|
||||
await page.getByTestId("workflow-task-return-toggle").click();
|
||||
await expect(page.getByTestId("reimbursement-return-reference-picker")).toBeVisible();
|
||||
await page.getByTestId("approval-reference-item").click();
|
||||
await expect(page.getByTestId("workflow-task-return-comment")).toHaveValue(/【明细:交通费 · 2026-09-01 · ¥180\.00】/);
|
||||
});
|
||||
|
||||
在新工单中引用
屏蔽一个用户