From ec09d4bcd191496272099c2ab31d097ad630ee78 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期二, 17 六月 2025 11:55:04 +0800
Subject: [PATCH] feat(card): 添加销卡功能并优化卡片信息展示

---
 generallibrary/src/main/res/layout/activity_card_read.xml                        |    4 
 generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt       |    2 
 generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt |    6 
 generallibrary/src/main/AndroidManifest.xml                                      |   12 
 generallibrary/src/main/java/com/dayu/general/adapter/SearchUserListAdapter.kt   |    2 
 generallibrary/src/main/res/values/strings.xml                                   |    9 
 generallibrary/src/main/res/drawable/item_bg_selector.xml                        |   15 +
 generallibrary/src/main/res/layout/activity_card_cancel.xml                      |  365 ++++++++++++++++++++++++++++
 generallibrary/src/main/java/com/dayu/general/activity/CardCancelActivity.kt     |  357 +++++++++++++++++++++++++++
 generallibrary/src/main/java/com/dayu/general/bean/net/CardInfoResult.kt         |    2 
 10 files changed, 766 insertions(+), 8 deletions(-)

diff --git a/generallibrary/src/main/AndroidManifest.xml b/generallibrary/src/main/AndroidManifest.xml
index 910fe6a..d5b9ade 100644
--- a/generallibrary/src/main/AndroidManifest.xml
+++ b/generallibrary/src/main/AndroidManifest.xml
@@ -105,6 +105,18 @@
             </intent-filter>
         </activity>
 
