左晓为主开发手持机充值管理机
refactor(generallibrary):优化卡片信息展示和处理逻辑- 修改卡片信息展示布局,调整字段顺序和格式
- 优化卡片读取和处理逻辑,增加日志输出
- 调整金额显示和计算方式,确保精度正确
- 修复部分字段解析和填充逻辑
6个文件已修改
285 ■■■■■ 已修改文件
generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt 19 ●●●● 补丁 | 查看 | 原始文档 | 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
@@ -43,8 +43,6 @@
    }
    private fun initView() {
        // 设置标题
        binding.titleBar.setCenterText("读卡")
        // 设置TitleBar的返回按钮点击事件
        binding.titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) {
            finish()
@@ -123,6 +121,7 @@
                    // 用户卡:解析卡内数据并调用接口
                    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)
@@ -170,9 +186,8 @@
        binding.cardInfoContainer.visibility = android.view.View.VISIBLE
        
        // 显示基本信息
        binding.tvCardNumber.text = cardNumber
        binding.tvCardType.text = cardTypeName
        
        // 隐藏用户卡特有的字段
@@ -238,7 +253,12 @@
    /**
     * 显示用户卡片信息(包含卡内数据和接口返回数据)
     */
    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
@@ -246,9 +266,8 @@
        val cardTypeName = getCardTypeName(cardType)
        
        // 显示卡内数据
        binding.tvCardNumber.text = cardNumber
        binding.tvCardType.text = cardTypeName
        
        binding.tvCardType.text = cardTypeName
        // 显示用户卡特有字段
        binding.llCardBalance.visibility = android.view.View.VISIBLE
        binding.llUserNumber.visibility = android.view.View.VISIBLE
@@ -264,7 +283,7 @@
            binding.tvCardBalance.text = "${balanceInYuan}元"
            
            // 使用完整的用户编号
            binding.tvUserNumber.text = card.getMyUserCode()
            binding.tvUserNumber.text = cardInfo?.cardNum
            
            // 卡片状态(假设正常状态,因为UserCard中没有状态字段)
            binding.tvCardStatus.text = "正常"
@@ -273,7 +292,8 @@
            // 充值时间作为最后使用时间
            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
@@ -362,16 +362,78 @@
                                    putExtra("orderNumber", orderId)
                                    putExtra("cardAddr", cardPhysicalId)
                                    var userCard = UserCard()
                                    userCard.areaNumber = response.content?.cardNum?.substring(0, 12).toString()
                                    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.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
@@ -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()
@@ -98,7 +99,12 @@
                    
                    // 显示充值金额
                    if (rechargeAmount > 0) {
                        textData.append("充值金额:" + String.format("%.2f", rechargeAmount) + "元\n")
                        textData.append(
                            "充值金额:" + String.format(
                                "%.2f",
                                rechargeAmount
                            ) + "元\n"
                        )
                    }
                    
                    // 显示赠送金额
@@ -109,7 +115,12 @@
                    // 显示总金额(写入卡内的总余额)
                    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()
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)
@@ -389,7 +395,11 @@
    /**
     * 启动写卡界面
     */
    private fun startWriteCardActivity(rechargeResult: RechargeResult, rechargeAmount: Double, bonusAmount: Double) {
    private fun startWriteCardActivity(
        rechargeResult: RechargeResult,
        rechargeAmount: Double,
        bonusAmount: Double
    ) {
        try {
            // 创建UserCard对象用于写卡
            val userCard = UserCard().apply {
@@ -398,7 +408,8 @@
                    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() // 赠送金额转分
                    
@@ -407,7 +418,7 @@
                
                // 设置其他必要信息
                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"