左晓为主开发手持机充值管理机
zuoxiao
昨天 87e5604ad04c0b7aaacf3d52bae85e62d308cb6d
refactor(generallibrary):重构开卡成功界面并移除未使用的开卡界面

-重构了 CardWriteSuccessActivity 界面,增加了开卡成功后的详细信息展示
- 添加了从 ClientInfo 和 CardInfo 中获取用户姓名的逻辑
- 优化了开卡凭证的打印内容,包括用户姓名、卡地址、工本费等信息
- 删除了未使用的 NewCard2Activity 开卡界面
6个文件已修改
1个文件已删除
1341 ■■■■ 已修改文件
generallibrary/src/main/AndroidManifest.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt 600 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/NewCardActivity.kt 598 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/SearchUserListActivity.kt 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/bean/net/NewCardInfo.kt 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/AndroidManifest.xml
@@ -12,10 +12,6 @@
        android:name="android.hardware.nfc"
        android:required="true" />
    <!--    <intent-filter>-->
    <!--        <action android:name="android.nfc.action.TAG_DISCOVERED" />-->
    <!--        <data android:mimeType="text/plain" />-->
    <!--    </intent-filter>-->
    <!--用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <!--用于访问GPS定位-->
@@ -39,7 +35,7 @@
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name="com.dayu.general.activity.NewCardActivity" />
        <activity android:name="com.dayu.general.activity.ManageListActivity" />
        <activity android:name="com.dayu.general.activity.SearchUserListActivity" />
        <activity android:name="com.dayu.general.activity.RechargeDetailActivity" />
@@ -76,7 +72,7 @@
        </activity>
        <activity android:name=".activity.SearchCardListActivity" />
        <activity
            android:name=".activity.NewCard2Activity"
            android:name=".activity.NewCardActivity"
            android:exported="false"
            android:launchMode="singleTop">
            <intent-filter>
@@ -138,8 +134,9 @@
        <activity
            android:name=".activity.CardUnlossActivity"
            android:exported="false"
            android:launchMode="singleTop"/>
        <activity android:name=".activity.CardReplaceActivity"
            android:launchMode="singleTop" />
        <activity
            android:name=".activity.CardReplaceActivity"
            android:exported="false"
            android:launchMode="singleTop">
            <intent-filter>
generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt
@@ -7,6 +7,7 @@
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.ClientInfo
import com.dayu.general.databinding.ActivityCardWriteSuccessBinding
import com.dayu.general.tool.CardOperationType
@@ -24,6 +25,7 @@
    private var userCard: UserCard? = null
    private var orderNumber: String? = null
    private var cardInfo: CardInfoResult? = null
    private var clientInfo: ClientInfo? = null
    // 充值相关参数
    private var rechargeAmount = 0.0
@@ -69,6 +71,10 @@
        if (intent.hasExtra("cardInfo")) {
            cardInfo = intent.getSerializableExtra("cardInfo") as CardInfoResult
        }
        if (intent.hasExtra("clientInfo")) {
            clientInfo = intent.getSerializableExtra("clientInfo") as ClientInfo
        }
        initView()
