From d2e271ed36a282c330c3ae19b7fc5048646c86fb Mon Sep 17 00:00:00 2001 From: Jan Weber Date: Fri, 9 May 2025 17:43:39 +0200 Subject: [PATCH] Add calculation services and update packaging model Introduce `CalculationExecutionService` and `ContainerCalculationService` for handling premise and container-level calculations, along with a new `ContainerCalculationResult` model. Updated `PackagingDimension` to include a `withTolerance` method for dimension adjustments. Renamed `CalculationController` to `PremiseController` for improved clarity. Enhanced `ExcelReportingService` for accurate header and data mapping during report generation. --- .../ContainerCalculationResult.java | 9 ++++ ...Controller.java => PremiseController.java} | 6 +-- .../model/packaging/PackagingDimension.java | 16 ++++++++ .../CalculationExecutionService.java | 24 +++++++++++ .../ContainerCalculationService.java | 41 +++++++++++++++++++ .../service/report/ExcelReportingService.java | 31 ++++++++------ 6 files changed, 112 insertions(+), 15 deletions(-) create mode 100644 src/main/java/de/avatic/lcc/calculationmodel/ContainerCalculationResult.java rename src/main/java/de/avatic/lcc/controller/calculation/{CalculationController.java => PremiseController.java} (94%) create mode 100644 src/main/java/de/avatic/lcc/service/calculation/CalculationExecutionService.java create mode 100644 src/main/java/de/avatic/lcc/service/calculation/ContainerCalculationService.java diff --git a/src/main/java/de/avatic/lcc/calculationmodel/ContainerCalculationResult.java b/src/main/java/de/avatic/lcc/calculationmodel/ContainerCalculationResult.java new file mode 100644 index 0000000..3d963eb --- /dev/null +++ b/src/main/java/de/avatic/lcc/calculationmodel/ContainerCalculationResult.java @@ -0,0 +1,9 @@ +package de.avatic.lcc.calculationmodel; + +public class ContainerCalculationResult { + + private int layer; + private String structure; + private int huUnitCount; + +} diff --git a/src/main/java/de/avatic/lcc/controller/calculation/CalculationController.java b/src/main/java/de/avatic/lcc/controller/calculation/PremiseController.java similarity index 94% rename from src/main/java/de/avatic/lcc/controller/calculation/CalculationController.java rename to src/main/java/de/avatic/lcc/controller/calculation/PremiseController.java index 7190689..633f356 100644 --- a/src/main/java/de/avatic/lcc/controller/calculation/CalculationController.java +++ b/src/main/java/de/avatic/lcc/controller/calculation/PremiseController.java @@ -24,7 +24,7 @@ import java.util.Map; @RestController @RequestMapping("/api/calculation") -public class CalculationController { +public class PremiseController { private final PremiseSearchStringAnalyzerService premiseSearchStringAnalyzerService; private final PremisesService premisesServices; @@ -33,7 +33,7 @@ public class CalculationController { private final ChangeSupplierService changeSupplierService; private final ChangeMaterialService changeMaterialService; - public CalculationController(PremiseSearchStringAnalyzerService premiseSearchStringAnalyzerService, PremisesService premisesServices, PremiseCreationService premiseCreationService, DestinationService destinationService, ChangeSupplierService changeSupplierService, ChangeMaterialService changeMaterialService) { + public PremiseController(PremiseSearchStringAnalyzerService premiseSearchStringAnalyzerService, PremisesService premisesServices, PremiseCreationService premiseCreationService, DestinationService destinationService, ChangeSupplierService changeSupplierService, ChangeMaterialService changeMaterialService) { this.premiseSearchStringAnalyzerService = premiseSearchStringAnalyzerService; this.premisesServices = premisesServices; this.premiseCreationService = premiseCreationService; @@ -71,7 +71,7 @@ public class CalculationController { // triggers a calculation @PutMapping("/done") public ResponseEntity completePremises(@RequestBody List premiseIds) { - return ResponseEntity.ok(premisesServices.startCalculation(premiseIds)); //TODO + return ResponseEntity.ok(premisesServices.startCalculation(premiseIds)); } @PutMapping("/packaging") diff --git a/src/main/java/de/avatic/lcc/model/packaging/PackagingDimension.java b/src/main/java/de/avatic/lcc/model/packaging/PackagingDimension.java index 0f715a7..2e6e5d3 100644 --- a/src/main/java/de/avatic/lcc/model/packaging/PackagingDimension.java +++ b/src/main/java/de/avatic/lcc/model/packaging/PackagingDimension.java @@ -106,4 +106,20 @@ public class PackagingDimension { public void setDeprecated(Boolean deprecated) { isDeprecated = deprecated; } + + public PackagingDimension withTolerance(double tolerance) { + PackagingDimension dimensions = new PackagingDimension(); + + dimensions.setType(type); + dimensions.setLength(Double.valueOf(length.doubleValue() * (1.0+tolerance)).intValue()); + dimensions.setWidth(Double.valueOf(width.doubleValue() * (1.0+tolerance)).intValue()); + dimensions.setHeight(Double.valueOf(height.doubleValue() * (1.0+tolerance)).intValue()); + dimensions.setDimensionUnit(dimensionUnit); + dimensions.setWeight(weight); + dimensions.setWeightUnit(weightUnit); + dimensions.setContentUnitCount(contentUnitCount); + dimensions.setDeprecated(isDeprecated); + + return dimensions; + } } diff --git a/src/main/java/de/avatic/lcc/service/calculation/CalculationExecutionService.java b/src/main/java/de/avatic/lcc/service/calculation/CalculationExecutionService.java new file mode 100644 index 0000000..b5b6ab7 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/calculation/CalculationExecutionService.java @@ -0,0 +1,24 @@ +package de.avatic.lcc.service.calculation; + +import de.avatic.lcc.model.premises.Premise; +import de.avatic.lcc.repositories.premise.PremiseRepository; +import org.springframework.stereotype.Service; + +@Service +public class CalculationExecutionService { + + + private final PremiseRepository premiseRepository; + + public CalculationExecutionService(PremiseRepository premiseRepository) { + this.premiseRepository = premiseRepository; + } + + public void doCalculation(Integer premiseId) { + var premise = premiseRepository.getPremiseById(premiseId); + + + + } + +} diff --git a/src/main/java/de/avatic/lcc/service/calculation/ContainerCalculationService.java b/src/main/java/de/avatic/lcc/service/calculation/ContainerCalculationService.java new file mode 100644 index 0000000..c0b6901 --- /dev/null +++ b/src/main/java/de/avatic/lcc/service/calculation/ContainerCalculationService.java @@ -0,0 +1,41 @@ +package de.avatic.lcc.service.calculation; + +import de.avatic.lcc.calculationmodel.ContainerCalculationResult; +import de.avatic.lcc.model.packaging.Packaging; +import de.avatic.lcc.model.packaging.PackagingDimension; +import de.avatic.lcc.model.utils.DimensionUnit; +import de.avatic.lcc.repositories.packaging.PackagingDimensionRepository; +import org.springframework.stereotype.Service; + +@Service +public class ContainerCalculationService { + + private static final double DIMENSION_TOLERANCE = 0.02; + + private static final int TEU_LENGTH = 5890; + private static final int TEU_WIDTH = 2350; + private static final int TEU_HEIGHT = 2390; + + private static final int FEU_LENGTH = 12030; + private static final int FEU_WIDTH = 2350; + private static final int FEU_HEIGHT = 2390; + + private static final int HQ_LENGTH = 12030; + private static final int HQ_WIDTH = 2350; + private static final int HQ_HEIGHT = 2690; + + + + public ContainerCalculationResult doCalculation(PackagingDimension hu) { + var dimensions = hu.withTolerance(DIMENSION_TOLERANCE); + } + + private int calculateLayer(PackagingDimension dimension, ) { + + } + + private static class Container { + + } + +} diff --git a/src/main/java/de/avatic/lcc/service/report/ExcelReportingService.java b/src/main/java/de/avatic/lcc/service/report/ExcelReportingService.java index 3ce3ff9..75aa63c 100644 --- a/src/main/java/de/avatic/lcc/service/report/ExcelReportingService.java +++ b/src/main/java/de/avatic/lcc/service/report/ExcelReportingService.java @@ -46,21 +46,29 @@ public class ExcelReportingService { List flatteners = reports.stream().map(ReportFlattener::new).toList(); - int rowIdx = 1; + while(true) { boolean hasData = false; + boolean headerWritten = false; - var row = sheet.createRow(rowIdx); - int cellIdx = 0; + var row = sheet.createRow(sheet.getLastRowNum() + 1); + int cellIdx = 1 /* 0 is the header column */; for(ReportFlattener flattener : flatteners) { - if(cellIdx == 0) { - row.createCell(cellIdx++).setCellValue(flattener.getHeader(rowIdx)); + + Cell cell = row.createCell(cellIdx); + + if(flattener.hasData(row.getRowNum())) { + if(!headerWritten) { + row.createCell(0).setCellValue(flattener.getHeader(row.getRowNum())); + headerWritten = true; + } + cell.setCellValue(flattener.getCell(row.getRowNum())); hasData = true; } - row.createCell(cellIdx++).setCellValue(flattener.getCell(rowIdx)); + + cellIdx++; } - rowIdx++; if(!hasData) break; } @@ -73,11 +81,6 @@ public class ExcelReportingService { } } - private void mapToCell(Sheet sheet, ReportDTO reportDTO, Cell cell, int rowIdx) { - - - } - private static class ReportFlattener { private static final String SUPPLIER_NAME = "Supplier"; @@ -179,6 +182,10 @@ public class ExcelReportingService { public String getHeader(int rowIdx) { return dataHeader.get(rowIdx); } + + public boolean hasData(int index) { + return data.size() > index; + } } }