From dd0f9e5f533d868d68c5fc343a44356b537b3988 Mon Sep 17 00:00:00 2001
From: zuojincheng <lf_zuo@163.com>
Date: 星期五, 06 六月 2025 15:36:45 +0800
Subject: [PATCH] feat(nfc): 新增用户卡写入功能并优化开卡流程

---
 generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt         |   88 ++++++------
 generallibrary/src/main/java/com/dayu/general/tool/NfcWreatHelper.kt               |   42 ++++++
 generallibrary/src/main/java/com/dayu/general/utils/DateUtils.kt                   |   30 ++++
 generallibrary/src/main/java/com/dayu/general/bean/net/NewCardInfo.kt              |   32 ++++
 generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt                |    4 
 generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt         |   16 ++
 generallibrary/src/main/java/com/dayu/general/bean/net/NewCardResult.kt            |   10 +
 baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java |  137 +++++++++++++++----
 generallibrary/src/main/java/com/dayu/general/bean/db/CardRegistrationBean.kt      |    2 
 baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java      |   26 +++
 10 files changed, 304 insertions(+), 83 deletions(-)

diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java
index ba9a494..1d89f03 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java
@@ -25,7 +25,6 @@
 
     private static NativeNfcWriteHelper helper;
 
-
     public void setIntent(Intent intent) {
         this.tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
     }
@@ -44,7 +43,6 @@
         return helper;
     }
 
