左晓为主开发手持机充值管理机
zuoxiao
17 小时以前 0ad1393b93f371b1f326d76e7681baca5fe9b0dd
feat(card): 优化补卡流程并支持客户编号补卡

- 修改了 CardReplaceActivity 以支持使用客户编号进行补卡
- 新增 CardInfoByClientResult 数据类用于存储客户编号查询结果- 更新了 activity_card_replace.xml布局文件中的提示文本- 在 CardUnlossActivity 中添加了传递客户编号启动 CardReplaceActivity 的逻辑
4个文件已修改
172 ■■■■ 已修改文件
generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/CardUnlossActivity.kt 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/bean/net/CardInfoResult.kt 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/res/layout/activity_card_replace.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt
@@ -16,6 +16,7 @@
import com.dayu.general.R
import com.dayu.general.bean.card.UserCard
import com.dayu.general.bean.net.CardInfoResult
import com.dayu.general.bean.net.CardInfoByClientResult
import com.dayu.general.bean.net.CardReplaceResult
import com.dayu.general.bean.net.PaymentMethod
import com.dayu.general.bean.net.PaymentMethodResponse
@@ -35,7 +36,10 @@
    private lateinit var binding: ActivityCardReplaceBinding
    private var cardNumber: String? = null
    private var cardInfo: CardInfoResult? = null
    private var cardInfoByClient: CardInfoByClientResult? = null
    private var userCard: UserCard? = null
    private var clientNum: String? = null
    private var newCardNumber: String? = null // 新卡卡号
    // 支付方式相关属性
    private var paymentMethod: String = "现金"
@@ -46,8 +50,11 @@
        /**
         * 启动补卡Activity
         */
        fun start(context: Context) {
        fun start(context: Context, clientNum: String? = null) {
            val intent = Intent(context, CardReplaceActivity::class.java)
            clientNum?.let {
                intent.putExtra("clientNum", it)
            }
            context.startActivity(intent)
        }
    }
@@ -57,9 +64,15 @@
        binding = ActivityCardReplaceBinding.inflate(layoutInflater)
        setContentView(binding.root)
        // 获取传递的clientNum参数
        clientNum = intent.getStringExtra("clientNum")
        initView()
        // 获取支付方式
        getPaymentMethods()
        // 无论是否有clientNum,都先显示读卡界面,等待用户刷新卡
        resetToReadingState()
    }
    private fun initView() {
@@ -178,6 +191,8 @@
        binding.bottomButtonContainer.visibility = android.view.View.GONE
        cardNumber = null
        cardInfo = null
        cardInfoByClient = null
        newCardNumber = null
        binding.etCardCost.setText("")
        binding.etReturnAmount.setText("0")
    }
