左晓为主开发手持机充值管理机
zuoxiao
12 小时以前 ec09d4bcd191496272099c2ab31d097ad630ee78
generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
@@ -3,27 +3,38 @@
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.util.TypedValue
import android.view.View
import android.widget.EditText
import android.widget.RadioButton
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
import com.dayu.general.R
import com.dayu.general.bean.net.CardInfoResult
import com.dayu.general.bean.net.PaymentMethod
import com.dayu.general.bean.net.PaymentMethodResponse
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.databinding.ActivityRechargeDetailBinding
import com.dayu.general.net.ApiManager
import com.dayu.general.net.BaseResponse
import com.dayu.general.tool.CardCommon.Companion.USER_CARD_TYPE_1
import com.dayu.general.tool.CardOperationType
class RechargeDetailActivity : AppCompatActivity() {
    private lateinit var binding: ActivityRechargeDetailBinding
    private var cardInfo: CardInfoResult? = null
    private var cardAddress: String? = null
    private var userCard: UserCard? = null
    // 支付方式相关属性
    private var paymentMethod: String = "现金"
@@ -33,11 +44,18 @@
    companion object {
        private const val EXTRA_CARD_INFO = "extra_card_info"
        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?) {
        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)
            intent.putExtra(EXTRA_USER_CARD, userCard)
            context.startActivity(intent)
        }
    }
