From 0ad1393b93f371b1f326d76e7681baca5fe9b0dd Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期一, 23 六月 2025 11:31:00 +0800
Subject: [PATCH] feat(card): 优化补卡流程并支持客户编号补卡

---
 generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt |  168 ++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 144 insertions(+), 24 deletions(-)

diff --git a/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt
index 2e02be0..f7c6dc0 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt
@@ -16,6 +16,7 @@
 import com.dayu.general.R
 import com.dayu.general.bean.card.UserCard
 import com.dayu.general.bean.net.CardInfoResult
+import com.dayu.general.bean.net.CardInfoByClientResult
 import com.dayu.general.bean.net.CardReplaceResult
 import com.dayu.general.bean.net.PaymentMethod
 import com.dayu.general.bean.net.PaymentMethodResponse
@@ -35,7 +36,10 @@
     private lateinit var binding: ActivityCardReplaceBinding
     private var cardNumber: String? = null
     private var cardInfo: CardInfoResult? = null
+    private var cardInfoByClient: CardInfoByClientResult? = null
     private var userCard: UserCard? = null
+    private var clientNum: String? = null
+    private var newCardNumber: String? = null // 鏂板崱鍗″彿
 
     // 鏀粯鏂瑰紡鐩稿叧灞炴��
     private var paymentMethod: String = "鐜伴噾"
@@ -46,8 +50,11 @@
         /**
          * 鍚姩琛ュ崱Activity
          */
-        fun start(context: Context) {
+        fun start(context: Context, clientNum: String? = null) {
             val intent = Intent(context, CardReplaceActivity::class.java)
+            clientNum?.let {
+                intent.putExtra("clientNum", it)
+            }
             context.startActivity(intent)
         }
     }
@@ -57,9 +64,15 @@
         binding = ActivityCardReplaceBinding.inflate(layoutInflater)
         setContentView(binding.root)
 
+        // 鑾峰彇浼犻�掔殑clientNum鍙傛暟
+        clientNum = intent.getStringExtra("clientNum")
+
         initView()
         // 鑾峰彇鏀粯鏂瑰紡
         getPaymentMethods()
+        
+        // 鏃犺鏄惁鏈塩lientNum锛岄兘鍏堟樉绀鸿鍗$晫闈紝绛夊緟鐢ㄦ埛鍒锋柊鍗�
+        resetToReadingState()
     }
 
     private fun initView() {
@@ -178,6 +191,8 @@
         binding.bottomButtonContainer.visibility = android.view.View.GONE
         cardNumber = null
         cardInfo = null
+        cardInfoByClient = null
+        newCardNumber = null
         binding.etCardCost.setText("")
         binding.etReturnAmount.setText("0")
     }
@@ -227,28 +242,37 @@
                 }
                 return
             }
-            val cardNumber = parts[0]
+            val readCardNumber = parts[0]
             val cardType = parts[1]
