完善单元格合并逻辑
This commit is contained in:
@@ -58,6 +58,11 @@ public class ErpDeliveryExcelListener extends AnalysisEventListener<ErpPurchaseP
|
||||
}
|
||||
if (exception instanceof ExcelDataConvertException) {
|
||||
ExcelDataConvertException e = (ExcelDataConvertException) exception;
|
||||
// 合并单元格(车号/数量/件数 多行共用)会在被合并的下方行留下空数值格,
|
||||
// 转换为数字会抛此异常——空格直接忽略(交由 Service 向下填充),只有真有非数字内容才报错。
|
||||
if (isBlankCell(e)) {
|
||||
return;
|
||||
}
|
||||
String head = headMap != null ? headMap.get(e.getColumnIndex()) : null;
|
||||
String headName = head != null ? head : ("第" + (e.getColumnIndex() + 1) + "列");
|
||||
errors.add("第" + (e.getRowIndex() + 1) + "行「" + headName + "」列的值无法识别(应为数字)");
|
||||
@@ -67,6 +72,23 @@ public class ErpDeliveryExcelListener extends AnalysisEventListener<ErpPurchaseP
|
||||
// 转换类异常不抛出,继续解析以收集所有错误行
|
||||
}
|
||||
|
||||
/** 判断转换失败的单元格是否本就是空(合并单元格留下的空格),空则忽略不报错 */
|
||||
private boolean isBlankCell(ExcelDataConvertException e) {
|
||||
try {
|
||||
com.alibaba.excel.metadata.data.CellData<?> cd = e.getCellData();
|
||||
if (cd == null) {
|
||||
return true;
|
||||
}
|
||||
if (cd.getType() == com.alibaba.excel.enums.CellDataTypeEnum.EMPTY) {
|
||||
return true;
|
||||
}
|
||||
String s = cd.getStringValue();
|
||||
return s == null || s.trim().isEmpty();
|
||||
} catch (Throwable t) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doAfterAllAnalysed(AnalysisContext context) {
|
||||
// no-op
|
||||
|
||||
@@ -389,23 +389,21 @@ public class ErpPurchasePlanServiceImpl implements IErpPurchasePlanService {
|
||||
batch.setFileName(StringUtils.isNotBlank(fileName) ? fileName : "到货表");
|
||||
deliveryBatchMapper.insert(batch);
|
||||
|
||||
// 6) 合并单元格向下填充 + 单位换算 + 落库 + WMS到货标记
|
||||
// 6) 落库 + 单位换算 + WMS到货标记
|
||||
// 合并单元格:车号(F)几卷共用一车 → 向下填充让每卷都带车号;
|
||||
// 数量(G=整车总重)/件数(H=整车件数) 是「整车合计」,只记在该车首行(其余行留空),
|
||||
// 避免按行重复计数(用户:一共3件,不是每行3件)。
|
||||
String lastTruckNo = null;
|
||||
BigDecimal lastTruckWeight = null;
|
||||
Integer lastPieceCount = null;
|
||||
int count = 0;
|
||||
int matched = 0;
|
||||
for (ErpPurchasePlanDeliveryImportVo row : rows) {
|
||||
if (StringUtils.isNotBlank(row.getTruckNo())) {
|
||||
lastTruckNo = row.getTruckNo();
|
||||
lastTruckWeight = row.getTruckWeight();
|
||||
lastPieceCount = row.getPieceCount();
|
||||
}
|
||||
if (StringUtils.isBlank(row.getCoilNo()) && row.getCoilWeight() == null) {
|
||||
continue;
|
||||
}
|
||||
boolean arrived = StringUtils.isNotBlank(row.getCoilNo()) && wmsArrivedSet.contains(normCoil(row.getCoilNo()));
|
||||
BigDecimal truckWeight = row.getTruckWeight() != null ? row.getTruckWeight() : lastTruckWeight;
|
||||
ErpPurchasePlanDelivery d = new ErpPurchasePlanDelivery();
|
||||
d.setPlanId(planId);
|
||||
d.setBatchId(batch.getBatchId());
|
||||
@@ -415,9 +413,11 @@ public class ErpPurchasePlanServiceImpl implements IErpPurchasePlanService {
|
||||
d.setSpec(row.getSpec());
|
||||
d.setCoilNo(row.getCoilNo());
|
||||
d.setCoilWeight(convertWeight(row.getCoilWeight(), kgConverted));
|
||||
// 车号:每卷归属的车(向下填充)
|
||||
d.setTruckNo(StringUtils.isNotBlank(row.getTruckNo()) ? row.getTruckNo() : lastTruckNo);
|
||||
d.setTruckWeight(convertWeight(truckWeight, kgConverted));
|
||||
d.setPieceCount(row.getPieceCount() != null ? row.getPieceCount() : lastPieceCount);
|
||||
// 整车总重 / 件数:整车合计,仅该车首行有值,不向下填充
|
||||
d.setTruckWeight(convertWeight(row.getTruckWeight(), kgConverted));
|
||||
d.setPieceCount(row.getPieceCount());
|
||||
d.setSalesCode(row.getSalesCode());
|
||||
d.setArrivalStation(row.getArrivalStation());
|
||||
deliveryMapper.insert(d);
|
||||
|
||||
Reference in New Issue
Block a user