package com.dayu.general.activity
|
|
import android.content.Context
|
import android.content.Intent
|
import android.os.Bundle
|
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.ActivityCardReadBinding
|
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 CardReadActivity : BaseNfcActivity() {
|
private lateinit var binding: ActivityCardReadBinding
|
private var cardNumber: String? = null
|
|
companion object {
|
/**
|
* 启动读卡Activity
|
*/
|
fun start(context: Context) {
|
val intent = Intent(context, CardReadActivity::class.java)
|
context.startActivity(intent)
|
}
|
}
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
super.onCreate(savedInstanceState)
|
binding = ActivityCardReadBinding.inflate(layoutInflater)
|
setContentView(binding.root)
|
|
initView()
|
}
|
|
private fun initView() {
|
// 设置标题
|
binding.titleBar.setCenterText("读卡")
|
// 设置TitleBar的返回按钮点击事件
|
binding.titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) {
|
finish()
|
}
|
|
|
}
|
|
/**
|
* 重置到读卡状态
|
*/
|
private fun resetToReadingState() {
|
binding.cardReadLL.visibility = android.view.View.VISIBLE
|
binding.cardInfoContainer.visibility = android.view.View.GONE
|
cardNumber = null
|
}
|
|
/**
|
* 显示确认对话框
|
*/
|
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 -> {
|
// 管理类卡:显示卡片类型信息
|
handleManagementCard(cardNumber, cardType)
|
}
|
}
|
} 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
|
}
|
|
// 根据卡号获取卡片详细信息
|
getCardInfo(cardNumber, cardType, userCard)
|
}
|
|
/**
|
* 处理管理类卡片
|
*/
|
private fun handleManagementCard(cardNumber: String, cardType: String) {
|
val cardTypeName = getCardTypeName(cardType)
|
|
// 显示管理卡信息
|
showManagementCardInfo(cardNumber, cardTypeName)
|
}
|
|
/**
|
* 显示管理类卡片信息
|
*/
|
private fun showManagementCardInfo(cardNumber: String, cardTypeName: String) {
|
// 隐藏读卡提示,显示信息区域
|
binding.cardReadLL.visibility = android.view.View.GONE
|
binding.cardInfoContainer.visibility = android.view.View.VISIBLE
|
|
|
|
// 显示基本信息
|
binding.tvCardNumber.text = cardNumber
|
binding.tvCardType.text = cardTypeName
|
|
// 隐藏用户卡特有的字段
|
binding.llCardBalance.visibility = android.view.View.GONE
|
binding.llUserNumber.visibility = android.view.View.GONE
|
binding.llCardStatus.visibility = android.view.View.GONE
|
binding.llLastUseTime.visibility = android.view.View.GONE
|
}
|
|
/**
|
* 获取卡片类型名称
|
*/
|
private fun getCardTypeName(cardType: String): String {
|
return when (cardType) {
|
CardCommon.USER_CARD_TYPE_1 -> "用户卡(开泵前)"
|
CardCommon.USER_CARD_TYPE_2 -> "用户卡(开泵后)"
|
CardCommon.USER_CARD_TYPE_3 -> "用户卡(叠加充值)"
|
CardCommon.REGION_CARD -> "区域表号卡"
|
CardCommon.ELECTRIC_PRICE_CARD -> "取数卡(需要刷卡取数)"
|
CardCommon.MANAGE_CRAD -> "取数卡(刷卡取数返写成功)"
|
CardCommon.CHECK_CARD -> "检查卡"
|
CardCommon.DEBUG_CARD -> "调试卡"
|
CardCommon.CLEAN_CARD_TYPE -> "清零卡"
|
CardCommon.IP_CARD -> "IP地址设置卡"
|
CardCommon.AREA_CARD -> "区域设置卡"
|
CardCommon.GPS_CARD -> "GPS设置卡"
|
CardCommon.VALVE_TIME_CARD -> "开关阀时间配置卡"
|
else -> "未知类型卡片($cardType)"
|
}
|
}
|
|
/**
|
* 获取卡片详细信息(用户卡专用)
|
*/
|
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
|
|
val cardTypeName = getCardTypeName(cardType)
|
|
// 显示卡内数据
|
binding.tvCardNumber.text = cardNumber
|
binding.tvCardType.text = cardTypeName
|
|
// 显示用户卡特有字段
|
binding.llCardBalance.visibility = android.view.View.VISIBLE
|
binding.llUserNumber.visibility = android.view.View.VISIBLE
|
binding.llCardStatus.visibility = android.view.View.VISIBLE
|
|
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.tvUserNumber.text = card.getMyUserCode()
|
|
// 卡片状态(假设正常状态,因为UserCard中没有状态字段)
|
binding.tvCardStatus.text = "正常"
|
binding.tvCardStatus.setTextColor(android.graphics.Color.parseColor("#4CAF50"))
|
|
// 充值时间作为最后使用时间
|
if (card.rechargeDate != null) {
|
binding.llLastUseTime.visibility = android.view.View.VISIBLE
|
val dateFormat = java.text.SimpleDateFormat("yyyy-MM-dd HH:mm", java.util.Locale.getDefault())
|
binding.tvLastUseTime.text = dateFormat.format(card.rechargeDate!!.time)
|
} else {
|
binding.llLastUseTime.visibility = android.view.View.GONE
|
}
|
}
|
|
// 显示服务器数据
|
cardInfo?.let { info ->
|
binding.tvUserName.text = info.userName ?: "未知"
|
binding.tvPhone.text = info.phone ?: "未绑定"
|
binding.tvIdCard.text = info.userCode ?: "未录入" // 使用userCode作为身份证号的替代
|
|
// 根据status字段显示状态
|
val statusText = when (info.status) {
|
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()
|
}
|
}
|
}
|