| | |
| | | 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 = "现金" |
| | |
| | | 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) |
| | | } |
| | | } |
| | |
| | | // 获取传递的数据 |
| | | 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() { |
| | |
| | | |
| | | // 设置按钮点击事件 |
| | | 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) |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | |
| | | /** |
| | |
| | | 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 -> "锁定" |
| | |
| | | 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") // 红色-锁定 |
| | |
| | | } |
| | | } |
| | | |
| | | private fun handleWriteCard() { |
| | | /** |
| | | * 处理充值逻辑 |
| | | */ |
| | | private fun handleRecharge() { |
| | | // 验证充值金额 |
| | | val rechargeAmountStr = binding.rechargeMorny.text.toString().trim() |
| | | if (rechargeAmountStr.isEmpty()) { |
| | |
| | | 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}") |
| | | } |
| | | } |
| | | } |