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.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.bean.card.UserCard
|
import com.dayu.general.bean.net.CardInfoResult
|
import com.dayu.general.bean.net.CardDeductResult
|
import com.dayu.general.databinding.ActivityCardDeductBinding
|
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: AI Assistant
|
* @desc: 补扣Activity
|
* @since: 2025/6/17
|
*/
|
class CardDeductActivity : BaseNfcActivity() {
|
private lateinit var binding: ActivityCardDeductBinding
|
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, CardDeductActivity::class.java)
|
context.startActivity(intent)
|
}
|
}
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
super.onCreate(savedInstanceState)
|
binding = ActivityCardDeductBinding.inflate(layoutInflater)
|
setContentView(binding.root)
|
|
initView()
|
}
|
|
private fun initView() {
|
// 设置TitleBar的返回按钮点击事件
|
binding.titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) {
|
finish()
|
}
|
|
// 设置补扣按钮点击事件
|
binding.btnDeduct.setOnClickListener {
|
performCardDeduct()
|
}
|
}
|
|
/**
|
* 重置到读卡状态
|
*/
|
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.etDeductAmount.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("CardDeductActivity", "=== 用户卡信息 ===")
|
android.util.Log.d("CardDeductActivity", "卡号: $cardNumber")
|
android.util.Log.d("CardDeductActivity", "卡片类型: $cardType")
|
android.util.Log.d("CardDeductActivity", "卡内余额: ${userCard.balance}")
|
android.util.Log.d("CardDeductActivity", "==================")
|
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 ->
|
// 余额转换为元(原始数据可能是分)
|
binding.tvCardBalance.text = MornyUtil.changeF2Y(card.balance) + "元"
|
}
|
|
// 显示服务器数据
|
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)
|
}
|
}
|
|
/**
|
* 处理卡信息获取错误
|
*/
|
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 performCardDeduct() {
|
// 验证输入
|
val deductAmountStr = binding.etDeductAmount.text.toString().trim()
|
val remarks = binding.etRemarks.text.toString().trim()
|
|
// 补扣金额验证(必填)
|
if (deductAmountStr.isEmpty()) {
|
ToastUtil.show("请输入补扣金额")
|
return
|
}
|
|
val deductAmount = try {
|
val amount = deductAmountStr.toDouble()
|
if (amount <= 0) {
|
ToastUtil.show("补扣金额必须大于0")
|
return
|
}
|
amount
|
} catch (e: NumberFormatException) {
|
ToastUtil.show("请输入有效的补扣金额")
|
return
|
}
|
|
// 备注处理(非必填)
|
val finalRemarks = if (remarks.isEmpty()) {
|
"补扣" // 如果未输入备注,使用默认值
|
} else {
|
remarks
|
}
|
|
callDeductCardApi(deductAmount, finalRemarks)
|
}
|
|
/**
|
* 调用补扣API接口
|
*/
|
private fun callDeductCardApi(deductAmount: Double, finalRemarks: String) {
|
if (cardNumber.isNullOrBlank()) {
|
ToastUtil.show("卡号信息异常,请重新刷卡")
|
return
|
}
|
|
// 获取当前卡内余额(以分为单位)
|
val currentBalance = userCard?.balance?.let { MornyUtil.changeF2Y(it) } ?: 0
|
|
val map = mutableMapOf<String, Any>()
|
map["cardNum"] = cardInfo?.cardNum.toString()
|
map["repayMorny"] = deductAmount.toString()
|
map["balance"] = currentBalance.toString()
|
map["remarks"] = finalRemarks
|
map["operator"] = BaseApplication.userId
|
|
ApiManager.getInstance().requestPostLoading(
|
this,
|
"terminal/card/termRepay",
|
CardDeductResult::class.java,
|
map,
|
object : SubscriberListener<BaseResponse<CardDeductResult>>() {
|
override fun onNext(t: BaseResponse<CardDeductResult>) {
|
if (t.success && t.content != null) {
|
// 补扣成功,跳转到写卡界面
|
startWriteCardActivity(t.content!!, deductAmount, 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(
|
deductResult: CardDeductResult,
|
deductAmount: 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(deductResult.balance.toString())
|
}
|
|
val intent = Intent(this, NfcWreatActivity::class.java).apply {
|
putExtra("cardAddr", cardNumber)
|
putExtra("operationTypeCode", CardOperationType.DeductCard.code) // 使用补扣类型进行写卡
|
putExtra("orderNumber", deductResult.orderNo)
|
putExtra("deductAmount", deductAmount)
|
putExtra("userCard", updatedUserCard as java.io.Serializable)
|
}
|
startActivity(intent)
|
finish()
|
}
|
}
|