敏实导入优化
This commit is contained in:
1 parent
82e3fc02db
commit
575a8cebe5
3 files changed
+57
-60
No files matched your search
-1
@@ -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;
|
||||
|
||||
-4
@@ -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> {
|
||||
|
||||
|
||||
}
|
||||
+57
-55
@@ -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 二进制) */
|
||||
|
||||
Reference in new issue
Block a user