From d773ab0295feba24ae4fc14f61e8aa310e40f4ba Mon Sep 17 00:00:00 2001
From: zuojincheng <lf_zuo@163.com>
Date: 星期五, 06 六月 2025 16:55:57 +0800
Subject: [PATCH] refactor(nfc): 优化写卡流程和状态更新

---
 generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt |  249 +++++++++++++++++++++++++++++++++++--------------
 1 files changed, 179 insertions(+), 70 deletions(-)

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 2ebe743..9b7c268 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
@@ -4,25 +4,32 @@
 import android.os.Bundle
 import android.text.Editable
 import android.text.TextWatcher
+import android.util.TypedValue
 import android.view.View
 import android.widget.RadioButton
 import android.widget.Toast
 import androidx.lifecycle.lifecycleScope
 import com.dayu.baselibrary.net.subscribers.SubscriberListener
-import com.dayu.baselibrary.tools.nfc.NFCCallBack
 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.ActivityNewCard1GeBinding
+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 android.util.TypedValue
+import java.util.Calendar
 
 /**
  * Description: 鐢ㄦ埛寮�鍗$晫闈�(鍚屾淇敼鐧藉崱瀵嗙爜)
@@ -31,11 +38,11 @@
  */
 class NewCard2Activity : BaseNfcActivity() {
 
-    private lateinit var binding: ActivityNewCard1GeBinding
+    private lateinit var binding: ActivityNewCardGeBinding
 
     // 鏀粯鏂瑰紡
     private var paymentMethod: String = "鐜伴噾"
-    
+
     // 鏀粯鏂瑰紡ID
     private var paymentId: Long = 0
 
@@ -48,38 +55,40 @@
     // 鐢ㄦ埛ID
     private var userId: String = ""
 
+    // 瀹㈡埛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?
-    )
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
-        binding = ActivityNewCard1GeBinding.inflate(layoutInflater)
+        binding = ActivityNewCardGeBinding.inflate(layoutInflater)
         setContentView(binding.root)
 
+        // 鑾峰彇浼犻�掔殑clientId鍙傛暟
+        clientId = intent.getStringExtra("clientId") ?: ""
+
         initView()
+
+        // 濡傛灉鏈塩lientId锛岃幏鍙栧鎴蜂俊鎭�
+        if (clientId.isNotEmpty()) {
+            getClientInfo(clientId)
+        }
+
         // 鑾峰彇鏀粯鏂瑰紡
         getPaymentMethods()
         initListener()
     }
