diff --git a/api/allMovieType.ts b/api/allMovieType.ts index c9b742f..0b1a7b3 100644 --- a/api/allMovieType.ts +++ b/api/allMovieType.ts @@ -479,25 +479,20 @@ export interface CharacterUpdateAndRegenerateRequest { * 角色更新和重新生成响应 */ export interface CharacterUpdateAndRegenerateResponse { - /** 项目ID */ - project_id: string; - /** 更新后的角色对象 */ - character: { - /** 角色名称 */ - character_name: string; - /** 角色描述(已更新) */ - character_description: string; - /** 重新生成产物的图片地址 */ - image_path?: string; - /** 角色类型/作用 */ - role?: string; - /** 性别 */ - gender?: string; - /** 角色简要说明/摘要 */ - brief?: string; - /** 从角色描述提取的高亮关键词/短语 */ - highlights: string[]; - }; + /** 角色名称 */ + character_name: string; + /** 角色描述(已更新) */ + character_description: string; + /** 重新生成产物的图片地址 */ + image_path?: string; + /** 角色类型/作用 */ + role?: string; + /** 性别 */ + gender?: string; + /** 角色简要说明/摘要 */ + brief?: string; + /** 从角色描述提取的高亮关键词/短语 */ + highlights: string[]; } /** diff --git a/api/video_flow.ts b/api/video_flow.ts index 3121269..4cb2329 100644 --- a/api/video_flow.ts +++ b/api/video_flow.ts @@ -890,7 +890,7 @@ export const getCharacterListByProjectWithHighlight = async (request: { * @param request - 角色更新和重新生成请求参数 * @returns Promise> 更新后的角色信息 */ -export const updateAndRegenerateCharacter = async (request: CharacterUpdateAndRegenerateRequest): Promise> => { +export const updateAndRegenerateCharacter = async (request: CharacterUpdateAndRegenerateRequest) => { return post>("/character/update_and_regenerate", request); }; diff --git a/app/service/Interaction/RoleService.ts b/app/service/Interaction/RoleService.ts index a9206fd..e6d4566 100644 --- a/app/service/Interaction/RoleService.ts +++ b/app/service/Interaction/RoleService.ts @@ -22,7 +22,7 @@ interface UseRoleService { /** 获取角色列表 */ fetchRoleList: (projectId: string) => Promise; /** 选择角色 */ - selectRole: (roleId: string) => Promise; + selectRole: (role: RoleEntity) => Promise; /** 优化AI文本 */ optimizeRoleText: (userSuggestion: string) => Promise; /** 修改AI文本 */ @@ -85,43 +85,22 @@ export const useRoleServiceHook = (): UseRoleService => { } }, []); - /** - * 初始化角色数据 - * @description 初始化当前选中角色的AI文本数据 - * @param roleId 角色ID - * @throws {Error} 当未选择角色或API调用失败时抛出错误 - * @returns {Promise} 初始化完成后的Promise - */ - const initializeRoleData = useCallback(async (roleId: string) => { - - }, []); /** * 选择角色 * @description 根据角色ID选择角色,并初始化相关的UseCase实例 * @param roleId 角色ID */ - const selectRole = useCallback(async (roleId: string) => { - const role = roleList.find(r => r.id === roleId); - if (role) { + const selectRole = useCallback(async (role: RoleEntity) => { + console.log('selectRole', role); + // 根据 role.name 完全替换掉旧的数据 + setRoleList(prev => prev.map(r => r.name === role.name ? role : r)); setSelectedRole(role); - // 如果RoleEditUseCase已经初始化,直接使用;否则创建新的 - if (!roleEditUseCase) { - const newRoleEditUseCase = new RoleEditUseCase(); - newRoleEditUseCase.roleList = roleList; - setRoleEditUseCase(newRoleEditUseCase); - } - // 调用selectRole方法 - await roleEditUseCase!.selectRole(roleId); + roleEditUseCase!.selectRole(role); - // 初始化角色数据 - await initializeRoleData(roleId); - } else { - throw new Error('未找到对应的角色'); - } - }, [roleList, roleEditUseCase, initializeRoleData]); + }, [roleEditUseCase]); /** * 优化AI文本 @@ -168,7 +147,7 @@ export const useRoleServiceHook = (): UseRoleService => { // 更新当前选中角色 if (selectedRole) { - setSelectedRole({ ...selectedRole, generateText: optimizedDescription, tags: keywords.map(keyword => ({ + selectRole({ ...selectedRole, generateText: optimizedDescription, tags: keywords.map(keyword => ({ id: `tag_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`, /** 名称 */ name: keyword, @@ -209,9 +188,9 @@ export const useRoleServiceHook = (): UseRoleService => { // 更新当前选中角色 if (selectedRole) { - setSelectedRole({ ...selectedRole, generateText: newContent }); + selectRole({ ...selectedRole, generateText: newContent }); } - }, [roleEditUseCase, selectedRole]); + }, [roleEditUseCase, selectRole, selectedRole]); /** * 重新生成角色 @@ -238,7 +217,7 @@ export const useRoleServiceHook = (): UseRoleService => { selectedRole.name, currentRoleText ); - setSelectedRole(newRoleEntity); + selectRole(newRoleEntity); // 更新角色列表 setRoleList(prev => @@ -252,7 +231,7 @@ export const useRoleServiceHook = (): UseRoleService => { console.error('重新生成角色失败:', error); throw error; } - }, [roleEditUseCase, selectedRole, currentRoleText, projectId]); + }, [roleEditUseCase, selectedRole, currentRoleText, projectId, selectRole]); /** * 获取用户角色库 @@ -297,9 +276,6 @@ export const useRoleServiceHook = (): UseRoleService => { try { await roleEditUseCase.replaceRoleById(selectedRole.id, replaceRoleId); - // 重新获取角色数据 - await initializeRoleData(selectedRole.id); - // 更新角色列表 const libraryRole = userRoleLibrary.find(role => role.id === replaceRoleId); if (libraryRole) { @@ -310,7 +286,7 @@ export const useRoleServiceHook = (): UseRoleService => { imageUrl: libraryRole.imageUrl, }; - setSelectedRole(updatedRole); + selectRole(updatedRole); setRoleList(prev => prev.map(role => role.id === selectedRole.id @@ -323,7 +299,7 @@ export const useRoleServiceHook = (): UseRoleService => { console.error('替换角色失败:', error); throw error; } - }, [selectedRole, roleEditUseCase, userRoleLibrary, initializeRoleData]); + }, [selectedRole, roleEditUseCase, userRoleLibrary]); /** * 上传图片到七牛云 diff --git a/app/service/usecase/RoleEditUseCase.ts b/app/service/usecase/RoleEditUseCase.ts index 16432ce..a2c8ca9 100644 --- a/app/service/usecase/RoleEditUseCase.ts +++ b/app/service/usecase/RoleEditUseCase.ts @@ -156,25 +156,17 @@ export class RoleEditUseCase { /** * 选中某个角色作为当前活跃角色 - * @param roleId 角色ID + * @param role */ - async selectRole(roleId: string): Promise { - try { - // 从已获取的角色列表中查找对应的角色实体 - const roleEntity = this.roleList.find(role => role.id === roleId); - if (roleEntity) { - this.selectedRole = roleEntity; - // 获取角色数据 - const response = await getRoleData({ roleId }); - if (!response.successful) { - throw new Error(response.message || '获取角色数据失败'); - } - } else { - throw new Error('未找到对应的角色实体,请先获取角色列表'); - } - } catch (error) { - console.error('选择角色失败:', error); - throw error; + /** + * 选中某个角色作为当前活跃角色,并用新角色替换掉roleList中name相同的项 + * @param role 选中的角色 + */ + async selectRole(role: RoleEntity): Promise { + this.selectedRole = role; + console.log(' this.selectedRole', this.selectedRole) + if (Array.isArray(this.roleList)) { + this.roleList = this.roleList.map(r => r.name === role.name ? role : r); } } @@ -203,7 +195,7 @@ export class RoleEditUseCase { throw new Error(response.message || 'AI生成角色失败'); } - const characterData = response.data.character; + const characterData = response.data; // 将API响应转换为RoleEntity const roleEntity: RoleEntity = { @@ -231,29 +223,6 @@ export class RoleEditUseCase { } } - /** - * 应用此角色到指定分镜 - * @param shotIds 分镜ID列表 - * @param roleId 角色ID - * @returns 应用结果 - */ - async applyRole(shotIds: string[], roleId: string) { - try { - const response = await applyRoleToShots({ - roleId, - shotIds, - }); - - if (response.successful) { - return response.data; - } else { - throw new Error(response.message || '应用角色到分镜失败'); - } - } catch (error) { - console.error('应用角色到分镜失败:', error); - throw error; - } - } /** * 获取角色应用到的分镜列表 @@ -305,9 +274,9 @@ export class RoleEditUseCase { */ async optimizeRoleDescription( selectedRole: RoleEntity): Promise<{optimizedDescription: string, keywords: string[]}> { try { - if (!this.selectedRole) { - throw new Error('请先选择角色'); - } + // if (!this.selectedRole) { + // throw new Error('请先选择角色'); + // } // 调用新的AI优化角色描述API const response = await generateCharacterDescription({ diff --git a/components/ui/character-tab-content.tsx b/components/ui/character-tab-content.tsx index 865980d..91fcde5 100644 --- a/components/ui/character-tab-content.tsx +++ b/components/ui/character-tab-content.tsx @@ -104,7 +104,7 @@ export function CharacterTabContent({ console.log('-==========roleData===========-', roleData); // 只在初始化且有角色数据时执行 if (!isInitialized && roleData.length > 0) { - selectRole(roleData[0].id); + selectRole(roleData[0]); setIsInitialized(true); } }, [roleData, isInitialized]);