From 20952db304d0f71e1ce25f3b82114bbadff1ad4a Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期五, 20 六月 2025 16:51:54 +0800
Subject: [PATCH] feat(generallibrary): 补充补卡功能

---
 generallibrary/src/main/java/com/dayu/general/view/CardRefundDialog.kt             |   76 --
 generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt           |    4 
 generallibrary/src/main/java/com/dayu/general/activity/SearchCardListActivity.kt   |   54 +
 generallibrary/src/main/AndroidManifest.xml                                        |   13 
 generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt |   16 
 generallibrary/src/main/res/layout/activity_card_replace.xml                       |  429 ++++++++++++++++++-
 generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt      |  516 +++++++++++++++++++++++
 generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt         |   38 +
 generallibrary/src/main/java/com/dayu/general/activity/CardUnlossActivity.kt       |   61 --
 generallibrary/src/main/java/com/dayu/general/activity/CardLossActivity.kt         |   60 +-
 10 files changed, 1,076 insertions(+), 191 deletions(-)

diff --git a/generallibrary/src/main/AndroidManifest.xml b/generallibrary/src/main/AndroidManifest.xml
index 3d88ae9..24cbef4 100644
--- a/generallibrary/src/main/AndroidManifest.xml
+++ b/generallibrary/src/main/AndroidManifest.xml
@@ -90,7 +90,7 @@
         <!-- 鍐欏崱鎴愬姛椤甸潰 -->
         <activity android:name=".activity.CardWriteSuccessActivity" />
         <!-- 鎸傚け椤甸潰 -->
-        <activity android:name=".activity.LossCardActivity" />
+        <activity android:name=".activity.CardLossActivity" />
         <!-- 璇诲崱椤甸潰 -->
         <activity
             android:name=".activity.CardReadActivity"
@@ -136,9 +136,18 @@
             </intent-filter>
         </activity>
         <activity
-            android:name=".activity.UnlossCardActivity"
+            android:name=".activity.CardUnlossActivity"
             android:exported="false"
             android:launchMode="singleTop"/>
+        <activity android:name=".activity.CardReplaceActivity"
+            android:exported="false"
+            android:launchMode="singleTop">
+            <intent-filter>
+                <action android:name="android.nfc.action.ACTION_NDEF_DISCOVERED" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <data android:mimeType="text/plain" />
+            </intent-filter>
+        </activity>
 
         <meta-data
             android:name="BUGLY_APP_VERSION"
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt b/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
index 8a14a09..4bf08d0 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
@@ -79,7 +79,7 @@
         // 鎸傚け鍗℃寜閽偣鍑讳簨浠�
         binding.homeLossLL.setOnClickListener {
             // 璺宠浆鍒版寕澶卞崱椤甸潰
-            val intent = Intent(context, LossCardActivity::class.java)
+            val intent = Intent(context, CardLossActivity::class.java)
             startActivity(intent)
         }
 
@@ -108,7 +108,7 @@
         }
         binding.homeReplacement.setOnClickListener {
             context?.let {
-                val intent = Intent(context, UnlossCardActivity::class.java)
+                val intent = Intent(context, CardUnlossActivity::class.java)
                 startActivity(intent)
             }
         }
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/LossCardActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardLossActivity.kt
similarity index 86%
rename from generallibrary/src/main/java/com/dayu/general/activity/LossCardActivity.kt
rename to generallibrary/src/main/java/com/dayu/general/activity/CardLossActivity.kt
index a2696e3..eb69ea2 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/LossCardActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/CardLossActivity.kt
@@ -22,7 +22,7 @@
  * Author: zuo
  * Date: 2025/6/11
  */
-class LossCardActivity : BaseActivity() {
+class CardLossActivity : BaseActivity() {
 
     var binding: ActivityCardListBinding? = null
     private var cardAdapter: CardListAdapter? = null
@@ -82,7 +82,7 @@
     private fun setupRecyclerView() {
         cardAdapter = CardListAdapter(this)
         binding?.recyclerView?.apply {
-            layoutManager = LinearLayoutManager(this@LossCardActivity)
+            layoutManager = LinearLayoutManager(this@CardLossActivity)
             adapter = cardAdapter
         }
 
@@ -96,13 +96,11 @@
                 card.cardNum.toString(),
                 card.money.toString()
             )
-            refundDialog.setOnConfirmListener {  refundAmount, remark ->
-                // TODO: 澶勭悊閫�娆鹃�昏緫
-                lossPost(card.idCard.toString())
+            refundDialog.setOnConfirmListener { _username, cardNumber, balance, refundAmount, remark ->
+                // 璋冪敤鎸傚け鎺ュ彛
+                lossPost(cardNumber, balance, refundAmount, remark)
             }
         }
-
-
     }
 
     private fun setupRefreshLayout() {
@@ -247,38 +245,56 @@
         )
     }
 
