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/NewCard2Activity.kt | 445 +++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 379 insertions(+), 66 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 dbaf55e..2eb3f4c 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
@@ -4,20 +4,34 @@
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.utils.MornyUtil
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.CardOperationType
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 java.util.Calendar
/**
* Description: 鐢ㄦ埛寮�鍗$晫闈�(鍚屾淇敼鐧藉崱瀵嗙爜)
@@ -26,10 +40,16 @@
*/
class NewCard2Activity : BaseNfcActivity() {
- private lateinit var binding: ActivityNewCard1GeBinding
+ private lateinit var binding: ActivityNewCardGeBinding
// 鏀粯鏂瑰紡
private var paymentMethod: String = "鐜伴噾"
+
+ // 鏀粯鏂瑰紡ID
+ private var paymentId: Long = 0
+
+ // 鏀粯鏂瑰紡鍒楄〃
+ private var paymentMethodList: List<PaymentMethod> = listOf()
// 鍗$墿鐞咺D
private var cardPhysicalId: String = ""
@@ -37,19 +57,41 @@
// 鐢ㄦ埛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"
+ private const val REQUEST_CODE_NFC_WRITE = 1001
}
+
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() {
// 鍒濆鍖栨爣棰樻爮杩斿洖鎸夐挳
@@ -60,21 +102,148 @@
// 鍒濆鍖朜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
+ }
+
+ /**
+ * 鑾峰彇鏀粯鏂瑰紡鍒楄〃
+ */
+ private fun getPaymentMethods() {
+ ApiManager.getInstance().requestGetLoading(
+ this,
+ "sell/paymentmethod/get",
+ PaymentMethodResponse::class.java,
+ null,
+ object : SubscriberListener<BaseResponse<PaymentMethodResponse>>() {
+ override fun onNext(response: BaseResponse<PaymentMethodResponse>) {
+ if (response.success) {
+ // 鑾峰彇鏀粯鏂瑰紡鍒楄〃
+ val paymentMethods = response.content?.obj ?: listOf()
+ if (paymentMethods.isNotEmpty()) {
+ paymentMethodList = paymentMethods
+ // 鏇存柊鏀粯鏂瑰紡鏄剧ず
+ updatePaymentMethodRadioGroup()
+ }
+ } 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()
+ }
+ }
+ )
+ }
+
+ /**
+ * 鏇存柊鏀粯鏂瑰紡RadioGroup
+ */
+ private fun updatePaymentMethodRadioGroup() {
+ // 娓呯┖鍘熸湁RadioButton
+ binding.newCardPaymentMethod.removeAllViews()
+
+ // 鍔ㄦ�佹坊鍔燫adioButton
+ paymentMethodList.forEachIndexed { index, method ->
+ val radioButton = RadioButton(this)
+ radioButton.id = View.generateViewId() // 鐢熸垚鍞竴ID
+ radioButton.layoutParams = android.widget.LinearLayout.LayoutParams(
+ 0,
+ resources.getDimensionPixelSize(R.dimen.dimen_40),
+ 1.0f
+ )
+
+ // 濡傛灉涓嶆槸鏈�鍚庝竴涓寜閽紝娣诲姞鍙宠竟璺�
+ if (index < paymentMethodList.size - 1) {
+ (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
+ paymentMethod = method.name
+ paymentId = method.id
+ }
+ }
}
/**
@@ -109,11 +278,14 @@
private fun initListener() {
// 璁剧疆鏀粯鏂瑰紡閫夋嫨鐩戝惉
binding.newCardPaymentMethod.setOnCheckedChangeListener { group, checkedId ->
- paymentMethod = when (checkedId) {
- R.id.newCard_cashPayment -> "鐜伴噾"
- R.id.newCard_posPayment -> "POS鏈�"
- R.id.newCard_bankTransfer -> "閾惰杞处"
- else -> "鐜伴噾"
+ // 鏍规嵁閫変腑鐨処D鑾峰彇鏀粯鏂瑰紡
+ for (i in 0 until group.childCount) {
+ val radioButton = group.getChildAt(i) as RadioButton
+ if (radioButton.id == checkedId) {
+ paymentMethod = radioButton.text.toString()
+ paymentId = paymentMethodList[i].id
+ break
+ }
}
}
@@ -129,6 +301,9 @@
}
}
+ /**
+ * 娉ㄥ唽鏂板崱
+ */
private fun registerNewCard() {
// 鑾峰彇鍏呭�奸噾棰�
val rechargeAmountStr = binding.newCardRechargeAmount.text.toString()
@@ -136,63 +311,141 @@
// 鑾峰彇宸ユ湰璐�
val cardFeeStr = binding.newCardCardFee.text.toString()
- val cardFee = if (cardFeeStr.isEmpty()) 0.0 else cardFeeStr.toDouble()
-
- // 鏍煎紡鍖栭噾棰濅负涓や綅灏忔暟
- val formattedRechargeAmount = String.format("%.2f", rechargeAmount)
- val formattedCardFee = String.format("%.2f", cardFee)
-
- // 鑾峰彇鏀粯鏂瑰紡ID
- val paymentId = when (paymentMethod) {
- "鐜伴噾" -> 1
- "POS鏈�" -> 2
- "閾惰杞处" -> 3
- else -> 1
- }
+ val cardFee = if (cardFeeStr.isEmpty()) 0 else cardFeeStr.toInt()
val remark = binding.newCardRemark.text.toString()
// 鏋勫缓璇锋眰鍙傛暟
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["paymentId"] = paymentId // 鏀粯鏂瑰紡
+ 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,
+ 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()
+ BaseDaoSingleton.getInstance(this@NewCard2Activity)
+ .cardRegistrationDao().insert(cardRegistration)
setResult(RESULT_OK)
- finish()
+ Intent(this@NewCard2Activity, NfcWreatActivity::class.java).apply {
+ putExtra("cardType", USER_CARD_TYPE_1)
+ putExtra("orderNumber", orderId)
+ putExtra("cardAddr", cardPhysicalId)
+ var userCard = UserCard()
+ userCard.areaNumber =
+ response.content?.cardNum?.substring(0, 12).toString()
+ userCard.userCode = clientInfo.clientNum
+ userCard.phoneNumber = clientInfo.phone
+ userCard.userCodeNumber =
+ response.content?.cardNum?.substring(12)?.toInt()!!
+ userCard.projectCode = response.content?.projectNo!!
+ userCard.balance =
+ MornyUtil.changeY2F(response.content?.balance)
+// userCard.surplusWater = response.content?.surplusWater?.toInt()!!
+ userCard.waterPrice =
+ MornyUtil.changeY2F(response.content?.waterPrice)
+ userCard.electricPrice =
+ MornyUtil.changeY2F(response.content?.waterPrice)
+ userCard.rechargeDate =
+ DateUtils.parseStringToCalendar(response.content?.time)
+
+ // 杈撳嚭userCard鐨勬墍鏈変俊鎭埌鏃ュ織
+ android.util.Log.d(
+ "NewCard2Activity",
+ "=== 寮�鍗serCard淇℃伅 ==="
+ )
+ android.util.Log.d(
+ "NewCard2Activity",
+ "鍗$墖绫诲瀷: ${userCard.cardType}"
+ )
+ android.util.Log.d(
+ "NewCard2Activity",
+ "鍥藉琛屾斂鍖哄煙鍙�: ${userCard.areaNumber}"
+ )
+ android.util.Log.d(
+ "NewCard2Activity",
+ "鐢ㄦ埛缂栧彿: ${userCard.userCode}"
+ )
+ android.util.Log.d(
+ "NewCard2Activity",
+ "鐢ㄦ埛鍗$紪鍙�: ${userCard.userCodeNumber}"
+ )
+ android.util.Log.d(
+ "NewCard2Activity",
+ "瀹屾暣鐢ㄦ埛缂栧彿: ${userCard.getMyUserCode()}"
+ )
+ android.util.Log.d(
+ "NewCard2Activity",
+ "鎵嬫満鍙�: ${userCard.phoneNumber}"
+ )
+ android.util.Log.d(
+ "NewCard2Activity",
+ "椤圭洰缂栫爜: ${userCard.projectCode}"
+ )
+ android.util.Log.d(
+ "NewCard2Activity",
+ "鍗″唴浣欓: ${userCard.balance}"
+ )
+ android.util.Log.d(
+ "NewCard2Activity",
+ "鍓╀綑姘撮噺: ${userCard.surplusWater}"
+ )
+ android.util.Log.d(
+ "NewCard2Activity",
+ "姘撮噺鍗曚环: ${userCard.waterPrice}"
+ )
+ android.util.Log.d(
+ "NewCard2Activity",
+ "鐢甸噺鍗曚环: ${userCard.electricPrice}"
+ )
+ android.util.Log.d(
+ "NewCard2Activity",
+ "鍏呭�兼椂闂�: ${userCard.rechargeDate}"
+ )
+ android.util.Log.d("NewCard2Activity", "==================")
+
+ putExtra("userCard", userCard)
+ putExtra("operationTypeCode", CardOperationType.OpenCard.code)
+ putExtra("cardFee", cardFee)
+ startActivityForResult(this, REQUEST_CODE_NFC_WRITE)
+ }
} catch (e: Exception) {
- Toast.makeText(this@NewCard2Activity, "淇濆瓨寮�鍗′俊鎭け璐�: ${e.message}", Toast.LENGTH_SHORT).show()
+ CrashReport.postCatchedException(e)
+ Toast.makeText(
+ this@NewCard2Activity,
+ "淇濆瓨寮�鍗′俊鎭け璐�: ${e.message}",
+ Toast.LENGTH_SHORT
+ ).show()
}
}
} else {
@@ -231,23 +484,83 @@
}
override fun onNfcBack(intent: Intent) {
- var cardNumber = NfcReadHelper.getInstance(intent, this).getCardNumber()
- if (!cardNumber.isEmpty()) {
- // 淇濆瓨鍗$墿鐞咺D
- cardPhysicalId = cardNumber
- // 鏇存柊UI
- binding.newCardArerNumber.text = cardNumber
- // 闅愯棌NFC璇诲崱鐣岄潰
- binding.nfcContainer.visibility = View.GONE
- binding.centerScroll.visibility = View.VISIBLE
- binding.newCardRegistBtn.visibility = View.VISIBLE
+ if (!isReadCard) {
+ val cardNumber = NfcReadHelper.getInstance(intent, this).getCardNumberNoClose()
+ if (cardNumber.isNotEmpty()) {
+ try {
+ // 鍒涘缓瀵嗛挜鍒楄〃鐨勫壇鏈紝閬垮厤ConcurrentModificationException
+ val keyList = ArrayList(NfcReadHelper.getInstance(intent, this).getKeyList())
+
+ // 浣跨敤缇庡寲鐨勫姞杞藉姩鐢绘潵鏄剧ずNFC鎿嶄綔鐨勫姞杞界姸鎬�
+ val nfcHelper = NfcWreatHelper.getInstance(intent, this)
+ nfcHelper.setLoadingView(binding.loadingContainer, binding.nfcProgressWheel)
+
+ // 寮傛淇敼瀵嗙爜
+ nfcHelper.changePSAsync(
+ keyList,
+ false,
+ true
+ ) { success: Boolean, msg: String? ->
+ if (success) {
+ isReadCard = true
+ // 淇濆瓨鍗$墿鐞咺D
+ cardPhysicalId = cardNumber
+ // 鏇存柊UI
+ binding.newCardArerNumber.text = cardNumber
+ // 闅愯棌NFC璇诲崱鐣岄潰
+ binding.nfcContainer.visibility = View.GONE
+ binding.centerScroll.visibility = View.VISIBLE
+ binding.newCardRegistBtn.visibility = View.VISIBLE
+ } else {
+ // 瀵嗙爜淇敼澶辫触锛屽鐞嗛敊璇儏鍐�
+ Toast.makeText(
+ this@NewCard2Activity,
+ "鍗$墖鍒濆鍖栧け璐ワ細$msg",
+ Toast.LENGTH_LONG
+ ).show()
+ }
+ }
+ } 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()
}
}
-
-
-
-
-
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ super.onActivityResult(requestCode, resultCode, data)
+ if (requestCode == REQUEST_CODE_NFC_WRITE && resultCode == RESULT_OK) {
+ // 鍐欏崱鎴愬姛锛屽叧闂綋鍓岮ctivity
+ finish()
+ }
+ }
}
\ No newline at end of file
--
Gitblit v1.8.0