fix(mobile): preserve assistant IDs and scope state

This commit is contained in:
2026-07-12 12:15:02 +08:00
parent 36b7bf28bf
commit 0d64cf0f21
8 changed files with 91 additions and 39 deletions
@@ -0,0 +1,14 @@
export const normalizeBackendId = (value: string) => {
const id = value.trim();
if (!/^[1-9]\d*$/.test(id)) throw new Error('PERSONAL_ID_INVALID');
return id;
};
export const personalItemApiPath = (id: string, suffix = '') =>
`/api/aihr/personal-assistant/items/${encodeURIComponent(normalizeBackendId(id))}${suffix}`;
export const personalSessionApiPath = (id: string) =>
`/api/aihr/personal-assistant/sessions/${encodeURIComponent(normalizeBackendId(id))}`;
export const personalItemRoute = (id: string) =>
`/pages/user/assistant/item?id=${encodeURIComponent(normalizeBackendId(id))}`;
+16 -15
View File
@@ -10,6 +10,7 @@ import type {
PersonalSpace
} from '@/types/api';
import { apiRequest, apiUrl, authHeaders, readTextPayload } from './api';
import { personalItemApiPath, personalSessionApiPath } from './personal-assistant-id';
export type KnowledgeScope = PersonalKnowledgeScope;
@@ -31,12 +32,12 @@ const queryString = (query: PersonalItemQuery) => {
};
export const askPersonalAssistant = (payload: {
sessionId?: number;
sessionId?: string;
queryText: string;
scope: KnowledgeScope[];
dateFrom?: string;
dateTo?: string;
itemIds?: number[];
itemIds?: string[];
outputFormat?: 'ANSWER' | 'ACTION_PLAN' | 'OUTLINE';
}) => apiRequest<PersonalAskResponse>({
url: '/api/aihr/personal-assistant/ask',
@@ -46,7 +47,7 @@ export const askPersonalAssistant = (payload: {
});
export const mergePersonalRows = (current: PersonalItem[], incoming: PersonalItem[]) => {
const rows = new Map<number, PersonalItem>();
const rows = new Map<string, PersonalItem>();
[...current, ...incoming].forEach((item) => rows.set(item.id, item));
return Array.from(rows.values());
};
@@ -61,8 +62,8 @@ export const loadPersonalItems = (query: PersonalItemQuery = {}) => apiRequest<P
method: 'GET'
});
export const loadPersonalItem = (id: number) => apiRequest<PersonalItem>({
url: `/api/aihr/personal-assistant/items/${id}`,
export const loadPersonalItem = (id: string) => apiRequest<PersonalItem>({
url: personalItemApiPath(id),
method: 'GET'
});
@@ -128,19 +129,19 @@ export const uploadPersonalFile = (file: PersonalSelectedFile, title?: string, c
});
});
export const retryPersonalItem = (id: number) => apiRequest<PersonalItem>({
url: `/api/aihr/personal-assistant/items/${id}/retry`,
export const retryPersonalItem = (id: string) => apiRequest<PersonalItem>({
url: personalItemApiPath(id, '/retry'),
method: 'POST'
});
export const deletePersonalItem = (id: number) => apiRequest<{ cleanupJobId: number }>({
url: `/api/aihr/personal-assistant/items/${id}`,
export const deletePersonalItem = (id: string) => apiRequest<{ cleanupJobId: string }>({
url: personalItemApiPath(id),
method: 'DELETE',
timeout: 15000
});
export const downloadPersonalItem = (id: number) => apiRequest<{ url: string; expiresAt?: string }>({
url: `/api/aihr/personal-assistant/items/${id}/download-url`,
export const downloadPersonalItem = (id: string) => apiRequest<{ url: string; expiresAt?: string }>({
url: personalItemApiPath(id, '/download-url'),
method: 'GET'
});
@@ -149,12 +150,12 @@ export const loadPersonalSessions = () => apiRequest<PersonalSession[]>({
method: 'GET'
});
export const loadPersonalSession = (id: number) => apiRequest<PersonalSessionDetail>({
url: `/api/aihr/personal-assistant/sessions/${id}`,
export const loadPersonalSession = (id: string) => apiRequest<PersonalSessionDetail>({
url: personalSessionApiPath(id),
method: 'GET'
});
export const deletePersonalSession = (id: number) => apiRequest<void>({
url: `/api/aihr/personal-assistant/sessions/${id}`,
export const deletePersonalSession = (id: string) => apiRequest<void>({
url: personalSessionApiPath(id),
method: 'DELETE'
});