package com.dayu.general.activity
|
|
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.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.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 = "现金"
|
private var paymentId: Long = 0
|
private var paymentMethodList: List<PaymentMethod> = listOf()
|
|
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?, 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)
|
}
|
}
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
super.onCreate(savedInstanceState)
|
binding = ActivityRechargeDetailBinding.inflate(layoutInflater)
|
setContentView(binding.root)
|
|
// 隐藏默认ActionBar
|
supportActionBar?.hide()
|
|
// 获取传递的数据
|
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() {
|
// 设置TitleBar的返回按钮点击事件
|
binding.titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) {
|
finish()
|
}
|
|
// 设置按钮点击事件
|
binding.rechargeRegistBtn.setOnClickListener {
|
// 处理充值逻辑
|
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)
|
}
|
}
|
})
|
}
|
|
/**
|
* 获取支付方式列表
|
*/
|
private fun getPaymentMethods() {
|
ApiManager.getInstance().requestGetLoading(
|
this,
|
"sell/paymentmethod/get",
|
PaymentMethodResponse::class.java,
|
null,
|
object : SubscriberListener<BaseResponse<PaymentMethodResponse>>() {
|
override fun onNext(response: BaseResponse<PaymentMethodResponse>) {
|
if (response.success) {
|
// 获取支付方式列表
|
val paymentMethods = response.content?.obj ?: listOf()
|
if (paymentMethods.isNotEmpty()) {
|
paymentMethodList = paymentMethods
|
// 更新支付方式显示
|
updatePaymentMethodRadioGroup()
|
}
|
} else {
|
Toast.makeText(
|
this@RechargeDetailActivity,
|
"获取支付方式失败: ${response.msg}",
|
Toast.LENGTH_SHORT
|
).show()
|
}
|
}
|
|
override fun onError(e: Throwable?) {
|
super.onError(e)
|
Toast.makeText(
|
this@RechargeDetailActivity,
|
"获取支付方式失败: ${e?.message ?: "网络异常"}",
|
Toast.LENGTH_SHORT
|
).show()
|
}
|
}
|
)
|
}
|
|
/**
|
* 更新支付方式RadioGroup
|
*/
|
private fun updatePaymentMethodRadioGroup() {
|
// 清空原有RadioButton
|
binding.newCardPaymentMethod.removeAllViews()
|
|
// 动态添加RadioButton
|
paymentMethodList.forEachIndexed { index, method ->
|
val radioButton = RadioButton(this)
|
radioButton.id = View.generateViewId() // 生成唯一ID
|
radioButton.layoutParams = android.widget.LinearLayout.LayoutParams(
|
0,
|
resources.getDimensionPixelSize(R.dimen.dimen_40),
|
1.0f
|
)
|
|
// 如果不是最后一个按钮,添加右边距
|
if (index < paymentMethodList.size - 1) {
|
(radioButton.layoutParams as android.widget.LinearLayout.LayoutParams).rightMargin =
|
resources.getDimensionPixelSize(R.dimen.dimen_15)
|
}
|
|
radioButton.text = method.name
|
radioButton.background = resources.getDrawable(R.drawable.radio_selector)
|
radioButton.buttonDrawable = null
|
radioButton.gravity = android.view.Gravity.CENTER
|
radioButton.setTextColor(resources.getColorStateList(R.color.radio_button_text_color))
|
radioButton.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f)
|
|
// 添加到RadioGroup
|
binding.newCardPaymentMethod.addView(radioButton)
|
|
// 默认选中第一个
|
if (index == 0) {
|
radioButton.isChecked = true
|
paymentMethod = method.name
|
paymentId = method.id
|
}
|
}
|
|
// 设置支付方式选择监听
|
binding.newCardPaymentMethod.setOnCheckedChangeListener { group, checkedId ->
|
// 根据选中的ID获取支付方式
|
for (i in 0 until group.childCount) {
|
val radioButton = group.getChildAt(i) as RadioButton
|
if (radioButton.id == checkedId) {
|
paymentMethod = radioButton.text.toString()
|
paymentId = paymentMethodList[i].id
|
break
|
}
|
}
|
}
|
}
|
|
private fun displayCardInfo() {
|
if (cardInfo == null) {
|
ToastUtil.show("卡信息为空")
|
finish()
|
return
|
}
|
|
cardInfo?.let { info ->
|
// 设置卡片信息
|
binding.redInitCode.text = cardAddress ?: ""
|
binding.userName.text = info.userName ?: ""
|
binding.redCardNum.text = info.cardNum ?: ""
|
|
// 使用用户卡中的余额显示
|
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) {
|
1 -> "正常"
|
2 -> "挂失"
|
3 -> "锁定"
|
4 -> "无效卡片"
|
else -> "未知"
|
}
|
binding.redStatu.text = cardStatus
|
|
// 根据卡状态设置不同颜色
|
val statusColor = when (info.status) {
|
1 -> android.graphics.Color.parseColor("#4CAF50") // 绿色-正常
|
2 -> android.graphics.Color.parseColor("#FF9800") // 橙色-挂失
|
3 -> android.graphics.Color.parseColor("#F44336") // 红色-锁定
|
else -> android.graphics.Color.parseColor("#757575") // 灰色-未知
|
}
|
binding.redStatu.setTextColor(statusColor)
|
}
|
}
|
|
/**
|
* 处理充值逻辑
|
*/
|
private fun handleRecharge() {
|
// 验证充值金额
|
val rechargeAmountStr = binding.rechargeMorny.text.toString().trim()
|
if (rechargeAmountStr.isEmpty()) {
|
ToastUtil.show("请输入充值金额")
|
return
|
}
|
|
val rechargeAmount = try {
|
rechargeAmountStr.toDouble()
|
} catch (e: NumberFormatException) {
|
ToastUtil.show("请输入有效的充值金额")
|
return
|
}
|
|
if (rechargeAmount <= 0) {
|
ToastUtil.show("充值金额必须大于0")
|
return
|
}
|
|
// 获取赠送金额(可选)
|
val bonusAmountStr = binding.rechargeWater.text.toString().trim()
|
val bonusAmount = if (bonusAmountStr.isNotEmpty()) {
|
try {
|
bonusAmountStr.toDouble()
|
} catch (e: NumberFormatException) {
|
0.0
|
}
|
} else {
|
0.0
|
}
|
|
// 调用充值接口
|
callRechargeApi(rechargeAmount, bonusAmount)
|
}
|
|
/**
|
* 调用充值接口
|
*/
|
private fun callRechargeApi(rechargeAmount: Double, bonusAmount: Double) {
|
val cardNum = cardInfo?.cardNum ?: cardAddress ?: ""
|
if (cardNum.isEmpty()) {
|
ToastUtil.show("卡号信息缺失")
|
return
|
}
|
|
// 获取水价(如果为空会自动触发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 ?: ""
|
balance = ((rechargeAmount + bonusAmount) * 100).toInt() // 转换为分
|
}
|
|
// 设置其他必要信息
|
projectCode = rechargeResult.projectNo
|
waterPrice = rechargeResult.waterPrice.toFloat()
|
rechargeDate = java.util.Calendar.getInstance()
|
}
|
|
// 启动写卡Activity
|
val intent = Intent(this, NfcWreatActivity::class.java).apply {
|
putExtra("cardType", "USER_CARD") // 用户卡类型
|
putExtra("cardAddr", cardAddress)
|
putExtra("operationTypeCode", CardOperationType.Recharge.code)
|
putExtra("orderNumber", rechargeResult.orderNo)
|
putExtra("userCard", userCard)
|
}
|
|
startActivity(intent)
|
|
// 显示成功信息
|
val formattedRecharge = String.format("%.2f", rechargeAmount)
|
val formattedBonus = String.format("%.2f", bonusAmount)
|
val formattedTotal = String.format("%.2f", rechargeAmount + bonusAmount)
|
|
ToastUtil.show("充值订单创建成功\n订单号: ${rechargeResult.orderNo}\n充值金额: ${formattedRecharge}元\n赠送金额: ${formattedBonus}元\n总金额: ${formattedTotal}元\n请贴卡进行写卡操作")
|
|
} catch (e: Exception) {
|
ToastUtil.show("启动写卡界面失败: ${e.message}")
|
}
|
}
|
}
|