贴标申请,仓储转运
This commit is contained in:
+32
-1
@@ -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");
|
||||
|
||||
+136
-20
@@ -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);
|
||||
|
||||
+48
@@ -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));
|
||||
}
|
||||
}
|
||||
+51
@@ -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());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user