diff --git a/video-gen-admin/src/api/index.ts b/video-gen-admin/src/api/index.ts index 80412b6a..0de34519 100644 --- a/video-gen-admin/src/api/index.ts +++ b/video-gen-admin/src/api/index.ts @@ -348,8 +348,9 @@ export async function deleteIndustryConfig(id: string): Promise { await api.delete(`/admin/industry-configs/${id}`); } -export async function getVideoEngines(): Promise { - return api.get('/admin/video-engines'); +export async function getVideoEngines(options?: { includeDeleted?: boolean }): Promise { + const query = options?.includeDeleted ? '?include_deleted=true' : ''; + return api.get(`/admin/video-engines${query}`); } export async function saveVideoEngine(engine: any): Promise { @@ -361,8 +362,9 @@ export async function deleteVideoEngine(id: string): Promise { await api.delete(`/admin/video-engines/${id}`); } -export async function getImageEngines(): Promise { - return api.get('/admin/image-engines'); +export async function getImageEngines(options?: { includeDeleted?: boolean }): Promise { + const query = options?.includeDeleted ? '?include_deleted=true' : ''; + return api.get(`/admin/image-engines${query}`); } export async function saveImageEngine(engine: any): Promise { diff --git a/video-gen-admin/src/pages/AdminGenerationAiRecords.tsx b/video-gen-admin/src/pages/AdminGenerationAiRecords.tsx index 5c11a1fe..6b8487b9 100644 --- a/video-gen-admin/src/pages/AdminGenerationAiRecords.tsx +++ b/video-gen-admin/src/pages/AdminGenerationAiRecords.tsx @@ -29,8 +29,13 @@ import { VideoCameraOutlined, } from '@ant-design/icons'; import dayjs from 'dayjs'; -import { getAdminGenerationAiTasks } from '../api'; -import type { GenerationAIMediaReference, GenerationAITaskOut } from '../types'; +import { getAdminGenerationAiTasks, getImageEngines, getVideoEngines } from '../api'; +import type { + GenerationAiImageEngine, + GenerationAIMediaReference, + GenerationAITaskOut, + GenerationAiVideoEngine, +} from '../types'; import { formatDate } from '../utils/formatDate'; import GenerationTaskResourceGrid from '../components/generation/GenerationTaskResourceGrid'; @@ -240,6 +245,9 @@ const AdminGenerationAiRecords: React.FC = () => { const [createdRange, setCreatedRange] = useState([todayStart(), todayEnd()]); const [queryCreatedRange, setQueryCreatedRange] = useState([todayStart(), todayEnd()]); const [reloadKey, setReloadKey] = useState(0); + const [engineListLoading, setEngineListLoading] = useState(false); + const [imageEngines, setImageEngines] = useState([]); + const [videoEngines, setVideoEngines] = useState([]); const [preview, setPreview] = useState(null); const [resourceState, setResourceState] = useState(EMPTY_RESOURCE_STATE); @@ -280,6 +288,64 @@ const AdminGenerationAiRecords: React.FC = () => { load(); }, [load, reloadKey]); + useEffect(() => { + let cancelled = false; + + const loadEngineOptions = async () => { + setEngineListLoading(true); + try { + const [images, videos] = await Promise.all([ + getImageEngines({ includeDeleted: true }), + getVideoEngines({ includeDeleted: true }), + ]); + if (!cancelled) { + setImageEngines(images || []); + setVideoEngines(videos || []); + } + } catch (error: any) { + if (!cancelled) { + message.error(error?.message || '加载模型引擎列表失败'); + } + } finally { + if (!cancelled) setEngineListLoading(false); + } + }; + + void loadEngineOptions(); + return () => { + cancelled = true; + }; + }, []); + + const engineOptions = useMemo(() => { + const toOption = ( + engine: GenerationAiImageEngine | GenerationAiVideoEngine, + type: 'image' | 'video', + ) => { + const deleted = Boolean(engine.deletedAt); + const typeText = type === 'image' ? '图片' : '视频'; + const deletedText = deleted ? '[已删除]' : ''; + const detailText = [engine.name, engine.modelName, engine.provider, engine.id] + .filter(Boolean) + .join(' / '); + const label = `[${typeText}]${deletedText} ${detailText}`; + return { + value: engine.id, + label, + searchText: [engine.id, engine.name, engine.modelName, engine.provider, typeText, deleted ? '已删除' : ''] + .filter(Boolean) + .join(' ') + .toLowerCase(), + }; + }; + + const merged = [ + ...imageEngines.map((engine) => toOption(engine, 'image')), + ...videoEngines.map((engine) => toOption(engine, 'video')), + ]; + return Array.from(new Map(merged.map((option) => [option.value, option])).values()); + }, [imageEngines, videoEngines]); + useEffect(() => { if (!preview) { setResourceState(EMPTY_RESOURCE_STATE); @@ -969,21 +1035,17 @@ const AdminGenerationAiRecords: React.FC = () => {