+        <!-- 閿�鍗¢〉闈� -->
+        <activity
+            android:name=".activity.CardCancelActivity"
+            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"
             android:value="7.1" />
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/CardCancelActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardCancelActivity.kt
new file mode 100644
index 0000000..163990f
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/activity/CardCancelActivity.kt
@@ -0,0 +1,357 @@
+package com.dayu.general.activity
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.text.TextUtils
+import com.dayu.baselibrary.net.subscribers.SubscriberListener
+import com.dayu.baselibrary.utils.ToastUtil
+import com.dayu.baselibrary.view.TipDialog
+import com.dayu.baselibrary.view.TitleBar
+import com.dayu.general.bean.net.CardInfoResult
+import com.dayu.general.databinding.ActivityCardCancelBinding
+import com.dayu.general.net.ApiManager
+import com.dayu.general.net.BaseResponse
+import com.dayu.general.tool.NfcReadHelper
+import com.dayu.general.bean.card.UserCard
+import com.dayu.general.tool.CardCommon
+
+/**
+ * @author: zuo
+ * @desc: 閿�鍗ctivity
+ * @since: 2025/3/6
+ */
+class CardCancelActivity : BaseNfcActivity() {
+    private lateinit var binding: ActivityCardCancelBinding
+    private var cardNumber: String? = null
+    private var cardInfo: CardInfoResult? = null
+
+    companion object {
+        /**
+         * 鍚姩閿�鍗ctivity
+         */
+        fun start(context: Context) {
+            val intent = Intent(context, CardCancelActivity::class.java)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding = ActivityCardCancelBinding.inflate(layoutInflater)
+        setContentView(binding.root)
+
+        initView()
+    }
+
+    private fun initView() {
+        // 璁剧疆TitleBar鐨勮繑鍥炴寜閽偣鍑讳簨浠�
+        binding.titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) {
+            finish()
+        }
+
+        // 璁剧疆閿�鍗℃寜閽偣鍑讳簨浠�
+        binding.btnCancelCard.setOnClickListener {
+            performCardCancel()
+        }
+    }
+
+    /**
+     * 閲嶇疆鍒拌鍗$姸鎬�
+     */
+    private fun resetToReadingState() {
+        binding.cardReadLL.visibility = android.view.View.VISIBLE
+        binding.cardInfoContainer.visibility = android.view.View.GONE
+        cardNumber = null
+        cardInfo = null
+        binding.etRefundAmount.setText("")
+        binding.etRemarks.setText("")
+    }
+
+    /**
+     * 鏄剧ず纭瀵硅瘽妗�
+     */
+    private fun showConfirmDialog(message: String, onConfirm: () -> Unit) {
+        val confirmDialog = TipDialog(this, message) {
+            onConfirm()
+        }
+        confirmDialog.show()
+    }
+
+    override fun onNfcBack(intent: Intent?) {
+        intent?.let {
+            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瀽鍗″唴鏁版嵁骞惰皟鐢ㄦ帴鍙�
+                    handleUserCard(cardNumber, cardType, nfcAdapter)
+                }
+
+                else -> {
+                    // 绠$悊绫诲崱涓嶆敮鎸侀攢鍗�
+                    showConfirmDialog("璇ュ崱鐗囩被鍨嬩笉鏀寔閿�鍗℃搷浣�") {
+                        resetToReadingState()
+                    }
+                }
+            }
+        } 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("CardCancelActivity", "=== 鐢ㄦ埛鍗′俊鎭� ===")
+        android.util.Log.d("CardCancelActivity", "鍗″彿: $cardNumber")
+        android.util.Log.d("CardCancelActivity", "鍗$墖绫诲瀷: $cardType")
+        android.util.Log.d("CardCancelActivity", "鍗″唴浣欓: ${userCard.balance}")
+        android.util.Log.d("CardCancelActivity", "==================")
+
+        // 鏍规嵁鍗″彿鑾峰彇鍗$墖璇︾粏淇℃伅
+        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.cardReadLL.visibility = android.view.View.GONE
+        binding.cardInfoContainer.visibility = android.view.View.VISIBLE
+
+        this.cardInfo = cardInfo
+        binding.tvCardNumber.text = cardNumber
+
+        userCard.let { card ->
+            // 浣欓杞崲涓哄厓锛堝師濮嬫暟鎹彲鑳芥槸鍒嗭級
+            val balanceInYuan = if (card.balance > 1000) {
+                String.format("%.2f", card.balance / 100.0)
+            } else {
+                card.balance.toString()
+            }
+            binding.tvCardBalance.text = "${balanceInYuan}鍏�"
+            
+            // 榛樿閫�娆鹃噾棰濊缃负鍗″唴浣欓
+            binding.etRefundAmount.setText(balanceInYuan)
+
+            // 鍗$墖鐘舵��
+            binding.tvCardStatus.text = "姝e父"
+            binding.tvCardStatus.setTextColor(android.graphics.Color.parseColor("#4CAF50"))
+        }
+
+        // 鏄剧ず鏈嶅姟鍣ㄦ暟鎹�
+        cardInfo?.let { info ->
+            binding.tvUserName.text = info.userName ?: "鏈煡"
+            binding.tvPhone.text = info.phone ?: "鏈粦瀹�"
+
+            // 鏍规嵁status瀛楁鏄剧ず鐘舵��
+            val statusText = when (info.state) {
+                1 -> "姝e父"
+                2 -> "鎸傚け"
+                3 -> "閿佸畾"
+                else -> "鏈煡"
+            }
+        }
+    }
+
+    /**
+     * 澶勭悊鍗′俊鎭幏鍙栭敊璇�
+     */
+    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 performCardCancel() {
+        // 楠岃瘉杈撳叆
+        val refundAmountStr = binding.etRefundAmount.text.toString().trim()
+        val remarks = binding.etRemarks.text.toString().trim()
+
+        if (TextUtils.isEmpty(refundAmountStr)) {
+            ToastUtil.showToast("璇疯緭鍏ラ��娆鹃噾棰�")
+            return
+        }
+
+        val refundAmount = try {
+            refundAmountStr.toDouble()
+        } catch (e: NumberFormatException) {
+            ToastUtil.showToast("璇疯緭鍏ユ湁鏁堢殑閫�娆鹃噾棰�")
+            return
+        }
+
+        if (refundAmount < 0) {
+            ToastUtil.showToast("閫�娆鹃噾棰濅笉鑳戒负璐熸暟")
+            return
+        }
+
+        if (TextUtils.isEmpty(remarks)) {
+            ToastUtil.showToast("璇疯緭鍏ュ娉ㄤ俊鎭�")
+            return
+        }
+
+        // 纭閿�鍗�
+        showConfirmDialog(
+            "纭瑕侀攢鍗″悧锛焅n\n鍗″彿锛�${cardNumber}\n閫�娆鹃噾棰濓細${refundAmount}鍏僜n澶囨敞锛�${remarks}\n\n閿�鍗″悗姝ゅ崱灏嗘棤娉曞啀娆′娇鐢紒"
+        ) {
+            callCancelCardApi(refundAmount, remarks)
+        }
+    }
+
+    /**
+     * 璋冪敤閿�鍗PI鎺ュ彛
+     */
+    private fun callCancelCardApi(refundAmount: Double, remarks: String) {
+        if (cardNumber.isNullOrBlank()) {
+            ToastUtil.showToast("鍗″彿淇℃伅寮傚父锛岃閲嶆柊鍒峰崱")
+            return
+        }
+
+        val map = mutableMapOf<String, Any>()
+        map["cardNum"] = cardNumber!!
+        map["refund"] = (refundAmount * 100).toInt() // 杞崲涓哄垎
+        map["refundType"] = 1838466162264350700L
+        map["remarks"] = remarks
+        map["operator"] = 2024090516595200300L
+
+        ApiManager.getInstance().requestPostLoading(
+            this,
+            "terminal/card/termCancel",
+            Boolean::class.java,
+            map,
+            object : SubscriberListener<BaseResponse<Boolean>>() {
+                override fun onNext(t: BaseResponse<Boolean>) {
+                    if (t.success && t.content == true) {
+                        // 閿�鍗℃垚鍔�
+                        showConfirmDialog("閿�鍗℃垚鍔燂紒\n\n閫�娆鹃噾棰濓細${refundAmount}鍏冨凡閫�杩�") {
+                            finish()
+                        }
+                    } else {
+                        // 閿�鍗″け璐�
+                        val errorMsg = if (t.msg.isNullOrBlank()) "閿�鍗″け璐ワ紝璇烽噸璇�" else t.msg
+                        showConfirmDialog("閿�鍗″け璐ワ細$errorMsg") {
+                        }
+                    }
+                }
+
+                override fun onError(e: Throwable?) {
+                    super.onError(e)
+                    showConfirmDialog("閿�鍗¤姹傚け璐�: ${e?.message ?: "缃戠粶寮傚父锛岃妫�鏌ョ綉缁滆繛鎺�"}") {
+                    }
+                }
+            }
+        )
+    }
+} 
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt
index 069d464..07015c8 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt
@@ -307,7 +307,7 @@
             binding.tvIdCard.text = info.userCode ?: "鏈綍鍏�"  // 浣跨敤userCode浣滀负韬唤璇佸彿鐨勬浛浠�
 
             // 鏍规嵁status瀛楁鏄剧ず鐘舵��
