贴标申请,仓储转运
This commit is contained in:
+27
@@ -59,6 +59,7 @@ class DispatchPdaWorkflowServiceTest {
|
||||
@Mock InventoryPositionMapper positions;
|
||||
@Mock InventoryCommandService inventory;
|
||||
@Mock DispatchPickOrderAttributionService attribution;
|
||||
@Mock com.baiyue.lastleg.dispatch.service.ReturnRelabelDispatchStock returnStock;
|
||||
@Mock com.baiyue.lastleg.fleet.trip.FleetDispatchBindingGuard fleetBindings;
|
||||
private DispatchPdaWorkflowService service;
|
||||
private ObjectMapper objectMapper;
|
||||
@@ -80,6 +81,7 @@ class DispatchPdaWorkflowServiceTest {
|
||||
ReflectionTestUtils.setField(service, "positions", positions);
|
||||
ReflectionTestUtils.setField(service, "inventory", inventory);
|
||||
ReflectionTestUtils.setField(service, "pickAttribution", attribution);
|
||||
ReflectionTestUtils.setField(service, "returnRelabelStock", returnStock);
|
||||
ReflectionTestUtils.setField(service, "objectMapper", objectMapper);
|
||||
}
|
||||
|
||||
@@ -329,6 +331,31 @@ class DispatchPdaWorkflowServiceTest {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Test void nativeBoxPickLocksOrderBeforeStockAndNeverUsesOrdinaryInventory() {
|
||||
var order = order("100", "DSP-1", "WH-1", "PENDING_DEPARTURE");
|
||||
order.setVehiclePlate("CA-100");
|
||||
var task = task(11L, "100", "WH-1", "PDA_PENDING");
|
||||
var item = item(21L, "100", 2);
|
||||
item.setSourceStage("RETURN_RELABEL"); item.setSourceBusinessType("RELABEL_ORDER"); item.setOrderId(101L);
|
||||
when(orders.findGlobalByDispatchNo("DSP-1")).thenReturn(order);
|
||||
when(orders.lockById("100", 1L)).thenReturn(order);
|
||||
when(tasks.lockByDispatch("100", 1L)).thenReturn(task);
|
||||
when(items.selectById(21L)).thenReturn(item);
|
||||
var carton = new com.baiyue.lastleg.returnreceipt.entity.ReturnInventoryCarton(); carton.setId(71L);
|
||||
when(returnStock.pick(org.mockito.ArgumentMatchers.eq(item), org.mockito.ArgumentMatchers.eq("RC1#2-1"),
|
||||
org.mockito.ArgumentMatchers.eq(1L), org.mockito.ArgumentMatchers.eq(3L), anyLong(), org.mockito.ArgumentMatchers.eq("DSP-1"))).thenReturn(carton);
|
||||
var result = service.pick("WH-1", "DSP-1", 21L, "7", "作业员",
|
||||
new DispatchPdaRequests.Pick(null, 1, 3, "native-pick", null, "RC1#2-1"));
|
||||
assertEquals(1L, result.pickedPackages());
|
||||
var sequence = org.mockito.Mockito.inOrder(attribution, returnStock, picks);
|
||||
sequence.verify(attribution).prepareNativeReturn("100", 101L);
|
||||
sequence.verify(returnStock).pick(org.mockito.ArgumentMatchers.eq(item), org.mockito.ArgumentMatchers.eq("RC1#2-1"),
|
||||
org.mockito.ArgumentMatchers.eq(1L), org.mockito.ArgumentMatchers.eq(3L), anyLong(), org.mockito.ArgumentMatchers.eq("DSP-1"));
|
||||
sequence.verify(picks).insert(org.mockito.ArgumentMatchers.argThat((DispatchPdaPick p) -> p.getReturnCartonId().equals(71L) && p.getInventoryPositionId() == null));
|
||||
sequence.verify(attribution).attributeNativeReturn(org.mockito.ArgumentMatchers.eq("100"), any(), org.mockito.ArgumentMatchers.eq(101L));
|
||||
org.mockito.Mockito.verifyNoInteractions(inventory, positions);
|
||||
}
|
||||
|
||||
private static DispatchOrder order(String customerId, String dispatchNo, String warehouseId, String status) {
|
||||
DispatchOrder value = new DispatchOrder();
|
||||
value.setId(1L); value.setCustomerId(customerId); value.setDispatchNo(dispatchNo);
|
||||
|
||||
+8
@@ -44,6 +44,14 @@ class DispatchPickOrderAttributionServiceTest {
|
||||
< sql.indexOf("shipped_package_count=shipped_package_count+"));
|
||||
}
|
||||
|
||||
@Test void nativePreparationRejectsHeldOrderBeforeAnyAttribution() {
|
||||
var held = new LastlegOrder(); held.setDetained(true);
|
||||
when(orders.lockById("t1", 101L)).thenReturn(held);
|
||||
assertThrows(org.springframework.web.server.ResponseStatusException.class,
|
||||
() -> service().prepareNativeReturn("t1", 101L));
|
||||
verifyNoInteractions(attributions);
|
||||
}
|
||||
|
||||
@Test
|
||||
void attributesPackagesAcrossInboundOrdersInReceiptFifoOrder() {
|
||||
DispatchPickOrderAttributionService service = service();
|
||||
|
||||
+2
-18
@@ -64,6 +64,7 @@ class DispatchServiceTest {
|
||||
@Mock OutboundOrderMapper outboundOrders;
|
||||
@Mock com.baiyue.lastleg.fleet.trip.FleetDispatchBindingGuard fleetBindings;
|
||||
@Mock com.baiyue.lastleg.fleet.trip.FleetDispatchWorkflowQuery fleetWorkflow;
|
||||
@Mock ReturnRelabelDispatchStock returnRelabelStock;
|
||||
private DispatchService service;
|
||||
|
||||
@BeforeEach
|
||||
@@ -71,6 +72,7 @@ class DispatchServiceTest {
|
||||
service = new DispatchService();
|
||||
ReflectionTestUtils.setField(service, "fleetWorkflow", fleetWorkflow);
|
||||
ReflectionTestUtils.setField(service, "fleetBindings", fleetBindings);
|
||||
ReflectionTestUtils.setField(service, "returnRelabelStock", returnRelabelStock);
|
||||
ReflectionTestUtils.setField(service, "orders", orders);
|
||||
ReflectionTestUtils.setField(service, "items", items);
|
||||
ReflectionTestUtils.setField(service, "bolLines", bolLines);
|
||||
@@ -437,24 +439,6 @@ class DispatchServiceTest {
|
||||
verify(bolLines).findByDispatchOrder("200", 1L);
|
||||
}
|
||||
|
||||
@Test
|
||||
void filtersStageBeforePaginationAndPreservesTheServerTotal() {
|
||||
com.baomidou.mybatisplus.core.metadata.TableInfoHelper.initTableInfo(
|
||||
new org.apache.ibatis.builder.MapperBuilderAssistant(new com.baomidou.mybatisplus.core.MybatisConfiguration(), "test"), DispatchOrder.class);
|
||||
Page<DispatchOrder> resultPage = new Page<>(2, 10, 47);
|
||||
resultPage.setRecords(List.of());
|
||||
when(orders.selectPage(any(Page.class), any(LambdaQueryWrapper.class))).thenAnswer(invocation -> {
|
||||
LambdaQueryWrapper<DispatchOrder> wrapper = invocation.getArgument(1);
|
||||
assertTrue(wrapper.getSqlSegment().contains("status IN"));
|
||||
assertTrue(wrapper.getParamNameValuePairs().values().containsAll(
|
||||
List.of("PICKING", "READY_TO_DEPART", "PARTIAL_READY_TO_DEPART")));
|
||||
return resultPage;
|
||||
});
|
||||
var result = service.platformPage(new DispatchRequests.Query(2, 10, null, null, null, null, DispatchRequests.Stage.LOADING));
|
||||
assertEquals(47, result.total());
|
||||
assertEquals(List.of("DEPARTED", "PARTIAL_DEPARTED"), DispatchRequests.Stage.AFTER_LOADING.statuses());
|
||||
}
|
||||
|
||||
@Test
|
||||
void platformPageQueriesAllCustomersAndLoadsItemsInEachCustomerScope() {
|
||||
DispatchOrder first = new DispatchOrder();
|
||||
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
package com.baiyue.lastleg.dispatch.service;
|
||||
|
||||
import com.baiyue.lastleg.dispatch.entity.DispatchItem;
|
||||
import com.baiyue.lastleg.dispatch.mapper.DispatchCandidateMapper;
|
||||
import com.baiyue.lastleg.dispatch.model.DispatchPalletCandidate;
|
||||
import com.baiyue.lastleg.palletops.gateway.PalletPhysicalGateway;
|
||||
import com.baiyue.lastleg.returnreceipt.entity.ReturnInventoryCarton;
|
||||
import com.baiyue.lastleg.returnreceipt.mapper.ReturnInventoryCartonMapper;
|
||||
import com.baiyue.lastleg.returnreceipt.service.ReturnInventoryService;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
import org.springframework.web.server.ResponseStatusException;
|
||||
import java.util.List;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.ArgumentMatchers.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class ReturnRelabelDispatchStockTest {
|
||||
@Mock DispatchCandidateMapper candidates;
|
||||
@Mock ReturnInventoryCartonMapper cartons;
|
||||
@Mock PalletPhysicalGateway physical;
|
||||
@Mock ReturnInventoryService inventory;
|
||||
ReturnRelabelDispatchStock service;
|
||||
DispatchItem item;
|
||||
ReturnInventoryCarton carton;
|
||||
@BeforeEach void setup() {
|
||||
service = new ReturnRelabelDispatchStock();
|
||||
ReflectionTestUtils.setField(service, "candidates", candidates);
|
||||
ReflectionTestUtils.setField(service, "cartons", cartons);
|
||||
ReflectionTestUtils.setField(service, "physical", physical);
|
||||
ReflectionTestUtils.setField(service, "inventory", inventory);
|
||||
item = new DispatchItem(); item.setCustomerId("C"); item.setOverseasWarehouseId("9");
|
||||
item.setPalletNo("P1"); item.setCartonMarks("RC1#2-1,RC1#2-2"); item.setSourceBusinessNo("RL1");
|
||||
carton = new ReturnInventoryCarton(); carton.setId(11L); carton.setCustomerId("C"); carton.setOverseasWarehouseId("9");
|
||||
carton.setCartonMark("RC1#2-1"); carton.setPalletCode("P1"); carton.setRelabelNo("RL1");
|
||||
carton.setSourceReturnNo("RT1,RT2"); carton.setTotalQuantity(6L); carton.setStatus("OUTBOUND_PENDING");
|
||||
}
|
||||
@Test void candidatesResolveRealCarrierWithoutCreatingOrdinaryStock() {
|
||||
var row = new DispatchPalletCandidate().palletNo("P1").overseasWarehouseId("9").returnCartonSource(true);
|
||||
when(candidates.nativeReturnRelabelAvailable("C", null, "RL1")).thenReturn(List.of(row));
|
||||
when(physical.resolve("P1")).thenReturn(new PalletPhysicalGateway.PalletReference(55L, "P1", 9L, 4L, "OCCUPIED", "ONT8", 0));
|
||||
assertEquals(55L, service.candidates("C", null, "RL1").get(0).warehousePalletId());
|
||||
verifyNoInteractions(inventory, cartons);
|
||||
}
|
||||
@Test void wrongScanAndMultiBoxRequestNeverDeductStock() {
|
||||
assertThrows(ResponseStatusException.class, () -> service.pick(item, "OTHER", 1, 6, 100, "DIS1"));
|
||||
assertThrows(ResponseStatusException.class, () -> service.pick(item, "RC1#2-1", 2, 6, 100, "DIS1"));
|
||||
verifyNoInteractions(inventory, cartons);
|
||||
}
|
||||
@Test void foreignCustomerOrChangedCarrierNeverDeductsStock() {
|
||||
when(cartons.lockMark("RC1#2-1")).thenReturn(carton);
|
||||
carton.setCustomerId("OTHER");
|
||||
assertThrows(ResponseStatusException.class, () -> service.pick(item, "RC1#2-1", 1, 6, 100, "DIS1"));
|
||||
carton.setCustomerId("C"); carton.setPalletCode("P2");
|
||||
assertThrows(ResponseStatusException.class, () -> service.pick(item, "RC1#2-1", 1, 6, 100, "DIS1"));
|
||||
verifyNoInteractions(inventory);
|
||||
}
|
||||
@Test void exactBoxShipsItsFullSourceSetAndRejectsStaleQuantity() {
|
||||
when(cartons.lockMark("RC1#2-1")).thenReturn(carton);
|
||||
assertThrows(ResponseStatusException.class, () -> service.pick(item, "RC1#2-1", 1, 5, 100, "DIS1"));
|
||||
verifyNoInteractions(inventory);
|
||||
assertEquals(11L, service.pick(item, "RC1#2-1", 1, 6, 100, "DIS1").getId());
|
||||
verify(inventory).shipCarton("C", "9", "RT1,RT2", "RC1#2-1", "DIS1", 100);
|
||||
}
|
||||
@Test void cancelledDispatchRestoresRelabelReservationWithoutMakingItPackable() {
|
||||
item.setCartonMarks("RC1#2-1");
|
||||
when(cartons.lockMark("RC1#2-1")).thenReturn(carton);
|
||||
when(cartons.updateById(carton)).thenReturn(1);
|
||||
service.release(item);
|
||||
assertEquals("RELABEL_PENDING", carton.getStatus()); assertEquals("RL1", carton.getRelabelNo());
|
||||
verifyNoInteractions(inventory);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user