-
-    private fun lossPost(cardNumber: String) {
+    /**
+     * 鎵ц鎸傚け鎿嶄綔
+     * @param cardNumber 鍗″彿
+     * @param balance 浣欓
+     * @param refundAmount 閫�娆鹃噾棰�
+     * @param remark 澶囨敞
+     */
+    private fun lossPost(cardNumber: String, balance: String, refundAmount: String, remark: String) {
         val map = mutableMapOf<String, Any>()
 
         map["cardNum"] = cardNumber
+        
+        // 澶勭悊浣欓鏍煎紡锛屽幓闄ゅ崈浣嶅垎闅旂閫楀彿鍜�"鍏�"瀛楃
+        val balanceValue = balance.replace("鍏�", "").replace(",", "").toFloatOrNull() ?: 0f
+        map["money"] = balanceValue
+        
+        map["refund"] = refundAmount.toFloatOrNull() ?: 0f
+        map["remarks"] = remark.ifEmpty { "鎸傚け" }
         map["operator"] = BaseApplication.userId
-        ApiManager.getInstance().requestGetLoading(
+        
+        ApiManager.getInstance().requestPostLoading(
             this,
-            "/sell/card/loss",
-            SearchCardResult::class.java,
+            "terminal/card/termReportLoss",
+            ReportLossResult::class.java,
             map,
-            object : SubscriberListener<BaseResponse<SearchCardResult>>() {
-                override fun onNext(t: BaseResponse<SearchCardResult>) {
-
-
-                    if (t.success) {
-
+            object : SubscriberListener<BaseResponse<ReportLossResult>>() {
+                override fun onNext(t: BaseResponse<ReportLossResult>) {
+                    if (t.success && t.code == "0001") {
+                        ToastUtil.show("鎸傚け鎴愬姛")
+                        // 鍒锋柊鍒楄〃鏁版嵁
+                        searchCards(currentFarmerId, currentFarmerName, currentCardNumber, true)
                     } else {
-                        // 澶勭悊鎼滅储澶辫触鐨勬儏鍐�
-                        ToastUtil.show(t.msg)
+                        ToastUtil.show(t.msg ?: "鎸傚け澶辫触")
                     }
                 }
 
                 override fun onError(e: Throwable?) {
                     super.onError(e)
-                    // 瀹屾垚鍒锋柊鎴栧姞杞藉姩浣�
-                    ToastUtil.show("鎼滅储澶辫触: ${e?.message ?: "鏈煡閿欒"}")
+                    ToastUtil.show("鎸傚け澶辫触: ${e?.message ?: "缃戠粶閿欒"}")
                 }
             }
         )
     }
 
+    /**
+     * 鎸傚け鎺ュ彛杩斿洖缁撴灉
+     */
+    data class ReportLossResult(
+        val content: Boolean? = null
+    )
 
     /**
      * 瀹屾垚鍒锋柊鎴栧姞杞芥搷浣�
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt
new file mode 100644
index 0000000..2e02be0
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt
@@ -0,0 +1,516 @@
+package com.dayu.general.activity
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.util.TypedValue
+import android.view.View
+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.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.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.dayu.general.tool.CardCommon
+import com.dayu.general.tool.CardOperationType
+import com.dayu.general.tool.NfcReadHelper
+
+/**
+ * @author: zuo
+ * @desc: 琛ュ崱Activity
+ * @since: 2025/6/17
+ */
+class CardReplaceActivity : BaseNfcActivity() {
+    private lateinit var binding: ActivityCardReplaceBinding
+    private var cardNumber: String? = null
+    private var cardInfo: CardInfoResult? = null
+    private var userCard: UserCard? = null
+
+    // 鏀粯鏂瑰紡鐩稿叧灞炴��
+    private var paymentMethod: String = "鐜伴噾"
+    private var paymentId: Long = 0
+    private var paymentMethodList: List<PaymentMethod> = listOf()
+
+    companion object {
+        /**
+         * 鍚姩琛ュ崱Activity
+         */
+        fun start(context: Context) {
+            val intent = Intent(context, CardReplaceActivity::class.java)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding = ActivityCardReplaceBinding.inflate(layoutInflater)
+        setContentView(binding.root)
+
+        initView()
+        // 鑾峰彇鏀粯鏂瑰紡
+        getPaymentMethods()
+    }
+
+    private fun initView() {
+        // 璁剧疆TitleBar鐨勮繑鍥炴寜閽偣鍑讳簨浠�
+        binding.titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) {
+            finish()
+        }
+
+        // 璁剧疆琛ュ崱鎸夐挳鐐瑰嚮浜嬩欢
+        binding.btnReplace.setOnClickListener {
+            performCardReplace()
+        }
+    }
+
+    /**
+     * 鑾峰彇鏀粯鏂瑰紡鍒楄〃
+     */
+    private fun getPaymentMethods() {
+        ApiManager.getInstance().requestGetLoading(
+            this,
+            "sell/paymentmethod/get",
+            PaymentMethodResponse::class.java,
+            null,
+            object : SubscriberListener<BaseResponse<PaymentMethodResponse>>() {
+                override fun onNext(response: BaseResponse<PaymentMethodResponse>) {
+                    if (response.success) {
+                        // 鑾峰彇鏀粯鏂瑰紡鍒楄〃
+                        val paymentMethods = response.content?.obj ?: listOf()
+                        if (paymentMethods.isNotEmpty()) {
+                            paymentMethodList = paymentMethods
+                            // 鏇存柊鏀粯鏂瑰紡鏄剧ず
+                            updatePaymentMethodRadioGroup()
+                        }
+                    } else {
+                        Toast.makeText(
+                            this@CardReplaceActivity,
+                            "鑾峰彇鏀粯鏂瑰紡澶辫触: ${response.msg}",
+                            Toast.LENGTH_SHORT
+                        ).show()
+                    }
+                }
+
+                override fun onError(e: Throwable?) {
+                    super.onError(e)
+                    Toast.makeText(
+                        this@CardReplaceActivity,
+                        "鑾峰彇鏀粯鏂瑰紡澶辫触: ${e?.message ?: "缃戠粶寮傚父"}",
+                        Toast.LENGTH_SHORT
+                    ).show()
+                }
+            }
+        )
+    }
+
+    /**
+     * 鏇存柊鏀粯鏂瑰紡RadioGroup
+     */
+    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 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
+        binding.etCardCost.setText("")
+        binding.etReturnAmount.setText("0")
+    }
+
+    /**
+     * 鏄剧ず纭瀵硅瘽妗�
+     */
+    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 cardNumber = parts[0]
+            val cardType = parts[1]
+            this.cardNumber = cardNumber
+            if (cardNumber.isBlank()) {
+                showConfirmDialog("鍗″彿涓虹┖锛屾棤娉曡繘琛屾搷浣滐紝璇烽噸鏂板埛鍗�") {
+                }
+                return
+            }
+
+            // 鏍规嵁鍗$墖绫诲瀷杩涜涓嶅悓澶勭悊
+            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)
+                }
+            }
+        } catch (e: Exception) {
+            showConfirmDialog("璇诲崱寮傚父锛�${e.message}") {
+            }
+            e.printStackTrace()
+        }
+    }
+
+    /**
+     * 澶勭悊鐢ㄦ埛鍗�
+     */
+    private fun handleUserCard(cardNumber: String, cardType: String, nfcAdapter: NfcReadHelper) {
+        // 瑙f瀽鐢ㄦ埛鍗℃暟鎹�
+        val userCard = nfcAdapter.getUserCardData()
+        if (userCard == null) {
+            showConfirmDialog("瑙f瀽鍗$墖鏁版嵁澶辫触锛岃閲嶆柊鍒峰崱") {
+            }
+            return
+        }
+
+        // 杈撳嚭鐢ㄦ埛鍗″唴鎵�鏈変俊鎭埌鏃ュ織
+        android.util.Log.d("CardReplaceActivity", "=== 鐢ㄦ埛鍗′俊鎭� ===")
+        android.util.Log.d("CardReplaceActivity", "鍗″彿: $cardNumber")
+        android.util.Log.d("CardReplaceActivity", "鍗$墖绫诲瀷: $cardType")
+        android.util.Log.d("CardReplaceActivity", "鍗″唴浣欓: ${userCard.balance}")
+        android.util.Log.d("CardReplaceActivity", "==================")
+        this.userCard = userCard
+        // 鏍规嵁鍗″彿鑾峰彇鍗$墖璇︾粏淇℃伅
+        getCardInfo(cardNumber, cardType, userCard)
+    }
+
+    /**
+     * 鑾峰彇鍗$墖璇︾粏淇℃伅锛堢敤鎴峰崱涓撶敤锛�
+     */
+    private fun getCardInfo(cardNumber: String, cardType: String, userCard: UserCard) {
+        val map = mutableMapOf<String, Any>()
+        map["cardAddr"] = cardNumber
+        ApiManager.getInstance().requestGetLoading(
+            this,
+            "terminal/card/readCard",
+            CardInfoResult::class.java,
+            map,
+            object : SubscriberListener<BaseResponse<CardInfoResult>>() {
+                override fun onNext(t: BaseResponse<CardInfoResult>) {
+                    if (t.success) {
+                        // 璇诲崱鎴愬姛锛屾樉绀虹敤鎴峰崱璇︾粏淇℃伅
+                        showUserCardInfo(t.content, cardNumber, cardType, userCard)
+                    } else {
+                        // 澶勭悊鑾峰彇澶辫触鐨勬儏鍐�
+                        handleCardInfoError(t.code, t.msg)
+                    }
+                }
+
+                override fun onError(e: Throwable?) {
+                    super.onError(e)
+                    showConfirmDialog("鑾峰彇鍗′俊鎭け璐�: ${e?.message ?: "缃戠粶寮傚父锛岃妫�鏌ョ綉缁滆繛鎺�"}") {
+                    }
+                }
+            }
+        )
+    }
+
+    /**
+     * 鏄剧ず鐢ㄦ埛鍗$墖淇℃伅锛堝寘鍚崱鍐呮暟鎹拰鎺ュ彛杩斿洖鏁版嵁锛�
+     */
+    private fun showUserCardInfo(
+        cardInfo: CardInfoResult?,
+        cardNumber: String,
+        cardType: String,
+        userCard: UserCard
+    ) {
+        // 闅愯棌璇诲崱鎻愮ず锛屾樉绀轰俊鎭尯鍩熷拰搴曢儴鎸夐挳
+        binding.scrollReadCard.visibility = android.view.View.GONE
+        binding.cardInfoContainer.visibility = android.view.View.VISIBLE
+        binding.bottomButtonContainer.visibility = android.view.View.VISIBLE
+
+        this.cardInfo = cardInfo
+        
+        // 鏄剧ず褰撳墠鍗″湴鍧�
+        binding.tvCurrentCardAddress.text = cardNumber
+
+        // 鏄剧ず鏈嶅姟鍣ㄦ暟鎹�
+        cardInfo?.let { info ->
+            binding.tvUserName.text = info.userName ?: "鏈煡"
+            binding.tvPhone.text = info.phone ?: "鏈粦瀹�"
+
+            // 鏍规嵁state瀛楁鏄剧ず鐘舵��
+            val (statusText, statusColor) = when (info.state) {
+                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)
+        }
+
+        userCard.let { card ->
+            // 浣欓杞崲涓哄厓锛堝師濮嬫暟鎹彲鑳芥槸鍒嗭級
+            binding.tvCardBalance.text = MornyUtil.changeF2Y(card.balance) + "鍏�"
+        }
+    }
+
+    /**
+     * 澶勭悊鍗′俊鎭幏鍙栭敊璇�
+     */
+    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 (cardNumber.isNullOrBlank()) {
+            ToastUtil.show("鍗″彿淇℃伅寮傚父锛岃閲嶆柊鍒峰崱")
+            return
+        }
+
+        val map = mutableMapOf<String, Any>()
+        map["cardAddr"] = cardNumber!!
+        map["cardNum"] = cardInfo?.cardNum.toString()
+        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, userCard!!)
+                    } else {
+                        // 琛ュ崱澶辫触
+                        val errorMsg = if (t.msg.isNullOrBlank()) "琛ュ崱澶辫触锛岃閲嶈瘯" else t.msg
+                        showConfirmDialog("琛ュ崱澶辫触锛�$errorMsg") {
+                        }
+                    }
+                }
+
+                override fun onError(e: Throwable?) {
+                    super.onError(e)
+                    showConfirmDialog("琛ュ崱璇锋眰澶辫触: ${e?.message ?: "缃戠粶寮傚父锛岃妫�鏌ョ綉缁滆繛鎺�"}") {
+                    }
+                }
+            }
+        )
+    }
+
+    /**
+     * 璺宠浆鍒板啓鍗$晫闈㈣繘琛屽崱鍐呭鏇存柊
+     */
+    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", cardNumber)
+            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()
+    }
+} 
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/UnlossCardActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardUnlossActivity.kt
similarity index 85%
rename from generallibrary/src/main/java/com/dayu/general/activity/UnlossCardActivity.kt
rename to generallibrary/src/main/java/com/dayu/general/activity/CardUnlossActivity.kt
index fee60df..b0704ac 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/UnlossCardActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/CardUnlossActivity.kt
@@ -22,7 +22,7 @@
  * Author: zuo
  * Date: 2025/6/11
  */
