diff --git a/fund-admin/src/api/expense.ts b/fund-admin/src/api/expense.ts index 3a512fb..21d016b 100644 --- a/fund-admin/src/api/expense.ts +++ b/fund-admin/src/api/expense.ts @@ -62,3 +62,39 @@ export function rejectExpense(id: number, comment: string) { export function confirmPayExpense(id: number, payChannel: string, payVoucher?: string) { return request.put(`/exp/api/v1/exp/expense/${id}/confirm-pay?payChannel=${payChannel}&payVoucher=${payVoucher || ''}`) } + +// 导出支出明细 +export function exportExpense(params?: { title?: string; expenseType?: number; approvalStatus?: number; payStatus?: number }) { + const baseUrl = import.meta.env.VITE_API_URL || '' + const token = localStorage.getItem('token') + const tenantId = localStorage.getItem('tenantId') || '1' + + const queryParams = new URLSearchParams() + if (params?.title) queryParams.append('title', params.title) + if (params?.expenseType) queryParams.append('expenseType', String(params.expenseType)) + if (params?.approvalStatus !== undefined) queryParams.append('approvalStatus', String(params.approvalStatus)) + if (params?.payStatus !== undefined) queryParams.append('payStatus', String(params.payStatus)) + + const queryString = queryParams.toString() + const url = `${baseUrl}/exp/api/v1/exp/expense/export${queryString ? '?' + queryString : ''}` + + return fetch(url, { + headers: { + Authorization: `Bearer ${token}`, + 'X-Tenant-Id': tenantId + } + }).then(response => { + if (!response.ok) throw new Error('导出失败') + + const contentDisposition = response.headers.get('Content-Disposition') + let filename = '支出明细.xlsx' + if (contentDisposition) { + const match = contentDisposition.match(/filename\*=utf-8''(.+)/i) + if (match && match[1]) { + filename = decodeURIComponent(match[1]) + } + } + + return response.blob().then(blob => ({ blob, filename })) + }) +} diff --git a/fund-admin/src/api/receivable.ts b/fund-admin/src/api/receivable.ts index 9c6c206..14e889f 100644 --- a/fund-admin/src/api/receivable.ts +++ b/fund-admin/src/api/receivable.ts @@ -49,3 +49,39 @@ export function getReceiptById(id: number) { export function createReceipt(data: any) { return request.post('/receipt/api/v1/receipt/receipt', data) } + +// 导出应收款明细 +export function exportReceivable(params?: { projectId?: number; customerId?: number; status?: string; confirmStatus?: number }) { + const baseUrl = import.meta.env.VITE_API_URL || '' + const token = localStorage.getItem('token') + const tenantId = localStorage.getItem('tenantId') || '1' + + const queryParams = new URLSearchParams() + if (params?.projectId) queryParams.append('projectId', String(params.projectId)) + if (params?.customerId) queryParams.append('customerId', String(params.customerId)) + if (params?.status) queryParams.append('status', params.status) + if (params?.confirmStatus !== undefined) queryParams.append('confirmStatus', String(params.confirmStatus)) + + const queryString = queryParams.toString() + const url = `${baseUrl}/receipt/api/v1/receipt/receivable/export${queryString ? '?' + queryString : ''}` + + return fetch(url, { + headers: { + Authorization: `Bearer ${token}`, + 'X-Tenant-Id': tenantId + } + }).then(response => { + if (!response.ok) throw new Error('导出失败') + + const contentDisposition = response.headers.get('Content-Disposition') + let filename = '应收款明细.xlsx' + if (contentDisposition) { + const match = contentDisposition.match(/filename\*=utf-8''(.+)/i) + if (match && match[1]) { + filename = decodeURIComponent(match[1]) + } + } + + return response.blob().then(blob => ({ blob, filename })) + }) +} diff --git a/fund-admin/src/views/expense/index.vue b/fund-admin/src/views/expense/index.vue index 53ec85f..7cc0679 100644 --- a/fund-admin/src/views/expense/index.vue +++ b/fund-admin/src/views/expense/index.vue @@ -40,6 +40,7 @@
新增支出 + 导出Excel
@@ -262,7 +263,7 @@