From c1113f869f84eb104f331a023394f38d33113b98 Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Fri, 6 Nov 2026 14:48:02 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E5=8F=98=E6=9B=B4?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E9=80=9A=E8=BF=87=E5=90=88=E5=90=8C=E5=9B=A0?= =?UTF-8?q?=E5=A4=9A=E6=96=B9=E5=AE=A2=E5=95=86=E5=90=8D=E7=A7=B0=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E9=80=89=E5=85=A5=E7=BB=93=E7=AE=97=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- .../impl/PreSettlementServiceImpl.java | 50 +++++++++++++------ .../support/ContractPartySupport.java | 18 +++++++ 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PreSettlementServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PreSettlementServiceImpl.java index 333a16b8..669283f0 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PreSettlementServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PreSettlementServiceImpl.java @@ -72,6 +72,7 @@ import org.springblade.transport.service.IPreSettlementService; import org.springblade.transport.service.IProjectApplyService; import org.springblade.transport.service.ISettlementProjectAdvanceWriteOffService; import org.springblade.transport.service.IWaybillService; +import org.springblade.transport.support.ContractPartySupport; import org.springblade.transport.support.TransportBusinessSupport; import org.springblade.transport.wrapper.PreSettlementWrapper; import org.springblade.system.cache.UserCache; @@ -280,22 +281,26 @@ public class PreSettlementServiceImpl extends BaseServiceImpl projectById = projectApplyService.listByIds(projectIds).stream() .collect(Collectors.toMap(ProjectApply::getId, Function.identity())); + // 多方客商汇总名(顿号拼接)需拆开后再匹配客商档案全称,避免变更通过后合同被误过滤 Set partyNames = contracts.stream() - .flatMap(contract -> Stream.of(contract.getPartyA(), contract.getPartyB())) + .flatMap(contract -> Stream.concat( + ContractPartySupport.splitCustomerNames(contract.getPartyA()).stream(), + ContractPartySupport.splitCustomerNames(contract.getPartyB()).stream())) .filter(Func::isNotEmpty).collect(Collectors.toSet()); - Set approvedCustomers = customerArchiveService.list(Wrappers.lambdaQuery() - .eq(CustomerArchive::getIsDeleted, 0) - .eq(CustomerArchive::getStatus, 1) - .eq(CustomerArchive::getApprovalStatus, "approved") - .in(CustomerArchive::getFullName, partyNames)) + Set approvedCustomers = partyNames.isEmpty() ? Set.of() : customerArchiveService.list( + Wrappers.lambdaQuery() + .eq(CustomerArchive::getIsDeleted, 0) + .eq(CustomerArchive::getStatus, 1) + .eq(CustomerArchive::getApprovalStatus, "approved") + .in(CustomerArchive::getFullName, partyNames)) .stream().map(CustomerArchive::getFullName).collect(Collectors.toSet()); return contracts.stream() .filter(contract -> { ProjectApply project = projectById.get(contract.getProjectId()); return project != null && !Objects.equals(project.getIsDeleted(), 1) && List.of("approved", "change_approved").contains(project.getApprovalStatus()) - && approvedCustomers.contains(contract.getPartyA()) - && approvedCustomers.contains(contract.getPartyB()); + && isApprovedPartySummary(contract.getPartyA(), approvedCustomers) + && isApprovedPartySummary(contract.getPartyB(), approvedCustomers); }) .map(contract -> { ProjectApply project = projectById.get(contract.getProjectId()); @@ -1424,12 +1429,29 @@ public class PreSettlementServiceImpl extends BaseServiceImpllambdaQuery() - .eq(CustomerArchive::getIsDeleted, 0) - .eq(CustomerArchive::getStatus, 1) - .eq(CustomerArchive::getApprovalStatus, "approved") - .eq(CustomerArchive::getFullName, customerName)) > 0; + List names = ContractPartySupport.splitCustomerNames(customerName); + if (names.isEmpty()) { + return false; + } + for (String name : names) { + long count = customerArchiveService.count(Wrappers.lambdaQuery() + .eq(CustomerArchive::getIsDeleted, 0) + .eq(CustomerArchive::getStatus, 1) + .eq(CustomerArchive::getApprovalStatus, "approved") + .eq(CustomerArchive::getFullName, name)); + if (count <= 0) { + return false; + } + } + return true; + } + + private boolean isApprovedPartySummary(String partySummary, Set approvedCustomers) { + List names = ContractPartySupport.splitCustomerNames(partySummary); + if (names.isEmpty()) { + return false; + } + return names.stream().allMatch(approvedCustomers::contains); } private void validateContractRelations(ContractManage contract) { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/ContractPartySupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/ContractPartySupport.java index b188f5fb..80b32695 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/ContractPartySupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/ContractPartySupport.java @@ -548,6 +548,24 @@ public final class ContractPartySupport { return names.isEmpty() ? null : String.join("、", names); } + /** + * 拆分合同甲/乙/丙方汇总名称(顿号拼接的多方客商)。 + */ + public static List splitCustomerNames(String joinedNames) { + String text = trimToNull(joinedNames); + if (Func.isEmpty(text)) { + return List.of(); + } + List names = new ArrayList<>(); + for (String part : text.split("、")) { + String name = trimToNull(part); + if (Func.isNotEmpty(name) && !names.contains(name)) { + names.add(name); + } + } + return names; + } + private static String toJsonOrNull(List> rows) { return rows == null || rows.isEmpty() ? null : JsonUtil.toJson(rows); }