左晓为主开发手持机充值管理机
generallibrary/src/main/java/com/dayu/general/activity/ManagerReadActivity.kt
@@ -2,6 +2,8 @@
import android.content.Intent
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import android.view.View
import androidx.databinding.DataBindingUtil
import com.dayu.baselibrary.net.subscribers.SubscriberListener
@@ -13,6 +15,8 @@
import com.dayu.general.model.CardInfoModel
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
import com.dayu.general.tool.NfcReadHelper
class ManagerReadActivity : BaseNfcActivity() {
@@ -37,15 +41,141 @@
    }
    private fun initView() {
        binding.titleBar.setCenterText("读卡")
        // 根据卡类型设置标题
        when (cardType) {
            CardCommon.REGION_CARD -> binding.titleBar.setCenterText("制作区域表号卡")
            CardCommon.CHECK_CARD -> binding.titleBar.setCenterText("制作检查卡")
            CardCommon.DEBUG_CARD -> binding.titleBar.setCenterText("制作调试卡")
            CardCommon.CLEAN_CARD_TYPE -> binding.titleBar.setCenterText("制作清零卡")
            else -> binding.titleBar.setCenterText("读卡")
        }
        binding.titleBar.setOnItemclickListner(ClickType_LEFT_IMAGE) { this.finish() }
        binding.btnNext.setOnClickListener {
            if (viewModel.cardNumber.value.isNullOrEmpty()) {
                ToastUtil.show("请先读取卡号")
            } else {
                postCardData(cardType, viewModel.cardNumber.value!!, getRemark())
        // 根据卡类型设置输入框可见性
        when (cardType) {
            CardCommon.REGION_CARD -> {
                // 区域表号卡:显示区域号和项目号输入框
                binding.regionNumberLayout.visibility = View.VISIBLE
                binding.projectNumberLayout.visibility = View.VISIBLE
                // 为区域号输入框添加输入验证
                binding.regionNumberEt.addTextChangedListener(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?) {
                        val text = s.toString()
                        if (text.length > 12) {
                            binding.regionNumberEt.setText(text.substring(0, 12))
                            binding.regionNumberEt.setSelection(12)
                        }
                    }
                })
                // 为项目号输入框添加输入验证(范围1-255)
                binding.projectNumberEt.addTextChangedListener(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?) {
                        val text = s.toString()
                        if (text.isNotEmpty()) {
                            try {
                                val number = text.toInt()
                                if (number > 255) {
                                    binding.projectNumberEt.setText("255")
                                    binding.projectNumberEt.setSelection(3)
                                } else if (number < 1 && text.length > 1) {
                                    binding.projectNumberEt.setText("1")
                                    binding.projectNumberEt.setSelection(1)
                                }
                            } catch (e: NumberFormatException) {
                                // 如果输入的不是数字,清空
                                binding.projectNumberEt.setText("")
                            }
                        }
                    }
                })
            }
            CardCommon.CHECK_CARD,
            CardCommon.DEBUG_CARD,
            CardCommon.CLEAN_CARD_TYPE -> {
                // 检查卡、调试卡、清零卡:隐藏区域号和项目号输入框,只显示卡地址和备注
                binding.regionNumberLayout.visibility = View.GONE
                binding.projectNumberLayout.visibility = View.GONE
            }
            else -> {
                // 其他卡类型:隐藏区域号和项目号输入框
                binding.regionNumberLayout.visibility = View.GONE
                binding.projectNumberLayout.visibility = View.GONE
            }
        }
        binding.btnNext.setOnClickListener {
            if (viewModel.cardNumber.get().isNullOrEmpty()) {
                ToastUtil.show("请先读取卡号")
            } else if (cardType == CardCommon.REGION_CARD) {
                // 区域表号卡需要验证区域号和项目号
                val regionNumber = viewModel.regionNumber.get()
                val projectNumber = viewModel.projectNumber.get()
                if (regionNumber.isNullOrEmpty()) {
                    ToastUtil.show("请输入区域号")
                } else if (regionNumber.length != 12) {
                    ToastUtil.show("区域号必须为12位数字")
                } else if (projectNumber.isNullOrEmpty()) {
                    ToastUtil.show("请输入项目号")
                } else {
                    try {
                        val projectNum = projectNumber.toInt()
                        if (projectNum < 1 || projectNum > 255) {
                            ToastUtil.show("项目号必须在1-255范围内")
                        } else {
                            postCardData(
                                cardType,
                                viewModel.cardNumber.get()!!,
                                getRemark(),
                                regionNumber,
                                projectNumber
                            )
                        }
                    } catch (e: NumberFormatException) {
                        ToastUtil.show("项目号必须为数字")
                    }
                }
            } else {
                // 其他卡类型(包括调试卡、检查卡、清零卡)不需要区域号和项目号
                postCardData(cardType, viewModel.cardNumber.get()!!, getRemark())
            }
        }
    }