@@ -186,12 +192,38 @@
            CardOperationType.OpenCard -> {
                binding.titleBar.setCenterText("开卡成功")
                binding.successTitle.text = "开卡成功"
                val messageBuilder = StringBuilder()
                messageBuilder.append("开卡操作已成功完成\n")
                // 显示用户姓名
                val userName = getUserName()
                if (!userName.isNullOrEmpty()) {
                    messageBuilder.append("用户姓名:$userName\n")
                }
                // 显示卡地址
                val cardAddress = cardNumber ?: cardAddr
                if (!cardAddress.isNullOrEmpty()) {
                    messageBuilder.append("卡地址:$cardAddress\n")
                }
                // 显示工本费
                if (cardFee > 0) {
                    messageBuilder.append("工本费:${cardFee}元\n")
                }
                // 显示充值金额
                if (rechargeAmount > 0) {
                    messageBuilder.append("充值金额:${String.format("%.2f", rechargeAmount)}元\n")
                }
                // 显示卡内余额
                messageBuilder.append("卡内余额:${MornyUtil.changeF2Y(userCard?.balance ?: 0)}元")
                // 充值成功后自动打印
                binding.successMessage.text = messageBuilder.toString()
                // 开卡成功后自动打印
                userCard?.let { card ->
                    doPrint(card)
                }
@@ -230,6 +262,14 @@
    }
    /**
     * 获取用户姓名,优先从ClientInfo获取,如果没有再从CardInfo获取
     * @return 用户姓名
     */
    private fun getUserName(): String? {
        return clientInfo?.name ?: cardInfo?.userName
    }
    /**
     * 打印充值成功信息到打印机
     * @param userCard 用户卡片信息,包含余额等信息
     * 函数会构建打印数据并调用打印适配器进行打印
@@ -249,11 +289,10 @@
                    data.add("           充值凭证")
                    data.add("*****************************")
                    // 添加用户名(从CardInfo中获取)
                    cardInfo?.userName?.let { userName ->
                        if (userName.isNotEmpty()) {
                            data.add("用户姓名:$userName")
                        }
                    // 添加用户名(优先从ClientInfo中获取,如果没有再从CardInfo中获取)
                    val userName = getUserName()
                    if (!userName.isNullOrEmpty()) {
                        data.add("用户姓名:$userName")
                    }
                    // 添加卡地址
@@ -305,11 +344,10 @@
                    data.add("        补卡凭证")
                    data.add("*****************************")
                    // 添加用户名(从CardInfo中获取)
                    cardInfo?.userName?.let { userName ->
                        if (userName.isNotEmpty()) {
                            data.add("用户姓名:$userName")
                        }
                    // 添加用户名(优先从ClientInfo中获取,如果没有再从CardInfo中获取)
                    val userName = getUserName()
                    if (!userName.isNullOrEmpty()) {
                        data.add("用户姓名:$userName")
                    }
                    val cardAddress = cardNumber ?: cardAddr
@@ -352,11 +390,10 @@
                    data.add("        销卡凭证")
                    data.add("*****************************")
                    // 添加用户名(从CardInfo中获取)
                    cardInfo?.userName?.let { userName ->
                        if (userName.isNotEmpty()) {
                            data.add("用户姓名:$userName")
                        }
                    // 添加用户名(优先从ClientInfo中获取,如果没有再从CardInfo中获取)
                    val userName = getUserName()
                    if (!userName.isNullOrEmpty()) {
                        data.add("用户姓名:$userName")
                    }
                    val cardAddress = cardNumber ?: cardAddr
@@ -397,11 +434,10 @@
                    data.add("        返还凭证")
                    data.add("*****************************")
                    // 添加用户名(从CardInfo中获取)
                    cardInfo?.userName?.let { userName ->
                        if (userName.isNotEmpty()) {
                            data.add("用户姓名:$userName")
                        }
                    // 添加用户名(优先从ClientInfo中获取,如果没有再从CardInfo中获取)
                    val userName = getUserName()
                    if (!userName.isNullOrEmpty()) {
                        data.add("用户姓名:$userName")
                    }
                    val cardAddress = cardNumber ?: cardAddr
@@ -442,11 +478,10 @@
                    data.add("        补扣凭证")
                    data.add("*****************************")
                    // 添加用户名(从CardInfo中获取)
                    cardInfo?.userName?.let { userName ->
                        if (userName.isNotEmpty()) {
                            data.add("用户姓名:$userName")
                        }
                    // 添加用户名(优先从ClientInfo中获取,如果没有再从CardInfo中获取)
                    val userName = getUserName()
                    if (!userName.isNullOrEmpty()) {
                        data.add("用户姓名:$userName")
                    }
                    val cardAddress = cardNumber ?: cardAddr
@@ -486,11 +521,10 @@
                    data.add("           开卡凭证")
                    data.add("*****************************")
                    // 添加用户名(从CardInfo中获取)
                    cardInfo?.userName?.let { userName ->
                        if (userName.isNotEmpty()) {
                            data.add("用户姓名:$userName")
                        }
                    // 添加用户名(优先从ClientInfo中获取,如果没有再从CardInfo中获取)
                    val userName = getUserName()
                    if (!userName.isNullOrEmpty()) {
                        data.add("用户姓名:$userName")
                    }
                    // 添加卡地址
@@ -507,14 +541,15 @@
                    // 添加充值金额
                    if (rechargeAmount > 0) {
                        data.add("充值金额:${String.format("%.2f", rechargeAmount)} 元")
                        // 添加充值后余额
                        data.add("充值后余额:${MornyUtil.changeF2Y(userCard.balance)} 元")
                    }
                    // 添加赠送金额
                    // 添加工本费
                    if (cardFee > 0) {
                        data.add("工本费:" + MornyUtil.changeF2Y(cardFee) + "元")
                        data.add("工本费:" + cardFee + "元")
                    }
                    // 添加卡内余额(开卡后的余额)
                    data.add("卡内余额:${MornyUtil.changeF2Y(userCard.balance)} 元")
                    // 添加订单号
                    if (!orderNumber.isNullOrEmpty()) {
@@ -541,11 +576,10 @@
                    data.add("        操作凭证")
                    data.add("*****************************")
                    // 添加用户名(从CardInfo中获取)
                    cardInfo?.userName?.let { userName ->
                        if (userName.isNotEmpty()) {
                            data.add("用户姓名:$userName")
                        }
                    // 添加用户名(优先从ClientInfo中获取,如果没有再从CardInfo中获取)
                    val userName = getUserName()
                    if (!userName.isNullOrEmpty()) {
                        data.add("用户姓名:$userName")
                    }
                    val cardAddress = cardNumber ?: cardAddr
generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
File was deleted
generallibrary/src/main/java/com/dayu/general/activity/NewCardActivity.kt
@@ -1,17 +1,599 @@
package com.dayu.general.activity
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import com.dayu.baselibrary.activity.BaseActivity
import android.text.Editable
import android.text.TextWatcher
import android.util.TypedValue
import android.view.View
import android.widget.RadioButton
import android.widget.Toast
import androidx.lifecycle.lifecycleScope
import com.dayu.baselibrary.net.subscribers.SubscriberListener
import com.dayu.baselibrary.utils.MornyUtil
import com.dayu.baselibrary.view.TitleBar.ClickType_LEFT_IMAGE
import com.dayu.general.BaseApplication
import com.dayu.general.R
import com.dayu.general.bean.card.UserCard
import com.dayu.general.bean.db.CardRegistrationBean
import com.dayu.general.bean.net.ClientInfo
import com.dayu.general.bean.net.NewCardDataResult
import com.dayu.general.bean.net.PaymentMethod
import com.dayu.general.dao.BaseDaoSingleton
import com.dayu.general.databinding.ActivityNewCardGeBinding
import com.dayu.general.net.ApiManager
import com.dayu.general.net.BaseResponse
import com.dayu.general.tool.BaseCommon.Companion.protocol
import com.dayu.general.tool.CardCommon.Companion.USER_CARD_TYPE_1
import com.dayu.general.tool.CardOperationType
import com.dayu.general.tool.NfcReadHelper
import com.dayu.general.tool.NfcWreatHelper
import com.dayu.general.utils.DateUtils
import com.tencent.bugly.crashreport.CrashReport
import kotlinx.coroutines.launch
class NewCardActivity:BaseActivity() {
    var binding:ActivityNewCardGeBinding? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding=  ActivityNewCardGeBinding.inflate(LayoutInflater.from(this))
        setContentView(binding?.root)
/**
 * Description: 用户开卡界面(同步修改白卡密码)
 * Author: zuo
 * Date: 2025/4/7
 */