@@ -53,11 +71,14 @@
        // 获取传递的数据
        cardInfo = intent.getSerializableExtra(EXTRA_CARD_INFO) as? CardInfoResult
        cardAddress = intent.getStringExtra(EXTRA_CARD_ADDRESS)
        userCard = intent.getSerializableExtra(EXTRA_USER_CARD) as? UserCard
        initView()
        displayCardInfo()
        // 获取支付方式
        getPaymentMethods()
        // 确保水价可用(如果为空会自动触发MainActivity获取)
        BaseApplication.requestWaterPrice()
    }
    private fun initView() {
@@ -68,9 +89,63 @@
        // 设置按钮点击事件
        binding.rechargeRegistBtn.setOnClickListener {
            // 处理写卡逻辑
            handleWriteCard()
            // 处理充值逻辑
            handleRecharge()
        }
        // 设置金额输入限制
        setupAmountInputLimit(binding.rechargeMorny)
        setupAmountInputLimit(binding.rechargeWater)
    }
    /**
     * 设置金额输入限制,最多保留两位小数
     */
    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(".")
                    if (parts.size == 2) {
                        val decimalPart = parts[1]
                        // 如果小数位超过2位,截取前两位
                        if (decimalPart.length > 2) {
                            val newText = "${parts[0]}.${decimalPart.substring(0, 2)}"
                            editText.removeTextChangedListener(this)
                            editText.setText(newText)
                            editText.setSelection(newText.length)
                            editText.addTextChangedListener(this)
                        }
                    }
                }
                // 防止输入多个小数点
                val dotCount = text.count { it == '.' }
                if (dotCount > 1) {
                    val newText = text.substring(0, text.lastIndexOf('.'))
                    editText.removeTextChangedListener(this)
                    editText.setText(newText)
                    editText.setSelection(newText.length)
                    editText.addTextChangedListener(this)
                }
                // 防止以小数点开头
                if (text.startsWith(".")) {
                    editText.removeTextChangedListener(this)
                    editText.setText("0$text")
                    editText.setSelection(editText.text.length)
                    editText.addTextChangedListener(this)
                }
            }
        })
    }
    /**
@@ -180,10 +255,19 @@
            binding.redInitCode.text = cardAddress ?: ""
            binding.userName.text = info.userName ?: ""
            binding.redCardNum.text = info.cardNum ?: ""
            binding.redRemainderBlance.text = "${info.balance ?: 0} 元"
            // 使用用户卡中的余额显示
            val balance = userCard?.let {
                // 将分转换为元,保留两位小数
                String.format("%.2f", it.balance / 100.0)
            } ?: run {
                // 如果用户卡为空,则使用服务器返回的余额
                String.format("%.2f", info.balance ?: 0.0)
            }
            binding.redRemainderBlance.text = "$balance 元"
            // 设置卡状态和对应颜色
            val cardStatus = when (info.status) {
            val cardStatus = when (info.state) {
                1 -> "正常"
                2 -> "挂失"
                3 -> "锁定"
@@ -193,7 +277,7 @@
            binding.redStatu.text = cardStatus
            // 根据卡状态设置不同颜色
            val statusColor = when (info.status) {
            val statusColor = when (info.state) {
                1 -> android.graphics.Color.parseColor("#4CAF50") // 绿色-正常
                2 -> android.graphics.Color.parseColor("#FF9800") // 橙色-挂失
                3 -> android.graphics.Color.parseColor("#F44336") // 红色-锁定
@@ -203,7 +287,10 @@
        }
    }
    private fun handleWriteCard() {
    /**
     * 处理充值逻辑
     */
    private fun handleRecharge() {
        // 验证充值金额
        val rechargeAmountStr = binding.rechargeMorny.text.toString().trim()
        if (rechargeAmountStr.isEmpty()) {
@@ -235,20 +322,120 @@
            0.0
        }
        // 显示确认信息
        val totalAmount = rechargeAmount + bonusAmount
        val confirmMessage = """
            确认充值信息:
            卡号:${cardAddress}
            充值金额:${rechargeAmount}元
            赠送金额:${bonusAmount}元
            总金额:${totalAmount}元
            支付方式:${paymentMethod}
        """.trimIndent()
        // 调用充值接口
        callRechargeApi(rechargeAmount, bonusAmount)
    }
        ToastUtil.show(confirmMessage)
    /**
     * 调用充值接口
     */
    private fun callRechargeApi(rechargeAmount: Double, bonusAmount: Double) {
        val cardNum = cardInfo?.cardNum ?: cardAddress ?: ""
        if (cardNum.isEmpty()) {
            ToastUtil.show("卡号信息缺失")
            return
        }
        // TODO: 调用写卡API
        // 这里可以添加实际的写卡逻辑
        // 获取水价(如果为空会自动触发MainActivity获取)
        val currentWaterPrice = BaseApplication.requestWaterPrice()
        // 构建充值请求参数
        val rechargeRequest = RechargeRequest(
            rechargeType = 2,
            cardNum = cardNum,
            money = String.format("%.0f", rechargeAmount),
            amount = String.format("%.0f", bonusAmount),
            gift = String.format("%.0f", bonusAmount),
            paymentId = paymentId.toString(),
            price = String.format("%.2f", currentWaterPrice), // 使用统一获取的水价
            remarks = "充值",
            operator = BaseApplication.userId // 默认操作员ID,可以根据实际情况调整
        )
        // 转换为Map格式
        val params = mapOf(
            "rechargeType" to rechargeRequest.rechargeType,
            "cardNum" to rechargeRequest.cardNum,
            "money" to rechargeRequest.money,
            "amount" to rechargeRequest.amount,
            "gift" to rechargeRequest.gift,
            "paymentId" to rechargeRequest.paymentId,
            "price" to rechargeRequest.price,
            "remarks" to rechargeRequest.remarks,
            "operator" to rechargeRequest.operator
        )
        ApiManager.getInstance().requestPostLoading(
            this,
            "terminal/card/termRecharge",
            RechargeResult::class.java,
            params,
            object : SubscriberListener<BaseResponse<RechargeResult>>() {
                override fun onNext(response: BaseResponse<RechargeResult>) {
                    if (response.success && response.code == "0001") {
                        // 充值成功,跳转到写卡界面
                        response.content?.let { rechargeResult ->
                            startWriteCardActivity(rechargeResult, rechargeAmount, bonusAmount)
                        } ?: run {
                            ToastUtil.show("充值成功但返回数据为空")
                        }
                    } else {
                        ToastUtil.show("充值失败: ${response.msg ?: "未知错误"}")
                    }
                }
                override fun onError(e: Throwable?) {
                    super.onError(e)
                    ToastUtil.show("充值失败: ${e?.message ?: "网络异常"}")
                }
            }
        )
    }
    /**
     * 启动写卡界面
     */
    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 rechargeAmountInCents = (rechargeAmount * 100).toInt() // 充值金额转分
                    val bonusAmountInCents = (bonusAmount * 100).toInt() // 赠送金额转分
                    balance = originalBalance + rechargeAmountInCents + bonusAmountInCents
                }
                // 设置其他必要信息
                projectCode = rechargeResult.projectNo
                waterPrice = MornyUtil.changeY2F(rechargeResult.waterPrice.toString())
                rechargeDate = java.util.Calendar.getInstance()
            }
            // 启动写卡Activity
            val intent = Intent(this, NfcWreatActivity::class.java).apply {
                putExtra("cardType", USER_CARD_TYPE_1) // 用户卡类型
                putExtra("cardAddr", cardAddress)
                putExtra("operationTypeCode", CardOperationType.Recharge.code)
                putExtra("orderNumber", rechargeResult.orderNo)
                putExtra("userCard", userCard)
                putExtra("rechargeAmount", rechargeAmount) // 传递充值金额
                putExtra("bonusAmount", bonusAmount) // 传递赠送金额
            }
            startActivity(intent)
            finish()
        } catch (e: Exception) {
            ToastUtil.show("启动写卡界面失败: ${e.message}")
        }
    }