fix overseas return inventory flow

This commit is contained in:
2026-09-12 13:55:48 +08:00
parent 2191bacbfe
commit d33922ad35
5 changed files with 150 additions and 6 deletions
@@ -0,0 +1,134 @@
package com.baiyue.lastleg.returnreceipt.service;
import com.baiyue.lastleg.pda.security.PdaWarehouseIdentity;
import com.baiyue.lastleg.returnreceipt.dto.ReturnInventoryRequests;
import com.baiyue.lastleg.returnreceipt.entity.ReturnInventoryCarton;
import com.baiyue.lastleg.returnreceipt.entity.ReturnInventoryCartonItem;
import com.baiyue.lastleg.returnreceipt.entity.ReturnOrder;
import com.baiyue.lastleg.returnreceipt.entity.ReturnReceipt;
import com.baiyue.lastleg.returnreceipt.mapper.ReturnInventoryBalanceMapper;
import com.baiyue.lastleg.returnreceipt.mapper.ReturnInventoryCartonItemMapper;
import com.baiyue.lastleg.returnreceipt.mapper.ReturnInventoryCartonMapper;
import com.baiyue.lastleg.returnreceipt.mapper.ReturnInventoryMovementMapper;
import com.baiyue.lastleg.returnreceipt.mapper.ReturnInventoryOperationMapper;
import com.baiyue.lastleg.returnreceipt.mapper.ReturnInventoryQueryMapper;
import com.baiyue.lastleg.returnreceipt.mapper.ReturnOrderMapper;
import com.baiyue.lastleg.returnreceipt.mapper.ReturnReceiptMapper;
import com.baiyue.lastleg.service.LastlegOrderNoGenerator;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.test.util.ReflectionTestUtils;
import java.math.BigDecimal;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class ReturnInventoryServiceTest {
@Mock ReturnInventoryCartonMapper cartons;
@Mock ReturnInventoryCartonItemMapper cartonItems;
@Mock ReturnInventoryBalanceMapper balances;
@Mock ReturnInventoryOperationMapper operations;
@Mock ReturnInventoryQueryMapper queries;
@Mock ReturnInventoryMovementMapper movements;
@Mock LastlegOrderNoGenerator numbers;
@Mock ReturnOrderMapper orders;
@Mock ReturnReceiptMapper receipts;
private ReturnInventoryService service;
@BeforeEach
void setUp() {
service = new ReturnInventoryService();
ReflectionTestUtils.setField(service, "cartons", cartons);
ReflectionTestUtils.setField(service, "cartonItems", cartonItems);
ReflectionTestUtils.setField(service, "balances", balances);
ReflectionTestUtils.setField(service, "operations", operations);
ReflectionTestUtils.setField(service, "queries", queries);
ReflectionTestUtils.setField(service, "movements", movements);
ReflectionTestUtils.setField(service, "numbers", numbers);
ReflectionTestUtils.setField(service, "orders", orders);
ReflectionTestUtils.setField(service, "receiptMapper", receipts);
}
@Test
void receiptCartonKeepsTheSourceReturnNumber() {
ReturnOrder order = completedOrder();
ReturnReceipt receipt = new ReturnReceipt();
receipt.setId(21L);
receipt.setReceiptBatchNo("RB-1");
when(numbers.next(anyString(), anyString(), anyLong())).thenReturn("RC-1");
service.createReceiptCarton(order, receipt, null,
List.of(new ReturnInventoryService.ReceiptLine("SKU-A", "商品A", 2)));
ArgumentCaptor<ReturnInventoryCarton> captor = ArgumentCaptor.forClass(ReturnInventoryCarton.class);
verify(cartons).insert(captor.capture());
assertThat(captor.getValue().getSourceReturnNo()).isEqualTo("RT-1");
}
@Test
void mergeMovesItemsBetweenCartonsWithoutReducingAvailableQuantity() {
ReturnOrder order = completedOrder();
ReturnReceipt receipt = new ReturnReceipt();
receipt.setId(21L);
ReturnInventoryCarton source = new ReturnInventoryCarton();
source.setId(31L);
source.setCustomerId("10001");
source.setOverseasWarehouseId("42");
source.setCartonMark("RC-SOURCE");
source.setStatus(ReturnInventoryService.AVAILABLE);
source.setSkuTypes(2);
source.setTotalQuantity(4L);
ReturnInventoryCartonItem skuA = item(41L, "SKU-A", 2L);
ReturnInventoryCartonItem skuB = item(42L, "SKU-B", 2L);
when(orders.findByNos("42", List.of("RT-1"))).thenReturn(List.of(order));
when(receipts.listOrder(11L)).thenReturn(List.of(receipt));
when(cartons.findReceipt(21L)).thenReturn(source);
when(cartons.lockMark("RC-SOURCE")).thenReturn(source);
when(cartonItems.listCarton(31L)).thenReturn(List.of(skuA, skuB));
when(numbers.next(anyString(), anyString(), anyLong())).thenReturn("RC-MERGED");
when(balances.adjustCartonQuantity(anyString(), anyString(), anyString(), anyLong())).thenReturn(1);
service.merge(new PdaWarehouseIdentity("operator-1", "操作员", 42L),
new ReturnInventoryRequests.Merge(List.of("RT-1"), List.of(
new ReturnInventoryRequests.ValidItem("SKU-A", 1),
new ReturnInventoryRequests.ValidItem("SKU-B", 1)),
BigDecimal.ONE, BigDecimal.ONE, BigDecimal.ONE, BigDecimal.ONE, "merge-key"));
verify(balances).adjustCartonQuantity("10001", "42", "SKU-A", 1L);
verify(balances).adjustCartonQuantity("10001", "42", "SKU-B", 1L);
assertThat(source.getTotalQuantity()).isEqualTo(2L);
assertThat(source.getStatus()).isEqualTo(ReturnInventoryService.AVAILABLE);
}
private ReturnOrder completedOrder() {
ReturnOrder order = new ReturnOrder();
order.setId(11L);
order.setCustomerId("10001");
order.setReturnNo("RT-1");
order.setOverseasWarehouseId("42");
order.setStatus("COMPLETED");
return order;
}
private ReturnInventoryCartonItem item(long id, String sku, long quantity) {
ReturnInventoryCartonItem item = new ReturnInventoryCartonItem();
item.setId(id);
item.setCartonId(31L);
item.setCustomerId("10001");
item.setSkuCode(sku);
item.setProductNameZh(sku);
item.setQuantity(quantity);
return item;
}
}