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.BaseApplication
|
import com.dayu.general.bean.net.CardInfoResult
|
import com.dayu.general.bean.net.CardCancelResult
|
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
|
import com.dayu.general.bean.card.ClearCard
|
import com.dayu.general.tool.NfcWreatHelper
|
import com.dayu.baselibrary.tools.nfc.NFCCallBack
|
import com.dayu.general.tool.CardOperationType
|
|
/**
|
* @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
|
private var userCard: UserCard? = 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.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.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", "==================")
|
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.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.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()
|
|
// 退款金额处理(非必填)
|
val refundAmount = if (refundAmountStr.isEmpty()) {
|
0.0 // 如果未输入退款金额,默认为0
|
} else {
|
try {
|
val amount = refundAmountStr.toDouble()
|
if (amount < 0) {
|
ToastUtil.show("退款金额不能为负数")
|
return
|
}
|
amount
|
} catch (e: NumberFormatException) {
|
ToastUtil.show("请输入有效的退款金额")
|
return
|
}
|
}
|
|
// 备注处理(非必填)
|
val finalRemarks = if (remarks.isEmpty()) {
|
"无备注" // 如果未输入备注,使用默认值
|
} else {
|
remarks
|
}
|
|
// 确认销卡
|
val confirmMessage = if (refundAmount > 0) {
|
"确认要销卡吗?\n\n卡号:${cardNumber}\n退款金额:${refundAmount}元\n备注:${finalRemarks}\n\n销卡后此卡将无法再次使用!"
|
} else {
|
"确认要销卡吗?\n\n卡号:${cardNumber}\n无退款金额\n备注:${finalRemarks}\n\n销卡后此卡将无法再次使用!"
|
}
|
|
showConfirmDialog(confirmMessage) {
|
callCancelCardApi(refundAmount, finalRemarks)
|
}
|
}
|
|
/**
|
* 调用销卡API接口
|
*/
|
private fun callCancelCardApi(refundAmount: Double, finalRemarks: String) {
|
if (cardNumber.isNullOrBlank()) {
|
ToastUtil.show("卡号信息异常,请重新刷卡")
|
return
|
}
|
|
val map = mutableMapOf<String, Any>()
|
map["cardNum"] = cardInfo?.cardNum.toString()
|
map["refund"] = refundAmount.toString() // 改为String类型,单位为元
|
map["refundType"] = 1838466162264350700L
|
map["remarks"] = finalRemarks
|
map["operator"] = BaseApplication.userId
|
|
ApiManager.getInstance().requestPostLoading(
|
this,
|
"terminal/card/termCancel",
|
CardCancelResult::class.java,
|
map,
|
object : SubscriberListener<BaseResponse<CardCancelResult>>() {
|
override fun onNext(t: BaseResponse<CardCancelResult>) {
|
if (t.success && t.content != null) {
|
// 销卡成功,跳转到写卡界面
|
startWriteCardActivity(t.content!!, refundAmount, 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(
|
cancelResult: CardCancelResult,
|
refundAmount: Double,
|
userCard: UserCard
|
) {
|
val intent = Intent(this, NfcWreatActivity::class.java).apply {
|
putExtra("cardAddr", cardNumber)
|
putExtra("operationTypeCode", CardOperationType.CancelCard.code)
|
putExtra("orderNumber", cancelResult.orderNo)
|
putExtra("refundAmount", refundAmount)
|
putExtra("userCard", userCard)
|
// 传递当前卡内余额信息
|
cardInfo?.let { info ->
|
putExtra("cardBalance", info.balance ?: 0.0)
|
}
|
}
|
startActivity(intent)
|
finish()
|
}
|
}
|