This commit is contained in:
2026-10-20 11:30:34 +08:00
parent c13175bf77
commit 16ac817524
92 changed files with 1916 additions and 190 deletions
@@ -0,0 +1,33 @@
package com.baiyue.lastleg.delivery;
import com.baiyue.lastleg.delivery.entity.OutboundOrder;
import com.baiyue.lastleg.delivery.entity.OutboundPalletItem;
import com.baiyue.lastleg.delivery.mapper.OutboundPalletItemMapper;
import com.baiyue.lastleg.delivery.repository.OutboundQuantityRepository;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.*;
class OutboundQuantityRepositoryTest {
/** 箱唛事实优先于历史件数,同箱多 SKU、多箱一行和无箱唛库存均须正确计数。 */
@Test void countsUniqueMarksWithoutDependingOnHistoricPieceMetadata() {
var mapper = mock(OutboundPalletItemMapper.class);
var repository = new OutboundQuantityRepository();
ReflectionTestUtils.setField(repository, "pallets", mapper);
var outbound = new OutboundOrder();
outbound.setId(1L); outbound.setCustomerId("C-1"); outbound.setOutboundType("DISCARD_OUTBOUND");
outbound.setPackageCount(99);
var a = new OutboundPalletItem(); a.setCartonMarks("BOX-1, BOX-2"); a.setPackageCount(5);
var b = new OutboundPalletItem(); b.setCartonMarks("BOX-2,BOX-1"); b.setPackageCount(8);
var unmarked = new OutboundPalletItem(); unmarked.setPackageCount(3);
when(mapper.findByOutbound("C-1", 1L)).thenReturn(List.of(a, b, unmarked));
assertEquals(5, repository.boxes(outbound));
assertEquals(99, outbound.getPackageCount());
outbound.setOutboundType("RETURN_OUTBOUND");
assertEquals(99, repository.boxes(outbound));
verify(mapper, times(1)).findByOutbound("C-1", 1L);
verifyNoMoreInteractions(mapper);
}
}
@@ -133,6 +133,9 @@ class DeliveryTransferServiceTest {
@BeforeEach
void setUp() {
service = new DeliveryTransferService();
var quantities = new com.baiyue.lastleg.delivery.repository.OutboundQuantityRepository();
ReflectionTestUtils.setField(quantities, "pallets", outboundPallets);
ReflectionTestUtils.setField(service, "outboundQuantities", quantities);
ReflectionTestUtils.setField(service, "deliveryExecution", new DeliveryExecutionGuard(new com.baiyue.lastleg.delivery.repository.DeliveryExecutionRepository(outboundOrders, deliveryOrders)));
ReflectionTestUtils.setField(service, "execution", execution);
ReflectionTestUtils.setField(service,"cancellations",new com.baiyue.lastleg.delivery.repository.DeliveryCancellationRepository(
@@ -491,6 +494,27 @@ class DeliveryTransferServiceTest {
assertEquals("DISCARD_OUTBOUND".equals(type) ? null : "LX-REAL-001", detail.outbound().lxCodes());
}
/** 历史废弃单一箱内的多种 SKU 件数不能累加成出库箱数。 */
@Test
void discardListAndDetailCountPhysicalCartonsInsteadOfHistoricPieces() {
OutboundOrder outbound = outbound(301L, null, null, "OUT-301", "discard-301");
outbound.setOutboundType("DISCARD_OUTBOUND"); outbound.setPackageCount(5);
var a = pallet(501L, "P-1", null, null, "RT-1", 2);
var b = pallet(502L, "P-1", null, null, "RT-1", 3);
a.setReturnSkuQuantity(2L); b.setReturnSkuQuantity(3L);
a.setCartonMarks("BOX-1"); b.setCartonMarks("BOX-1");
when(outboundOrders.findGlobalByNo("OUT-301")).thenReturn(outbound);
when(outboundPallets.findByOutbound("TENANT-A", 301L)).thenReturn(List.of(a, b));
when(outboundOrders.selectPage(any(Page.class), any())).thenReturn(new Page<OutboundOrder>(1, 10, 1).setRecords(List.of(outbound)));
assertEquals(1, service.outboundDetail("OUT-301").outbound().packageCount());
var query = new DeliveryRequests.Query(1, 10, "OUT-301", null, null, null, null, null, null, null, null, null, null, "DISCARD_OUTBOUND");
assertEquals(1, service.outboundPage(null, query).records().get(0).packageCount());
assertEquals(5, outbound.getPackageCount());
assertEquals(2L, a.getReturnSkuQuantity()); assertEquals(3L, b.getReturnSkuQuantity());
verify(outboundOrders, never()).updateById(any(OutboundOrder.class));
}
@Test
void dispatchOutboundStillRequiresItsDeliveryDocument() {
OutboundOrder outbound = outbound(301L, 101L, "DSP-101", "OUT-301", "dispatch-301");
@@ -57,6 +57,11 @@ class ReturnOutboundClosureTest {
ReturnInventoryCarton carton;
@BeforeEach void setup() {
// 取消入口先查询幂等记录,手动组装的测试服务也需要注入该仓储。
ReflectionTestUtils.setField(service, "cancellations", new com.baiyue.lastleg.delivery.repository.DeliveryCancellationRepository(
outbounds, items, deliveries, tasks, mock(DeliveryOperationMapper.class), relabelApplications, cartons,
mock(com.baiyue.lastleg.transfer.mapper.WarehouseTransferOrderMapper.class),
mock(com.baiyue.lastleg.mapper.LastlegOrderMapper.class), mock(com.baiyue.lastleg.mapper.LastlegOrderStatusHistoryMapper.class)));
ReflectionTestUtils.setField(service, "outboundOrders", outbounds);
ReflectionTestUtils.setField(service, "outboundPallets", items);
ReflectionTestUtils.setField(service, "pdaTasks", tasks);
@@ -54,6 +54,8 @@ class ReturnOutboundPdaPersistenceTest {
+ (field.getName().equals("id") ? " PRIMARY KEY" : "")).collect(Collectors.joining(","));
jdbc.execute("CREATE TABLE " + entity.getAnnotation(TableName.class).value() + " (" + columns + ")");
}
jdbc.execute("CREATE TABLE ll_cargo_discard_application(id BIGINT,customer_id VARCHAR(2000),overseas_warehouse_id VARCHAR(2000),discard_no VARCHAR(2000))");
jdbc.execute("CREATE TABLE ll_cargo_discard_item(id BIGINT,application_id BIGINT,customer_id VARCHAR(2000),return_carton_id BIGINT,sku_code VARCHAR(2000),product_name VARCHAR(2000),pda_status VARCHAR(2000),available_packages_snapshot BIGINT,actual_discard_packages BIGINT,pda_operator_id VARCHAR(2000),pda_completed_at TIMESTAMP)");
var configuration = new MybatisConfiguration(); configuration.setMapUnderscoreToCamelCase(true);
for (Class<?> mapper : List.of(OutboundOrderMapper.class, OutboundPalletItemMapper.class,
OutboundPdaTaskMapper.class, OutboundPdaPickMapper.class, DeliveryOrderMapper.class, ReturnInventoryCartonMapper.class,