merge: 集成 AI 设计生成任务修复

This commit is contained in:
2026-08-14 15:32:55 +08:00
14 changed files with 1023 additions and 218 deletions

View File

@@ -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,