From dd2562d8dc2b01bcdfca3152f82f09efbbd09259 Mon Sep 17 00:00:00 2001
From: zuoxiao <lf_zuo@163.com>
Date: 星期三, 25 六月 2025 19:49:48 +0800
Subject: [PATCH] fix(generallibrary): 优化卡片处理和支付方式获取逻辑- 修复地区卡处理逻辑,增加对"00"类型卡的特殊处理 - 优化用户卡数据解析和显示逻辑,提高容错性 - 改进支付方式获取方法,增加错误处理和日志记录 -调整充值接口调用参数,确保正确传递当前余额等信息- 修复 AreaCard 中 areaNumber 类型,改为字符串处理

---
 generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt         |   50 +++++-
 generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt         |  106 ++++++++++-----
 generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt   |  143 ++++++++++++++++++--
 generallibrary/src/main/java/com/dayu/general/bean/net/NewCardInfo.kt              |   16 ++
 generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt |    3 
 generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt         |   12 +
 generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt                    |   30 +++
 generallibrary/src/main/java/com/dayu/general/bean/card/AreaCard.kt                |   31 ++--
 8 files changed, 302 insertions(+), 89 deletions(-)

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 986451b..5ca214d 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt
@@ -122,6 +122,11 @@
                     handleUserCard(cardNumber, cardType, nfcAdapter)
                 }
 