class NewCardActivity : BaseNfcActivity() {
    private lateinit var binding: ActivityNewCardGeBinding
    // 支付方式
    private var paymentMethod: String = "现金"
    // 支付方式ID
    private var paymentId: String = ""
    // 支付方式列表
    private var paymentMethodList: List<PaymentMethod> = listOf()
    // 卡物理ID
    private var cardPhysicalId: String = ""
    // 用户ID
    private var userId: String = ""
    // 客户ID
    private var clientId: String = ""
    private lateinit var clientInfo: ClientInfo
    // 是否已读卡
    private var isReadCard: Boolean = false
    private var orderId: String = ""
    companion object {
        private const val TAG = "NewCard2Activity"
        private const val REQUEST_CODE_NFC_WRITE = 1001
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityNewCardGeBinding.inflate(layoutInflater)
        setContentView(binding.root)
        // 获取传递的clientId参数
        clientId = intent.getStringExtra("clientId") ?: ""
        initView()
        // 如果有clientId,获取客户信息
        if (clientId.isNotEmpty()) {
            getClientInfo(clientId)
        }
        // 获取支付方式
        getPaymentMethods()
        initListener()
    }
    private fun initView() {
        // 初始化标题栏返回按钮
        binding.titleBar.setOnItemclickListner(ClickType_LEFT_IMAGE) {
            finish()
        }
        // 初始化NFC读卡容器,初始隐藏
        binding.nfcContainer.visibility = View.VISIBLE
        // 设置金额输入限制为两位小数
        binding.newCardRechargeAmount.addTextChangedListener(createDecimalTextWatcher())
        binding.newCardCardFee.addTextChangedListener(createDecimalTextWatcher())
    }
    /**
     * 获取客户详细信息
     */
    private fun getClientInfo(clientId: String) {
        ApiManager.getInstance().requestGetLoading(
            this,
            "terminal/client/getTermOne/$clientId",
            ClientInfo::class.java,
            null,
            object : SubscriberListener<BaseResponse<ClientInfo>>() {
                override fun onNext(response: BaseResponse<ClientInfo>) {
                    if (response.success) {
                        clientInfo = response.content!!
                        if (clientInfo != null) {
                            // 显示客户信息到界面
                            displayClientInfo(clientInfo)
                        } else {
                            Toast.makeText(
                                this@NewCardActivity,
                                "获取客户信息失败: 返回数据为空",
                                Toast.LENGTH_SHORT
                            ).show()
                        }
                    } else {
                        Toast.makeText(
                            this@NewCardActivity,
                            "获取客户信息失败: ${response.msg}",
                            Toast.LENGTH_SHORT
                        ).show()
                    }
                }
                override fun onError(e: Throwable?) {
                    super.onError(e)
                    Toast.makeText(
                        this@NewCardActivity,
                        "获取客户信息失败: ${e?.message ?: "网络异常"}",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }
        )
    }
    /**
     * 显示客户信息到界面
     */
    private fun displayClientInfo(clientInfo: ClientInfo) {
        // 保存用户ID供后续使用
        userId = clientInfo.clientId
        // 显示用户基本信息
        binding.newCardUserName.text = clientInfo.name
        binding.newCardIdCard.text = if (clientInfo.idCard.isBlank()) "无" else clientInfo.idCard
        binding.newCardFarmerCode.text = clientInfo.clientNum
    }
    /**
     * 获取支付方式列表
     */
    private fun getPaymentMethods() {
        ApiManager.getInstance().requestGetLoading(
            this,
            "terminal/paymentmethod/get",
            Any::class.java,
            null,
            object : SubscriberListener<BaseResponse<Any>>() {
                override fun onNext(response: BaseResponse<Any>) {
                    if (response.success) {
                        try {
                            // 安全地处理返回的content,服务器返回的是ArrayList<LinkedHashMap>
                            val paymentMethods = mutableListOf<PaymentMethod>()
                            val content = response.content
                            if (content is List<*>) {
                                content.forEach { item ->
                                    if (item is Map<*, *>) {
                                        val id = item["id"]?.toString() ?: ""
                                        val name = item["name"]?.toString() ?: ""
                                        if (id.isNotEmpty() && name.isNotEmpty()) {
                                            paymentMethods.add(PaymentMethod(id, name))
                                        }
                                    }
                                }
                            }
                            if (paymentMethods.isNotEmpty()) {
                                paymentMethodList = paymentMethods
                                // 更新支付方式显示
                                updatePaymentMethodRadioGroup()
                            } else {
                                Toast.makeText(
                                    this@NewCardActivity,
                                    "获取支付方式失败:返回数据为空",
                                    Toast.LENGTH_SHORT
                                ).show()
                            }
                        } catch (e: Exception) {
                            android.util.Log.e("NewCard2Activity", "解析支付方式数据失败", e)
                            android.util.Log.e("NewCard2Activity", "原始数据类型: ${response.content?.javaClass?.name}")
                            android.util.Log.e("NewCard2Activity", "原始数据内容: ${response.content}")
                            Toast.makeText(
                                this@NewCardActivity,
                                "解析支付方式数据失败: ${e.message}",
                                Toast.LENGTH_SHORT
                            ).show()
                        }
                    } else {
                        Toast.makeText(
                            this@NewCardActivity,
                            "获取支付方式失败: ${response.msg}",
                            Toast.LENGTH_SHORT
                        ).show()
                    }
                }
                override fun onError(e: Throwable?) {
                    super.onError(e)
                    android.util.Log.e("NewCard2Activity", "网络请求失败", e)
                    Toast.makeText(
                        this@NewCardActivity,
                        "获取支付方式失败: ${e?.message ?: "网络异常"}",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }
        )
    }
    /**
     * 更新支付方式RadioGroup
     */
    private fun updatePaymentMethodRadioGroup() {
        // 清空原有RadioButton
        binding.newCardPaymentMethod.removeAllViews()
        // 动态添加RadioButton
        paymentMethodList.forEachIndexed { index, method ->
            val radioButton = RadioButton(this)
            radioButton.id = View.generateViewId() // 生成唯一ID
            radioButton.layoutParams = android.widget.LinearLayout.LayoutParams(
                0,
                resources.getDimensionPixelSize(R.dimen.dimen_40),
                1.0f
            )
            // 如果不是最后一个按钮,添加右边距
            if (index < paymentMethodList.size - 1) {
                (radioButton.layoutParams as android.widget.LinearLayout.LayoutParams).rightMargin =
                    resources.getDimensionPixelSize(R.dimen.dimen_15)
            }
            radioButton.text = method.name
            radioButton.background = resources.getDrawable(R.drawable.radio_selector)
            radioButton.buttonDrawable = null
            radioButton.gravity = android.view.Gravity.CENTER
            radioButton.setTextColor(resources.getColorStateList(R.color.radio_button_text_color))
            radioButton.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f)
            // 添加到RadioGroup
            binding.newCardPaymentMethod.addView(radioButton)
            // 默认选中第一个
            if (index == 0) {
                radioButton.isChecked = true
                paymentMethod = method.name
                paymentId = method.id
            }
        }
    }
    /**
     * 创建限制输入两位小数的TextWatcher
     */
    private fun createDecimalTextWatcher(): TextWatcher {
        return object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
                // 不需要实现
            }
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                // 不需要实现
            }
            override fun afterTextChanged(s: Editable?) {
                if (s == null || s.isEmpty()) return
                val str = s.toString()
                // 如果输入的不是有效的小数格式,进行处理
                if (str.contains(".")) {
                    val decimalIndex = str.indexOf(".")
                    // 如果小数点后超过两位,截取到两位
                    if (decimalIndex >= 0 && str.length - decimalIndex > 3) {
                        s.delete(decimalIndex + 3, str.length)
                    }
                }
            }
        }
    }
    private fun initListener() {
        // 设置支付方式选择监听
        binding.newCardPaymentMethod.setOnCheckedChangeListener { group, checkedId ->
            // 根据选中的ID获取支付方式
            for (i in 0 until group.childCount) {
                val radioButton = group.getChildAt(i) as RadioButton
                if (radioButton.id == checkedId) {
                    paymentMethod = radioButton.text.toString()
                    paymentId = paymentMethodList[i].id
                    break
                }
            }
        }
        // 设置开卡按钮点击监听
        binding.newCardRegistBtn.setOnClickListener {
            if (cardPhysicalId.isEmpty()) {
                // 如果尚未读取到卡物理ID,显示NFC读卡界面
                binding.nfcContainer.visibility = View.VISIBLE
            } else {
                // 已读取到卡物理ID,进行开卡操作
                registerNewCard()
            }
        }
    }
    /**
     * 注册新卡
     */
    private fun registerNewCard() {
        // 获取充值金额
        val rechargeAmountStr = binding.newCardRechargeAmount.text.toString()
        val rechargeAmount = if (rechargeAmountStr.isEmpty()) 0.0 else rechargeAmountStr.toDouble()
        // 获取工本费
        val cardFeeStr = binding.newCardCardFee.text.toString()
        val cardFee = if (cardFeeStr.isEmpty()) 0 else cardFeeStr.toInt()
        val remark = binding.newCardRemark.text.toString()
        // 构建请求参数
        val params = HashMap<String, Any>()
        params["cardAddr"] = cardPhysicalId // 水卡地址(物理ID)
        params["clientId"] = clientId // 农户ID
        params["cardCost"] = cardFee  // 购卡金额(工本费)(元)
        params["amount"] = rechargeAmount  // 充值金额(元)
        params["paymentId"] = paymentId // 支付方式ID
        params["remarks"] = remark // 备注
        params["protocol"] = protocol // 协议
        params["operator"] = BaseApplication.userId // 操作人ID
        // 执行卡片激活API请求
        ApiManager.getInstance().requestPostLoading(
            this,
            "terminal/card/termActiveCard",
            NewCardDataResult::class.java,
            params,
            object : SubscriberListener<BaseResponse<NewCardDataResult>>() {
                override fun onNext(response: BaseResponse<NewCardDataResult>) {
                    if (response.success) {
                        orderId = response.content?.orderNo.toString()
                        // 保存开卡信息到数据库
                        val cardRegistration = CardRegistrationBean(
                            cardNumber = cardPhysicalId,
                            userName = binding.newCardUserName.text.toString(),
                            idCard = binding.newCardIdCard.text.toString(),
                            clientId = clientId,
                            cardFee = cardFee,
                            remark = binding.newCardRemark.text.toString(),
                            paymentMethod = paymentId.toLongOrNull()?.toInt() ?: 0,
                            isReported = true,
                            isCardWritten = false, // 初始设置为false,写卡成功后再更新为true
                            operatorId = orderId,
                            )
                        // 使用协程在后台线程中保存数据
                        lifecycleScope.launch {
                            try {
                                BaseDaoSingleton.getInstance(this@NewCardActivity)
                                    .cardRegistrationDao().insert(cardRegistration)
                                setResult(RESULT_OK)
                                Intent(this@NewCardActivity, NfcWreatActivity::class.java).apply {
                                    putExtra("cardType", USER_CARD_TYPE_1)
                                    putExtra("orderNumber", orderId)
                                    putExtra("cardAddr", cardPhysicalId)
                                    var userCard = UserCard()
                                    userCard.areaNumber =
                                        response.content?.cardNum?.substring(0, 12).toString()
                                    userCard.userCode = clientInfo.clientNum
                                    userCard.phoneNumber = clientInfo.phone
                                    userCard.userCodeNumber =
                                        response.content?.cardNum?.substring(12)?.toInt()!!
                                    userCard.projectCode = response.content?.projectNo!!
                                    userCard.balance =
                                        MornyUtil.changeY2F(response.content?.balance)
//                                    userCard.surplusWater = response.content?.surplusWater?.toInt()!!
                                    userCard.waterPrice =
                                        MornyUtil.changeY2F(response.content?.waterPrice)
                                    userCard.electricPrice =
                                        MornyUtil.changeY2F(response.content?.waterPrice)
                                    userCard.rechargeDate =
                                        DateUtils.parseStringToCalendar(response.content?.time)
                                    // 输出userCard的所有信息到日志
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "=== 开卡UserCard信息 ==="
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "卡片类型: ${userCard.cardType}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "国家行政区域号: ${userCard.areaNumber}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "用户编号: ${userCard.userCode}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "用户卡编号: ${userCard.userCodeNumber}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "完整用户编号: ${userCard.getMyUserCode()}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "手机号: ${userCard.phoneNumber}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "项目编码: ${userCard.projectCode}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "卡内余额: ${userCard.balance}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "剩余水量: ${userCard.surplusWater}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "水量单价: ${userCard.waterPrice}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "电量单价: ${userCard.electricPrice}"
                                    )
                                    android.util.Log.d(
                                        "NewCard2Activity",
                                        "充值时间: ${userCard.rechargeDate}"
                                    )
                                    android.util.Log.d("NewCard2Activity", "==================")
                                    putExtra("userCard", userCard)
                                    putExtra("operationTypeCode", CardOperationType.OpenCard.code)
                                    putExtra("cardFee", cardFee)
                                    putExtra("clientInfo",clientInfo)
                                    startActivityForResult(this, REQUEST_CODE_NFC_WRITE)
                                }
                            } catch (e: Exception) {
                                CrashReport.postCatchedException(e)
                                Toast.makeText(
                                    this@NewCardActivity,
                                    "保存开卡信息失败: ${e.message}",
                                    Toast.LENGTH_SHORT
                                ).show()
                            }
                        }
                    } else {
                        // 激活失败
                        Toast.makeText(
                            this@NewCardActivity,
                            "开卡失败: ${response.msg}",
                            Toast.LENGTH_SHORT
                        ).show()
                    }
                }
                override fun onError(e: Throwable?) {
                    super.onError(e)
                    // 请求异常
                    Toast.makeText(
                        this@NewCardActivity,
                        "开卡失败: ${e?.message ?: "网络异常"}",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }
        )
    }
    override fun onResume() {
        super.onResume()
        // 开启前台调度系统,优先处理NFC标签
    }
    override fun onPause() {
        super.onPause()
        // 关闭前台调度系统
    }
    override fun onNfcBack(intent: Intent) {
        if (!isReadCard) {
            val cardNumber = NfcReadHelper.getInstance(intent, this).getCardNumberNoClose()
            if (cardNumber.isNotEmpty()) {
                try {
                    // 创建密钥列表的副本,避免ConcurrentModificationException
                    val keyList = ArrayList(NfcReadHelper.getInstance(intent, this).getKeyList())
                    // 使用美化的加载动画来显示NFC操作的加载状态
                    val nfcHelper = NfcWreatHelper.getInstance(intent, this)
                    nfcHelper.setLoadingView(binding.loadingContainer, binding.nfcProgressWheel)
                    // 异步修改密码
                    nfcHelper.changePSAsync(
                        keyList,
                        false,
                        true
                    ) { success: Boolean, msg: String? ->
                        if (success) {
                            isReadCard = true
                            // 保存卡物理ID
                            cardPhysicalId = cardNumber
                            // 更新UI
                            binding.newCardArerNumber.text = cardNumber
                            // 隐藏NFC读卡界面
                            binding.nfcContainer.visibility = View.GONE
                            binding.centerScroll.visibility = View.VISIBLE
                            binding.newCardRegistBtn.visibility = View.VISIBLE
                        } else {
                            // 密码修改失败,处理错误情况
                            Toast.makeText(
                                this@NewCardActivity,
                                "卡片初始化失败:$msg",
                                Toast.LENGTH_LONG
                            ).show()
                        }
                    }
                } catch (e: Exception) {
                    // 处理异常情况
                    CrashReport.postCatchedException(e)
                    e.printStackTrace()
                }
            } else {
                Toast.makeText(
                    this@NewCardActivity,
                    "获取卡号失败",
                    Toast.LENGTH_SHORT
                ).show()
            }
        } else {
            Toast.makeText(
                this@NewCardActivity,
                "当前已读卡,不可再次读卡",
                Toast.LENGTH_SHORT
            ).show()
        }
    }
    override fun onDestroy() {
        super.onDestroy()
        // 清理NFC工具类中的RxJava订阅,防止内存泄漏
        try {
            NfcReadHelper.getInstance(intent, this).clearDisposables()
            NfcWreatHelper.getInstance(intent, this).clearDisposables()
            // 确保停止动画,避免内存泄漏
            binding.nfcProgressWheel.stopSpinning()
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_CODE_NFC_WRITE && resultCode == RESULT_OK) {
            // 写卡成功,关闭当前Activity
            finish()
        }
    }
}
generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
@@ -14,6 +14,7 @@
import com.dayu.general.bean.card.DebugCard
import com.dayu.general.bean.card.UserCard
import com.dayu.general.bean.net.CardInfoResult
import com.dayu.general.bean.net.ClientInfo
import com.dayu.general.dao.BaseDaoSingleton
import com.dayu.general.databinding.ActivityNfcWriteGeBinding
import com.dayu.general.net.ApiManager
@@ -100,6 +101,8 @@
    private var projectNumber: String = ""
    private var cardInfo: CardInfoResult? = null
    private var clientInfo: ClientInfo? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
@@ -120,6 +123,7 @@
        orderNumber = intent?.getStringExtra("orderNumber") ?: ""
        operationType = CardOperationType.fromCode(operationTypeCode)
        cardInfo = intent?.getSerializableExtra("cardInfo") as? CardInfoResult
        clientInfo = intent?.getSerializableExtra("clientInfo") as? ClientInfo
        // 获取充值相关金额
        rechargeAmount = intent?.getDoubleExtra("rechargeAmount", 0.0) ?: 0.0
@@ -681,6 +685,10 @@
                            putExtra("cardInfo", it)
                        }
                        // 传递客户信息对象
                        clientInfo?.let {
                            putExtra("clientInfo", it)
                        }
                        startActivity(this)
                    }
generallibrary/src/main/java/com/dayu/general/activity/SearchUserListActivity.kt
@@ -91,7 +91,7 @@
        userAdapter?.setOnItemClickListener { user ->
            // 处理用户点击事件
            // 传递用户信息到开卡界面
            val intent = Intent(this, NewCard2Activity::class.java)
            val intent = Intent(this, NewCardActivity::class.java)
            intent.putExtra("clientId", user.clientId)
            startActivity(intent)
        }
generallibrary/src/main/java/com/dayu/general/bean/net/NewCardInfo.kt
@@ -1,5 +1,7 @@
package com.dayu.general.bean.net
import java.io.Serializable
// 支付方式数据类
data class PaymentMethod(
    val id: String,
@@ -30,7 +32,7 @@
}
// 用户信息数据类
data class ClientInfo(
data class ClientInfo (
    val clientId: String,
    val clientNum: String,
    val name: String,
@@ -41,4 +43,4 @@
    val address: String,
    val cardCount: Int,
    val operateDt: String
)
) : Serializable