From 00616d5930018df952c7947ba8e581de39aa01a9 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Mon, 26 Oct 2026 19:58:07 +0800 Subject: [PATCH] fix(lastleg): resolve transfer storage rent by inbound association --- .../entity/StorageRentBusinessSource.java | 1 + .../mapper/StorageRentBusinessSourceMapper.java | 4 ++-- .../service/StorageRentSourceResolver.java | 6 ++++++ .../service/StorageRentSourceResolverTest.java | 15 +++++++++++++++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/storagerent/entity/StorageRentBusinessSource.java b/lastleg-service/src/main/java/com/baiyue/lastleg/storagerent/entity/StorageRentBusinessSource.java index 31489ffda..542ec4d20 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/storagerent/entity/StorageRentBusinessSource.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/storagerent/entity/StorageRentBusinessSource.java @@ -8,4 +8,5 @@ public class StorageRentBusinessSource { private Long id; private String businessNo; private Long lastlegOrderId; + private Long inboundOrderId; } diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/storagerent/mapper/StorageRentBusinessSourceMapper.java b/lastleg-service/src/main/java/com/baiyue/lastleg/storagerent/mapper/StorageRentBusinessSourceMapper.java index de311aa2f..728005d24 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/storagerent/mapper/StorageRentBusinessSourceMapper.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/storagerent/mapper/StorageRentBusinessSourceMapper.java @@ -13,9 +13,9 @@ public interface StorageRentBusinessSourceMapper { @Select("SELECT id,relabel_no AS business_no,lastleg_order_id FROM ll_relabel_application WHERE customer_id=#{customer} AND relabel_no=#{number} LIMIT 1") StorageRentBusinessSource relabelNo(@Param("customer") String customer,@Param("number") String number); /** 仓储转运独立业务单归属。 */ - @Select("SELECT id,transfer_no AS business_no,lastleg_order_id FROM ll_warehouse_transfer_order WHERE customer_id=#{customer} AND transfer_no=#{number} LIMIT 1") + @Select("SELECT id,transfer_no AS business_no,lastleg_order_id,inbound_order_id FROM ll_warehouse_transfer_order WHERE customer_id=#{customer} AND transfer_no=#{number} LIMIT 1") StorageRentBusinessSource transfer(@Param("customer") String customer,@Param("number") String number); /** 原尾程投影映射唯一仓储转运业务。 */ - @Select("SELECT id,transfer_no AS business_no,lastleg_order_id FROM ll_warehouse_transfer_order WHERE customer_id=#{customer} AND lastleg_order_id=#{id} LIMIT 1") + @Select("SELECT id,transfer_no AS business_no,lastleg_order_id,inbound_order_id FROM ll_warehouse_transfer_order WHERE customer_id=#{customer} AND lastleg_order_id=#{id} LIMIT 1") StorageRentBusinessSource transferByTail(@Param("customer") String customer,@Param("id") Long id); } diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/storagerent/service/StorageRentSourceResolver.java b/lastleg-service/src/main/java/com/baiyue/lastleg/storagerent/service/StorageRentSourceResolver.java index 6bdff18e1..410548e70 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/storagerent/service/StorageRentSourceResolver.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/storagerent/service/StorageRentSourceResolver.java @@ -78,6 +78,12 @@ public class StorageRentSourceResolver { owner=new Owner(customer,null,"RETURN_ORDER",order.getId(),order.getReturnNo(),order.getLastlegOrderId(),null,warehouse); }else owner=business(customer,null,"LASTLEG_ORDER",null,item.getSourceOrderId(),warehouse,item.getInboundCode()); }else throw conflict("整托预校验应先展开为真实扫码来源"); + // 转运的尾程单与入库单独立建号;库存归属必须核对业务单保存的真实入库关联。 + if("WAREHOUSE_TRANSFER".equals(owner.businessType())){ + var transfer=repository.transfer(customer,owner.businessNo()); + if(transfer==null||transfer.getInboundOrderId()==null)throw conflict("转运业务单缺少原入库关联,不能预占仓租"); + expectedOrderId=transfer.getInboundOrderId(); + } List allocations; if(marks!=null){if(request.positionId()!=null)throw conflict("退货扫码不能指定普通库存位置");allocations=returnAllocations(customer,warehouse,marks,sku,pieceQuantity,at);} else { diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/storagerent/service/StorageRentSourceResolverTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/storagerent/service/StorageRentSourceResolverTest.java index dd0dd5d66..0af046425 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/storagerent/service/StorageRentSourceResolverTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/storagerent/service/StorageRentSourceResolverTest.java @@ -56,6 +56,21 @@ class StorageRentSourceResolverTest { assertThat(plan.allocations().get(0).quantity()).isEqualByComparingTo("4");assertThat(plan.amount()).isEqualByComparingTo("0.96"); } + /** 转运尾程单与入库单不同号仍能预校验;错入库关联和缺失关联必须拒绝。 */ + @Test void transferUsesItsInboundAssociationInsteadOfTailOrderIdentity(){ + item.setOrderId(171L);item.setSourceBusinessType("WAREHOUSE_TRANSFER");item.setSourceBusinessNo("ZY-1"); + var source=new StorageRentBusinessSource();source.setId(81L);source.setBusinessNo("ZY-1"); + source.setLastlegOrderId(171L);source.setInboundOrderId(91L); + when(repository.transfer("101","ZY-1")).thenReturn(source); + var plan=service.resolve("9",request,at); + assertThat(plan.owner().businessNo()).isEqualTo("ZY-1");assertThat(plan.owner().orderId()).isEqualTo(171L); + assertThat(plan.allocations()).hasSize(1);assertThat(plan.allocations().get(0).quantity()).isEqualByComparingTo("4"); + source.setInboundOrderId(92L); + assertThatThrownBy(()->service.resolve("9",request,at)).hasMessageContaining("业务单据关联的入库订单"); + source.setInboundOrderId(null); + assertThatThrownBy(()->service.resolve("9",request,at)).hasMessageContaining("缺少原入库关联"); + } + /** 当前客户覆盖默认价;同一预占消费保存价,余货下次预占读新价且库龄不变。 */ @Test void currentCustomerPricingAndSavedSnapshotKeepOriginalAge(){ var first=customPricing("USD",1,"2","5");when(pricing.current("101")).thenReturn(first);