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