贴标申请,仓储转运

This commit is contained in:
2026-09-28 11:59:08 +08:00
parent 0e62b2f45b
commit 2bb98d2047
14 changed files with 278 additions and 38 deletions
@@ -64,8 +64,8 @@ class CargoDiscardMysqlAcceptanceTest {
seedCartons(990001003L, 990001103L, 990001601L, "PALLET-C", "SKU-MAT-BLUE", "MAT", 7);
var approveRequest = new CargoDiscardRequests.Create(List.of(
new CargoDiscardRequests.Item(990001001L, "SKU-BOX-RED", 3),
new CargoDiscardRequests.Item(990001001L, "SKU-RACK-KITCHEN", 2)),
new CargoDiscardRequests.Item(990001001L, null, "SKU-BOX-RED", 3),
new CargoDiscardRequests.Item(990001001L, null, "SKU-RACK-KITCHEN", 2)),
"ACCEPT-DISCARD-APPROVE", "验收:破损货物,同意废弃");
var approved = service.create(CUSTOMER, "acceptance-creator", approveRequest);
assertEquals(20L, skuPackages(990001001L));
@@ -75,7 +75,7 @@ class CargoDiscardMysqlAcceptanceTest {
assertEquals(15L, skuPackages(990001001L));
var rejected = service.create(CUSTOMER, "acceptance-creator", new CargoDiscardRequests.Create(
List.of(new CargoDiscardRequests.Item(990001002L, "SKU-LAMP-WHITE", 4)),
List.of(new CargoDiscardRequests.Item(990001002L, null, "SKU-LAMP-WHITE", 4)),
"ACCEPT-DISCARD-REJECT", "验收:外箱可修复"));
assertEquals(10L, skuPackages(990001002L));
rejected = service.review(CUSTOMER, rejected.summary().discardNo(), "acceptance-reviewer",
@@ -84,14 +84,14 @@ class CargoDiscardMysqlAcceptanceTest {
assertEquals(10L, skuPackages(990001002L));
var pending = service.create(CUSTOMER, "acceptance-creator", new CargoDiscardRequests.Create(
List.of(new CargoDiscardRequests.Item(990001003L, "SKU-MAT-BLUE", 2)),
List.of(new CargoDiscardRequests.Item(990001003L, null, "SKU-MAT-BLUE", 2)),
"ACCEPT-DISCARD-PENDING", "验收:等待仓库审核"));
assertEquals(CargoDiscardService.PENDING_REVIEW, pending.summary().status());
assertEquals(7L, skuPackages(990001003L));
assertThrows(ResponseStatusException.class, () -> service.create(CUSTOMER, "acceptance-creator",
new CargoDiscardRequests.Create(List.of(
new CargoDiscardRequests.Item(990001003L, "SKU-MAT-BLUE", 99)),
new CargoDiscardRequests.Item(990001003L, null, "SKU-MAT-BLUE", 99)),
"ACCEPT-DISCARD-INSUFFICIENT", "验收:库存不足应失败")));
assertEquals(1, count("SELECT COUNT(*) FROM ll_cargo_discard_application WHERE customer_id=? AND status='APPROVED'"));
@@ -17,6 +17,10 @@ import com.baiyue.lastleg.entity.LastlegOrder;
import com.baiyue.lastleg.mapper.LastlegOrderMapper;
import com.baiyue.lastleg.mapper.LastlegOrderStatusHistoryMapper;
import com.baiyue.lastleg.service.LastlegOrderNoGenerator;
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 com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -51,6 +55,8 @@ class CargoDiscardServiceTest {
@Mock CargoDiscardInventoryAdjustmentService adjustments;
@Mock LastlegOrderMapper orders;
@Mock LastlegOrderStatusHistoryMapper orderHistories;
@Mock ReturnInventoryCartonMapper returnCartons;
@Mock ReturnInventoryCartonItemMapper returnCartonItems;
private CargoDiscardService service;
private final AtomicReference<CargoDiscardApplication> storedApplication = new AtomicReference<>();
@@ -70,6 +76,8 @@ class CargoDiscardServiceTest {
ReflectionTestUtils.setField(service, "orderNoGenerator", new LastlegOrderNoGenerator());
ReflectionTestUtils.setField(service, "orders", orders);
ReflectionTestUtils.setField(service, "orderHistories", orderHistories);
ReflectionTestUtils.setField(service, "returnCartons", returnCartons);
ReflectionTestUtils.setField(service, "returnCartonItems", returnCartonItems);
ReflectionTestUtils.setField(service, "objectMapper", new ObjectMapper());
ReflectionTestUtils.setField(service, "feePerPackage", new BigDecimal("5.00"));
lenient().when(applications.insert(any(CargoDiscardApplication.class))).thenAnswer(invocation -> { storedApplication.set(invocation.getArgument(0)); return 1; });
@@ -94,7 +102,7 @@ class CargoDiscardServiceTest {
when(inventory.changeCartonStatus(eq("100"), anyLong(), eq("AVAILABLE"), eq("DISCARD_PENDING"))).thenReturn(1);
var detail = service.create("100", "7", new CargoDiscardRequests.Create(
List.of(new CargoDiscardRequests.Item(101L, "SKU-1", 2)), "discard-create-1", "damaged"));
List.of(new CargoDiscardRequests.Item(101L, null, "SKU-1", 2)), "discard-create-1", "damaged"));
assertEquals(CargoDiscardService.PENDING_REVIEW, detail.summary().status());
assertEquals(2, detail.summary().totalPackages());
@@ -117,6 +125,34 @@ class CargoDiscardServiceTest {
assertEquals(2, result.get(0).skus().size());
}
@Test
void candidatesIncludeAvailableReturnCartonWithSourceIdentity() {
ReturnInventoryCarton carton = new ReturnInventoryCarton();
carton.setId(901L);
carton.setCustomerId("100");
carton.setOverseasWarehouseId("WH-1");
carton.setSourceReturnNo("RT-20260928-001");
carton.setCartonMark("RC-LAX-001");
carton.setStatus("AVAILABLE");
carton.setTotalQuantity(4L);
ReturnInventoryCartonItem sku = new ReturnInventoryCartonItem();
sku.setCartonId(901L);
sku.setSkuCode("SKU-RETURN");
sku.setProductNameZh("退货商品");
sku.setQuantity(4L);
when(returnCartons.findAvailable("100", null)).thenReturn(List.of(carton));
when(returnCartonItems.listCarton(901L)).thenReturn(List.of(sku));
var result = service.candidates("100", "RT-20260928-001");
assertEquals(1, result.size());
assertEquals("RETURN_CARTON", result.get(0).sourceType());
assertEquals(901L, result.get(0).returnCartonId());
assertEquals("RC-LAX-001", result.get(0).cartonMark());
assertEquals(4, result.get(0).availablePackages());
assertEquals("SKU-RETURN", result.get(0).skus().get(0).skuCode());
}
@Test
void approvalPushesToPdaWithoutDeductingInventory() {
CargoDiscardApplication application = pendingApplication();