From 6ac6cf9bffad39f98505b07359bce52000760d19 Mon Sep 17 00:00:00 2001 From: weicw <594098497@qq.com> Date: Tue, 27 Oct 2026 23:53:32 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E9=85=8D=E8=BD=BD?= =?UTF-8?q?=E6=89=BF=E8=BF=90=E5=95=86=E4=B9=99=E6=96=B9=E4=BA=A4=E9=9B=86?= =?UTF-8?q?=E5=9C=A8=E7=BC=BA=E5=AE=A2=E6=88=B7=E5=90=88=E5=90=8C=E4=B8=8E?= =?UTF-8?q?=E6=97=A0=E5=8F=AF=E7=94=A8=E5=90=88=E5=90=8C=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 子运单全都没有客户合同时,甲方映射是空表,按 null 键取甲方抛 NPE,配载提交 500; 项目下没有可用承运商合同时乙方交集必然为空,被当成「无共同乙方」拦截,自运的多张子运单因此配不进去。 金蝶客商同步测试补 HCS 占位地址:本地未配置 thirdParty.hcs.baseUrl 时 Feign 客户端会让整个上下文起不来。 --- .../impl/LoadingManageServiceImpl.java | 8 +++++- .../CustomerArchiveSyncKingdeeDataTest.java | 4 ++- .../impl/LoadingManageAdmissionTest.java | 27 +++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/LoadingManageServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/LoadingManageServiceImpl.java index 63a9cbf4..41dd279c 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/LoadingManageServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/LoadingManageServiceImpl.java @@ -952,6 +952,10 @@ public class LoadingManageServiceImpl extends BaseServiceImpl contracts = availableCarrierContracts(projectIdsOf(waybills)); + // 项目下没有任何可用承运商合同时不存在乙方交集约束;承运类型为「承运商」由 validateCarrierContract 要求选择合同 + if (Func.isEmpty(contracts)) { + return; + } Set allowedPartyBs = intersectCarrierPartyBs(waybills, contracts); if (allowedPartyBs.isEmpty()) { throw new ServiceException("所选运单在同一项目下没有共同的承运商合同乙方,不能配载到同一配载单"); @@ -1071,7 +1075,9 @@ public class LoadingManageServiceImpl extends BaseServiceImpl Objects.equals(contract.getProjectId(), waybill.getProjectId())) .filter(contract -> Func.isEmpty(partyA) || Objects.equals(normalizePartyName(contract.getPartyA()), partyA)) diff --git a/blade-service/blade-transport/src/test/java/org/springblade/transport/CustomerArchiveSyncKingdeeDataTest.java b/blade-service/blade-transport/src/test/java/org/springblade/transport/CustomerArchiveSyncKingdeeDataTest.java index f06cbcc8..b05844f1 100644 --- a/blade-service/blade-transport/src/test/java/org/springblade/transport/CustomerArchiveSyncKingdeeDataTest.java +++ b/blade-service/blade-transport/src/test/java/org/springblade/transport/CustomerArchiveSyncKingdeeDataTest.java @@ -40,7 +40,9 @@ import org.springframework.boot.test.context.SpringBootTest; */ @SpringBootTest(classes = TransportApplication.class, properties = { "spring.profiles.active=dev", - "spring.main.allow-bean-definition-overriding=true" + "spring.main.allow-bean-definition-overriding=true", + // HCS 是可选外部集成,本地 Nacos 未配置该地址时 Feign 客户端会让整个上下文起不来;本测试不调用 HCS + "thirdParty.hcs.baseUrl=http://localhost:9" }) class CustomerArchiveSyncKingdeeDataTest { diff --git a/blade-service/blade-transport/src/test/java/org/springblade/transport/service/impl/LoadingManageAdmissionTest.java b/blade-service/blade-transport/src/test/java/org/springblade/transport/service/impl/LoadingManageAdmissionTest.java index b71ce064..f3bbe693 100644 --- a/blade-service/blade-transport/src/test/java/org/springblade/transport/service/impl/LoadingManageAdmissionTest.java +++ b/blade-service/blade-transport/src/test/java/org/springblade/transport/service/impl/LoadingManageAdmissionTest.java @@ -294,6 +294,33 @@ class LoadingManageAdmissionTest { assertEquals("所选承运商合同不存在、未审核通过或已失效", exception.getMessage()); } + @Test + @DisplayName("子运单的客户合同快照为空时不按甲方过滤,取不到甲方也不空指针") + void missingCustomerContractDoesNotFilterByPartyA() { + Waybill withSnapshot = waybill(1L, WAYBILL_NO_A, "road", "pending", null, PROJECT_A); + withSnapshot.setContractId(OTHER_CONTRACT_ID); + stubWaybills(withSnapshot, waybill(2L, WAYBILL_NO_B, "road", "pending", null, PROJECT_A)); + stubContract(CONTRACT_ID, PROJECT_A); + + assertDoesNotThrow(() -> service.submit(submitPayload(List.of(1L, 2L)))); + } + + @Test + @DisplayName("项目下没有可用承运商合同时不按乙方交集拦截:自运的多张子运单照常提交") + void noAvailableCarrierContractSkipsPartyBCheck() { + stubWaybills( + waybill(1L, WAYBILL_NO_A, "road", "pending", null, PROJECT_A), + waybill(2L, WAYBILL_NO_B, "road", "pending", null, PROJECT_A)); + when(contractManageService.list(anyContractWrapper())).thenReturn(List.of()); + LoadingManage payload = submitPayload(List.of(1L, 2L)); + payload.setCarrierType("自运"); + payload.setCarrierContractId(null); + payload.setDriverName("张三"); + payload.setDriverPhone("13800008000"); + + assertDoesNotThrow(() -> service.submit(payload)); + } + // ------------------------------------------------------------ 放行 @Test