From 5d4d03ba1dddc92352316d5a34c931ce2149ed90 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Fri, 6 Feb 2026 13:11:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dashboard/back/common/Constants.java | 2 + .../DeviceDataAccumulateController.java | 72 ++++++++++++++----- .../controller/DeviceDataAlarmController.java | 61 ++++++++++++---- .../DeviceDataBaStatusController.java | 65 +++++++++++++---- .../DeviceDataMeasureController.java | 65 +++++++++++++---- 5 files changed, 205 insertions(+), 60 deletions(-) diff --git a/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/Constants.java b/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/Constants.java index 4edb1bb..1b08301 100644 --- a/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/Constants.java +++ b/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/Constants.java @@ -12,6 +12,8 @@ public class Constants { public static final ZoneId ZONE_TOKYO = ZoneId.of("Asia/Tokyo"); public static final DateTimeFormatter FORMATTER_YMDHMS = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + public static final int EXPORT_PAGE_SIZE = 600; //这个很重要,不要随便动 public static final String DES_SALT = "ci3b512jwy199511"; diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAccumulateController.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAccumulateController.java index ebfb77e..0e49135 100644 --- a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAccumulateController.java +++ b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAccumulateController.java @@ -2,7 +2,10 @@ package com.dongjian.dashboard.back.controller; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.util.StringUtils; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.dongjian.dashboard.back.common.Constants; import com.dongjian.dashboard.back.common.exception.BusinessException; import com.dongjian.dashboard.back.common.response.PageInfo; import com.dongjian.dashboard.back.common.response.PageResponse; @@ -19,11 +22,13 @@ import com.dongjian.dashboard.back.service.common.CommonOpt; import com.dongjian.dashboard.back.util.CommonUtil; import com.dongjian.dashboard.back.vo.data.DeviceAccumulateData; import com.dongjian.dashboard.back.vo.device.LineData; +import com.github.pagehelper.PageHelper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -98,25 +103,58 @@ public class DeviceDataAccumulateController { String fileName = URLEncoder.encode("積算データ"+CommonUtil.generateExcelSuffix(), StandardCharsets.UTF_8).replace("+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); - PageInfo pageData = deviceDataAccumulateService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); - List list = pageData.getList(); + // ===== 固定导出分页大小===== + pageSearchParam.setPageSize(Constants.EXPORT_PAGE_SIZE); - List exportList = list.stream().map(item -> { - ExportDeviceAccumulateDataDTO dto = new ExportDeviceAccumulateDataDTO(); - BeanUtils.copyProperties(item, dto); - dto.setLastYearRatio(CommonUtil.ratio(item.getCumulativeValue(), item.getLastYearValue())); - dto.setYesterdayRatio(CommonUtil.ratio(item.getCumulativeValue(), item.getYesterdayValue())); - dto.setStatus111(commonOpt.status111Mapping(item.getStatus111())); - return dto; - }).toList(); - - // 构造 Excel header:每列三语组合为字符串 "中文||English||日本語" + // ===== 构建 Excel ===== List> head = LanguageDynamicHeaderAdapter.buildHead(ExportDeviceAccumulateDataDTO.class, LanguageType); - - EasyExcel.write(response.getOutputStream()) - .head(head) - .sheet("sheet1") - .doWrite(exportList); + ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).head(head).build(); + WriteSheet sheet = EasyExcel.writerSheet("sheet1").build(); + + // ===== 循环分页查询并写 Excel ===== + int pageNum = 1; + try { + while (true) { + pageSearchParam.setPageNum(pageNum); + + PageInfo pageData = deviceDataAccumulateService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); + + List list = pageData.getList(); + if (CollectionUtils.isEmpty(list)) { + break; // 没数据了,结束 + } + + for (DeviceAccumulateData item : list) { + ExportDeviceAccumulateDataDTO dto = new ExportDeviceAccumulateDataDTO(); + BeanUtils.copyProperties(item, dto); + dto.setLastYearRatio(CommonUtil.ratio(item.getCumulativeValue(), item.getLastYearValue())); + dto.setYesterdayRatio(CommonUtil.ratio(item.getCumulativeValue(), item.getYesterdayValue())); + dto.setStatus111(commonOpt.status111Mapping(item.getStatus111())); + excelWriter.write(List.of(dto), sheet); + + // 手动置空,提醒 GC 回收 + dto = null; + item = null; + } + + // 手动清理分页数据和缓存 + list.clear(); + PageHelper.clearPage(); + + // 最后一页判断(加这个更安全) + if (pageNum >= pageData.getPages()) { + break; + } + + pageNum++; + } + } catch (Exception e) { + logger.error("export error", e); + throw e; + } finally { + excelWriter.finish(); + PageHelper.clearPage(); + } } diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAlarmController.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAlarmController.java index 2d9b95b..8b5484b 100644 --- a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAlarmController.java +++ b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAlarmController.java @@ -2,6 +2,9 @@ package com.dongjian.dashboard.back.controller; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.dongjian.dashboard.back.common.Constants; import com.dongjian.dashboard.back.common.exception.BusinessException; import com.dongjian.dashboard.back.common.response.PageInfo; import com.dongjian.dashboard.back.common.response.PageResponse; @@ -21,11 +24,13 @@ import com.dongjian.dashboard.back.util.CommonUtil; import com.dongjian.dashboard.back.vo.data.DeviceAlarmData; import com.dongjian.dashboard.back.vo.data.HandleHistoryDataVO; import com.dongjian.dashboard.back.vo.device.WindowAlertVO; +import com.github.pagehelper.PageHelper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -98,22 +103,52 @@ public class DeviceDataAlarmController { String fileName = URLEncoder.encode("警報データ"+ CommonUtil.generateExcelSuffix(), StandardCharsets.UTF_8).replace("+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); - PageInfo pageData = deviceDataAlarmService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); - List list = pageData.getList(); + // ===== 固定导出分页大小 ===== + pageSearchParam.setPageSize(Constants.EXPORT_PAGE_SIZE); - List exportList = list.stream().map(item -> { - ExportDeviceAlarmDataDTO dto = new ExportDeviceAlarmDataDTO(); - BeanUtils.copyProperties(item, dto); - return dto; - }).toList(); - - // 构造 Excel header:每列三语组合为字符串 "中文||English||日本語" + // ===== 构建 Excel ===== List> head = LanguageDynamicHeaderAdapter.buildHead(ExportDeviceAlarmDataDTO.class, LanguageType); + ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).head(head).build(); + WriteSheet sheet = EasyExcel.writerSheet("sheet1").build(); - EasyExcel.write(response.getOutputStream()) - .head(head) - .sheet("sheet1") - .doWrite(exportList); + int pageNum = 1; + try { + while (true) { + pageSearchParam.setPageNum(pageNum); + + PageInfo pageData = deviceDataAlarmService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); + + List list = pageData.getList(); + if (CollectionUtils.isEmpty(list)) { + break; // 没数据了,结束 + } + + for (DeviceAlarmData item : list) { + ExportDeviceAlarmDataDTO dto = new ExportDeviceAlarmDataDTO(); + BeanUtils.copyProperties(item, dto); + excelWriter.write(List.of(dto), sheet); + + // 手动置空,提醒 GC 回收 + dto = null; + item = null; + } + + // 手动清理分页数据和缓存 + list.clear(); + PageHelper.clearPage(); + + if (pageNum >= pageData.getPages()) { + break; + } + pageNum++; + } + } catch (Exception e) { + logger.error("export alarm error", e); + throw e; + } finally { + excelWriter.finish(); + PageHelper.clearPage(); + } } @OperationLog(operation = "handleAlarm", remark = "") diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataBaStatusController.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataBaStatusController.java index 375531b..217476e 100644 --- a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataBaStatusController.java +++ b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataBaStatusController.java @@ -2,6 +2,9 @@ package com.dongjian.dashboard.back.controller; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.dongjian.dashboard.back.common.Constants; import com.dongjian.dashboard.back.common.exception.BusinessException; import com.dongjian.dashboard.back.common.response.PageInfo; import com.dongjian.dashboard.back.common.response.PageResponse; @@ -18,11 +21,13 @@ import com.dongjian.dashboard.back.service.common.CommonOpt; import com.dongjian.dashboard.back.util.CommonUtil; import com.dongjian.dashboard.back.vo.data.DeviceBaStatusData; import com.dongjian.dashboard.back.vo.device.LineData; +import com.github.pagehelper.PageHelper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -97,23 +102,53 @@ public class DeviceDataBaStatusController { String fileName = URLEncoder.encode("稼働設備"+ CommonUtil.generateExcelSuffix(), StandardCharsets.UTF_8).replace("+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); - PageInfo pageData = deviceDataBaStatusService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); - List list = pageData.getList(); + // ===== 固定导出分页大小 ===== + pageSearchParam.setPageSize(Constants.EXPORT_PAGE_SIZE); - List exportList = list.stream().map(item -> { - ExportDeviceBaStatusDataDTO dto = new ExportDeviceBaStatusDataDTO(); - BeanUtils.copyProperties(item, dto); - dto.setStatus111(commonOpt.status111Mapping(item.getStatus111())); - return dto; - }).toList(); - - // 构造 Excel header:每列三语组合为字符串 "中文||English||日本語" + // ===== 构建 Excel ===== List> head = LanguageDynamicHeaderAdapter.buildHead(ExportDeviceBaStatusDataDTO.class, LanguageType); - - EasyExcel.write(response.getOutputStream()) - .head(head) - .sheet("sheet1") - .doWrite(exportList); + ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).head(head).build(); + WriteSheet sheet = EasyExcel.writerSheet("sheet1").build(); + + int pageNum = 1; + try { + while (true) { + pageSearchParam.setPageNum(pageNum); + + PageInfo pageData = deviceDataBaStatusService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); + + List list = pageData.getList(); + if (CollectionUtils.isEmpty(list)) { + break; // 没数据了,结束 + } + + for (DeviceBaStatusData item : list) { + ExportDeviceBaStatusDataDTO dto = new ExportDeviceBaStatusDataDTO(); + BeanUtils.copyProperties(item, dto); + dto.setStatus111(commonOpt.status111Mapping(item.getStatus111())); + excelWriter.write(List.of(dto), sheet); + + // 手动置空,提醒 GC 回收 + dto = null; + item = null; + } + + // 手动清理分页数据和缓存 + list.clear(); + PageHelper.clearPage(); + + if (pageNum >= pageData.getPages()) { + break; + } + pageNum++; + } + } catch (Exception e) { + logger.error("export BA status error", e); + throw e; + } finally { + excelWriter.finish(); + PageHelper.clearPage(); + } } @OperationLog(operation = "getLineData", remark = "") diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataMeasureController.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataMeasureController.java index 43f61a4..7db489b 100644 --- a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataMeasureController.java +++ b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataMeasureController.java @@ -2,6 +2,9 @@ package com.dongjian.dashboard.back.controller; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.dongjian.dashboard.back.common.Constants; import com.dongjian.dashboard.back.common.exception.BusinessException; import com.dongjian.dashboard.back.common.response.PageInfo; import com.dongjian.dashboard.back.common.response.PageResponse; @@ -18,11 +21,13 @@ import com.dongjian.dashboard.back.service.common.CommonOpt; import com.dongjian.dashboard.back.util.CommonUtil; import com.dongjian.dashboard.back.vo.data.DeviceMeasureData; import com.dongjian.dashboard.back.vo.device.LineData; +import com.github.pagehelper.PageHelper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -97,23 +102,53 @@ public class DeviceDataMeasureController { String fileName = URLEncoder.encode("計測データ"+ CommonUtil.generateExcelSuffix(), StandardCharsets.UTF_8).replace("+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); - PageInfo pageData = deviceDataMeasureService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); - List list = pageData.getList(); + // ===== 固定导出分页大小 ===== + pageSearchParam.setPageSize(Constants.EXPORT_PAGE_SIZE); - List exportList = list.stream().map(item -> { - ExportDeviceMeasureDataDTO dto = new ExportDeviceMeasureDataDTO(); - BeanUtils.copyProperties(item, dto); - dto.setStatus111(commonOpt.status111Mapping(item.getStatus111())); - return dto; - }).toList(); - - // 构造 Excel header:每列三语组合为字符串 "中文||English||日本語" + // ===== 构建 Excel ===== List> head = LanguageDynamicHeaderAdapter.buildHead(ExportDeviceMeasureDataDTO.class, LanguageType); - - EasyExcel.write(response.getOutputStream()) - .head(head) - .sheet("sheet1") - .doWrite(exportList); + ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).head(head).build(); + WriteSheet sheet = EasyExcel.writerSheet("sheet1").build(); + + int pageNum = 1; + try { + while (true) { + pageSearchParam.setPageNum(pageNum); + + PageInfo pageData = deviceDataMeasureService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); + + List list = pageData.getList(); + if (CollectionUtils.isEmpty(list)) { + break; // 没数据了,结束 + } + + for (DeviceMeasureData item : list) { + ExportDeviceMeasureDataDTO dto = new ExportDeviceMeasureDataDTO(); + BeanUtils.copyProperties(item, dto); + dto.setStatus111(commonOpt.status111Mapping(item.getStatus111())); + excelWriter.write(List.of(dto), sheet); + + // 手动置空,提醒 GC 回收 + dto = null; + item = null; + } + + // 手动清理分页数据和缓存 + list.clear(); + PageHelper.clearPage(); + + if (pageNum >= pageData.getPages()) { + break; + } + pageNum++; + } + } catch (Exception e) { + logger.error("export measure data error", e); + throw e; + } finally { + excelWriter.finish(); + PageHelper.clearPage(); + } } @OperationLog(operation = "getLineData", remark = "")