diff --git a/web/src/services/orchestrator.js b/web/src/services/orchestrator.js index 2dd6733..3d40d49 100644 --- a/web/src/services/orchestrator.js +++ b/web/src/services/orchestrator.js @@ -7,13 +7,16 @@ export function runOrchestrator(payload) { }) } -export function fetchLatestConversation(userId, sessionType = '') { +export function fetchLatestConversation(userId, sessionType = '', options = {}) { const params = new URLSearchParams({ user_id: String(userId || '').trim() }) if (String(sessionType || '').trim()) { params.set('session_type', String(sessionType || '').trim()) } + if (options.preferRecoverable) { + params.set('prefer_recoverable', 'true') + } return apiRequest(`/orchestrator/conversations/latest?${params.toString()}`) } diff --git a/web/src/services/reimbursements.js b/web/src/services/reimbursements.js index daf4de3..a82143d 100644 --- a/web/src/services/reimbursements.js +++ b/web/src/services/reimbursements.js @@ -36,12 +36,37 @@ export function fetchExpenseClaimItemAttachmentMeta(claimId, itemId) { return apiRequest(`/reimbursements/claims/${encodeURIComponent(String(claimId || '').trim())}/items/${encodeURIComponent(String(itemId || '').trim())}/attachment/meta`) } +export function fetchExpenseClaimItemAttachmentPreview(claimId, itemId) { + return apiRequest(`/reimbursements/claims/${encodeURIComponent(String(claimId || '').trim())}/items/${encodeURIComponent(String(itemId || '').trim())}/attachment/preview`, { + responseType: 'blob' + }) +} + export function fetchExpenseClaimItemAttachment(claimId, itemId) { return apiRequest(`/reimbursements/claims/${encodeURIComponent(String(claimId || '').trim())}/items/${encodeURIComponent(String(itemId || '').trim())}/attachment`, { responseType: 'blob' }) } +export async function fetchExpenseClaimAttachmentAsset(pathOrUrl) { + const target = String(pathOrUrl || '').trim() + if (!target) { + throw new Error('预览地址为空。') + } + + if (/^https?:\/\//i.test(target)) { + const response = await fetch(target) + if (!response.ok) { + throw new Error(`预览加载失败(${response.status})。`) + } + return response.blob() + } + + return apiRequest(target, { + responseType: 'blob' + }) +} + export function deleteExpenseClaimItemAttachment(claimId, itemId) { return apiRequest(`/reimbursements/claims/${encodeURIComponent(String(claimId || '').trim())}/items/${encodeURIComponent(String(itemId || '').trim())}/attachment`, { method: 'DELETE'