This commit is contained in:
2026-09-15 16:10:55 +08:00
parent 506525524b
commit c207a4d3b7
20 changed files with 693 additions and 93 deletions
@@ -3,6 +3,7 @@ package com.baiyue.lastleg.service;
import com.baiyue.lastleg.dto.LastlegOrderRequests;
import com.baiyue.lastleg.dto.ContainerPlanProgressDetail;
import com.baiyue.lastleg.dto.ContainerPlanProgressSummary;
import com.baiyue.lastleg.dto.ContainerArrivalTimeView;
import com.baiyue.lastleg.entity.LastlegOrder;
import com.baiyue.lastleg.entity.LastlegOrderDetail;
import com.baiyue.lastleg.entity.LastlegOrderStatusHistory;
@@ -17,6 +18,8 @@ import com.baiyue.lastleg.financefee.service.OverseasFeeSourceService;
import com.baiyue.lastleg.mapper.LastlegOrderOperationLogMapper;
import com.baiyue.lastleg.mapper.LastlegOrderManualNodeMapper;
import com.baiyue.lastleg.mapper.ReceivingWarehouseOperationMapper;
import com.baiyue.lastleg.mapper.ContainerArrivalTimeOperationMapper;
import com.baiyue.lastleg.entity.ContainerArrivalTimeOperation;
import com.baiyue.lastleg.inboundplan.pda.gateway.WarehouseResourceGateway;
import com.baiyue.lastleg.shipping.entity.ContainerShippingGate;
import com.baiyue.lastleg.shipping.mapper.ContainerShippingGateMapper;
@@ -42,6 +45,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.ArgumentMatchers.anyLong;
@@ -65,6 +69,7 @@ class LastlegOrderServiceTest {
@Mock InventoryCommandService inventory;
@Mock InboundOrderDetainedOutboxService detainedOutbox;
@Mock ReceivingWarehouseOperationMapper receivingWarehouseOperations;
@Mock ContainerArrivalTimeOperationMapper containerArrivalTimeOperations;
@Mock WarehouseResourceGateway warehouseResourceGateway;
@Mock ContainerShippingGateMapper containerShippingGates;
LastlegOrderService service;
@@ -97,10 +102,47 @@ class LastlegOrderServiceTest {
ReflectionTestUtils.setField(service, "inventory", inventory);
ReflectionTestUtils.setField(service, "detainedOutbox", detainedOutbox);
ReflectionTestUtils.setField(service, "receivingWarehouseOperations", receivingWarehouseOperations);
ReflectionTestUtils.setField(service, "containerArrivalTimeOperations", containerArrivalTimeOperations);
ReflectionTestUtils.setField(service, "warehouseResourceGateway", warehouseResourceGateway);
ReflectionTestUtils.setField(service, "containerShippingGates", containerShippingGates);
}
@Test
void changesExpectedWarehouseArrivalForTheWholeContainerBeforePlanning() {
LastlegOrder first = new LastlegOrder(); first.setArrivalTimeVersion(0);
LastlegOrder second = new LastlegOrder(); second.setArrivalTimeVersion(0);
LocalDateTime estimatedAt = LocalDateTime.of(2026, 9, 25, 15, 31);
when(orders.lockContainerOrders("BOOKING-1")).thenReturn(List.of(first, second));
when(orders.countContainerPlans("BOOKING-1")).thenReturn(0L);
when(orders.updateContainerExpectedWarehouseArrival("BOOKING-1", estimatedAt, 0)).thenReturn(2);
when(orders.findContainerArrivalTimes(List.of("BOOKING-1"))).thenReturn(List.of(
new ContainerArrivalTimeView("BOOKING-1", estimatedAt, null, 1)));
ContainerArrivalTimeView result = service.changeExpectedWarehouseArrival("BOOKING-1", "arrival-1",
new LastlegOrderRequests.ChangeExpectedWarehouseArrival(estimatedAt, 0, null), "admin");
assertEquals(estimatedAt, result.estimatedWarehouseArrivalAt());
ArgumentCaptor<ContainerArrivalTimeOperation> operation = ArgumentCaptor.forClass(ContainerArrivalTimeOperation.class);
verify(containerArrivalTimeOperations).insert(operation.capture());
assertEquals(1, operation.getValue().getResultVersion());
}
@Test
void rejectsExpectedWarehouseArrivalChangesAfterAnyPlanExists() {
LastlegOrder order = new LastlegOrder(); order.setArrivalTimeVersion(0);
when(orders.lockContainerOrders("BOOKING-1")).thenReturn(List.of(order));
when(orders.countContainerPlans("BOOKING-1")).thenReturn(1L);
ResponseStatusException error = assertThrows(ResponseStatusException.class,
() -> service.changeExpectedWarehouseArrival("BOOKING-1", "arrival-locked",
new LastlegOrderRequests.ChangeExpectedWarehouseArrival(
LocalDateTime.of(2026, 9, 25, 15, 31), 0, null), "admin"));
assertEquals(409, error.getStatusCode().value());
assertEquals("该柜已生成入库计划,预计到仓时间不可修改", error.getReason());
verify(orders, never()).updateContainerExpectedWarehouseArrival(any(), any(), anyInt());
}
@Test
void changesReceivingWarehouseForAllPlansReadyContainerBeforePdaSession() {
LastlegOrder first = order(1L, "100", "PENDING_ASSIGNMENT", null);