@@ -227,16 +242,24 @@
                }
                return
            }
            val cardNumber = parts[0]
            val readCardNumber = parts[0]
            val cardType = parts[1]
            this.cardNumber = cardNumber
            if (cardNumber.isBlank()) {
            if (readCardNumber.isBlank()) {
                showConfirmDialog("卡号为空,无法进行操作,请重新刷卡") {
                }
                return
            }
            // 根据卡片类型进行不同处理
            // 保存新卡卡号
            this.newCardNumber = readCardNumber
            // 根据是否有clientNum参数决定获取卡信息的方式
            if (clientNum != null) {
                // 如果有clientNum,使用clientNum获取卡信息
                getCardInfoByClientNum(clientNum!!)
            } else {
                // 如果没有clientNum,根据卡片类型进行处理
            when (cardType) {
                CardCommon.USER_CARD_TYPE_1,
                CardCommon.USER_CARD_TYPE_2,
@@ -248,7 +271,8 @@
                }
                else -> {
                    // 管理类卡不支持补卡
                    handleUserCard(cardNumber, cardType, nfcAdapter)
                        handleUserCard(readCardNumber, cardType, nfcAdapter)
                    }
                }
            }
        } catch (e: Exception) {
@@ -327,9 +351,10 @@
        binding.bottomButtonContainer.visibility = android.view.View.VISIBLE
        this.cardInfo = cardInfo
        this.cardNumber = cardNumber
        
        // 显示当前卡地址
        binding.tvCurrentCardAddress.text = cardNumber
        // 显示新卡卡号
        binding.tvCurrentCardAddress.text = newCardNumber ?: cardNumber
        // 显示服务器数据
        cardInfo?.let { info ->
@@ -431,14 +456,22 @@
     * 调用补卡API接口
     */
    private fun callReplaceCardApi(cardCost: Double, returnAmount: Double) {
        if (cardNumber.isNullOrBlank()) {
            ToastUtil.show("卡号信息异常,请重新刷卡")
        if (newCardNumber.isNullOrBlank()) {
            ToastUtil.show("新卡卡号信息异常,请重新刷卡")
            return
        }
        val map = mutableMapOf<String, Any>()
        map["cardAddr"] = cardNumber!!
        map["cardNum"] = cardInfo?.cardNum.toString()
        map["cardAddr"] = newCardNumber!! // 使用新卡卡号
        // 根据数据源选择cardNum参数
        val cardNum = when {
            cardInfo != null -> cardInfo!!.cardNum.toString()
            cardInfoByClient != null -> cardInfoByClient!!.cardNum
            else -> cardNumber ?: newCardNumber!!
        }
        map["cardNum"] = cardNum
        map["cardCost"] = cardCost
        map["returnAmount"] = returnAmount  // 使用返回金额
        map["paymentId"] = paymentId // 使用选中的支付方式ID
@@ -455,7 +488,7 @@
                override fun onNext(t: BaseResponse<CardReplaceResult>) {
                    if (t.success && t.content != null) {
                        // 补卡成功,跳转到写卡界面
                        startWriteCardActivity(t.content!!, cardCost, returnAmount, userCard!!)
                        startWriteCardActivity(t.content!!, cardCost, returnAmount, createUserCardFromData())
                    } else {
                        // 补卡失败
                        val errorMsg = if (t.msg.isNullOrBlank()) "补卡失败,请重试" else t.msg
@@ -471,6 +504,24 @@
                }
            }
        )
    }
    /**
     * 根据现有数据创建UserCard对象
     */
    private fun createUserCardFromData(): UserCard {
        return when {
            userCard != null -> userCard!!
            cardInfoByClient != null -> {
                // 从接口数据创建UserCard对象
                UserCard().apply {
                    // 这里可能需要根据实际需求设置更多属性
                    balance = MornyUtil.changeY2F(cardInfoByClient!!.money)
                    phoneNumber = cardInfoByClient!!.phone.toString()
                }
            }
            else -> UserCard() // 返回空的UserCard对象
        }
    }
    /**
@@ -501,7 +552,7 @@
        }
        val intent = Intent(this, NfcWreatActivity::class.java).apply {
            putExtra("cardAddr", cardNumber)
            putExtra("cardAddr", newCardNumber) // 使用新卡卡号
            putExtra("operationTypeCode", CardOperationType.ReplaceCard.code) // 使用补卡类型进行写卡
            putExtra("orderNumber", replaceResult.orderNo)
            putExtra("cardCost", cardCost)
@@ -513,4 +564,73 @@
        startActivity(intent)
        finish()
    }
    /**
     * 根据客户编号获取卡信息
     */
    private fun getCardInfoByClientNum(clientNum: String) {
        val map = mutableMapOf<String, Any>()
        map["clientNum"] = clientNum
        ApiManager.getInstance().requestGetLoading(
            this,
            "terminal/card/getcardbyclientnum",
            CardInfoByClientResult::class.java,
            map,
            object : SubscriberListener<BaseResponse<CardInfoByClientResult>>() {
                override fun onNext(t: BaseResponse<CardInfoByClientResult>) {
                    if (t.success) {
                        cardInfoByClient = t.content
                        t.content?.let { cardInfo ->
                            // 显示卡信息并切换到信息显示界面
                            showCardInfoFromClient(cardInfo)
                        }
                    } else {
                        showConfirmDialog("获取卡信息失败:${t.msg ?: "未知错误"}") {
                        }
                    }
                }
                override fun onError(e: Throwable?) {
                    super.onError(e)
                    showConfirmDialog("获取卡信息失败: ${e?.message ?: "网络异常,请检查网络连接"}") {
                    }
                }
            }
        )
    }
    /**
     * 显示从客户编号接口获取的卡信息
     */
    private fun showCardInfoFromClient(cardInfo: CardInfoByClientResult) {
        // 隐藏读卡提示,显示信息区域和底部按钮
        binding.scrollReadCard.visibility = android.view.View.GONE
        binding.cardInfoContainer.visibility = android.view.View.VISIBLE
        binding.bottomButtonContainer.visibility = android.view.View.VISIBLE
        // 显示新卡卡号(如果已读取到新卡)
        binding.tvCurrentCardAddress.text = newCardNumber ?: cardInfo.cardNum
        // 显示卡信息
        binding.tvUserName.text = cardInfo.clientName
        binding.tvPhone.text = cardInfo.phone.toString()
        // 根据cardState字段显示状态
        val (statusText, statusColor) = when (cardInfo.cardState) {
            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)
        // 显示余额
        binding.tvCardBalance.text = "${cardInfo.money}元"
        // 设置cardNumber用于后续API调用
        cardNumber = cardInfo.cardNum
    }
generallibrary/src/main/java/com/dayu/general/activity/CardUnlossActivity.kt
@@ -99,8 +99,7 @@
        // 设置补卡按钮点击事件  
        cardAdapter?.setOnReplaceClickListener { card ->
            CardReplaceActivity.start(this)
            CardReplaceActivity.start(this, card.clientNum)
        }
    }
generallibrary/src/main/java/com/dayu/general/bean/net/CardInfoResult.kt
@@ -16,3 +16,18 @@
    val createTime: String? = null,   // 创建时间
    val updateTime: String? = null    // 更新时间
) : Serializable 
/**
 * 根据客户编号获取卡信息的返回结果
 */
