feat: redesign report batch workflow

This commit is contained in:
hectorzhao
2026-09-03 11:04:32 +08:00
parent a50aafb1ec
commit dc201bf92e
15 changed files with 582 additions and 150 deletions
+56 -2
View File
@@ -9,6 +9,8 @@ import { AdminReportTasksPage } from './AdminReportTasksPage';
const { adminApi, clipboardWriteText } = vi.hoisted(() => ({
adminApi: {
changeReportTaskStatuses: vi.fn(),
downloadReportMaterialBatch: vi.fn(),
downloadReportMaterialBatchFile: vi.fn(),
exportSingleReportMaterial: vi.fn(),
getReportMaterialBatch: vi.fn(),
getSingleReportMaterialDetail: vi.fn(),
@@ -49,7 +51,12 @@ describe('report workbench pages', () => {
});
it('selects and clears every detail on the current page', async () => {
adminApi.listReportDetailsPage.mockResolvedValue({ items: [task('1'), task('2')], total: 2, page: 1, pageSize: 10 });
adminApi.listReportDetailsPage.mockResolvedValue({
items: [task('1'), task('2')],
total: 2,
page: 1,
pageSize: 10,
});
render(
<MemoryRouter>
<AdminReportTasksPage />
@@ -120,7 +127,9 @@ describe('report workbench pages', () => {
channelCount: 1,
fileCount: 1,
reportTotal: 1,
reportingCount: 0,
successCount: 0,
failedCount: 0,
successRate: 0,
createdAt: '2026-09-02T01:00:00.000Z',
exportFiles: [],
@@ -155,11 +164,56 @@ describe('report workbench pages', () => {
configurable: true,
value: { writeText: clipboardWriteText },
});
await user.click(await screen.findByRole('button', { name: '打开明细' }));
await user.click(await screen.findByRole('button', { name: '报备文件导出' }));
expect(await screen.findByText('测试通道')).toBeVisible();
expect(screen.getByText(/1\.短信签名:/)).toBeVisible();
expect(screen.getByRole('button', { name: '全部下载' })).toBeEnabled();
await user.click(screen.getByRole('button', { name: '复制简报' }));
await waitFor(() => expect(clipboardWriteText).toHaveBeenCalledWith(content));
expect(screen.getByRole('button', { name: '已复制' })).toBeVisible();
});
it('opens batch details in a drawer and keeps status controls in a nested dialog', async () => {
const batch = {
id: 'batch-2',
batchNo: 'RB-DRAWER',
status: 'completed',
selectedCount: 2,
channelCount: 1,
fileCount: 1,
reportTotal: 2,
reportingCount: 1,
successCount: 1,
failedCount: 0,
successRate: 0.5,
createdAt: '2026-09-03T01:00:00.000Z',
exportFiles: [],
briefs: [],
};
adminApi.listReportMaterialBatches.mockResolvedValue({ items: [batch], total: 1, page: 1, pageSize: 20 });
adminApi.getReportMaterialBatch.mockResolvedValue(batch);
adminApi.listReportMaterialBatchTasks.mockResolvedValue({
items: [task('1'), task('2')],
total: 2,
page: 1,
pageSize: 100,
});
render(
<MemoryRouter>
<AdminReportBatchesPage />
</MemoryRouter>,
);
const user = userEvent.setup();
await user.click(await screen.findByRole('button', { name: '打开明细' }));
const drawer = await screen.findByRole('dialog', { name: '批次明细 · RB-DRAWER' });
expect(drawer).toHaveClass('report-batch-drawer');
await user.click(screen.getByRole('checkbox', { name: '全选批次明细' }));
expect(screen.getByRole('button', { name: '批量修改报备状态' })).toBeEnabled();
expect(screen.getAllByRole('button', { name: '修改状态' })).toHaveLength(2);
await user.click(screen.getByRole('button', { name: '批量修改报备状态' }));
expect(await screen.findByRole('dialog', { name: '批量修改 2 条报备状态' })).toBeVisible();
expect(screen.getByLabelText('修改后的状态')).toBeVisible();
expect(screen.queryByRole('button', { name: '导出本条' })).not.toBeInTheDocument();
});
});