敏实导入优化

This commit is contained in:
zjf committed 2026-08-25 12:09:29 +08:00
1 parent 82e3fc02db
commit 575a8cebe5
3 files changed
+57 -60

No files matched your search

@@ -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;
@@ -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<CanteenStockEntity> {
}
@@ -80,39 +80,46 @@ public class CanteenReportExcelUtils {
*/
public static void readSwipeStreaming(MultipartFile file, String preferredSheetName,
ReadListener<com.bsd.pjcloud.canteen.dto.report.CanteenReportSwipeExcel> 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<com.bsd.pjcloud.canteen.dto.report.CanteenReportSwipeExcel> 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<ReadSheet> sheets;
ExcelReader reader = EasyExcel.read(in).build();
try {
List<ReadSheet> 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 二进制) */