fix(back-end): shift model
Some checks failed
Build, Test and Deploy / test-backend (push) Failing after 24s
Build, Test and Deploy / build-and-push (push) Has been skipped
Build, Test and Deploy / deploy (push) Has been skipped

This commit is contained in:
2026-02-16 17:47:41 +01:00
parent e1409d218b
commit 8edc4af645
4 changed files with 28 additions and 1 deletions

View File

@@ -7,6 +7,7 @@ import com.printcalculator.model.QuoteResult;
import com.printcalculator.model.StlBounds; import com.printcalculator.model.StlBounds;
import com.printcalculator.repository.PrinterMachineRepository; import com.printcalculator.repository.PrinterMachineRepository;
import com.printcalculator.service.QuoteCalculator; import com.printcalculator.service.QuoteCalculator;
import com.printcalculator.service.ProfileManager;
import com.printcalculator.service.SlicerService; import com.printcalculator.service.SlicerService;
import com.printcalculator.service.StlService; import com.printcalculator.service.StlService;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@@ -29,16 +30,18 @@ public class QuoteController {
private final StlService stlService; private final StlService stlService;
private final QuoteCalculator quoteCalculator; private final QuoteCalculator quoteCalculator;
private final PrinterMachineRepository machineRepo; private final PrinterMachineRepository machineRepo;
private final ProfileManager profileManager;
// Defaults (using aliases defined in ProfileManager) // Defaults (using aliases defined in ProfileManager)
private static final String DEFAULT_FILAMENT = "pla_basic"; private static final String DEFAULT_FILAMENT = "pla_basic";
private static final String DEFAULT_PROCESS = "standard"; private static final String DEFAULT_PROCESS = "standard";
public QuoteController(SlicerService slicerService, StlService stlService, QuoteCalculator quoteCalculator, PrinterMachineRepository machineRepo) { public QuoteController(SlicerService slicerService, StlService stlService, QuoteCalculator quoteCalculator, PrinterMachineRepository machineRepo, ProfileManager profileManager) {
this.slicerService = slicerService; this.slicerService = slicerService;
this.stlService = stlService; this.stlService = stlService;
this.quoteCalculator = quoteCalculator; this.quoteCalculator = quoteCalculator;
this.machineRepo = machineRepo; this.machineRepo = machineRepo;
this.profileManager = profileManager;
} }
@PostMapping("/api/quote") @PostMapping("/api/quote")
@@ -125,6 +128,7 @@ public class QuoteController {
if (slicerMachineProfile == null || slicerMachineProfile.isEmpty()) { if (slicerMachineProfile == null || slicerMachineProfile.isEmpty()) {
slicerMachineProfile = "bambu_a1"; slicerMachineProfile = "bambu_a1";
} }
slicerMachineProfile = profileManager.resolveMachineProfileName(slicerMachineProfile, nozzleDiameter);
// Validate model size against machine volume // Validate model size against machine volume
StlBounds bounds = validateModelSize(tempInput.toFile(), machine); StlBounds bounds = validateModelSize(tempInput.toFile(), machine);

View File

@@ -11,6 +11,7 @@ import com.printcalculator.repository.PrinterMachineRepository;
import com.printcalculator.repository.QuoteLineItemRepository; import com.printcalculator.repository.QuoteLineItemRepository;
import com.printcalculator.repository.QuoteSessionRepository; import com.printcalculator.repository.QuoteSessionRepository;
import com.printcalculator.service.QuoteCalculator; import com.printcalculator.service.QuoteCalculator;
import com.printcalculator.service.ProfileManager;
import com.printcalculator.service.SlicerService; import com.printcalculator.service.SlicerService;
import com.printcalculator.service.StlService; import com.printcalculator.service.StlService;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
@@ -45,6 +46,7 @@ public class QuoteSessionController {
private final SlicerService slicerService; private final SlicerService slicerService;
private final StlService stlService; private final StlService stlService;
private final QuoteCalculator quoteCalculator; private final QuoteCalculator quoteCalculator;
private final ProfileManager profileManager;
private final PrinterMachineRepository machineRepo; private final PrinterMachineRepository machineRepo;
private final com.printcalculator.repository.PricingPolicyRepository pricingRepo; private final com.printcalculator.repository.PricingPolicyRepository pricingRepo;
private final com.printcalculator.service.StorageService storageService; private final com.printcalculator.service.StorageService storageService;
@@ -58,6 +60,7 @@ public class QuoteSessionController {
SlicerService slicerService, SlicerService slicerService,
StlService stlService, StlService stlService,
QuoteCalculator quoteCalculator, QuoteCalculator quoteCalculator,
ProfileManager profileManager,
PrinterMachineRepository machineRepo, PrinterMachineRepository machineRepo,
com.printcalculator.repository.PricingPolicyRepository pricingRepo, com.printcalculator.repository.PricingPolicyRepository pricingRepo,
com.printcalculator.service.StorageService storageService) { com.printcalculator.service.StorageService storageService) {
@@ -66,6 +69,7 @@ public class QuoteSessionController {
this.slicerService = slicerService; this.slicerService = slicerService;
this.stlService = stlService; this.stlService = stlService;
this.quoteCalculator = quoteCalculator; this.quoteCalculator = quoteCalculator;
this.profileManager = profileManager;
this.machineRepo = machineRepo; this.machineRepo = machineRepo;
this.pricingRepo = pricingRepo; this.pricingRepo = pricingRepo;
this.storageService = storageService; this.storageService = storageService;
@@ -163,6 +167,7 @@ public class QuoteSessionController {
if (machineProfile == null || machineProfile.isBlank()) { if (machineProfile == null || machineProfile.isBlank()) {
machineProfile = "bambu_a1"; // final fallback (alias handled in ProfileManager) machineProfile = "bambu_a1"; // final fallback (alias handled in ProfileManager)
} }
machineProfile = profileManager.resolveMachineProfileName(machineProfile, settings.getNozzleDiameter());
String filamentProfile = "Generic " + (settings.getMaterial() != null ? settings.getMaterial().toUpperCase() : "PLA"); String filamentProfile = "Generic " + (settings.getMaterial() != null ? settings.getMaterial().toUpperCase() : "PLA");
// Mapping: "pla_basic" -> "Generic PLA", "petg_basic" -> "Generic PETG" // Mapping: "pla_basic" -> "Generic PLA", "petg_basic" -> "Generic PETG"

View File

@@ -16,6 +16,7 @@ import java.util.logging.Logger;
import java.util.stream.Stream; import java.util.stream.Stream;
import java.util.Map; import java.util.Map;
import java.util.HashMap; import java.util.HashMap;
import java.math.BigDecimal;
@Service @Service
public class ProfileManager { public class ProfileManager {
@@ -59,6 +60,18 @@ public class ProfileManager {
return resolveInheritance(profilePath); return resolveInheritance(profilePath);
} }
public String resolveMachineProfileName(String machineName, Double nozzleDiameter) {
String resolvedName = profileAliases.getOrDefault(machineName, machineName);
if (nozzleDiameter == null) return resolvedName;
String base = resolvedName.replaceAll("\\s*\\d+(?:\\.\\d+)?\\s*nozzle$", "").trim();
String formatted = BigDecimal.valueOf(nozzleDiameter).stripTrailingZeros().toPlainString();
String candidate = base + " " + formatted + " nozzle";
Path exists = findProfileFile(candidate, "machine");
return exists != null ? candidate : resolvedName;
}
private Path findProfileFile(String name, String type) { private Path findProfileFile(String name, String type) {
// Check aliases first // Check aliases first
String resolvedName = profileAliases.getOrDefault(name, name); String resolvedName = profileAliases.getOrDefault(name, name);

View File

@@ -11,6 +11,7 @@ import com.printcalculator.service.SlicerService;
import com.printcalculator.service.QuoteCalculator; import com.printcalculator.service.QuoteCalculator;
import com.printcalculator.service.StorageService; import com.printcalculator.service.StorageService;
import com.printcalculator.service.StlService; import com.printcalculator.service.StlService;
import com.printcalculator.service.ProfileManager;
import com.printcalculator.model.PrintStats; import com.printcalculator.model.PrintStats;
import com.printcalculator.model.QuoteResult; import com.printcalculator.model.QuoteResult;
import com.printcalculator.entity.PrinterMachine; import com.printcalculator.entity.PrinterMachine;
@@ -64,6 +65,9 @@ public class ManualSessionPersistenceTest {
@MockitoBean @MockitoBean
private StlService stlService; private StlService stlService;
@MockitoBean
private ProfileManager profileManager;
@MockitoBean @MockitoBean
private QuoteCalculator quoteCalculator; private QuoteCalculator quoteCalculator;
@@ -113,6 +117,7 @@ public class ManualSessionPersistenceTest {
when(stlService.readBounds(any())).thenReturn(new StlBounds(0, 0, 0, 10, 10, 10)); when(stlService.readBounds(any())).thenReturn(new StlBounds(0, 0, 0, 10, 10, 10));
when(stlService.shiftToFitIfNeeded(any(), any(), anyInt(), anyInt(), anyInt())) when(stlService.shiftToFitIfNeeded(any(), any(), anyInt(), anyInt(), anyInt()))
.thenReturn(new StlShiftResult(null, 0, 0, 0, false)); .thenReturn(new StlShiftResult(null, 0, 0, 0, false));
when(profileManager.resolveMachineProfileName(any(), any())).thenAnswer(i -> i.getArguments()[0]);
when(storageService.loadAsResource(any())).thenReturn(new org.springframework.core.io.ByteArrayResource("dummy".getBytes()){ when(storageService.loadAsResource(any())).thenReturn(new org.springframework.core.io.ByteArrayResource("dummy".getBytes()){
@Override @Override
public File getFile() { return new File("dummy"); } public File getFile() { return new File("dummy"); }