左晓为主开发手持机充值管理机
zuoxiao
2025-04-08 eb53d9c4837b5a0df0db1ca153e05bf305ce498a
feat(generallibrary): 新增用户开卡功能

- 新增 NewCard2Activity 用于用户开卡
- 更新 SearchUserListActivity,支持跳转到开卡页面
- 添加开卡相关的布局文件和资源
- 实现开卡逻辑,包括读取卡信息、填写用户信息和支付方式等
6个文件已修改
5个文件已添加
827 ■■■■■ 已修改文件
generallibrary/src/main/AndroidManifest.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt 224 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/SearchUserListActivity.kt 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/bean/net/SearchUserResult.kt 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/res/drawable/radio_checked.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/res/drawable/radio_selector.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/res/drawable/radio_unchecked.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/res/layout/activity_card_list.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/res/layout/activity_new_card_1_ge.xml 359 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/res/layout/dialog_search_card_ge.xml 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/res/values/colors.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/AndroidManifest.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <uses-permission android:name="android.permission.NFC" />
    <!--用于访问网络,网络定位需要上网-->
@@ -49,18 +49,18 @@
        <!--        </activity>-->
        <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.NfcWreatActivity"
        <activity android:name="com.dayu.general.activity.SearchUserListActivity" />
        <activity
            android:name="com.dayu.general.activity.NfcWreatActivity"
            android:exported="false"
            android:launchMode="singleTop"
            >
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.nfc.action.ACTION_NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>
        <activity android:name=".activity.MainActivity"/>
        <activity android:name=".activity.MainActivity" />
        <activity
            android:name=".activity.ManagerReadActivity"
            android:exported="false"
@@ -71,8 +71,17 @@
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>
        <activity android:name=".activity.SearchCardListActivity"/>
        <activity android:name=".activity.SearchCardListActivity" />
        <activity
            android:name=".activity.NewCard2Activity"
            android:exported="false"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.nfc.action.ACTION_NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>
        <meta-data
generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
New file
@@ -0,0 +1,224 @@
package com.dayu.general.activity
import android.content.Intent
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.view.View
import android.widget.Toast
import com.dayu.baselibrary.net.subscribers.SubscriberListener
import com.dayu.baselibrary.view.TitleBar.ClickType_LEFT_IMAGE
import com.dayu.general.BaseApplication
import com.dayu.general.R
import com.dayu.general.databinding.ActivityNewCard1GeBinding
import com.dayu.general.net.ApiManager
import com.dayu.general.net.BaseResponse
import com.dayu.general.tool.NfcReadHelper
/**
 * Description: 用户开卡界面
 * Author: zuo
 * Date: 2025/4/7
 */
