From dd2562d8dc2b01bcdfca3152f82f09efbbd09259 Mon Sep 17 00:00:00 2001
From: zuoxiao <lf_zuo@163.com>
Date: 星期三, 25 六月 2025 19:49:48 +0800
Subject: [PATCH] fix(generallibrary): 优化卡片处理和支付方式获取逻辑- 修复地区卡处理逻辑,增加对"00"类型卡的特殊处理 - 优化用户卡数据解析和显示逻辑,提高容错性 - 改进支付方式获取方法,增加错误处理和日志记录 -调整充值接口调用参数,确保正确传递当前余额等信息- 修复 AreaCard 中 areaNumber 类型,改为字符串处理

---
 generallibrary/src/main/java/com/dayu/general/activity/ManagerReadActivity.kt |  315 ++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 257 insertions(+), 58 deletions(-)

diff --git a/generallibrary/src/main/java/com/dayu/general/activity/ManagerReadActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/ManagerReadActivity.kt
index 1c218d7..a58bf9a 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/ManagerReadActivity.kt
+++ b/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)
     }
-    // 浣跨敤姝g‘鐨勭被鍨嬪弬鏁�
-    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"
+
+        // 浣跨敤姝g‘鐨勭被鍨嬪弬鏁�
+        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 ?: "鏈煡閿欒"}")
-            }
-        }
-    )
+        )
 
 
-}
+    }
 
 
 }
\ No newline at end of file

--
Gitblit v1.8.0