+                "00" -> {
+                    // 鍦板尯鍗★細鏄剧ず鍗$墖绫诲瀷淇℃伅
+                    handleUserCard(cardNumber, cardType, nfcAdapter)
+                }
+
                 else -> {
                     // 绠$悊绫诲崱锛氭樉绀哄崱鐗囩被鍨嬩俊鎭�
                     handleManagementCard(cardNumber, cardType)
@@ -138,33 +143,39 @@
      * 澶勭悊鐢ㄦ埛鍗�
      */
     private fun handleUserCard(cardNumber: String, cardType: String, nfcAdapter: NfcReadHelper) {
-        // 瑙f瀽鐢ㄦ埛鍗℃暟鎹�
-        val userCard = nfcAdapter.getUserCardData()
-        if (userCard == null) {
-            showConfirmDialog("瑙f瀽鍗$墖鏁版嵁澶辫触锛岃閲嶆柊鍒峰崱") {
+        if (cardType != "00") {
+            // 瑙f瀽鐢ㄦ埛鍗℃暟鎹�
+            val userCard = nfcAdapter.getUserCardData()
+            if (userCard == null) {
+                showConfirmDialog("瑙f瀽鍗$墖鏁版嵁澶辫触锛岃閲嶆柊鍒峰崱") {
+                }
+                return
             }
-            return
+
+            // 杈撳嚭鐢ㄦ埛鍗″唴鎵�鏈変俊鎭埌鏃ュ織
+            android.util.Log.d("CardReadActivity", "=== 鐢ㄦ埛鍗′俊鎭� ===")
+            android.util.Log.d("CardReadActivity", "鍗″彿: $cardNumber")
+            android.util.Log.d("CardReadActivity", "鍗$墖绫诲瀷: $cardType")
+            android.util.Log.d("CardReadActivity", "鍥藉琛屾斂鍖哄煙鍙�: ${userCard.areaNumber}")
+            android.util.Log.d("CardReadActivity", "鐢ㄦ埛缂栧彿: ${userCard.userCode}")
+            android.util.Log.d("CardReadActivity", "鐢ㄦ埛鍗$紪鍙�: ${userCard.userCodeNumber}")
+            android.util.Log.d("CardReadActivity", "瀹屾暣鐢ㄦ埛缂栧彿: ${userCard.getMyUserCode()}")
+            android.util.Log.d("CardReadActivity", "鎵嬫満鍙�: ${userCard.phoneNumber}")
+            android.util.Log.d("CardReadActivity", "椤圭洰缂栫爜: ${userCard.projectCode}")
+            android.util.Log.d("CardReadActivity", "鍗″唴浣欓: ${userCard.balance}")
+            android.util.Log.d("CardReadActivity", "鍓╀綑姘撮噺: ${userCard.surplusWater}")
+            android.util.Log.d("CardReadActivity", "姘撮噺鍗曚环: ${userCard.waterPrice}")
+            android.util.Log.d("CardReadActivity", "鐢甸噺鍗曚环: ${userCard.electricPrice}")
+            android.util.Log.d("CardReadActivity", "鍏呭�兼椂闂�: ${userCard.rechargeDate}")
+            android.util.Log.d("CardReadActivity", "==================")
+            getCardInfo(cardNumber, cardType, userCard)
+        } else {
+            getCardInfo(cardNumber, cardType, null)
         }
-        binding.tvCardNumber.text = cardNumber
-        // 杈撳嚭鐢ㄦ埛鍗″唴鎵�鏈変俊鎭埌鏃ュ織
-        android.util.Log.d("CardReadActivity", "=== 鐢ㄦ埛鍗′俊鎭� ===")
-        android.util.Log.d("CardReadActivity", "鍗″彿: $cardNumber")
-        android.util.Log.d("CardReadActivity", "鍗$墖绫诲瀷: $cardType")
-        android.util.Log.d("CardReadActivity", "鍥藉琛屾斂鍖哄煙鍙�: ${userCard.areaNumber}")
-        android.util.Log.d("CardReadActivity", "鐢ㄦ埛缂栧彿: ${userCard.userCode}")
-        android.util.Log.d("CardReadActivity", "鐢ㄦ埛鍗$紪鍙�: ${userCard.userCodeNumber}")
-        android.util.Log.d("CardReadActivity", "瀹屾暣鐢ㄦ埛缂栧彿: ${userCard.getMyUserCode()}")
-        android.util.Log.d("CardReadActivity", "鎵嬫満鍙�: ${userCard.phoneNumber}")
-        android.util.Log.d("CardReadActivity", "椤圭洰缂栫爜: ${userCard.projectCode}")
-        android.util.Log.d("CardReadActivity", "鍗″唴浣欓: ${userCard.balance}")
-        android.util.Log.d("CardReadActivity", "鍓╀綑姘撮噺: ${userCard.surplusWater}")
-        android.util.Log.d("CardReadActivity", "姘撮噺鍗曚环: ${userCard.waterPrice}")
-        android.util.Log.d("CardReadActivity", "鐢甸噺鍗曚环: ${userCard.electricPrice}")
-        android.util.Log.d("CardReadActivity", "鍏呭�兼椂闂�: ${userCard.rechargeDate}")
-        android.util.Log.d("CardReadActivity", "==================")
+
 
         // 鏍规嵁鍗″彿鑾峰彇鍗$墖璇︾粏淇℃伅
-        getCardInfo(cardNumber, cardType, userCard)
+
     }
 
     /**
@@ -222,7 +233,7 @@
     /**
      * 鑾峰彇鍗$墖璇︾粏淇℃伅锛堢敤鎴峰崱涓撶敤锛�
      */
-    private fun getCardInfo(cardNumber: String, cardType: String, userCard: UserCard) {
+    private fun getCardInfo(cardNumber: String, cardType: String, userCard: UserCard?) {
         val map = mutableMapOf<String, Any>()
         map["cardAddr"] = cardNumber
         ApiManager.getInstance().requestGetLoading(
@@ -257,7 +268,7 @@
         cardInfo: CardInfoResult?,
         cardNumber: String,
         cardType: String,
-        userCard: UserCard
+        userCard: UserCard?
     ) {
         // 闅愯棌璇诲崱鎻愮ず锛屾樉绀轰俊鎭尯鍩�
         binding.cardReadLL.visibility = android.view.View.GONE
@@ -266,34 +277,49 @@
         val cardTypeName = getCardTypeName(cardType)
 
         // 鏄剧ず鍗″唴鏁版嵁
-
         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 ->
-            // 浣欓杞崲涓哄厓锛堝師濮嬫暟鎹彲鑳芥槸鍒嗭級
-
-            binding.tvCardBalance.text = MornyUtil.changeF2Y(card.balance.toInt()) + "鍏�"
-
-            // 浣跨敤瀹屾暣鐨勭敤鎴风紪鍙�
-            binding.tvUserNumber.text = cardInfo?.cardNum
+        binding.tvCardNumber.text = cardNumber
+        // 澶勭悊鍗″唴鏁版嵁 - 浼樺厛浣跨敤userCard锛屽鏋滀负绌哄垯浠巆ardInfo鑾峰彇
+        if (userCard != null) {
+            // 浠庡崱鍐呮暟鎹幏鍙栦俊鎭�
+            binding.tvCardBalance.text = MornyUtil.changeF2Y(userCard.balance.toInt()) + "鍏�"
 
             // 鍏呭�兼椂闂翠綔涓烘渶鍚庝娇鐢ㄦ椂闂�
-            if (card.rechargeDate != null) {
+            val rechargeDate = userCard.rechargeDate
+            if (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)
+                binding.tvLastUseTime.text = dateFormat.format(rechargeDate.time)
             } else {
+                binding.llLastUseTime.visibility = android.view.View.GONE
+            }
+        } else {
+            // userCard涓虹┖鏃讹紝浠巆ardInfo鑾峰彇鏁版嵁
+            cardInfo?.let { info ->
+                // 浠庢帴鍙h繑鍥炵殑鏁版嵁涓幏鍙栦綑棰濓紝杞崲涓烘纭殑绫诲瀷
+                val balance = info.balance ?: 0.0
+                binding.tvCardBalance.text = MornyUtil.changeF2Y((balance * 100).toInt()) + "鍏�"
+
+                // 濡傛灉cardInfo涓湁鏈�鍚庝娇鐢ㄦ椂闂寸浉鍏冲瓧娈碉紝鍙互鍦ㄨ繖閲岃缃�
+                // 鏆傛椂闅愯棌鏈�鍚庝娇鐢ㄦ椂闂�
+                binding.llLastUseTime.visibility = android.view.View.GONE
+            } ?: run {
+                // 濡傛灉cardInfo涔熶负绌猴紝鏄剧ず榛樿鍊�
+                binding.tvCardBalance.text = "0.00鍏�"
                 binding.llLastUseTime.visibility = android.view.View.GONE
             }
         }
 
         // 鏄剧ず鏈嶅姟鍣ㄦ暟鎹�
         cardInfo?.let { info ->
+            // 浣跨敤瀹屾暣鐨勭敤鎴风紪鍙�
+            binding.tvUserNumber.text = info.cardNum ?: cardNumber
+
             binding.tvUserName.text = info.userName ?: "鏈煡"
             binding.tvPhone.text = info.phone ?: "鏈粦瀹�"
             binding.tvIdCard.text = info.userCode ?: "鏈綍鍏�"  // 浣跨敤userCode浣滀负韬唤璇佸彿鐨勬浛浠�
@@ -308,6 +334,14 @@
             }
             binding.tvCardStatus.text = statusText
             binding.tvCardStatus.setTextColor(statusColor)
+        } ?: run {
+            // 濡傛灉cardInfo涓虹┖锛屾樉绀洪粯璁ゅ��
+            binding.tvUserNumber.text = cardNumber
+            binding.tvUserName.text = "鏈煡"
+            binding.tvPhone.text = "鏈粦瀹�"
+            binding.tvIdCard.text = "鏈綍鍏�"
+            binding.tvCardStatus.text = "鏈煡鐘舵��"
+            binding.tvCardStatus.setTextColor(android.graphics.Color.parseColor("#9E9E9E"))
         }
     }
 
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 c191a4e..9e08bf7 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt
@@ -1,6 +1,7 @@
 package com.dayu.general.activity
 
 import android.os.Bundle
+import com.dayu.baselibrary.utils.MornyUtil
 import com.dayu.general.bean.card.UserCard
 import com.dayu.general.databinding.ActivityCardWriteSuccessBinding
 import com.dayu.general.tool.CardOperationType
@@ -105,7 +106,7 @@
                 binding.titleBar.setCenterText("鍐欏崱鎴愬姛")
                 binding.successTitle.text = "鍐欏崱鎴愬姛"
                 binding.successMessage.text =
-                    "鍗″唴浣欓宸叉洿鏂颁负 ${userCard?.balance}鍏�"
+                    "鍗″唴浣欓宸叉洿鏂颁负"+MornyUtil.changeF2Y(userCard?.balance?:0.toInt()) +"鍏�"
             }
 
             else -> {
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt b/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
index c2dca73..3f6fcb8 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
@@ -172,17 +172,48 @@
         ApiManager.getInstance().requestGetLoading(
             this,
             "terminal/paymentmethod/get",
-            Array<PaymentMethod>::class.java,
+            Any::class.java,
             null,
-            object : SubscriberListener<BaseResponse<Array<PaymentMethod>>>() {
-                override fun onNext(response: BaseResponse<Array<PaymentMethod>>) {
+            object : SubscriberListener<BaseResponse<Any>>() {
+                override fun onNext(response: BaseResponse<Any>) {
                     if (response.success) {
-                        // 鑾峰彇鏀粯鏂瑰紡鍒楄〃锛岀幇鍦╟ontent鐩存帴鏄疨aymentMethod鏁扮粍
-                        val paymentMethods = response.content?.toList() ?: listOf()
-                        if (paymentMethods.isNotEmpty()) {
-                            paymentMethodList = paymentMethods
-                            // 鏇存柊鏀粯鏂瑰紡鏄剧ず
-                            updatePaymentMethodRadioGroup()
+                        try {
+                            // 瀹夊叏鍦板鐞嗚繑鍥炵殑content锛屾湇鍔″櫒杩斿洖鐨勬槸ArrayList<LinkedHashMap>
+                            val paymentMethods = mutableListOf<PaymentMethod>()
+                            val content = response.content
+                            
+                            if (content is List<*>) {
+                                content.forEach { item ->
+                                    if (item is Map<*, *>) {
+                                        val id = item["id"]?.toString() ?: ""
+                                        val name = item["name"]?.toString() ?: ""
+                                        if (id.isNotEmpty() && name.isNotEmpty()) {
+                                            paymentMethods.add(PaymentMethod(id, name))
+                                        }
+                                    }
+                                }
+                            }
+                            
+                            if (paymentMethods.isNotEmpty()) {
+                                paymentMethodList = paymentMethods
+                                // 鏇存柊鏀粯鏂瑰紡鏄剧ず
+                                updatePaymentMethodRadioGroup()
+                            } else {
+                                Toast.makeText(
+                                    this@NewCard2Activity,
+                                    "鑾峰彇鏀粯鏂瑰紡澶辫触锛氳繑鍥炴暟鎹负绌�",
+                                    Toast.LENGTH_SHORT
+                                ).show()
+                            }
+                        } catch (e: Exception) {
+                            android.util.Log.e("NewCard2Activity", "瑙f瀽鏀粯鏂瑰紡鏁版嵁澶辫触", e)
+                            android.util.Log.e("NewCard2Activity", "鍘熷鏁版嵁绫诲瀷: ${response.content?.javaClass?.name}")
+                            android.util.Log.e("NewCard2Activity", "鍘熷鏁版嵁鍐呭: ${response.content}")
+                            Toast.makeText(
+                                this@NewCard2Activity,
+                                "瑙f瀽鏀粯鏂瑰紡鏁版嵁澶辫触: ${e.message}",
+                                Toast.LENGTH_SHORT
+                            ).show()
                         }
                     } else {
                         Toast.makeText(
@@ -195,6 +226,7 @@
 
                 override fun onError(e: Throwable?) {
                     super.onError(e)
+                    android.util.Log.e("NewCard2Activity", "缃戠粶璇锋眰澶辫触", e)
                     Toast.makeText(
                         this@NewCard2Activity,
                         "鑾峰彇鏀粯鏂瑰紡澶辫触: ${e?.message ?: "缃戠粶寮傚父"}",
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 af95df2..94a11b3 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
@@ -254,8 +254,9 @@
                 // 杩旇繕鎿嶄綔鏄剧ず淇℃伅
                 var textData = StringBuilder()
                 textData.append("杩旇繕\n")
-                textData.append("鍗″唴浣欓锛�" + MornyUtil.changeF2Y(userCard.balance) + "鍏僜n")
-                textData.append("杩旇繕閲戦锛�" + returnAmount + "鍏�")
+                textData.append("杩旇繕閲戦锛�" + returnAmount + "鍏僜n")
+                textData.append("杩旇繕鍚庡崱鍐呬綑棰濓細" + MornyUtil.changeF2Y(userCard.balance) + "鍏僜n")
+
                 binding?.cardData?.text = textData.toString()
             }
 
@@ -263,8 +264,9 @@
                 // 琛ユ墸鎿嶄綔鏄剧ず淇℃伅
                 var textData = StringBuilder()
                 textData.append("琛ユ墸\n")
-                textData.append("鍗″唴浣欓锛�" + MornyUtil.changeF2Y(userCard.balance) + "鍏僜n")
-                textData.append("琛ユ墸閲戦锛�" + deductAmount + "鍏�")
+                textData.append("琛ユ墸閲戦锛�" + deductAmount + "鍏僜n")
+                textData.append("琛ユ墸鍚庡崱鍐呬綑棰濓細" + MornyUtil.changeF2Y(userCard.balance) + "鍏僜n")
+
                 binding?.cardData?.text = textData.toString()
             }
 
@@ -514,7 +516,7 @@
                 CardOperationType.RegionCardMake -> {
                     // 鍖哄煙琛ㄥ彿鍗″啓鍗¢�昏緫锛堝姛鑳藉崱锛屾棤闇�鍐欏叆鐢ㄦ埛鏁版嵁锛�
                     var areaCard = AreaCard()
-                    areaCard.areaNumber = regionNumber.toInt()
+                    areaCard.areaNumber = regionNumber
                     areaCard.projectCode = projectNumber.toInt()
                     nfcWreatHelper.writeDataAsync(
                         areaCard.getZeroBytes(),
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 3ec2878..7658e5b 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
@@ -23,6 +23,7 @@
 import com.dayu.general.bean.net.RechargeRequest
 import com.dayu.general.bean.net.RechargeResult
 import com.dayu.general.bean.card.UserCard
+import com.dayu.general.bean.net.PaymentMethodListResponse
 import com.dayu.general.databinding.ActivityRechargeDetailBinding
 import com.dayu.general.net.ApiManager
 import com.dayu.general.net.BaseResponse
@@ -149,23 +150,60 @@
     }
 
     /**
-     * 鑾峰彇鏀粯鏂瑰紡鍒楄〃
+     * 鑾峰彇鏀粯鏂瑰紡鍒楄〃 - 浣跨敤Object绫诲瀷瀹夊叏澶勭悊JSON鏁扮粍
      */
     private fun getPaymentMethods() {
         ApiManager.getInstance().requestGetLoading(
             this,
             "terminal/paymentmethod/get",
-            Array<PaymentMethod>::class.java,
+            Any::class.java,
             null,
-            object : SubscriberListener<BaseResponse<Array<PaymentMethod>>>() {
-                override fun onNext(response: BaseResponse<Array<PaymentMethod>>) {
+            object : SubscriberListener<BaseResponse<Any>>() {
+                override fun onNext(response: BaseResponse<Any>) {
                     if (response.success) {
-                        // 鑾峰彇鏀粯鏂瑰紡鍒楄〃锛岀幇鍦╟ontent鐩存帴鏄疨aymentMethod鏁扮粍
-                        val paymentMethods = response.content?.toList() ?: listOf()
-                        if (paymentMethods.isNotEmpty()) {
-                            paymentMethodList = paymentMethods
-                            // 鏇存柊鏀粯鏂瑰紡鏄剧ず
-                            updatePaymentMethodRadioGroup()
+                        try {
+                            // 瀹夊叏鍦板鐞嗚繑鍥炵殑content锛屾湇鍔″櫒杩斿洖鐨勬槸ArrayList<LinkedHashMap>
+                            val paymentMethods = mutableListOf<PaymentMethod>()
+                            val content = response.content
+                            
+                            if (content is List<*>) {
+                                content.forEach { item ->
+                                    if (item is Map<*, *>) {
+                                        val id = item["id"]?.toString() ?: ""
+                                        val name = item["name"]?.toString() ?: ""
+                                        if (id.isNotEmpty() && name.isNotEmpty()) {
+                                            paymentMethods.add(PaymentMethod(id, name))
+                                        }
+                                    }
+                                }
+                            }
+                            
+                            if (paymentMethods.isNotEmpty()) {
+                                paymentMethodList = paymentMethods
+                                // 鏇存柊鏀粯鏂瑰紡鏄剧ず
+                                updatePaymentMethodRadioGroup()
+                                
+                                // 璋冭瘯鏃ュ織
+                                android.util.Log.d("RechargeDetail", "鎴愬姛鑾峰彇${paymentMethods.size}涓敮浠樻柟寮�:")
+                                paymentMethods.forEach { method ->
+                                    android.util.Log.d("RechargeDetail", "- ID: ${method.id}, Name: ${method.name}")
+                                }
+                            } else {
+                                Toast.makeText(
+                                    this@RechargeDetailActivity,
+                                    "鑾峰彇鏀粯鏂瑰紡澶辫触锛氳繑鍥炴暟鎹负绌�",
+                                    Toast.LENGTH_SHORT
+                                ).show()
+                            }
+                        } catch (e: Exception) {
+                            android.util.Log.e("RechargeDetail", "瑙f瀽鏀粯鏂瑰紡鏁版嵁澶辫触", e)
+                            android.util.Log.e("RechargeDetail", "鍘熷鏁版嵁绫诲瀷: ${response.content?.javaClass?.name}")
+                            android.util.Log.e("RechargeDetail", "鍘熷鏁版嵁鍐呭: $response.content")
+                            Toast.makeText(
+                                this@RechargeDetailActivity,
+                                "瑙f瀽鏀粯鏂瑰紡鏁版嵁澶辫触: ${e.message}",
+                                Toast.LENGTH_SHORT
+                            ).show()
                         }
                     } else {
                         Toast.makeText(
@@ -178,6 +216,7 @@
 
                 override fun onError(e: Throwable?) {
                     super.onError(e)
+                    android.util.Log.e("RechargeDetail", "缃戠粶璇锋眰澶辫触", e)
                     Toast.makeText(
                         this@RechargeDetailActivity,
                         "鑾峰彇鏀粯鏂瑰紡澶辫触: ${e?.message ?: "缃戠粶寮傚父"}",
@@ -341,30 +380,42 @@
             return
         }
 
-        // 璋冪敤鍏呭�兼帴鍙�
-        callRechargeApi(rechargeAmount, bonusAmount)
+        // 璋冪敤鍏呭�兼帴鍙o紝浼犻�掑綋鍓嶄綑棰�
+        callRechargeApi(currentBalance, rechargeAmount, bonusAmount)
     }
 
     /**
      * 璋冪敤鍏呭�兼帴鍙�
      */
-    private fun callRechargeApi(rechargeAmount: Double, bonusAmount: Double) {
+    private fun callRechargeApi(currentBalance: Double, rechargeAmount: Double, bonusAmount: Double) {
         val cardNum = cardInfo?.cardNum ?: cardAddress ?: ""
         if (cardNum.isEmpty()) {
             ToastUtil.show("鍗″彿淇℃伅缂哄け")
             return
         }
 
+        // 楠岃瘉鏀粯鏂瑰紡鏄惁宸查�夋嫨锛屽鏋滀负绌哄垯閲嶆柊鑾峰彇鏀粯鏂瑰紡
+        if (paymentId.isEmpty()) {
+            ToastUtil.show("鏀粯鏂瑰紡鏈姞杞斤紝姝e湪閲嶆柊鑾峰彇...")
+            // 閲嶆柊鑾峰彇鏀粯鏂瑰紡锛屾垚鍔熷悗鑷姩閲嶈瘯鍏呭��
+            getPaymentMethodsAndRetryRecharge(currentBalance, rechargeAmount, bonusAmount)
+            return
+        }
+
         // 鑾峰彇姘翠环锛堝鏋滀负绌轰細鑷姩瑙﹀彂MainActivity鑾峰彇锛�
         val currentWaterPrice = BaseApplication.requestWaterPrice()
 
-        // 鏋勫缓鍏呭�艰姹傚弬鏁�
+        // 鎵撳嵃璋冭瘯淇℃伅
+        android.util.Log.d("RechargeDetail", "鍏呭�煎弬鏁� - paymentMethod: $paymentMethod, paymentId: $paymentId")
+        android.util.Log.d("RechargeDetail", "瀛楁鍚箟 - money(褰撳墠浣欓): ${String.format("%.2f", currentBalance)}鍏�, amount(鍏呭�奸噾棰�): ${String.format("%.2f", rechargeAmount)}鍏�, gift(璧犻�侀噾棰�): ${String.format("%.2f", bonusAmount)}鍏�")
+
+        // 鏋勫缓鍏呭�艰姹傚弬鏁� - 淇瀛楁鍚箟
         val rechargeRequest = RechargeRequest(
             rechargeType = 2,
             cardNum = cardNum,
-            money = String.format("%.0f", rechargeAmount),
-            amount = String.format("%.0f", bonusAmount),
-            gift = String.format("%.0f", bonusAmount),
+            money = String.format("%.2f", currentBalance), // money涓哄綋鍓嶅崱浣欓
+            amount = String.format("%.2f", rechargeAmount), // amount涓哄厖鍊奸噾棰�
+            gift = String.format("%.2f", bonusAmount), // gift涓鸿禒閫侀噾棰�
             paymentId = paymentId,
             price = String.format("%.2f", currentWaterPrice), // 浣跨敤缁熶竴鑾峰彇鐨勬按浠�
             remarks = "鍏呭��",
@@ -412,6 +463,64 @@
     }
 
     /**
+     * 閲嶆柊鑾峰彇鏀粯鏂瑰紡骞堕噸璇曞厖鍊�
+     */
+    private fun getPaymentMethodsAndRetryRecharge(currentBalance: Double, rechargeAmount: Double, bonusAmount: Double) {
+        ApiManager.getInstance().requestGetLoading(
+            this,
+            "terminal/paymentmethod/get",
+            Any::class.java,
+            null,
+            object : SubscriberListener<BaseResponse<Any>>() {
+                override fun onNext(response: BaseResponse<Any>) {
+                    if (response.success) {
+                        try {
+                            // 瀹夊叏鍦板鐞嗚繑鍥炵殑content锛屾湇鍔″櫒杩斿洖鐨勬槸ArrayList<LinkedHashMap>
+                            val paymentMethods = mutableListOf<PaymentMethod>()
+                            val content = response.content
+                            
+                            if (content is List<*>) {
+                                content.forEach { item ->
+                                    if (item is Map<*, *>) {
+                                        val id = item["id"]?.toString() ?: ""
+                                        val name = item["name"]?.toString() ?: ""
+                                        if (id.isNotEmpty() && name.isNotEmpty()) {
+                                            paymentMethods.add(PaymentMethod(id, name))
+                                        }
+                                    }
+                                }
+                            }
+                            
+                            if (paymentMethods.isNotEmpty()) {
+                                paymentMethodList = paymentMethods
+                                // 鏇存柊鏀粯鏂瑰紡鏄剧ず
+                                updatePaymentMethodRadioGroup()
+                                // 鏀粯鏂瑰紡鍔犺浇鎴愬姛鍚庯紝鑷姩閲嶈瘯鍏呭��
+                                ToastUtil.show("鏀粯鏂瑰紡鍔犺浇鎴愬姛锛屾鍦ㄩ噸璇曞厖鍊�...")
+                                callRechargeApi(currentBalance, rechargeAmount, bonusAmount)
+                            } else {
+                                ToastUtil.show("鑾峰彇鏀粯鏂瑰紡澶辫触锛氳繑鍥炴暟鎹负绌�")
+                            }
+                        } catch (e: Exception) {
+                            android.util.Log.e("RechargeDetail", "瑙f瀽鏀粯鏂瑰紡鏁版嵁澶辫触", e)
+                            android.util.Log.e("RechargeDetail", "鍘熷鏁版嵁绫诲瀷: ${response.content?.javaClass?.name}")
+                            android.util.Log.e("RechargeDetail", "鍘熷鏁版嵁鍐呭: ${response.content}")
+                            ToastUtil.show("瑙f瀽鏀粯鏂瑰紡鏁版嵁澶辫触: ${e.message}")
+                        }
+                    } else {
+                        ToastUtil.show("鑾峰彇鏀粯鏂瑰紡澶辫触: ${response.msg}")
+                    }
+                }
+
+                override fun onError(e: Throwable?) {
+                    super.onError(e)
+                    ToastUtil.show("鑾峰彇鏀粯鏂瑰紡澶辫触: ${e?.message ?: "缃戠粶寮傚父"}")
+                }
+            }
+        )
+    }
+
+    /**
      * 鍚姩鍐欏崱鐣岄潰
      */
     private fun startWriteCardActivity(
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/AreaCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/AreaCard.kt
index 6d3cfd3..5da0906 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/card/AreaCard.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/AreaCard.kt
@@ -14,7 +14,7 @@
         const val CARD_TYPE = CardCommon.REGION_CARD  // 鍗$被鍨嬪浐瀹氫负0xB0
     }
 
-    var areaNumber: Int = 0     // 鍥藉琛屾斂鍖哄煙鍙�(12浣岯CD,绮剧‘鍒版潙)
+    var areaNumber: String = ""     // 鍥藉琛屾斂鍖哄煙鍙�(12浣岯CD,绮剧‘鍒版潙)
     var projectCode: Int = 0    // 椤圭洰缂栫爜(HEX 1-255)
 
     /**
@@ -35,20 +35,21 @@
             val areaCard = AreaCard()
             // 瑙f瀽绗�0鍧�
             val zero = data[0]
-            
+
             // 瑙f瀽鍥藉琛屾斂鍖哄煙鍙�(0-5浣�)
             val areaCodeBytes = zero.copyOfRange(0, 6)
-            areaCard.areaNumber = BcdUtil.bcdToStr(areaCodeBytes).toInt()
-            
+            areaCard.areaNumber = BcdUtil.bcdToStr(areaCodeBytes)
+
             // 瑙f瀽椤圭洰缂栫爜(6浣�)
-            areaCard.projectCode = HexUtil.get16To10LowHightByBytes(byteArrayOf(zero[6]))
-            
+            areaCard.projectCode = HexUtil.get16to10(HexUtil.byteToHex(zero[6]))
+
             // 楠岃瘉鍗$被鍨嬪拰璇嗗埆鐮�
             if (HexUtil.byteToHex(zero[8]) != CARD_TYPE ||
                 zero[9] != IDENTIFY_CODE_A0 ||
                 zero[10] != IDENTIFY_CODE_B1 ||
                 zero[11] != IDENTIFY_CODE_C2 ||
-                zero[12] != IDENTIFY_CODE_89) {
+                zero[12] != IDENTIFY_CODE_89
+            ) {
                 return null
             }
 
@@ -67,28 +68,28 @@
             val data = ByteArray(16)
             try {
                 // 璁剧疆鍥藉琛屾斂鍖哄煙鍙�(BCD鏍煎紡锛�6瀛楄妭锛�0-5浣�)
-                val areaCodeBytes = BcdUtil.strToBcd(String.format("%012d", areaNumber))
+                val areaCodeBytes = BcdUtil.strToBcd(areaNumber)
                 System.arraycopy(areaCodeBytes, 0, data, 0, 6)
-                
+
                 // 璁剧疆椤圭洰缂栫爜(6浣�)
-                data[6] = projectCode.toByte()
-                
+                data[6] = HexUtil.hexToByte(HexUtil.get10to16(projectCode))
+
                 // 璁剧疆澶囩敤浣�(7浣�)
                 data[7] = 0x00
-                
+
                 // 璁剧疆鍗$被鍨�(8浣�)
                 data[8] = HexUtil.hexToByte(CARD_TYPE)
-                
+
                 // 璁剧疆璇嗗埆鐮�(9-12浣�)
                 data[9] = IDENTIFY_CODE_A0
                 data[10] = IDENTIFY_CODE_B1
                 data[11] = IDENTIFY_CODE_C2
                 data[12] = IDENTIFY_CODE_89
-                
+
                 // 璁剧疆澶囩敤浣�(13-14浣�)
                 data[13] = 0x00
                 data[14] = 0x00
-                
+
                 // 璁剧疆鏍¢獙鍜�(15浣�)
                 data[15] = getByteSum(data)
             } catch (e: Exception) {
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/net/NewCardInfo.kt b/generallibrary/src/main/java/com/dayu/general/bean/net/NewCardInfo.kt
index fabf9a7..6ceaf69 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/net/NewCardInfo.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/net/NewCardInfo.kt
@@ -6,7 +6,7 @@
     val name: String
 )
 
-// 鏀粯鏂瑰紡鎺ュ彛杩斿洖鏁版嵁绫�
+// 鏀粯鏂瑰紡鎺ュ彛杩斿洖鏁版嵁绫伙紙鏃х増鏈紝淇濈暀鍏煎鎬э級
 data class PaymentMethodResponse(
     val itemTotal: Any?,
     val obj: List<PaymentMethod>,
@@ -15,6 +15,20 @@
     val pageTotal: Any?
 )
 
+// 鏀粯鏂瑰紡鍒楄〃鍖呰绫伙紝鐢ㄤ簬澶勭悊鐩存帴杩斿洖PaymentMethod鏁扮粍鐨勬帴鍙�
+// 杩欎釜绫诲疄闄呬笂鍙槸涓�涓畝鍗曠殑鍖呰鍣紝璁〨son鑳藉姝g‘瑙f瀽JSON鏁扮粍
+class PaymentMethodListResponse : ArrayList<PaymentMethod>() {
+    
+    companion object {
+        // 闈欐�佹柟娉曪紝浠嶭ist<PaymentMethod>鍒涘缓瀹炰緥
+        fun from(list: List<PaymentMethod>): PaymentMethodListResponse {
+            val response = PaymentMethodListResponse()
+            response.addAll(list)
+            return response
+        }
+    }
+}
+
 // 鐢ㄦ埛淇℃伅鏁版嵁绫�
 data class ClientInfo(
     val clientId: String,
diff --git a/generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt b/generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt
index 79e1dae..4e4827c 100644
--- a/generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt
+++ b/generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt
@@ -159,13 +159,33 @@
                         }
                         is List<*> -> {
                             try {
-                                @Suppress("UNCHECKED_CAST")
-                                response.content = MyJsonParser.getListByJson(
-                                    MyJsonParser.getJsonbyList(content),
-                                    tClass
-                                ) as T
+                                // 鐩存帴澶勭悊List绫诲瀷鐨刢ontent锛屼笉闇�瑕侀噸鏂拌В鏋�
+                                when {
+                                    // 濡傛灉鐩爣绫诲瀷鏄疞ist鐨勫瓙绫伙紙濡侾aymentMethodListResponse锛夛紝鐩存帴杞崲
+                                    List::class.java.isAssignableFrom(tClass) -> {
+                                        @Suppress("UNCHECKED_CAST")
+                                        response.content = content as T
+                                    }
+                                    // 濡傛灉content鏄疢ap鍒楄〃锛屽皾璇曡浆鎹负鐩爣瀵硅薄鍒楄〃
+                                    content.isNotEmpty() && content[0] is Map<*, *> -> {
+                                        val jsonData = MyJsonParser.getJsonbyList(content)
+                                        @Suppress("UNCHECKED_CAST")
+                                        response.content = MyJsonParser.getListByJson(jsonData, tClass) as T
+                                    }
+                                    else -> {
+                                        @Suppress("UNCHECKED_CAST")
+                                        response.content = content as T
+                                    }
+                                }
                             } catch (e: Exception) {
                                 Log.e(TAG, "Error parsing list content", e)
+                                // 濡傛灉瑙f瀽澶辫触锛屽皾璇曠洿鎺ヨ浆鎹�
+                                try {
+                                    @Suppress("UNCHECKED_CAST")
+                                    response.content = content as T
+                                } catch (e2: Exception) {
+                                    Log.e(TAG, "Failed to cast content directly", e2)
+                                }
                             }
                         }
                         is Int, is String, is Boolean -> {

--
Gitblit v1.8.0