-class UnlossCardActivity : BaseActivity() {
+class CardUnlossActivity : BaseActivity() {
 
     var binding: ActivityCardListBinding? = null
     private var cardAdapter: UnlossCardListAdapter? = null
@@ -88,7 +88,7 @@
     private fun setupRecyclerView() {
         cardAdapter = UnlossCardListAdapter(this)
         binding?.recyclerView?.apply {
-            layoutManager = LinearLayoutManager(this@UnlossCardActivity)
+            layoutManager = LinearLayoutManager(this@CardUnlossActivity)
             adapter = cardAdapter
         }
 
@@ -99,7 +99,8 @@
 
         // 璁剧疆琛ュ崱鎸夐挳鐐瑰嚮浜嬩欢  
         cardAdapter?.setOnReplaceClickListener { card ->
-            showReplaceConfirmDialog(card)
+
+            CardReplaceActivity.start(this)
         }
     }
 
@@ -263,26 +264,7 @@
         confirmDialog.show()
     }
 
-    /**
-     * 鏄剧ず琛ュ崱纭瀵硅瘽妗�
-     */
-    private fun showReplaceConfirmDialog(card: SearchCardResult.CardInfo) {
-        val confirmMessage = "纭瑕佽ˉ鍔炴柊鍗″悧锛焅n\n" +
-                "鍗″彿锛�${card.cardNum ?: "鏃�"}\n" +
-                "鎸佸崱浜猴細${card.clientName ?: "鏈煡"}\n" +
-                "浣欓锛�${card.money ?: "0.00"}鍏僜n\n" +
-                "琛ュ崱鍚庡皢鐢熸垚鏂扮殑鍗$墖锛屽師鍗′綔搴燂紒"
 
-        val confirmDialog = ConfirmDialog(
-            this,
-            "琛ュ崱纭",
-            confirmMessage
-        ) {
-            // 鐢ㄦ埛鐐瑰嚮纭鍚庢墽琛岃ˉ鍗℃搷浣�
-            replaceCard(card)
-        }
-        confirmDialog.show()
-    }
 
     /**
      * 瑙i櫎鎸傚け
@@ -315,41 +297,6 @@
                 override fun onError(e: Throwable?) {
                     super.onError(e)
                     ToastUtil.show("瑙i櫎鎸傚け澶辫触: ${e?.message ?: "鏈煡閿欒"}")
-                }
-            }
-        )
-    }
-
-    /**
-     * 琛ュ崱
-     */
-    private fun replaceCard(card: SearchCardResult.CardInfo) {
-        val map = mutableMapOf<String, Any>()
-        map["cardNum"] = card.cardNum.toString()
-        map["operator"] = BaseApplication.userId
-
-        ApiManager.getInstance().requestGetLoading(
-            this,
-            "/sell/card/replace",
-            SearchCardResult::class.java,
-            map,
-            object : SubscriberListener<BaseResponse<SearchCardResult>>() {
-                override fun onNext(t: BaseResponse<SearchCardResult>) {
-                    if (t.success) {
-                        ToastUtil.show("琛ュ崱鎴愬姛")
-                        // 鍒锋柊鍒楄〃
-                        currentPage = 1
-                        hasMoreData = true
-                        binding?.refreshLayout?.resetNoMoreData()
-                        searchCards(currentFarmerId, currentFarmerName, currentCardNumber, true)
-                    } else {
-                        ToastUtil.show(t.msg)
-                    }
-                }
-
-                override fun onError(e: Throwable?) {
-                    super.onError(e)
-                    ToastUtil.show("琛ュ崱澶辫触: ${e?.message ?: "鏈煡閿欒"}")
                 }
             }
         )
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt
index 5775875..3dbd8ca 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt
@@ -85,6 +85,22 @@
                 binding.successMessage.text = message
             }
 
+            CardOperationType.ReplaceCard -> {
+                // 璁剧疆鏍囬
+                binding.titleBar.setCenterText("琛ュ崱鎴愬姛")
+
+                // 璁剧疆鎴愬姛淇℃伅
+                binding.successTitle.text = "琛ュ崱鎴愬姛"
+
+                // 璁剧疆璇︾粏淇℃伅
+                val message = if (cardNumber.isNullOrBlank()) {
+                    "琛ュ崱鎿嶄綔宸叉垚鍔熷畬鎴怽n鏂板崱宸插啓鍏ユ暟鎹紝鍙甯镐娇鐢�"
+                } else {
+                    "琛ュ崱鎿嶄綔宸叉垚鍔熷畬鎴怽n鍗″彿锛�$cardNumber\n鏂板崱宸插啓鍏ユ暟鎹紝鍙甯镐娇鐢�"
+                }
+                binding.successMessage.text = message
+            }
+
             CardOperationType.Recharge -> {
                 binding.titleBar.setCenterText("鍐欏崱鎴愬姛")
                 binding.successTitle.text = "鍐欏崱鎴愬姛"
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
index a464809..1ccb366 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
@@ -44,6 +44,10 @@
     // 琛ユ墸鐩稿叧淇℃伅
     private var deductAmount = 0.0
 
+    // 琛ュ崱鐩稿叧淇℃伅
+    private var cardCost = 0.0
+    private var reissueAmount = 0.0
+
     //璁㈠崟缂栧彿
     var orderNumber = ""
     private lateinit var userCard: UserCard
@@ -80,6 +84,10 @@
 
         // 鑾峰彇琛ユ墸鐩稿叧淇℃伅
         deductAmount = intent?.getDoubleExtra("deductAmount", 0.0) ?: 0.0
+
+        // 鑾峰彇琛ュ崱鐩稿叧淇℃伅
+        cardCost = intent?.getDoubleExtra("cardCost", 0.0) ?: 0.0
+        reissueAmount = intent?.getDoubleExtra("reissueAmount", 0.0) ?: 0.0
 
         if (intent?.hasExtra("cardFee") == true) {
             cardFee = intent?.getIntExtra("cardFee", 0) ?: 0
@@ -185,8 +193,20 @@
                     binding?.cardData?.text = textData.toString()
                 }
 
+                CardOperationType.ReplaceCard -> {
+                    var textData = StringBuilder()
+                    textData.append("琛ュ崱\n")
+                    textData.append("鍗″唴浣欓锛�" + MornyUtil.changeF2Y(userCard.balance) + "鍏僜n")
+                    if (cardCost > 0) {
+                        textData.append("宸ユ湰璐癸細" + String.format("%.2f", cardCost) + "鍏僜n")
+                    }
+                    if (reissueAmount > 0) {
+                        textData.append("琛ュ崱閲戦锛�" + String.format("%.2f", reissueAmount) + "鍏�")
+                    }
+                    binding?.cardData?.text = textData.toString()
+                }
+
                 CardOperationType.CheckCard -> TODO()
-                CardOperationType.ReplaceCard -> TODO()
                 null -> TODO()
             }
         }
