package com.dayu.general.activity
|
|
import android.content.Context
|
import android.content.Intent
|
import android.os.Bundle
|
import android.text.TextUtils
|
import com.dayu.baselibrary.net.subscribers.SubscriberListener
|
import com.dayu.baselibrary.utils.ToastUtil
|
import com.dayu.baselibrary.view.TipDialog
|
import com.dayu.baselibrary.view.TitleBar
|
import com.dayu.general.bean.net.CardInfoResult
|
import com.dayu.general.databinding.ActivityCardCancelBinding
|
import com.dayu.general.net.ApiManager
|
import com.dayu.general.net.BaseResponse
|
import com.dayu.general.tool.NfcReadHelper
|
import com.dayu.general.bean.card.UserCard
|
import com.dayu.general.tool.CardCommon
|
|
/**
|
* @author: zuo
|
* @desc: 销卡Activity
|
* @since: 2025/3/6
|
*/
|
class CardCancelActivity : BaseNfcActivity() {
|
private lateinit var binding: ActivityCardCancelBinding
|
private var cardNumber: String? = null
|
private var cardInfo: CardInfoResult? = null
|
|
companion object {
|
/**
|
* 启动销卡Activity
|
*/
|
fun start(context: Context) {
|
val intent = Intent(context, CardCancelActivity::class.java)
|
context.startActivity(intent)
|
}
|
}
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
super.onCreate(savedInstanceState)
|
binding = ActivityCardCancelBinding.inflate(layoutInflater)
|
setContentView(binding.root)
|
|
initView()
|
}
|
|
private fun initView() {
|
// 设置TitleBar的返回按钮点击事件
|
binding.titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) {
|
finish()
|
}
|
|
// 设置销卡按钮点击事件
|
binding.btnCancelCard.setOnClickListener {
|
performCardCancel()
|
}
|
}
|
|
/**
|
* 重置到读卡状态
|
*/
|
private fun resetToReadingState() {
|
binding.cardReadLL.visibility = android.view.View.VISIBLE
|
binding.cardInfoContainer.visibility = android.view.View.GONE
|
cardNumber = null
|
cardInfo = null
|
binding.etRefundAmount.setText("")
|
binding.etRemarks.setText("")
|
}
|
|
/**
|
* 显示确认对话框
|
*/
|
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 -> {
|
// 用户卡:解析卡内数据并调用接口
|
handleUserCard(cardNumber, cardType, nfcAdapter)
|
}
|
|
else -> {
|
// 管理类卡不支持销卡
|
showConfirmDialog("该卡片类型不支持销卡操作") {
|
resetToReadingState()
|
}
|
}
|
}
|
} 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("CardCancelActivity", "=== 用户卡信息 ===")
|
android.util.Log.d("CardCancelActivity", "卡号: $cardNumber")
|
android.util.Log.d("CardCancelActivity", "卡片类型: $cardType")
|
android.util.Log.d("CardCancelActivity", "卡内余额: ${userCard.balance}")
|
android.util.Log.d("CardCancelActivity", "==================")
|
|
// 根据卡号获取卡片详细信息
|
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.cardReadLL.visibility = android.view.View.GONE
|
binding.cardInfoContainer.visibility = android.view.View.VISIBLE
|
|
this.cardInfo = cardInfo
|
binding.tvCardNumber.text = cardNumber
|
|
userCard.let { card ->
|
// 余额转换为元(原始数据可能是分)
|
val balanceInYuan = if (card.balance > 1000) {
|
String.format("%.2f", card.balance / 100.0)
|
} else {
|
card.balance.toString()
|
}
|
binding.tvCardBalance.text = "${balanceInYuan}元"
|
|
// 默认退款金额设置为卡内余额
|
binding.etRefundAmount.setText(balanceInYuan)
|
|
// 卡片状态
|
binding.tvCardStatus.text = "正常"
|
binding.tvCardStatus.setTextColor(android.graphics.Color.parseColor("#4CAF50"))
|
}
|
|
// 显示服务器数据
|
cardInfo?.let { info ->
|
binding.tvUserName.text = info.userName ?: "未知"
|
binding.tvPhone.text = info.phone ?: "未绑定"
|
|
// 根据status字段显示状态
|
val statusText = when (info.state) {
|
1 -> "正常"
|
2 -> "挂失"
|
3 -> "锁定"
|
else -> "未知"
|
}
|
}
|
}
|
|
/**
|
* 处理卡信息获取错误
|
*/
|
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 performCardCancel() {
|
// 验证输入
|
val refundAmountStr = binding.etRefundAmount.text.toString().trim()
|
val remarks = binding.etRemarks.text.toString().trim()
|
|
if (TextUtils.isEmpty(refundAmountStr)) {
|
ToastUtil.showToast("请输入退款金额")
|
return
|
}
|
|
val refundAmount = try {
|
refundAmountStr.toDouble()
|
} catch (e: NumberFormatException) {
|
ToastUtil.showToast("请输入有效的退款金额")
|
return
|
}
|
|
if (refundAmount < 0) {
|
ToastUtil.showToast("退款金额不能为负数")
|
return
|
}
|
|
if (TextUtils.isEmpty(remarks)) {
|
ToastUtil.showToast("请输入备注信息")
|
return
|
}
|
|
// 确认销卡
|
showConfirmDialog(
|
"确认要销卡吗?\n\n卡号:${cardNumber}\n退款金额:${refundAmount}元\n备注:${remarks}\n\n销卡后此卡将无法再次使用!"
|
) {
|
callCancelCardApi(refundAmount, remarks)
|
}
|
}
|
|
/**
|
* 调用销卡API接口
|
*/
|
private fun callCancelCardApi(refundAmount: Double, remarks: String) {
|
if (cardNumber.isNullOrBlank()) {
|
ToastUtil.showToast("卡号信息异常,请重新刷卡")
|
return
|
}
|
|
val map = mutableMapOf<String, Any>()
|
map["cardNum"] = cardNumber!!
|
map["refund"] = (refundAmount * 100).toInt() // 转换为分
|
map["refundType"] = 1838466162264350700L
|
map["remarks"] = remarks
|
map["operator"] = 2024090516595200300L
|
|
ApiManager.getInstance().requestPostLoading(
|
this,
|
"terminal/card/termCancel",
|
Boolean::class.java,
|
map,
|
object : SubscriberListener<BaseResponse<Boolean>>() {
|
override fun onNext(t: BaseResponse<Boolean>) {
|
if (t.success && t.content == true) {
|
// 销卡成功
|
showConfirmDialog("销卡成功!\n\n退款金额:${refundAmount}元已退还") {
|
finish()
|
}
|
} else {
|
// 销卡失败
|
val errorMsg = if (t.msg.isNullOrBlank()) "销卡失败,请重试" else t.msg
|
showConfirmDialog("销卡失败:$errorMsg") {
|
}
|
}
|
}
|
|
override fun onError(e: Throwable?) {
|
super.onError(e)
|
showConfirmDialog("销卡请求失败: ${e?.message ?: "网络异常,请检查网络连接"}") {
|
}
|
}
|
}
|
)
|
}
|
}
|