From 98994189864f045551f7d06f78017b5df70e1be3 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期四, 19 六月 2025 11:03:52 +0800
Subject: [PATCH] feat(card): 添加补扣功能并优化卡片操作界面

---
 generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt |  219 +++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 199 insertions(+), 20 deletions(-)

diff --git a/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
index 3d1a949..65a9a42 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
@@ -3,27 +3,38 @@
 import android.content.Context
 import android.content.Intent
 import android.os.Bundle
+import android.text.Editable
+import android.text.TextWatcher
 import android.util.TypedValue
 import android.view.View
+import android.widget.EditText
 import android.widget.RadioButton
 import android.widget.Toast
 import androidx.appcompat.app.AppCompatActivity
 import com.dayu.baselibrary.net.subscribers.SubscriberListener
+import com.dayu.baselibrary.utils.MornyUtil
 import com.dayu.baselibrary.utils.ToastUtil
 import com.dayu.baselibrary.view.TitleBar
+import com.dayu.general.BaseApplication
 import com.dayu.general.R
 import com.dayu.general.bean.net.CardInfoResult
 import com.dayu.general.bean.net.PaymentMethod
 import com.dayu.general.bean.net.PaymentMethodResponse
+import com.dayu.general.bean.net.RechargeRequest
+import com.dayu.general.bean.net.RechargeResult
+import com.dayu.general.bean.card.UserCard
 import com.dayu.general.databinding.ActivityRechargeDetailBinding
 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.CardOperationType
 
 class RechargeDetailActivity : AppCompatActivity() {
 
     private lateinit var binding: ActivityRechargeDetailBinding
     private var cardInfo: CardInfoResult? = null
     private var cardAddress: String? = null
+    private var userCard: UserCard? = null
 
     // 鏀粯鏂瑰紡鐩稿叧灞炴��
     private var paymentMethod: String = "鐜伴噾"
@@ -33,11 +44,18 @@
     companion object {
         private const val EXTRA_CARD_INFO = "extra_card_info"
         private const val EXTRA_CARD_ADDRESS = "extra_card_address"
+        private const val EXTRA_USER_CARD = "extra_user_card"
 
-        fun start(context: Context, cardInfo: CardInfoResult?, cardAddress: String?) {
+        fun start(
+            context: Context,
+            cardInfo: CardInfoResult?,
+            cardAddress: String?,
+            userCard: UserCard?
+        ) {
             val intent = Intent(context, RechargeDetailActivity::class.java)
             intent.putExtra(EXTRA_CARD_INFO, cardInfo)
             intent.putExtra(EXTRA_CARD_ADDRESS, cardAddress)
+            intent.putExtra(EXTRA_USER_CARD, userCard)
             context.startActivity(intent)
         }
     }
@@ -53,11 +71,14 @@
         // 鑾峰彇浼犻�掔殑鏁版嵁
         cardInfo = intent.getSerializableExtra(EXTRA_CARD_INFO) as? CardInfoResult
         cardAddress = intent.getStringExtra(EXTRA_CARD_ADDRESS)
+        userCard = intent.getSerializableExtra(EXTRA_USER_CARD) as? UserCard
 
         initView()
         displayCardInfo()
         // 鑾峰彇鏀粯鏂瑰紡
         getPaymentMethods()
+        // 纭繚姘翠环鍙敤锛堝鏋滀负绌轰細鑷姩瑙﹀彂MainActivity鑾峰彇锛�
+        BaseApplication.requestWaterPrice()
     }
 
     private fun initView() {
@@ -68,9 +89,63 @@
 
         // 璁剧疆鎸夐挳鐐瑰嚮浜嬩欢
         binding.rechargeRegistBtn.setOnClickListener {
-            // 澶勭悊鍐欏崱閫昏緫
-            handleWriteCard()
+            // 澶勭悊鍏呭�奸�昏緫
+            handleRecharge()
         }
+
+        // 璁剧疆閲戦杈撳叆闄愬埗
+        setupAmountInputLimit(binding.rechargeMorny)
+        setupAmountInputLimit(binding.rechargeWater)
+    }
+
+    /**
+     * 璁剧疆閲戦杈撳叆闄愬埗锛屾渶澶氫繚鐣欎袱浣嶅皬鏁�
+     */
+    private fun setupAmountInputLimit(editText: EditText) {
+        editText.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.isEmpty()) return
+
+                // 妫�鏌ユ槸鍚﹀寘鍚皬鏁扮偣
+                if (text.contains(".")) {
+                    val parts = text.split(".")
+                    if (parts.size == 2) {
+                        val decimalPart = parts[1]
+                        // 濡傛灉灏忔暟浣嶈秴杩�2浣嶏紝鎴彇鍓嶄袱浣�
+                        if (decimalPart.length > 2) {
+                            val newText = "${parts[0]}.${decimalPart.substring(0, 2)}"
+                            editText.removeTextChangedListener(this)
+                            editText.setText(newText)
+                            editText.setSelection(newText.length)
+                            editText.addTextChangedListener(this)
+                        }
+                    }
+                }
+
+                // 闃叉杈撳叆澶氫釜灏忔暟鐐�
+                val dotCount = text.count { it == '.' }
+                if (dotCount > 1) {
+                    val newText = text.substring(0, text.lastIndexOf('.'))
+                    editText.removeTextChangedListener(this)
+                    editText.setText(newText)
+                    editText.setSelection(newText.length)
+                    editText.addTextChangedListener(this)
+                }
+
+                // 闃叉浠ュ皬鏁扮偣寮�澶�
+                if (text.startsWith(".")) {
+                    editText.removeTextChangedListener(this)
+                    editText.setText("0$text")
+                    editText.setSelection(editText.text.length)
+                    editText.addTextChangedListener(this)
+                }
+            }
+        })
     }
 
     /**
@@ -180,10 +255,19 @@
             binding.redInitCode.text = cardAddress ?: ""
             binding.userName.text = info.userName ?: ""
             binding.redCardNum.text = info.cardNum ?: ""
-            binding.redRemainderBlance.text = "${info.balance ?: 0} 鍏�"
+
+            // 浣跨敤鐢ㄦ埛鍗′腑鐨勪綑棰濇樉绀�
+            val balance = userCard?.let {
+                // 灏嗗垎杞崲涓哄厓锛屼繚鐣欎袱浣嶅皬鏁�
+                String.format("%.2f", it.balance / 100.0)
+            } ?: run {
+                // 濡傛灉鐢ㄦ埛鍗′负绌猴紝鍒欎娇鐢ㄦ湇鍔″櫒杩斿洖鐨勪綑棰�
+                String.format("%.2f", info.balance ?: 0.0)
+            }
+            binding.redRemainderBlance.text = "$balance 鍏�"
 
             // 璁剧疆鍗$姸鎬佸拰瀵瑰簲棰滆壊
-            val cardStatus = when (info.status) {
+            val cardStatus = when (info.state) {
                 1 -> "姝e父"
                 2 -> "鎸傚け"
                 3 -> "閿佸畾"
@@ -193,7 +277,7 @@
             binding.redStatu.text = cardStatus
 
             // 鏍规嵁鍗$姸鎬佽缃笉鍚岄鑹�
-            val statusColor = when (info.status) {
+            val statusColor = when (info.state) {
                 1 -> android.graphics.Color.parseColor("#4CAF50") // 缁胯壊-姝e父
                 2 -> android.graphics.Color.parseColor("#FF9800") // 姗欒壊-鎸傚け
                 3 -> android.graphics.Color.parseColor("#F44336") // 绾㈣壊-閿佸畾
@@ -203,7 +287,10 @@
         }
     }
 
-    private fun handleWriteCard() {
+    /**
+     * 澶勭悊鍏呭�奸�昏緫
+     */
+    private fun handleRecharge() {
         // 楠岃瘉鍏呭�奸噾棰�
         val rechargeAmountStr = binding.rechargeMorny.text.toString().trim()
         if (rechargeAmountStr.isEmpty()) {
@@ -235,20 +322,112 @@
             0.0
         }
 
-        // 鏄剧ず纭淇℃伅
-        val totalAmount = rechargeAmount + bonusAmount
-        val confirmMessage = """
-            纭鍏呭�间俊鎭細
-            鍗″彿锛�${cardAddress}
-            鍏呭�奸噾棰濓細${rechargeAmount}鍏�
-            璧犻�侀噾棰濓細${bonusAmount}鍏�
-            鎬婚噾棰濓細${totalAmount}鍏�
-            鏀粯鏂瑰紡锛�${paymentMethod}
-        """.trimIndent()
+        // 璋冪敤鍏呭�兼帴鍙�
+        callRechargeApi(rechargeAmount, bonusAmount)
+    }
 
