左晓为主开发手持机充值管理机
refactor(generallibrary):优化卡片信息展示和处理逻辑- 修改卡片信息展示布局,调整字段顺序和格式
- 优化卡片读取和处理逻辑,增加日志输出
- 调整金额显示和计算方式,确保精度正确
- 修复部分字段解析和填充逻辑
6个文件已修改
363 ■■■■■ 已修改文件
generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt 84 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/res/layout/activity_card_read.xml 108 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt
@@ -38,18 +38,16 @@
        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()
        }
    }
@@ -73,8 +71,8 @@
    }
    override fun onNfcBack(intent: Intent?) {
        intent?.let {
            handleNfcIntent(it)
        intent?.let {
            handleNfcIntent(it)
        } ?: run {
            showConfirmDialog("NFC数据异常,请重新刷卡") {
            }
@@ -117,12 +115,13 @@
            // 根据卡片类型进行不同处理
            when (cardType) {
                CardCommon.USER_CARD_TYPE_1,
                CardCommon.USER_CARD_TYPE_2,
                CardCommon.USER_CARD_TYPE_1,
                CardCommon.USER_CARD_TYPE_2,
                CardCommon.USER_CARD_TYPE_3 -> {
                    // 用户卡:解析卡内数据并调用接口
                    handleUserCard(cardNumber, cardType, nfcAdapter)
                }
                else -> {
                    // 管理类卡:显示卡片类型信息
                    handleManagementCard(cardNumber, cardType)
@@ -146,6 +145,23 @@
            }
            return
        }
        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)
@@ -156,7 +172,7 @@
     */
    private fun handleManagementCard(cardNumber: String, cardType: String) {
        val cardTypeName = getCardTypeName(cardType)
        // 显示管理卡信息
        showManagementCardInfo(cardNumber, cardTypeName)
    }
@@ -168,13 +184,12 @@
        // 隐藏读卡提示,显示信息区域
        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
@@ -238,22 +253,26 @@
    /**
     * 显示用户卡片信息(包含卡内数据和接口返回数据)
     */
    private fun showUserCardInfo(cardInfo: CardInfoResult?, cardNumber: String, cardType: String, userCard: UserCard) {
    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) {
@@ -262,18 +281,19 @@
                card.balance.toString()
            }
            binding.tvCardBalance.text = "${balanceInYuan}元"
            // 使用完整的用户编号
            binding.tvUserNumber.text = card.getMyUserCode()
            binding.tvUserNumber.text = cardInfo?.cardNum
            // 卡片状态(假设正常状态,因为UserCard中没有状态字段)
            binding.tvCardStatus.text = "正常"
            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())
                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
@@ -305,6 +325,7 @@
            "1001" -> {
                "该卡片未在系统中注册,请先进行开卡操作。"
            }
            else -> {
                when {
                    msg.isNullOrBlank() -> "获取卡信息失败,请重新刷卡重试。"
generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
@@ -60,12 +60,12 @@
    // 客户ID
    private var clientId: String = ""
    private lateinit var clientInfo : ClientInfo
    private lateinit var clientInfo: ClientInfo
    // 是否已读卡
    private var isReadCard: Boolean = false
    private var orderId:String=""
    private var orderId: String = ""
    companion object {
        private const val TAG = "NewCard2Activity"
@@ -335,7 +335,7 @@
            object : SubscriberListener<BaseResponse<NewCardDataResult>>() {
                override fun onNext(response: BaseResponse<NewCardDataResult>) {
                    if (response.success) {
                        orderId=response.content?.orderNo.toString()
                        orderId = response.content?.orderNo.toString()
                        // 保存开卡信息到数据库
                        val cardRegistration = CardRegistrationBean(
                            cardNumber = cardPhysicalId,
@@ -362,16 +362,78 @@
                                    putExtra("orderNumber", orderId)
                                    putExtra("cardAddr", cardPhysicalId)
                                    var userCard = UserCard()
                                    userCard.areaNumber = response.content?.cardNum?.substring(0, 12).toString()
                                    userCard.userCode =clientInfo.clientNum
                                    userCard.phoneNumber =clientInfo.phone
                                    userCard.userCodeNumber = response.content?.cardNum?.substring(12)?.toInt()!!
                                    userCard.areaNumber =
                                        response.content?.cardNum?.substring(0, 12).toString()
                                    userCard.userCode = clientInfo.clientNum
                                    userCard.phoneNumber = clientInfo.phone
                                    userCard.userCodeNumber =
                                        response.content?.cardNum?.substring(12)?.toInt()!!
                                    userCard.projectCode = response.content?.projectNo!!
                                    userCard.balance = MornyUtil.changeY2F(response.content?.balance)
                                    userCard.balance =
                                        MornyUtil.changeY2F(response.content?.balance)
//                                    userCard.surplusWater = response.content?.surplusWater?.toInt()!!
                                    userCard.waterPrice = response.content?.waterPrice?.toFloat()!!
//                                    userCard.electricPrice = response.content?.electricPrice?.toFloat()!!
                                    userCard.rechargeDate = DateUtils.parseStringToCalendar(response.content?.time)
                                    userCard.waterPrice =
                                        MornyUtil.changeY2F(response.content?.waterPrice)
                                    userCard.electricPrice =
                                        MornyUtil.changeY2F(response.content?.waterPrice)
                                    userCard.rechargeDate =
                                        DateUtils.parseStringToCalendar(response.content?.time)
                                    // 输出userCard的所有信息到日志
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "=== 开卡UserCard信息 ==="
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "卡片类型: ${userCard.cardType}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "国家行政区域号: ${userCard.areaNumber}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "用户编号: ${userCard.userCode}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "用户卡编号: ${userCard.userCodeNumber}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "完整用户编号: ${userCard.getMyUserCode()}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "手机号: ${userCard.phoneNumber}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "项目编码: ${userCard.projectCode}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "卡内余额: ${userCard.balance}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "剩余水量: ${userCard.surplusWater}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "水量单价: ${userCard.waterPrice}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "电量单价: ${userCard.electricPrice}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "充值时间: ${userCard.rechargeDate}"
                                    )
                                    android.util.Log.d("NewCard2Activity", "==================")
                                    putExtra("userCard", userCard)
                                    putExtra("operationTypeCode", CardOperationType.OpenCard.code)
                                    putExtra("cardFee", cardFee)
generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
@@ -5,6 +5,7 @@
import androidx.lifecycle.lifecycleScope
import com.dayu.baselibrary.net.subscribers.SubscriberListener
import com.dayu.baselibrary.tools.nfc.NFCCallBack
import com.dayu.baselibrary.utils.MornyUtil
import com.dayu.baselibrary.utils.ToastUtil
import com.dayu.general.bean.card.ClearCard
import com.dayu.general.bean.card.UserCard
@@ -30,7 +31,7 @@
    var cardType = ""
    var cardAddr = ""
    var cardFee = 0
    // 充值相关金额
    private var rechargeAmount = 0.0
    private var bonusAmount = 0.0
@@ -57,11 +58,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,7 +87,7 @@
                        textData.append("工本费:" + cardFee + "元\n")
                    }
                    if (userCard.balance != 0) {
                        textData.append("充值金额:" + userCard.balance + "元")
                        textData.append("充值金额:" + MornyUtil.changeF2Y(userCard.balance) + "元")
                    }
                    binding?.cardData?.text = textData.toString()
@@ -95,23 +96,33 @@
                CardOperationType.Recharge -> {
                    var textData = StringBuilder()
                    textData.append("用户充值\n")
                    // 显示充值金额
                    if (rechargeAmount > 0) {
                        textData.append("充值金额:" + String.format("%.2f", rechargeAmount) + "元\n")
                        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) + "元")
                        textData.append(
                            "卡内总余额:" + String.format(
                                "%.2f",
                                totalBalanceInYuan
                            ) + "元"
                        )
                    }
                    binding?.cardData?.text = textData.toString()
                }
@@ -130,7 +141,7 @@
        val nfcReadHelper = NfcReadHelper.getInstance(intent, this)
        // 使用正常的getCardNumber()方法,它会自动关闭连接
        val cardNumber = nfcReadHelper.getCardNumber()
        if (cardNumber.isNotEmpty() && cardNumber == cardAddr) {
            val nfcWreatHelper = NfcWreatHelper.getInstance(intent, this)
            when (operationType) {
@@ -210,7 +221,7 @@
                    val updatedCardRegistration = cardRegistration.copy(isCardWritten = true)
                    // 更新数据库记录
                    cardRegistrationDao.update(updatedCardRegistration)
                    // 在主线程中关闭Activity
                    runOnUiThread {
                        setResult(RESULT_OK)
generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
@@ -12,6 +12,7 @@
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.dayu.baselibrary.net.subscribers.SubscriberListener
import com.dayu.baselibrary.utils.MornyUtil
import com.dayu.baselibrary.utils.ToastUtil
import com.dayu.baselibrary.view.TitleBar
import com.dayu.general.BaseApplication
@@ -45,7 +46,12 @@
        private const val EXTRA_CARD_ADDRESS = "extra_card_address"
        private const val EXTRA_USER_CARD = "extra_user_card"
        fun start(context: Context, cardInfo: CardInfoResult?, cardAddress: String?, userCard: UserCard?) {
        fun start(
            context: Context,
            cardInfo: CardInfoResult?,
            cardAddress: String?,
            userCard: UserCard?
        ) {
            val intent = Intent(context, RechargeDetailActivity::class.java)
            intent.putExtra(EXTRA_CARD_INFO, cardInfo)
            intent.putExtra(EXTRA_CARD_ADDRESS, cardAddress)
@@ -86,7 +92,7 @@
            // 处理充值逻辑
            handleRecharge()
        }
        // 设置金额输入限制
        setupAmountInputLimit(binding.rechargeMorny)
        setupAmountInputLimit(binding.rechargeWater)
@@ -98,13 +104,13 @@
    private fun setupAmountInputLimit(editText: EditText) {
        editText.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
            override fun afterTextChanged(s: Editable?) {
                val text = s.toString()
                if (text.isEmpty()) return
                // 检查是否包含小数点
                if (text.contains(".")) {
                    val parts = text.split(".")
@@ -120,7 +126,7 @@
                        }
                    }
                }
                // 防止输入多个小数点
                val dotCount = text.count { it == '.' }
                if (dotCount > 1) {
@@ -130,7 +136,7 @@
                    editText.setSelection(newText.length)
                    editText.addTextChangedListener(this)
                }
                // 防止以小数点开头
                if (text.startsWith(".")) {
                    editText.removeTextChangedListener(this)
@@ -249,9 +255,9 @@
            binding.redInitCode.text = cardAddress ?: ""
            binding.userName.text = info.userName ?: ""
            binding.redCardNum.text = info.cardNum ?: ""
            // 使用用户卡中的余额显示
            val balance = userCard?.let {
            val balance = userCard?.let {
                // 将分转换为元,保留两位小数
                String.format("%.2f", it.balance / 100.0)
            } ?: run {
@@ -389,25 +395,30 @@
    /**
     * 启动写卡界面
     */
    private fun startWriteCardActivity(rechargeResult: RechargeResult, rechargeAmount: Double, bonusAmount: Double) {
    private fun startWriteCardActivity(
        rechargeResult: RechargeResult,
        rechargeAmount: Double,
        bonusAmount: Double
    ) {
        try {
            // 创建UserCard对象用于写卡
            val userCard = UserCard().apply {
                // 设置用户卡信息
                cardInfo?.let { info ->
                    userCode = info.cardNum ?: ""
                    // 计算新余额:原有余额 + 充值金额 + 赠送金额
                    val originalBalance = this@RechargeDetailActivity.userCard?.balance ?: 0 // 原有余额(分)
                    val originalBalance =
                        this@RechargeDetailActivity.userCard?.balance ?: 0 // 原有余额(分)
                    val rechargeAmountInCents = (rechargeAmount * 100).toInt() // 充值金额转分
                    val bonusAmountInCents = (bonusAmount * 100).toInt() // 赠送金额转分
                    balance = originalBalance + rechargeAmountInCents + bonusAmountInCents
                }
                // 设置其他必要信息
                projectCode = rechargeResult.projectNo
                waterPrice = rechargeResult.waterPrice.toFloat()
                waterPrice = MornyUtil.changeY2F(rechargeResult.waterPrice.toString())
                rechargeDate = java.util.Calendar.getInstance()
            }
generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt
@@ -17,10 +17,10 @@
    var userCodeNumber: Int = 0 // 用户卡编号(HEX)
    var phoneNumber: String = "" // 手机号(BCD)
    var projectCode: Int = 0 // 项目编码(HEX 1-255)
    var balance: Int = 0 // 剩余金额(2位小数点,单位元)
    var balance: Int = 0 // 剩余金额(2位小数点,单位分)
    var surplusWater: Int = 0 // 剩余水量(2位小数点,单位立方米)
    var waterPrice: Float = 0f // 水量单价(最大655.35,2位小数点。单位:m3/元)
    var electricPrice: Float = 0f // 电量单价(最大655.35,2位小数点。单位: 元/度)
    var waterPrice: Int = 0 // 水量单价(2位小数点,单位分/m3)
    var electricPrice: Int = 0 // 电量单价(2位小数点,单位分/度)
    var rechargeDate: Calendar? = null // 充值时间
    /**
@@ -74,7 +74,7 @@
                projectCode = HexUtil.get16To10LowHightByBytes(byteArrayOf(one[0]))
                balance = HexUtil.get16To10LowHightByBytes(one.copyOfRange(1, 5))
                surplusWater = HexUtil.get16To10LowHightByBytes(one.copyOfRange(5, 9))
                electricPrice = HexUtil.hexToFloatLowHigh(one.copyOfRange(9, 11))
                electricPrice = HexUtil.get16To10LowHightByBytes(one.copyOfRange(9, 11))
                // 解析充值时间
                val year = HexUtil.getBcdToInt(one[11])
@@ -90,7 +90,7 @@
            // 解析第2块
            val two = data[2]
            userCard.apply {
                waterPrice = HexUtil.hexToFloatLowHigh(two.copyOfRange(9, 11))
                waterPrice = HexUtil.get16To10LowHightByBytes(two.copyOfRange(9, 11))
            }
            return userCard
@@ -157,10 +157,11 @@
                System.arraycopy(waterPadded, 0, data, 5, 4)
                // 设置电价 - 修复:确保数组长度正确
                val priceBytes = HexUtil.hexToByteArray(HexUtil.floatToHexLowHigh(electricPrice))
                val pricePadded = ByteArray(2)
                System.arraycopy(priceBytes, 0, pricePadded, 0, minOf(priceBytes.size, 2))
                System.arraycopy(pricePadded, 0, data, 9, 2)
                val electricPriceHex = HexUtil.get10To16LowHigh(electricPrice)
                val electricPriceBytes = HexUtil.hexToByteArray(electricPriceHex)
                val electricPricePadded = ByteArray(2)
                System.arraycopy(electricPriceBytes, 0, electricPricePadded, 0, minOf(electricPriceBytes.size, 2))
                System.arraycopy(electricPricePadded, 0, data, 9, 2)
                // 设置充值时间
                rechargeDate?.let {
@@ -196,10 +197,11 @@
                System.arraycopy(waterPadded, 0, data, 5, 4)
                // 设置水价 - 修复:确保数组长度正确
                val priceBytes = HexUtil.hexToByteArray(HexUtil.floatToHexLowHigh(waterPrice))
                val pricePadded = ByteArray(2)
                System.arraycopy(priceBytes, 0, pricePadded, 0, minOf(priceBytes.size, 2))
                System.arraycopy(pricePadded, 0, data, 9, 2)
                val waterPriceHex = HexUtil.get10To16LowHigh(waterPrice)
                val waterPriceBytes = HexUtil.hexToByteArray(waterPriceHex)
                val waterPricePadded = ByteArray(2)
                System.arraycopy(waterPriceBytes, 0, waterPricePadded, 0, minOf(waterPriceBytes.size, 2))
                System.arraycopy(waterPricePadded, 0, data, 9, 2)
                // 设置充值时间
                rechargeDate?.let {
generallibrary/src/main/res/layout/activity_card_read.xml
@@ -11,7 +11,8 @@
        android:layout_height="@dimen/dimen_title_height"
        android:background="@color/title_bar_bg"
        android:elevation="4dp"
        app:centerText="读卡" />
        app:centerText="读卡"
        app:leftImage="@mipmap/icon_back" />
    <ScrollView
        android:layout_width="match_parent"
@@ -32,7 +33,7 @@
                android:layout_height="match_parent"
                android:gravity="center"
                android:orientation="vertical"
                android:visibility="gone">
                android:visibility="visible">
                <androidx.cardview.widget.CardView
                    android:layout_width="match_parent"
@@ -95,7 +96,7 @@
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:visibility="visible">
                android:visibility="gone">
                <!-- 卡内数据区域 -->
                <androidx.cardview.widget.CardView
@@ -116,9 +117,9 @@
                            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:gravity="center_vertical"
                            android:orientation="horizontal"
                            android:padding="12dp">
                            <TextView
@@ -143,15 +144,15 @@
                            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:gravity="center_vertical"
                            android:orientation="horizontal"
                            android:padding="12dp">
                            <TextView
                                android:layout_width="105dp"
                                android:layout_height="wrap_content"
                                android:text="卡号:"
                                android:text="卡地址:"
                                android:textColor="#333333"
                                android:textSize="@dimen/text_size" />
@@ -164,15 +165,42 @@
                                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:background="#FFFFFF"
                            android:gravity="center_vertical"
                            android:orientation="horizontal"
                            android:padding="12dp"
                            android:visibility="visible">
                            <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="正常"
                                android:textColor="#4CAF50"
                                android:textSize="@dimen/text_size" />
                        </LinearLayout>
                        <!-- 卡片类型 -->
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginBottom="2dp"
                            android:orientation="horizontal"
                            android:gravity="center_vertical"
                            android:background="#F8F9FA"
                            android:gravity="center_vertical"
                            android:orientation="horizontal"
                            android:padding="12dp">
                            <TextView
@@ -198,11 +226,11 @@
                            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">
                            android:gravity="center_vertical"
                            android:orientation="horizontal"
                            android:padding="12dp"
                            android:visibility="visible">
                            <TextView
                                android:layout_width="105dp"
@@ -228,11 +256,11 @@
                            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">
                            android:gravity="center_vertical"
                            android:orientation="horizontal"
                            android:padding="12dp"
                            android:visibility="visible">
                            <TextView
                                android:layout_width="105dp"
@@ -256,9 +284,9 @@
                            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:gravity="center_vertical"
                            android:orientation="horizontal"
                            android:padding="12dp">
                            <TextView
@@ -283,9 +311,9 @@
                            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:gravity="center_vertical"
                            android:orientation="horizontal"
                            android:padding="12dp">
                            <TextView
@@ -305,34 +333,6 @@
                                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="正常"
                                android:textColor="#4CAF50"
                                android:textSize="@dimen/text_size" />
                        </LinearLayout>
                        <!-- 最后使用时间 -->
                        <LinearLayout
@@ -340,11 +340,11 @@
                            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">
                            android:gravity="center_vertical"
                            android:orientation="horizontal"
                            android:padding="12dp"
                            android:visibility="visible">
                            <TextView
                                android:layout_width="105dp"