左晓为主开发手持机充值管理机
zuoxiao
3 天以前 80eb39909e0d5c181dc8d6e282a292146ec51e21
generallibrary/src/main/java/com/dayu/general/activity/ManagerReadActivity.kt
@@ -15,6 +15,7 @@
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
@@ -48,18 +49,34 @@
            CardCommon.CLEAN_CARD_TYPE -> binding.titleBar.setCenterText("制作清零卡")
            else -> binding.titleBar.setCenterText("读卡")
        }
        binding.titleBar.setOnItemclickListner(ClickType_LEFT_IMAGE) { this.finish() }
        // 根据卡类型设置输入框可见性
        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 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) {
@@ -68,35 +85,96 @@
                        }
                    }
                })
                // 为项目号输入框添加输入验证(范围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.value.isNullOrEmpty()) {
            if (viewModel.cardNumber.get().isNullOrEmpty()) {
                ToastUtil.show("请先读取卡号")
            } else if (cardType == CardCommon.REGION_CARD) {
                // 区域表号卡需要验证区域号
                val regionNumber = viewModel.regionNumber.value
                // 区域表号卡需要验证区域号和项目号
                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 {
                    postCardData(cardType, viewModel.cardNumber.value!!, getRemark(), regionNumber)
                    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.value!!, getRemark())
                // 其他卡类型(包括调试卡、检查卡、清零卡)不需要区域号和项目号
                postCardData(cardType, viewModel.cardNumber.get()!!, getRemark())
            }
        }
    }
@@ -115,7 +193,7 @@
    /**
     * 获取备注信息
     */
    fun getRemark(): String = viewModel.remark.value ?: ""
    fun getRemark(): String = viewModel.remark.get() ?: ""
    override fun onNfcBack(intent: Intent) {
        // 处理NFC读取结果
@@ -132,81 +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) {
    postCardData(cardType, cardAddr, remark, null)
}
/**
 * 提交数据 - 带区域号的版本
 */
fun postCardData(cardType: String, cardAddr: String, remark: String, regionNumber: 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)
    }
    // 如果是区域表号卡并且有区域号,添加到请求参数中
    if (cardType == CardCommon.REGION_CARD && !regionNumber.isNullOrEmpty()) {
        map["regionNumber"] = regionNumber
    }
    // 使用正确的类型参数
    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)
                        if (cardType == CardCommon.REGION_CARD && !regionNumber.isNullOrEmpty()) {
                            putExtra("regionNumber", regionNumber)
                        }
    /**
     * 提交数据 - 完整版本,支持区域号和项目号
     */
    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 ?: "未知错误"}")
            }
        }
    )
        )
}
    }
}