fix(generallibrary): 优化卡片处理和支付方式获取逻辑- 修复地区卡处理逻辑,增加对"00"类型卡的特殊处理
- 优化用户卡数据解析和显示逻辑,提高容错性
- 改进支付方式获取方法,增加错误处理和日志记录
-调整充值接口调用参数,确保正确传递当前余额等信息- 修复 AreaCard 中 areaNumber 类型,改为字符串处理
 
	
	
	
	
	
	
	
	
	
	
	
	
	
 |  |  | 
 |  |  |                     handleUserCard(cardNumber, cardType, nfcAdapter) | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 "00" -> { | 
 |  |  |                     // 地区卡:显示卡片类型信息 | 
 |  |  |                     handleUserCard(cardNumber, cardType, nfcAdapter) | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 else -> { | 
 |  |  |                     // 管理类卡:显示卡片类型信息 | 
 |  |  |                     handleManagementCard(cardNumber, cardType) | 
 |  |  | 
 |  |  |      * 处理用户卡 | 
 |  |  |      */ | 
 |  |  |     private fun handleUserCard(cardNumber: String, cardType: String, nfcAdapter: NfcReadHelper) { | 
 |  |  |         // 解析用户卡数据 | 
 |  |  |         val userCard = nfcAdapter.getUserCardData() | 
 |  |  |         if (userCard == null) { | 
 |  |  |             showConfirmDialog("解析卡片数据失败,请重新刷卡") { | 
 |  |  |         if (cardType != "00") { | 
 |  |  |             // 解析用户卡数据 | 
 |  |  |             val userCard = nfcAdapter.getUserCardData() | 
 |  |  |             if (userCard == null) { | 
 |  |  |                 showConfirmDialog("解析卡片数据失败,请重新刷卡") { | 
 |  |  |                 } | 
 |  |  |                 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) | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取卡片详细信息(用户卡专用) | 
 |  |  |      */ | 
 |  |  |     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( | 
 |  |  | 
 |  |  |         cardInfo: CardInfoResult?, | 
 |  |  |         cardNumber: String, | 
 |  |  |         cardType: String, | 
 |  |  |         userCard: UserCard | 
 |  |  |         userCard: UserCard? | 
 |  |  |     ) { | 
 |  |  |         // 隐藏读卡提示,显示信息区域 | 
 |  |  |         binding.cardReadLL.visibility = android.view.View.GONE | 
 |  |  | 
 |  |  |         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,如果为空则从cardInfo获取 | 
 |  |  |         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为空时,从cardInfo获取数据 | 
 |  |  |             cardInfo?.let { info -> | 
 |  |  |                 // 从接口返回的数据中获取余额,转换为正确的类型 | 
 |  |  |                 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作为身份证号的替代 | 
 |  |  | 
 |  |  |             } | 
 |  |  |             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")) | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 
 |  |  | 
 |  |  | 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 | 
 |  |  | 
 |  |  |                 binding.titleBar.setCenterText("写卡成功") | 
 |  |  |                 binding.successTitle.text = "写卡成功" | 
 |  |  |                 binding.successMessage.text = | 
 |  |  |                     "卡内余额已更新为 ${userCard?.balance}元" | 
 |  |  |                     "卡内余额已更新为"+MornyUtil.changeF2Y(userCard?.balance?:0.toInt()) +"元" | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             else -> { | 
 
 |  |  | 
 |  |  |         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) { | 
 |  |  |                         // 获取支付方式列表,现在content直接是PaymentMethod数组 | 
 |  |  |                         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", "解析支付方式数据失败", e) | 
 |  |  |                             android.util.Log.e("NewCard2Activity", "原始数据类型: ${response.content?.javaClass?.name}") | 
 |  |  |                             android.util.Log.e("NewCard2Activity", "原始数据内容: ${response.content}") | 
 |  |  |                             Toast.makeText( | 
 |  |  |                                 this@NewCard2Activity, | 
 |  |  |                                 "解析支付方式数据失败: ${e.message}", | 
 |  |  |                                 Toast.LENGTH_SHORT | 
 |  |  |                             ).show() | 
 |  |  |                         } | 
 |  |  |                     } else { | 
 |  |  |                         Toast.makeText( | 
 |  |  | 
 |  |  |  | 
 |  |  |                 override fun onError(e: Throwable?) { | 
 |  |  |                     super.onError(e) | 
 |  |  |                     android.util.Log.e("NewCard2Activity", "网络请求失败", e) | 
 |  |  |                     Toast.makeText( | 
 |  |  |                         this@NewCard2Activity, | 
 |  |  |                         "获取支付方式失败: ${e?.message ?: "网络异常"}", | 
 
 |  |  | 
 |  |  |                 // 返还操作显示信息 | 
 |  |  |                 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() | 
 |  |  |             } | 
 |  |  |  | 
 |  |  | 
 |  |  |                 // 补扣操作显示信息 | 
 |  |  |                 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() | 
 |  |  |             } | 
 |  |  |  | 
 |  |  | 
 |  |  |                 CardOperationType.RegionCardMake -> { | 
 |  |  |                     // 区域表号卡写卡逻辑(功能卡,无需写入用户数据) | 
 |  |  |                     var areaCard = AreaCard() | 
 |  |  |                     areaCard.areaNumber = regionNumber.toInt() | 
 |  |  |                     areaCard.areaNumber = regionNumber | 
 |  |  |                     areaCard.projectCode = projectNumber.toInt() | 
 |  |  |                     nfcWreatHelper.writeDataAsync( | 
 |  |  |                         areaCard.getZeroBytes(), | 
 
 |  |  | 
 |  |  | 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 | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取支付方式列表 | 
 |  |  |      * 获取支付方式列表 - 使用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) { | 
 |  |  |                         // 获取支付方式列表,现在content直接是PaymentMethod数组 | 
 |  |  |                         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", "解析支付方式数据失败", e) | 
 |  |  |                             android.util.Log.e("RechargeDetail", "原始数据类型: ${response.content?.javaClass?.name}") | 
 |  |  |                             android.util.Log.e("RechargeDetail", "原始数据内容: $response.content") | 
 |  |  |                             Toast.makeText( | 
 |  |  |                                 this@RechargeDetailActivity, | 
 |  |  |                                 "解析支付方式数据失败: ${e.message}", | 
 |  |  |                                 Toast.LENGTH_SHORT | 
 |  |  |                             ).show() | 
 |  |  |                         } | 
 |  |  |                     } else { | 
 |  |  |                         Toast.makeText( | 
 |  |  | 
 |  |  |  | 
 |  |  |                 override fun onError(e: Throwable?) { | 
 |  |  |                     super.onError(e) | 
 |  |  |                     android.util.Log.e("RechargeDetail", "网络请求失败", e) | 
 |  |  |                     Toast.makeText( | 
 |  |  |                         this@RechargeDetailActivity, | 
 |  |  |                         "获取支付方式失败: ${e?.message ?: "网络异常"}", | 
 |  |  | 
 |  |  |             return | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 调用充值接口 | 
 |  |  |         callRechargeApi(rechargeAmount, bonusAmount) | 
 |  |  |         // 调用充值接口,传递当前余额 | 
 |  |  |         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("支付方式未加载,正在重新获取...") | 
 |  |  |             // 重新获取支付方式,成功后自动重试充值 | 
 |  |  |             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 = "充值", | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 重新获取支付方式并重试充值 | 
 |  |  |      */ | 
 |  |  |     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", "解析支付方式数据失败", e) | 
 |  |  |                             android.util.Log.e("RechargeDetail", "原始数据类型: ${response.content?.javaClass?.name}") | 
 |  |  |                             android.util.Log.e("RechargeDetail", "原始数据内容: ${response.content}") | 
 |  |  |                             ToastUtil.show("解析支付方式数据失败: ${e.message}") | 
 |  |  |                         } | 
 |  |  |                     } else { | 
 |  |  |                         ToastUtil.show("获取支付方式失败: ${response.msg}") | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 override fun onError(e: Throwable?) { | 
 |  |  |                     super.onError(e) | 
 |  |  |                     ToastUtil.show("获取支付方式失败: ${e?.message ?: "网络异常"}") | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         ) | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 启动写卡界面 | 
 |  |  |      */ | 
 |  |  |     private fun startWriteCardActivity( | 
 
 |  |  | 
 |  |  |         const val CARD_TYPE = CardCommon.REGION_CARD  // 卡类型固定为0xB0 | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     var areaNumber: Int = 0     // 国家行政区域号(12位BCD,精确到村) | 
 |  |  |     var areaNumber: String = ""     // 国家行政区域号(12位BCD,精确到村) | 
 |  |  |     var projectCode: Int = 0    // 项目编码(HEX 1-255) | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |             val areaCard = AreaCard() | 
 |  |  |             // 解析第0块 | 
 |  |  |             val zero = data[0] | 
 |  |  |              | 
 |  |  |  | 
 |  |  |             // 解析国家行政区域号(0-5位) | 
 |  |  |             val areaCodeBytes = zero.copyOfRange(0, 6) | 
 |  |  |             areaCard.areaNumber = BcdUtil.bcdToStr(areaCodeBytes).toInt() | 
 |  |  |              | 
 |  |  |             areaCard.areaNumber = BcdUtil.bcdToStr(areaCodeBytes) | 
 |  |  |  | 
 |  |  |             // 解析项目编码(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 | 
 |  |  |             } | 
 |  |  |  | 
 |  |  | 
 |  |  |             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) { | 
 
 |  |  | 
 |  |  |     val name: String | 
 |  |  | ) | 
 |  |  |  | 
 |  |  | // 支付方式接口返回数据类 | 
 |  |  | // 支付方式接口返回数据类(旧版本,保留兼容性) | 
 |  |  | data class PaymentMethodResponse( | 
 |  |  |     val itemTotal: Any?, | 
 |  |  |     val obj: List<PaymentMethod>, | 
 |  |  | 
 |  |  |     val pageTotal: Any? | 
 |  |  | ) | 
 |  |  |  | 
 |  |  | // 支付方式列表包装类,用于处理直接返回PaymentMethod数组的接口 | 
 |  |  | // 这个类实际上只是一个简单的包装器,让Gson能够正确解析JSON数组 | 
 |  |  | class PaymentMethodListResponse : ArrayList<PaymentMethod>() { | 
 |  |  |      | 
 |  |  |     companion object { | 
 |  |  |         // 静态方法,从List<PaymentMethod>创建实例 | 
 |  |  |         fun from(list: List<PaymentMethod>): PaymentMethodListResponse { | 
 |  |  |             val response = PaymentMethodListResponse() | 
 |  |  |             response.addAll(list) | 
 |  |  |             return response | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | } | 
 |  |  |  | 
 |  |  | // 用户信息数据类 | 
 |  |  | data class ClientInfo( | 
 |  |  |     val clientId: String, | 
 
 |  |  | 
 |  |  |                         } | 
 |  |  |                         is List<*> -> { | 
 |  |  |                             try { | 
 |  |  |                                 @Suppress("UNCHECKED_CAST") | 
 |  |  |                                 response.content = MyJsonParser.getListByJson( | 
 |  |  |                                     MyJsonParser.getJsonbyList(content), | 
 |  |  |                                     tClass | 
 |  |  |                                 ) as T | 
 |  |  |                                 // 直接处理List类型的content,不需要重新解析 | 
 |  |  |                                 when { | 
 |  |  |                                     // 如果目标类型是List的子类(如PaymentMethodListResponse),直接转换 | 
 |  |  |                                     List::class.java.isAssignableFrom(tClass) -> { | 
 |  |  |                                         @Suppress("UNCHECKED_CAST") | 
 |  |  |                                         response.content = content as T | 
 |  |  |                                     } | 
 |  |  |                                     // 如果content是Map列表,尝试转换为目标对象列表 | 
 |  |  |                                     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) | 
 |  |  |                                 // 如果解析失败,尝试直接转换 | 
 |  |  |                                 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 -> { |