-            val statusText = when (info.status) {
+            val statusText = when (info.state) {
                 1 -> "姝e父"
                 2 -> "鎸傚け"
                 3 -> "閿佸畾"
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
index 8ea5625..f460d84 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
@@ -267,7 +267,7 @@
             binding.redRemainderBlance.text = "$balance 鍏�"
 
             // 璁剧疆鍗$姸鎬佸拰瀵瑰簲棰滆壊
-            val cardStatus = when (info.status) {
+            val cardStatus = when (info.state) {
                 1 -> "姝e父"
                 2 -> "鎸傚け"
                 3 -> "閿佸畾"
@@ -277,7 +277,7 @@
             binding.redStatu.text = cardStatus
 
             // 鏍规嵁鍗$姸鎬佽缃笉鍚岄鑹�
-            val statusColor = when (info.status) {
+            val statusColor = when (info.state) {
                 1 -> android.graphics.Color.parseColor("#4CAF50") // 缁胯壊-姝e父
                 2 -> android.graphics.Color.parseColor("#FF9800") // 姗欒壊-鎸傚け
                 3 -> android.graphics.Color.parseColor("#F44336") // 绾㈣壊-閿佸畾
@@ -433,7 +433,7 @@
                 putExtra("bonusAmount", bonusAmount) // 浼犻�掕禒閫侀噾棰�
             }
             startActivity(intent)
-
+            finish()
         } catch (e: Exception) {
             ToastUtil.show("鍚姩鍐欏崱鐣岄潰澶辫触: ${e.message}")
         }
diff --git a/generallibrary/src/main/java/com/dayu/general/adapter/SearchUserListAdapter.kt b/generallibrary/src/main/java/com/dayu/general/adapter/SearchUserListAdapter.kt
index 5c311e0..1d1bcb7 100644
--- a/generallibrary/src/main/java/com/dayu/general/adapter/SearchUserListAdapter.kt
+++ b/generallibrary/src/main/java/com/dayu/general/adapter/SearchUserListAdapter.kt
@@ -107,7 +107,7 @@
                 val end = idCard.substring(idCard.length - 4)
                 "$start****$end"
             } else {
-                idCard ?: "鏃�"
+                "鏈綍鍏�"
             }
         }
         
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/net/CardInfoResult.kt b/generallibrary/src/main/java/com/dayu/general/bean/net/CardInfoResult.kt
index e9c544e..ca692a3 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/net/CardInfoResult.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/net/CardInfoResult.kt
@@ -12,7 +12,7 @@
     val phone: String? = null,        // 鎵嬫満鍙�
     val address: String? = null,      // 鍦板潃
     val balance: Double? = 0.0,       // 浣欓
-    val status: Int? = 0,             // 鍗$姸鎬�: 1-姝e父, 2-鎸傚け, 3-閿佸畾
+    val state: Int? = 0,             // 鍗$姸鎬�: 1-姝e父, 2-鎸傚け, 3-閿佸畾
     val createTime: String? = null,   // 鍒涘缓鏃堕棿
     val updateTime: String? = null    // 鏇存柊鏃堕棿
 ) : Serializable 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/drawable/item_bg_selector.xml b/generallibrary/src/main/res/drawable/item_bg_selector.xml
new file mode 100644
index 0000000..702d275
--- /dev/null
+++ b/generallibrary/src/main/res/drawable/item_bg_selector.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true">
+        <shape android:shape="rectangle">
+            <solid android:color="#f5f5f5" />
+            <corners android:radius="8dp" />
+        </shape>
+    </item>
+    <item>
+        <shape android:shape="rectangle">
+            <solid android:color="#fafafa" />
+            <corners android:radius="8dp" />
+        </shape>
+    </item>
+</selector> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/layout/activity_card_cancel.xml b/generallibrary/src/main/res/layout/activity_card_cancel.xml
new file mode 100644
index 0000000..31345af
--- /dev/null
+++ b/generallibrary/src/main/res/layout/activity_card_cancel.xml
@@ -0,0 +1,365 @@
+<?xml version="1.0" encoding="utf-8"?>
+<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/base_green_bg">
+
+    <com.dayu.baselibrary.view.TitleBar
+        android:id="@+id/titleBar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dimen_title_height"
+        android:background="@color/title_bar_bg"
+        android:elevation="4dp"
+        app:centerText="閿�鍗�"
+        app:leftImage="@mipmap/icon_back" />
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_below="@+id/titleBar"
+        android:fillViewport="true">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical"
+            android:padding="16dp">
+
+            <!-- 璇诲崱鎻愮ず鍖哄煙 -->
+            <LinearLayout
+                android:id="@+id/card_read_LL"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:gravity="center"
+                android:orientation="vertical"
+                android:visibility="visible">
+
+                <androidx.cardview.widget.CardView
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_marginBottom="16dp"
+                    app:cardCornerRadius="8dp"
+                    app:cardElevation="2dp">
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:gravity="center"
+                        android:orientation="vertical"
+                        android:padding="16dp">
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="16dp"
+                            android:gravity="center"
+                            android:text="閿�鍗℃搷浣�"
+                            android:textColor="@color/base_blue_bg"
+                            android:textSize="@dimen/big_text_size"
+                            android:textStyle="bold" />
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="20dp"
+                            android:gravity="center"
+                            android:text="璇峰皢闇�瑕侀攢鍗$殑鍗$墖璐村湪璁惧涓婅繘琛岃鍙�"
+                            android:textColor="#333333"
+                            android:textSize="@dimen/text_size"
+                            android:textStyle="bold" />
+
+                        <ImageView
+                            android:layout_width="120dp"
+                            android:layout_height="120dp"
+                            android:layout_gravity="center"
+                            android:layout_marginBottom="20dp"
+                            android:scaleType="fitCenter"
+                            android:src="@mipmap/nfc_write" />
+
+                        <TextView
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:gravity="center"
+                            android:text="璇蜂繚鎸佹墜鎸佹満鍜屽崱鐗囦笉瑕佺Щ鍔�"
+                            android:textColor="#666666"
+                            android:textSize="@dimen/new_card_size" />
+
+                    </LinearLayout>
+                </androidx.cardview.widget.CardView>
+            </LinearLayout>
+
+            <!-- 鍗$墖淇℃伅鏄剧ず鍖哄煙 -->
+            <LinearLayout
+                android:id="@+id/card_info_container"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:visibility="gone">
+
+                <!-- 鍗″唴鏁版嵁鍖哄煙 -->
+                <androidx.cardview.widget.CardView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginBottom="16dp"
+                    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:gravity="center"
+                            android:text="鍗$墖淇℃伅"
+                            android:textColor="@color/base_blue_bg"
+                            android:textSize="@dimen/big_text_size"
+                            android:textStyle="bold" />
+
+                        <!-- 鎸佸崱浜� -->
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="2dp"
+                            android:background="#F8F9FA"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:padding="12dp">
+
+                            <TextView
+                                android:layout_width="105dp"
+                                android:layout_height="wrap_content"
+                                android:text="鎸佸崱浜猴細"
+                                android:textColor="#333333"
+                                android:textSize="@dimen/text_size" />
+
+                            <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="@dimen/text_size" />
+                        </LinearLayout>
+
+                        <!-- 鍗″彿 -->
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="2dp"
+                            android:background="#FFFFFF"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:padding="12dp">
+
+                            <TextView
+                                android:layout_width="105dp"
+                                android:layout_height="wrap_content"
+                                android:text="鍗″湴鍧�锛�"
+                                android:textColor="#333333"
+                                android:textSize="@dimen/text_size" />
+
+                            <TextView
+                                android:id="@+id/tv_card_number"
+                                android:layout_width="0dp"
+                                android:layout_height="wrap_content"
+                                android:layout_weight="1"
+                                android:text="--"
+                                android:textColor="#666666"
+                                android:textSize="@dimen/text_size" />
+                        </LinearLayout>
+
+                        <!-- 鍗$墖鐘舵�� -->
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="2dp"
+                            android:background="#F8F9FA"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:padding="12dp">
+
+                            <TextView
+                                android:layout_width="105dp"
+                                android:layout_height="wrap_content"
+                                android:text="鍗$墖鐘舵�侊細"
+                                android:textColor="#333333"
+                                android:textSize="@dimen/text_size" />
+
+                            <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="@dimen/text_size" />
+                        </LinearLayout>
+
+                        <!-- 鍗″唴浣欓 -->
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="2dp"
+                            android:background="#FFFFFF"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:padding="12dp">
+
+                            <TextView
+                                android:layout_width="105dp"
+                                android:layout_height="wrap_content"
+                                android:text="鍗′綑棰濓細"
+                                android:textColor="#333333"
+                                android:textSize="@dimen/text_size" />
+
+                            <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="@dimen/text_size"
+                                android:textStyle="bold" />
+                        </LinearLayout>
+
+                        <!-- 鎵嬫満鍙� -->
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="2dp"
+                            android:background="#F8F9FA"
+                            android:gravity="center_vertical"
+                            android:orientation="horizontal"
+                            android:padding="12dp">
+
+                            <TextView
+                                android:layout_width="105dp"
+                                android:layout_height="wrap_content"
+                                android:text="鎵嬫満鍙凤細"
+                                android:textColor="#333333"
+                                android:textSize="@dimen/text_size" />
+
+                            <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="@dimen/text_size" />
+                        </LinearLayout>
+
+                    </LinearLayout>
+                </androidx.cardview.widget.CardView>
+
+                <!-- 閿�鍗℃搷浣滃尯鍩� -->
+                <androidx.cardview.widget.CardView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginBottom="16dp"
+                    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="16dp"
+                            android:gravity="center"
+                            android:text="閿�鍗℃搷浣�"
+                            android:textColor="@color/base_blue_bg"
+                            android:textSize="@dimen/big_text_size"
+                            android:textStyle="bold" />
+
+                        <!-- 閫�娆鹃噾棰濊緭鍏� -->
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="16dp"
+                            android:orientation="vertical">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:layout_marginBottom="8dp"
+                                android:text="閫�娆鹃噾棰濓紙鍏冿級:"
+                                android:textColor="#333333"
+                                android:textSize="@dimen/text_size"
+                                android:textStyle="bold" />
+
+                            <EditText
+                                android:id="@+id/et_refund_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:textColor="#333333"
+                                android:textColorHint="#999999"
+                                android:textSize="@dimen/text_size" />
+                        </LinearLayout>
+
+                        <!-- 澶囨敞杈撳叆 -->
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="24dp"
+                            android:orientation="vertical">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:layout_marginBottom="8dp"
+                                android:text="澶囨敞:"
+                                android:textColor="#333333"
+                                android:textSize="@dimen/text_size"
+                                android:textStyle="bold" />
+
+                            <EditText
+                                android:id="@+id/et_remarks"
+                                android:layout_width="match_parent"
+                                android:layout_height="80dp"
+                                android:background="@drawable/edit_text_bg"
+                                android:gravity="top|start"
+                                android:hint="璇疯緭鍏ラ攢鍗″娉ㄤ俊鎭�"
+                                android:inputType="textMultiLine"
+                                android:padding="12dp"
+                                android:textColor="#333333"
+                                android:textColorHint="#999999"
+                                android:textSize="@dimen/text_size" />
+                        </LinearLayout>
+
+                        <!-- 閿�鍗℃寜閽� -->
+                        <Button
+                            android:id="@+id/btn_cancel_card"
+                            android:layout_width="match_parent"
+                            android:layout_height="48dp"
+                            android:background="@drawable/button_red_bg"
+                            android:text="纭閿�鍗�"
+                            android:textColor="#FFFFFF"
+                            android:textSize="@dimen/big_text_size"
+                            android:textStyle="bold" />
+
+                    </LinearLayout>
+                </androidx.cardview.widget.CardView>
+
+            </LinearLayout>
+
+        </LinearLayout>
+    </ScrollView>
+
+</RelativeLayout> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/layout/activity_card_read.xml b/generallibrary/src/main/res/layout/activity_card_read.xml
index 2e2cf6b..5e5c589 100644
--- a/generallibrary/src/main/res/layout/activity_card_read.xml
+++ b/generallibrary/src/main/res/layout/activity_card_read.xml
@@ -250,7 +250,7 @@
                                 android:textStyle="bold" />
                         </LinearLayout>
 
-                        <!-- 鐢ㄦ埛缂栧彿 -->
+                        <!-- 鍗$紪鍙� -->
                         <LinearLayout
                             android:id="@+id/ll_user_number"
                             android:layout_width="match_parent"
@@ -265,7 +265,7 @@
                             <TextView
                                 android:layout_width="105dp"
                                 android:layout_height="wrap_content"
-                                android:text="鐢ㄦ埛缂栧彿锛�"
+                                android:text="鍗$紪鍙凤細"
                                 android:textColor="#333333"
                                 android:textSize="@dimen/text_size" />
 
diff --git a/generallibrary/src/main/res/values/strings.xml b/generallibrary/src/main/res/values/strings.xml
new file mode 100644
index 0000000..b781705
--- /dev/null
+++ b/generallibrary/src/main/res/values/strings.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- SmartRefreshLayout搴曢儴Footer鐩稿叧鏂囨湰 -->
+    <string name="srl_footer_nothing">宸插埌搴�</string>
+    <string name="srl_footer_pulling">涓婃媺鍔犺浇鏇村</string>
+    <string name="srl_footer_release">閲婃斁绔嬪嵆鍔犺浇</string>
+    <string name="srl_footer_loading">姝e湪鍔犺浇鈥�</string>
+    <string name="srl_footer_refreshing">绛夊緟澶撮儴鍒锋柊瀹屾垚鈥�</string>
+</resources> 
\ No newline at end of file

--
Gitblit v1.8.0