贴标申请,仓储转运

This commit is contained in:
2026-09-17 17:37:29 +08:00
parent 3b8b6f5aa2
commit 29f05b7b09
106 changed files with 5019 additions and 471 deletions
@@ -61,6 +61,7 @@ class PdaRelabelServiceTest {
void setUp() {
service = new PdaRelabelService();
ReflectionTestUtils.setField(service, "applications", applications);
ReflectionTestUtils.setField(service, "bindingGuard", org.mockito.Mockito.mock(com.baiyue.lastleg.relabel.service.RelabelBindingGuard.class));
ReflectionTestUtils.setField(service, "items", items);
ReflectionTestUtils.setField(service, "tasks", tasks);
ReflectionTestUtils.setField(service, "unitFacts", unitFacts);
@@ -103,7 +104,7 @@ class PdaRelabelServiceTest {
PdaRelabelTask active = task("PROCESSING", 0);
active.setApplicationId(99L);
active.setRelabelNo("FBR-ACTIVE");
when(tasks.lockUnfinishedByOperator("7")).thenReturn(active);
when(tasks.lockProcessingByOperator("7")).thenReturn(active);
ResponseStatusException error = assertThrows(ResponseStatusException.class,
() -> service.claim("7", "picker", 900L, "FBR-1", new PdaRelabelRequests.Claim("claim-other")));
@@ -205,6 +206,36 @@ class PdaRelabelServiceTest {
assertEquals(1, result.version());
}
@org.junit.jupiter.params.ParameterizedTest
@org.junit.jupiter.params.provider.ValueSource(strings = {"SKU_LABEL", "CARTON_AND_SKU"})
void oldSkuOnlyScanPersistsEachRowAndCompletesBoxOnlyWhenRequiredStagesFinish(String type) {
application.setStatus("PROCESSING");
item.setOperationType(type); item.setCartonMark("BOX-1"); item.setFbaCartonMark("FBA-1");
item.setNotifiedPackageCount(1);
item.setSkuRelabelItemsJson("[{\"skuCode\":\"OLD-A\",\"newSkuCode\":\"NEW-A\",\"quantity\":3},{\"skuCode\":\"OLD-B\",\"newSkuCode\":\"NEW-B\",\"quantity\":2}]");
var task = task("PROCESSING", 0);
var saved = new ArrayList<com.baiyue.lastleg.relabel.pda.entity.PdaRelabelHistory>();
when(histories.selectList(any())).thenAnswer(call -> List.copyOf(saved));
when(histories.insert(any(com.baiyue.lastleg.relabel.pda.entity.PdaRelabelHistory.class))).thenAnswer(call -> { saved.add(call.getArgument(0)); return 1; });
when(applications.lockAnyByRelabelNo("FBR-1")).thenReturn(application);
lenient().when(applications.findAnyByRelabelNo("FBR-1")).thenReturn(application);
when(tasks.lock("100", 1L)).thenReturn(task);
when(items.selectOne(any())).thenReturn(item);
var first = service.scanSku("7", "picker", 900L, "FBR-1", new PdaRelabelRequests.SkuScan(10L, 0, "OLD-A", 0, "sku-a"));
assertEquals(0, first.relabelledPackages()); assertEquals(1, first.version());
assertTrue(saved.stream().anyMatch(entry -> "SKU_SCAN".equals(entry.getAction()) && entry.getDetailJson().contains("NEW-A")));
assertThrows(ResponseStatusException.class, () -> service.scanSku("7", "picker", 900L, "FBR-1", new PdaRelabelRequests.SkuScan(10L, 0, "OLD-A", 1, "duplicate")));
assertThrows(ResponseStatusException.class, () -> service.scanSku("7", "picker", 900L, "FBR-1", new PdaRelabelRequests.SkuScan(10L, 1, "WRONG", 1, "wrong")));
var second = service.scanSku("7", "picker", 900L, "FBR-1", new PdaRelabelRequests.SkuScan(10L, 1, "OLD-B", 1, "sku-b"));
assertEquals(1, second.items().get(0).skuProcessedPackages());
if ("CARTON_AND_SKU".equals(type)) {
assertEquals(0, second.relabelledPackages());
var last = service.scanCarton("7", "picker", 900L, "FBR-1", new PdaRelabelRequests.CartonScan("BOX-1", 2, "carton-last"));
assertEquals(1, last.relabelledPackages());
} else assertEquals(1, second.relabelledPackages());
assertEquals(1, persistedFacts.size());
}
@Test
void duplicateOldLabelAndStaleVersionFailBeforeWritingAnotherFact() {
application.setStatus("PROCESSING");
@@ -117,6 +117,7 @@ class RelabelApplicationServiceTest {
lenient().when(feeSources.publishApproved(any(), any(), any())).thenReturn(new OverseasFeeSource());
}
@Test
void createBuildsPendingRelabelTailOrderItemsAndBothHistories() {
RelabelRequests.Create request = request("key-1", 10, 6);
@@ -144,7 +145,7 @@ class RelabelApplicationServiceTest {
verify(orderHistories).insert(tailHistory.capture());
assertEquals("RELABEL_APPLICATION", tailOrder.getValue().getOrderType());
assertEquals("PENDING_ASSIGNMENT", tailOrder.getValue().getCurrentStatus());
assertEquals("WAIT_RELABEL", tailOrder.getValue().getCurrentStatus());
assertEquals("RELABEL:PENDING_PROCESSING", tailOrder.getValue().getSubOrderStatus());
assertEquals("CUSTOMER", tailOrder.getValue().getSourceRegion());
assertTrue(tailOrder.getValue().getOrderNo().matches("RL-WH-\\d{8}-\\d{6}"));
@@ -155,10 +156,36 @@ class RelabelApplicationServiceTest {
assertEquals(6, application.getValue().getNotifiedPackageCount());
assertEquals("SKU-A", relabelItem.getValue().getSkuCode());
assertEquals("PENDING_PROCESSING", relabelHistory.getValue().getToStatus());
assertEquals("PENDING_ASSIGNMENT", tailHistory.getValue().getToStatus());
assertEquals("WAIT_RELABEL", tailHistory.getValue().getToStatus());
assertEquals("FBR-1", result.application().relabelNo());
}
@Test
void warehouseTransferRelabelReusesExistingTailOrder() {
RelabelRequests.Create request = request("key-transfer", 10, 6);
RelabelApplication persisted = application(11L, "FBR-TRANSFER", "10001", "key-transfer", null,
RelabelApplicationService.PENDING_PROCESSING);
persisted.setLastlegOrderId(21L);
LastlegOrder transferOrder = order(21L, "10001", "WT-WH-20260916-560449", "INBOUND_COMPLETED");
transferOrder.setOrderType("WAREHOUSE_TRANSFER");
when(applications.findNo(eq("10001"), any())).thenReturn(persisted);
when(items.selectList(any())).thenReturn(List.of(item(31L, 11L, "SKU-A", 10, 6)));
when(histories.selectList(any())).thenReturn(List.of());
when(orders.selectById(21L)).thenReturn(transferOrder);
service.createForExistingTailOrder("10001", "operator-1", 21L, request);
ArgumentCaptor<RelabelApplication> application = ArgumentCaptor.forClass(RelabelApplication.class);
verify(applications).insert(application.capture());
verify(orders, never()).insert(any(LastlegOrder.class));
verify(orderHistories, never()).insert(any(LastlegOrderStatusHistory.class));
assertEquals(21L, application.getValue().getLastlegOrderId());
assertEquals(application.getValue().getRelabelNo(), transferOrder.getRelabelOrderNo());
assertEquals(RelabelApplicationService.PENDING_PROCESSING, transferOrder.getRelabelStatus());
assertEquals("WAREHOUSE_TRANSFER", transferOrder.getOrderType());
assertEquals("INBOUND_COMPLETED", transferOrder.getCurrentStatus());
}
@Test
void createWithoutChargeSkipsWalletFreeze() {
RelabelRequests.Create charged = request("key-free", 10, 6);
@@ -242,27 +269,19 @@ class RelabelApplicationServiceTest {
}
@Test
void createKeepsOneOperationWarehouseWhenItemsHaveDifferentFbaDestinations() {
void createRejectsDifferentFbaDestinationsInOneApplication() {
RelabelRequests.Item west = carton("SKU-A", "BOX-1", "FBA-1", "ONT8");
RelabelRequests.Item east = carton("SKU-B", "BOX-2", "FBA-2", "ABE8");
RelabelRequests.Create request = new RelabelRequests.Create("CUSTOMER-1", "WH-1",
LocalDateTime.of(2026, 8, 20, 10, 0), "Li", "13800000000", BigDecimal.ONE, null, "key-multi",
List.of(west, east));
RelabelApplication persisted = application(11L, "FBR-1", "10001", "key-multi", null,
RelabelApplicationService.PENDING_PROCESSING);
persisted.setLastlegOrderId(21L);
when(applications.findNo(eq("10001"), any())).thenReturn(persisted);
when(items.selectList(any())).thenReturn(List.of(item(31L, 11L, "SKU-A", 1, 1)));
when(histories.selectList(any())).thenReturn(List.of());
when(orders.selectById(21L)).thenReturn(order(21L, "10001", "LMO-RELABEL-1",
RelabelApplicationService.PENDING_PROCESSING));
ResponseStatusException exception = assertThrows(ResponseStatusException.class,
() -> service.create("10001", "operator-1", request));
service.create("10001", "operator-1", request);
ArgumentCaptor<LastlegOrder> created = ArgumentCaptor.forClass(LastlegOrder.class);
verify(orders).insert(created.capture());
assertEquals("WH-1", created.getValue().getOverseasWarehouseId());
assertEquals(2, created.getValue().getPackageCount());
assertEquals(400, exception.getStatusCode().value());
assertEquals("同一张贴标申请只能选择一个 FBA 目的仓", exception.getReason());
verify(orders, never()).insert(any(LastlegOrder.class));
verify(applications, never()).insert(any(RelabelApplication.class));
}
@Test
@@ -363,6 +382,9 @@ class RelabelApplicationServiceTest {
application.setLastlegOrderId(21L);
when(applications.lockNo("10001", "FBR-1")).thenReturn(application);
stubDetail(application);
LastlegOrder relabelOrder = order(21L, "10001", "LMO-RELABEL-1", "PENDING_ASSIGNMENT");
relabelOrder.setOrderType("RELABEL_APPLICATION");
when(orders.selectById(21L)).thenReturn(relabelOrder);
RelabelResponses.Detail result = service.changeStatus("10001", "FBR-1", "operator-2",
new RelabelRequests.ChangeStatus("processing", "started"));
@@ -372,12 +394,33 @@ class RelabelApplicationServiceTest {
verify(applications).updateById(application);
ArgumentCaptor<LastlegOrder> updatedOrder = ArgumentCaptor.forClass(LastlegOrder.class);
verify(orders).updateById(updatedOrder.capture());
assertEquals("PENDING_ASSIGNMENT", updatedOrder.getValue().getCurrentStatus());
assertEquals("WAIT_RELABEL", updatedOrder.getValue().getCurrentStatus());
assertEquals("RELABEL:PROCESSING", updatedOrder.getValue().getSubOrderStatus());
verify(histories).insert(any(RelabelStatusHistory.class));
verify(orderHistories).insert(any(LastlegOrderStatusHistory.class));
}
@Test
void reviewStageIsReportedAsCompletedOnLinkedCustomerAndPlatformOrder() {
RelabelApplication application = application(11L, "FBR-REVIEW", "10001", "key-review", "hash",
"PROCESSING");
application.setLastlegOrderId(21L);
LastlegOrder order = order(21L, "10001", "LMO-RELABEL-1", "PENDING_ASSIGNMENT");
when(applications.lockNo("10001", "FBR-REVIEW")).thenReturn(application);
when(applications.findNo("10001", "FBR-REVIEW")).thenReturn(application);
when(items.selectList(any())).thenReturn(List.of(item(31L, application.getId(), "SKU-A", 1, 1)));
when(histories.selectList(any())).thenReturn(List.of());
when(orders.selectById(21L)).thenReturn(order);
service.changeStatus("10001", "FBR-REVIEW", "operator-2",
new RelabelRequests.ChangeStatus(RelabelApplicationService.CUSTOMER_CONFIRM_PENDING, "submitted"));
assertEquals(RelabelApplicationService.CUSTOMER_CONFIRM_PENDING, application.getStatus());
assertEquals("WAIT_CUSTOMER_CONFIRMATION", application.getFulfillmentStatus());
assertEquals("COMPLETED", order.getRelabelStatus());
assertEquals("RELABEL:CUSTOMER_CONFIRM_PENDING", order.getSubOrderStatus());
}
@Test
void completedApplicationCannotReturnToProcessingAndOtherTenantCannotReadIt() {
RelabelApplication completed = application(11L, "FBR-1", "10001", "key-1", "hash", "COMPLETED");
@@ -466,7 +509,7 @@ class RelabelApplicationServiceTest {
var review = ArgumentCaptor.forClass(com.baiyue.lastleg.relabel.pda.entity.PdaRelabelTask.class);
verify(pdaTasks).updateWithVersion(review.capture(), eq(1));
assertEquals("COMPLETED", review.getValue().getStatus());
assertEquals("CUSTOMER_CONFIRMED", review.getValue().getReviewDecision());
assertEquals("CONFIRMED", review.getValue().getReviewDecision());
assertNull(application.getOutboundOrderNo());
verify(outboundOrders, never()).insert(any(OutboundOrder.class));
@@ -475,12 +518,36 @@ class RelabelApplicationServiceTest {
verify(applications, times(1)).updateById(application);
}
@Test
void skuOnlyCustomerConfirmationCompletesWithoutPalletOrOutboundFulfillment() {
RelabelApplication application = confirmationApplication(null, false);
RelabelItem skuOnly = item(31L, application.getId(), "SKU-A", 1, 1);
skuOnly.setOperationType("SKU_LABEL");
LastlegOrder linked = order(21L, "10001", "LMO-RELABEL-1", "WAIT_RELABEL");
when(applications.lockNo("10001", "FBR-1")).thenReturn(application);
when(applications.findNo("10001", "FBR-1")).thenReturn(application);
when(items.selectList(any())).thenReturn(List.of(skuOnly));
when(histories.selectList(any())).thenReturn(List.of());
when(orders.selectById(21L)).thenReturn(linked);
service.confirmCompletion("10001", "FBR-1", "customer-1",
new RelabelRequests.CustomerConfirm("confirm-sku", "accepted"));
assertEquals("COMPLETED", application.getStatus());
assertEquals("NOT_REQUIRED", application.getFulfillmentStatus());
assertEquals("COMPLETED", linked.getCurrentStatus());
assertNull(application.getOutboundOrderNo());
verify(outboundOrders, never()).insert(any(OutboundOrder.class));
verify(outboundItems, never()).insert(any(OutboundPalletItem.class));
verify(outboundTasks, never()).insert(any(OutboundPdaTask.class));
}
@Test
void transferRelabelConfirmationReleasesTransferForDispatch() {
RelabelApplication application = confirmationApplication("TRUCK", false);
WarehouseTransferOrder transfer = new WarehouseTransferOrder();
transfer.setId(77L); transfer.setCustomerId("10001"); transfer.setRelabelNo("FBR-1");
transfer.setStatus("WAIT_RELABEL"); transfer.setLastlegOrderId(88L);
transfer.setStatus("WAIT_RELABEL"); transfer.setLastlegOrderId(88L); transfer.setFbaWarehouseCode("ONT8");
LastlegOrder transferOrder = order(88L, "10001", "LMO-TRANSFER-1", "WAIT_RELABEL");
when(applications.lockNo("10001", "FBR-1")).thenReturn(application);
stubDetail(application);
@@ -498,6 +565,55 @@ class RelabelApplicationServiceTest {
verify(orders).updateById(transferOrder);
}
@Test
void transferRelabelConfirmationWithoutDestinationWaitsForFbaInsteadOfDispatch() {
RelabelApplication application = confirmationApplication("TRUCK", false);
WarehouseTransferOrder transfer = new WarehouseTransferOrder();
transfer.setId(77L); transfer.setCustomerId("10001"); transfer.setRelabelNo("FBR-1");
transfer.setStatus("WAIT_RELABEL"); transfer.setLastlegOrderId(88L);
LastlegOrder transferOrder = order(88L, "10001", "LMO-TRANSFER-1", "WAIT_RELABEL");
when(applications.lockNo("10001", "FBR-1")).thenReturn(application);
stubDetail(application);
when(warehouseTransfers.lockByRelabelNo("10001", "FBR-1")).thenReturn(transfer);
when(orders.selectById(88L)).thenReturn(transferOrder);
service.confirmCompletion("10001", "FBR-1", "customer-1",
new RelabelRequests.CustomerConfirm("confirm-transfer-no-fba", "accepted"));
assertEquals("WAIT_FBA_DESTINATION", transfer.getStatus());
assertEquals("WAIT_FBA_DESTINATION", transferOrder.getCurrentStatus());
assertEquals("WAREHOUSE_TRANSFER:WAIT_FBA_DESTINATION;RELABEL:COMPLETED",
transferOrder.getSubOrderStatus());
assertEquals("WAIT_FBA_DESTINATION", application.getFulfillmentStatus());
}
@Test
void transferRelabelConfirmationDerivesUniqueDestinationFromRelabelItems() {
RelabelApplication application = confirmationApplication("TRUCK", false);
WarehouseTransferOrder transfer = new WarehouseTransferOrder();
transfer.setId(77L); transfer.setCustomerId("10001"); transfer.setRelabelNo("FBR-1");
transfer.setStatus("WAIT_RELABEL"); transfer.setLastlegOrderId(88L);
LastlegOrder transferOrder = order(88L, "10001", "LMO-TRANSFER-1", "WAIT_RELABEL");
RelabelItem relabelItem = item(31L, application.getId(), "SKU-A", 10, 6);
relabelItem.setDestinationFbaWarehouseCode("ONT8");
when(applications.lockNo("10001", "FBR-1")).thenReturn(application);
when(applications.findNo("10001", "FBR-1")).thenReturn(application);
when(items.selectList(any())).thenReturn(List.of(relabelItem));
when(histories.selectList(any())).thenReturn(List.of());
when(warehouseTransfers.lockByRelabelNo("10001", "FBR-1")).thenReturn(transfer);
when(orders.selectById(88L)).thenReturn(transferOrder);
when(orders.selectById(application.getLastlegOrderId())).thenReturn(
order(application.getLastlegOrderId(), "10001", "LMO-RELABEL-1", application.getStatus()));
service.confirmCompletion("10001", "FBR-1", "customer-1",
new RelabelRequests.CustomerConfirm("confirm-transfer-derived-fba", "accepted"));
assertEquals("ONT8", transfer.getFbaWarehouseCode());
assertEquals("READY_FOR_DISPATCH", transfer.getStatus());
assertEquals("ONT8", transferOrder.getFbaWarehouseCode());
assertEquals("READY_FOR_DISPATCH", transferOrder.getCurrentStatus());
}
@Test
void expressCustomerConfirmationRequiresShippingLabelWhenWarehousePrintingIsSelected() {
RelabelApplication application = confirmationApplication("EXPRESS", true);
@@ -0,0 +1,48 @@
package com.baiyue.lastleg.relabel.service;
import com.baiyue.lastleg.relabel.entity.*;
import com.baiyue.lastleg.relabel.mapper.RelabelItemMapper;
import com.baiyue.lastleg.relabel.pda.entity.PdaRelabelHistory;
import com.baiyue.lastleg.relabel.pda.mapper.PdaRelabelHistoryMapper;
import com.baiyue.lastleg.inventory.entity.InventoryPosition;
import com.baiyue.lastleg.inventory.mapper.InventoryPositionMapper;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.web.server.ResponseStatusException;
import java.util.List;
import static org.mockito.Mockito.*;
import static org.mockito.ArgumentMatchers.*;
import static org.junit.jupiter.api.Assertions.*;
class RelabelBindingGuardTest {
@Test void physicalBindingMustMatchLatestTargetAndCannotSurviveRework() {
var guard = new RelabelBindingGuard();
var items = mock(RelabelItemMapper.class);
var history = mock(PdaRelabelHistoryMapper.class);
var positions = mock(InventoryPositionMapper.class);
ReflectionTestUtils.setField(guard, "items", items);
ReflectionTestUtils.setField(guard, "histories", history);
ReflectionTestUtils.setField(guard, "positions", positions);
ReflectionTestUtils.setField(guard, "objectMapper", new ObjectMapper());
var app = new RelabelApplication(); app.setId(1L); app.setCustomerId("2");
var item = new RelabelItem(); item.setCartonMark("A"); item.setOperationType("CARTON_LABEL");
item.setSourceInventoryPositionId(3L); item.setNotifiedPackageCount(1);
when(items.selectList(any())).thenReturn(List.of(item));
var position = new InventoryPosition(); position.setPalletNo("OLD"); position.setHoldPackages(1L);
when(positions.findTenantPosition("2", 3L)).thenReturn(position);
when(history.selectList(any())).thenReturn(List.of());
assertThrows(ResponseStatusException.class, () -> guard.requireBound(app));
var binding = new PdaRelabelHistory(); binding.setAction("PALLET_BIND");
binding.setDetailJson("{\"cartonMarks\":[\"A\"],\"targetPallets\":[\"NEW\"]}");
when(history.selectList(any())).thenReturn(List.of(binding));
assertThrows(ResponseStatusException.class, () -> guard.requireBound(app));
position.setPalletNo("NEW");
assertDoesNotThrow(() -> guard.requireBound(app));
var rework = new PdaRelabelHistory(); rework.setAction("REWORK_ARCHIVE");
when(history.selectList(any())).thenReturn(List.of(binding, rework));
assertThrows(ResponseStatusException.class, () -> guard.requireBound(app));
item.setOperationType("SKU_LABEL");
assertDoesNotThrow(() -> guard.requireBound(app));
}
}
@@ -0,0 +1,51 @@
package com.baiyue.lastleg.relabel.service;
import com.baiyue.lastleg.inventory.mapper.InventoryBalanceMapper;
import com.baiyue.lastleg.inventory.mapper.InventoryPositionMapper;
import com.baiyue.lastleg.relabel.dto.RelabelResponses;
import com.baiyue.lastleg.returnreceipt.entity.ReturnInventoryCarton;
import com.baiyue.lastleg.returnreceipt.entity.ReturnInventoryCartonItem;
import com.baiyue.lastleg.returnreceipt.mapper.ReturnInventoryCartonItemMapper;
import com.baiyue.lastleg.returnreceipt.mapper.ReturnInventoryCartonMapper;
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
class RelabelReturnCartonCandidateTest {
@Test
void candidatesIncludeAvailableMergedReturnCartonByWarehouseMark() {
RelabelApplicationService service = new RelabelApplicationService();
InventoryBalanceMapper balances = mock(InventoryBalanceMapper.class);
InventoryPositionMapper positions = mock(InventoryPositionMapper.class);
ReturnInventoryCartonMapper cartons = mock(ReturnInventoryCartonMapper.class);
ReturnInventoryCartonItemMapper cartonItems = mock(ReturnInventoryCartonItemMapper.class);
ReflectionTestUtils.setField(service, "inventoryBalances", balances);
ReflectionTestUtils.setField(service, "inventoryPositions", positions);
ReflectionTestUtils.setField(service, "returnCartons", cartons);
ReflectionTestUtils.setField(service, "returnCartonItems", cartonItems);
ReturnInventoryCarton carton = new ReturnInventoryCarton();
carton.setId(9001L); carton.setCustomerId("10001"); carton.setOverseasWarehouseId("WH-1");
carton.setCartonMark("RC-WH-0001"); carton.setSourceReturnNo("RT-1,RT-2");
carton.setStatus("AVAILABLE"); carton.setTotalQuantity(12L);
ReturnInventoryCartonItem cartonItem = new ReturnInventoryCartonItem();
cartonItem.setCartonId(9001L); cartonItem.setSkuCode("SKU-RETURN");
cartonItem.setProductNameZh("退货商品"); cartonItem.setQuantity(12L);
when(cartons.findAvailable("10001", "WH-1")).thenReturn(List.of(carton));
when(cartonItems.listCarton(9001L)).thenReturn(List.of(cartonItem));
List<RelabelResponses.InventoryCandidate> result = service.candidates("10001", "WH-1", "RC-WH");
assertEquals(1, result.size());
assertEquals("RETURN_CARTON", result.get(0).sourceType());
assertEquals(9001L, result.get(0).returnCartonId());
assertEquals("RC-WH-0001", result.get(0).cartonMark());
assertEquals("SKU-RETURN", result.get(0).skuItems().get(0).skuCode());
assertEquals(12, result.get(0).skuItems().get(0).quantity());
}
}