merge: 集成 AI 设计生成任务修复
This commit is contained in:
@@ -484,6 +484,22 @@ export const useImageWorkspaceStore = create<ImageWorkspaceState>((set, get) =>
|
||||
return message;
|
||||
};
|
||||
|
||||
const refreshWorkspaceTasks = async (
|
||||
workspaceId: string,
|
||||
): Promise<DesignGenerationTask[]> => {
|
||||
const requestedViewRevision = get().workspace?.workspaceId === workspaceId
|
||||
? get().workspace?.viewRevision ?? 0
|
||||
: 0;
|
||||
const tasks = await fetchImageWorkspaceTasks(workspaceId);
|
||||
const currentWorkspace = get().workspace;
|
||||
if (get().activeWorkspaceId === workspaceId
|
||||
&& currentWorkspace?.workspaceId === workspaceId
|
||||
&& currentWorkspace.viewRevision === requestedViewRevision) {
|
||||
set((state) => ({ tasks: mergeTasks(state.tasks, tasks) }));
|
||||
}
|
||||
return tasks;
|
||||
};
|
||||
|
||||
const applyWorkspace = (workspace: DesignWorkspace): DesignWorkspace => {
|
||||
set((state) => {
|
||||
return {
|
||||
@@ -810,18 +826,8 @@ export const useImageWorkspaceStore = create<ImageWorkspaceState>((set, get) =>
|
||||
set({ tasks: [] });
|
||||
return [];
|
||||
}
|
||||
const requestedViewRevision = get().workspace?.workspaceId === workspaceId
|
||||
? get().workspace?.viewRevision ?? 0
|
||||
: 0;
|
||||
try {
|
||||
const tasks = await fetchImageWorkspaceTasks(workspaceId);
|
||||
const currentWorkspace = get().workspace;
|
||||
if (get().activeWorkspaceId === workspaceId
|
||||
&& currentWorkspace?.workspaceId === workspaceId
|
||||
&& currentWorkspace.viewRevision === requestedViewRevision) {
|
||||
set((state) => ({ tasks: mergeTasks(state.tasks, tasks) }));
|
||||
}
|
||||
return tasks;
|
||||
return await refreshWorkspaceTasks(workspaceId);
|
||||
} catch (error) {
|
||||
set({ error: handleRequestError(error) });
|
||||
throw error;
|
||||
@@ -888,6 +894,17 @@ export const useImageWorkspaceStore = create<ImageWorkspaceState>((set, get) =>
|
||||
const conversation = get().conversation;
|
||||
if (!workspace || !conversation) throw new Error('请先选择设计会话');
|
||||
const clientTurnId = createImageWorkspaceTurnId();
|
||||
const requestWorkspaceLoadGeneration = workspaceLoadGeneration;
|
||||
const requestConversationSelectionGeneration = conversationSelectionGeneration;
|
||||
const isActiveConfirmationWorkspace = (): boolean => (
|
||||
get().activeWorkspaceId === workspace.workspaceId
|
||||
);
|
||||
const isCurrentConfirmationConversation = (): boolean => (
|
||||
isActiveConfirmationWorkspace()
|
||||
&& requestWorkspaceLoadGeneration === workspaceLoadGeneration
|
||||
&& requestConversationSelectionGeneration === conversationSelectionGeneration
|
||||
&& get().activeConversationId === conversation.conversationId
|
||||
);
|
||||
try {
|
||||
set({
|
||||
pendingTurn: createPendingTurn(conversation, clientTurnId, '确认生成'),
|
||||
@@ -900,39 +917,65 @@ export const useImageWorkspaceStore = create<ImageWorkspaceState>((set, get) =>
|
||||
quoteId,
|
||||
clientTurnId,
|
||||
);
|
||||
if (get().activeWorkspaceId === workspace.workspaceId) {
|
||||
if (get().activeConversationId === conversation.conversationId) {
|
||||
applyConversation(updated);
|
||||
}
|
||||
let confirmedTaskVisible = get().tasks.some((task) => task.quoteId === quoteId);
|
||||
for (
|
||||
let attempt = 0;
|
||||
!confirmedTaskVisible && attempt < CONFIRMED_TASK_RECONCILE_ATTEMPTS;
|
||||
attempt += 1
|
||||
) {
|
||||
if (get().activeWorkspaceId !== workspace.workspaceId) return updated;
|
||||
const refreshed = await get().refreshTasks();
|
||||
if (get().activeWorkspaceId !== workspace.workspaceId) return updated;
|
||||
confirmedTaskVisible = refreshed.some((task) => task.quoteId === quoteId)
|
||||
|| get().tasks.some((task) => task.quoteId === quoteId);
|
||||
if (!confirmedTaskVisible && attempt + 1 < CONFIRMED_TASK_RECONCILE_ATTEMPTS) {
|
||||
await new Promise<void>((resolve) => {
|
||||
setTimeout(resolve, CONFIRMED_TASK_RECONCILE_INTERVAL_MS);
|
||||
});
|
||||
}
|
||||
}
|
||||
if (!confirmedTaskVisible) {
|
||||
throw new ImageWorkspaceApiError(
|
||||
502,
|
||||
'generation_task_not_visible',
|
||||
'生成已确认,但任务列表同步超时。请刷新项目查看,不要重复确认。',
|
||||
);
|
||||
if (isCurrentConfirmationConversation()) applyConversation(updated);
|
||||
if (!isActiveConfirmationWorkspace()) return updated;
|
||||
let confirmedTaskVisible = get().tasks.some((task) => task.quoteId === quoteId);
|
||||
for (
|
||||
let attempt = 0;
|
||||
!confirmedTaskVisible && attempt < CONFIRMED_TASK_RECONCILE_ATTEMPTS;
|
||||
attempt += 1
|
||||
) {
|
||||
if (!isActiveConfirmationWorkspace()) return updated;
|
||||
const refreshed = await refreshWorkspaceTasks(workspace.workspaceId);
|
||||
if (!isActiveConfirmationWorkspace()) return updated;
|
||||
confirmedTaskVisible = refreshed.some((task) => task.quoteId === quoteId)
|
||||
|| get().tasks.some((task) => task.quoteId === quoteId);
|
||||
if (!confirmedTaskVisible && attempt + 1 < CONFIRMED_TASK_RECONCILE_ATTEMPTS) {
|
||||
await new Promise<void>((resolve) => {
|
||||
setTimeout(resolve, CONFIRMED_TASK_RECONCILE_INTERVAL_MS);
|
||||
});
|
||||
}
|
||||
}
|
||||
if (!confirmedTaskVisible) {
|
||||
throw new ImageWorkspaceApiError(
|
||||
502,
|
||||
'generation_task_not_visible',
|
||||
'生成已确认,但任务列表同步超时。请刷新项目查看,不要重复确认。',
|
||||
);
|
||||
}
|
||||
return updated;
|
||||
} catch (error) {
|
||||
if (get().activeWorkspaceId !== workspace.workspaceId
|
||||
|| get().activeConversationId !== conversation.conversationId) throw error;
|
||||
if (!isActiveConfirmationWorkspace()) throw error;
|
||||
const taskVisibilityAlreadyReconciled = error instanceof ImageWorkspaceApiError
|
||||
&& error.code === 'generation_task_not_visible';
|
||||
let confirmedTaskVisible = get().tasks.some((task) => task.quoteId === quoteId);
|
||||
if (!taskVisibilityAlreadyReconciled && !confirmedTaskVisible) {
|
||||
const refreshed = await refreshWorkspaceTasks(workspace.workspaceId).catch(() => []);
|
||||
if (!isActiveConfirmationWorkspace()) throw error;
|
||||
confirmedTaskVisible = refreshed.some((task) => task.quoteId === quoteId)
|
||||
|| get().tasks.some((task) => task.quoteId === quoteId);
|
||||
}
|
||||
if (confirmedTaskVisible) {
|
||||
if (!isCurrentConfirmationConversation()) return conversation;
|
||||
const refreshedConversation = await fetchImageWorkspaceConversation(
|
||||
workspace.workspaceId,
|
||||
conversation.conversationId,
|
||||
).catch(() => null);
|
||||
if (!isCurrentConfirmationConversation()) return conversation;
|
||||
const recoveredConversation = refreshedConversation
|
||||
? applyConversation(refreshedConversation)
|
||||
: get().conversation;
|
||||
if (recoveredConversation?.conversationId === conversation.conversationId) {
|
||||
set((state) => ({
|
||||
error: null,
|
||||
pendingTurn: state.pendingTurn?.clientTurnId === clientTurnId
|
||||
? null
|
||||
: state.pendingTurn,
|
||||
}));
|
||||
return recoveredConversation;
|
||||
}
|
||||
}
|
||||
if (!isCurrentConfirmationConversation()) throw error;
|
||||
const errorMessage = handleRequestError(error);
|
||||
set((state) => ({
|
||||
error: errorMessage,
|
||||
|
||||
Reference in New Issue
Block a user