From 39a51637f5857c79fded78e7f63ef6162592f1e0 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期一, 14 九月 2026 18:27:36 +0800
Subject: [PATCH] fix(merchant): 进件后续配置不再被银行卡序列号挡住

---
 talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantSettlementService.java |   20 ++++++++++++++++----
 1 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantSettlementService.java b/talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantSettlementService.java
index 7272627..4f6e128 100644
--- a/talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantSettlementService.java
+++ b/talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantSettlementService.java
@@ -176,10 +176,13 @@
 
     private void applyOnboardingResult(String applicationNo, Long bankCardId, boolean accepted, String huifuId, String applyNo, String tokenNo, String code, String message) {
         if (accepted) {
-            boolean completed = !blank(huifuId) && !blank(tokenNo);
+            // 只要通道给了商户号就可以往下走后续配置:商户号是「这笔进件已被受理」的标志。
+            // token_no 是结算银行卡序列号,属于绑卡结果,不该当成后续配置的前置条件——
+            // 用它做闸门会让银行卡审核慢的商户连微信支付配置和业务开通都一起卡住。
+            boolean acceptedByProvider = !blank(huifuId);
             jdbc.update("update merchant_onboarding_application set status='pending', provider_huifu_id=nullif(?,''), provider_apply_no=nullif(?,''), provider_response_code=?, provider_response_message=?, reviewed_at=null, reject_reason=null where application_no=?", clean(huifuId), clean(applyNo), clean(code), clean(message), applicationNo);
-            jdbc.update("update merchant_bank_card set status=?, provider_token_no=nullif(?,''), provider_apply_no=nullif(?,''), provider_response_code=?, provider_response_message=?, reviewed_at=?, reject_reason=null where id=?", completed ? "approved" : "pending", clean(tokenNo), clean(applyNo), clean(code), clean(message), completed ? LocalDateTime.now() : null, bankCardId);
-            if (completed) continuePostOnboardingProvisioning(applicationNo);
+            jdbc.update("update merchant_bank_card set status=?, provider_token_no=nullif(?,''), provider_apply_no=nullif(?,''), provider_response_code=?, provider_response_message=?, reviewed_at=?, reject_reason=null where id=?", blank(tokenNo) ? "pending" : "approved", clean(tokenNo), clean(applyNo), clean(code), clean(message), blank(tokenNo) ? null : LocalDateTime.now(), bankCardId);
+            if (acceptedByProvider) continuePostOnboardingProvisioning(applicationNo);
         } else {
             String reason = providerReason(code, message);
             jdbc.update("update merchant_onboarding_application set status='rejected', provider_apply_no=nullif(?,''), provider_response_code=?, provider_response_message=?, reject_reason=?, reviewed_at=now() where application_no=?", clean(applyNo), clean(code), clean(message), reason, applicationNo);
@@ -387,7 +390,16 @@
         return true;
     }
 
-    private void continuePostOnboardingProvisioning(String applicationNo) {
+    /**
+     * 推进进件之后的配置:先微信小程序支付配置,再商户业务开通,两步都通过才算 approved。
+     *
+     * <p>由三种入口共用,所以是公开方法:审核结果回调、业务开通回调,以及主动轮询
+     * (本地开发没有公网 IP 时汇付的异步通知推不进来,只能主动查)。
+     *
+     * <p>本方法自身不开事务:能力快照用 {@code REQUIRES_NEW} 写,而回调路径是先
+     * {@code select ... for update} 锁行再走到这里,在事务内刷新快照会抢同一把行锁。
+     */
+    public void continuePostOnboardingProvisioning(String applicationNo) {
         List<Map<String, Object>> applications = rows("select * from merchant_onboarding_application where application_no=? limit 1 for update", applicationNo);
         if (applications.isEmpty()) return;
         Map<String, Object> application = applications.get(0);

--
Gitblit v1.7.1