perf(masterdata): 主数据查询优化, 消除N+1与重复查库

PayProviderMethodService.contains()从3+次查库降为2次(pairKey Set O(1)判断); listMergedRelationsForProvider复用mergeRelations消除重复代码; PayProductCapabilityService.productSupportsMethod从1+N次查库降为2次(批量listByCodes); PayRouteStrategyCapabilitySupport新增loadEnabledCapabilityCodes预加载, 单次候选路径从2N次查库降为2次; ProductStrategySupport移除2处冗余显式static。
This commit is contained in:
DaxPay Dev
2026-06-28 21:54:32 +08:00
parent d63cab92dc
commit 2dfc95f4c6
4 changed files with 45 additions and 32 deletions

View File

@@ -66,9 +66,20 @@ public class PayProductCapabilityService {
/// 判断产品是否支持该支付方式(策略声明能力 ∩ 已挂载能力,按产品查库)
public boolean productSupportsMethod(String productCode, String methodCode) {
Set<String> mountedCodes = payProductCapabilityManager.listByProduct(productCode).stream()
List<PayProductCapability> rels = payProductCapabilityManager.listByProduct(productCode);
if (rels.isEmpty()) {
return false;
}
// 批量获取能力主数据(替代逐个 findByCode
Set<String> capabilityCodes = rels.stream()
.map(PayProductCapability::getCapabilityCode)
.filter(code -> payCapabilityManager.findByCode(code).isPresent())
.collect(Collectors.toSet());
Set<String> validCodes = payCapabilityManager.listByCodes(capabilityCodes).stream()
.map(PayCapability::getCode)
.collect(Collectors.toSet());
Set<String> mountedCodes = rels.stream()
.map(PayProductCapability::getCapabilityCode)
.filter(validCodes::contains)
.collect(Collectors.toSet());
return strategyCapabilitiesForMethod(productCode, methodCode).stream()
.map(PayCapabilityEnum::getCode)

View File

@@ -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<MergedRelationRow> listMergedRelationsForProvider(String providerCode) {
Map<String, PayMethod> methodMap = payMethodManager.mapByCode();
List<MergedRelationRow> 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());
}
/// 转为平铺展示用的渠道+方式结果

View File

@@ -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;
}

View File

@@ -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<String> 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<String> 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<String> loadEnabledCapabilityCodes(String product) {
List<PayProductCapability> rels = payProductCapabilityManager.listByProduct(product);
if (rels.isEmpty()) {
return Set.of();
}
Set<String> capabilityCodes = rels.stream()
.map(PayProductCapability::getCapabilityCode)
.collect(Collectors.toSet());
Set<String> 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;