From 0faae97cd2523f840c426da68464e577e01dfa80 Mon Sep 17 00:00:00 2001
From: zuojincheng <lf_zuo@163.com>
Date: 星期一, 23 六月 2025 20:35:08 +0800
Subject: [PATCH] refactor(CardReplaceActivity): 重构补卡流程并优化界面显示- 重新设计卡片信息展示布局,增加新卡卡地址、客户编号等字段 - 优化补卡逻辑,支持通过卡号或客户编号获取卡片信息 -调整工本费和返回金额输入框位置 - 更新API调用路径,使用新的卡片查询接口

---
 generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt |  637 ++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 510 insertions(+), 127 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 fae0023..e20cec0 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt
@@ -1,173 +1,556 @@
 package com.dayu.general.activity
 
+import android.content.Context
+import android.content.Intent
 import android.os.Bundle
-import android.view.LayoutInflater
+import android.util.TypedValue
 import android.view.View
-import android.view.inputmethod.EditorInfo
-import androidx.recyclerview.widget.LinearLayoutManager
+import android.widget.RadioButton
+import android.widget.Toast
 import com.dayu.baselibrary.net.subscribers.SubscriberListener
+import com.dayu.baselibrary.utils.MornyUtil
 import com.dayu.baselibrary.utils.ToastUtil
-import com.dayu.general.adapter.CardReplaceAdapter
-import com.dayu.general.bean.net.CardReplaceInfo
-import com.dayu.general.bean.net.CardReplaceResponse
+import com.dayu.baselibrary.view.TipDialog
+import com.dayu.baselibrary.view.TitleBar
+import com.dayu.general.BaseApplication
+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
 import com.dayu.general.databinding.ActivityCardReplaceBinding
 import com.dayu.general.net.ApiManager
 import com.dayu.general.net.BaseResponse
-import com.scwang.smart.refresh.layout.api.RefreshLayout
-import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
+import com.dayu.general.tool.CardCommon
+import com.dayu.general.tool.CardOperationType
+import com.dayu.general.tool.NfcReadHelper
 
 /**
- * 鍗$墖琛ュ姙Activity
+ * @author: zuo
+ * @desc: 琛ュ崱Activity
+ * @since: 2025/6/17
  */
