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 -> { |