-        ToastUtil.show(confirmMessage)
+    /**
+     * 璋冪敤鍏呭�兼帴鍙�
+     */
+    private fun callRechargeApi(rechargeAmount: Double, bonusAmount: Double) {
+        val cardNum = cardInfo?.cardNum ?: cardAddress ?: ""
+        if (cardNum.isEmpty()) {
+            ToastUtil.show("鍗″彿淇℃伅缂哄け")
+            return
+        }
 
-        // TODO: 璋冪敤鍐欏崱API
-        // 杩欓噷鍙互娣诲姞瀹為檯鐨勫啓鍗¢�昏緫
+        // 鑾峰彇姘翠环锛堝鏋滀负绌轰細鑷姩瑙﹀彂MainActivity鑾峰彇锛�
+        val currentWaterPrice = BaseApplication.requestWaterPrice()
+
+        // 鏋勫缓鍏呭�艰姹傚弬鏁�
+        val rechargeRequest = RechargeRequest(
+            rechargeType = 2,
+            cardNum = cardNum,
+            money = String.format("%.0f", rechargeAmount),
+            amount = String.format("%.0f", bonusAmount),
+            gift = String.format("%.0f", bonusAmount),
+            paymentId = paymentId.toString(),
+            price = String.format("%.2f", currentWaterPrice), // 浣跨敤缁熶竴鑾峰彇鐨勬按浠�
+            remarks = "鍏呭��",
+            operator = BaseApplication.userId // 榛樿鎿嶄綔鍛業D锛屽彲浠ユ牴鎹疄闄呮儏鍐佃皟鏁�
+        )
+
+        // 杞崲涓篗ap鏍煎紡
+        val params = mapOf(
+            "rechargeType" to rechargeRequest.rechargeType,
+            "cardNum" to rechargeRequest.cardNum,
+            "money" to rechargeRequest.money,
+            "amount" to rechargeRequest.amount,
+            "gift" to rechargeRequest.gift,
+            "paymentId" to rechargeRequest.paymentId,
+            "price" to rechargeRequest.price,
+            "remarks" to rechargeRequest.remarks,
+            "operator" to rechargeRequest.operator
+        )
+
+        ApiManager.getInstance().requestPostLoading(
+            this,
+            "terminal/card/termRecharge",
+            RechargeResult::class.java,
+            params,
+            object : SubscriberListener<BaseResponse<RechargeResult>>() {
+                override fun onNext(response: BaseResponse<RechargeResult>) {
+                    if (response.success && response.code == "0001") {
+                        // 鍏呭�兼垚鍔燂紝璺宠浆鍒板啓鍗$晫闈�
+                        response.content?.let { rechargeResult ->
+                            startWriteCardActivity(rechargeResult, rechargeAmount, bonusAmount)
+                        } ?: run {
+                            ToastUtil.show("鍏呭�兼垚鍔熶絾杩斿洖鏁版嵁涓虹┖")
+                        }
+                    } else {
+                        ToastUtil.show("鍏呭�煎け璐�: ${response.msg ?: "鏈煡閿欒"}")
+                    }
+                }
+
+                override fun onError(e: Throwable?) {
+                    super.onError(e)
+                    ToastUtil.show("鍏呭�煎け璐�: ${e?.message ?: "缃戠粶寮傚父"}")
+                }
+            }
+        )
+    }
+
+    /**
+     * 鍚姩鍐欏崱鐣岄潰
+     */
+    private fun startWriteCardActivity(
+        rechargeResult: RechargeResult,
+        rechargeAmount: Double,
+        bonusAmount: Double
+    ) {
+        try {
+            // 鍒涘缓UserCard瀵硅薄鐢ㄤ簬鍐欏崱
+            val userCard = UserCard().apply {
+                // 璁剧疆鐢ㄦ埛鍗′俊鎭�
+                cardInfo?.let { info ->
+                    balance = MornyUtil.changeY2F(rechargeResult.balance)
+                }
+
+                // 璁剧疆鍏朵粬蹇呰淇℃伅
+                projectCode = rechargeResult.projectNo
+                waterPrice = MornyUtil.changeY2F(rechargeResult.waterPrice.toString())
+                rechargeDate = java.util.Calendar.getInstance()
+            }
+
+            // 鍚姩鍐欏崱Activity
+            val intent = Intent(this, NfcWreatActivity::class.java).apply {
+                putExtra("cardType", USER_CARD_TYPE_1) // 鐢ㄦ埛鍗$被鍨�
+                putExtra("cardAddr", cardAddress)
+                putExtra("operationTypeCode", CardOperationType.Recharge.code)
+                putExtra("orderNumber", rechargeResult.orderNo)
+                putExtra("userCard", userCard)
+                putExtra("rechargeAmount", rechargeAmount) // 浼犻�掑厖鍊奸噾棰�
+                putExtra("bonusAmount", bonusAmount) // 浼犻�掕禒閫侀噾棰�
+            }
+            startActivity(intent)
+            finish()
+        } catch (e: Exception) {
+            ToastUtil.show("鍚姩鍐欏崱鐣岄潰澶辫触: ${e.message}")
+        }
     }
 } 
\ No newline at end of file

--
Gitblit v1.8.0