-class CardReplaceActivity : BaseActivity() {
-
+class CardReplaceActivity : BaseNfcActivity() {
     private lateinit var binding: ActivityCardReplaceBinding
-    private var currentCardInfo: CardReplaceInfo? = null
-    private lateinit var adapter: CardReplaceAdapter
-    
-    // 鍒嗛〉鍙傛暟
-    private var pageCurr: Int = 1
-    private val pageSize: Int = 20
-    private var hasMoreData: Boolean = true
-    
+    private var cardNumber: String? = null
+    private var cardInfo: CardInfoResult? = null
+    private var cardInfoByClient: CardInfoByClientResult? = null
+    private var userCard: UserCard? = null
+    private var cardNum: String? = null
+    private var newCardNumber: String? = null // 鏂板崱鍗″彿
+
+    // 鏀粯鏂瑰紡鐩稿叧灞炴��
+    private var paymentMethod: String = "鐜伴噾"
+    private var paymentId: Long = 0
+    private var paymentMethodList: List<PaymentMethod> = listOf()
+
+    companion object {
+        /**
+         * 鍚姩琛ュ崱Activity
+         */
+        fun start(context: Context, clientNum: String) {
+            val intent = Intent(context, CardReplaceActivity::class.java)
+            intent.putExtra("cardNum", clientNum)
+            context.startActivity(intent)
+        }
+    }
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        binding = ActivityCardReplaceBinding.inflate(LayoutInflater.from(this))
+        binding = ActivityCardReplaceBinding.inflate(layoutInflater)
         setContentView(binding.root)
-        
+
+        // 鑾峰彇浼犻�掔殑clientNum鍙傛暟
+        cardNum = intent.getStringExtra("cardNum")
+
         initView()
-        initRecyclerView()
-        setupRefreshLayout()
-        loadCardReplaceList(true)
+        // 鑾峰彇鏀粯鏂瑰紡
+        getPaymentMethods()
+
+        // 鏃犺鏄惁鏈塩lientNum锛岄兘鍏堟樉绀鸿鍗$晫闈紝绛夊緟鐢ㄦ埛鍒锋柊鍗�
+        resetToReadingState()
     }
-    
-    /**
-     * 鍒濆鍖栬鍥�
-     */
+
     private fun initView() {
-        // 鍒濆鍖栨爣棰樻爮
-        binding.titleBar.setOnItemclickListner(com.dayu.baselibrary.view.TitleBar.ClickType_LEFT_IMAGE) { 
-            finish() 
+        // 璁剧疆TitleBar鐨勮繑鍥炴寜閽偣鍑讳簨浠�
+        binding.titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) {
+            finish()
         }
-    }
-    
-    /**
-     * 鍒濆鍖朢ecyclerView
-     */
-    private fun initRecyclerView() {
-        // 鍒涘缓閫傞厤鍣�
-        adapter = CardReplaceAdapter(this)
-        
-        // 璁剧疆甯冨眬绠$悊鍣ㄥ拰閫傞厤鍣�
-        binding.recyclerView.apply {
-            layoutManager = LinearLayoutManager(this@CardReplaceActivity)
-            adapter = this@CardReplaceActivity.adapter
+
+        // 璁剧疆琛ュ崱鎸夐挳鐐瑰嚮浜嬩欢
+        binding.btnReplace.setOnClickListener {
+            performCardReplace()
         }
-        
-        // 璁剧疆鍗$墖鐐瑰嚮鐩戝惉鍣� - 鐐瑰嚮鍒楄〃椤规椂鎵ц琛ュ姙鎿嶄綔
-        adapter.setOnItemClickListener { cardInfo ->
-            currentCardInfo = cardInfo
-            // 鐩存帴鎵ц琛ュ姙鎿嶄綔
-            performCardReplace(cardInfo)
-        }
-    }
-    
-    /**
-     * 璁剧疆鍒锋柊甯冨眬
-     */
-    private fun setupRefreshLayout() {
-        binding.refreshLayout.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener {
-            override fun onRefresh(refreshLayout: RefreshLayout) {
-                // 涓嬫媺鍒锋柊锛岄噸缃〉鐮佸苟閲嶆柊鍔犺浇鏁版嵁
-                pageCurr = 1
-                hasMoreData = true
-                loadCardReplaceList(true)
-            }
-            
-            override fun onLoadMore(refreshLayout: RefreshLayout) {
-                // 涓婃媺鍔犺浇鏇村
-                if (hasMoreData) {
-                    pageCurr++
-                    loadCardReplaceList(false)
-                } else {
-                    // 娌℃湁鏇村鏁版嵁鏃讹紝缁撴潫鍔犺浇鏇村
-                    refreshLayout.finishLoadMoreWithNoMoreData()
-                }
-            }
-        })
     }
 
     /**
-     * 鍔犺浇鍙ˉ鍔炲崱鐗囧垪琛�
-     * 
-     * @param isRefresh 鏄惁涓哄埛鏂版搷浣滐紙true: 鍒锋柊锛宖alse: 鍔犺浇鏇村锛�
+     * 鑾峰彇鏀粯鏂瑰紡鍒楄〃
      */
-    private fun loadCardReplaceList(isRefresh: Boolean = true) {
-        // 鏋勫缓鏌ヨ鍙傛暟
-        val params = HashMap<String, Any>().apply {
-            put("pageCurr", pageCurr)
-            put("pageSize", pageSize)
-        }
-
-        // 璋冪敤API鏌ヨ鎸傚け鍗$墖淇℃伅
+    private fun getPaymentMethods() {
         ApiManager.getInstance().requestGetLoading(
             this,
-            "sell/clientcard/getUnreplaced",
-            CardReplaceResponse::class.java,
-            params,
-            object : SubscriberListener<BaseResponse<CardReplaceResponse>>() {
-                override fun onNext(response: BaseResponse<CardReplaceResponse>) {
-                    // 缁撴潫鍒锋柊鎴栧姞杞芥洿澶氱姸鎬�
-                    finishRefreshOrLoadMore(isRefresh)
-                    
+            "sell/paymentmethod/get",
+            PaymentMethodResponse::class.java,
+            null,
+            object : SubscriberListener<BaseResponse<PaymentMethodResponse>>() {
+                override fun onNext(response: BaseResponse<PaymentMethodResponse>) {
                     if (response.success) {
-                        val cardResponse = response.content
-                        val cardList = cardResponse?.obj ?: emptyList()
-                        
-                        // 鏇存柊鏁版嵁鍒楄〃
-                        if (isRefresh) {
-                            adapter.setData(cardList)
-                        } else {
-                            adapter.addData(cardList)
-                        }
-                        
-                        // 鍒ゆ柇鏄惁杩樻湁鏇村鏁版嵁
-                        hasMoreData = cardList.size >= pageSize
-                        if (!hasMoreData && !isRefresh) {
-                            binding.refreshLayout.finishLoadMoreWithNoMoreData()
+                        // 鑾峰彇鏀粯鏂瑰紡鍒楄〃
+                        val paymentMethods = response.content?.obj ?: listOf()
+                        if (paymentMethods.isNotEmpty()) {
+                            paymentMethodList = paymentMethods
+                            // 鏇存柊鏀粯鏂瑰紡鏄剧ず
+                            updatePaymentMethodRadioGroup()
                         }
                     } else {
-                        ToastUtil.show(response.msg)
+                        Toast.makeText(
+                            this@CardReplaceActivity,
+                            "鑾峰彇鏀粯鏂瑰紡澶辫触: ${response.msg}",
+                            Toast.LENGTH_SHORT
+                        ).show()
                     }
                 }
-                
+
                 override fun onError(e: Throwable?) {
-                    // 缁撴潫鍒锋柊鎴栧姞杞芥洿澶氱姸鎬�
-                    finishRefreshOrLoadMore(isRefresh)
-                    ToastUtil.show("鏌ヨ澶辫触: ${e?.message ?: "鏈煡閿欒"}")
+                    super.onError(e)
+                    Toast.makeText(
+                        this@CardReplaceActivity,
+                        "鑾峰彇鏀粯鏂瑰紡澶辫触: ${e?.message ?: "缃戠粶寮傚父"}",
+                        Toast.LENGTH_SHORT
+                    ).show()
                 }
             }
         )
     }
-    
+
     /**
-     * 缁撴潫鍒锋柊鎴栧姞杞芥洿澶氱姸鎬�
+     * 鏇存柊鏀粯鏂瑰紡RadioGroup
      */
-    private fun finishRefreshOrLoadMore(isRefresh: Boolean) {
-        if (isRefresh) {
-            binding.refreshLayout.finishRefresh()
-        } else {
-            binding.refreshLayout.finishLoadMore()
+    private fun updatePaymentMethodRadioGroup() {
+        // 娓呯┖鍘熸湁RadioButton
+        binding.paymentMethodGroup.removeAllViews()
+
+        // 鍔ㄦ�佹坊鍔燫adioButton
+        paymentMethodList.forEachIndexed { index, method ->
+            val radioButton = RadioButton(this)
+            radioButton.id = View.generateViewId() // 鐢熸垚鍞竴ID
+            radioButton.layoutParams = android.widget.LinearLayout.LayoutParams(
+                0,
+                resources.getDimensionPixelSize(R.dimen.dimen_40),
+                1.0f
+            )
+
+            // 濡傛灉涓嶆槸鏈�鍚庝竴涓寜閽紝娣诲姞鍙宠竟璺�
+            if (index < paymentMethodList.size - 1) {
+                (radioButton.layoutParams as android.widget.LinearLayout.LayoutParams).rightMargin =
+                    resources.getDimensionPixelSize(R.dimen.dimen_15)
+            }
+
+            radioButton.text = method.name
+            radioButton.background = resources.getDrawable(R.drawable.radio_selector)
+            radioButton.buttonDrawable = null
+            radioButton.gravity = android.view.Gravity.CENTER
+            radioButton.setTextColor(resources.getColorStateList(R.color.radio_button_text_color))
+            radioButton.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f)
+
+            // 娣诲姞鍒癛adioGroup
+            binding.paymentMethodGroup.addView(radioButton)
+
+            // 榛樿閫変腑绗竴涓�
+            if (index == 0) {
+                radioButton.isChecked = true
+                paymentMethod = method.name
+                paymentId = method.id
+            }
+        }
+
+        // 璁剧疆鏀粯鏂瑰紡閫夋嫨鐩戝惉
+        binding.paymentMethodGroup.setOnCheckedChangeListener { group, checkedId ->
+            // 鏍规嵁閫変腑鐨処D鑾峰彇鏀粯鏂瑰紡
+            for (i in 0 until group.childCount) {
+                val radioButton = group.getChildAt(i) as RadioButton
+                if (radioButton.id == checkedId) {
+                    paymentMethod = radioButton.text.toString()
+                    paymentId = paymentMethodList[i].id
+                    break
+                }
+            }
         }
     }
-    
+
     /**
-     * 鎵ц鍗$墖琛ュ姙鎿嶄綔
+     * 閲嶇疆鍒拌鍗$姸鎬�
      */
-    private fun performCardReplace(cardInfo: CardReplaceInfo) {
-        // 杩欓噷瀹炵幇鍗$墖琛ュ姙鐨勪笟鍔¢�昏緫
-        ToastUtil.show("閫夋嫨浜嗗崱鐗囪繘琛岃ˉ鍔烇細${cardInfo.cardNum}")
+    private fun resetToReadingState() {
+        binding.scrollReadCard.visibility = android.view.View.VISIBLE
+        binding.cardInfoContainer.visibility = android.view.View.GONE
+        binding.bottomButtonContainer.visibility = android.view.View.GONE
+        cardNumber = null
+        cardInfo = null
+        cardInfoByClient = null
+        newCardNumber = null
+        binding.etCardCost.setText("")
+        binding.etReturnAmount.setText("")
+    }
+
+    /**
+     * 鏄剧ず纭瀵硅瘽妗�
+     */
+    private fun showConfirmDialog(message: String, onConfirm: () -> Unit) {
+        val confirmDialog = TipDialog(this, message) {
+            onConfirm()
+        }
+        confirmDialog.show()
+    }
+
+    override fun onNfcBack(intent: Intent?) {
+        intent?.let {
+            // 澶勭悊姝e父鐨勮鍗℃搷浣�
+            handleNfcIntent(it)
+        } ?: run {
+            showConfirmDialog("NFC鏁版嵁寮傚父锛岃閲嶆柊鍒峰崱") {
+            }
+        }
+    }
+
+    /**
+     * 澶勭悊NFC鍒峰崱淇℃伅
+     */
+    private fun handleNfcIntent(intent: Intent) {
+        try {
+            // 妫�鏌ntent涓槸鍚﹀寘鍚玁FC Tag
+            if (intent.getParcelableExtra<android.nfc.Tag>(android.nfc.NfcAdapter.EXTRA_TAG) == null) {
+                showConfirmDialog("鏈娴嬪埌NFC鍗$墖锛岃纭繚鍗$墖宸叉纭斁缃�") {
+                }
+                return
+            }
+
+            val nfcAdapter = NfcReadHelper.getInstance(intent, this)
+            val cardTypeAndCardNumber = nfcAdapter.getCardTypeAndCardNumber()
+            if (cardTypeAndCardNumber.isNullOrBlank() || !cardTypeAndCardNumber.contains(",")) {
+                showConfirmDialog("鍗$墖淇℃伅璇诲彇澶辫触锛岃閲嶆柊鍒峰崱") {
+                }
+                return
+            }
+            val parts = cardTypeAndCardNumber.split(",")
+            if (parts.size < 2) {
+                showConfirmDialog("鍗$墖淇℃伅鏍煎紡寮傚父锛岃閲嶆柊鍒峰崱") {
+                }
+                return
+            }
+            val readCardNumber = parts[0]
+            val cardType = parts[1]
+
+            if (readCardNumber.isBlank()) {
+                showConfirmDialog("鍗″彿涓虹┖锛屾棤娉曡繘琛屾搷浣滐紝璇烽噸鏂板埛鍗�") {
+                }
+                return
+            }
+
+            // 淇濆瓨鏂板崱鍗″彿
+            this.newCardNumber = readCardNumber
+
+            when (cardType) {
+                "00" -> {
+                    // 鐧藉崱鎵嶅彲浠ヨˉ鍗�
+                    if (cardNum != null) {
+                        // 濡傛灉鏈塩lientNum锛屼娇鐢╟lientNum鑾峰彇鍗′俊鎭�
+                        getCardInfoByClientNum(cardNum!!)
+                    } else {
+                        showConfirmDialog("鑾峰彇鏃у崱淇℃伅鏁版嵁澶辫触") {
+                            resetToReadingState()
+                        }
+                    }
+                }
+
+                CardCommon.USER_CARD_TYPE_1,
+                CardCommon.USER_CARD_TYPE_2,
+                CardCommon.USER_CARD_TYPE_3 -> {
+                    // 鐢ㄦ埛鍗★細瑙f瀽鍗″唴鏁版嵁骞惰皟鐢ㄦ帴鍙�
+                    showConfirmDialog("鐢ㄦ埛鍗′笉鏀寔琛ュ崱") {
+                        resetToReadingState()
+                    }
+                }
+
+                else -> {
+
+                }
+            }
+
+        } catch (e: Exception) {
+            showConfirmDialog("璇诲崱寮傚父锛�${e.message}") {
+            }
+            e.printStackTrace()
+        }
+    }
+
+
+    /**
+     * 澶勭悊鍗′俊鎭幏鍙栭敊璇�
+     */
+    private fun handleCardInfoError(code: String?, msg: String?) {
+        val errorMessage: String = when (code) {
+            "1001" -> {
+                "璇ュ崱鐗囨湭鍦ㄧ郴缁熶腑娉ㄥ唽锛屾棤娉曡繘琛岃ˉ鍗℃搷浣溿��"
+            }
+
+            else -> {
+                when {
+                    msg.isNullOrBlank() -> "鑾峰彇鍗′俊鎭け璐ワ紝璇烽噸鏂板埛鍗¢噸璇曘��"
+                    msg.contains("鏁版嵁涓嶅瓨鍦�") -> "璇ュ崱鐗囨湭鍦ㄧ郴缁熶腑娉ㄥ唽锛屾棤娉曡繘琛岃ˉ鍗℃搷浣溿��"
+                    msg.contains("缃戠粶") -> "缃戠粶杩炴帴寮傚父锛岃妫�鏌ョ綉缁滆繛鎺ュ悗閲嶆柊鍒峰崱銆�"
+                    msg.contains("瓒呮椂") -> "缃戠粶璇锋眰瓒呮椂锛岃閲嶆柊鍒峰崱閲嶈瘯銆�"
+                    else -> "鑾峰彇鍗′俊鎭け璐ワ細$msg\n\n璇烽噸鏂板埛鍗¢噸璇曘��"
+                }
+            }
+        }
+
+        // 鏄剧ず閿欒淇℃伅鐨勫璇濇
+        showConfirmDialog(errorMessage) {
+            resetToReadingState()
+        }
+    }
+
+    /**
+     * 鎵ц琛ュ崱鎿嶄綔
+     */
+    private fun performCardReplace() {
+        // 楠岃瘉杈撳叆
+        val cardCostStr = binding.etCardCost.text.toString().trim()
+        val returnAmountStr = binding.etReturnAmount.text.toString().trim()
+
+        // 宸ユ湰璐归獙璇侊紙蹇呭~锛�
+        if (cardCostStr.isEmpty()) {
+            ToastUtil.show("璇疯緭鍏ュ伐鏈垂")
+            return
+        }
+
+        val cardCost = try {
+            val cost = cardCostStr.toDouble()
+            if (cost < 0) {
+                ToastUtil.show("宸ユ湰璐逛笉鑳戒负璐熸暟")
+                return
+            }
+            cost
+        } catch (e: NumberFormatException) {
+            ToastUtil.show("璇疯緭鍏ユ湁鏁堢殑宸ユ湰璐�")
+            return
+        }
+
+        // 杩斿洖閲戦楠岃瘉锛堝繀濉級
+        if (returnAmountStr.isEmpty()) {
+            ToastUtil.show("璇疯緭鍏ヨ繑鍥為噾棰�")
+            return
+        }
+
+        val returnAmount = try {
+            val amount = returnAmountStr.toDouble()
+            if (amount < 0) {
+                ToastUtil.show("杩斿洖閲戦涓嶈兘涓鸿礋鏁�")
+                return
+            }
+            amount
+        } catch (e: NumberFormatException) {
+            ToastUtil.show("璇疯緭鍏ユ湁鏁堢殑杩斿洖閲戦")
+            return
+        }
+
+        callReplaceCardApi(cardCost, returnAmount)
+    }
+
+    /**
+     * 璋冪敤琛ュ崱API鎺ュ彛
+     */
+    private fun callReplaceCardApi(cardCost: Double, returnAmount: Double) {
+        if (newCardNumber.isNullOrBlank()) {
+            ToastUtil.show("鏂板崱鍗″彿淇℃伅寮傚父锛岃閲嶆柊鍒峰崱")
+            return
+        }
+
+        val map = mutableMapOf<String, Any>()
+        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
+        map["paymentMethod"] = paymentMethod // 娣诲姞鏀粯鏂瑰紡鍚嶇О
+        map["remarks"] = "琛ュ崱鎿嶄綔"  // 鍥哄畾澶囨敞
+        map["operator"] = BaseApplication.userId
+
+        ApiManager.getInstance().requestPostLoading(
+            this,
+            "terminal/card/termReissue",
+            CardReplaceResult::class.java,
+            map,
+            object : SubscriberListener<BaseResponse<CardReplaceResult>>() {
+                override fun onNext(t: BaseResponse<CardReplaceResult>) {
+                    if (t.success && t.content != null) {
+                        // 琛ュ崱鎴愬姛锛岃烦杞埌鍐欏崱鐣岄潰
+                        startWriteCardActivity(
+                            t.content!!,
+                            cardCost,
+                            returnAmount,
+                            createUserCardFromData()
+                        )
+                    } else {
+                        // 琛ュ崱澶辫触
+                        val errorMsg = if (t.msg.isNullOrBlank()) "琛ュ崱澶辫触锛岃閲嶈瘯" else t.msg
+                        showConfirmDialog("琛ュ崱澶辫触锛�$errorMsg") {
+                        }
+                    }
+                }
+
+                override fun onError(e: Throwable?) {
+                    super.onError(e)
+                    showConfirmDialog("琛ュ崱璇锋眰澶辫触: ${e?.message ?: "缃戠粶寮傚父锛岃妫�鏌ョ綉缁滆繛鎺�"}") {
+                    }
+                }
+            }
+        )
+    }
+
+    /**
+     * 鏍规嵁鐜版湁鏁版嵁鍒涘缓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瀵硅薄
+        }
+    }
+
+    /**
+     * 璺宠浆鍒板啓鍗$晫闈㈣繘琛屽崱鍐呭鏇存柊
+     */
+    private fun startWriteCardActivity(
+        replaceResult: CardReplaceResult,
+        cardCost: Double,
+        returnAmount: Double,
+        userCard: UserCard
+    ) {
+        // 鍒涘缓鏇存柊鍚庣殑鐢ㄦ埛鍗℃暟鎹�
+        val updatedUserCard = UserCard().apply {
+            // 澶嶅埗鍘熸湁灞炴��
+            cardType = userCard.cardType
+            areaNumber = userCard.areaNumber
+            userCode = userCard.userCode
+            userCodeNumber = userCard.userCodeNumber
+            phoneNumber = userCard.phoneNumber
+            projectCode = userCard.projectCode
+            surplusWater = userCard.surplusWater
+            waterPrice = userCard.waterPrice
+            electricPrice = userCard.electricPrice
+            rechargeDate = userCard.rechargeDate
+
+            // 浣跨敤杩斿洖鐨勬柊浣欓
+            balance = MornyUtil.changeY2F(replaceResult.balance.toString())
+        }
+
+        val intent = Intent(this, NfcWreatActivity::class.java).apply {
+            putExtra("cardAddr", newCardNumber) // 浣跨敤鏂板崱鍗″彿
+            putExtra("operationTypeCode", CardOperationType.ReplaceCard.code) // 浣跨敤琛ュ崱绫诲瀷杩涜鍐欏崱
+            putExtra("orderNumber", replaceResult.orderNo)
+            putExtra("cardCost", cardCost)
+            putExtra("returnAmount", returnAmount)  // 浼犻�掕繑鍥為噾棰�
+            putExtra("paymentMethod", paymentMethod) // 浼犻�掓敮浠樻柟寮�
+            putExtra("paymentId", paymentId) // 浼犻�掓敮浠樻柟寮廔D
+            putExtra("userCard", updatedUserCard as java.io.Serializable)
+        }
+        startActivity(intent)
+        finish()
+    }
+
+    /**
+     * 鏍规嵁瀹㈡埛缂栧彿鑾峰彇鍗′俊鎭�
+     */
+    private fun getCardInfoByClientNum(cardNum: String) {
+        val map = mutableMapOf<String, Any>()
+        map["cardNum"] = cardNum
+
+        ApiManager.getInstance().requestGetLoading(
+            this,
+            "terminal/card/getcardbycardnum",
+            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 ?: ""
+
+        // 鏄剧ず鍗′俊鎭�
+        binding.tvUserName.text = cardInfo.clientName
+        binding.tvPhone.text = cardInfo.phone.toString()
         
-        // TODO: 璋冪敤琛ュ姙鍗$墖API
+        // 鏄剧ず鍗″彿
+        binding.tvCardNumber.text = cardInfo.cardNum ?: "--"
+        
+        // 鏄剧ず瀹㈡埛缂栧彿
+        binding.tvCustomerId.text = cardInfo.clientNum ?: "--"
+
+        // 鏍规嵁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