From 2b02b6e854a56a511588e4865ddf2c6597675329 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期一, 16 六月 2025 16:04:54 +0800
Subject: [PATCH] feat(nfc): 添加读卡功能并优化写卡流程

---
 generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt |   63 +++++++++++++++++++++----------
 1 files changed, 43 insertions(+), 20 deletions(-)

diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt
index 7d16b06..8e43c3d 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt
@@ -106,19 +106,26 @@
             val data = ByteArray(16)
             try {
                 // 璁剧疆鍥藉琛屾斂鍖哄煙鍙�(BCD鏍煎紡锛�6瀛楄妭锛�0-5浣�)
-                val areaCodeBytes = BcdUtil.strToBcd(String.format("%012d", areaNumber))
-                System.arraycopy(areaCodeBytes, 0, data, 0, 6)
+                val areaNumberStr = if (areaNumber.isBlank() || !areaNumber.all { it.isDigit() }) {
+                    "000000000000"
+                } else {
+                    areaNumber.padStart(12, '0')
+                }
+                val areaCodeBytes = BcdUtil.strToBcd(areaNumberStr)
+                System.arraycopy(areaCodeBytes, 0, data, 0, minOf(areaCodeBytes.size, 6))
 
-                // 璁剧疆鐢ㄦ埛鍗$紪鍙�(HEX鏍煎紡锛�2瀛楄妭锛�6-7浣�)
+                // 璁剧疆鐢ㄦ埛鍗$紪鍙�(HEX鏍煎紡锛�2瀛楄妭锛�6-7浣�) - 淇锛氱‘淇濇暟缁勯暱搴︽纭�
                 val userCodeBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(userCodeNumber))
-                System.arraycopy(userCodeBytes, 0, data, 6, 2)
+                val userCodePadded = ByteArray(2)
+                System.arraycopy(userCodeBytes, 0, userCodePadded, 0, minOf(userCodeBytes.size, 2))
+                System.arraycopy(userCodePadded, 0, data, 6, 2)
 
                 // 璁剧疆鍗$被鍨�(8浣�)
                 data[8] = HexUtil.hexToByte(cardType)
 
                 // 璁剧疆鎵嬫満鍙�(BCD鏍煎紡锛�6瀛楄妭锛�9-14浣�)
                 val phoneBytes = BcdUtil.strToBcd(phoneNumber.padStart(12, '0'))
-                System.arraycopy(phoneBytes, 0, data, 9, 6)
+                System.arraycopy(phoneBytes, 0, data, 9, minOf(phoneBytes.size, 6))
 
                 // 璁剧疆鏍¢獙鍜�(15浣�)
                 data[15] = getByteSum(data)
@@ -135,17 +142,25 @@
             try {
                 data[0] = projectCode.toByte()
 
-                // 璁剧疆浣欓
-                val balanceBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(balance))
-                System.arraycopy(balanceBytes, 0, data, 1, 4)
+                // 璁剧疆浣欓 - 淇锛氱‘淇濇暟缁勯暱搴︽纭�
+                val balanceHex = HexUtil.get10To16LowHigh(balance)
+                val balanceBytes = HexUtil.hexToByteArray(balanceHex)
+                val balancePadded = ByteArray(4)
+                System.arraycopy(balanceBytes, 0, balancePadded, 0, minOf(balanceBytes.size, 4))
+                System.arraycopy(balancePadded, 0, data, 1, 4)
 
-                // 璁剧疆鍓╀綑姘撮噺
-                val waterBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(surplusWater))
-                System.arraycopy(waterBytes, 0, data, 5, 4)
+                // 璁剧疆鍓╀綑姘撮噺 - 淇锛氱‘淇濇暟缁勯暱搴︽纭�
+                val waterHex = HexUtil.get10To16LowHigh(surplusWater)
+                val waterBytes = HexUtil.hexToByteArray(waterHex)
+                val waterPadded = ByteArray(4)
+                System.arraycopy(waterBytes, 0, waterPadded, 0, minOf(waterBytes.size, 4))
+                System.arraycopy(waterPadded, 0, data, 5, 4)
 
-                // 璁剧疆鐢典环
+                // 璁剧疆鐢典环 - 淇锛氱‘淇濇暟缁勯暱搴︽纭�
                 val priceBytes = HexUtil.hexToByteArray(HexUtil.floatToHexLowHigh(electricPrice))
-                System.arraycopy(priceBytes, 0, data, 9, 2)
+                val pricePadded = ByteArray(2)
+                System.arraycopy(priceBytes, 0, pricePadded, 0, minOf(priceBytes.size, 2))
+                System.arraycopy(pricePadded, 0, data, 9, 2)
 
                 // 璁剧疆鍏呭�兼椂闂�
                 rechargeDate?.let {
@@ -167,16 +182,24 @@
         fun toBytes(): ByteArray {
             val data = ByteArray(16)
             try {
-                // 澶囦唤浣欓鍜屾按閲忔暟鎹�
-                val balanceBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(balance))
-                System.arraycopy(balanceBytes, 0, data, 1, 4)
+                // 澶囦唤浣欓鍜屾按閲忔暟鎹� - 淇锛氱‘淇濇暟缁勯暱搴︽纭�
+                val balanceHex = HexUtil.get10To16LowHigh(balance)
+                val balanceBytes = HexUtil.hexToByteArray(balanceHex)
+                val balancePadded = ByteArray(4)
+                System.arraycopy(balanceBytes, 0, balancePadded, 0, minOf(balanceBytes.size, 4))
+                System.arraycopy(balancePadded, 0, data, 1, 4)
 
-                val waterBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(surplusWater))
-                System.arraycopy(waterBytes, 0, data, 5, 4)
+                val waterHex = HexUtil.get10To16LowHigh(surplusWater)
+                val waterBytes = HexUtil.hexToByteArray(waterHex)
+                val waterPadded = ByteArray(4)
+                System.arraycopy(waterBytes, 0, waterPadded, 0, minOf(waterBytes.size, 4))
+                System.arraycopy(waterPadded, 0, data, 5, 4)
 
-                // 璁剧疆姘翠环
+                // 璁剧疆姘翠环 - 淇锛氱‘淇濇暟缁勯暱搴︽纭�
                 val priceBytes = HexUtil.hexToByteArray(HexUtil.floatToHexLowHigh(waterPrice))
-                System.arraycopy(priceBytes, 0, data, 9, 2)
+                val pricePadded = ByteArray(2)
+                System.arraycopy(priceBytes, 0, pricePadded, 0, minOf(priceBytes.size, 2))
+                System.arraycopy(pricePadded, 0, data, 9, 2)
 
                 // 璁剧疆鍏呭�兼椂闂�
                 rechargeDate?.let {

--
Gitblit v1.8.0