From 2b02b6e854a56a511588e4865ddf2c6597675329 Mon Sep 17 00:00:00 2001 From: zuoxiao <470321431@qq.com> Date: 星期一, 16 六月 2025 16:04:54 +0800 Subject: [PATCH] feat(nfc): 添加读卡功能并优化写卡流程 --- generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt | 212 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 194 insertions(+), 18 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..bd7b9f1 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,37 @@ 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.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 +43,13 @@ 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 +65,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 +83,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,7 +249,16 @@ 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) { @@ -203,7 +281,10 @@ } } - private fun handleWriteCard() { + /** + * 澶勭悊鍏呭�奸�昏緫 + */ + private fun handleRecharge() { // 楠岃瘉鍏呭�奸噾棰� val rechargeAmountStr = binding.rechargeMorny.text.toString().trim() if (rechargeAmountStr.isEmpty()) { @@ -235,20 +316,115 @@ 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 -> + userCode = info.cardNum ?: "" + + // 璁$畻鏂颁綑棰濓細鍘熸湁浣欓 + 鍏呭�奸噾棰� + 璧犻�侀噾棰� + val originalBalance = this@RechargeDetailActivity.userCard?.balance ?: 0 // 鍘熸湁浣欓锛堝垎锛� + val rechargeAmountInCents = (rechargeAmount * 100).toInt() // 鍏呭�奸噾棰濊浆鍒� + val bonusAmountInCents = (bonusAmount * 100).toInt() // 璧犻�侀噾棰濊浆鍒� + + balance = originalBalance + rechargeAmountInCents + bonusAmountInCents + } + + // 璁剧疆鍏朵粬蹇呰淇℃伅 + projectCode = rechargeResult.projectNo + waterPrice = rechargeResult.waterPrice.toFloat() + 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) + + } catch (e: Exception) { + ToastUtil.show("鍚姩鍐欏崱鐣岄潰澶辫触: ${e.message}") + } } } \ No newline at end of file -- Gitblit v1.8.0