@@ -297,8 +317,22 @@
                     })
                 }
 
+                CardOperationType.ReplaceCard -> {
+                    nfcWreatHelper.writeUserDataAsync(userCard, object : NFCCallBack {
+                        override fun isSusses(flag: Boolean, msg: String?) {
+                            // 纭繚Toast鍦ㄤ富绾跨▼涓皟鐢�
+                            runOnUiThread {
+                                if (flag) {
+                                    postCardData(cardAddr)
+                                } else {
+                                    ToastUtil.show("琛ュ崱鍐欏崱澶辫触: ${msg ?: "鏈煡閿欒"}")
+                                }
+                            }
+                        }
+                    })
+                }
+
                 CardOperationType.CheckCard -> TODO()
-                CardOperationType.ReplaceCard -> TODO()
                 null -> TODO()
             }
         } else {
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/SearchCardListActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/SearchCardListActivity.kt
index 58f452c..8139100 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/SearchCardListActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/SearchCardListActivity.kt
@@ -90,9 +90,9 @@
                 card.cardNum.toString(),
                 card.money.toString()
             )
-            refundDialog.setOnConfirmListener {  refundAmount, remark ->
-                // TODO: 澶勭悊閫�娆鹃�昏緫
-                lossPost(card.idCard.toString())
+            refundDialog.setOnConfirmListener { _username, cardNumber, balance, refundAmount, remark ->
+                // 璋冪敤鎸傚け鎺ュ彛
+                lossPost(cardNumber, balance, refundAmount, remark)
             }
         }
 
