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.
This commit is contained in:
Jan Weber 2025-05-09 17:43:39 +02:00
parent 46fd70a2c8
commit d2e271ed36
6 changed files with 112 additions and 15 deletions

View file

@ -0,0 +1,9 @@
package de.avatic.lcc.calculationmodel;
public class ContainerCalculationResult {
private int layer;
private String structure;
private int huUnitCount;
}

View file

@ -24,7 +24,7 @@ import java.util.Map;
@RestController @RestController
@RequestMapping("/api/calculation") @RequestMapping("/api/calculation")
public class CalculationController { public class PremiseController {
private final PremiseSearchStringAnalyzerService premiseSearchStringAnalyzerService; private final PremiseSearchStringAnalyzerService premiseSearchStringAnalyzerService;
private final PremisesService premisesServices; private final PremisesService premisesServices;
@ -33,7 +33,7 @@ public class CalculationController {
private final ChangeSupplierService changeSupplierService; private final ChangeSupplierService changeSupplierService;
private final ChangeMaterialService changeMaterialService; 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.premiseSearchStringAnalyzerService = premiseSearchStringAnalyzerService;
this.premisesServices = premisesServices; this.premisesServices = premisesServices;
this.premiseCreationService = premiseCreationService; this.premiseCreationService = premiseCreationService;
@ -71,7 +71,7 @@ public class CalculationController {
// triggers a calculation // triggers a calculation
@PutMapping("/done") @PutMapping("/done")
public ResponseEntity<Integer> completePremises(@RequestBody List<Integer> premiseIds) { public ResponseEntity<Integer> completePremises(@RequestBody List<Integer> premiseIds) {
return ResponseEntity.ok(premisesServices.startCalculation(premiseIds)); //TODO return ResponseEntity.ok(premisesServices.startCalculation(premiseIds));
} }
@PutMapping("/packaging") @PutMapping("/packaging")

View file

@ -106,4 +106,20 @@ public class PackagingDimension {
public void setDeprecated(Boolean deprecated) { public void setDeprecated(Boolean deprecated) {
isDeprecated = 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;
}
} }

View file

@ -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);
}
}

View file

@ -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 {
}
}

View file

@ -46,21 +46,29 @@ public class ExcelReportingService {
List<ReportFlattener> flatteners = reports.stream().map(ReportFlattener::new).toList(); List<ReportFlattener> flatteners = reports.stream().map(ReportFlattener::new).toList();
int rowIdx = 1;
while(true) { while(true) {
boolean hasData = false; boolean hasData = false;
boolean headerWritten = false;
var row = sheet.createRow(rowIdx); var row = sheet.createRow(sheet.getLastRowNum() + 1);
int cellIdx = 0; int cellIdx = 1 /* 0 is the header column */;
for(ReportFlattener flattener : flatteners) { 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; hasData = true;
} }
row.createCell(cellIdx++).setCellValue(flattener.getCell(rowIdx));
cellIdx++;
} }
rowIdx++;
if(!hasData) break; 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 class ReportFlattener {
private static final String SUPPLIER_NAME = "Supplier"; private static final String SUPPLIER_NAME = "Supplier";
@ -179,6 +182,10 @@ public class ExcelReportingService {
public String getHeader(int rowIdx) { public String getHeader(int rowIdx) {
return dataHeader.get(rowIdx); return dataHeader.get(rowIdx);
} }
public boolean hasData(int index) {
return data.size() > index;
}
} }
} }