-            this.cardNumber = cardNumber
-            if (cardNumber.isBlank()) {
+            
+            if (readCardNumber.isBlank()) {
                 showConfirmDialog("鍗″彿涓虹┖锛屾棤娉曡繘琛屾搷浣滐紝璇烽噸鏂板埛鍗�") {
                 }
                 return
             }
 
-            // 鏍规嵁鍗$墖绫诲瀷杩涜涓嶅悓澶勭悊
-            when (cardType) {
-                CardCommon.USER_CARD_TYPE_1,
-                CardCommon.USER_CARD_TYPE_2,
-                CardCommon.USER_CARD_TYPE_3 -> {
-                    // 鐢ㄦ埛鍗★細瑙f瀽鍗″唴鏁版嵁骞惰皟鐢ㄦ帴鍙�
-                    showConfirmDialog("璇ュ崱鐗囩被鍨嬩笉鏀寔琛ュ崱鎿嶄綔") {
-                        resetToReadingState()
+            // 淇濆瓨鏂板崱鍗″彿
+            this.newCardNumber = readCardNumber
+
+            // 鏍规嵁鏄惁鏈塩lientNum鍙傛暟鍐冲畾鑾峰彇鍗′俊鎭殑鏂瑰紡
+            if (clientNum != null) {
+                // 濡傛灉鏈塩lientNum锛屼娇鐢╟lientNum鑾峰彇鍗′俊鎭�
+                getCardInfoByClientNum(clientNum!!)
+            } else {
+                // 濡傛灉娌℃湁clientNum锛屾牴鎹崱鐗囩被鍨嬭繘琛屽鐞�
+                when (cardType) {
+                    CardCommon.USER_CARD_TYPE_1,
+                    CardCommon.USER_CARD_TYPE_2,
+                    CardCommon.USER_CARD_TYPE_3 -> {
+                        // 鐢ㄦ埛鍗★細瑙f瀽鍗″唴鏁版嵁骞惰皟鐢ㄦ帴鍙�
+                        showConfirmDialog("璇ュ崱鐗囩被鍨嬩笉鏀寔琛ュ崱鎿嶄綔") {
+                            resetToReadingState()
+                        }
                     }
-                }
-                else -> {
-                    // 绠$悊绫诲崱涓嶆敮鎸佽ˉ鍗�
-                    handleUserCard(cardNumber, cardType, nfcAdapter)
+                    else -> {
+                        // 绠$悊绫诲崱涓嶆敮鎸佽ˉ鍗�
+                        handleUserCard(readCardNumber, cardType, nfcAdapter)
+                    }
                 }
             }
         } catch (e: Exception) {
@@ -327,9 +351,10 @@
         binding.bottomButtonContainer.visibility = android.view.View.VISIBLE
 
         this.cardInfo = cardInfo
+        this.cardNumber = cardNumber
         
-        // 鏄剧ず褰撳墠鍗″湴鍧�
-        binding.tvCurrentCardAddress.text = cardNumber
+        // 鏄剧ず鏂板崱鍗″彿
+        binding.tvCurrentCardAddress.text = newCardNumber ?: cardNumber
 
         // 鏄剧ず鏈嶅姟鍣ㄦ暟鎹�
         cardInfo?.let { info ->
@@ -431,14 +456,22 @@
      * 璋冪敤琛ュ崱API鎺ュ彛
      */
     private fun callReplaceCardApi(cardCost: Double, returnAmount: Double) {
-        if (cardNumber.isNullOrBlank()) {
-            ToastUtil.show("鍗″彿淇℃伅寮傚父锛岃閲嶆柊鍒峰崱")
+        if (newCardNumber.isNullOrBlank()) {
+            ToastUtil.show("鏂板崱鍗″彿淇℃伅寮傚父锛岃閲嶆柊鍒峰崱")
             return
         }
 
         val map = mutableMapOf<String, Any>()
-        map["cardAddr"] = cardNumber!!
-        map["cardNum"] = cardInfo?.cardNum.toString()
+        map["cardAddr"] = newCardNumber!! // 浣跨敤鏂板崱鍗″彿
+        
+        // 鏍规嵁鏁版嵁婧愰�夋嫨cardNum鍙傛暟
+        val cardNum = when {
+            cardInfo != null -> cardInfo!!.cardNum.toString()
+            cardInfoByClient != null -> cardInfoByClient!!.cardNum
+            else -> cardNumber ?: newCardNumber!!
+        }
+        map["cardNum"] = cardNum
+        
         map["cardCost"] = cardCost
         map["returnAmount"] = returnAmount  // 浣跨敤杩斿洖閲戦
         map["paymentId"] = paymentId // 浣跨敤閫変腑鐨勬敮浠樻柟寮廔D
@@ -455,7 +488,7 @@
                 override fun onNext(t: BaseResponse<CardReplaceResult>) {
                     if (t.success && t.content != null) {
                         // 琛ュ崱鎴愬姛锛岃烦杞埌鍐欏崱鐣岄潰
-                        startWriteCardActivity(t.content!!, cardCost, returnAmount, userCard!!)
+                        startWriteCardActivity(t.content!!, cardCost, returnAmount, createUserCardFromData())
                     } else {
                         // 琛ュ崱澶辫触
                         val errorMsg = if (t.msg.isNullOrBlank()) "琛ュ崱澶辫触锛岃閲嶈瘯" else t.msg
@@ -471,6 +504,24 @@
                 }
             }
         )
+    }
+
+    /**
+     * 鏍规嵁鐜版湁鏁版嵁鍒涘缓UserCard瀵硅薄
+     */
+    private fun createUserCardFromData(): UserCard {
+        return when {
+            userCard != null -> userCard!!
+            cardInfoByClient != null -> {
+                // 浠庢帴鍙f暟鎹垱寤篣serCard瀵硅薄
+                UserCard().apply {
+                    // 杩欓噷鍙兘闇�瑕佹牴鎹疄闄呴渶姹傝缃洿澶氬睘鎬�
+                    balance = MornyUtil.changeY2F(cardInfoByClient!!.money)
+                    phoneNumber = cardInfoByClient!!.phone.toString()
+                }
+            }
+            else -> UserCard() // 杩斿洖绌虹殑UserCard瀵硅薄
+        }
     }
 
     /**
@@ -501,7 +552,7 @@
         }
 
         val intent = Intent(this, NfcWreatActivity::class.java).apply {
-            putExtra("cardAddr", cardNumber)
+            putExtra("cardAddr", newCardNumber) // 浣跨敤鏂板崱鍗″彿
             putExtra("operationTypeCode", CardOperationType.ReplaceCard.code) // 浣跨敤琛ュ崱绫诲瀷杩涜鍐欏崱
             putExtra("orderNumber", replaceResult.orderNo)
             putExtra("cardCost", cardCost)
@@ -513,4 +564,73 @@
         startActivity(intent)
         finish()
     }
+
+    /**
+     * 鏍规嵁瀹㈡埛缂栧彿鑾峰彇鍗′俊鎭�
+     */
+    private fun getCardInfoByClientNum(clientNum: String) {
+        val map = mutableMapOf<String, Any>()
+        map["clientNum"] = clientNum
+
+        ApiManager.getInstance().requestGetLoading(
+            this,
+            "terminal/card/getcardbyclientnum",
+            CardInfoByClientResult::class.java,
+            map,
+            object : SubscriberListener<BaseResponse<CardInfoByClientResult>>() {
+                override fun onNext(t: BaseResponse<CardInfoByClientResult>) {
+                    if (t.success) {
+                        cardInfoByClient = t.content
+                        t.content?.let { cardInfo ->
+                            // 鏄剧ず鍗′俊鎭苟鍒囨崲鍒颁俊鎭樉绀虹晫闈�
+                            showCardInfoFromClient(cardInfo)
+                        }
+                    } else {
+                        showConfirmDialog("鑾峰彇鍗′俊鎭け璐ワ細${t.msg ?: "鏈煡閿欒"}") {
+                        }
+                    }
+                }
+
+                override fun onError(e: Throwable?) {
+                    super.onError(e)
+                    showConfirmDialog("鑾峰彇鍗′俊鎭け璐�: ${e?.message ?: "缃戠粶寮傚父锛岃妫�鏌ョ綉缁滆繛鎺�"}") {
+                    }
+                }
+            }
+        )
+    }
+
+    /**
+     * 鏄剧ず浠庡鎴风紪鍙锋帴鍙h幏鍙栫殑鍗′俊鎭�
+     */
+    private fun showCardInfoFromClient(cardInfo: CardInfoByClientResult) {
+        // 闅愯棌璇诲崱鎻愮ず锛屾樉绀轰俊鎭尯鍩熷拰搴曢儴鎸夐挳
+        binding.scrollReadCard.visibility = android.view.View.GONE
+        binding.cardInfoContainer.visibility = android.view.View.VISIBLE
+        binding.bottomButtonContainer.visibility = android.view.View.VISIBLE
+
+        // 鏄剧ず鏂板崱鍗″彿锛堝鏋滃凡璇诲彇鍒版柊鍗★級
+        binding.tvCurrentCardAddress.text = newCardNumber ?: cardInfo.cardNum
+        
+        // 鏄剧ず鍗′俊鎭�
+        binding.tvUserName.text = cardInfo.clientName
+        binding.tvPhone.text = cardInfo.phone.toString()
+
+        // 鏍规嵁cardState瀛楁鏄剧ず鐘舵��
+        val (statusText, statusColor) = when (cardInfo.cardState) {
+            1 -> Pair("姝e父", android.graphics.Color.parseColor("#4CAF50")) // 缁胯壊
+            2 -> Pair("宸叉敞閿�", android.graphics.Color.parseColor("#FF5722")) // 娣辨鑹�
+            3 -> Pair("宸叉寕澶�", android.graphics.Color.parseColor("#FF9800")) // 姗欒壊
+            4 -> Pair("鏃犳晥鍗$墖", android.graphics.Color.parseColor("#F44336")) // 绾㈣壊
+            else -> Pair("鏈煡鐘舵��", android.graphics.Color.parseColor("#9E9E9E")) // 鐏拌壊
+        }
+        binding.tvCardStatus.text = statusText
+        binding.tvCardStatus.setTextColor(statusColor)
+
+        // 鏄剧ず浣欓
+        binding.tvCardBalance.text = "${cardInfo.money}鍏�"
+        
+        // 璁剧疆cardNumber鐢ㄤ簬鍚庣画API璋冪敤
+        cardNumber = cardInfo.cardNum
+    }
 } 
\ No newline at end of file

--
Gitblit v1.8.0