import { SceneEntity, AITextEntity, TagEntity } from '../domain/Entities'; import { SceneItem, TagItem, TextItem } from '../domain/Item'; import { regenerateScene, applySceneToShots, getSceneData } from '@/api/video_flow'; /** * 场景编辑用例 * 负责场景内容的初始化、修改和优化 */ export class SceneEditUseCase { constructor(private sceneItem: SceneItem) { } /** * @description: 重新生成场景 * @param {TextItem} prompt * @param {TagItem[]} tags * @return {*} */ async AIgenerateScene(prompt: TextItem, tags: TagItem[]): Promise { const promptText = prompt.entity.content; const tagList = tags.map((tag) => tag.entity.content); // 调用重新生成场景接口 const response = await regenerateScene({ sceneId: this.sceneItem.entity.id || '', prompt: promptText, tagTypes: tagList, }); if (response.successful) { const sceneEntity = response.data; this.sceneItem.setEntity(sceneEntity); return sceneEntity; } else { throw new Error(`重新生成场景失败: ${response.message}`); } } /** * 应用此场景到指定分镜 * @param shotIds 分镜ID列表 * @returns 应用结果 */ async applyScene(shotIds: string[]) { const sceneId = this.sceneItem.entity.id; return await applySceneToShots({ sceneId, shotIds }); } /** * 重新获取当前场景的数据 * @description 从服务器重新获取当前场景的AI文本和标签数据,并更新当前实体 * @returns Promise<{ text: AITextEntity; tags: TagEntity[] }> 场景相关的AI文本和标签数据 * @throws {Error} 当API调用失败时抛出错误 */ async refreshSceneData(): Promise<{ text: AITextEntity; tags: TagEntity[] }> { const sceneId = this.sceneItem.entity.id; if (!sceneId) { throw new Error('场景ID不存在,无法获取场景数据'); } const response = await getSceneData({ sceneId: sceneId }); if (response.successful) { // 更新当前场景的实体数据 const { text, tags } = response.data; // 更新场景实体中的相关字段 const updatedSceneEntity = { ...this.sceneItem.entity, generateTextId: text.id, // 更新AI文本ID tagIds: tags.map(tag => tag.id), // 更新标签ID列表 updatedAt: Date.now(), // 更新时间戳 }; // 更新当前UseCase中的实体 this.sceneItem.setEntity(updatedSceneEntity); return response.data; } else { throw new Error(`获取场景数据失败: ${response.message}`); } } }