From 2b02b6e854a56a511588e4865ddf2c6597675329 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期一, 16 六月 2025 16:04:54 +0800
Subject: [PATCH] feat(nfc): 添加读卡功能并优化写卡流程

---
 generallibrary/src/main/res/layout/activity_card_read.xml                         |  375 +++++++++++++++++++++++++
 generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt               |    4 
 baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java |   41 +-
 generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt          |    3 
 generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt        |  324 +++++++++++++++++++++
 generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt  |   23 
 generallibrary/src/main/AndroidManifest.xml                                       |   13 
 baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcReadAdapter.java      |   17 
 generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt        |   30 +
 baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNfcReadHelper.java   |   12 
 10 files changed, 798 insertions(+), 44 deletions(-)

diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNfcReadHelper.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNfcReadHelper.java
index 177e0d2..681abb9 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNfcReadHelper.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNfcReadHelper.java
@@ -52,7 +52,7 @@
      * @return
      */
     public  String getCradTypeAndCardNumber(){
-        return getCradTypeAndCardNumber(1);
+        return getCradTypeAndCardNumber(1,0,0);
     };
 
     /**
@@ -60,7 +60,7 @@
      *
      * @return
      */
-    public  String getCradTypeAndCardNumber(int sectorIndex){
+    public  String getCradTypeAndCardNumber(int sectorIndex,int blockIndex,int cardTypeIndex){
         return null;
     };
 
@@ -82,12 +82,18 @@
     public abstract List<byte[]> getOnesectorData();
 
 
+    public  BaseUserCardCard getUserCardData(BaseUserCardCard userCardCard){
+        return getUserCardData(1,userCardCard);
+    };
+
     /**
      * 鍚屾鑾峰彇鐢ㄦ埛鍗′俊鎭�
      *
      * @return
      */
-    public abstract BaseUserCardCard getUserCardData(BaseUserCardCard userCardCard);
+    public  BaseUserCardCard getUserCardData(int sectorIndex,BaseUserCardCard userCardCard){
+        return null;
+    }
 
 
     public BaseManagerToUserCard getManagerToUserCardData(BaseManagerToUserCard baseManagerToUserCard) {
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
index cb24575..93ac8c3 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
@@ -53,13 +53,18 @@
         return helper;
     }
 
+
+    public BaseUserCardCard getUserCardData( BaseUserCardCard userCardCard) {
+        return getUserCardData(1, userCardCard);
+    }
+
     /**
      * 鑾峰彇鐢ㄦ埛鍗′俊鎭�
      *
      * @return
      */
     @Override
-    public BaseUserCardCard getUserCardData(BaseUserCardCard userCardCard) {
+    public BaseUserCardCard getUserCardData(int sectorIndex, BaseUserCardCard userCardCard) {
         if (userCardCard != null) {
             BaseUserCardCard userCard = null;
             Map<String, List<byte[]>> map = new HashMap<>();
@@ -68,26 +73,31 @@
                 try {
                     //閾炬帴NFC
                     mfc.connect();
-                    //鑾峰彇鎵囧尯鏁伴噺
-                    int count = mfc.getSectorCount();
-                    //瀛樺偍绌洪棿
-                    int size = mfc.getSize();
+
                     //鐢ㄤ簬鍒ゆ柇鏃跺�欐湁鍐呭璇诲彇鍑烘潵
                     boolean flag = false;
                     List<byte[]> list = new ArrayList<>();
                     //楠岃瘉鎵囧尯瀵嗙爜锛屽惁鍒欎細鎶ラ敊锛堥摼鎺ュけ璐ラ敊璇級
                     boolean isOpen = false;
-                    for (int i = 0; i < listKeyA.size(); i++) {
-                        if (mfc.authenticateSectorWithKeyA(1, listKeyA.get(i))) {
+                    if (!listKeyA.isEmpty()) {
+                        for (int i = 0; i < listKeyA.size(); i++) {
+                            if (mfc.authenticateSectorWithKeyA(sectorIndex, listKeyA.get(i))) {
+                                isOpen = true;
+                                break;
+                            }
+                        }
+                    } else if (!listA_PS.isEmpty()) {
+                        if (mfc.authenticateSectorWithKeyA(sectorIndex, defauleKey)) {
                             isOpen = true;
-                            break;
+                        } else if (mfc.authenticateSectorWithKeyA(sectorIndex, listA_PS.get(sectorIndex))) {
+                            isOpen = true;
                         }
                     }
                     if (isOpen) {
                         //鑾峰彇鎵囧尯閲岄潰鍧楃殑鏁伴噺
-                        int bCount = mfc.getBlockCountInSector(1);
+                        int bCount = mfc.getBlockCountInSector(sectorIndex);
                         //鑾峰彇鎵囧尯绗竴涓潡瀵瑰簲鑺墖瀛樺偍鍣ㄧ殑浣嶇疆锛堟垜鏄繖鏍风悊瑙g殑锛屽洜涓虹0鎵囧尯鐨勮繖涓�兼槸4鑰屼笉鏄�0锛�
-                        int bIndex = mfc.sectorToBlock(1);
+                        int bIndex = mfc.sectorToBlock(sectorIndex);
                         //String data1 = "";
                         for (int j = 0; j < bCount; j++) {
                             //璇诲彇鏁版嵁
@@ -482,7 +492,7 @@
 
     @Override
     public String getCradTypeAndCardNumber() {
-        return getCradTypeAndCardNumber(1);
+        return getCradTypeAndCardNumber(1, 0, 0);
     }
 
 
@@ -492,7 +502,7 @@
      * @return
      */
 
-    public String getCradTypeAndCardNumber(int sectorIndex) {
+    public String getCradTypeAndCardNumber(int sectorIndex, int blockIndex, int cardTypeIndex) {
 
         MifareClassic mfc = MifareClassic.get(tag);
         if (null != mfc) {
@@ -544,9 +554,9 @@
                 }
                 if (isOpen) {
                     int bIndex = mfc.sectorToBlock(sectorIndex);
-                    byte[] data = mfc.readBlock(bIndex + sectorIndex);
+                    byte[] data = mfc.readBlock(bIndex + 0);
                     if (data != null && data.length > 0) {
-                        String hex = HexUtil.byteToHex(data[0]);
+                        String hex = HexUtil.byteToHex(data[cardTypeIndex]);
                         strData.append(hex);
                         Log.i("NFCWreatActivity", "hex===" + hex);
                         return strData.toString().toUpperCase();
@@ -556,6 +566,7 @@
                     return BaseCommon.CARD_TYPE_ERROR2;
                 }
             } catch (IOException e) {
+                e.printStackTrace();
                 return BaseCommon.CARD_TYPE_ERROR1;
             } finally {
                 try {
@@ -693,8 +704,6 @@
         }
         return null;
     }
-
-
 
 
 }
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcReadAdapter.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcReadAdapter.java
index 515b27a..e3d8fbd 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcReadAdapter.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcReadAdapter.java
@@ -66,11 +66,11 @@
 
         }
     }
+
     @Override
     public String getCardNumber() {
         return getCardNumber(false);
     }
-
 
 
     public String getCardNumber(boolean isChangePS) {
@@ -101,10 +101,10 @@
     }
 
     @Override
-    public String getCradTypeAndCardNumber(int sectorIndex) {
+    public String getCradTypeAndCardNumber(int sectorIndex, int blockIndex, int cardTypeIndex) {
         switch (BaseNfcActivity.adapterType) {
             case ModelUtils.defaultType:
-                return nativeNfcReadHelper.getCradTypeAndCardNumber(sectorIndex);
+                return nativeNfcReadHelper.getCradTypeAndCardNumber(sectorIndex, blockIndex, cardTypeIndex);
         }
         return "";
     }
@@ -138,7 +138,12 @@
         return null;
     }
 
-
-
-
+    @Override
+    public BaseUserCardCard getUserCardData(int sectorIndex, BaseUserCardCard userCardCard) {
+        switch (BaseNfcActivity.adapterType) {
+            case ModelUtils.defaultType:
+                return nativeNfcReadHelper.getUserCardData(sectorIndex, userCardCard);
+        }
+        return null;
+    }
 }
diff --git a/generallibrary/src/main/AndroidManifest.xml b/generallibrary/src/main/AndroidManifest.xml
index fb429e6..910fe6a 100644
--- a/generallibrary/src/main/AndroidManifest.xml
+++ b/generallibrary/src/main/AndroidManifest.xml
@@ -92,7 +92,18 @@
         <!-- 鍐欏崱鎴愬姛椤甸潰 -->
         <activity android:name=".activity.CardWriteSuccessActivity" />
         <!-- 鎸傚け椤甸潰 -->
-        <activity android:name=".activity.LossCardActivity"/>
+        <activity android:name=".activity.LossCardActivity" />
+        <!-- 璇诲崱椤甸潰 -->
+        <activity
+            android:name=".activity.CardReadActivity"
+            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 3ed6595..7e4ffc1 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
@@ -51,6 +51,9 @@
             }
             startActivity(intent)
         }
+        binding.homeRedCard.setOnClickListener {
+            context?.let { CardReadActivity.start(it) }
+        }
     }
 }
 
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt
new file mode 100644
index 0000000..271b476
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt
@@ -0,0 +1,324 @@
+package com.dayu.general.activity
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+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.ActivityCardReadBinding
+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: 璇诲崱Activity
+ * @since: 2025/3/6
+ */
+class CardReadActivity : BaseNfcActivity() {
+    private lateinit var binding: ActivityCardReadBinding
+    private var cardNumber: String? = null
+
+    companion object {
+        /**
+         * 鍚姩璇诲崱Activity
+         */
+        fun start(context: Context) {
+            val intent = Intent(context, CardReadActivity::class.java)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding = ActivityCardReadBinding.inflate(layoutInflater)
+        setContentView(binding.root)
+        
+        initView()
+    }
+
+    private fun initView() {
+        // 璁剧疆鏍囬
+        binding.titleBar.setCenterText("璇诲崱")
+        // 璁剧疆TitleBar鐨勮繑鍥炴寜閽偣鍑讳簨浠�
+        binding.titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) {
+            finish()
+        }
+        
+
+    }
+
+    /**
+     * 閲嶇疆鍒拌鍗$姸鎬�
+     */
+    private fun resetToReadingState() {
+        binding.cardReadLL.visibility = android.view.View.VISIBLE
+        binding.cardInfoContainer.visibility = android.view.View.GONE
+        cardNumber = null
+    }
+
+    /**
+     * 鏄剧ず纭瀵硅瘽妗�
+     */
+    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 -> {
+                    // 绠$悊绫诲崱锛氭樉绀哄崱鐗囩被鍨嬩俊鎭�
+                    handleManagementCard(cardNumber, cardType)
+                }
+            }
+        } 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
+        }
+
+        // 鏍规嵁鍗″彿鑾峰彇鍗$墖璇︾粏淇℃伅
+        getCardInfo(cardNumber, cardType, userCard)
+    }
+
+    /**
+     * 澶勭悊绠$悊绫诲崱鐗�
+     */
+    private fun handleManagementCard(cardNumber: String, cardType: String) {
+        val cardTypeName = getCardTypeName(cardType)
+        
+        // 鏄剧ず绠$悊鍗′俊鎭�
+        showManagementCardInfo(cardNumber, cardTypeName)
+    }
+
+    /**
+     * 鏄剧ず绠$悊绫诲崱鐗囦俊鎭�
+     */
+    private fun showManagementCardInfo(cardNumber: String, cardTypeName: String) {
+        // 闅愯棌璇诲崱鎻愮ず锛屾樉绀轰俊鎭尯鍩�
+        binding.cardReadLL.visibility = android.view.View.GONE
+        binding.cardInfoContainer.visibility = android.view.View.VISIBLE
+        
+
+        
+        // 鏄剧ず鍩烘湰淇℃伅
+        binding.tvCardNumber.text = cardNumber
+        binding.tvCardType.text = cardTypeName
+        
+        // 闅愯棌鐢ㄦ埛鍗$壒鏈夌殑瀛楁
+        binding.llCardBalance.visibility = android.view.View.GONE
+        binding.llUserNumber.visibility = android.view.View.GONE
+        binding.llCardStatus.visibility = android.view.View.GONE
+        binding.llLastUseTime.visibility = android.view.View.GONE
+    }
+
+    /**
+     * 鑾峰彇鍗$墖绫诲瀷鍚嶇О
+     */
+    private fun getCardTypeName(cardType: String): String {
+        return when (cardType) {
+            CardCommon.USER_CARD_TYPE_1 -> "鐢ㄦ埛鍗�(寮�娉靛墠)"
+            CardCommon.USER_CARD_TYPE_2 -> "鐢ㄦ埛鍗�(寮�娉靛悗)"
+            CardCommon.USER_CARD_TYPE_3 -> "鐢ㄦ埛鍗�(鍙犲姞鍏呭��)"
+            CardCommon.REGION_CARD -> "鍖哄煙琛ㄥ彿鍗�"
+            CardCommon.ELECTRIC_PRICE_CARD -> "鍙栨暟鍗�(闇�瑕佸埛鍗″彇鏁�)"
+            CardCommon.MANAGE_CRAD -> "鍙栨暟鍗�(鍒峰崱鍙栨暟杩斿啓鎴愬姛)"
+            CardCommon.CHECK_CARD -> "妫�鏌ュ崱"
+            CardCommon.DEBUG_CARD -> "璋冭瘯鍗�"
+            CardCommon.CLEAN_CARD_TYPE -> "娓呴浂鍗�"
+            CardCommon.IP_CARD -> "IP鍦板潃璁剧疆鍗�"
+            CardCommon.AREA_CARD -> "鍖哄煙璁剧疆鍗�"
+            CardCommon.GPS_CARD -> "GPS璁剧疆鍗�"
+            CardCommon.VALVE_TIME_CARD -> "寮�鍏抽榾鏃堕棿閰嶇疆鍗�"
+            else -> "鏈煡绫诲瀷鍗$墖($cardType)"
+        }
+    }
+
+    /**
+     * 鑾峰彇鍗$墖璇︾粏淇℃伅锛堢敤鎴峰崱涓撶敤锛�
+     */
+    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
+
+        val cardTypeName = getCardTypeName(cardType)
+        
+        // 鏄剧ず鍗″唴鏁版嵁
+        binding.tvCardNumber.text = cardNumber
+        binding.tvCardType.text = cardTypeName
+        
+        // 鏄剧ず鐢ㄦ埛鍗$壒鏈夊瓧娈�
+        binding.llCardBalance.visibility = android.view.View.VISIBLE
+        binding.llUserNumber.visibility = android.view.View.VISIBLE
+        binding.llCardStatus.visibility = android.view.View.VISIBLE
+        
+        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.tvUserNumber.text = card.getMyUserCode()
+            
+            // 鍗$墖鐘舵�侊紙鍋囪姝e父鐘舵�侊紝鍥犱负UserCard涓病鏈夌姸鎬佸瓧娈碉級
+            binding.tvCardStatus.text = "姝e父"
+            binding.tvCardStatus.setTextColor(android.graphics.Color.parseColor("#4CAF50"))
+            
+            // 鍏呭�兼椂闂翠綔涓烘渶鍚庝娇鐢ㄦ椂闂�
+            if (card.rechargeDate != null) {
+                binding.llLastUseTime.visibility = android.view.View.VISIBLE
+                val dateFormat = java.text.SimpleDateFormat("yyyy-MM-dd HH:mm", java.util.Locale.getDefault())
+                binding.tvLastUseTime.text = dateFormat.format(card.rechargeDate!!.time)
+            } else {
+                binding.llLastUseTime.visibility = android.view.View.GONE
+            }
+        }
+
+        // 鏄剧ず鏈嶅姟鍣ㄦ暟鎹�
+        cardInfo?.let { info ->
+            binding.tvUserName.text = info.userName ?: "鏈煡"
+            binding.tvPhone.text = info.phone ?: "鏈粦瀹�"
+            binding.tvIdCard.text = info.userCode ?: "鏈綍鍏�"  // 浣跨敤userCode浣滀负韬唤璇佸彿鐨勬浛浠�
+
+            // 鏍规嵁status瀛楁鏄剧ず鐘舵��
+            val statusText = when (info.status) {
+                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()
+        }
+    }
+} 
\ No newline at end of file
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 dbdc7ff..e1c384c 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
@@ -30,6 +30,10 @@
     var cardType = ""
     var cardAddr = ""
     var cardFee = 0