class NewCard2Activity : BaseNfcActivity() {
    private lateinit var binding: ActivityNewCard1GeBinding
    // 支付方式
    private var paymentMethod: String = "现金"
    // 卡物理ID
    private var cardPhysicalId: String = ""
    // 用户ID
    private var userId: String = ""
    companion object {
        private const val TAG = "NewCard2Activity"
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityNewCard1GeBinding.inflate(layoutInflater)
        setContentView(binding.root)
        initView()
        initListener()
    }
    private fun initView() {
        // 初始化标题栏返回按钮
        binding.titleBar.setOnItemclickListner(ClickType_LEFT_IMAGE) {
            finish()
        }
        // 初始化NFC读卡容器,初始隐藏
        binding.nfcContainer.visibility = View.VISIBLE
        // 从Intent中获取用户信息(如果有)
        val userName = intent.getStringExtra("userName") ?: ""
        val rawIdCard = intent.getStringExtra("idCard")
        val idCard = if (rawIdCard.isNullOrBlank()) "无" else rawIdCard
        val farmerCode = intent.getStringExtra("farmerCode") ?: ""
        userId = intent.getStringExtra("userId") ?: ""
        // 设置用户信息
        binding.newCardUserName.text = userName
        binding.newCardIdCard.text = idCard
        binding.newCardFarmerCode.text = farmerCode
        // 设置金额输入限制为两位小数
        binding.newCardRechargeAmount.addTextChangedListener(createDecimalTextWatcher())
        binding.newCardCardFee.addTextChangedListener(createDecimalTextWatcher())
    }
    /**
     * 创建限制输入两位小数的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 ->
            paymentMethod = when (checkedId) {
                R.id.newCard_cashPayment -> "现金"
                R.id.newCard_posPayment -> "POS机"
                R.id.newCard_bankTransfer -> "银行转账"
                else -> "现金"
            }
        }
        // 设置开卡按钮点击监听
        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.0 else cardFeeStr.toDouble()
        // 格式化金额为两位小数
        val formattedRechargeAmount = String.format("%.2f", rechargeAmount)
        val formattedCardFee = String.format("%.2f", cardFee)
        // 获取支付方式ID
        val paymentId = when (paymentMethod) {
            "现金" -> 1
            "POS机" -> 2
            "银行转账" -> 3
            else -> 1
        }
        val remark = binding.newCardRemark.text.toString()
        // 构建请求参数
        val params = HashMap<String, Any>()
        params["cardAddr"] = cardPhysicalId // 水卡地址(物理ID)
        params["clientNum"] = binding.newCardFarmerCode.text.toString() // 农户编号
        params["cardCost"] = (cardFee * 100).toInt() // 购卡金额(工本费)转为分
        params["amount"] = (rechargeAmount * 100).toInt() // 充值金额转为分
        params["paymentId"] = paymentId // 支付方式
        params["remarks"] = remark // 备注
        params["operator"] = BaseApplication.userId // 操作人ID
        // 执行卡片激活API请求
        ApiManager.getInstance().requestPostLoading(
            this,
            "sell/card/active",
            String::class.java,
            params,
            object : SubscriberListener<BaseResponse<String>>() {
                override fun onNext(response: BaseResponse<String>) {
                    if (response.success) {
                        // 激活成功
                        Toast.makeText(this@NewCard2Activity, "开卡成功", Toast.LENGTH_SHORT).show()
                        setResult(RESULT_OK)
                        finish()
                    } else {
                        // 激活失败
                        Toast.makeText(
                            this@NewCard2Activity,
                            "开卡失败: ${response.msg}",
                            Toast.LENGTH_SHORT
                        ).show()
                    }
                }
                override fun onError(e: Throwable?) {
                    super.onError(e)
                    // 请求异常
                    Toast.makeText(
                        this@NewCard2Activity,
                        "开卡失败: ${e?.message ?: "网络异常"}",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }
        )
    }
    override fun onResume() {
        super.onResume()
        // 开启前台调度系统,优先处理NFC标签
    }
    override fun onPause() {
        super.onPause()
        // 关闭前台调度系统
    }
    override fun onNfcBack(intent: Intent) {
        var cardNumber = NfcReadHelper.getInstance(intent, this).getCardNumber()
        if (!cardNumber.isEmpty()) {
            // 保存卡物理ID
            cardPhysicalId = cardNumber
            // 更新UI
            binding.newCardArerNumber.text = cardNumber
            // 隐藏NFC读卡界面
            binding.nfcContainer.visibility = View.GONE
            Toast.makeText(this, "读卡成功", Toast.LENGTH_SHORT).show()
        }
    }
}
generallibrary/src/main/java/com/dayu/general/activity/SearchUserListActivity.kt
@@ -1,5 +1,6 @@
package com.dayu.general.activity
import android.content.Intent
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import com.dayu.baselibrary.net.subscribers.SubscriberListener
@@ -25,12 +26,12 @@
    var binding: ActivitySearchUserGeBinding? = null
    private var userAdapter: SearchUserListAdapter? = null
    var searchDialog: SearchDialog? = null
    // 分页相关变量
    private var currentPage = 1
    private val pageSize = 20
    private var hasMoreData = true
    // 保存当前搜索条件
    private var currentFarmerId = ""
    private var currentFarmerName = ""
@@ -57,11 +58,11 @@
                currentFarmerId = farmerId
                currentFarmerName = farmerName
                currentCardNumber = cardNumber
                // 重置分页状态
                currentPage = 1
                hasMoreData = true
                // 执行搜索
                searchUser(farmerId, farmerName, cardNumber, true)
            }
@@ -79,20 +80,22 @@
            layoutManager = LinearLayoutManager(this@SearchUserListActivity)
            adapter = userAdapter
        }
        // 设置列表项点击事件
        userAdapter?.setOnItemClickListener { user ->
            // 处理用户点击事件
            ToastUtil.show("已选择用户:${user.name}")
            // 这里可以添加跳转到用户详情页面的逻辑
            // val intent = Intent(this, UserDetailActivity::class.java)
            // intent.putExtra("userId", user.id)
            // startActivity(intent)
            // 传递用户信息到开卡界面
            val intent = Intent(this, NewCard2Activity::class.java)
            intent.putExtra("userName", user.name)
            intent.putExtra("idCard", user.idCard)
            intent.putExtra("farmerCode", user.clientNum)
            intent.putExtra("userId", user.id)
            startActivity(intent)
        }
    }
    private fun setupRefreshLayout() {
        binding?.refreshLayout?.apply {
            // 设置刷新和加载更多监听器
@@ -103,7 +106,7 @@
                    hasMoreData = true
                    searchUser(currentFarmerId, currentFarmerName, currentCardNumber, true)
                }
                override fun onLoadMore(refreshLayout: RefreshLayout) {
                    // 如果还有更多数据,加载下一页
                    if (hasMoreData) {
@@ -130,7 +133,12 @@
     * @param cardNumber 银行卡号
     * @param isRefresh 是否为刷新操作
     */
    private fun searchUser(farmerId: String, farmerName: String, cardNumber: String, isRefresh: Boolean = true) {
    private fun searchUser(
        farmerId: String,
        farmerName: String,
        cardNumber: String,
        isRefresh: Boolean = true
    ) {
        val map = mutableMapOf<String, Any>()
        if (farmerId.isNotEmpty()) {
@@ -144,7 +152,7 @@
        if (cardNumber.isNotEmpty()) {
            map["cardNum"] = cardNumber
        }
        // 添加分页参数
        map["pageCurr"] = currentPage
        map["pageSize"] = pageSize
@@ -159,7 +167,7 @@
                override fun onNext(t: BaseResponse<SearchUserResult>) {
                    // 完成刷新或加载动作
                    finishRefreshOrLoad(isRefresh)
                    if (t.success) {
                        // 处理搜索成功的情况
                        val result = t.content
@@ -172,7 +180,7 @@
                                } else {
                                    userAdapter?.addData(result.obj)
                                }
                                // 判断是否还有更多数据:根据当前页码和总页数判断
                                hasMoreData = currentPage < result.pageTotal
                            } else {
@@ -205,7 +213,7 @@
            }
        )
    }
    /**
     * 完成刷新或加载操作
     * @param isRefresh 是否为刷新操作
generallibrary/src/main/java/com/dayu/general/bean/net/SearchUserResult.kt
@@ -1,5 +1,7 @@
package com.dayu.general.bean.net
import android.os.Parcelable
/**
 * Description: 搜索用户结果Bean
 * Author: zuo
@@ -15,7 +17,7 @@
    /**
     * 用户信息
     */
    data class UserInfo(
    data class UserInfo (
        val address: String? = null,   // 地址
        val cardCount: Int? = null,    // 卡数量
        val clientNum: String? = null, // 客户编号
generallibrary/src/main/res/drawable/radio_checked.xml
New file
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#E6F2FF" />
            <corners android:radius="4dp" />
            <stroke android:color="#4285F4" android:width="1dp" />
        </shape>
    </item>
</layer-list>
generallibrary/src/main/res/drawable/radio_selector.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/radio_checked" android:state_checked="true" />
    <item android:drawable="@drawable/radio_unchecked" android:state_checked="false" />
</selector>
generallibrary/src/main/res/drawable/radio_unchecked.xml
New file
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#FFFFFF" />
    <corners android:radius="4dp" />
    <stroke android:color="#DDDDDD" android:width="1dp" />
</shape>
generallibrary/src/main/res/layout/activity_card_list.xml
@@ -39,6 +39,7 @@
                android:paddingTop="8dp"
                android:paddingBottom="8dp"
                android:clipToPadding="false"
                android:background="@color/base_list_bg"
                android:overScrollMode="never" />
            <com.scwang.smart.refresh.footer.ClassicsFooter
generallibrary/src/main/res/layout/activity_new_card_1_ge.xml
@@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    android:background="#F5F7FA">
    <com.dayu.baselibrary.view.TitleBar
        android:id="@+id/titleBar"
        android:layout_width="match_parent"
@@ -14,7 +16,6 @@
        app:leftImage="@mipmap/icon_back"
        tools:ignore="MissingConstraints" />
    <androidx.cardview.widget.CardView
        android:id="@+id/nfcContainer"
        android:layout_width="match_parent"
@@ -23,6 +24,7 @@
        android:layout_marginTop="24dp"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="24dp"
        android:visibility="gone"
        app:cardBackgroundColor="@android:color/white"
        app:cardCornerRadius="12dp"
        app:cardElevation="4dp"
@@ -43,8 +45,17 @@
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="请将新卡贴在设备上进行写卡"
                android:text="请将新卡贴在设备上进行读卡"
                android:textColor="#333333"
                android:textSize="18sp"
                android:textStyle="bold" />
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="(将获取物理卡卡号)"
                android:textColor="#999999"
                android:textSize="18sp"
                android:textStyle="bold" />
@@ -61,12 +72,352 @@
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:gravity="center"
                android:text="请保持手机和卡片不要移动"
                android:text="请保持手持机和卡片不要移动"
                android:textColor="#666666"
                android:textSize="14sp" />
        </LinearLayout>
    </androidx.cardview.widget.CardView>
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:fillViewport="true"
        android:scrollbars="none"
        android:visibility="gone"
        app:layout_constraintBottom_toTopOf="@+id/newCard_registBtn"
        app:layout_constraintTop_toBottomOf="@+id/titleBar">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="16dp">
            <androidx.cardview.widget.CardView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="16dp"
                app:cardCornerRadius="8dp"
                app:cardElevation="2dp">
                <LinearLayout
                    android:id="@+id/center_data"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:padding="16dp">
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="16dp"
                        android:text="基本信息"
                        android:textColor="#333333"
                        android:textSize="18sp"
                        android:textStyle="bold" />
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="12dp"
                        android:gravity="center_vertical"
                        android:orientation="horizontal">
                        <TextView
                            android:layout_width="120dp"
                            android:layout_height="wrap_content"
                            android:text="卡号:"
                            android:textColor="#666666"
                            android:textSize="@dimen/new_card_size" />
                        <TextView
                            android:id="@+id/newCard_arerNumber"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginStart="8dp"
                            android:textColor="#333333"
                            android:textSize="@dimen/new_card_size" />
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="12dp"
                        android:gravity="center_vertical"
                        android:orientation="horizontal">
                        <TextView
                            android:layout_width="120dp"
                            android:layout_height="wrap_content"
                            android:text="姓名:"
                            android:textColor="#666666"
                            android:textSize="@dimen/new_card_size" />
                        <TextView
                            android:id="@+id/newCard_userName"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginStart="8dp"
                            android:textColor="#333333"
                            android:textSize="@dimen/new_card_size" />
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="12dp"
                        android:gravity="center_vertical"
                        android:orientation="horizontal">
                        <TextView
                            android:layout_width="120dp"
                            android:layout_height="wrap_content"
                            android:text="身份证号:"
                            android:textColor="#666666"
                            android:textSize="@dimen/new_card_size" />
                        <TextView
                            android:id="@+id/newCard_idCard"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginStart="8dp"
                            android:textColor="#333333"
                            android:textSize="@dimen/new_card_size" />
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="12dp"
                        android:gravity="center_vertical"
                        android:orientation="horizontal">
                        <TextView
                            android:layout_width="120dp"
                            android:layout_height="wrap_content"
                            android:text="农户编号:"
                            android:textColor="#666666"
                            android:textSize="@dimen/new_card_size" />
                        <TextView
                            android:id="@+id/newCard_farmerCode"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_marginStart="8dp"
                            android:textColor="#333333"
                            android:textSize="@dimen/new_card_size" />
                    </LinearLayout>
                </LinearLayout>
            </androidx.cardview.widget.CardView>
            <androidx.cardview.widget.CardView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="16dp"
                app:cardCornerRadius="8dp"
                app:cardElevation="2dp">
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:padding="16dp">
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="16dp"
                        android:text="费用信息"
                        android:textColor="#333333"
                        android:textSize="18sp"
                        android:textStyle="bold" />
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="12dp"
                        android:gravity="center_vertical"
                        android:orientation="horizontal">
                        <TextView
                            android:layout_width="120dp"
                            android:layout_height="wrap_content"
                            android:text="工本费:"
                            android:textColor="#666666"
                            android:textSize="@dimen/new_card_size" />
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:background="#FFFFFF"
                            android:orientation="vertical">
                            <EditText
                                android:id="@+id/newCard_rechargeAmount"
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content"
                                android:background="@null"
                                android:hint="请输入工本费(选填)"
                                android:inputType="numberDecimal"
                                android:padding="12dp"
                                android:textColor="#333333"
                                android:textSize="@dimen/new_card_size" />
                        </LinearLayout>
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="12dp"
                        android:gravity="center_vertical"
                        android:orientation="horizontal">
                        <TextView
                            android:layout_width="120dp"
                            android:layout_height="wrap_content"
                            android:text="充值金额:"
                            android:textColor="#666666"
                            android:textSize="@dimen/new_card_size" />
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:background="#FFFFFF"
                            android:orientation="vertical">
                            <EditText
                                android:id="@+id/newCard_cardFee"
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content"
                                android:background="@null"
                                android:hint="请输入充值金额(选填)"
                                android:inputType="numberDecimal"
                                android:padding="12dp"
                                android:textColor="#333333"
                                android:textSize="@dimen/new_card_size" />
                        </LinearLayout>
                    </LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="12dp"
                        android:gravity="center_vertical"
                        android:orientation="horizontal">
                        <TextView
                            android:layout_width="120dp"
                            android:layout_height="wrap_content"
                            android:text="备注:"
                            android:textColor="#666666"
                            android:textSize="@dimen/new_card_size" />
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:background="#FFFFFF"
                            android:orientation="vertical">
                            <EditText
                                android:id="@+id/newCard_remark"
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content"
                                android:background="@null"
                                android:hint="请输入备注(选填)"
                                android:padding="12dp"
                                android:textColor="#333333"
                                android:textSize="@dimen/new_card_size" />
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>
            </androidx.cardview.widget.CardView>
            <androidx.cardview.widget.CardView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:cardCornerRadius="8dp"
                app:cardElevation="2dp">
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical"
                    android:padding="16dp">
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="16dp"
                        android:text="支付方式"
                        android:textColor="#333333"
                        android:textSize="18sp"
                        android:textStyle="bold" />
                    <RadioGroup
                        android:id="@+id/newCard_paymentMethod"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal">
                        <RadioButton
                            android:id="@+id/newCard_cashPayment"
                            android:layout_width="0dp"
                            android:layout_height="40dp"
                            android:layout_marginRight="15dp"
                            android:layout_weight="1"
                            android:background="@drawable/radio_selector"
                            android:button="@null"
                            android:checked="true"
                            android:gravity="center"
                            android:text="现金"
                            android:textColor="@color/radio_button_text_color"
                            android:textSize="@dimen/new_card_size" />
                        <RadioButton
                            android:id="@+id/newCard_posPayment"
                            android:layout_width="0dp"
                            android:layout_height="40dp"
                            android:layout_marginRight="15dp"
                            android:layout_weight="1"
                            android:background="@drawable/radio_selector"
                            android:button="@null"
                            android:gravity="center"
                            android:text="POS机"
                            android:textColor="@color/radio_button_text_color"
                            android:textSize="@dimen/new_card_size" />
                        <RadioButton
                            android:id="@+id/newCard_bankTransfer"
                            android:layout_width="0dp"
                            android:layout_height="40dp"
                            android:layout_weight="1"
                            android:background="@drawable/radio_selector"
                            android:button="@null"
                            android:gravity="center"
                            android:text="银行转账"
                            android:textColor="@color/radio_button_text_color"
                            android:textSize="@dimen/new_card_size" />
                    </RadioGroup>
                </LinearLayout>
            </androidx.cardview.widget.CardView>
        </LinearLayout>
    </ScrollView>
    <TextView
        android:id="@+id/newCard_registBtn"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:layout_margin="16dp"
        android:background="#4285F4"
        android:visibility="gone"
        android:gravity="center"
        android:text="确认开卡"
        android:textColor="#FFFFFF"
        android:textSize="16sp"
        app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
generallibrary/src/main/res/layout/dialog_search_card_ge.xml
New file
@@ -0,0 +1,142 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/search_dialog_bg"
    android:padding="20dp">
    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="卡片搜索"
        android:textColor="@color/black"
        android:textSize="20sp"
        android:textStyle="bold"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <View
        android:id="@+id/divider"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_marginTop="12dp"
        android:background="#E0E0E0"
        app:layout_constraintTop_toBottomOf="@id/tv_title" />
    <TextView
        android:id="@+id/tv_card_number_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="卡号"
        android:textColor="#666666"
        android:textSize="14sp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/divider" />
    <EditText
        android:id="@+id/et_card_number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="6dp"
        android:background="@drawable/edit_text_bg"
        android:hint="请输入卡号"
        android:inputType="text"
        android:singleLine="true"
        android:textColorHint="#BBBBBB"
        android:textSize="15sp"
        app:layout_constraintTop_toBottomOf="@id/tv_card_number_label" />
    <TextView
        android:id="@+id/tv_client_number_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="14dp"
        android:text="客户编号"
        android:textColor="#666666"
        android:textSize="14sp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/et_card_number" />
    <EditText
        android:id="@+id/et_client_number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="6dp"
        android:background="@drawable/edit_text_bg"
        android:hint="请输入客户编号"
        android:inputType="text"
        android:singleLine="true"
        android:textColorHint="#BBBBBB"
        android:textSize="15sp"
        app:layout_constraintTop_toBottomOf="@id/tv_client_number_label" />
    <TextView
        android:id="@+id/tv_client_name_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="14dp"
        android:text="客户姓名"
        android:textColor="#666666"
        android:textSize="14sp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/et_client_number" />
    <EditText
        android:id="@+id/et_client_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="6dp"
        android:background="@drawable/edit_text_bg"
        android:hint="请输入客户姓名"
        android:inputType="text"
        android:singleLine="true"
        android:textColorHint="#BBBBBB"
        android:textSize="15sp"
        app:layout_constraintTop_toBottomOf="@id/tv_client_name_label" />
    <Button
        android:id="@+id/tv_cancel"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:layout_marginEnd="6dp"
        android:background="@drawable/cancel_button_ripple"
        android:clickable="true"
        android:focusable="true"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:stateListAnimator="@null"
        android:text="取消"
        android:textColor="#666666"
        android:textSize="15sp"
        app:layout_constraintEnd_toStartOf="@id/btn_search"
        app:layout_constraintHorizontal_chainStyle="packed"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/et_client_name" />
    <Button
        android:id="@+id/btn_search"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="6dp"
        android:background="@drawable/search_button_ripple"
        android:clickable="true"
        android:elevation="2dp"
        android:focusable="true"
        android:paddingTop="12dp"
        android:paddingBottom="12dp"
        android:stateListAnimator="@null"
        android:text="搜索"
        android:textColor="@android:color/white"
        android:textSize="16sp"
        android:textStyle="bold"
        app:layout_constraintBaseline_toBaselineOf="@id/tv_cancel"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_weight="1"
        app:layout_constraintStart_toEndOf="@id/tv_cancel" />
</androidx.constraintlayout.widget.ConstraintLayout>
generallibrary/src/main/res/values/colors.xml
@@ -6,5 +6,7 @@
    <color name="nav_item_color">#555555</color>
    <color name="base_list_bg">#e6e6e6</color>
    <color name="green">#32CD32</color>
    <color name="blue">#007BFF</color>
    <color name="grey">#808080</color>
    <color name="light_grey">#E0E0E0</color>
</resources>