优化提交

This commit is contained in:
2026-09-14 09:58:30 +08:00
parent 5ffd6c0118
commit 8cf7c4b9c9
93 changed files with 2945 additions and 188 deletions
@@ -15,7 +15,7 @@ class DispatchCandidateMapperContractTest {
"planNo", "orderType", "volumeWeightKg", "containerNo", "appointmentAt", "expectedLoadingAt",
"overseasWarehouseId", "overseasWarehouseName", "orderNo", "orderRefs", "inboundCode", "palletNo",
"destinationWarehouseId", "destinationWarehouseCode", "destinationWarehouseName", "fbaWarehouseCode",
"packageCount", "volumeCbm", "sourceStage", "cartonMarks"
"packageCount", "volumeCbm", "sourceStage", "cartonMarks", "relabelCartonMarks"
);
@Test
@@ -24,6 +24,8 @@ class DispatchCandidateMapperContractTest {
String.class, List.class, String.class, String.class, String.class, String.class));
assertConstructorColumnOrder(DispatchCandidateMapper.class.getMethod("lockSelected",
String.class, List.class));
assertConstructorColumnOrder(DispatchCandidateMapper.class.getMethod("relabelAvailable",
String.class, String.class, String.class));
}
@Test
@@ -49,6 +51,20 @@ class DispatchCandidateMapperContractTest {
}
}
@Test
void candidateMarksFollowPdaRelabelPalletBinding() throws Exception {
for (Method method : List.of(
DispatchCandidateMapper.class.getMethod("available", String.class, List.class, String.class,
String.class, String.class, String.class),
DispatchCandidateMapper.class.getMethod("lockSelected", String.class, List.class))) {
String sql = String.join(" ", method.getAnnotation(Select.class).value());
assertTrue(sql.contains("rp.id=ri.source_inventory_position_id"));
assertTrue(sql.contains("rp.pallet_id=p.warehouse_pallet_id"));
assertTrue(sql.contains("ri.fba_carton_mark"));
assertTrue(sql.contains("AS relabelCartonMarks"));
}
}
private void assertConstructorColumnOrder(Method method) {
String sql = String.join(" ", method.getAnnotation(Select.class).value());
int previous = -1;
@@ -226,6 +226,34 @@ class DispatchPdaWorkflowServiceTest {
verify(outboundOrders, never()).updateById((OutboundOrder) any());
}
@Test
void successfulDepartureRecordsActualDepartureTime() {
DispatchOrder order = order("100", "DSP-1", "WH-1", "READY_TO_DEPART");
order.setVehiclePlate("CA-100");
DispatchPdaTask task = task(11L, "100", "WH-1", "COMPLETED");
DispatchItem item = item(21L, "100", 6);
DispatchPdaPick pick = new DispatchPdaPick();
pick.setPackages(6L);
OutboundOrder outbound = new OutboundOrder();
outbound.setOutboundNo("OB-1");
outbound.setStatus("WAIT_OUTBOUND");
when(orders.findGlobalByDispatchNo("DSP-1")).thenReturn(order);
when(orders.lockById("100", 1L)).thenReturn(order);
when(outboundOrders.lockByDispatch("100", 1L)).thenReturn(outbound);
when(tasks.lockByDispatch("100", 1L)).thenReturn(task);
when(items.findByDispatchOrder("100", 1L)).thenReturn(List.of(item));
when(picks.totalItem("100", 11L, 21L)).thenReturn(6L);
when(picks.listTask("100", 11L)).thenReturn(List.of(pick));
DispatchPdaResponses.Departed result = service.depart("WH-1", "DSP-1", "7",
new DispatchPdaRequests.Depart("depart-success", null));
assertEquals("DEPARTED", result.status());
assertEquals("DEPARTED", order.getStatus());
assertTrue(order.getDepartAt() != null);
assertEquals("OUTBOUNDED", outbound.getStatus());
}
@Test
void exactDepartRetryReturnsPersistedResultAfterStatusChanged() throws Exception {
DispatchOrder order = order("100", "DSP-1", "WH-1", "DEPARTED");
@@ -20,6 +20,7 @@ import com.baiyue.lastleg.dispatch.pda.entity.DispatchPdaTask;
import com.baiyue.lastleg.dispatch.pda.mapper.DispatchPdaTaskMapper;
import com.baiyue.lastleg.entity.LastlegOrder;
import com.baiyue.lastleg.mapper.LastlegOrderMapper;
import com.baiyue.lastleg.delivery.mapper.OutboundOrderMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -55,6 +56,7 @@ class DispatchServiceTest {
@Mock DispatchDraftContainerMapper draftContainers;
@Mock DispatchPdaTaskMapper pdaTasks;
@Mock LastlegOrderMapper tailOrders;
@Mock OutboundOrderMapper outboundOrders;
private DispatchService service;
@BeforeEach
@@ -68,6 +70,7 @@ class DispatchServiceTest {
ReflectionTestUtils.setField(service, "draftContainers", draftContainers);
ReflectionTestUtils.setField(service, "pdaTasks", pdaTasks);
ReflectionTestUtils.setField(service, "tailOrders", tailOrders);
ReflectionTestUtils.setField(service, "outboundOrders", outboundOrders);
ReflectionTestUtils.setField(service, "orderNoGenerator", new com.baiyue.lastleg.service.LastlegOrderNoGenerator());
lenient().when(items.findByDispatchOrder(any(), any())).thenReturn(List.of());
lenient().when(tailOrders.selectList(any())).thenReturn(List.of());
@@ -181,7 +184,7 @@ class DispatchServiceTest {
}
@Test
void preArrangeConvertsOwnedDraftLockInsteadOfInsertingAnotherLock() {
void preArrangeKeepsVirtualVehicleAndItsLocksEditableUntilOutboundExists() {
when(candidates.lockSelected("100", List.of(10L))).thenReturn(List.of(candidate(10L, null, "ONT8")));
DispatchPalletLock lock = new DispatchPalletLock();
lock.setDraftToken("draft-1"); lock.setDraftContainerId(21L); lock.setOperatorId("7"); lock.setStatus("ACTIVE"); lock.setActiveKey("PLAN:10");
@@ -193,16 +196,40 @@ class DispatchServiceTest {
service.preArrange("100", "7", new DispatchRequests.PreArrange(List.of(10L), null, null, null, null, "draft-1"));
assertNotNull(lock.getDispatchOrderId());
assertNull(lock.getDraftToken());
assertNull(lock.getDraftContainerId());
assertEquals("RELEASED", draft.getStatus());
assertNotNull(draft.getReleasedAt());
assertEquals("draft-1", lock.getDraftToken());
assertEquals(21L, lock.getDraftContainerId());
assertEquals("ACTIVE", draft.getStatus());
assertNull(draft.getExpiresAt());
verify(locks).updateById(lock);
verify(locks, never()).insert(any(DispatchPalletLock.class));
verify(draftContainers).delete(any(LambdaQueryWrapper.class));
verify(drafts).updateById(draft);
}
@Test
void removingUnpickedPalletReleasesLockAndRefreshesDispatchTotals() {
DispatchOrder dispatch = new DispatchOrder();
dispatch.setId(1L); dispatch.setCustomerId("100"); dispatch.setDispatchNo("PC1");
dispatch.setStatus(DispatchService.PENDING_DEPARTURE); dispatch.setPickedPackageCount(0);
DispatchItem removed = new DispatchItem();
removed.setId(11L); removed.setPlanPalletId(10L); removed.setWarehousePalletId(20L);
DispatchItem remaining = new DispatchItem();
remaining.setId(12L); remaining.setPlanPalletId(12L); remaining.setPackageCount(7);
DispatchPalletLock lock = new DispatchPalletLock();
lock.setPlanPalletId(10L); lock.setStatus("ACTIVE"); lock.setActiveKey("PLAN:10");
when(orders.lockGlobalByDispatchNo("PC1")).thenReturn(dispatch);
when(items.lockById("100", 1L, 11L)).thenReturn(removed);
when(locks.selectList(any())).thenReturn(List.of(lock));
when(items.findByDispatchOrder("100", 1L)).thenReturn(List.of(remaining));
DispatchResponse result = service.removeItem("PC1", 11L);
assertEquals(1, result.palletCount());
assertEquals(7, result.packageCount());
assertEquals("RELEASED", lock.getStatus());
verify(items).deleteById(11L);
verify(orders).updateById(dispatch);
}
@Test
void activeDraftOnlyRestoresLocksStillOwnedByThatDraft() {
DispatchDraft draft = new DispatchDraft();