-
     /**
      * 鍐欏崱
      *
@@ -59,15 +57,15 @@
                 MifareClassic mfc = MifareClassic.get(tag);
                 if (null != mfc) {
                     try {
-                        //杩炴帴NFC
+                        // 杩炴帴NFC
                         mfc.connect();
-                        //楠岃瘉鎵囧尯瀵嗙爜
+                        // 楠岃瘉鎵囧尯瀵嗙爜
                         boolean isOpen = false;
                         for (int i = 0; i < listKeyA.size(); i++) {
                             if (mfc.authenticateSectorWithKeyA(a, listKeyA.get(i))) {
                                 isOpen = true;
                                 if (listKeyA.get(i).equals(defauleKey)) {
-                                    //褰撳墠涓洪粯璁ょ櫧鍗″瘑鐮佹椂鍐欏崱鏃朵慨鏀瑰瘑鐮�
+                                    // 褰撳墠涓洪粯璁ょ櫧鍗″瘑鐮佹椂鍐欏崱鏃朵慨鏀瑰瘑鐮�
                                     changePasword(a, mfc);
                                 }
                                 break;
@@ -84,7 +82,7 @@
                                     data = userCard.getTwoBytes();
                                 }
                                 int bIndex = mfc.sectorToBlock(a);
-                                //鍐欏崱
+                                // 鍐欏崱
                                 mfc.writeBlock(bIndex + b, data);
                             }
                             return true;
@@ -109,6 +107,85 @@
         return false;
     }
 
+    /**
+     * 鍐欏崱锛堝甫鍥炶皟锛�
+     *
+     * @param userCard 鐢ㄦ埛鍗″唴瀹�
+     * @param sector   鎵囧尯
+     * @param callBack 鍥炶皟鎺ュ彛
+     */
+    public boolean writeUserData(BaseUserCardCard userCard, int sector, NFCCallBack callBack) {
+        if (userCard != null) {
+            int a = sector;
+            try {
+                MifareClassic mfc = MifareClassic.get(tag);
+                if (null != mfc) {
+                    try {
+                        // 杩炴帴NFC
+                        mfc.connect();
+                        // 楠岃瘉鎵囧尯瀵嗙爜
+                        boolean isOpen = false;
+                        for (int i = 0; i < listKeyA.size(); i++) {
+                            if (mfc.authenticateSectorWithKeyA(a, listKeyA.get(i))) {
+                                isOpen = true;
+                                if (listKeyA.get(i).equals(defauleKey)) {
+                                    // 褰撳墠涓洪粯璁ょ櫧鍗″瘑鐮佹椂鍐欏崱鏃朵慨鏀瑰瘑鐮�
+                                    changePasword(a, mfc);
+                                }
+                                break;
+                            }
+                        }
+                        if (isOpen) {
+                            for (int b = 0; b < 3; b++) {
+                                byte[] data;
+                                if (b == 0) {
+                                    data = userCard.getZeroBytes();
+                                } else if (b == 1) {
+                                    data = userCard.getOneBytes();
+                                } else {
+                                    data = userCard.getTwoBytes();
+                                }
+                                int bIndex = mfc.sectorToBlock(a);
+                                // 鍐欏崱
+                                mfc.writeBlock(bIndex + b, data);
+                            }
+                            if (callBack != null) {
+                                callBack.isSusses(true, "鐢ㄦ埛鏁版嵁鍐欏叆鎴愬姛");
+                            }
+                            return true;
+                        }
+                        if (callBack != null) {
+                            callBack.isSusses(false, "鎵囧尯" + a + "瀵嗙爜楠岃瘉澶辫触");
+                        }
+                        return false;
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        if (callBack != null) {
+                            callBack.isSusses(false, "鎵囧尯" + a + "鍐欏崱寮傚父: " + e.getMessage());
+                        }
+                        return false;
+                    } finally {
+                        try {
+                            mfc.close();
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                if (callBack != null) {
+                    callBack.isSusses(false, "鍐欏崱寮傚父: " + e.getMessage());
+                }
+                return false;
+            }
+        } else {
+            if (callBack != null) {
+                callBack.isSusses(false, "鐢ㄦ埛鍗℃暟鎹负绌�");
+            }
+        }
+        return false;
+    }
 
     /**
      * 鍐欏崱
@@ -136,36 +213,36 @@
                 MifareClassic mfc = MifareClassic.get(tag);
                 if (null != mfc) {
                     try {
-                        //杩炴帴NFC
+                        // 杩炴帴NFC
                         if (isConnect) {
                             mfc.connect();
                         }
-                        //鑾峰彇鎵囧尯鏁伴噺
+                        // 鑾峰彇鎵囧尯鏁伴噺
                         int count = mfc.getSectorCount();
-                        //濡傛灉浼犺繘鏉ョ殑鎵囧尯澶т簡鎴栬�呭皬浜嗙洿鎺ラ��鍑烘柟娉�
+                        // 濡傛灉浼犺繘鏉ョ殑鎵囧尯澶т簡鎴栬�呭皬浜嗙洿鎺ラ��鍑烘柟娉�
                         if (a > count - 1 || a < 0) {
                             if (callBack != null) {
                                 callBack.isSusses(false, "鎵囧尯閿欒--" + a);
                             }
                             return false;
                         }
-                        //鑾峰彇鍐欑殑鎵囧尯鐨勫潡鐨勬暟閲�
+                        // 鑾峰彇鍐欑殑鎵囧尯鐨勫潡鐨勬暟閲�
                         int bCount = mfc.getBlockCountInSector(a);
-                        //濡傛灉杈撳叆鐨勫潡澶т簡鎴栬�呭皬浜嗕篃鏄洿鎺ラ��鍑�
+                        // 濡傛灉杈撳叆鐨勫潡澶т簡鎴栬�呭皬浜嗕篃鏄洿鎺ラ��鍑�
                         if (b > bCount - 1 || b < 0) {
                             if (callBack != null) {
                                 callBack.isSusses(false, "鍧楀尯閿欒--" + b);
                             }
                             return false;
                         }
-                        //楠岃瘉鎵囧尯瀵嗙爜
+                        // 楠岃瘉鎵囧尯瀵嗙爜
                         boolean isOpen = false;
                         if (listKeyA.size() != 0) {
                             for (int i = 0; i < listKeyA.size(); i++) {
                                 if (mfc.authenticateSectorWithKeyA(0, listKeyA.get(i))) {
                                     isOpen = true;
                                     if (listKeyA.get(i).equals(defauleKey)) {
-                                        //褰撳墠涓洪粯璁ょ櫧鍗″瘑鐮佹椂鍐欏崱鏃朵慨鏀瑰瘑鐮�
+                                        // 褰撳墠涓洪粯璁ょ櫧鍗″瘑鐮佹椂鍐欏崱鏃朵慨鏀瑰瘑鐮�
                                         changePasword(a, mfc);
                                     }
                                     break;
@@ -181,7 +258,7 @@
                         }
                         if (isOpen) {
                             int bIndex = mfc.sectorToBlock(a);
-                            //鍐欏崱
+                            // 鍐欏崱
                             mfc.writeBlock(bIndex + b, str);
                             // 鏍¢獙鍐欏叆鏁版嵁鏄惁姝g‘
                             boolean isVerified = true;
@@ -246,16 +323,15 @@
         return false;
     }
 
-
     /**
      * 淇敼瀵嗙爜
      *
-     * @param         涔﹀啓鐨勬墖鍖�
+     * @param 涔﹀啓鐨勬墖鍖�
      * @param passWord 瀵嗙爜
      * @return
      */
-    public boolean changePasword( List<byte[]> passWord, boolean isConnect, boolean isClose, NFCCallBack callBack) {
-        if (passWord == null || passWord.size()!=16) {
+    public boolean changePasword(List<byte[]> passWord, boolean isConnect, boolean isClose, NFCCallBack callBack) {
+        if (passWord == null || passWord.size() != 16) {
             if (callBack != null) {
                 callBack.isSusses(false, "瀵嗙爜鏁扮粍涓虹┖鎴栭暱搴︿笉涓�16");
             }
@@ -276,7 +352,7 @@
                     mfc.connect();
                 }
                 for (int i = 0; i < passWord.size(); i++) {
-                    byte [] passWordItem = passWord.get(i);
+                    byte[] passWordItem = passWord.get(i);
                     // 楠岃瘉鎵囧尯瀵嗙爜
                     boolean isAuthenticated = false;
 
@@ -358,7 +434,7 @@
     /**
      * 淇敼瀵嗙爜
      *
-     * @param a  鎵囧尯
+     * @param a   鎵囧尯
      * @param mfc MifareClassic瀹炰緥
      * @return
      */
@@ -367,24 +443,24 @@
         byte[] data = new byte[16];
         if (null != mfc) {
             try {
-                //灏嗗瘑鐮佽浆鎹负keyA
+                // 灏嗗瘑鐮佽浆鎹负keyA
                 byte[] dataA = HexUtil.hexToByteArray(companyKeyA);
                 for (int i = 0; i < dataA.length; i++) {
                     data[i] = dataA[i];
                 }
-                //杈撳叆鎺у埗浣�
+                // 杈撳叆鎺у埗浣�
                 data[6] = (byte) 0xFF;
                 data[7] = (byte) 0x07;
                 data[8] = (byte) 0x80;
                 data[9] = (byte) 0x69;
                 byte[] dataB = HexUtil.hexToByteArray(companyKeyB);
-                //灏嗗瘑鐮佽浆鎹负KeyB
+                // 灏嗗瘑鐮佽浆鎹负KeyB
                 for (int i = 0; i < dataB.length; i++) {
                     data[i + 10] = dataB[i];
                 }
                 int bIndex = mfc.sectorToBlock(a);
                 int bCount = mfc.getBlockCountInSector(a);
-                //鍐欏埌鎵囧尯鐨勬渶鍚庝竴涓潡
+                // 鍐欏埌鎵囧尯鐨勬渶鍚庝竴涓潡
                 mfc.writeBlock(bIndex + bCount - 1, data);
 
                 return true;
@@ -399,8 +475,6 @@
         return false;
     }
 
-
-
     /**
      * 鍒濆鍖栧崱
      *
@@ -412,15 +486,15 @@
             MifareClassic mfc = MifareClassic.get(tag);
             if (null != mfc) {
                 try {
-                    //杩炴帴NFC
+                    // 杩炴帴NFC
                     mfc.connect();
-                    //鑾峰彇鎵囧尯鏁伴噺
+                    // 鑾峰彇鎵囧尯鏁伴噺
                     int count = mfc.getSectorCount();
                     byte[] data = new byte[16];
                     String initData = "FFFFFFFFFFFFFF078069FFFFFFFFFFFF";
                     byte[] initDataBytes = HexUtil.hexToByteArray(initData);
                     for (int sector = 0; sector < count; sector++) {
-                        //楠岃瘉鎵囧尯瀵嗙爜
+                        // 楠岃瘉鎵囧尯瀵嗙爜
                         boolean isOpen = false;
                         for (int i = 0; i < listKeyA.size(); i++) {
                             if (mfc.authenticateSectorWithKeyA(sector, listKeyA.get(i))) {
@@ -429,7 +503,7 @@
                             }
                         }
                         if (isOpen) {
-                            //鑾峰彇鍐欑殑鎵囧尯鐨勫潡鐨勬暟閲�
+                            // 鑾峰彇鍐欑殑鎵囧尯鐨勫潡鐨勬暟閲�
                             int blockCount = mfc.getBlockCountInSector(sector);
                             int blockIndex = mfc.sectorToBlock(sector);
                             for (int block = 0; block < blockCount; block++) {
@@ -444,7 +518,7 @@
                                 } else {
                                     mfc.writeBlock(blockIndex, initDataBytes);
                                 }
-                                //鍐欏崱
+                                // 鍐欏崱
                                 blockIndex++;
                             }
                         }
@@ -467,6 +541,5 @@
         }
         return false;
     }
-
 
 }
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java
index 14e1e19..afee1df 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java
@@ -33,11 +33,27 @@
     }
 
     @Override
-    public boolean writeUserData(BaseUserCardCard userCard,int sector) {
+    public boolean writeUserData(BaseUserCardCard userCard, int sector) {
         switch (BaseNfcActivity.adapterType) {
             case ModelUtils.defaultType:
                 return nativeNfcWriteHelper.writeUserData(userCard, sector);
 
+        }
+        return false;
+    }
+
+    /**
+     * 鍐欑敤鎴锋暟鎹紙甯﹀洖璋冿級
+     *
+     * @param userCard 鐢ㄦ埛鍗℃暟鎹�
+     * @param sector   鎵囧尯
+     * @param callBack 鍥炶皟鎺ュ彛
+     * @return 鏄惁鎴愬姛
+     */
+    public boolean writeUserData(BaseUserCardCard userCard, int sector, NFCCallBack callBack) {
+        switch (BaseNfcActivity.adapterType) {
+            case ModelUtils.defaultType:
+                return nativeNfcWriteHelper.writeUserData(userCard, sector, callBack);
         }
         return false;
     }
@@ -56,7 +72,7 @@
     public boolean writeData(byte[] str, int a, int b, NFCCallBack callBack) {
         switch (BaseNfcActivity.adapterType) {
             case ModelUtils.defaultType:
-                return nativeNfcWriteHelper.writeData(str, a, b,callBack);
+                return nativeNfcWriteHelper.writeData(str, a, b, callBack);
 
         }
         return false;
@@ -66,7 +82,7 @@
     public boolean writeData(byte[] str, int a, int b, boolean isConnect, NFCCallBack callBack) {
         switch (BaseNfcActivity.adapterType) {
             case ModelUtils.defaultType:
-                return nativeNfcWriteHelper.writeData(str, a, b,isConnect,callBack);
+                return nativeNfcWriteHelper.writeData(str, a, b, isConnect, callBack);
 
         }
         return false;
@@ -82,10 +98,10 @@
         return false;
     }
 
-    public boolean changePasword( List<byte[]> passWord, boolean isConnect, boolean isClose, NFCCallBack callBack) {
+    public boolean changePasword(List<byte[]> passWord, boolean isConnect, boolean isClose, NFCCallBack callBack) {
         switch (BaseNfcActivity.adapterType) {
             case ModelUtils.defaultType:
-                return nativeNfcWriteHelper.changePasword(passWord,isConnect, isClose,callBack);
+                return nativeNfcWriteHelper.changePasword(passWord, isConnect, isClose, callBack);
         }
         return false;
     }
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt b/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
index 57e331a..8fe770b 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
@@ -13,15 +13,23 @@
 import com.dayu.baselibrary.view.TitleBar.ClickType_LEFT_IMAGE
 import com.dayu.general.BaseApplication
 import com.dayu.general.R
+import com.dayu.general.bean.card.UserCard
 import com.dayu.general.bean.db.CardRegistrationBean
+import com.dayu.general.bean.net.ClientInfo
+import com.dayu.general.bean.net.NewCardDataResult
+import com.dayu.general.bean.net.PaymentMethod
+import com.dayu.general.bean.net.PaymentMethodResponse
 import com.dayu.general.dao.BaseDaoSingleton
 import com.dayu.general.databinding.ActivityNewCardGeBinding
 import com.dayu.general.net.ApiManager
 import com.dayu.general.net.BaseResponse
+import com.dayu.general.tool.CardCommon.Companion.USER_CARD_TYPE_1
 import com.dayu.general.tool.NfcReadHelper
 import com.dayu.general.tool.NfcWreatHelper
+import com.dayu.general.utils.DateUtils
 import com.tencent.bugly.crashreport.CrashReport
 import kotlinx.coroutines.launch
+import java.util.Calendar
 
 /**
  * Description: 鐢ㄦ埛寮�鍗$晫闈�(鍚屾淇敼鐧藉崱瀵嗙爜)
@@ -50,43 +58,17 @@
     // 瀹㈡埛ID
     private var clientId: String = ""
 
+    private lateinit var clientInfo : ClientInfo
+
     // 鏄惁宸茶鍗�
     private var isReadCard: Boolean = false
+
+    private var orderId:String=""
 
     companion object {
         private const val TAG = "NewCard2Activity"
     }
 
-    // 鏀粯鏂瑰紡鏁版嵁绫�
-    data class PaymentMethod(
-        val id: Long,
-        val name: String,
-        val remarks: String,
-        val deleted: Int
-    )
-
-    // 鏀粯鏂瑰紡鎺ュ彛杩斿洖鏁版嵁绫�
-    data class PaymentMethodResponse(
-        val itemTotal: Any?,
-        val obj: List<PaymentMethod>,
-        val pageCurr: Any?,
-        val pageSize: Any?,
-        val pageTotal: Any?
-    )
-
-    // 鐢ㄦ埛淇℃伅鏁版嵁绫�
-    data class ClientInfo(
-        val clientId: String,
-        val clientNum: String,
-        val name: String,
-        val districtNum: String,
-        val phone: String,
-        val idCard: String,
-        val villageName: String,
-        val address: String,
-        val cardCount: Int,
-        val operateDt: String
-    )
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
@@ -134,7 +116,7 @@
             object : SubscriberListener<BaseResponse<ClientInfo>>() {
                 override fun onNext(response: BaseResponse<ClientInfo>) {
                     if (response.success) {
-                        val clientInfo = response.content
+                        clientInfo = response.content!!
                         if (clientInfo != null) {
                             // 鏄剧ず瀹㈡埛淇℃伅鍒扮晫闈�
                             displayClientInfo(clientInfo)
@@ -337,47 +319,69 @@
         // 鏋勫缓璇锋眰鍙傛暟
         val params = HashMap<String, Any>()
         params["cardAddr"] = cardPhysicalId // 姘村崱鍦板潃锛堢墿鐞咺D锛�
-        params["clientNum"] = binding.newCardFarmerCode.text.toString() // 鍐滄埛缂栧彿
-        params["cardCost"] = (cardFee * 100).toInt() // 璐崱閲戦锛堝伐鏈垂锛夎浆涓哄垎
-        params["amount"] = (rechargeAmount * 100).toInt() // 鍏呭�奸噾棰濊浆涓哄垎
+        params["clientId"] = clientId // 鍐滄埛ID
+        params["cardCost"] = cardFee  // 璐崱閲戦锛堝伐鏈垂锛�(鍏�)
+        params["amount"] = rechargeAmount  // 鍏呭�奸噾棰�(鍏�)
         params["paymentId"] = paymentId // 鏀粯鏂瑰紡ID
         params["remarks"] = remark // 澶囨敞
+        params["protocol"] = "p206V1_0_1" // 鍗忚
         params["operator"] = BaseApplication.userId // 鎿嶄綔浜篒D
 
         // 鎵ц鍗$墖婵�娲籄PI璇锋眰
         ApiManager.getInstance().requestPostLoading(
             this,
-            "sell/card/active",
-            String::class.java,
+            "terminal/card/termActiveCard",
+            NewCardDataResult::class.java,
             params,
-            object : SubscriberListener<BaseResponse<String>>() {
-                override fun onNext(response: BaseResponse<String>) {
+            object : SubscriberListener<BaseResponse<NewCardDataResult>>() {
+                override fun onNext(response: BaseResponse<NewCardDataResult>) {
                     if (response.success) {
+                        orderId=response.content?.orderNo.toString()
                         // 淇濆瓨寮�鍗′俊鎭埌鏁版嵁搴�
                         val cardRegistration = CardRegistrationBean(
                             cardNumber = cardPhysicalId,
                             userName = binding.newCardUserName.text.toString(),
                             idCard = binding.newCardIdCard.text.toString(),
-                            farmerCode = binding.newCardFarmerCode.text.toString(),
+                            clientId = clientId,
                             cardFee = cardFee,
                             remark = binding.newCardRemark.text.toString(),
                             paymentMethod = paymentId.toInt(),
                             isReported = true,
-                            isCardWritten = true
-                        )
+                            isCardWritten = true,
+                            operatorId = orderId,
+
+                            )
 
                         // 浣跨敤鍗忕▼鍦ㄥ悗鍙扮嚎绋嬩腑淇濆瓨鏁版嵁
                         lifecycleScope.launch {
                             try {
                                 BaseDaoSingleton.getInstance(this@NewCard2Activity)
                                     .cardRegistrationDao().insert(cardRegistration)
+
                                 Toast.makeText(
                                     this@NewCard2Activity,
                                     "寮�鍗℃垚鍔�",
                                     Toast.LENGTH_SHORT
                                 ).show()
                                 setResult(RESULT_OK)
-                                finish()
+                                Intent(this@NewCard2Activity, NfcWreatActivity::class.java).apply {
+                                    putExtra("cardType", USER_CARD_TYPE_1)
+                                    putExtra("orderId", orderId)
+                                    putExtra("cardAddr", cardPhysicalId)
+                                    var userCard = UserCard()
+                                    userCard.areaNumber =clientInfo.districtNum
+                                    userCard.userCode =clientInfo.clientNum
+                                    userCard.phoneNumber =clientInfo.phone
+                                    userCard.userCodeNumber = response.content?.cardNum?.toInt()!!
+                                    userCard.projectCode = response.content?.projectNo?.toInt()!!
+                                    userCard.balance = response.content?.balance?.toInt()!!
+//                                    userCard.surplusWater = response.content?.surplusWater?.toInt()!!
+                                    userCard.waterPrice = response.content?.waterPrice?.toFloat()!!
+//                                    userCard.electricPrice = response.content?.electricPrice?.toFloat()!!
+                                    userCard.rechargeDate = DateUtils.parseStringToCalendar(response.content?.time)
+                                    putExtra("userCard", userCard)
+                                    startActivity(this)
+                                }
                             } catch (e: Exception) {
                                 CrashReport.postCatchedException(e)
                                 Toast.makeText(
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
index 8b61caa..f8f55a4 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
@@ -1,10 +1,11 @@
-    package com.dayu.general.activity
+package com.dayu.general.activity
 
 import android.content.Intent
 import android.os.Bundle
 import com.dayu.baselibrary.net.subscribers.SubscriberListener
 import com.dayu.baselibrary.utils.ToastUtil
 import com.dayu.general.bean.card.ClearCard
+import com.dayu.general.bean.card.UserCard
 import com.dayu.general.tool.CardCommon
 import com.dayu.general.databinding.ActivityNfcWriteGeBinding
 import com.dayu.general.net.ApiManager
@@ -22,6 +23,7 @@
     var cardType = ""
     var orderId = ""
     var cardAddr = ""
+    private lateinit var userCard: UserCard
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
@@ -37,6 +39,12 @@
         cardType = intent?.getStringExtra("cardType") ?: ""
         orderId = intent?.getStringExtra("orderId") ?: ""
         cardAddr = intent?.getStringExtra("cardAddr") ?: ""
+        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) {
+            userCard = intent?.getSerializableExtra("userCard", UserCard::class.java)!!
+        } else {
+            userCard = (intent?.getSerializableExtra("userCard") as? UserCard)!!
+        }
+
         if (cardType.isNotEmpty()) {
             when (cardType) {
                 CardCommon.CLEAN_CARD_TYPE -> {
@@ -68,6 +76,12 @@
                         }
                     }
                 }
+
+                CardCommon.USER_CARD_TYPE_1 -> {
+                    binding?.cardData?.text = "鍐欑敤鎴峰崱"
+                    nfcWreatHelper.writeUserData(userCard)
+
+                }
             }
         } else {
             ToastUtil.show("鍗$墖閿欒锛屽綋鍓嶅埛鐨勫崱涓庡垰鍒氱殑鍗′笉涓�鑷�")
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 9436dd7..7d16b06 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
@@ -12,7 +12,7 @@
  */
 class UserCard : BaseUserCardCard(), Serializable {
     var cardType: String = USER_CARD_TYPE_1 // 鍗$被鍨嬶細A1缁堢鍐欏崱 A8鍒峰崱寮�娉靛悗鍊� A2鍙犲姞鍏呭��
-    var areaNumber: Int = 0 // 鍥藉琛屾斂鍖哄煙鍙�(12浣岯CD,绮剧‘鍒版潙)
+    var areaNumber: String = "" // 鍥藉琛屾斂鍖哄煙鍙�(12浣岯CD,绮剧‘鍒版潙)
     var userCode: String = "" // 鐢ㄦ埛缂栧彿BCD
     var userCodeNumber: Int = 0 // 鐢ㄦ埛鍗$紪鍙�(HEX)
     var phoneNumber: String = "" // 鎵嬫満鍙�(BCD)
@@ -55,7 +55,7 @@
             userCard.apply {
                 // 瑙f瀽鍥藉琛屾斂鍖哄煙鍙�(0-5浣�)
                 val areaCodeBytes = zero.copyOfRange(0, 6)
-                areaNumber = BcdUtil.bcdToStr(areaCodeBytes).toInt()
+                areaNumber = BcdUtil.bcdToStr(areaCodeBytes)
 
                 // 瑙f瀽鐢ㄦ埛鍗$紪鍙�(6-7浣�)
                 val userCodeNumberBytes = zero.copyOfRange(6, 8)
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/db/CardRegistrationBean.kt b/generallibrary/src/main/java/com/dayu/general/bean/db/CardRegistrationBean.kt
index 7e2f26f..9cfdc91 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/db/CardRegistrationBean.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/db/CardRegistrationBean.kt
@@ -10,7 +10,7 @@
     val cardNumber: String, // IC鍗″崱鍙�
     val userName: String, // 濮撳悕
     val idCard: String, // 韬唤璇佸彿
-    val farmerCode: String, // 鍐滄埛缂栧彿
+    val clientId: String, // 鍐滄埛Id
     val cardFee: Double, // 宸ユ湰璐�
     val remark: String, // 澶囨敞
     val paymentMethod: Int, // 鏀粯鏂瑰紡
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/net/NewCardInfo.kt b/generallibrary/src/main/java/com/dayu/general/bean/net/NewCardInfo.kt
new file mode 100644
index 0000000..1d486fc
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/net/NewCardInfo.kt
@@ -0,0 +1,32 @@
+package com.dayu.general.bean.net
+
+// 鏀粯鏂瑰紡鏁版嵁绫�
+data class PaymentMethod(
+    val id: Long,
+    val name: String,
+    val remarks: String,
+    val deleted: Int
+)
+
+// 鏀粯鏂瑰紡鎺ュ彛杩斿洖鏁版嵁绫�
+data class PaymentMethodResponse(
+    val itemTotal: Any?,
+    val obj: List<PaymentMethod>,
+    val pageCurr: Any?,
+    val pageSize: Any?,
+    val pageTotal: Any?
+)
+
+// 鐢ㄦ埛淇℃伅鏁版嵁绫�
+data class ClientInfo(
+    val clientId: String,
+    val clientNum: String,
+    val name: String,
+    val districtNum: String,
+    val phone: String,
+    val idCard: String,
+    val villageName: String,
+    val address: String,
+    val cardCount: Int,
+    val operateDt: String
+)
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/net/NewCardResult.kt b/generallibrary/src/main/java/com/dayu/general/bean/net/NewCardResult.kt
new file mode 100644
index 0000000..8b36f14
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/net/NewCardResult.kt
@@ -0,0 +1,10 @@
+package com.dayu.general.bean.net
+
+data class NewCardDataResult(
+    var projectNo: String,
+    var cardNum: String,
+    var balance: String,
+    var waterPrice: String,
+    var time: String,
+    var orderNo: String
+)
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/tool/NfcWreatHelper.kt b/generallibrary/src/main/java/com/dayu/general/tool/NfcWreatHelper.kt
index 65fd920..d224bbf 100644
--- a/generallibrary/src/main/java/com/dayu/general/tool/NfcWreatHelper.kt
+++ b/generallibrary/src/main/java/com/dayu/general/tool/NfcWreatHelper.kt
@@ -146,6 +146,32 @@
     }
 
     /**
+     * 鍐欏崱(寮傛)
+     *
+     * @param userCard 鐢ㄦ埛鍗″唴瀹�
+     * @param callBack 鎿嶄綔缁撴灉鍜屾秷鎭洖璋�
+     */
+    fun writeUserDataAsync(userCard: UserCard, callBack: NFCCallBack): Disposable {
+        showLoading()
+        val disposable = Observable.fromCallable {
+            writeUserData(userCard, callBack)
+        }
+        .subscribeOn(Schedulers.io())
+        .observeOn(AndroidSchedulers.mainThread())
+        .subscribe({ result ->
+            hideLoading()
+            // 缁撴灉宸茬粡鍦╳riteUserData涓�氳繃callBack鍥炶皟浜�
+        }, { error ->
+            hideLoading()
+            error.printStackTrace()
+            callBack.isSusses(false, "寮傛鍐欏崱寮傚父: ${error.message}")
+        })
+        
+        compositeDisposable.add(disposable)
+        return disposable
+    }
+
+    /**
      * 鍐欏崱
      *
      * @param userCard 鐢ㄦ埛鍗″唴瀹�
@@ -161,6 +187,22 @@
     }
 
     /**
+     * 鍐欏崱
+     *
+     * @param userCard 鐢ㄦ埛鍗″唴瀹�
+     * @param callBack 鍥炶皟鎺ュ彛
+     */
+    fun writeUserData(userCard: UserCard, callBack: NFCCallBack): Boolean {
+        try {
+            return adapter.writeUserData(userCard, 7, callBack)
+        } catch (e: java.lang.Exception) {
+            e.printStackTrace()
+            callBack.isSusses(false, "鍐欏崱寮傚父: ${e.message}")
+        }
+        return false
+    }
+
+    /**
      * 淇敼瀵嗙爜(寮傛)
      *
      * @param ps 瀵嗙爜鍒楄〃
diff --git a/generallibrary/src/main/java/com/dayu/general/utils/DateUtils.kt b/generallibrary/src/main/java/com/dayu/general/utils/DateUtils.kt
new file mode 100644
index 0000000..7360c9b
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/utils/DateUtils.kt
@@ -0,0 +1,30 @@
+package com.dayu.general.utils
+
+import java.text.SimpleDateFormat
+import java.util.Calendar
+import java.util.Locale
+
+object DateUtils {
+
+    private const val DATE_PATTERN = "yyyy-MM-dd HH:mm:ss"
+    private val sdf by lazy { SimpleDateFormat(DATE_PATTERN, Locale.getDefault()) }
+
+    /**
+     * 灏嗗瓧绗︿覆杞崲涓� Calendar 瀵硅薄
+     * @param dateStr 鏃堕棿瀛楃涓诧紝鏍煎紡锛歽yyy-MM-dd HH:mm:ss
+     * @return 瑙f瀽鍚庣殑 Calendar 瀵硅薄锛屽け璐ヨ繑鍥� null
+     */
+    fun parseStringToCalendar(dateStr: String?): Calendar? {
+        if (dateStr.isNullOrEmpty()) return null
+        return try {
+            val date = sdf.parse(dateStr)
+            val calendar = Calendar.getInstance()
+            calendar.time = date ?: return null
+            calendar
+        } catch (e: Exception) {
+            e.printStackTrace()
+            null
+        }
+    }
+
+}
\ No newline at end of file

--
Gitblit v1.8.0