From 2dfc95f4c69256f3bbc01d8bb38027fafe1bdbe6 Mon Sep 17 00:00:00 2001 From: DaxPay Dev Date: Sun, 28 Jun 2026 21:54:32 +0800 Subject: [PATCH] =?UTF-8?q?perf(masterdata):=20=E4=B8=BB=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E4=BC=98=E5=8C=96,=20=E6=B6=88=E9=99=A4N+1?= =?UTF-8?q?=E4=B8=8E=E9=87=8D=E5=A4=8D=E6=9F=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PayProviderMethodService.contains()从3+次查库降为2次(pairKey Set O(1)判断); listMergedRelationsForProvider复用mergeRelations消除重复代码; PayProductCapabilityService.productSupportsMethod从1+N次查库降为2次(批量listByCodes); PayRouteStrategyCapabilitySupport新增loadEnabledCapabilityCodes预加载, 单次候选路径从2N次查库降为2次; ProductStrategySupport移除2处冗余显式static。 --- .../service/PayProductCapabilityService.java | 15 ++++++++-- .../service/PayProviderMethodService.java | 30 +++---------------- .../pay/support/ProductStrategySupport.java | 4 +-- .../PayRouteStrategyCapabilitySupport.java | 28 +++++++++++++++-- 4 files changed, 45 insertions(+), 32 deletions(-) diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/masterdata/constants/product/service/PayProductCapabilityService.java b/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/masterdata/constants/product/service/PayProductCapabilityService.java index d2866d8d1..26df7e7f2 100644 --- a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/masterdata/constants/product/service/PayProductCapabilityService.java +++ b/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/masterdata/constants/product/service/PayProductCapabilityService.java @@ -66,9 +66,20 @@ public class PayProductCapabilityService { /// 判断产品是否支持该支付方式(策略声明能力 ∩ 已挂载能力,按产品查库) public boolean productSupportsMethod(String productCode, String methodCode) { - Set mountedCodes = payProductCapabilityManager.listByProduct(productCode).stream() + List rels = payProductCapabilityManager.listByProduct(productCode); + if (rels.isEmpty()) { + return false; + } + // 批量获取能力主数据(替代逐个 findByCode) + Set capabilityCodes = rels.stream() .map(PayProductCapability::getCapabilityCode) - .filter(code -> payCapabilityManager.findByCode(code).isPresent()) + .collect(Collectors.toSet()); + Set validCodes = payCapabilityManager.listByCodes(capabilityCodes).stream() + .map(PayCapability::getCode) + .collect(Collectors.toSet()); + Set mountedCodes = rels.stream() + .map(PayProductCapability::getCapabilityCode) + .filter(validCodes::contains) .collect(Collectors.toSet()); return strategyCapabilitiesForMethod(productCode, methodCode).stream() .map(PayCapabilityEnum::getCode) diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/masterdata/constants/provider/service/PayProviderMethodService.java b/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/masterdata/constants/provider/service/PayProviderMethodService.java index bcf766b52..bd2e0ec49 100644 --- a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/masterdata/constants/provider/service/PayProviderMethodService.java +++ b/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/masterdata/constants/provider/service/PayProviderMethodService.java @@ -73,19 +73,14 @@ public class PayProviderMethodService { /// 判断该支付渠道下是否存在该支付方式(目录有效组合) public boolean contains(String providerCode, String methodCode) { - PayProviderEnum provider = PayProviderEnum.findByCode(providerCode); - if (provider == null) { - return false; - } - PayMethodEnum methodEnum = resolveMethodEnum(methodCode); - if (methodEnum == null) { + if (PayProviderEnum.findByCode(providerCode) == null) { return false; } if (payMethodManager.findByCode(methodCode).isEmpty()) { return false; } - return listMergedRelationsForProvider(providerCode).stream() - .anyMatch(row -> Objects.equals(row.methodEnum().getCode(), methodCode)); + return payProviderMethodManager.mapByPairKey() + .containsKey(PayProviderMethodManager.pairKey(providerCode, methodCode)); } /// 某支付渠道目录中的支付方式列表 @@ -110,24 +105,7 @@ public class PayProviderMethodService { /// 管理端:某支付渠道下的全部支付方式 public List listMergedRelationsForProvider(String providerCode) { - Map methodMap = payMethodManager.mapByCode(); - List rows = new ArrayList<>(); - int ordinal = 0; - for (PayProviderMethod rel : payProviderMethodManager.listByProvider(providerCode)) { - PayMethod methodRow = methodMap.get(rel.getMethod()); - if (methodRow == null) { - continue; - } - PayMethodEnum methodEnum = resolveMethodEnum(rel.getMethod()); - if (methodEnum == null) { - continue; - } - int sortNo = rel.getSortNo() != null ? rel.getSortNo() : ordinal; - rows.add(new MergedRelationRow(methodEnum, sortNo, rel.getDescription())); - ordinal++; - } - rows.sort(Comparator.comparingInt(MergedRelationRow::sortNo)); - return rows; + return mergeRelations(payProviderMethodManager.listByProvider(providerCode), payMethodManager.mapByCode()); } /// 转为平铺展示用的渠道+方式结果 diff --git a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/old/pay/support/ProductStrategySupport.java b/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/old/pay/support/ProductStrategySupport.java index 70f77847b..9fe57cbf3 100644 --- a/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/old/pay/support/ProductStrategySupport.java +++ b/daxpay-payment/daxpay-payment-common/src/main/java/cn/daxpay/open/payment/old/pay/support/ProductStrategySupport.java @@ -70,7 +70,7 @@ public class ProductStrategySupport { } /// 按能力编码判断策略是否在该目录方式下声明支持 - public static boolean strategySupportsCapabilityCode(AbsProductStrategy strategy, String methodCode, String capabilityCode) { + public boolean strategySupportsCapabilityCode(AbsProductStrategy strategy, String methodCode, String capabilityCode) { if (StrUtil.isBlank(methodCode) || StrUtil.isBlank(capabilityCode)) { return false; } @@ -80,7 +80,7 @@ public class ProductStrategySupport { } /// 反推: 给定策略与能力, 返回所属支付方式(多归属取首个, 无则 null) - public static PayMethodEnum methodForCapability(AbsProductStrategy strategy, PayCapabilityEnum capability) { + public PayMethodEnum methodForCapability(AbsProductStrategy strategy, PayCapabilityEnum capability) { if (capability == null) { return null; } diff --git a/daxpay-payment/daxpay-payment-merchant/src/main/java/cn/daxpay/open/payment/merchant/service/route/support/PayRouteStrategyCapabilitySupport.java b/daxpay-payment/daxpay-payment-merchant/src/main/java/cn/daxpay/open/payment/merchant/service/route/support/PayRouteStrategyCapabilitySupport.java index 448a536df..3d1462ea8 100644 --- a/daxpay-payment/daxpay-payment-merchant/src/main/java/cn/daxpay/open/payment/merchant/service/route/support/PayRouteStrategyCapabilitySupport.java +++ b/daxpay-payment/daxpay-payment-merchant/src/main/java/cn/daxpay/open/payment/merchant/service/route/support/PayRouteStrategyCapabilitySupport.java @@ -6,6 +6,8 @@ import cn.daxpay.open.payment.common.util.PaymentStrategyFactory; import cn.daxpay.open.payment.merchant.param.route.scene.PayRouteSceneCapabilityBatchItem; import cn.daxpay.open.payment.masterdata.constants.capability.dao.PayCapabilityManager; import cn.daxpay.open.payment.masterdata.constants.capability.dao.PayProductCapabilityManager; +import cn.daxpay.open.payment.masterdata.constants.capability.entity.PayCapability; +import cn.daxpay.open.payment.masterdata.constants.product.entity.PayProductCapability; import cn.daxpay.open.payment.masterdata.constants.product.service.PayProductCapabilityService; import cn.daxpay.open.payment.masterdata.constants.provider.dao.PayProviderMethodManager; import cn.daxpay.open.payment.masterdata.constants.provider.service.PayProviderMethodService; @@ -178,8 +180,10 @@ public class PayRouteStrategyCapabilitySupport { } AbsProductStrategy strategy = PaymentStrategyFactory.createByProduct(product, AbsProductStrategy.class); PayMethodEnum methodEnum = PayMethodEnum.findByCode(method); + // 预加载该产品已挂载且主数据存在的能力集合(替代逐能力查库) + Set enabledCodes = loadEnabledCapabilityCodes(product); return ProductStrategySupport.capabilitiesForMethod(strategy, methodEnum).stream() - .filter(capability -> productCapabilityEnabled(product, capability.getCode())) + .filter(capability -> enabledCodes.contains(capability.getCode())) .map(capability -> new LabelValue(I18nUtil.getEnumName(capability), capability.getCode())) .toList(); } @@ -208,8 +212,10 @@ public class PayRouteStrategyCapabilitySupport { return List.of(); } AbsProductStrategy strategy = PaymentStrategyFactory.createByProduct(product, AbsProductStrategy.class); + // 预加载该产品已挂载且主数据存在的能力集合(替代逐能力查库) + Set enabledCodes = loadEnabledCapabilityCodes(product); return ProductStrategySupport.supportedPayCapabilities(strategy).stream() - .filter(capability -> productCapabilityEnabled(product, capability.getCode())) + .filter(capability -> enabledCodes.contains(capability.getCode())) .map(capability -> new LabelValue(I18nUtil.getEnumName(capability), capability.getCode())) .toList(); } @@ -325,6 +331,24 @@ public class PayRouteStrategyCapabilitySupport { .orElse(null); } + /// 预加载产品已挂载且主数据存在的能力编码集合(替代逐能力 productCapabilityEnabled 查库) + private Set loadEnabledCapabilityCodes(String product) { + List rels = payProductCapabilityManager.listByProduct(product); + if (rels.isEmpty()) { + return Set.of(); + } + Set capabilityCodes = rels.stream() + .map(PayProductCapability::getCapabilityCode) + .collect(Collectors.toSet()); + Set validCodes = payCapabilityManager.listByCodes(capabilityCodes).stream() + .map(PayCapability::getCode) + .collect(Collectors.toSet()); + return rels.stream() + .map(PayProductCapability::getCapabilityCode) + .filter(validCodes::contains) + .collect(Collectors.toSet()); + } + private boolean productCapabilityEnabled(String productCode, String capabilityCode) { if (!payProductCapabilityManager.exists(productCode, capabilityCode)) { return false;