fix: 修复 AI 设计确认生成任务链路
This commit is contained in:
@@ -888,6 +888,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 +911,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 get().refreshTasks();
|
||||
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 get().refreshTasks().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