From 0faae97cd2523f840c426da68464e577e01dfa80 Mon Sep 17 00:00:00 2001
From: zuojincheng <lf_zuo@163.com>
Date: 星期一, 23 六月 2025 20:35:08 +0800
Subject: [PATCH] refactor(CardReplaceActivity): 重构补卡流程并优化界面显示- 重新设计卡片信息展示布局,增加新卡卡地址、客户编号等字段 - 优化补卡逻辑,支持通过卡号或客户编号获取卡片信息 -调整工本费和返回金额输入框位置 - 更新API调用路径,使用新的卡片查询接口
---
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