diff --git a/src/main/java/com/yau/digitalrmb/shared/wallet/WalletPrerequisiteProjectionService.java b/src/main/java/com/yau/digitalrmb/shared/wallet/WalletPrerequisiteProjectionService.java index 9162bc3..dad57ca 100644 --- a/src/main/java/com/yau/digitalrmb/shared/wallet/WalletPrerequisiteProjectionService.java +++ b/src/main/java/com/yau/digitalrmb/shared/wallet/WalletPrerequisiteProjectionService.java @@ -91,9 +91,12 @@ public class WalletPrerequisiteProjectionService { Activation activation = activations.get(0); List applications = jdbc.query( - "SELECT COALESCE(account_bank,selected_bank) bank_name,bank_card_number,account_balance,wallet_type " + + "SELECT COALESCE(account_bank,selected_bank) bank_name," + + "COALESCE(NULLIF(TRIM(input_bank_card_number),''),bank_card_number) bank_card_number," + + "account_balance,wallet_type " + "FROM wallet_application WHERE user_id=? AND school_id=? AND class_id=? " + - "AND status='SUBMITTED' AND deleted=FALSE AND bank_card_number IS NOT NULL " + + "AND status='SUBMITTED' AND deleted=FALSE " + + "AND COALESCE(NULLIF(TRIM(input_bank_card_number),''),bank_card_number) IS NOT NULL " + "AND account_balance IS NOT NULL AND COALESCE(account_bank,selected_bank) IS NOT NULL " + "ORDER BY created_at DESC LIMIT 1", (rs, row) -> new Application(rs.getString("bank_name"), rs.getString("bank_card_number"), diff --git a/src/test/java/com/yau/digitalrmb/shared/wallet/WalletPrerequisiteProjectionServiceTest.java b/src/test/java/com/yau/digitalrmb/shared/wallet/WalletPrerequisiteProjectionServiceTest.java index d5ba861..38efd22 100644 --- a/src/test/java/com/yau/digitalrmb/shared/wallet/WalletPrerequisiteProjectionServiceTest.java +++ b/src/test/java/com/yau/digitalrmb/shared/wallet/WalletPrerequisiteProjectionServiceTest.java @@ -78,6 +78,31 @@ class WalletPrerequisiteProjectionServiceTest { assertThat(encrypted).isNotEqualTo(keyPair.getPrivateKey()); } + @Test + void userEnteredCardNumberTakesPrecedenceOverInvalidProfileCardNumber() { + seedCompleted(); + String enteredCardNumber = "6216610100007654321"; + jdbc.update("UPDATE wallet_application SET input_bank_card_number=?,bank_card_number=NULL WHERE user_id=?", + enteredCardNumber, SUBJECT_USER); + + service.ensureForSubject(subject()); + + assertThat(jdbc.queryForObject("SELECT card_number FROM simulated_bank_account WHERE user_id=?", + String.class, SUBJECT_USER)).isEqualTo(enteredCardNumber); + } + + @Test + void invalidEnteredAndProfileCardNumbersAreRejected() { + seedCompleted(); + jdbc.update("UPDATE wallet_application SET input_bank_card_number='',bank_card_number='123' WHERE user_id=?", + SUBJECT_USER); + + assertThatThrownBy(() -> service.ensureForSubject(subject())) + .isInstanceOf(BusinessException.class) + .hasMessageContaining("个人数字钱包开通"); + assertThat(count("simulated_bank_account", "user_id", SUBJECT_USER)).isZero(); + } + @Test void repeatedProjectionDoesNotOverwriteMutableRuntimeStateOrModuleThreeFacts() { seedCompleted(); diff --git a/src/test/resources/schema.sql b/src/test/resources/schema.sql index 5adb6e9..c16904b 100644 --- a/src/test/resources/schema.sql +++ b/src/test/resources/schema.sql @@ -536,6 +536,7 @@ CREATE TABLE IF NOT EXISTS wallet_application ( phone VARCHAR(20), input_phone VARCHAR(20), input_id_number VARCHAR(20), + input_bank_card_number VARCHAR(30), account_bank VARCHAR(100), bank_card_number VARCHAR(30), account_balance DECIMAL(20,2),