+    
+    // 鍏呭�肩浉鍏抽噾棰�
+    private var rechargeAmount = 0.0
+    private var bonusAmount = 0.0
 
     //璁㈠崟缂栧彿
     var orderNumber = ""
@@ -53,6 +57,11 @@
         operationTypeCode = intent?.getIntExtra("operationTypeCode", -1) ?: -1
         orderNumber = intent?.getStringExtra("orderNumber") ?: ""
         operationType = CardOperationType.fromCode(operationTypeCode)
+        
+        // 鑾峰彇鍏呭�肩浉鍏抽噾棰�
+        rechargeAmount = intent?.getDoubleExtra("rechargeAmount", 0.0) ?: 0.0
+        bonusAmount = intent?.getDoubleExtra("bonusAmount", 0.0) ?: 0.0
+        
         if (intent?.hasExtra("cardFee") == true) {
             cardFee = intent?.getIntExtra("cardFee", 0) ?: 0
         }
@@ -86,12 +95,23 @@
                 CardOperationType.Recharge -> {
                     var textData = StringBuilder()
                     textData.append("鐢ㄦ埛鍏呭�糪n")
-                    textData.append("璁㈠崟鍙凤細" + orderNumber + "\n")
-                    if (userCard.balance != 0) {
-                        val balanceInYuan = userCard.balance / 100.0 // 杞崲涓哄厓
-                        textData.append("鍏呭�奸噾棰濓細" + String.format("%.2f", balanceInYuan) + "鍏�")
+                    
+                    // 鏄剧ず鍏呭�奸噾棰�
+                    if (rechargeAmount > 0) {
+                        textData.append("鍏呭�奸噾棰濓細" + String.format("%.2f", rechargeAmount) + "鍏僜n")
                     }
-
+                    
+                    // 鏄剧ず璧犻�侀噾棰�
+                    if (bonusAmount > 0) {
+                        textData.append("璧犻�侀噾棰濓細" + String.format("%.2f", bonusAmount) + "鍏僜n")
+                    }
+                    
+                    // 鏄剧ず鎬婚噾棰濓紙鍐欏叆鍗″唴鐨勬�讳綑棰濓級
+                    if (userCard.balance != 0) {
+                        val totalBalanceInYuan = userCard.balance / 100.0 // 杞崲涓哄厓
+                        textData.append("鍗″唴鎬讳綑棰濓細" + String.format("%.2f", totalBalanceInYuan) + "鍏�")
+                    }
+                    
                     binding?.cardData?.text = textData.toString()
                 }
 
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 d8d053a..bd7b9f1 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
@@ -25,6 +25,7 @@
 import com.dayu.general.databinding.ActivityRechargeDetailBinding
 import com.dayu.general.net.ApiManager
 import com.dayu.general.net.BaseResponse
+import com.dayu.general.tool.CardCommon.Companion.USER_CARD_TYPE_1
 import com.dayu.general.tool.CardOperationType
 
 class RechargeDetailActivity : AppCompatActivity() {
@@ -395,7 +396,13 @@
                 // 璁剧疆鐢ㄦ埛鍗′俊鎭�
                 cardInfo?.let { info ->
                     userCode = info.cardNum ?: ""
-                    balance = ((rechargeAmount + bonusAmount) * 100).toInt() // 杞崲涓哄垎
+                    
+                    // 璁$畻鏂颁綑棰濓細鍘熸湁浣欓 + 鍏呭�奸噾棰� + 璧犻�侀噾棰�
+                    val originalBalance = this@RechargeDetailActivity.userCard?.balance ?: 0 // 鍘熸湁浣欓锛堝垎锛�
+                    val rechargeAmountInCents = (rechargeAmount * 100).toInt() // 鍏呭�奸噾棰濊浆鍒�
+                    val bonusAmountInCents = (bonusAmount * 100).toInt() // 璧犻�侀噾棰濊浆鍒�
+                    
+                    balance = originalBalance + rechargeAmountInCents + bonusAmountInCents
                 }
                 
                 // 璁剧疆鍏朵粬蹇呰淇℃伅
@@ -406,22 +413,16 @@
 
             // 鍚姩鍐欏崱Activity
             val intent = Intent(this, NfcWreatActivity::class.java).apply {
-                putExtra("cardType", "USER_CARD") // 鐢ㄦ埛鍗$被鍨�
+                putExtra("cardType", USER_CARD_TYPE_1) // 鐢ㄦ埛鍗$被鍨�
                 putExtra("cardAddr", cardAddress)
                 putExtra("operationTypeCode", CardOperationType.Recharge.code)
                 putExtra("orderNumber", rechargeResult.orderNo)
                 putExtra("userCard", userCard)
+                putExtra("rechargeAmount", rechargeAmount) // 浼犻�掑厖鍊奸噾棰�
+                putExtra("bonusAmount", bonusAmount) // 浼犻�掕禒閫侀噾棰�
             }
-            
             startActivity(intent)
-            
-            // 鏄剧ず鎴愬姛淇℃伅
-            val formattedRecharge = String.format("%.2f", rechargeAmount)
-            val formattedBonus = String.format("%.2f", bonusAmount)
-            val formattedTotal = String.format("%.2f", rechargeAmount + bonusAmount)
-            
-            ToastUtil.show("鍏呭�艰鍗曞垱寤烘垚鍔焅n璁㈠崟鍙�: ${rechargeResult.orderNo}\n鍏呭�奸噾棰�: ${formattedRecharge}鍏僜n璧犻�侀噾棰�: ${formattedBonus}鍏僜n鎬婚噾棰�: ${formattedTotal}鍏僜n璇疯创鍗¤繘琛屽啓鍗℃搷浣�")
-            
+
         } catch (e: Exception) {
             ToastUtil.show("鍚姩鍐欏崱鐣岄潰澶辫触: ${e.message}")
         }
diff --git a/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt b/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt
index 7fc95f2..2466055 100644
--- a/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt
+++ b/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt
@@ -166,7 +166,7 @@
      */
     fun getCardTypeAndCardNumber(): String {
         return try {
-            adapter.getCradTypeAndCardNumber(7)
+            adapter.getCradTypeAndCardNumber(7,0,8)
         } catch (e: Exception) {
             e.printStackTrace()
             ""
@@ -324,7 +324,7 @@
     fun getUserCardData(): UserCard? {
         return try {
             // 鑾峰彇鍩虹鍗℃暟鎹�
-            val baseCard = adapter.getUserCardData(UserCard())
+            val baseCard = adapter.getUserCardData(7,UserCard())
             // 濡傛灉鑾峰彇鎴愬姛涓旀槸UserCard绫诲瀷锛屽垯杩斿洖
             if (baseCard is UserCard) {
                 baseCard
diff --git a/generallibrary/src/main/res/layout/activity_card_read.xml b/generallibrary/src/main/res/layout/activity_card_read.xml
new file mode 100644
index 0000000..e6ab761
--- /dev/null
+++ b/generallibrary/src/main/res/layout/activity_card_read.xml
@@ -0,0 +1,375 @@
+<?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="璇诲崱" />
+
+    <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="gone">
+
+                <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:id="@+id/text1"
+                            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="visible">
+
+                <!-- 鍗″唴鏁版嵁鍖哄煙 -->
+                <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">
+
+                        <!-- 鎸佸崱浜� -->
+                        <LinearLayout
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="2dp"
+                            android:orientation="horizontal"
+                            android:gravity="center_vertical"
+                            android:background="#F8F9FA"
+                            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:orientation="horizontal"
+                            android:gravity="center_vertical"
+                            android:background="#FFFFFF"
+                            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:orientation="horizontal"
+                            android:gravity="center_vertical"
+                            android:background="#F8F9FA"
+                            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_type"
+                                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:id="@+id/ll_card_balance"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="2dp"
+                            android:orientation="horizontal"
+                            android:visibility="visible"
+                            android:gravity="center_vertical"
+                            android:background="#FFFFFF"
+                            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:id="@+id/ll_user_number"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="2dp"
+                            android:orientation="horizontal"
+                            android:visibility="visible"
+                            android:gravity="center_vertical"
+                            android:background="#F8F9FA"
+                            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_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:orientation="horizontal"
+                            android:gravity="center_vertical"
+                            android:background="#FFFFFF"
+                            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
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="2dp"
+                            android:orientation="horizontal"
+                            android:gravity="center_vertical"
+                            android:background="#F8F9FA"
+                            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_id_card"
+                                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:id="@+id/ll_card_status"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="2dp"
+                            android:orientation="horizontal"
+                            android:visibility="visible"
+                            android:gravity="center_vertical"
+                            android:background="#FFFFFF"
+                            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:id="@+id/ll_last_use_time"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="2dp"
+                            android:orientation="horizontal"
+                            android:visibility="visible"
+                            android:gravity="center_vertical"
+                            android:background="#F8F9FA"
+                            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_last_use_time"
+                                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>
+
+
+            </LinearLayout>
+
+        </LinearLayout>
+    </ScrollView>
+
+</RelativeLayout> 
\ No newline at end of file

--
Gitblit v1.8.0