data class CardInfoByClientResult(
    val cardNum: String = "",         // 卡号
    val cardState: Int = 0,           // 卡片状态码
    val cardType: String = "",        // 卡片类型
    val clientName: String = "",      // 客户姓名
    val clientNum: String = "",       // 客户编号
    val idCard: Long = 0,             // 身份证号
    val money: String = "",           // 卡内余额
    val phone: Long = 0,              // 手机号码
    val stateName: String = ""        // 卡片状态名称
)
generallibrary/src/main/res/layout/activity_card_replace.xml
@@ -67,7 +67,7 @@
                            android:layout_below="@+id/tv_title"
                            android:layout_marginBottom="20dp"
                            android:gravity="center"
                            android:text="请将需要补办的卡片贴在设备上进行读取"
                            android:text="请将新卡贴在设备上进行读取"
                            android:textColor="#333333"
                            android:textSize="@dimen/text_size"
                            android:textStyle="bold" />
@@ -88,7 +88,7 @@
                            android:layout_height="wrap_content"
                            android:layout_below="@+id/iv_nfc"
                            android:gravity="center"
                            android:text="请保持手持机和卡片不要移动"
                            android:text="读取新卡后将显示原卡信息进行补卡操作"
                            android:textColor="#666666"
                            android:textSize="@dimen/new_card_size" />
@@ -139,7 +139,7 @@
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginBottom="12dp"
                            android:text="当前卡地址"
                            android:text="卡号"
                            android:textColor="@color/base_blue_bg"
                            android:textSize="18sp"
                            android:textStyle="bold" />