-
 
     private fun initView() {
         // 鍒濆鍖栨爣棰樻爮杩斿洖鎸夐挳
@@ -90,21 +99,66 @@
         // 鍒濆鍖朜FC璇诲崱瀹瑰櫒锛屽垵濮嬮殣钘�
         binding.nfcContainer.visibility = View.VISIBLE
 
-        // 浠嶪ntent涓幏鍙栫敤鎴蜂俊鎭紙濡傛灉鏈夛級
-        val userName = intent.getStringExtra("userName") ?: ""
-        val rawIdCard = intent.getStringExtra("idCard")
-        val idCard = if (rawIdCard.isNullOrBlank()) "鏃�" else rawIdCard
-        val farmerCode = intent.getStringExtra("farmerCode") ?: ""
-        userId = intent.getStringExtra("userId") ?: ""
-
-        // 璁剧疆鐢ㄦ埛淇℃伅
-        binding.newCardUserName.text = userName
-        binding.newCardIdCard.text = idCard
-        binding.newCardFarmerCode.text = farmerCode
-
         // 璁剧疆閲戦杈撳叆闄愬埗涓轰袱浣嶅皬鏁�
         binding.newCardRechargeAmount.addTextChangedListener(createDecimalTextWatcher())
         binding.newCardCardFee.addTextChangedListener(createDecimalTextWatcher())
+    }
+
+    /**
+     * 鑾峰彇瀹㈡埛璇︾粏淇℃伅
+     */
+    private fun getClientInfo(clientId: String) {
+        ApiManager.getInstance().requestGetLoading(
+            this,
+            "terminal/client/getTermOne/$clientId",
+            ClientInfo::class.java,
+            null,
+            object : SubscriberListener<BaseResponse<ClientInfo>>() {
+                override fun onNext(response: BaseResponse<ClientInfo>) {
+                    if (response.success) {
+                        clientInfo = response.content!!
+                        if (clientInfo != null) {
+                            // 鏄剧ず瀹㈡埛淇℃伅鍒扮晫闈�
+                            displayClientInfo(clientInfo)
+                        } else {
+                            Toast.makeText(
+                                this@NewCard2Activity,
+                                "鑾峰彇瀹㈡埛淇℃伅澶辫触: 杩斿洖鏁版嵁涓虹┖",
+                                Toast.LENGTH_SHORT
+                            ).show()
+                        }
+                    } else {
+                        Toast.makeText(
+                            this@NewCard2Activity,
+                            "鑾峰彇瀹㈡埛淇℃伅澶辫触: ${response.msg}",
+                            Toast.LENGTH_SHORT
+                        ).show()
+                    }
+                }
+
+                override fun onError(e: Throwable?) {
+                    super.onError(e)
+                    Toast.makeText(
+                        this@NewCard2Activity,
+                        "鑾峰彇瀹㈡埛淇℃伅澶辫触: ${e?.message ?: "缃戠粶寮傚父"}",
+                        Toast.LENGTH_SHORT
+                    ).show()
+                }
+            }
+        )
+    }
+
+    /**
+     * 鏄剧ず瀹㈡埛淇℃伅鍒扮晫闈�
+     */
+    private fun displayClientInfo(clientInfo: ClientInfo) {
+        // 淇濆瓨鐢ㄦ埛ID渚涘悗缁娇鐢�
+        userId = clientInfo.clientId
+
+        // 鏄剧ず鐢ㄦ埛鍩烘湰淇℃伅
+        binding.newCardUserName.text = clientInfo.name
+        binding.newCardIdCard.text = if (clientInfo.idCard.isBlank()) "鏃�" else clientInfo.idCard
+        binding.newCardFarmerCode.text = clientInfo.clientNum
     }
 
     /**
@@ -163,23 +217,23 @@
                 resources.getDimensionPixelSize(R.dimen.dimen_40),
                 1.0f
             )
-            
+
             // 濡傛灉涓嶆槸鏈�鍚庝竴涓寜閽紝娣诲姞鍙宠竟璺�
             if (index < paymentMethodList.size - 1) {
-                (radioButton.layoutParams as android.widget.LinearLayout.LayoutParams).rightMargin = 
+                (radioButton.layoutParams as android.widget.LinearLayout.LayoutParams).rightMargin =
                     resources.getDimensionPixelSize(R.dimen.dimen_15)
             }
-            
+
             radioButton.text = method.name
             radioButton.background = resources.getDrawable(R.drawable.radio_selector)
             radioButton.buttonDrawable = null
             radioButton.gravity = android.view.Gravity.CENTER
             radioButton.setTextColor(resources.getColorStateList(R.color.radio_button_text_color))
             radioButton.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f)
-            
+
             // 娣诲姞鍒癛adioGroup
             binding.newCardPaymentMethod.addView(radioButton)
-            
+
             // 榛樿閫変腑绗竴涓�
             if (index == 0) {
                 radioButton.isChecked = true
@@ -244,6 +298,9 @@
         }
     }
 
+    /**
+     * 娉ㄥ唽鏂板崱
+     */
     private fun registerNewCard() {
         // 鑾峰彇鍏呭�奸噾棰�
         val rechargeAmountStr = binding.newCardRechargeAmount.text.toString()
@@ -262,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 = false, // 鍒濆璁剧疆涓篺alse锛屽啓鍗℃垚鍔熷悗鍐嶆洿鏂颁负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(
@@ -348,17 +427,25 @@
     }
 
     override fun onNfcBack(intent: Intent) {
-        var cardNumber = NfcReadHelper.getInstance(intent, this).getCardNumberNoClose()
-        if (!cardNumber.isEmpty()) {
-            try {
-                // 鍒涘缓瀵嗛挜鍒楄〃鐨勫壇鏈紝閬垮厤ConcurrentModificationException
-                val keyList = ArrayList(NfcReadHelper.getInstance(intent, this).getKeyList())
+        if (!isReadCard) {
+            val cardNumber = NfcReadHelper.getInstance(intent, this).getCardNumberNoClose()
+            if (cardNumber.isNotEmpty()) {
+                try {
+                    // 鍒涘缓瀵嗛挜鍒楄〃鐨勫壇鏈紝閬垮厤ConcurrentModificationException
+                    val keyList = ArrayList(NfcReadHelper.getInstance(intent, this).getKeyList())
 
-                NfcWreatHelper.getInstance(intent, this).changePS(keyList, false, true, object :
-                    NFCCallBack {
+                    // 浣跨敤缇庡寲鐨勫姞杞藉姩鐢绘潵鏄剧ずNFC鎿嶄綔鐨勫姞杞界姸鎬�
+                    val nfcHelper = NfcWreatHelper.getInstance(intent, this)
+                    nfcHelper.setLoadingView(binding.loadingContainer, binding.nfcProgressWheel)
 
-                    override fun isSusses(flag: Boolean, msg: String?) {
-                        if (flag) {
+                    // 寮傛淇敼瀵嗙爜
+                    nfcHelper.changePSAsync(
+                        keyList,
+                        false,
+                        true
+                    ) { success: Boolean, msg: String? ->
+                        if (success) {
+                            isReadCard = true
                             // 淇濆瓨鍗$墿鐞咺D
                             cardPhysicalId = cardNumber
                             // 鏇存柊UI
@@ -371,22 +458,44 @@
                             // 瀵嗙爜淇敼澶辫触锛屽鐞嗛敊璇儏鍐�
                             Toast.makeText(
                                 this@NewCard2Activity,
-                                "鍗$墖鍒濆鍖栧け璐ワ細" + msg,
+                                "鍗$墖鍒濆鍖栧け璐ワ細$msg",
                                 Toast.LENGTH_LONG
-                            )
-                                .show()
+                            ).show()
                         }
                     }
-                })
-
-
-            } catch (e: Exception) {
-                // 澶勭悊寮傚父鎯呭喌
-                CrashReport.postCatchedException(e)
-                e.printStackTrace()
+                } catch (e: Exception) {
+                    // 澶勭悊寮傚父鎯呭喌
+                    CrashReport.postCatchedException(e)
+                    e.printStackTrace()
+                }
+            } else {
+                Toast.makeText(
+                    this@NewCard2Activity,
+                    "鑾峰彇鍗″彿澶辫触",
+                    Toast.LENGTH_SHORT
+                ).show()
             }
+        } else {
+            Toast.makeText(
+                this@NewCard2Activity,
+                "褰撳墠宸茶鍗★紝涓嶅彲鍐嶆璇诲崱",
+                Toast.LENGTH_SHORT
+            ).show()
         }
+
     }
 
+    override fun onDestroy() {
+        super.onDestroy()
+        // 娓呯悊NFC宸ュ叿绫讳腑鐨凴xJava璁㈤槄锛岄槻姝㈠唴瀛樻硠婕�
+        try {
+            NfcReadHelper.getInstance(intent, this).clearDisposables()
+            NfcWreatHelper.getInstance(intent, this).clearDisposables()
+            // 纭繚鍋滄鍔ㄧ敾锛岄伩鍏嶅唴瀛樻硠婕�
+            binding.nfcProgressWheel.stopSpinning()
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
 
 }
\ No newline at end of file

--
Gitblit v1.8.0