From 85deffe64de5362c77ff74507a482551fd17e67d Mon Sep 17 00:00:00 2001 From: lizhenhua <1075222162@qq.com> Date: Mon, 8 Dec 2025 11:03:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E9=85=8D=E7=BD=AE=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/canteenreport/index.vue | 143 +++++++++++++++++++++++++++--- 1 file changed, 131 insertions(+), 12 deletions(-) diff --git a/src/views/canteenreport/index.vue b/src/views/canteenreport/index.vue index b101ca42..7725a0b3 100644 --- a/src/views/canteenreport/index.vue +++ b/src/views/canteenreport/index.vue @@ -134,12 +134,16 @@ 当前{{ detailType }}消费金额:{{ Math.abs(detailAmount) }} @@ -214,7 +218,6 @@ export default { orgId: null, }, detailType: "", - detailAmount: "", loading: false, detailAmount: 0, // 当前点击行的消费金额 total: 0, @@ -222,11 +225,13 @@ export default { detailVisible: false, detail: {}, detailData: [], + allDetailData: [], // 存储所有详情数据 detailTotal: 0, detailParams: { pageNum: 1, pageSize: 20, }, + detailLoading: false, // 详情加载状态 dateRange: [], pickerOptions: { shortcuts: [ @@ -275,6 +280,15 @@ export default { }); totals.total = totals.reserve + totals.canteen + totals.super + totals.h5 + totals.deduction+totals.teabreak ; return totals; + }, + // 前端分页:只显示当前页的数据,避免一次性渲染大量数据导致崩溃 + displayDetailData() { + if (!this.allDetailData || this.allDetailData.length === 0) { + return []; + } + const start = (this.detailParams.pageNum - 1) * this.detailParams.pageSize; + const end = start + this.detailParams.pageSize; + return this.allDetailData.slice(start, end); } }, methods: { @@ -373,7 +387,7 @@ export default { /** 导出详情表格 */ exportDetailExcel() { - if (!this.detailData || this.detailData.length === 0) { + if (!this.allDetailData || this.allDetailData.length === 0) { this.$message.warning("暂无详情数据可导出"); return; } @@ -385,8 +399,8 @@ export default { const header = ["所属组织", "人员姓名", "消费金额", "消费类型","钱包类型", "下单时间"]; sheet.addRow(header); - // 数据行 - this.detailData.forEach(item => { + // 数据行 - 导出所有数据 + this.allDetailData.forEach(item => { // 消费类型处理 let flowTypeLabel = item.flow_type_name || ""; if (!flowTypeLabel) { @@ -521,6 +535,8 @@ export default { this.detail = row; this.detailAmount = this.getAmountByStatus(row, status); // 取对应消费金额 this.detailParams.pageNum = 1; + this.allDetailData = []; // 清空之前的数据 + this.detailTotal = 0; this.detailVisible = true; if (status === 1) { this.detailType = "预订餐"; @@ -553,8 +569,73 @@ export default { default: return 0; } }, + /** 详情分页处理(前端分页,不重新请求数据) */ + handleDetailPagination() { + // 前端分页,只需要更新 pageNum 和 pageSize + // 数据会通过 displayDetailData 计算属性自动更新 + }, + /** 序号计算方法(考虑分页) */ + indexMethod(index) { + return (this.detailParams.pageNum - 1) * this.detailParams.pageSize + index + 1; + }, + /** 分批获取所有详情数据 */ + fetchAllDetailData(status, startTime, endTime, total, firstPageData) { + const allData = [...firstPageData]; + const pageSize = 1000; // 每页获取1000条 + const totalPages = Math.ceil(total / pageSize); + + // 如果只有一页,直接返回 + if (totalPages <= 1) { + this.allDetailData = allData; + this.detailTotal = total; + this.detailParams.pageNum = 1; + this.detailLoading = false; + return; + } + + // 分批获取剩余数据 + const promises = []; + for (let page = 2; page <= totalPages; page++) { + const params = { + conSource: status, + orgName: this.detail.orgName, + pageNum: page, + pageSize: pageSize, + startPayTime: startTime, + endPayTime: endTime, + }; + promises.push(getDetailList(params)); + } + + // 等待所有请求完成 + Promise.all(promises).then((results) => { + results.forEach((res) => { + let pageData = []; + if (Array.isArray(res)) { + pageData = res; + } else if (res && res.data) { + pageData = res.data || []; + } else if (res && res.list) { + pageData = res.list || []; + } + allData.push(...pageData); + }); + + this.allDetailData = allData; + this.detailTotal = total; + this.detailParams.pageNum = 1; + this.detailLoading = false; + }).catch(() => { + // 即使部分失败,也使用已获取的数据 + this.allDetailData = allData; + this.detailTotal = allData.length; + this.detailParams.pageNum = 1; + this.detailLoading = false; + }); + }, /** 获取详情分页数据 */ getDetailList(status) { + this.detailLoading = true; // 处理日期范围 let startTime = ''; let endTime = ''; @@ -570,17 +651,55 @@ export default { ).padStart(2, "0")} 23:59:59`; } - const params = { + // 先尝试获取第一页数据,判断后端返回格式 + const firstPageParams = { conSource: status, orgName: this.detail.orgName, - pageNum: this.detailParams.pageNum, - pageSize: this.detailParams.pageSize, + pageNum: 1, + pageSize: 1000, // 先尝试获取1000条 startPayTime: startTime, endPayTime: endTime, }; - getDetailList(params).then((res) => { - this.detailData = res || []; - this.detailTotal = res.total || 0; + + getDetailList(firstPageParams).then((res) => { + // 处理返回的数据格式:可能是数组,也可能是 { data: [], total: 0 } 格式 + let firstPageData = []; + let total = 0; + let isPaginated = false; + + if (Array.isArray(res)) { + firstPageData = res; + total = res.length; + isPaginated = false; // 数组格式,可能是一次性返回所有数据 + } else if (res && res.data) { + firstPageData = res.data || []; + total = res.total || 0; + isPaginated = total > firstPageData.length; // 如果total大于返回的数据量,说明是分页数据 + } else if (res && res.list) { + firstPageData = res.list || []; + total = res.total || 0; + isPaginated = total > firstPageData.length; + } else { + firstPageData = []; + total = 0; + isPaginated = false; + } + + // 如果数据量不大,直接使用;如果数据量大且是分页数据,需要分批获取 + if (!isPaginated || firstPageData.length >= total) { + // 一次性获取完成,或者已经是所有数据 + this.allDetailData = firstPageData; + this.detailTotal = total || firstPageData.length; + this.detailParams.pageNum = 1; + this.detailLoading = false; + } else { + // 需要分批获取所有数据 + this.fetchAllDetailData(status, startTime, endTime, total, firstPageData); + } + }).catch(() => { + this.detailLoading = false; + this.allDetailData = []; + this.detailTotal = 0; }); }, },