+
+ 签名
{record.task?.signature?.name ?? '-'}
- {record.task?.signature?.purpose ? {record.task.signature.purpose} : null}
),
},
- { key: 'source', title: '修改入口', width: '150px', render: (record) => recordSource(record) },
{
- key: 'operator',
- title: '操作人',
- width: '140px',
- render: (record) => record.operator?.displayName ?? record.operator?.username ?? '系统',
+ key: 'action',
+ title: '变更动作',
+ width: '180px',
+ render: (record) => (
+
+ {actionLabel[record.action] ?? record.action}
+ {recordSource(record)}
+
+ ),
},
- { key: 'action', title: '动作', width: '170px', render: (record) => actionLabel[record.action] ?? record.action },
{
key: 'status',
title: '状态变化',
- width: '210px',
+ width: '150px',
render: (record) => (
{`${translateStatus(record.statusBefore)} → ${translateStatus(record.statusAfter)}`}
),
},
- { key: 'time', title: '记录时间', width: '190px', render: (record) => record.createdAt ?? '-' },
{
- key: 'reason',
- title: '备注',
- width: '320px',
- render: (record) =>
{record.reason ?? '-'},
+ key: 'operatorTime',
+ title: '操作人 / 时间',
+ width: '175px',
+ render: (record) => (
+
+ {record.operator?.displayName ?? record.operator?.username ?? '系统'}
+ {record.createdAt ?? '-'}
+
+ ),
},
{
key: 'actions',
title: '操作',
align: 'right',
- width: '120px',
+ width: '76px',
render: (record) => (
} onClick={() => setDetail(record)} size="sm" variant="ghost">
详情
diff --git a/src/apps/admin/ReportWorkbenchPages.test.tsx b/src/apps/admin/ReportWorkbenchPages.test.tsx
index 06238de..66545ce 100644
--- a/src/apps/admin/ReportWorkbenchPages.test.tsx
+++ b/src/apps/admin/ReportWorkbenchPages.test.tsx
@@ -4,6 +4,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest';
import { MemoryRouter } from 'react-router-dom';
import { AdminReportBatchesPage } from './AdminReportBatchesPage';
import { AdminReportMaterialsPage } from './AdminReportMaterialsPage';
+import { AdminReportRecordsPage } from './AdminReportRecordsPage';
import { AdminReportTasksPage } from './AdminReportTasksPage';
const { adminApi, clipboardWriteText } = vi.hoisted(() => ({
@@ -18,6 +19,7 @@ const { adminApi, clipboardWriteText } = vi.hoisted(() => ({
listReportDetailsPage: vi.fn(),
listReportMaterialBatches: vi.fn(),
listReportMaterialBatchTasks: vi.fn(),
+ listReportRecordsPage: vi.fn(),
preflightReportMaterialBatch: vi.fn(),
},
clipboardWriteText: vi.fn(),
@@ -171,6 +173,43 @@ describe('report workbench pages', () => {
);
});
+ it('keeps the report record list compact while retaining full details in the dialog', async () => {
+ adminApi.listReportRecordsPage.mockResolvedValue({
+ items: [{
+ id: 'record-1',
+ taskId: 'report-task-with-a-long-identifier-1',
+ channelId: 'channel-1',
+ action: 'manual_status_change',
+ statusBefore: 'pending',
+ statusAfter: 'approved',
+ reason: '通道已确认报备通过',
+ sourceEntry: 'report_task',
+ createdAt: '2026-09-03 15:30:00',
+ channel: { id: 'channel-1', name: '测试通道' },
+ operator: { id: 'operator-1', username: 'operator', displayName: '运营一' },
+ task: task('record-1'),
+ }],
+ total: 1,
+ page: 1,
+ pageSize: 10,
+ });
+
+ render(
+
+
+ ,
+ );
+
+ expect(await screen.findByRole('columnheader', { name: '变更对象' })).toBeVisible();
+ expect(screen.getByRole('columnheader', { name: '变更动作' })).toBeVisible();
+ expect(screen.getByRole('columnheader', { name: '操作人 / 时间' })).toBeVisible();
+ expect(screen.queryByRole('columnheader', { name: '备注' })).not.toBeInTheDocument();
+ expect(screen.getByText('报备任务修改')).toBeVisible();
+
+ await userEvent.click(screen.getByRole('button', { name: '详情' }));
+ expect((await screen.findAllByText('通道已确认报备通过')).length).toBeGreaterThan(0);
+ });
+
it('shows and copies the channel brief returned by the batch detail API', async () => {
const batch = {
id: 'batch-1',
diff --git a/src/styles/admin.css b/src/styles/admin.css
index d862b39..33c989d 100644
--- a/src/styles/admin.css
+++ b/src/styles/admin.css
@@ -304,6 +304,50 @@
justify-content: flex-end;
}
+.report-record-page .report-task-table-card .ui-table {
+ min-width: 1101px;
+ table-layout: fixed;
+}
+
+.admin-report-record-id {
+ display: block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.admin-report-record-target .ui-tag {
+ justify-self: start;
+}
+
+.admin-report-record-target strong,
+.admin-report-record-target span,
+.admin-report-record-meta strong,
+.admin-report-record-meta span {
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.admin-report-record-target strong,
+.admin-report-record-target span {
+ white-space: nowrap;
+}
+
+.admin-report-record-meta {
+ display: grid;
+ gap: var(--space-1);
+}
+
+.admin-report-record-meta strong {
+ color: var(--color-text-strong);
+}
+
+.admin-report-record-meta span {
+ color: var(--color-text-muted);
+ font-size: var(--font-size-xs);
+ white-space: nowrap;
+}
+
.admin-task-table-card {
overflow: hidden;
padding: 0;