Merge remote-tracking branch 'origin/test' into test

This commit is contained in:
2026-10-10 15:34:19 +08:00
2 changed files with 38 additions and 6 deletions
@@ -117,6 +117,7 @@ public class ReturnReceiptService {
item.setSkuCode(text(input.skuCode()));
item.setProductNameZh(text(input.productNameZh())); item.setExpectedQuantity(input.expectedQuantity());
item.setReceivedQuantity(0L); item.setCreatedAt(now); item.setUpdatedAt(now); orderItems.insert(item);
insertForecastCargo(order, item);
}
return detail(customerId, order.getReturnNo());
}
@@ -133,7 +134,7 @@ public class ReturnReceiptService {
tail.setRelabelStatus(Boolean.TRUE.equals(returnOrder.getNeedRelabel()) ? PENDING_REVIEW : "NOT_REQUIRED");
// A return forecast is already the source of truth for the expected cargo.
// Keep the tail-leg snapshot useful before PDA receipt facts exist.
tail.setPackageCount(returnOrder.getExpectedQuantity() == null ? 0 : Math.toIntExact(returnOrder.getExpectedQuantity()));
tail.setPackageCount(0);
tail.setProductQuantity(returnOrder.getExpectedQuantity() == null ? 0 : Math.toIntExact(returnOrder.getExpectedQuantity()));
tail.setCustomerRemark(returnOrder.getRemark()); tail.setSourceEventId("RETURN_ORDER:" + returnOrder.getReturnNo());
tail.setSourceLoadingPlanId("RETURN_RELABEL"); tail.setCreatedAt(now); tail.setUpdatedAt(now);
@@ -157,9 +158,31 @@ public class ReturnReceiptService {
order.setNeedRelabel(request.needRelabel()); order.setRemark(text(request.remark())); order.setExpectedSkuTypes(skus.size()); order.setExpectedQuantity(expected); order.setUpdatedAt(LocalDateTime.now()); orders.updateById(order);
orderItems.delete(new LambdaQueryWrapper<ReturnOrderItem>().eq(ReturnOrderItem::getReturnOrderId, order.getId()));
for (ReturnOrderRequests.Item input : request.items()) { ReturnOrderItem item = new ReturnOrderItem(); item.setId(IdWorker.getId()); item.setReturnOrderId(order.getId()); item.setCustomerId(customerId); item.setSkuCode(text(input.skuCode())); item.setProductNameZh(text(input.productNameZh())); item.setExpectedQuantity(input.expectedQuantity()); item.setReceivedQuantity(0L); item.setCreatedAt(LocalDateTime.now()); item.setUpdatedAt(LocalDateTime.now()); orderItems.insert(item); }
if (order.getLastlegOrderId() != null) {
lastlegOrderDetails.delete(new LambdaQueryWrapper<LastlegOrderDetail>()
.eq(LastlegOrderDetail::getCustomerId, customerId).eq(LastlegOrderDetail::getOrderId, order.getLastlegOrderId())
.likeRight(LastlegOrderDetail::getSourceInboundDetailId, "RETURN_ORDER:"));
for (ReturnOrderRequests.Item input : request.items()) {
ReturnOrderItem item = new ReturnOrderItem(); item.setSkuCode(text(input.skuCode()));
item.setProductNameZh(text(input.productNameZh())); item.setExpectedQuantity(input.expectedQuantity());
insertForecastCargo(order, item);
}
LastlegOrder tail = lastlegOrders.selectById(order.getLastlegOrderId());
if (tail != null) { tail.setPackageCount(0); tail.setProductQuantity(Math.toIntExact(expected));
tail.setUpdatedAt(order.getUpdatedAt()); lastlegOrders.updateById(tail); }
}
return detail(customerId, returnNo);
}
private void insertForecastCargo(ReturnOrder order, ReturnOrderItem item) {
LastlegOrderDetail detail = new LastlegOrderDetail();
detail.setId(IdWorker.getId()); detail.setCustomerId(order.getCustomerId()); detail.setOrderId(order.getLastlegOrderId());
detail.setSourceInboundDetailId("RETURN_ORDER:" + order.getReturnNo() + ":" + item.getSkuCode());
detail.setSkuCode(item.getSkuCode()); detail.setProductNameZh(item.getProductNameZh());
detail.setPackageCount(0); detail.setProductQuantity(Math.toIntExact(value(item.getExpectedQuantity())));
lastlegOrderDetails.insert(detail);
}
@Transactional
public ReturnOrderResponses.Detail cancelPending(String customerId, String returnNo) {
ReturnOrder order = orders.findNo(customerId, text(returnNo));
@@ -227,13 +250,13 @@ public class ReturnReceiptService {
detail.setId(IdWorker.getId()); detail.setCustomerId(customerId); detail.setOrderId(tailOrderId);
detail.setSourceInboundDetailId("RETURN_ORDER:" + order.getReturnNo() + ":" + item.getSkuCode());
detail.setSkuCode(item.getSkuCode()); detail.setProductNameZh(item.getProductNameZh());
detail.setPackageCount(quantity); detail.setProductQuantity(quantity);
detail.setPackageCount(0); detail.setProductQuantity(quantity);
lastlegOrderDetails.insert(detail); total = Math.addExact(total, quantity);
}
if (total > 0) {
LastlegOrder tail = lastlegOrders.selectById(tailOrderId);
if (tail != null) {
tail.setPackageCount(total); tail.setProductQuantity(total); tail.setUpdatedAt(LocalDateTime.now());
tail.setPackageCount(0); tail.setProductQuantity(total); tail.setUpdatedAt(LocalDateTime.now());
lastlegOrders.updateById(tail);
}
}
@@ -696,8 +719,7 @@ public class ReturnReceiptService {
}
boolean firstSku = true;
for (Map.Entry<String, Long> entry : quantities.entrySet()) {
int skuBoxes = Math.toIntExact("PARCEL".equals(receipt.getUnitType()) ? 1 : boxes.getOrDefault(entry.getKey(), 0L));
if (skuBoxes <= 0) skuBoxes = 1;
int skuBoxes = Math.toIntExact("PARCEL".equals(receipt.getUnitType()) ? 0 : boxes.getOrDefault(entry.getKey(), 0L));
String sourceKey = "RETURN_RECEIPT:" + receipt.getId() + ":" + entry.getKey();
LastlegOrderDetail detail = lastlegOrderDetails.selectOne(new LambdaQueryWrapper<LastlegOrderDetail>()
.eq(LastlegOrderDetail::getCustomerId, order.getCustomerId()).eq(LastlegOrderDetail::getOrderId, tail.getId())
@@ -721,7 +743,7 @@ public class ReturnReceiptService {
int actualBoxes = 0, actualUnits = 0;
Set<String> palletCodes = new LinkedHashSet<>();
for (ReturnReceipt signed : signedReceipts) {
actualBoxes = Math.addExact(actualBoxes, "PARCEL".equals(signed.getUnitType()) ? 1 : Math.toIntExact(value(signed.getTotalBoxCount())));
actualBoxes = Math.addExact(actualBoxes, "PARCEL".equals(signed.getUnitType()) ? 0 : Math.toIntExact(value(signed.getTotalBoxCount())));
actualUnits = Math.addExact(actualUnits, Math.toIntExact(receiptItems.listReceipt(signed.getId()).stream()
.mapToLong(line -> value(line.getReceivedQuantity())).sum()));
if ("PALLET".equals(signed.getUnitType())) palletCodes.add(text(signed.getUnitCode()) == null ? signed.getReceiptNo() : signed.getUnitCode());
@@ -90,6 +90,7 @@ class ReturnReceiptServiceTest {
@Mock ReturnInventoryService inventory;
@Mock LastlegOrderNoGenerator numbers;
@Mock LastlegOrderMapper lastlegOrders;
@Mock com.baiyue.lastleg.mapper.LastlegOrderDetailMapper cargoMapper;
@Mock ReturnInventoryCartonMapper cartons;
@Mock ReturnInventoryCartonItemMapper cartonItems;
@Mock RelabelApplicationMapper relabelApplications;
@@ -113,6 +114,7 @@ class ReturnReceiptServiceTest {
ReflectionTestUtils.setField(service, "numbers", numbers);
ReflectionTestUtils.setField(service, "objectMapper", new ObjectMapper());
ReflectionTestUtils.setField(service, "lastlegOrders", lastlegOrders);
ReflectionTestUtils.setField(service, "lastlegOrderDetails", cargoMapper);
ReflectionTestUtils.setField(service, "cartons", cartons);
ReflectionTestUtils.setField(service, "cartonItems", cartonItems);
ReflectionTestUtils.setField(service, "relabelApplications", relabelApplications);
@@ -340,6 +342,14 @@ class ReturnReceiptServiceTest {
assertEquals(saved.get().getRequestHash(), tail.getValue().getSourcePayloadHash());
assertEquals("RT-1", tail.getValue().getOrderNo());
assertEquals("RT-1", result.order().lastlegOrderNo());
assertEquals(0, tail.getValue().getPackageCount());
assertEquals(2, tail.getValue().getProductQuantity());
var cargo = ArgumentCaptor.forClass(com.baiyue.lastleg.entity.LastlegOrderDetail.class);
verify(cargoMapper).insert(cargo.capture());
assertEquals("SKU-A", cargo.getValue().getSkuCode());
assertEquals("商品A", cargo.getValue().getProductNameZh());
assertEquals(2, cargo.getValue().getProductQuantity());
assertEquals(0, cargo.getValue().getPackageCount());
verify(numbers, never()).next(eq("RETURN_RELABEL"), anyString(), anyLong());
}