import type { PersonalAskResponse, PersonalItem, PersonalItemCreated, PersonalItemSourceType, PersonalKnowledgeScope, PersonalPage, PersonalSession, PersonalSessionDetail, PersonalSpace } from '@/types/api'; import { apiRequest, apiUrl, authHeaders, readTextPayload } from './api'; export type KnowledgeScope = PersonalKnowledgeScope; export interface PersonalItemQuery { pageNum?: number; pageSize?: number; status?: string; sourceType?: PersonalItemSourceType | ''; dateFrom?: string; dateTo?: string; keyword?: string; } const queryString = (query: PersonalItemQuery) => { const params = Object.entries(query) .filter(([, value]) => value !== undefined && value !== '') .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); return params.length ? `?${params.join('&')}` : ''; }; export const askPersonalAssistant = (payload: { sessionId?: number; queryText: string; scope: KnowledgeScope[]; dateFrom?: string; dateTo?: string; itemIds?: number[]; outputFormat?: 'ANSWER' | 'ACTION_PLAN' | 'OUTLINE'; }) => apiRequest({ url: '/api/aihr/personal-assistant/ask', method: 'POST', data: payload, timeout: 45000, clearAuthOnUnauthorized: false }); export const loadPersonalSpace = () => apiRequest({ url: '/api/aihr/personal-assistant/space', method: 'GET' }); export const loadPersonalItems = (query: PersonalItemQuery = {}) => apiRequest>({ url: `/api/aihr/personal-assistant/items${queryString(query)}`, method: 'GET' }); export const loadPersonalItem = (id: number) => apiRequest({ url: `/api/aihr/personal-assistant/items/${id}`, method: 'GET' }); export const createTextItem = (payload: { title?: string; content: string; capturedAt?: string; tags?: string[] }) => apiRequest({ url: '/api/aihr/personal-assistant/items/text', method: 'POST', data: payload }); export const createUrlItem = (payload: { url: string; title?: string; capturedAt?: string }) => apiRequest({ url: '/api/aihr/personal-assistant/items/url', method: 'POST', data: payload, timeout: 45000 }); export interface PersonalSelectedFile { path: string; name: string; size: number; } export const choosePersonalFile = () => new Promise((resolve, reject) => { uni.chooseFile({ count: 1, type: 'all', success: (result) => { const files = Array.isArray(result.tempFiles) ? result.tempFiles : []; const file = (files[0] || {}) as Partial; const path = file.path || result.tempFilePaths?.[0] || ''; if (!path) { reject(new Error('未获取到文件路径')); return; } resolve({ path, name: file.name || path.split('/').pop() || 'personal-file', size: Number(file.size || 0) }); }, fail: () => reject(new Error('未选择文件')) }); }); export const uploadPersonalFile = (file: PersonalSelectedFile, title?: string, capturedAt?: string) => new Promise((resolve, reject) => { uni.uploadFile({ url: apiUrl('/api/aihr/personal-assistant/items/file'), filePath: file.path, name: 'file', header: authHeaders(false), formData: { ...(title?.trim() ? { title: title.trim() } : {}), ...(capturedAt ? { capturedAt } : {}) }, timeout: 45000, success: (response) => { try { resolve(readTextPayload(response.statusCode, response.data)); } catch (error) { reject(error); } }, fail: () => reject(new Error('文件收藏失败')) }); }); export const retryPersonalItem = (id: number) => apiRequest({ url: `/api/aihr/personal-assistant/items/${id}/retry`, method: 'POST' }); export const deletePersonalItem = (id: number) => apiRequest<{ cleanupJobId: number }>({ url: `/api/aihr/personal-assistant/items/${id}`, method: 'DELETE', timeout: 15000 }); export const downloadPersonalItem = (id: number) => apiRequest<{ url: string; expiresAt?: string }>({ url: `/api/aihr/personal-assistant/items/${id}/download-url`, method: 'GET' }); export const loadPersonalSessions = () => apiRequest({ url: '/api/aihr/personal-assistant/sessions', method: 'GET' }); export const loadPersonalSession = (id: number) => apiRequest({ url: `/api/aihr/personal-assistant/sessions/${id}`, method: 'GET' }); export const deletePersonalSession = (id: number) => apiRequest({ url: `/api/aihr/personal-assistant/sessions/${id}`, method: 'DELETE' });