From e45f71956bebb5e282999ee23b833a95b30a54b3 Mon Sep 17 00:00:00 2001 From: "zhonghua.li" Date: Sat, 25 Apr 2026 22:37:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=BD=93=E6=97=A5=E6=B1=87?= =?UTF-8?q?=E6=80=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/lb-daily-user-trade-report.js | 12 ++++ src/utils/request.js | 7 ++ src/views/lb-business/daily-report/index.vue | 71 ++++++++++++++++++++ 3 files changed, 90 insertions(+) diff --git a/src/api/lb-daily-user-trade-report.js b/src/api/lb-daily-user-trade-report.js index 9c7d780..5604bc2 100644 --- a/src/api/lb-daily-user-trade-report.js +++ b/src/api/lb-daily-user-trade-report.js @@ -59,3 +59,15 @@ export function calculateReportSumByDateAndTenant(reportDate, tenantId) { } }) } + +export function exportLbDailyUserTradeReportByDateAndTenant(reportDate, tenantId) { + return request({ + url: '/lbDailyUserTradeReport/export/by-date-and-tenant', + method: 'get', + params: { + reportDate, + tenantId + }, + responseType: 'blob' + }) +} diff --git a/src/utils/request.js b/src/utils/request.js index 0a30440..6748d10 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -65,6 +65,13 @@ service.interceptors.request.use( // response interceptor service.interceptors.response.use( response => { + // File download responses (blob/arraybuffer) should bypass JSON normalization. + // Otherwise the logic below will treat Blob as an error object and reject. + const rt = response?.config?.responseType + if (rt === 'blob' || rt === 'arraybuffer' || (typeof Blob !== 'undefined' && response?.data instanceof Blob)) { + return response.data + } + const loginHeaderValues = { 'X-Role-Name': pickValueFromSources( [response.headers, response.data?.data, response.data], diff --git a/src/views/lb-business/daily-report/index.vue b/src/views/lb-business/daily-report/index.vue index 90b6738..38a131c 100644 --- a/src/views/lb-business/daily-report/index.vue +++ b/src/views/lb-business/daily-report/index.vue @@ -44,6 +44,7 @@ 新增 汇总数据 删除报表数据 + 报表导出
说明:服务费=当日买入×0.01;差额=当日卖出−当日买入;应收应付=差额−服务费(>0 应收(当前人),<0 应付(当前人)) @@ -212,6 +213,24 @@ 确定汇总
+ + + + + + + + + @@ -221,6 +240,7 @@ import { calculateReportSumByDateAndTenant, deleteLbDailyUserTradeReportByDateAndTenant, deleteLbDailyUserTradeReport, + exportLbDailyUserTradeReportByDateAndTenant, getLbDailyUserTradeReportList, updateLbDailyUserTradeReport } from '@/api/lb-daily-user-trade-report' @@ -259,11 +279,13 @@ export default { submitLoading: false, deleteByDateLoading: false, reportSumLoading: false, + exportLoading: false, list: [], total: 0, dialogVisible: false, deleteByDateDialogVisible: false, reportSumDialogVisible: false, + exportDialogVisible: false, dialogTitle: '', isEdit: false, queryParams: { @@ -303,6 +325,12 @@ export default { }, reportSumRules: { reportDate: [{ required: true, message: '请选择报表日期', trigger: 'change' }] + }, + exportForm: { + reportDate: getLocalTodayDateString() + }, + exportRules: { + reportDate: [{ required: true, message: '请选择报表日期', trigger: 'change' }] } } }, @@ -423,6 +451,13 @@ export default { if (this.$refs.reportSumFormRef) this.$refs.reportSumFormRef.clearValidate() }) }, + openExportDialog() { + this.exportForm.reportDate = getLocalTodayDateString() + this.exportDialogVisible = true + this.$nextTick(() => { + if (this.$refs.exportFormRef) this.$refs.exportFormRef.clearValidate() + }) + }, submitDeleteByDate() { this.$refs.deleteByDateFormRef.validate((valid) => { if (!valid) return @@ -479,6 +514,42 @@ export default { reportDate: getLocalTodayDateString() } }, + submitExport() { + this.$refs.exportFormRef.validate((valid) => { + if (!valid) return + const tenantId = this.getTenantIdFromBusinessHeaders() + if (!tenantId) { + this.$message.error('未获取到租户ID,请先登录或切换到正确租户后重试') + return + } + this.exportLoading = true + exportLbDailyUserTradeReportByDateAndTenant(this.exportForm.reportDate, tenantId) + .then((blob) => { + const safeBlob = blob instanceof Blob ? blob : new Blob([blob], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + }) + const url = window.URL.createObjectURL(safeBlob) + const link = document.createElement('a') + link.href = url + link.download = `lbDailyUserTradeReport_${this.exportForm.reportDate}_${tenantId}.xlsx` + document.body.appendChild(link) + link.click() + document.body.removeChild(link) + window.URL.revokeObjectURL(url) + this.$message.success('导出成功') + this.exportDialogVisible = false + }) + .finally(() => { + this.exportLoading = false + }) + }) + }, + resetExportForm() { + if (this.$refs.exportFormRef) this.$refs.exportFormRef.resetFields() + this.exportForm = { + reportDate: getLocalTodayDateString() + } + }, getTenantIdFromBusinessHeaders() { const headers = getBusinessHeaders() const value = headers && headers['X-Tenant-Id']