@@ -63,7 +193,7 @@
    /**
     * 获取备注信息
     */
    fun getRemark(): String = viewModel.remark.value ?: ""
    fun getRemark(): String = viewModel.remark.get() ?: ""
    override fun onNfcBack(intent: Intent) {
        // 处理NFC读取结果
@@ -71,7 +201,7 @@
            if (cardNumber.isNotEmpty() && !cardNumber.contains(BaseCommon.CARD_TYPE_ERROR2)) {
                binding.btnNext.visibility = View.VISIBLE
                binding.dataLayout.visibility = View.VISIBLE
                binding.rechargeReadLL.visibility = View.GONE
                binding.scrollReadCard.visibility = View.GONE
                setCardNumber(cardNumber)
            } else if (cardNumber.contains(BaseCommon.CARD_TYPE_ERROR2)) {
                ToastUtil.show("当前卡密码错误,不是本公司卡")
@@ -80,65 +210,134 @@
    }
private fun bytesToHexString(bytes: ByteArray?): String? {
    if (bytes == null || bytes.isEmpty()) return null
    val sb = StringBuilder()
    for (b in bytes) {
        sb.append(String.format("%02X", b))
    }
    return sb.toString()
}
/**
 * 提交数据
 */
fun postCardData(cardType: String, cardAddr: String, remark: String) {
    val map = mutableMapOf<String, Any>()
    if (cardAddr.isNotEmpty()) {
        map["cardAddr"] = cardAddr
    private fun bytesToHexString(bytes: ByteArray?): String? {
        if (bytes == null || bytes.isEmpty()) return null
        val sb = StringBuilder()
        for (b in bytes) {
            sb.append(String.format("%02X", b))
        }
        return sb.toString()
    }
    if (cardType.isNotEmpty()) {
//            map["cardType"] = cardType
        map["cardType"] = "5"
    /**
     * 提交数据 - 不带区域号的版本
     */
    fun postCardData(cardType: String, cardAddr: String, remark: String) {
        postCardData(cardType, cardAddr, remark, null, null)
    }
    if (remark.isNotEmpty()) {
        map["remarks"] = remark
    /**
     * 提交数据 - 带区域号的版本
     */
    fun postCardData(cardType: String, cardAddr: String, remark: String, regionNumber: String?) {
        postCardData(cardType, cardAddr, remark, regionNumber, null)
    }
    // 使用正确的类型参数
    ApiManager.getInstance().requestPostLoading(
        this,
        "/sell/card/create_manager_card",
        String::class.java,
        map,
        object : SubscriberListener<BaseResponse<String>>() {
            override fun onNext(t: BaseResponse<String>) {
                if (t.success) {
                    var intent = Intent(this@ManagerReadActivity, NfcWreatActivity::class.java).apply {
                        putExtra("cardAddr", cardAddr)
                        putExtra("orderId", t.content)
                        putExtra("cardType", cardType)
    /**
     * 提交数据 - 完整版本,支持区域号和项目号
     */
    fun postCardData(
        cardType: String,
        cardAddr: String,
        remark: String,
        regionNumber: String?,
        projectNumber: String?
    ) {
        val map = mutableMapOf<String, Any>()
        if (cardAddr.isNotEmpty()) {
            map["cardAddr"] = cardAddr
        }
        if (cardType.isNotEmpty()) {
            // 根据卡类型设置对应的数字编号
            val cardTypeNumber = when (cardType) {
                CardCommon.REGION_CARD -> "2"           // 设置区域表号卡
                CardCommon.ELECTRIC_PRICE_CARD -> "3"   // 取数卡
                CardCommon.CHECK_CARD -> "4"            // 检查卡
                CardCommon.DEBUG_CARD -> "5"            // 测试卡
                CardCommon.CLEAN_CARD_TYPE -> "6"       // 清零卡
                CardCommon.IP_CARD -> "7"               // IP设置卡
                CardCommon.AREA_CARD -> "8"             // 域名设置卡(区域设置卡)
                CardCommon.GPS_CARD -> "9"              // GPS卡
                CardCommon.VALVE_TIME_CARD -> "10"      // 时间配置卡(配置开关阀时间)
                else -> "5" // 默认值
            }
            map["cardType"] = cardTypeNumber
        }
        if (remark.isNotEmpty()) {
            map["remarks"] = remark
        }
        // 如果是区域表号卡并且有区域号,添加到请求参数中
        if (cardType == CardCommon.REGION_CARD && !regionNumber.isNullOrEmpty()) {
            map["regionNumber"] = regionNumber
        }
        // 如果是区域表号卡并且有项目号,添加到请求参数中
        if (cardType == CardCommon.REGION_CARD && !projectNumber.isNullOrEmpty()) {
            map["projectNumber"] = projectNumber
        }
        map["protocol"] = protocol
        map["securityCode"]="A0B1C289"
        // 使用正确的类型参数
        ApiManager.getInstance().requestPostLoading(
            this,
            "terminal/card/createManagementCard",
            String::class.java,
            map,
            object : SubscriberListener<BaseResponse<String>>() {
                override fun onNext(t: BaseResponse<String>) {
                    if (t.success) {
                        var intent =
                            Intent(this@ManagerReadActivity, NfcWreatActivity::class.java).apply {
                                putExtra("cardAddr", cardAddr)
                                putExtra("orderNumber", t.content)
                                putExtra("cardType", cardType)
                                // 根据卡类型设置操作类型代码
                                val operationTypeCode = when (cardType) {
                                    CardCommon.REGION_CARD -> 100      // 区域表号卡操作类型
                                    CardCommon.CHECK_CARD -> 101       // 检查卡操作类型
                                    CardCommon.DEBUG_CARD -> 102       // 调试卡操作类型
                                    CardCommon.CLEAN_CARD_TYPE -> 103  // 清零卡操作类型
                                    CardCommon.IP_CARD -> 104          // IP设置卡操作类型
                                    CardCommon.AREA_CARD -> 105        // 域名设置卡操作类型
                                    CardCommon.GPS_CARD -> 106         // GPS卡操作类型
                                    CardCommon.VALVE_TIME_CARD -> 107  // 时间配置卡操作类型
                                    CardCommon.ELECTRIC_PRICE_CARD -> 108  // 取数卡操作类型
                                    else -> -1
                                }
                                putExtra("operationTypeCode", operationTypeCode)
                                // 传递区域号和项目号(仅当是区域表号卡时)
                                if (cardType == CardCommon.REGION_CARD && !regionNumber.isNullOrEmpty()) {
                                    putExtra("regionNumber", regionNumber)
                                }
                                if (cardType == CardCommon.REGION_CARD && !projectNumber.isNullOrEmpty()) {
                                    putExtra("projectNumber", projectNumber)
                                }
                            }
                        this@ManagerReadActivity.finish()
                        startActivity(intent)
                    } else {
                        // 处理搜索失败的情况
                        ToastUtil.show(t.msg)
                    }
                    this@ManagerReadActivity.finish()
                    startActivity(intent)
                } else {
                    // 处理搜索失败的情况
                    ToastUtil.show(t.msg)
                }
                override fun onError(e: Throwable?) {
                    super.onError(e)
                    ToastUtil.show("接口调取失败: ${e?.message ?: "未知错误"}")
                }
            }
            override fun onError(e: Throwable?) {
                super.onError(e)
                ToastUtil.show("搜索失败: ${e?.message ?: "未知错误"}")
            }
        }
    )
        )
}
    }
}