diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/pda/service/ReceivingContainerService.java b/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/pda/service/ReceivingContainerService.java index 505888d79..be2b064ac 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/pda/service/ReceivingContainerService.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/pda/service/ReceivingContainerService.java @@ -116,6 +116,10 @@ public class ReceivingContainerService { .filter(ContainerReadiness::shippingReady) .filter(value -> !value.allPlansCompleted()) .filter(value -> !reservedByOthers.contains(activeContainerKey(value.containerNo()))) + .sorted(Comparator.comparing(ContainerReadiness::operable).reversed() + .thenComparing(ContainerReadiness::plannedArrivalAt, + Comparator.nullsLast(Comparator.naturalOrder())) + .thenComparing(ContainerReadiness::sourceContainerBookingId)) .map(value -> candidate(value, current)).toList(); } diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/pda/service/ReceivingContainerServiceBehaviorTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/pda/service/ReceivingContainerServiceBehaviorTest.java index 97764f18f..5ecf4d213 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/pda/service/ReceivingContainerServiceBehaviorTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/pda/service/ReceivingContainerServiceBehaviorTest.java @@ -34,6 +34,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.web.server.ResponseStatusException; +import java.time.LocalDateTime; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -154,6 +155,30 @@ class ReceivingContainerServiceBehaviorTest { assertThat(service.candidates("7", 100L)).isEmpty(); } + @Test + void candidatesPutOperableContainersFirstThenOrderByPlannedArrival() { + InboundPlan latePlan = plan("CONT-LATE"); + InboundPlan earlyPlan = plan("CONT-EARLY"); earlyPlan.setId(3L); + InboundPlan nullArrivalPlan = plan("CONT-NULL"); nullArrivalPlan.setId(4L); + InboundPlan blockedPlan = plan("CONT-BLOCKED"); blockedPlan.setId(5L); + InboundPlanLine lateLine = line("FBA"); lateLine.setOrderId(2L); + InboundPlanLine earlyLine = line("FBA"); earlyLine.setId(11L); earlyLine.setOrderId(3L); earlyLine.setPlanId(3L); + InboundPlanLine nullArrivalLine = line("FBA"); nullArrivalLine.setId(12L); nullArrivalLine.setOrderId(4L); nullArrivalLine.setPlanId(4L); + LastlegOrder blocked = containerOrder(1L, "100", "CONT-BLOCKED", "BOOKING-A", "IN-1"); + LastlegOrder late = containerOrder(2L, "100", "CONT-LATE", "BOOKING-B", "IN-2"); + LastlegOrder early = containerOrder(3L, "100", "CONT-EARLY", "BOOKING-C", "IN-3"); + LastlegOrder nullArrival = containerOrder(4L, "100", "CONT-NULL", "BOOKING-D", "IN-4"); + blocked.setEstimatedWarehouseAt(LocalDateTime.of(2026, 9, 1, 8, 0)); + late.setEstimatedWarehouseAt(LocalDateTime.of(2026, 9, 3, 8, 0)); + early.setEstimatedWarehouseAt(LocalDateTime.of(2026, 9, 2, 8, 0)); + when(plans.selectList(any())).thenReturn(List.of(latePlan, earlyPlan, nullArrivalPlan, blockedPlan)); + when(lines.selectList(any())).thenReturn(List.of(lateLine, earlyLine, nullArrivalLine)); + when(orders.selectList(any())).thenReturn(List.of(blocked, late, early, nullArrival)); + + assertThat(service.candidates("7", 100L)).extracting("containerNo") + .containsExactly("CONT-EARLY", "CONT-LATE", "CONT-NULL", "CONT-BLOCKED"); + } + @Test void candidatesIncludeUnassignedAndSameWarehouseButHideOtherWarehouse() { InboundPlan unassigned = plan("CONT-A");