From 4aeb8bbb12ceb9090f070fbfab8da2b9730d377d Mon Sep 17 00:00:00 2001
From: shinnosuke <tantao@1hoper.com>
Date: 星期四, 06 八月 2026 23:33:44 +0800
Subject: [PATCH] fix(admin): 支持完整展示银行卡号 (bug #24230)

---
 talent-card-server/src/main/java/com/talentcard/server/business/admin/MerchantSettlementAdminService.java |    6 +++++-
 talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantSettlementService.java   |    4 ++--
 talent-card-server/src/main/resources/db/migration/V104__merchant_bank_card_encrypted_number.sql          |    2 ++
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/talent-card-server/src/main/java/com/talentcard/server/business/admin/MerchantSettlementAdminService.java b/talent-card-server/src/main/java/com/talentcard/server/business/admin/MerchantSettlementAdminService.java
index 9b1d3a8..7ca49ae 100644
--- a/talent-card-server/src/main/java/com/talentcard/server/business/admin/MerchantSettlementAdminService.java
+++ b/talent-card-server/src/main/java/com/talentcard/server/business/admin/MerchantSettlementAdminService.java
@@ -40,7 +40,11 @@
     @Transactional(readOnly = true)
     public PageResult<Map<String, Object>> bankCards(int page, int size, String merchantName, String contactMobile, String merchantType, String status, String startDate, String endDate) {
         PageResult<Map<String, Object>> result = page("select c.*, m.merchant_name, m.merchant_type, m.contact_mobile, s.store_name from merchant_bank_card c join merchant m on m.id = c.merchant_id join merchant_store s on s.id = c.store_id", "select count(*) from merchant_bank_card c join merchant m on m.id = c.merchant_id join merchant_store s on s.id = c.store_id", "c", page, size, merchantName, contactMobile, merchantType, status, startDate, endDate);
-        result.records().forEach(row -> row.put("cityName", bankCardCityName(row.get("cityCode"))));
+        result.records().forEach(row -> {
+            String encrypted = String.valueOf(row.remove("cardNoEncrypted"));
+            if (!encrypted.isBlank() && !"null".equals(encrypted)) row.put("cardMasked", sensitiveDataCrypto.decrypt(encrypted));
+            row.put("cityName", bankCardCityName(row.get("cityCode")));
+        });
         return result;
     }
     @Transactional(readOnly = true)
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 9fd1f29..a39890f 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
@@ -122,11 +122,11 @@
         if (!same.isEmpty()) {
             Map<String, Object> existing = same.get(0);
             if (!"rejected".equals(clean(existing.get("status")))) return bankCard(existing);
-            jdbc.update("update merchant_bank_card set status='pending', reject_reason=null, provider_token_no=null, provider_apply_no=null, provider_request_no=null, provider_response_code=null, provider_response_message=null where id=?", existing.get("id"));
+            jdbc.update("update merchant_bank_card set status='pending', card_no_encrypted=?, reject_reason=null, provider_token_no=null, provider_apply_no=null, provider_request_no=null, provider_response_code=null, provider_response_message=null where id=?", sensitiveDataCrypto.encrypt(number), existing.get("id"));
             submitBankCardToHuifu(principal, existing, number, branch);
             return bankCard(rows("select * from merchant_bank_card where id = ?", existing.get("id")).get(0));
         }
-        jdbc.update("insert into merchant_bank_card(merchant_id, store_id, bank_name, branch_name, branch_code, city_code, card_tail, card_masked, card_hash, idempotency_key) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", principal.merchantId(), principal.storeId(), clean(branch.get("bankName")), clean(branch.get("branchName")), clean(branch.get("clearingCode")), request.cityCode().trim(), number.substring(number.length() - 4), "**** **** **** " + number.substring(number.length() - 4), hash, key.trim());
+        jdbc.update("insert into merchant_bank_card(merchant_id, store_id, bank_name, branch_name, branch_code, city_code, card_tail, card_masked, card_hash, card_no_encrypted, idempotency_key) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", principal.merchantId(), principal.storeId(), clean(branch.get("bankName")), clean(branch.get("branchName")), clean(branch.get("clearingCode")), request.cityCode().trim(), number.substring(number.length() - 4), "**** **** **** " + number.substring(number.length() - 4), hash, sensitiveDataCrypto.encrypt(number), key.trim());
         Map<String, Object> card = rows("select * from merchant_bank_card where merchant_id = ? and card_hash = ?", principal.merchantId(), hash).get(0);
         submitBankCardToHuifu(principal, card, number, branch);
         return bankCard(rows("select * from merchant_bank_card where id = ?", card.get("id")).get(0));
diff --git a/talent-card-server/src/main/resources/db/migration/V104__merchant_bank_card_encrypted_number.sql b/talent-card-server/src/main/resources/db/migration/V104__merchant_bank_card_encrypted_number.sql
new file mode 100644
index 0000000..521d7e0
--- /dev/null
+++ b/talent-card-server/src/main/resources/db/migration/V104__merchant_bank_card_encrypted_number.sql
@@ -0,0 +1,2 @@
+alter table merchant_bank_card
+    add column card_no_encrypted varchar(1024) default null after card_hash;

--
Gitblit v1.7.1