Bulk operations errors fixed:

- changed container rate order
- allow blank rows
This commit is contained in:
Jan 2025-09-23 18:13:21 +02:00
parent aa054ab706
commit afb72e4d44
6 changed files with 95 additions and 38 deletions

View file

@ -1,8 +1,8 @@
package de.avatic.lcc.model.bulk.header;
public enum ContainerRateHeader implements HeaderProvider {
FROM_NODE("Origin"), TO_NODE("Destination"), CONTAINER_RATE_TYPE("Transport mode"), RATE_FEU("Rate 40 ft GP [EUR]"),
RATE_TEU("Rate 20 ft GP [EUR]"), RATE_HC("Rate 40 ft HC [EUR]"), LEAD_TIME("Lead time [d]");
FROM_NODE("Origin"), TO_NODE("Destination"), CONTAINER_RATE_TYPE("Transport mode"),
RATE_TEU("Rate 20 ft GP [EUR]"), RATE_FEU("Rate 40 ft GP [EUR]"), RATE_HC("Rate 40 ft HC [EUR]"), LEAD_TIME("Lead time [d]");
private final String header;

View file

@ -1,18 +1,15 @@
package de.avatic.lcc.service.excelMapper;
import de.avatic.lcc.dto.generic.TransportType;
import de.avatic.lcc.model.bulk.HiddenTableType;
import de.avatic.lcc.model.bulk.header.ContainerRateHeader;
import de.avatic.lcc.model.bulk.header.HiddenNodeHeader;
import de.avatic.lcc.model.bulk.HiddenTableType;
import de.avatic.lcc.model.rates.ContainerRate;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.rates.ContainerRateRepository;
import de.avatic.lcc.service.bulk.helper.ConstraintGenerator;
import de.avatic.lcc.service.bulk.helper.HeaderGenerator;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.*;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
@ -36,7 +33,7 @@ public class ContainerRateExcelMapper {
public void fillSheet(Sheet sheet, CellStyle headerStyle, Integer periodId) {
headerGenerator.generateHeader(sheet, ContainerRateHeader.class, headerStyle);
containerRateRepository.listAllRatesByPeriodId(periodId).forEach(rate -> mapToRow(rate, sheet.createRow(sheet.getLastRowNum()+1)));
containerRateRepository.listAllRatesByPeriodId(periodId).forEach(rate -> mapToRow(rate, sheet.createRow(sheet.getLastRowNum() + 1)));
headerGenerator.fixWidth(sheet, ContainerRateHeader.class);
}
@ -52,15 +49,15 @@ public class ContainerRateExcelMapper {
public void createConstraints(Workbook workbook, Sheet sheet) {
var namedRange = constraintGenerator.createReference(workbook, HiddenNodeHeader.MAPPING_ID.ordinal(),HiddenTableType.NODE_HIDDEN_TABLE);
var namedRange = constraintGenerator.createReference(workbook, HiddenNodeHeader.MAPPING_ID.ordinal(), HiddenTableType.NODE_HIDDEN_TABLE);
constraintGenerator.createFormulaListConstraint(sheet, ContainerRateHeader.FROM_NODE.ordinal(), namedRange.getNameName());
constraintGenerator.createFormulaListConstraint(sheet, ContainerRateHeader.TO_NODE.ordinal(), namedRange.getNameName());
constraintGenerator.createEnumConstraint(sheet, ContainerRateHeader.CONTAINER_RATE_TYPE.ordinal(), TransportType.class);
constraintGenerator.createDecimalConstraint(sheet, ContainerRateHeader.RATE_FEU.ordinal(), 0.0, 1000000.0);
constraintGenerator.createDecimalConstraint(sheet, ContainerRateHeader.RATE_TEU.ordinal(),0.0, 1000000.0);
constraintGenerator.createDecimalConstraint(sheet, ContainerRateHeader.RATE_HC.ordinal(),0.0, 1000000.0);
constraintGenerator.createDecimalConstraint(sheet, ContainerRateHeader.RATE_TEU.ordinal(), 0.0, 1000000.0);
constraintGenerator.createDecimalConstraint(sheet, ContainerRateHeader.RATE_HC.ordinal(), 0.0, 1000000.0);
constraintGenerator.createIntegerConstraint(sheet, ContainerRateHeader.LEAD_TIME.ordinal(), 0, 365);
@ -72,13 +69,25 @@ public class ContainerRateExcelMapper {
var rates = new ArrayList<ContainerRate>();
sheet.forEach(row -> {
if(row.getRowNum() == 0) return;
rates.add(mapToEntity(row));
if (row.getRowNum() == 0) return;
if (!isEmpty(row))
rates.add(mapToEntity(row));
});
return rates;
}
private boolean isEmpty(Row row) {
for (Cell cell : row) {
if (cell.getCellType() != CellType.BLANK) {
return false;
}
}
return true;
}
private ContainerRate mapToEntity(Row row) {
ContainerRate entity = new ContainerRate();

View file

@ -7,9 +7,7 @@ import de.avatic.lcc.model.materials.Material;
import de.avatic.lcc.repositories.MaterialRepository;
import de.avatic.lcc.service.bulk.helper.ConstraintGenerator;
import de.avatic.lcc.service.bulk.helper.HeaderGenerator;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.*;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
@ -30,7 +28,7 @@ public class MaterialExcelMapper {
public void fillSheet(Sheet sheet, CellStyle headerStyle) {
headerGenerator.generateHeader(sheet, MaterialHeader.class, headerStyle);
materialRepository.listAllMaterials().forEach(material -> mapToRow(material, sheet.createRow(sheet.getLastRowNum()+1)));
materialRepository.listAllMaterials().forEach(material -> mapToRow(material, sheet.createRow(sheet.getLastRowNum() + 1)));
headerGenerator.fixWidth(sheet, MaterialHeader.class);
}
@ -56,13 +54,25 @@ public class MaterialExcelMapper {
var materials = new ArrayList<BulkInstruction<Material>>();
sheet.forEach(row -> {
if(row.getRowNum() == 0) return;
materials.add(mapToEntity(row));
if (row.getRowNum() == 0) return;
if (!isEmpty(row))
materials.add(mapToEntity(row));
});
return materials;
}
private boolean isEmpty(Row row) {
for (Cell cell : row) {
if (cell.getCellType() != CellType.BLANK) {
return false;
}
}
return true;
}
private BulkInstruction<Material> mapToEntity(Row row) {
Material entity = new Material();
@ -78,7 +88,7 @@ public class MaterialExcelMapper {
entity.setNormalizedPartNumber(normalizePartNumber(entity.getPartNumber()));
entity.setDeprecated(false);
if(!validateHsCode(entity.getHsCode())) throw new IllegalArgumentException("Invalid HS Code");
if (!validateHsCode(entity.getHsCode())) throw new IllegalArgumentException("Invalid HS Code");
return new BulkInstruction<>(entity, BulkInstructionType.valueOf(row.getCell(MaterialHeader.OPERATION.ordinal()).getStringCellValue()));
}

View file

@ -1,6 +1,6 @@
package de.avatic.lcc.service.excelMapper;
import de.avatic.lcc.model.bulk.*;
import de.avatic.lcc.model.bulk.HiddenTableType;
import de.avatic.lcc.model.bulk.header.HiddenCountryHeader;
import de.avatic.lcc.model.bulk.header.MatrixRateHeader;
import de.avatic.lcc.model.country.IsoCode;
@ -9,10 +9,7 @@ import de.avatic.lcc.repositories.country.CountryRepository;
import de.avatic.lcc.repositories.rates.MatrixRateRepository;
import de.avatic.lcc.service.bulk.helper.ConstraintGenerator;
import de.avatic.lcc.service.bulk.helper.HeaderGenerator;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.*;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
@ -36,7 +33,7 @@ public class MatrixRateExcelMapper {
public void fillSheet(Sheet sheet, CellStyle headerStyle, Integer periodId) {
headerGenerator.generateHeader(sheet, MatrixRateHeader.class, headerStyle);
matrixRateRepository.listAllRatesByPeriodId(periodId).forEach(rate -> mapToRow(rate, sheet.createRow(sheet.getLastRowNum()+1)));
matrixRateRepository.listAllRatesByPeriodId(periodId).forEach(rate -> mapToRow(rate, sheet.createRow(sheet.getLastRowNum() + 1)));
headerGenerator.fixWidth(sheet, MatrixRateHeader.class);
}
@ -46,13 +43,25 @@ public class MatrixRateExcelMapper {
List<MatrixRate> rates = new ArrayList<>();
sheet.forEach(row -> {
if(row.getRowNum() == 0) return;
rates.add(mapToEntity(row));
if (row.getRowNum() == 0) return;
if (!isEmpty(row))
rates.add(mapToEntity(row));
});
return rates;
}
private boolean isEmpty(Row row) {
for (Cell cell : row) {
if (cell.getCellType() != CellType.BLANK) {
return false;
}
}
return true;
}
private MatrixRate mapToEntity(Row row) {
MatrixRate entity = new MatrixRate();

View file

@ -1,7 +1,9 @@
package de.avatic.lcc.service.excelMapper;
import de.avatic.lcc.excelmodel.ExcelNode;
import de.avatic.lcc.model.bulk.*;
import de.avatic.lcc.model.bulk.BulkInstruction;
import de.avatic.lcc.model.bulk.BulkInstructionType;
import de.avatic.lcc.model.bulk.HiddenTableType;
import de.avatic.lcc.model.bulk.header.HiddenCountryHeader;
import de.avatic.lcc.model.bulk.header.NodeHeader;
import de.avatic.lcc.model.country.Country;
@ -11,10 +13,7 @@ import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.country.CountryRepository;
import de.avatic.lcc.service.bulk.helper.ConstraintGenerator;
import de.avatic.lcc.service.bulk.helper.HeaderGenerator;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.*;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
@ -94,13 +93,29 @@ public class NodeExcelMapper {
headerGenerator.validateHeader(sheet, NodeHeader.class);
var nodes = new ArrayList<BulkInstruction<ExcelNode>>();
System.out.println(sheet.getLastRowNum());
sheet.forEach(row -> {
if (row.getRowNum() == 0) return;
nodes.add(mapToEntity(row));
if (!isEmpty(row))
nodes.add(mapToEntity(row));
});
return nodes;
}
private boolean isEmpty(Row row) {
for(Cell cell : row) {
if (cell.getCellType() != CellType.BLANK) {
return false;
}
}
return true;
}
private BulkInstruction<ExcelNode> mapToEntity(Row row) {
ExcelNode entity = new ExcelNode();

View file

@ -2,7 +2,9 @@ package de.avatic.lcc.service.excelMapper;
import de.avatic.lcc.excelmodel.ExcelPackaging;
import de.avatic.lcc.model.bulk.*;
import de.avatic.lcc.model.bulk.BulkInstruction;
import de.avatic.lcc.model.bulk.BulkInstructionType;
import de.avatic.lcc.model.bulk.HiddenTableType;
import de.avatic.lcc.model.bulk.header.HiddenNodeHeader;
import de.avatic.lcc.model.bulk.header.PackagingHeader;
import de.avatic.lcc.model.packaging.Packaging;
@ -87,7 +89,7 @@ public class PackagingExcelMapper {
private void mapDimensionToCell(Cell cell, Optional<PackagingDimension> packaging, Function<PackagingDimension, Integer> provider) {
if (packaging.isPresent())
cell.setCellValue(packaging.get().getDimensionUnit().convertFromMM(provider.apply(packaging.get())));
cell.setCellValue(packaging.get().getDimensionUnit().convertFromMM(provider.apply(packaging.get())));
else cell.setBlank();
}
@ -136,12 +138,24 @@ public class PackagingExcelMapper {
var packaging = new ArrayList<BulkInstruction<ExcelPackaging>>();
sheet.forEach(row -> {
if(row.getRowNum() == 0) return;
packaging.add(mapToEntity(row, propertyMappingIds));
if (row.getRowNum() == 0) return;
if (!isEmpty(row))
packaging.add(mapToEntity(row, propertyMappingIds));
});
return packaging;
}
private boolean isEmpty(Row row) {
for (Cell cell : row) {
if (cell.getCellType() != CellType.BLANK) {
return false;
}
}
return true;
}
private Map<Integer, String> getPropertyHeaders(Row row) {
var propertyMappingIds = packagingPropertiesRepository.listTypes().stream().map(PropertyType::getExternalMappingId).toList();