diff --git a/apps/admin-web/src/pages/AdminEditorAssetQueryPage.test.tsx b/apps/admin-web/src/pages/AdminEditorAssetQueryPage.test.tsx index c0cca000c..ddbc7a502 100644 --- a/apps/admin-web/src/pages/AdminEditorAssetQueryPage.test.tsx +++ b/apps/admin-web/src/pages/AdminEditorAssetQueryPage.test.tsx @@ -245,6 +245,40 @@ test('后台素材查询不展示分类筛选和分类列', async () => { expect(screen.queryByRole('columnheader', { name: '分类' })).toBeNull(); }); +test('后台素材查询将中间产物标记为不单独计费', async () => { + vi.mocked(listAdminEditorAssets).mockResolvedValueOnce({ + entries: [ + { + ...generatedAsset, + assetId: 'asset-source', + label: '角色形象原图', + assetKind: 'editor_green_screen_source', + generationCostMudPoints: 0, + }, + generatedAsset, + ], + nextCursor: null, + }); + + render( + , + ); + + const sourceRow = (await screen.findByText('角色形象原图')).closest('tr'); + const finalRow = screen.getByText('角色形象 1').closest('tr'); + expect(sourceRow).not.toBeNull(); + expect(finalRow).not.toBeNull(); + expect(within(sourceRow!).getByText('不单独计费')).toBeTruthy(); + expect(within(finalRow!).getByText('12 泥点')).toBeTruthy(); + + fireEvent.click(within(sourceRow!).getByRole('button', { name: '详情' })); + expect( + within(await screen.findByRole('dialog', { name: '素材详情' })).getByText( + '不单独计费', + ), + ).toBeTruthy(); +}); + test('后台素材查询缩略图使用 objectKey 换签后展示', async () => { render( , diff --git a/apps/admin-web/src/pages/AdminEditorAssetQueryPage.tsx b/apps/admin-web/src/pages/AdminEditorAssetQueryPage.tsx index 5bb5d25fa..d8276fe8f 100644 --- a/apps/admin-web/src/pages/AdminEditorAssetQueryPage.tsx +++ b/apps/admin-web/src/pages/AdminEditorAssetQueryPage.tsx @@ -24,6 +24,10 @@ const ADMIN_ASSET_READ_EXPIRE_SECONDS = 300; const ADMIN_ASSET_READ_DISPATCH_SPACING_MS = 40; const ADMIN_ASSET_READ_RETRY_DELAYS_MS = [400, 1_200, 3_000] as const; const ADMIN_ASSET_THUMBNAIL_ROOT_MARGIN = '240px 0px'; +const NON_BILLED_INTERMEDIATE_ASSET_KINDS = new Set([ + 'editor_green_screen_source', + 'editor_image_edit_source', +]); const AUDIO_ASSET_COVER_SRC = `${import.meta.env.DEV ? import.meta.env.BASE_URL : '/'}creation-home/audio-asset-cover.png`; let adminAssetReadDispatchTail = Promise.resolve(); @@ -217,7 +221,7 @@ export function AdminEditorAssetQueryPage({ {promptText} - {entry.generationCostMudPoints} 泥点 + {generationCostLabel(entry)}