package com.dayu.general.activity
|
|
import android.content.Context
|
import android.content.Intent
|
import android.os.Bundle
|
import android.util.TypedValue
|
import android.view.View
|
import android.widget.RadioButton
|
import android.widget.Toast
|
import com.dayu.baselibrary.net.subscribers.SubscriberListener
|
import com.dayu.baselibrary.utils.MornyUtil
|
import com.dayu.baselibrary.utils.ToastUtil
|
import com.dayu.baselibrary.view.TipDialog
|
import com.dayu.baselibrary.view.TitleBar
|
import com.dayu.general.BaseApplication
|
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.CardReplaceResult
|
import com.dayu.general.bean.net.PaymentMethod
|
import com.dayu.general.bean.net.PaymentMethodResponse
|
import com.dayu.general.databinding.ActivityCardReplaceBinding
|
import com.dayu.general.net.ApiManager
|
import com.dayu.general.net.BaseResponse
|
import com.dayu.general.tool.CardCommon
|
import com.dayu.general.tool.CardOperationType
|
import com.dayu.general.tool.NfcReadHelper
|
|
/**
|
* @author: zuo
|
* @desc: 补卡Activity
|
* @since: 2025/6/17
|
*/
|
class CardReplaceActivity : BaseNfcActivity() {
|
private lateinit var binding: ActivityCardReplaceBinding
|
private var cardNumber: String? = null
|
private var cardInfo: CardInfoResult? = null
|
private var userCard: UserCard? = null
|
|
// 支付方式相关属性
|
private var paymentMethod: String = "现金"
|
private var paymentId: Long = 0
|
private var paymentMethodList: List<PaymentMethod> = listOf()
|
|
companion object {
|
/**
|
* 启动补卡Activity
|
*/
|
fun start(context: Context) {
|
val intent = Intent(context, CardReplaceActivity::class.java)
|
context.startActivity(intent)
|
}
|
}
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
super.onCreate(savedInstanceState)
|
binding = ActivityCardReplaceBinding.inflate(layoutInflater)
|
setContentView(binding.root)
|
|
initView()
|
// 获取支付方式
|
getPaymentMethods()
|
}
|
|
private fun initView() {
|
// 设置TitleBar的返回按钮点击事件
|
binding.titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) {
|
finish()
|
}
|
|
// 设置补卡按钮点击事件
|
binding.btnReplace.setOnClickListener {
|
performCardReplace()
|
}
|
}
|
|
/**
|
* 获取支付方式列表
|
*/
|
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@CardReplaceActivity,
|
"获取支付方式失败: ${response.msg}",
|
Toast.LENGTH_SHORT
|
).show()
|
}
|
}
|
|
override fun onError(e: Throwable?) {
|
super.onError(e)
|
Toast.makeText(
|
this@CardReplaceActivity,
|
"获取支付方式失败: ${e?.message ?: "网络异常"}",
|
Toast.LENGTH_SHORT
|
).show()
|
}
|
}
|
)
|
}
|
|
/**
|
* 更新支付方式RadioGroup
|
*/
|
private fun updatePaymentMethodRadioGroup() {
|
// 清空原有RadioButton
|
binding.paymentMethodGroup.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.paymentMethodGroup.addView(radioButton)
|
|
// 默认选中第一个
|
if (index == 0) {
|
radioButton.isChecked = true
|
paymentMethod = method.name
|
paymentId = method.id
|
}
|
}
|
|
// 设置支付方式选择监听
|
binding.paymentMethodGroup.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 resetToReadingState() {
|
binding.scrollReadCard.visibility = android.view.View.VISIBLE
|
binding.cardInfoContainer.visibility = android.view.View.GONE
|
binding.bottomButtonContainer.visibility = android.view.View.GONE
|
cardNumber = null
|
cardInfo = null
|
binding.etCardCost.setText("")
|
binding.etReturnAmount.setText("0")
|
}
|
|
/**
|
* 显示确认对话框
|
*/
|
private fun showConfirmDialog(message: String, onConfirm: () -> Unit) {
|
val confirmDialog = TipDialog(this, message) {
|
onConfirm()
|
}
|
confirmDialog.show()
|
}
|
|
override fun onNfcBack(intent: Intent?) {
|
intent?.let {
|
// 处理正常的读卡操作
|
handleNfcIntent(it)
|
} ?: run {
|
showConfirmDialog("NFC数据异常,请重新刷卡") {
|
}
|
}
|
}
|
|
/**
|
* 处理NFC刷卡信息
|
*/
|
private fun handleNfcIntent(intent: Intent) {
|
try {
|
// 检查intent中是否包含NFC Tag
|
if (intent.getParcelableExtra<android.nfc.Tag>(android.nfc.NfcAdapter.EXTRA_TAG) == null) {
|
showConfirmDialog("未检测到NFC卡片,请确保卡片已正确放置") {
|
}
|
return
|
}
|
|
val nfcAdapter = NfcReadHelper.getInstance(intent, this)
|
val cardTypeAndCardNumber = nfcAdapter.getCardTypeAndCardNumber()
|
if (cardTypeAndCardNumber.isNullOrBlank() || !cardTypeAndCardNumber.contains(",")) {
|
showConfirmDialog("卡片信息读取失败,请重新刷卡") {
|
}
|
return
|
}
|
val parts = cardTypeAndCardNumber.split(",")
|
if (parts.size < 2) {
|
showConfirmDialog("卡片信息格式异常,请重新刷卡") {
|
}
|
return
|
}
|
val cardNumber = parts[0]
|
val cardType = parts[1]
|
this.cardNumber = cardNumber
|
if (cardNumber.isBlank()) {
|
showConfirmDialog("卡号为空,无法进行操作,请重新刷卡") {
|
}
|
return
|
}
|
|
// 根据卡片类型进行不同处理
|
when (cardType) {
|
CardCommon.USER_CARD_TYPE_1,
|
CardCommon.USER_CARD_TYPE_2,
|
CardCommon.USER_CARD_TYPE_3 -> {
|
// 用户卡:解析卡内数据并调用接口
|
showConfirmDialog("该卡片类型不支持补卡操作") {
|
resetToReadingState()
|
}
|
}
|
else -> {
|
// 管理类卡不支持补卡
|
handleUserCard(cardNumber, cardType, nfcAdapter)
|
}
|
}
|
} catch (e: Exception) {
|
showConfirmDialog("读卡异常:${e.message}") {
|
}
|
e.printStackTrace()
|
}
|
}
|
|
/**
|
* 处理用户卡
|
*/
|
private fun handleUserCard(cardNumber: String, cardType: String, nfcAdapter: NfcReadHelper) {
|
// 解析用户卡数据
|
val userCard = nfcAdapter.getUserCardData()
|
if (userCard == null) {
|
showConfirmDialog("解析卡片数据失败,请重新刷卡") {
|
}
|
return
|
}
|
|
// 输出用户卡内所有信息到日志
|
android.util.Log.d("CardReplaceActivity", "=== 用户卡信息 ===")
|
android.util.Log.d("CardReplaceActivity", "卡号: $cardNumber")
|
android.util.Log.d("CardReplaceActivity", "卡片类型: $cardType")
|
android.util.Log.d("CardReplaceActivity", "卡内余额: ${userCard.balance}")
|
android.util.Log.d("CardReplaceActivity", "==================")
|
this.userCard = userCard
|
// 根据卡号获取卡片详细信息
|
getCardInfo(cardNumber, cardType, userCard)
|
}
|
|
/**
|
* 获取卡片详细信息(用户卡专用)
|
*/
|
private fun getCardInfo(cardNumber: String, cardType: String, userCard: UserCard) {
|
val map = mutableMapOf<String, Any>()
|
map["cardAddr"] = cardNumber
|
ApiManager.getInstance().requestGetLoading(
|
this,
|
"terminal/card/readCard",
|
CardInfoResult::class.java,
|
map,
|
object : SubscriberListener<BaseResponse<CardInfoResult>>() {
|
override fun onNext(t: BaseResponse<CardInfoResult>) {
|
if (t.success) {
|
// 读卡成功,显示用户卡详细信息
|
showUserCardInfo(t.content, cardNumber, cardType, userCard)
|
} else {
|
// 处理获取失败的情况
|
handleCardInfoError(t.code, t.msg)
|
}
|
}
|
|
override fun onError(e: Throwable?) {
|
super.onError(e)
|
showConfirmDialog("获取卡信息失败: ${e?.message ?: "网络异常,请检查网络连接"}") {
|
}
|
}
|
}
|
)
|
}
|
|
/**
|
* 显示用户卡片信息(包含卡内数据和接口返回数据)
|
*/
|
private fun showUserCardInfo(
|
cardInfo: CardInfoResult?,
|
cardNumber: String,
|
cardType: String,
|
userCard: UserCard
|
) {
|
// 隐藏读卡提示,显示信息区域和底部按钮
|
binding.scrollReadCard.visibility = android.view.View.GONE
|
binding.cardInfoContainer.visibility = android.view.View.VISIBLE
|
binding.bottomButtonContainer.visibility = android.view.View.VISIBLE
|
|
this.cardInfo = cardInfo
|
|
// 显示当前卡地址
|
binding.tvCurrentCardAddress.text = cardNumber
|
|
// 显示服务器数据
|
cardInfo?.let { info ->
|
binding.tvUserName.text = info.userName ?: "未知"
|
binding.tvPhone.text = info.phone ?: "未绑定"
|
|
// 根据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)
|
}
|
|
userCard.let { card ->
|
// 余额转换为元(原始数据可能是分)
|
binding.tvCardBalance.text = MornyUtil.changeF2Y(card.balance) + "元"
|
}
|
}
|
|
/**
|
* 处理卡信息获取错误
|
*/
|
private fun handleCardInfoError(code: String?, msg: String?) {
|
val errorMessage: String = when (code) {
|
"1001" -> {
|
"该卡片未在系统中注册,无法进行补卡操作。"
|
}
|
|
else -> {
|
when {
|
msg.isNullOrBlank() -> "获取卡信息失败,请重新刷卡重试。"
|
msg.contains("数据不存在") -> "该卡片未在系统中注册,无法进行补卡操作。"
|
msg.contains("网络") -> "网络连接异常,请检查网络连接后重新刷卡。"
|
msg.contains("超时") -> "网络请求超时,请重新刷卡重试。"
|
else -> "获取卡信息失败:$msg\n\n请重新刷卡重试。"
|
}
|
}
|
}
|
|
// 显示错误信息的对话框
|
showConfirmDialog(errorMessage) {
|
resetToReadingState()
|
}
|
}
|
|
/**
|
* 执行补卡操作
|
*/
|
private fun performCardReplace() {
|
// 验证输入
|
val cardCostStr = binding.etCardCost.text.toString().trim()
|
val returnAmountStr = binding.etReturnAmount.text.toString().trim()
|
|
// 工本费验证(必填)
|
if (cardCostStr.isEmpty()) {
|
ToastUtil.show("请输入工本费")
|
return
|
}
|
|
val cardCost = try {
|
val cost = cardCostStr.toDouble()
|
if (cost < 0) {
|
ToastUtil.show("工本费不能为负数")
|
return
|
}
|
cost
|
} catch (e: NumberFormatException) {
|
ToastUtil.show("请输入有效的工本费")
|
return
|
}
|
|
// 返回金额验证(必填)
|
if (returnAmountStr.isEmpty()) {
|
ToastUtil.show("请输入返回金额")
|
return
|
}
|
|
val returnAmount = try {
|
val amount = returnAmountStr.toDouble()
|
if (amount < 0) {
|
ToastUtil.show("返回金额不能为负数")
|
return
|
}
|
amount
|
} catch (e: NumberFormatException) {
|
ToastUtil.show("请输入有效的返回金额")
|
return
|
}
|
|
callReplaceCardApi(cardCost, returnAmount)
|
}
|
|
/**
|
* 调用补卡API接口
|
*/
|
private fun callReplaceCardApi(cardCost: Double, returnAmount: Double) {
|
if (cardNumber.isNullOrBlank()) {
|
ToastUtil.show("卡号信息异常,请重新刷卡")
|
return
|
}
|
|
val map = mutableMapOf<String, Any>()
|
map["cardAddr"] = cardNumber!!
|
map["cardNum"] = cardInfo?.cardNum.toString()
|
map["cardCost"] = cardCost
|
map["returnAmount"] = returnAmount // 使用返回金额
|
map["paymentId"] = paymentId // 使用选中的支付方式ID
|
map["paymentMethod"] = paymentMethod // 添加支付方式名称
|
map["remarks"] = "补卡操作" // 固定备注
|
map["operator"] = BaseApplication.userId
|
|
ApiManager.getInstance().requestPostLoading(
|
this,
|
"terminal/card/termReissue",
|
CardReplaceResult::class.java,
|
map,
|
object : SubscriberListener<BaseResponse<CardReplaceResult>>() {
|
override fun onNext(t: BaseResponse<CardReplaceResult>) {
|
if (t.success && t.content != null) {
|
// 补卡成功,跳转到写卡界面
|
startWriteCardActivity(t.content!!, cardCost, returnAmount, userCard!!)
|
} else {
|
// 补卡失败
|
val errorMsg = if (t.msg.isNullOrBlank()) "补卡失败,请重试" else t.msg
|
showConfirmDialog("补卡失败:$errorMsg") {
|
}
|
}
|
}
|
|
override fun onError(e: Throwable?) {
|
super.onError(e)
|
showConfirmDialog("补卡请求失败: ${e?.message ?: "网络异常,请检查网络连接"}") {
|
}
|
}
|
}
|
)
|
}
|
|
/**
|
* 跳转到写卡界面进行卡内容更新
|
*/
|
private fun startWriteCardActivity(
|
replaceResult: CardReplaceResult,
|
cardCost: Double,
|
returnAmount: Double,
|
userCard: UserCard
|
) {
|
// 创建更新后的用户卡数据
|
val updatedUserCard = UserCard().apply {
|
// 复制原有属性
|
cardType = userCard.cardType
|
areaNumber = userCard.areaNumber
|
userCode = userCard.userCode
|
userCodeNumber = userCard.userCodeNumber
|
phoneNumber = userCard.phoneNumber
|
projectCode = userCard.projectCode
|
surplusWater = userCard.surplusWater
|
waterPrice = userCard.waterPrice
|
electricPrice = userCard.electricPrice
|
rechargeDate = userCard.rechargeDate
|
|
// 使用返回的新余额
|
balance = MornyUtil.changeY2F(replaceResult.balance.toString())
|
}
|
|
val intent = Intent(this, NfcWreatActivity::class.java).apply {
|
putExtra("cardAddr", cardNumber)
|
putExtra("operationTypeCode", CardOperationType.ReplaceCard.code) // 使用补卡类型进行写卡
|
putExtra("orderNumber", replaceResult.orderNo)
|
putExtra("cardCost", cardCost)
|
putExtra("returnAmount", returnAmount) // 传递返回金额
|
putExtra("paymentMethod", paymentMethod) // 传递支付方式
|
putExtra("paymentId", paymentId) // 传递支付方式ID
|
putExtra("userCard", updatedUserCard as java.io.Serializable)
|
}
|
startActivity(intent)
|
finish()
|
}
|
}
|