mirror of
https://gitee.com/dromara/dax-pay
synced 2026-08-10 23:01:58 +08:00
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:
@@ -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)
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
/// 转为平铺展示用的渠道+方式结果
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user