左晓为主开发手持机充值管理机
zuoxiao
1 天以前 0ad1393b93f371b1f326d76e7681baca5fe9b0dd
generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt
@@ -16,6 +16,7 @@
import com.dayu.general.R
import com.dayu.general.bean.card.UserCard
import com.dayu.general.bean.net.CardInfoResult
import com.dayu.general.bean.net.CardInfoByClientResult
import com.dayu.general.bean.net.CardReplaceResult
import com.dayu.general.bean.net.PaymentMethod
import com.dayu.general.bean.net.PaymentMethodResponse
@@ -35,7 +36,10 @@
    private lateinit var binding: ActivityCardReplaceBinding
    private var cardNumber: String? = null
    private var cardInfo: CardInfoResult? = null
    private var cardInfoByClient: CardInfoByClientResult? = null
    private var userCard: UserCard? = null
    private var clientNum: String? = null
    private var newCardNumber: String? = null // 新卡卡号
    // 支付方式相关属性
    private var paymentMethod: String = "现金"
@@ -46,8 +50,11 @@
        /**
         * 启动补卡Activity
         */
        fun start(context: Context) {
        fun start(context: Context, clientNum: String? = null) {
            val intent = Intent(context, CardReplaceActivity::class.java)
            clientNum?.let {
                intent.putExtra("clientNum", it)
            }
            context.startActivity(intent)
        }
    }
@@ -57,9 +64,15 @@
        binding = ActivityCardReplaceBinding.inflate(layoutInflater)
        setContentView(binding.root)
        // 获取传递的clientNum参数
        clientNum = intent.getStringExtra("clientNum")
        initView()
        // 获取支付方式
        getPaymentMethods()
        // 无论是否有clientNum,都先显示读卡界面,等待用户刷新卡
        resetToReadingState()
    }
    private fun initView() {
@@ -178,6 +191,8 @@
        binding.bottomButtonContainer.visibility = android.view.View.GONE
        cardNumber = null
        cardInfo = null
        cardInfoByClient = null
        newCardNumber = null
        binding.etCardCost.setText("")
        binding.etReturnAmount.setText("0")
    }
