From 575a8cebe5f446b108287aa1eee430c36f545f9c Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Tue, 25 Aug 2026 12:09:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=8F=E5=AE=9E=E5=AF=BC=E5=85=A5=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CanteenSpuController.java | 1 - .../canteen/mapper/CanteenStockMapper.java | 4 - .../canteen/util/CanteenReportExcelUtils.java | 112 +++++++++--------- 3 files changed, 57 insertions(+), 60 deletions(-) diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenSpuController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenSpuController.java index 45bfeb972..c9ac9e025 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenSpuController.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenSpuController.java @@ -15,7 +15,6 @@ import com.bsd.pjcloud.canteen.dto.CanteenSpuUpdateStockReqDTO; import com.bsd.pjcloud.canteen.entity.CanteenErpMaterialEntity; import com.bsd.pjcloud.canteen.entity.CanteenOnlineSpuEntity; import com.bsd.pjcloud.canteen.entity.CanteenStockEntity; -import com.bsd.pjcloud.canteen.mapper.CanteenStockMapper; import com.bsd.pjcloud.canteen.service.CanteenStockService; import com.bsd.pjcloud.canteen.excel.CanteenSpuTemplateMergeHandler; import com.bsd.pjcloud.canteen.service.impl.CanteenSpuImportHelper; diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenStockMapper.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenStockMapper.java index b523371da..d794905c8 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenStockMapper.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenStockMapper.java @@ -1,14 +1,10 @@ package com.bsd.pjcloud.canteen.mapper; -import com.bsd.pjcloud.canteen.dto.erp.UpdateStockDTO; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import com.bsd.pjcloud.canteen.entity.CanteenStockEntity; import org.apache.ibatis.annotations.Mapper; -import java.util.List; - @Mapper public interface CanteenStockMapper extends PjcloudBaseMapper { - } \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/util/CanteenReportExcelUtils.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/util/CanteenReportExcelUtils.java index fef823d0b..d73471665 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/util/CanteenReportExcelUtils.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/util/CanteenReportExcelUtils.java @@ -80,39 +80,46 @@ public class CanteenReportExcelUtils { */ public static void readSwipeStreaming(MultipartFile file, String preferredSheetName, ReadListener listener) throws Exception { - BufferedInputStream bis = new BufferedInputStream(file.getInputStream(), 1 << 20); - bis.mark(Integer.MAX_VALUE); - byte[] head = readStreamHead(bis, 8192); - bis.reset(); - String filename = file.getOriginalFilename(); - if (isTextTable(filename, head)) { - byte[] bytes = readAllBytes(bis); - Charset charset = detectTextCharset(bytes); - char delimiter = detectDelimiter(bytes, charset); - log.info("刷卡明细按文本表流式解析 file={} charset={} delimiter={}", filename, charset.name(), - delimiter == '\t' ? "TAB" : String.valueOf(delimiter)); - readSwipeTextStreaming(bytes, charset, delimiter, listener); - return; + try (BufferedInputStream probe = new BufferedInputStream(file.getInputStream(), 1 << 20)) { + byte[] head = readStreamHead(probe, 8192); + String filename = file.getOriginalFilename(); + if (isTextTable(filename, head)) { + byte[] bytes = concatHeadAndRest(head, probe); + Charset charset = detectTextCharset(bytes); + char delimiter = detectDelimiter(bytes, charset); + log.info("刷卡明细按文本表流式解析 file={} charset={} delimiter={}", filename, charset.name(), + delimiter == '\t' ? "TAB" : String.valueOf(delimiter)); + readSwipeTextStreaming(bytes, charset, delimiter, listener); + return; + } + } + int sheetNo = 0; + if (preferredSheetName != null && !preferredSheetName.isEmpty()) { + try (InputStream sheetIn = file.getInputStream()) { + sheetNo = resolveSheetNo(sheetIn, preferredSheetName); + } + } + try (BufferedInputStream dataIn = new BufferedInputStream(file.getInputStream(), 1 << 20)) { + EasyExcel.read(dataIn, com.bsd.pjcloud.canteen.dto.report.CanteenReportSwipeExcel.class, listener) + .registerConverter(LocalDateStringConverter.INSTANCE) + .registerConverter(LocalTimeStringConverter.INSTANCE) + .registerConverter(LocalDateTimeStringConverter.INSTANCE) + .registerConverter(LongStringConverter.INSTANCE) + .registerConverter(StringArrayConverter.INSTANCE) + .registerConverter(new ExcelYuanConverter()) + .registerConverter(new ExcelYuanStringConverter()) + .sheet(sheetNo) + .headRowNumber(1) + .doRead(); } - int sheetNo = resolveSheetNo(bis, preferredSheetName); - EasyExcel.read(bis, com.bsd.pjcloud.canteen.dto.report.CanteenReportSwipeExcel.class, listener) - .registerConverter(LocalDateStringConverter.INSTANCE) - .registerConverter(LocalTimeStringConverter.INSTANCE) - .registerConverter(LocalDateTimeStringConverter.INSTANCE) - .registerConverter(LongStringConverter.INSTANCE) - .registerConverter(StringArrayConverter.INSTANCE) - .registerConverter(new ExcelYuanConverter()) - .registerConverter(new ExcelYuanStringConverter()) - .sheet(sheetNo) - .headRowNumber(1) - .doRead(); } - private static byte[] readAllBytes(InputStream in) throws java.io.IOException { - java.io.ByteArrayOutputStream out = new java.io.ByteArrayOutputStream(1 << 20); + private static byte[] concatHeadAndRest(byte[] head, InputStream rest) throws java.io.IOException { + java.io.ByteArrayOutputStream out = new java.io.ByteArrayOutputStream(Math.max(1 << 20, head.length + 4096)); + out.write(head); byte[] buf = new byte[1 << 20]; int n; - while ((n = in.read(buf)) > 0) { + while ((n = rest.read(buf)) > 0) { out.write(buf, 0, n); } return out.toByteArray(); @@ -137,9 +144,7 @@ public class CanteenReportExcelUtils { List rows = readDelimitedText(bytes, com.bsd.pjcloud.canteen.dto.report.CanteenReportSwipeExcel.class, charset, delimiter); expandTabJoinedRows(rows); - int line = 1; for (com.bsd.pjcloud.canteen.dto.report.CanteenReportSwipeExcel row : rows) { - line++; listener.invoke(row, null); } listener.doAfterAllAnalysed(null); @@ -188,42 +193,39 @@ public class CanteenReportExcelUtils { } private static int resolveSheetNo(byte[] bytes, String preferredSheetName) { - return resolveSheetNo(new ByteArrayInputStream(bytes), preferredSheetName); + try { + return resolveSheetNo(new ByteArrayInputStream(bytes), preferredSheetName); + } + catch (java.io.IOException e) { + log.warn("解析 sheet 失败 preferredSheetName={}", preferredSheetName, e); + return 0; + } } private static int resolveSheetNo(InputStream in, String preferredSheetName) throws java.io.IOException { if (preferredSheetName == null || preferredSheetName.isEmpty()) { return 0; } - InputStream stream = in; - if (!stream.markSupported()) { - stream = new BufferedInputStream(in, 1 << 20); - } - stream.mark(1 << 20); - int sheetNo = 0; - ExcelReader reader = EasyExcel.read(stream).build(); + // 不复用同一 InputStream 扫 sheet(EasyExcel 读完会关闭流),改为独立流列表名 + List sheets; + ExcelReader reader = EasyExcel.read(in).build(); try { - List sheets = reader.excelExecutor().sheetList(); - for (ReadSheet s : sheets) { - if (preferredSheetName.equals(s.getSheetName())) { - sheetNo = s.getSheetNo(); - break; - } - } - if (sheetNo == 0) { - for (ReadSheet s : sheets) { - if (s.getSheetName() != null && s.getSheetName().contains(preferredSheetName)) { - sheetNo = s.getSheetNo(); - break; - } - } - } + sheets = reader.excelExecutor().sheetList(); } finally { reader.finish(); } - stream.reset(); - return sheetNo; + for (ReadSheet s : sheets) { + if (preferredSheetName.equals(s.getSheetName())) { + return s.getSheetNo() == null ? 0 : s.getSheetNo(); + } + } + for (ReadSheet s : sheets) { + if (s.getSheetName() != null && s.getSheetName().contains(preferredSheetName)) { + return s.getSheetNo() == null ? 0 : s.getSheetNo(); + } + } + return 0; } /** 扩展名或内容像 CSV/TSV(非 xlsx/xls 二进制) */