diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/returnreceipt/service/ReturnReceiptService.java b/lastleg-service/src/main/java/com/baiyue/lastleg/returnreceipt/service/ReturnReceiptService.java index 55bd35fd0..72dd83856 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/returnreceipt/service/ReturnReceiptService.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/returnreceipt/service/ReturnReceiptService.java @@ -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().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() + .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 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() .eq(LastlegOrderDetail::getCustomerId, order.getCustomerId()).eq(LastlegOrderDetail::getOrderId, tail.getId()) @@ -721,7 +743,7 @@ public class ReturnReceiptService { int actualBoxes = 0, actualUnits = 0; Set 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()); diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/returnreceipt/service/ReturnReceiptServiceTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/returnreceipt/service/ReturnReceiptServiceTest.java index 78a863c14..4205b5c2c 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/returnreceipt/service/ReturnReceiptServiceTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/returnreceipt/service/ReturnReceiptServiceTest.java @@ -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()); }