左晓为主开发手持机充值管理机
generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt
@@ -4,16 +4,16 @@
import android.content.Intent
import android.os.Bundle
import com.dayu.baselibrary.net.subscribers.SubscriberListener
import com.dayu.baselibrary.utils.ToastUtil
import com.dayu.baselibrary.utils.MornyUtil
import com.dayu.baselibrary.view.TipDialog
import com.dayu.baselibrary.view.TitleBar
import com.dayu.general.bean.card.UserCard
import com.dayu.general.bean.net.CardInfoResult
import com.dayu.general.databinding.ActivityCardReadBinding
import com.dayu.general.net.ApiManager
import com.dayu.general.net.BaseResponse
import com.dayu.general.tool.NfcReadHelper
import com.dayu.general.bean.card.UserCard
import com.dayu.general.tool.CardCommon
import com.dayu.general.tool.NfcReadHelper
/**
 * @author: zuo
@@ -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,18 @@
            // 根据卡片类型进行不同处理
            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)
                }
                "00" -> {
                    // 地区卡:显示卡片类型信息
                    handleUserCard(cardNumber, cardType, nfcAdapter)
                }
                else -> {
                    // 管理类卡:显示卡片类型信息
                    handleManagementCard(cardNumber, cardType)
@@ -139,16 +143,39 @@
     * 处理用户卡
     */
    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)
        }
        // 根据卡号获取卡片详细信息
        getCardInfo(cardNumber, cardType, userCard)
    }
    /**
@@ -156,7 +183,7 @@
     */
    private fun handleManagementCard(cardNumber: String, cardType: String) {
        val cardTypeName = getCardTypeName(cardType)
        // 显示管理卡信息
        showManagementCardInfo(cardNumber, cardTypeName)
    }
@@ -168,13 +195,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
@@ -207,7 +233,7 @@
    /**
     * 获取卡片详细信息(用户卡专用)
     */
    private fun getCardInfo(cardNumber: String, cardType: String, userCard: UserCard) {
    private fun getCardInfo(cardNumber: String, cardType: String, userCard: UserCard?) {
        val map = mutableMapOf<String, Any>()
        map["cardAddr"] = cardNumber
        ApiManager.getInstance().requestGetLoading(
@@ -238,62 +264,84 @@
    /**
     * 显示用户卡片信息(包含卡内数据和接口返回数据)
     */
    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) {
                String.format("%.2f", card.balance / 100.0)
            } else {
                card.balance.toString()
            }
            binding.tvCardBalance.text = "${balanceInYuan}元"
            // 使用完整的用户编号
            binding.tvUserNumber.text = card.getMyUserCode()
            // 卡片状态(假设正常状态,因为UserCard中没有状态字段)
            binding.tvCardStatus.text = "正常"
            binding.tvCardStatus.setTextColor(android.graphics.Color.parseColor("#4CAF50"))
        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)
                val dateFormat =
                    java.text.SimpleDateFormat("yyyy-MM-dd HH:mm", java.util.Locale.getDefault())
                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作为身份证号的替代
            // 根据status字段显示状态
            val statusText = when (info.status) {
                1 -> "正常"
                2 -> "挂失"
                3 -> "锁定"
                else -> "未知"
            // 根据state字段显示状态
            val (statusText, statusColor) = when (info.state) {
                1 -> Pair("正常", android.graphics.Color.parseColor("#4CAF50")) // 绿色
                2 -> Pair("已注销", android.graphics.Color.parseColor("#FF5722")) // 深橙色
                3 -> Pair("已挂失", android.graphics.Color.parseColor("#FF9800")) // 橙色
                4 -> Pair("无效卡片", android.graphics.Color.parseColor("#F44336")) // 红色
                else -> Pair("未知状态", android.graphics.Color.parseColor("#9E9E9E")) // 灰色
            }
            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"))
        }
    }
@@ -305,6 +353,7 @@
            "1001" -> {
                "该卡片未在系统中注册,请先进行开卡操作。"
            }
            else -> {
                when {
                    msg.isNullOrBlank() -> "获取卡信息失败,请重新刷卡重试。"