From 34fc5981d4cc806aa3fd4b8de6dcdf760b7e1059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=B7=E9=BE=99?= Date: Wed, 13 Aug 2025 19:38:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E9=80=BB=E8=BE=91=E6=9B=B4?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/Interaction/RoleService.ts | 1 + app/service/Interaction/RoleShotService.ts | 19 ++++++++--- app/service/domain/Entities.ts | 2 ++ app/service/usecase/RoleEditUseCase.ts | 33 +++++++++++++++----- components/pages/work-flow/use-edit-data.tsx | 6 ++-- 5 files changed, 46 insertions(+), 15 deletions(-) diff --git a/app/service/Interaction/RoleService.ts b/app/service/Interaction/RoleService.ts index 1dabf89..429a1f1 100644 --- a/app/service/Interaction/RoleService.ts +++ b/app/service/Interaction/RoleService.ts @@ -304,6 +304,7 @@ export const useRoleServiceHook = (): UseRoleService => { name: libraryRole.name, generateText: libraryRole.generateText, imageUrl: libraryRole.imageUrl, + fromDraft: false }; selectRole(updatedRole); diff --git a/app/service/Interaction/RoleShotService.ts b/app/service/Interaction/RoleShotService.ts index b69e10e..01db3f4 100644 --- a/app/service/Interaction/RoleShotService.ts +++ b/app/service/Interaction/RoleShotService.ts @@ -41,19 +41,21 @@ interface UseRoleShotService { clearShotSelection: () => void; /** 设置选中的角色 */ setSelectedRole: (role: RoleEntity) => void; + /** 设置草稿箱角色列表 */ + setDraftRoleList: (roleList: RoleEntity[]) => void; } /** * 角色视频片段服务Hook * 提供角色与视频片段交互的所有响应式功能和业务逻辑 */ -export const useRoleShotServiceHook = (projectId: string,selectRole?:RoleEntity): UseRoleShotService => { +export const useRoleShotServiceHook = (projectId: string,selectRole?:RoleEntity,roleList?:RoleEntity[]): UseRoleShotService => { // 响应式状态 const [shotSelectionList, setShotSelectionList] = useState([]); const [selectedRoleId, setSelectedRoleId] = useState(null); const [selectedRole, setSelectedRole] = useState(selectRole || null); const [isReplacing, setIsReplacing] = useState(false); // 全局替换状态 - + const [draftRoleList, setDraftRoleList] = useState(roleList || []); // 计算属性 /** * 是否全选分镜 @@ -172,17 +174,23 @@ export const useRoleShotServiceHook = (projectId: string,selectRole?:RoleEntity) } ]; + const newDraftRoleList = draftRoleList.filter(role =>{ + if(role.name===selectedRole.name){ + role.fromDraft = true + } + return role.fromDraft + }); + console.log('newDraftRoleList', newDraftRoleList) // 循环调用接口,为每个选中的分镜单独调用 shotSelectionList.forEach(async (shot) => { try { - (selectedRole as any).shot = shot; // 调用应用角色到分镜接口(不等待完成) applyRoleToShots({ project_id: projectId, shot_id: shot.id, // 单个分镜ID character_replacements: characterReplacements, wait_for_completion: false, // 不等待完成,异步处理 - character_draft: JSON.stringify(selectedRole) + character_draft: JSON.stringify(newDraftRoleList) }).then(response => { if (response.successful) { console.log(`分镜 ${shot.id} 角色替换成功:`, response.data); @@ -236,7 +244,8 @@ export const useRoleShotServiceHook = (projectId: string,selectRole?:RoleEntity) toggleShotSelection, applyRoleToSelectedShots, clearShotSelection, - setSelectedRole + setSelectedRole, + setDraftRoleList }; }; diff --git a/app/service/domain/Entities.ts b/app/service/domain/Entities.ts index 2a374b6..199a5bc 100644 --- a/app/service/domain/Entities.ts +++ b/app/service/domain/Entities.ts @@ -40,6 +40,8 @@ export interface RoleEntity extends BaseEntity { tags: TagValueObject[]; /** 角色图片URL */ imageUrl: string; + /**来源于草稿箱 */ + fromDraft: boolean; } /** diff --git a/app/service/usecase/RoleEditUseCase.ts b/app/service/usecase/RoleEditUseCase.ts index ffa55bb..868f7d5 100644 --- a/app/service/usecase/RoleEditUseCase.ts +++ b/app/service/usecase/RoleEditUseCase.ts @@ -72,7 +72,8 @@ export class RoleEditUseCase { imageUrl: char.image_path || '', // 使用API返回的图片路径 loadingProgress: 100, // 默认加载完成 disableEdit: false, // 默认允许编辑 - updatedAt: Date.now() + updatedAt: Date.now(), + fromDraft: false }; return roleEntity; @@ -90,12 +91,24 @@ export class RoleEditUseCase { // if (!Array.isArray(projectRoleData)) { // throw new Error('项目角色数据格式错误'); // } + let draftRoleList:Record = {}; + // 如果草稿箱有数据,则返回草稿箱数据 + if(projectRoleData.character_draft){ + const roleList = JSON.parse(projectRoleData.character_draft); - if(projectRoleData.character_draft){ - const roleEntity: RoleEntity[] = JSON.parse(projectRoleData.character_draft); - return roleEntity; + for(const role of roleList){ + draftRoleList[role.name] = role; } + } return projectRoleData.characters.map((char, index) => { + if(draftRoleList[char.character_name]){ + return { + ...draftRoleList[char.character_name], + fromDraft: true, + id: `role_${index + 1}`, + updatedAt: Date.now(), + }; + } /** 角色实体对象 */ const roleEntity: RoleEntity = { id: `role_${index + 1}`, @@ -116,7 +129,8 @@ export class RoleEditUseCase { imageUrl: char.image_path || '', loadingProgress: 100, disableEdit: false, - updatedAt: Date.now() + updatedAt: Date.now(), + fromDraft: false }; return roleEntity; @@ -145,7 +159,8 @@ export class RoleEditUseCase { imageUrl: char.image_url || '', loadingProgress: 100, disableEdit: false, - updatedAt: Date.now() + updatedAt: Date.now(), + fromDraft: false }; return roleEntity; @@ -238,7 +253,8 @@ export class RoleEditUseCase { imageUrl: characterData.image_url || '', loadingProgress: 100, disableEdit: false, - updatedAt: Date.now() + updatedAt: Date.now(), + fromDraft: false }; return roleEntity; } catch (error) { @@ -361,7 +377,8 @@ export class RoleEditUseCase { imageUrl: imageUrl, // 使用传入的图片地址 loadingProgress: 100, // 加载完成 disableEdit: false, // 允许编辑 - updatedAt: Date.now() + updatedAt: Date.now(), + fromDraft: false }; return mockRole; diff --git a/components/pages/work-flow/use-edit-data.tsx b/components/pages/work-flow/use-edit-data.tsx index dc8aaaa..ed0871a 100644 --- a/components/pages/work-flow/use-edit-data.tsx +++ b/components/pages/work-flow/use-edit-data.tsx @@ -55,13 +55,15 @@ export const useEditData = (tabType: string, originalText?: string) => { toggleShotSelection, applyRoleToSelectedShots, clearShotSelection, - setSelectedRole - } = useRoleShotServiceHook(projectId, selectedRole || undefined); + setSelectedRole, + setDraftRoleList + } = useRoleShotServiceHook(projectId, selectedRole || undefined,roleList || undefined); useEffect(() => { console.log('useEditData-----selectedRole', selectedRole); if(selectedRole){ setSelectedRole(selectedRole); + setDraftRoleList(roleList || []); } }, [selectedRole]);