左晓为主开发手持机充值管理机
zuoxiao
3 天以前 167eea1eeb0d02be0e4372ba787ddde11219de1e
generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
@@ -2,19 +2,40 @@
import android.content.Intent
import android.os.Bundle
import com.dayu.general.bean.card.CardCommon
import androidx.lifecycle.lifecycleScope
import com.dayu.baselibrary.net.subscribers.SubscriberListener
import com.dayu.baselibrary.tools.nfc.NFCCallBack
import com.dayu.baselibrary.utils.ToastUtil
import com.dayu.general.bean.card.ClearCard
import com.dayu.general.bean.card.UserCard
import com.dayu.general.tool.CardCommon
import com.dayu.general.tool.CardOperationType
import com.dayu.general.databinding.ActivityNfcWriteGeBinding
import com.dayu.general.net.ApiManager
import com.dayu.general.net.BaseResponse
import com.dayu.general.tool.NfcReadHelper
import com.dayu.general.tool.NfcWreatHelper
import com.dayu.general.dao.BaseDaoSingleton
import com.tencent.bugly.crashreport.CrashReport
import kotlinx.coroutines.launch
import java.lang.StringBuilder
/**
 * @author: zuo
 * @date: 2021/3/30
 * @description:写卡界面
 */
class NfcWreatActivity:BaseNfcActivity() {
    var binding:ActivityNfcWriteGeBinding? = null
class NfcWreatActivity : BaseNfcActivity() {
    var binding: ActivityNfcWriteGeBinding? = null
    var cardType = ""
    var cardAddr = ""
    var cardFee = 0
    //订单编号
    var orderNumber = ""
    private lateinit var userCard: UserCard
    private var operationTypeCode = -1;
    private var operationType: CardOperationType? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
@@ -26,23 +47,186 @@
    /**
     * 获取数据
     */
    private fun getInitData(){
        cardType= intent?.getStringExtra("cardType")?:""
    }
    private fun setTextData(){
        when(cardType){
            CardCommon.CHECK_CARD->{
                binding?.cardData?.text = "写用户卡"
    private fun getInitData() {
        cardType = intent?.getStringExtra("cardType") ?: ""
        cardAddr = intent?.getStringExtra("cardAddr") ?: ""
        operationTypeCode = intent?.getIntExtra("operationTypeCode", -1) ?: -1
        orderNumber = intent?.getStringExtra("orderNumber") ?: ""
        operationType = CardOperationType.fromCode(operationTypeCode)
        if (intent?.hasExtra("cardFee") == true) {
            cardFee = intent?.getIntExtra("cardFee", 0) ?: 0
        }
        if (intent?.hasExtra("userCard") == true) {
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) {
                userCard = intent?.getSerializableExtra("userCard", UserCard::class.java)!!
            } else {
                userCard = (intent?.getSerializableExtra("userCard") as? UserCard)!!
            }
        }
    }
    override fun onNfcBack(intent: Intent?) {
        TODO("Not yet implemented")
        if (operationTypeCode != -1) {
            when (operationType) {
                CardOperationType.CleanCard -> {
                    binding?.cardData?.text = "清零卡写卡"
                }
                CardOperationType.OpenCard -> {
                    var textData = StringBuilder()
                    textData.append("用户开卡\n")
                    if (cardFee != 0) {
                        textData.append("工本费:" + cardFee + "元\n")
                    }
                    if (userCard.balance != 0) {
                        textData.append("充值金额:" + userCard.balance + "元")
                    }
                    binding?.cardData?.text = textData.toString()
                }
                CardOperationType.CancelCard -> TODO()
                CardOperationType.CheckCard -> TODO()
                CardOperationType.DeductCard -> TODO()
                CardOperationType.Recharge -> TODO()
                CardOperationType.ReplaceCard -> TODO()
                null -> TODO()
            }
        }
    }
    override fun onNfcBack(intent: Intent) {
        val nfcReadHelper = NfcReadHelper.getInstance(intent, this)
        // 使用正常的getCardNumber()方法,它会自动关闭连接
        val cardNumber = nfcReadHelper.getCardNumber()
        if (cardNumber.isNotEmpty() && cardNumber == cardAddr) {
            val nfcWreatHelper = NfcWreatHelper.getInstance(intent, this)
            when (operationType) {
                CardOperationType.CleanCard -> {
                    var clearCard = ClearCard()
                    nfcWreatHelper.writeData(clearCard.getZeroBytes(), 7, 0) { success, message ->
                        // 确保Toast在主线程中调用
                        runOnUiThread {
                            if (success) {
                                postCardData(cardType, cardAddr)
                                ToastUtil.show("写卡成功!")
                            } else {
                                // 处理写卡失败的情况
                                ToastUtil.show(message)
                            }
                        }
                    }
                }
                CardOperationType.OpenCard -> {
                    nfcWreatHelper.writeUserDataAsync(userCard, object : NFCCallBack {
                        override fun isSusses(flag: Boolean, msg: String?) {
                            // 确保Toast在主线程中调用
                            runOnUiThread {
                                if (flag) {
                                    postCardData(cardType, cardAddr)
                                } else {
                                    ToastUtil.show("写卡失败: ${msg ?: "未知错误"}")
                                }
                            }
                        }
                    })
                }
                CardOperationType.CancelCard -> TODO()
                CardOperationType.CheckCard -> TODO()
                CardOperationType.DeductCard -> TODO()
                CardOperationType.Recharge -> TODO()
                CardOperationType.ReplaceCard -> TODO()
                null -> TODO()
            }
        } else {
            ToastUtil.show("卡片错误,当前刷的卡与刚刚的卡不一致")
        }
    }
    /**
     * 更新CardRegistrationBean中的isCardWritten状态为true
     */
    private fun updateCardWrittenStatus(cardNumber: String) {
        lifecycleScope.launch {
            try {
                val cardRegistrationDao = BaseDaoSingleton.getInstance(this@NfcWreatActivity)
                    .cardRegistrationDao()
                // 根据卡号查找CardRegistrationBean记录
                val cardRegistration = cardRegistrationDao.getByCardNumber(cardNumber)
                if (cardRegistration != null) {
                    // 创建更新后的CardRegistrationBean对象,将isCardWritten设置为true
                    val updatedCardRegistration = cardRegistration.copy(isCardWritten = true)
                    // 更新数据库记录
                    cardRegistrationDao.update(updatedCardRegistration)
                    // 在主线程中关闭Activity
                    runOnUiThread {
                        setResult(RESULT_OK)
                        finish()
                        Intent(this@NfcWreatActivity, CardWriteSuccessActivity::class.java).apply {
                            putExtra("cardNumber", cardNumber)
                            startActivity(this)
                        }
                    }
                }
            } catch (e: Exception) {
                CrashReport.postCatchedException(e)
                e.printStackTrace()
                runOnUiThread {
                    ToastUtil.show("更新写卡状态失败: ${e.message}")
                }
            }
        }
    }
    fun postCardData(cardType: String, cardAddr: String) {
        when (cardType) {
            CardCommon.CHECK_CARD -> {
                binding?.cardData?.text = "写用户卡"
            }
        }
        val map = mutableMapOf<String, Any>()
        if (cardAddr.isNotEmpty()) {
            map["cardAddr"] = cardAddr
        }
        map["operateType"] = operationTypeCode
        if (orderNumber.isNotEmpty()) {
            map["orderNumber"] = orderNumber
        }
        // 使用正确的类型参数
        ApiManager.getInstance().requestPostLoading(
            this,
            "terminal/card/termCallBack",
            String::class.java,
            map,
            object : SubscriberListener<BaseResponse<String>>() {
                override fun onNext(t: BaseResponse<String>) {
                    if (t.success) {
                        updateCardWrittenStatus(cardAddr)
                    } else {
                        // 处理搜索失败的情况
                        ToastUtil.show(t.msg)
                    }
                }
                override fun onError(e: Throwable?) {
                    super.onError(e)
                    ToastUtil.show("上报失败: ${e?.message ?: "未知错误"}")
                }
            }
        )
    }
}