diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java index 8f81a0f0..4f9672f3 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java @@ -134,6 +134,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.function.Function; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -903,9 +904,9 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl payApplyMap = new HashMap<>(); + // A103-2 查询结果按金蝶单据号(billno,全局唯一)归并缓存,本地 kingdee_bill_no 与之同源匹配 + Map payApplyByBillNo = new HashMap<>(); if (!applications.isEmpty()) { - // ② A103-2 付款申请单查询:指定单据号时按金蝶单据号(billno)精确查询,无金蝶单据号的兜底按来源单号查询; - // 定时全量回写按 paymentNo(awrp_src_code)分批查询,同一来源单号取最近修改的一条 + // ② A103-2 付款申请单查询:统一按金蝶单据号(billno)分批精确查询,同一金蝶单据号取最近修改的一条; + // 来源单号 awrp_src_code 因历史版本逻辑与 Nacos 配置变更含环境后缀(如 xxx-local),不作为回写查询与匹配依据 List billNos = applications.stream() .map(PaymentApplication::getKingdeeBillNo).filter(Func::isNotEmpty).distinct().toList(); - List fallbackSrcCodes = applications.stream() - .filter(application -> Func.isEmpty(application.getKingdeeBillNo())) - .map(PaymentApplication::getPaymentNo).filter(Func::isNotEmpty).distinct().toList(); this.batchForeach(billNos, PAY_RESULT_QUERY_BATCH, - batch -> payApplyMap.putAll(this.latestPayApplyBySrcCode(this.queryPayApplyPagesByBillNo(batch)))); - this.batchForeach(fallbackSrcCodes, PAY_RESULT_QUERY_BATCH, - batch -> payApplyMap.putAll(this.latestPayApplyBySrcCode(this.queryPayApplyPages(batch)))); + batch -> payApplyByBillNo.putAll(this.latestPayApplyByKey(this.queryPayApplyPagesByBillNo(batch), BfiPayApplyVO::getBillno))); // 逐单回写:未查得保持现状等待下一轮,查得即回填(解锁仅由金蝶删单回调触发) for (PaymentApplication application : applications) { - BfiPayApplyVO payApply = payApplyMap.get(application.getPaymentNo()); + BfiPayApplyVO payApply = payApplyByBillNo.get(application.getKingdeeBillNo()); if (payApply == null) { continue; } @@ -967,7 +964,7 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl recordCandidates = new LinkedHashMap<>(); for (PaymentApplication application : applications) { - BfiPayApplyVO payApply = payApplyMap.get(application.getPaymentNo()); + BfiPayApplyVO payApply = payApplyByBillNo.get(application.getKingdeeBillNo()); if (payApply != null && !KingdeeBfiConstant.BFI_PAY_STATUS_UNPAID.equals(payApply.getPaystatus())) { recordCandidates.put(application.getId(), application); } @@ -984,7 +981,7 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl> orgGroups = new LinkedHashMap<>(); for (PaymentApplication application : recordCandidates.values()) { - BfiPayApplyVO payApply = payApplyMap.get(application.getPaymentNo()); + BfiPayApplyVO payApply = payApplyByBillNo.get(application.getKingdeeBillNo()); String orgNumber = payApply == null ? null : payApply.getPayorgNumber(); if (Func.isBlank(orgNumber)) { try { @@ -1174,28 +1171,30 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl 最近修改的付款申请单 + * @param keyGetter 归并键提取函数 + * @return 归并键 -> 最近修改的付款申请单 */ - private Map latestPayApplyBySrcCode(List payApplies) { - Map latestBySrcCode = new HashMap<>(); + private Map latestPayApplyByKey(List payApplies, Function keyGetter) { + Map latestByKey = new HashMap<>(); for (BfiPayApplyVO payApply : payApplies) { - if (Func.isEmpty(payApply.getAwrpSrcCode())) { + String key = keyGetter.apply(payApply); + if (Func.isEmpty(key)) { continue; } - BfiPayApplyVO existing = latestBySrcCode.get(payApply.getAwrpSrcCode()); + BfiPayApplyVO existing = latestByKey.get(key); if (existing == null || this.strCompare(payApply.getModifytime(), existing.getModifytime()) > 0) { - latestBySrcCode.put(payApply.getAwrpSrcCode(), payApply); + latestByKey.put(key, payApply); } } - return latestBySrcCode; + return latestByKey; } private BfiPayApplyVO queryLatestPayApply(String paymentNo) { - return this.latestPayApplyBySrcCode(this.queryPayApplyPages(List.of(paymentNo))).get(paymentNo); + return this.latestPayApplyByKey(this.queryPayApplyPages(List.of(paymentNo)), BfiPayApplyVO::getAwrpSrcCode).get(paymentNo); } /**