diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/SmartLoadingService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/SmartLoadingService.java index efa936bbe..e902a6e79 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/service/SmartLoadingService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/SmartLoadingService.java @@ -259,18 +259,16 @@ public class SmartLoadingService { if (replay != null) return replay; LoadingPlanEntity plan = editing(planId, request.expectedVersion(), operatorId, operatorName); ContainerBookingEntity booking = requireBooking(plan.getContainerBookingId()); - for (Candidate candidate : candidates(booking.getWarehouseId())) { - if (!Objects.equals(candidate.warehouseId(), booking.getWarehouseId())) continue; - if (!sameChannel(booking, candidate)) continue; - if (!sameCustomerScope(booking, candidate)) continue; + for (InboundCandidate candidate : inboundCandidates(plan.getContainerBookingId(), booking.getWarehouseId())) { if (StringUtils.hasText(booking.getDestinationWarehouseCode()) && !Objects.equals(booking.getDestinationWarehouseCode(), candidate.destinationWarehouseCode())) continue; - int count = fittingBoxes(booking, repository.items(planId), candidate); + int count = fittingBoxes(booking, repository.items(planId), candidate.availablePackageCount(), + candidate.averageUnitVolumeCbm(), candidate.unitGrossWeightKg()); if (count > 0) { plan = repository.plan(planId); - assign(planId, new AssignRequest(candidate.inboundId(), candidate.inboundDetailId(), - count, plan.getVersion(), "REC-" + sha256(operation + '|' + candidate.inboundId() - + '|' + candidate.inboundDetailId())), operatorId, operatorName); + assignInbound(planId, new AssignInboundRequest(candidate.inboundId(), count, + plan.getVersion(), "REC-INB-" + sha256(operation + '|' + candidate.inboundId()) + .substring(0, 48)), operatorId, operatorName); } } LoadingPlanEntity recommended = repository.plan(planId); @@ -510,14 +508,18 @@ public class SmartLoadingService { } } private int fittingBoxes(ContainerBookingEntity b,List lines,Candidate c){ + return fittingBoxes(b, lines, c.availablePackageCount(), c.unitVolumeCbm(), c.unitGrossWeightKg()); + } + private int fittingBoxes(ContainerBookingEntity b,List lines,int available, + BigDecimal unitVolume,BigDecimal unitWeight){ if(b.getCapacityCbm()==null||b.getMaxWeightKg()==null)return 0; BigDecimal usedV=lines.stream().map(x->unit(x.getVolumeCbm())).reduce(BigDecimal.ZERO,BigDecimal::add); BigDecimal usedW=lines.stream().map(x->unit(x.getGrossWeightKg())).reduce(BigDecimal.ZERO,BigDecimal::add); BigDecimal leftV=b.getCapacityCbm().multiply(CAPACITY_LIMIT_RATIO).subtract(usedV); BigDecimal leftW=b.getMaxWeightKg().multiply(CAPACITY_LIMIT_RATIO).subtract(usedW); - int byV=unit(c.unitVolumeCbm()).signum()==0?c.availablePackageCount():leftV.max(BigDecimal.ZERO).divideToIntegralValue(c.unitVolumeCbm()).intValue(); - int byW=unit(c.unitGrossWeightKg()).signum()==0?c.availablePackageCount():leftW.max(BigDecimal.ZERO).divideToIntegralValue(c.unitGrossWeightKg()).intValue(); - return Math.max(0,Math.min(c.availablePackageCount(),Math.min(byV,byW))); + int byV=unit(unitVolume).signum()==0?available:leftV.max(BigDecimal.ZERO).divideToIntegralValue(unitVolume).intValue(); + int byW=unit(unitWeight).signum()==0?available:leftW.max(BigDecimal.ZERO).divideToIntegralValue(unitWeight).intValue(); + return Math.max(0,Math.min(available,Math.min(byV,byW))); } private Plan view(LoadingPlanEntity p,ContainerBookingEntity b){ var task = loadingPickService.mutationSnapshot(p.getId());