@@ -227,28 +242,37 @@
                }
                return
            }
            val cardNumber = parts[0]
            val readCardNumber = parts[0]
            val cardType = parts[1]
            this.cardNumber = cardNumber
            if (cardNumber.isBlank()) {
            if (readCardNumber.isBlank()) {
                showConfirmDialog("卡号为空,无法进行操作,请重新刷卡") {
                }
                return
            }
            // 根据卡片类型进行不同处理
            when (cardType) {
                CardCommon.USER_CARD_TYPE_1,
                CardCommon.USER_CARD_TYPE_2,
                CardCommon.USER_CARD_TYPE_3 -> {
                    // 用户卡:解析卡内数据并调用接口
                    showConfirmDialog("该卡片类型不支持补卡操作") {
                        resetToReadingState()
            // 保存新卡卡号
            this.newCardNumber = readCardNumber
            // 根据是否有clientNum参数决定获取卡信息的方式
            if (clientNum != null) {
                // 如果有clientNum,使用clientNum获取卡信息
                getCardInfoByClientNum(clientNum!!)
            } else {
                // 如果没有clientNum,根据卡片类型进行处理
                when (cardType) {
                    CardCommon.USER_CARD_TYPE_1,
                    CardCommon.USER_CARD_TYPE_2,
                    CardCommon.USER_CARD_TYPE_3 -> {
                        // 用户卡:解析卡内数据并调用接口
                        showConfirmDialog("该卡片类型不支持补卡操作") {
                            resetToReadingState()
                        }
                    }
                }
                else -> {
                    // 管理类卡不支持补卡
                    handleUserCard(cardNumber, cardType, nfcAdapter)
                    else -> {
                        // 管理类卡不支持补卡
                        handleUserCard(readCardNumber, cardType, nfcAdapter)
                    }
                }
            }
        } catch (e: Exception) {
@@ -327,9 +351,10 @@
        binding.bottomButtonContainer.visibility = android.view.View.VISIBLE
        this.cardInfo = cardInfo
        this.cardNumber = cardNumber
        
        // 显示当前卡地址
        binding.tvCurrentCardAddress.text = cardNumber
        // 显示新卡卡号
        binding.tvCurrentCardAddress.text = newCardNumber ?: cardNumber
        // 显示服务器数据
        cardInfo?.let { info ->
@@ -431,14 +456,22 @@
     * 调用补卡API接口
     */
    private fun callReplaceCardApi(cardCost: Double, returnAmount: Double) {
        if (cardNumber.isNullOrBlank()) {
            ToastUtil.show("卡号信息异常,请重新刷卡")
        if (newCardNumber.isNullOrBlank()) {
            ToastUtil.show("新卡卡号信息异常,请重新刷卡")
            return
        }
        val map = mutableMapOf<String, Any>()
        map["cardAddr"] = cardNumber!!
        map["cardNum"] = cardInfo?.cardNum.toString()
        map["cardAddr"] = newCardNumber!! // 使用新卡卡号
        // 根据数据源选择cardNum参数
        val cardNum = when {
            cardInfo != null -> cardInfo!!.cardNum.toString()
            cardInfoByClient != null -> cardInfoByClient!!.cardNum
            else -> cardNumber ?: newCardNumber!!
        }
        map["cardNum"] = cardNum
        map["cardCost"] = cardCost
        map["returnAmount"] = returnAmount  // 使用返回金额
        map["paymentId"] = paymentId // 使用选中的支付方式ID
@@ -455,7 +488,7 @@
                override fun onNext(t: BaseResponse<CardReplaceResult>) {
                    if (t.success && t.content != null) {
                        // 补卡成功,跳转到写卡界面
                        startWriteCardActivity(t.content!!, cardCost, returnAmount, userCard!!)
                        startWriteCardActivity(t.content!!, cardCost, returnAmount, createUserCardFromData())
                    } else {
                        // 补卡失败
                        val errorMsg = if (t.msg.isNullOrBlank()) "补卡失败,请重试" else t.msg
@@ -471,6 +504,24 @@
                }
            }
        )
    }
    /**
     * 根据现有数据创建UserCard对象
     */
    private fun createUserCardFromData(): UserCard {
        return when {
            userCard != null -> userCard!!
            cardInfoByClient != null -> {
                // 从接口数据创建UserCard对象
                UserCard().apply {
                    // 这里可能需要根据实际需求设置更多属性
                    balance = MornyUtil.changeY2F(cardInfoByClient!!.money)
                    phoneNumber = cardInfoByClient!!.phone.toString()
                }
            }
            else -> UserCard() // 返回空的UserCard对象
        }
    }
    /**
@@ -501,7 +552,7 @@
        }
        val intent = Intent(this, NfcWreatActivity::class.java).apply {
            putExtra("cardAddr", cardNumber)
            putExtra("cardAddr", newCardNumber) // 使用新卡卡号
            putExtra("operationTypeCode", CardOperationType.ReplaceCard.code) // 使用补卡类型进行写卡
            putExtra("orderNumber", replaceResult.orderNo)
            putExtra("cardCost", cardCost)
@@ -513,4 +564,73 @@
        startActivity(intent)
        finish()
    }
    /**
     * 根据客户编号获取卡信息
     */
    private fun getCardInfoByClientNum(clientNum: String) {
        val map = mutableMapOf<String, Any>()
        map["clientNum"] = clientNum
        ApiManager.getInstance().requestGetLoading(
            this,
            "terminal/card/getcardbyclientnum",
            CardInfoByClientResult::class.java,
            map,
            object : SubscriberListener<BaseResponse<CardInfoByClientResult>>() {
                override fun onNext(t: BaseResponse<CardInfoByClientResult>) {
                    if (t.success) {
                        cardInfoByClient = t.content
                        t.content?.let { cardInfo ->
                            // 显示卡信息并切换到信息显示界面
                            showCardInfoFromClient(cardInfo)
                        }
                    } else {
                        showConfirmDialog("获取卡信息失败:${t.msg ?: "未知错误"}") {
                        }
                    }
                }
                override fun onError(e: Throwable?) {
                    super.onError(e)
                    showConfirmDialog("获取卡信息失败: ${e?.message ?: "网络异常,请检查网络连接"}") {
                    }
                }
            }
        )
    }
    /**
     * 显示从客户编号接口获取的卡信息
     */
    private fun showCardInfoFromClient(cardInfo: CardInfoByClientResult) {
        // 隐藏读卡提示,显示信息区域和底部按钮
        binding.scrollReadCard.visibility = android.view.View.GONE
        binding.cardInfoContainer.visibility = android.view.View.VISIBLE
        binding.bottomButtonContainer.visibility = android.view.View.VISIBLE
        // 显示新卡卡号(如果已读取到新卡)
        binding.tvCurrentCardAddress.text = newCardNumber ?: cardInfo.cardNum
        // 显示卡信息
        binding.tvUserName.text = cardInfo.clientName
        binding.tvPhone.text = cardInfo.phone.toString()
        // 根据cardState字段显示状态
        val (statusText, statusColor) = when (cardInfo.cardState) {
            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)
        // 显示余额
        binding.tvCardBalance.text = "${cardInfo.money}元"
        // 设置cardNumber用于后续API调用
        cardNumber = cardInfo.cardNum
    }