@@ -217,38 +217,56 @@
         )
     }
 
-
-    private fun lossPost(cardNumber: String) {
+    /**
+     * 鎵ц鎸傚け鎿嶄綔
+     * @param cardNumber 鍗″彿
+     * @param balance 浣欓
+     * @param refundAmount 閫�娆鹃噾棰�
+     * @param remark 澶囨敞
+     */
+    private fun lossPost(cardNumber: String, balance: String, refundAmount: String, remark: String) {
         val map = mutableMapOf<String, Any>()
 
         map["cardNum"] = cardNumber
+        
+        // 澶勭悊浣欓鏍煎紡锛屽幓闄ゅ崈浣嶅垎闅旂閫楀彿鍜�"鍏�"瀛楃
+        val balanceValue = balance.replace("鍏�", "").replace(",", "").toFloatOrNull() ?: 0f
+        map["money"] = balanceValue
+        
+        map["refund"] = refundAmount.toFloatOrNull() ?: 0f
+        map["remarks"] = remark.ifEmpty { "鎸傚け" }
         map["operator"] = BaseApplication.userId
-        ApiManager.getInstance().requestGetLoading(
+        
+        ApiManager.getInstance().requestPostLoading(
             this,
-            "/sell/card/loss",
-            SearchCardResult::class.java,
+            "sell/card/loss",
+            ReportLossResult::class.java,
             map,
-            object : SubscriberListener<BaseResponse<SearchCardResult>>() {
-                override fun onNext(t: BaseResponse<SearchCardResult>) {
-
-
-                    if (t.success) {
-
+            object : SubscriberListener<BaseResponse<ReportLossResult>>() {
+                override fun onNext(t: BaseResponse<ReportLossResult>) {
+                    if (t.success && t.code == "0001") {
+                        ToastUtil.show("鎸傚け鎴愬姛")
+                        // 鍒锋柊鍒楄〃鏁版嵁
+                        searchCards(currentFarmerId, currentFarmerName, currentCardNumber, true)
                     } else {
-                        // 澶勭悊鎼滅储澶辫触鐨勬儏鍐�
-                        ToastUtil.show(t.msg)
+                        ToastUtil.show(t.msg ?: "鎸傚け澶辫触")
                     }
                 }
 
                 override fun onError(e: Throwable?) {
                     super.onError(e)
-                    // 瀹屾垚鍒锋柊鎴栧姞杞藉姩浣�
-                    ToastUtil.show("鎼滅储澶辫触: ${e?.message ?: "鏈煡閿欒"}")
+                    ToastUtil.show("鎸傚け澶辫触: ${e?.message ?: "缃戠粶閿欒"}")
                 }
             }
         )
     }
 
+    /**
+     * 鎸傚け鎺ュ彛杩斿洖缁撴灉
+     */
+    data class ReportLossResult(
+        val content: Boolean? = null
+    )
 
     /**
      * 瀹屾垚鍒锋柊鎴栧姞杞芥搷浣�
diff --git a/generallibrary/src/main/java/com/dayu/general/view/CardRefundDialog.kt b/generallibrary/src/main/java/com/dayu/general/view/CardRefundDialog.kt
index bb69c99..a6508be 100644
--- a/generallibrary/src/main/java/com/dayu/general/view/CardRefundDialog.kt
+++ b/generallibrary/src/main/java/com/dayu/general/view/CardRefundDialog.kt
@@ -5,21 +5,15 @@
 import android.os.Bundle
 import android.view.Gravity
 import android.view.WindowManager
-import com.dayu.baselibrary.net.subscribers.SubscriberListener
-import com.dayu.baselibrary.utils.ToastUtil
-import com.dayu.general.BaseApplication
 import com.dayu.general.R
 import com.dayu.general.databinding.DialogCardRefundBinding
-import com.dayu.general.net.ApiManager
-import com.dayu.general.net.BaseResponse
 
 /**
  *鍗$墖鎸傚け瀵硅瘽妗�
  */
 class CardRefundDialog(context: Context) : Dialog(context) {
     private var binding: DialogCardRefundBinding? = null
-    private var onConfirmListener: ((String, String) -> Unit)? = null
-    private var onSuccessListener: (() -> Unit)? = null
+    private var onConfirmListener: ((String, String, String, String, String) -> Unit)? = null
     private var username: String? = null
     private var cardNumber: String? = null
     private var balance: String? = null
@@ -47,8 +41,15 @@
             val refundAmount = binding?.etRefundAmount?.text.toString()
             val remark = binding?.etRemark?.text.toString()
 
-            // 璋冪敤鎸傚け鎺ュ彛
-            callReportLossApi(refundAmount, remark)
+            // 閫氳繃鍥炶皟灏嗘暟鎹紶閫掔粰Activity澶勭悊
+            username?.let { username ->
+                cardNumber?.let { cardNumber ->
+                    balance?.let { balance ->
+                        onConfirmListener?.invoke(username, cardNumber, balance, refundAmount, remark)
+                        dismiss()
+                    }
+                }
+            }
         }
 
         // 濡傛灉鏈夐璁剧殑鐢ㄦ埛淇℃伅锛岃缃畠浠�
@@ -80,58 +81,11 @@
         }
     }
 
-    fun setOnConfirmListener(listener: (String, String) -> Unit) {
+    /**
+     * 璁剧疆纭鐩戝惉鍣�
+     * @param listener 鍥炶皟鍑芥暟锛屽弬鏁颁负锛氱敤鎴峰悕銆佸崱鍙枫�佷綑棰濄�侀��娆鹃噾棰濄�佸娉�
+     */
+    fun setOnConfirmListener(listener: (String, String, String, String, String) -> Unit) {
         onConfirmListener = listener
     }
-
-    fun setOnSuccessListener(listener: () -> Unit) {
-        onSuccessListener = listener
-    }
-
-    /**
-     * 璋冪敤鎸傚け鎺ュ彛
-     */
-    private fun callReportLossApi(refundAmount: String, remark: String) {
-        val params = mutableMapOf<String, Any>()
-        params["cardNum"] = cardNumber ?: ""
-        
-        // 澶勭悊浣欓鏍煎紡锛屽幓闄ゅ崈浣嶅垎闅旂閫楀彿鍜�"鍏�"瀛楃
-        val balanceValue = balance?.replace("鍏�", "")?.replace(",", "")?.toFloatOrNull() ?: 0f
-        params["money"] = balanceValue
-        
-        params["refund"] = refundAmount.toFloatOrNull() ?: 0f
-        params["remarks"] = remark.ifEmpty { "鎸傚け" }
-        params["operator"] = BaseApplication.userId
-
-        ApiManager.getInstance().requestPostLoading(
-            context,
-            "terminal/card/termReportLoss",
-            ReportLossResult::class.java,
-            params,
-            object : SubscriberListener<BaseResponse<ReportLossResult>>() {
-                override fun onNext(response: BaseResponse<ReportLossResult>) {
-                    if (response.success && response.code == "0001") {
-                        ToastUtil.show("鎸傚け鎴愬姛")
-                        onConfirmListener?.invoke(refundAmount, remark)
-                        onSuccessListener?.invoke()
-                        dismiss()
-                    } else {
-                        ToastUtil.show(response.msg ?: "鎸傚け澶辫触")
-                    }
-                }
-
-                override fun onError(e: Throwable?) {
-                    super.onError(e)
-                    ToastUtil.show("鎸傚け澶辫触: ${e?.message ?: "缃戠粶閿欒"}")
-                }
-            }
-        )
-    }
-
-    /**
-     * 鎸傚け鎺ュ彛杩斿洖缁撴灉
-     */
-    data class ReportLossResult(
-        val content: Boolean? = null
-    )
 } 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/layout/activity_card_replace.xml b/generallibrary/src/main/res/layout/activity_card_replace.xml
index 9d31abe..8146c65 100644
--- a/generallibrary/src/main/res/layout/activity_card_replace.xml
+++ b/generallibrary/src/main/res/layout/activity_card_replace.xml
@@ -1,49 +1,424 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
-
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:background="@color/white"
-    android:orientation="vertical">
+    android:background="@color/base_green_bg">
 
     <com.dayu.baselibrary.view.TitleBar
         android:id="@+id/titleBar"
         android:layout_width="match_parent"
         android:layout_height="@dimen/dimen_title_height"
-        app:centerText="琛ュ崱" />
+        android:background="@color/title_bar_bg"
+        android:elevation="4dp"
+        app:centerText="琛ュ崱"
+        app:leftImage="@mipmap/icon_back" />
 
-
-
-    <FrameLayout
+    <!-- 璇诲崱鎻愮ず鍖哄煙 - 鍏ㄥ睆鏄剧ず -->
+    <ScrollView
+        android:id="@+id/scroll_read_card"
         android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1">
+        android:layout_height="match_parent"
+        android:layout_below="@+id/titleBar"
+        android:fillViewport="true"
+        android:visibility="visible">
 
-        <com.scwang.smart.refresh.layout.SmartRefreshLayout
-            android:id="@+id/refreshLayout"
+        <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:layout_below="@+id/titleBar">
+            android:orientation="vertical"
+            android:padding="16dp">
 
-            <com.scwang.smart.refresh.header.ClassicsHeader
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content" />
-
-            <androidx.recyclerview.widget.RecyclerView
-                android:id="@+id/recyclerView"
+            <LinearLayout
+                android:id="@+id/card_read_LL"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:background="@color/base_list_bg"
-                android:overScrollMode="never"
-                android:padding="10dp" />
+                android:gravity="center"
+                android:orientation="vertical">
 
-            <com.scwang.smart.refresh.footer.ClassicsFooter
+                <androidx.cardview.widget.CardView
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_marginBottom="16dp"
+                    app:cardCornerRadius="8dp"
+                    app:cardElevation="2dp">
+
+                    <RelativeLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:padding="16dp">
+
+                        <TextView
+                            android:id="@+id/tv_title"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="100dp"
+                            android:gravity="center"
+                            android:text="琛ュ崱鎿嶄綔"
+                            android:layout_marginTop="20dp"
+                            android:textColor="@color/base_blue_bg"
+                            android:textSize="@dimen/big_text_size"
+                            android:textStyle="bold" />
+
+                        <TextView
+                            android:id="@+id/tv_subtitle"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_below="@+id/tv_title"
+                            android:layout_marginBottom="20dp"
+                            android:gravity="center"
+                            android:text="璇峰皢闇�瑕佽ˉ鍔炵殑鍗$墖璐村湪璁惧涓婅繘琛岃鍙�"
+                            android:textColor="#333333"
+                            android:textSize="@dimen/text_size"
+                            android:textStyle="bold" />
+
+                        <ImageView
+                            android:id="@+id/iv_nfc"
+                            android:layout_width="120dp"
+                            android:layout_height="120dp"
+                            android:layout_below="@+id/tv_subtitle"
+                            android:layout_centerHorizontal="true"
+                            android:layout_marginBottom="20dp"
+                            android:scaleType="fitCenter"
+                            android:src="@mipmap/nfc_write" />
+
+                        <TextView
+                            android:id="@+id/tv_tip"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_below="@+id/iv_nfc"
+                            android:gravity="center"
+                            android:text="璇蜂繚鎸佹墜鎸佹満鍜屽崱鐗囦笉瑕佺Щ鍔�"
+                            android:textColor="#666666"
+                            android:textSize="@dimen/new_card_size" />
+
+                    </RelativeLayout>
+                </androidx.cardview.widget.CardView>
+            </LinearLayout>
+
+        </LinearLayout>
+    </ScrollView>
+
+    <!-- 鍗$墖淇℃伅鏄剧ず鍖哄煙 - 甯﹀浐瀹氬簳閮ㄦ寜閽� -->
+    <LinearLayout
+        android:id="@+id/card_info_container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_above="@+id/bottom_button_container"
+        android:layout_below="@+id/titleBar"
+        android:orientation="vertical"
+        android:visibility="gone">
+
+        <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1"
+            android:fillViewport="true"
+            android:padding="12dp">
+
+            <LinearLayout
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content" />
-        </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+                android:layout_height="wrap_content"
+                android:orientation="vertical">
 
+                <!-- 褰撳墠鍗″湴鍧�鏄剧ず鍖哄煙 -->
+                <androidx.cardview.widget.CardView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginBottom="12dp"
+                    app:cardCornerRadius="8dp"
+                    app:cardElevation="2dp">
 
-    </FrameLayout>
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical"
+                        android:padding="16dp">
 
-</LinearLayout> 
\ No newline at end of file
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="12dp"
+                            android:text="褰撳墠鍗″湴鍧�"
+                            android:textColor="@color/base_blue_bg"
+                            android:textSize="18sp"
+                            android:textStyle="bold" />
+
+                        <TextView
+                            android:id="@+id/tv_current_card_address"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:background="#F5F5F5"
+                            android:padding="12dp"
+                            android:text="--"
+                            android:textColor="#333333"
+                            android:textSize="16sp"
+                            android:textIsSelectable="true" />
+
+                    </LinearLayout>
+                </androidx.cardview.widget.CardView>
+
+                <!-- 鏃у崱淇℃伅鍖哄煙 -->
+                <androidx.cardview.widget.CardView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    app:cardCornerRadius="8dp"
+                    app:cardElevation="2dp">
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical"
+                        android:padding="16dp">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="12dp"
+                            android:text="鏃у崱淇℃伅"
+                            android:textColor="@color/base_blue_bg"
+                            android:textSize="18sp"
+                            android:textStyle="bold" />
+
+                        <!-- 鎸佸崱浜� -->
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="1dp"
+                            android:background="#F8F9FA"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:padding="12dp">
+
+                            <TextView
+                                android:layout_width="100dp"
+                                android:layout_height="wrap_content"
+                                android:text="鎸佸崱浜猴細"
+                                android:textColor="#333333"
+                                android:textSize="16sp"
+                                android:textStyle="bold" />
+
+                            <TextView
+                                android:id="@+id/tv_user_name"
+                                android:layout_width="0dp"
+                                android:layout_height="wrap_content"
+                                android:layout_weight="1"
+                                android:text="--"
+                                android:textColor="#666666"
+                                android:textSize="16sp" />
+                        </LinearLayout>
+
+                        <!-- 鍗$墖鐘舵�� -->
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="1dp"
+                            android:background="#FFFFFF"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:padding="12dp">
+
+                            <TextView
+                                android:layout_width="100dp"
+                                android:layout_height="wrap_content"
+                                android:text="鍗$墖鐘舵�侊細"
+                                android:textColor="#333333"
+                                android:textSize="16sp"
+                                android:textStyle="bold" />
+
+                            <TextView
+                                android:id="@+id/tv_card_status"
+                                android:layout_width="0dp"
+                                android:layout_height="wrap_content"
+                                android:layout_weight="1"
+                                android:text="姝e父"
+                                android:textColor="#4CAF50"
+                                android:textSize="16sp" />
+                        </LinearLayout>
+
+                        <!-- 鍗″唴浣欓 -->
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="1dp"
+                            android:background="#F8F9FA"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:padding="12dp">
+
+                            <TextView
+                                android:layout_width="100dp"
+                                android:layout_height="wrap_content"
+                                android:text="鍗″唴浣欓锛�"
+                                android:textColor="#333333"
+                                android:textSize="16sp"
+                                android:textStyle="bold" />
+
+                            <TextView
+                                android:id="@+id/tv_card_balance"
+                                android:layout_width="0dp"
+                                android:layout_height="wrap_content"
+                                android:layout_weight="1"
+                                android:text="0.00鍏�"
+                                android:textColor="#FF6B35"
+                                android:textSize="16sp"
+                                android:textStyle="bold" />
+                        </LinearLayout>
+
+                        <!-- 鎵嬫満鍙� -->
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:background="#FFFFFF"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:padding="12dp">
+
+                            <TextView
+                                android:layout_width="100dp"
+                                android:layout_height="wrap_content"
+                                android:text="鎵嬫満鍙凤細"
+                                android:textColor="#333333"
+                                android:textSize="16sp"
+                                android:textStyle="bold" />
+
+                            <TextView
+                                android:id="@+id/tv_phone"
+                                android:layout_width="0dp"
+                                android:layout_height="wrap_content"
+                                android:layout_weight="1"
+                                android:text="--"
+                                android:textColor="#666666"
+                                android:textSize="16sp" />
+                        </LinearLayout>
+
+                    </LinearLayout>
+                </androidx.cardview.widget.CardView>
+
+            </LinearLayout>
+        </ScrollView>
+    </LinearLayout>
+
+    <!-- 搴曢儴鎿嶄綔鍖哄煙 -->
+    <LinearLayout
+        android:id="@+id/bottom_button_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:background="#FFFFFF"
+        android:elevation="4dp"
+        android:orientation="vertical"
+        android:padding="16dp"
+        android:visibility="gone">
+
+        <!-- 鏀粯鏂瑰紡閫夋嫨鍖哄煙 -->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:layout_marginBottom="16dp">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="8dp"
+                android:text="鏀粯鏂瑰紡"
+                android:textColor="#333333"
+                android:textSize="16sp"
+                android:textStyle="bold" />
+
+            <RadioGroup
+                android:id="@+id/payment_method_group"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+                <!-- 鏀粯鏂瑰紡RadioButton灏嗗姩鎬佹坊鍔� -->
+            </RadioGroup>
+
+        </LinearLayout>
+
+        <!-- 宸ユ湰璐瑰拰杩斿洖閲戦杈撳叆鍖哄煙 -->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:layout_marginBottom="16dp">
+
+            <!-- 宸ユ湰璐硅緭鍏� -->
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:layout_marginEnd="8dp"
+                android:orientation="vertical">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginBottom="6dp"
+                    android:text="宸ユ湰璐癸紙鍏冿級"
+                    android:textColor="#333333"
+                    android:textSize="14sp"
+                    android:textStyle="bold" />
+
+                <EditText
+                    android:id="@+id/et_card_cost"
+                    android:layout_width="match_parent"
+                    android:layout_height="48dp"
+                    android:background="@drawable/edit_text_bg"
+                    android:hint="宸ユ湰璐�"
+                    android:inputType="numberDecimal"
+                    android:padding="12dp"
+                    android:text=""
+                    android:textColor="#333333"
+                    android:textColorHint="#999999"
+                    android:textSize="16sp" />
+            </LinearLayout>
+
+            <!-- 杩斿洖閲戦杈撳叆 -->
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:layout_marginStart="8dp"
+                android:orientation="vertical">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginBottom="6dp"
+                    android:text="杩斿洖閲戦锛堝厓锛�"
+                    android:textColor="#333333"
+                    android:textSize="14sp"
+                    android:textStyle="bold" />
+
+                <EditText
+                    android:id="@+id/et_return_amount"
+                    android:layout_width="match_parent"
+                    android:layout_height="48dp"
+                    android:background="@drawable/edit_text_bg"
+                    android:hint="杩斿洖閲戦"
+                    android:inputType="numberDecimal"
+                    android:padding="12dp"
+                    android:text="0"
+                    android:textColor="#333333"
+                    android:textColorHint="#999999"
+                    android:textSize="16sp" />
+            </LinearLayout>
+
+        </LinearLayout>
+
+        <!-- 琛ュ崱鎸夐挳 -->
+        <Button
+            android:id="@+id/btn_replace"
+            android:layout_width="match_parent"
+            android:layout_height="48dp"
+            android:background="@drawable/button_blue_bg"
+            android:text="纭琛ュ崱"
+            android:textColor="#FFFFFF"
+            android:textSize="@dimen/big_text_size"
+            android:textStyle="bold" />
+
+    </LinearLayout>
+
+</RelativeLayout> 
\ No newline at end of file

--
Gitblit v1.8.0