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/res/layout/activity_card_read.xml | 375 +++++++++++++++++++++++++
generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt | 4
baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java | 41 +-
generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt | 3
generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt | 324 +++++++++++++++++++++
generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt | 23
generallibrary/src/main/AndroidManifest.xml | 13
baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcReadAdapter.java | 17
generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt | 30 +
baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNfcReadHelper.java | 12
10 files changed, 798 insertions(+), 44 deletions(-)
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNfcReadHelper.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNfcReadHelper.java
index 177e0d2..681abb9 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNfcReadHelper.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/BaseNfcReadHelper.java
@@ -52,7 +52,7 @@
* @return
*/
public String getCradTypeAndCardNumber(){
- return getCradTypeAndCardNumber(1);
+ return getCradTypeAndCardNumber(1,0,0);
};
/**
@@ -60,7 +60,7 @@
*
* @return
*/
- public String getCradTypeAndCardNumber(int sectorIndex){
+ public String getCradTypeAndCardNumber(int sectorIndex,int blockIndex,int cardTypeIndex){
return null;
};
@@ -82,12 +82,18 @@
public abstract List<byte[]> getOnesectorData();
+ public BaseUserCardCard getUserCardData(BaseUserCardCard userCardCard){
+ return getUserCardData(1,userCardCard);
+ };
+
/**
* 鍚屾鑾峰彇鐢ㄦ埛鍗′俊鎭�
*
* @return
*/
- public abstract BaseUserCardCard getUserCardData(BaseUserCardCard userCardCard);
+ public BaseUserCardCard getUserCardData(int sectorIndex,BaseUserCardCard userCardCard){
+ return null;
+ }
public BaseManagerToUserCard getManagerToUserCardData(BaseManagerToUserCard baseManagerToUserCard) {
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
index cb24575..93ac8c3 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
@@ -53,13 +53,18 @@
return helper;
}
+
+ public BaseUserCardCard getUserCardData( BaseUserCardCard userCardCard) {
+ return getUserCardData(1, userCardCard);
+ }
+
/**
* 鑾峰彇鐢ㄦ埛鍗′俊鎭�
*
* @return
*/
@Override
- public BaseUserCardCard getUserCardData(BaseUserCardCard userCardCard) {
+ public BaseUserCardCard getUserCardData(int sectorIndex, BaseUserCardCard userCardCard) {
if (userCardCard != null) {
BaseUserCardCard userCard = null;
Map<String, List<byte[]>> map = new HashMap<>();
@@ -68,26 +73,31 @@
try {
//閾炬帴NFC
mfc.connect();
- //鑾峰彇鎵囧尯鏁伴噺
- int count = mfc.getSectorCount();
- //瀛樺偍绌洪棿
- int size = mfc.getSize();
+
//鐢ㄤ簬鍒ゆ柇鏃跺�欐湁鍐呭璇诲彇鍑烘潵
boolean flag = false;
List<byte[]> list = new ArrayList<>();
//楠岃瘉鎵囧尯瀵嗙爜锛屽惁鍒欎細鎶ラ敊锛堥摼鎺ュけ璐ラ敊璇級
boolean isOpen = false;
- for (int i = 0; i < listKeyA.size(); i++) {
- if (mfc.authenticateSectorWithKeyA(1, listKeyA.get(i))) {
+ if (!listKeyA.isEmpty()) {
+ for (int i = 0; i < listKeyA.size(); i++) {
+ if (mfc.authenticateSectorWithKeyA(sectorIndex, listKeyA.get(i))) {
+ isOpen = true;
+ break;
+ }
+ }
+ } else if (!listA_PS.isEmpty()) {
+ if (mfc.authenticateSectorWithKeyA(sectorIndex, defauleKey)) {
isOpen = true;
- break;
+ } else if (mfc.authenticateSectorWithKeyA(sectorIndex, listA_PS.get(sectorIndex))) {
+ isOpen = true;
}
}
if (isOpen) {
//鑾峰彇鎵囧尯閲岄潰鍧楃殑鏁伴噺
- int bCount = mfc.getBlockCountInSector(1);
+ int bCount = mfc.getBlockCountInSector(sectorIndex);
//鑾峰彇鎵囧尯绗竴涓潡瀵瑰簲鑺墖瀛樺偍鍣ㄧ殑浣嶇疆锛堟垜鏄繖鏍风悊瑙g殑锛屽洜涓虹0鎵囧尯鐨勮繖涓�兼槸4鑰屼笉鏄�0锛�
- int bIndex = mfc.sectorToBlock(1);
+ int bIndex = mfc.sectorToBlock(sectorIndex);
//String data1 = "";
for (int j = 0; j < bCount; j++) {
//璇诲彇鏁版嵁
@@ -482,7 +492,7 @@
@Override
public String getCradTypeAndCardNumber() {
- return getCradTypeAndCardNumber(1);
+ return getCradTypeAndCardNumber(1, 0, 0);
}
@@ -492,7 +502,7 @@
* @return
*/
- public String getCradTypeAndCardNumber(int sectorIndex) {
+ public String getCradTypeAndCardNumber(int sectorIndex, int blockIndex, int cardTypeIndex) {
MifareClassic mfc = MifareClassic.get(tag);
if (null != mfc) {
@@ -544,9 +554,9 @@
}
if (isOpen) {
int bIndex = mfc.sectorToBlock(sectorIndex);
- byte[] data = mfc.readBlock(bIndex + sectorIndex);
+ byte[] data = mfc.readBlock(bIndex + 0);
if (data != null && data.length > 0) {
- String hex = HexUtil.byteToHex(data[0]);
+ String hex = HexUtil.byteToHex(data[cardTypeIndex]);
strData.append(hex);
Log.i("NFCWreatActivity", "hex===" + hex);
return strData.toString().toUpperCase();
@@ -556,6 +566,7 @@
return BaseCommon.CARD_TYPE_ERROR2;
}
} catch (IOException e) {
+ e.printStackTrace();
return BaseCommon.CARD_TYPE_ERROR1;
} finally {
try {
@@ -693,8 +704,6 @@
}
return null;
}
-
-
}
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcReadAdapter.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcReadAdapter.java
index 515b27a..e3d8fbd 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcReadAdapter.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcReadAdapter.java
@@ -66,11 +66,11 @@
}
}
+
@Override
public String getCardNumber() {
return getCardNumber(false);
}
-
public String getCardNumber(boolean isChangePS) {
@@ -101,10 +101,10 @@
}
@Override
- public String getCradTypeAndCardNumber(int sectorIndex) {
+ public String getCradTypeAndCardNumber(int sectorIndex, int blockIndex, int cardTypeIndex) {
switch (BaseNfcActivity.adapterType) {
case ModelUtils.defaultType:
- return nativeNfcReadHelper.getCradTypeAndCardNumber(sectorIndex);
+ return nativeNfcReadHelper.getCradTypeAndCardNumber(sectorIndex, blockIndex, cardTypeIndex);
}
return "";
}
@@ -138,7 +138,12 @@
return null;
}
-
-
-
+ @Override
+ public BaseUserCardCard getUserCardData(int sectorIndex, BaseUserCardCard userCardCard) {
+ switch (BaseNfcActivity.adapterType) {
+ case ModelUtils.defaultType:
+ return nativeNfcReadHelper.getUserCardData(sectorIndex, userCardCard);
+ }
+ return null;
+ }
}
diff --git a/generallibrary/src/main/AndroidManifest.xml b/generallibrary/src/main/AndroidManifest.xml
index fb429e6..910fe6a 100644
--- a/generallibrary/src/main/AndroidManifest.xml
+++ b/generallibrary/src/main/AndroidManifest.xml
@@ -92,7 +92,18 @@
<!-- 鍐欏崱鎴愬姛椤甸潰 -->
<activity android:name=".activity.CardWriteSuccessActivity" />
<!-- 鎸傚け椤甸潰 -->
- <activity android:name=".activity.LossCardActivity"/>
+ <activity android:name=".activity.LossCardActivity" />
+ <!-- 璇诲崱椤甸潰 -->
+ <activity
+ android:name=".activity.CardReadActivity"
+ android:exported="false"
+ android:launchMode="singleTop">
+ <intent-filter>
+ <action android:name="android.nfc.action.ACTION_NDEF_DISCOVERED" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="text/plain" />
+ </intent-filter>
+ </activity>
<meta-data
android:name="BUGLY_APP_VERSION"
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt b/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
index 3ed6595..7e4ffc1 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
@@ -51,6 +51,9 @@
}
startActivity(intent)
}
+ binding.homeRedCard.setOnClickListener {
+ context?.let { CardReadActivity.start(it) }
+ }
}
}
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt
new file mode 100644
index 0000000..271b476
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt
@@ -0,0 +1,324 @@
+package com.dayu.general.activity
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import com.dayu.baselibrary.net.subscribers.SubscriberListener
+import com.dayu.baselibrary.utils.ToastUtil
+import com.dayu.baselibrary.view.TipDialog
+import com.dayu.baselibrary.view.TitleBar
+import com.dayu.general.bean.net.CardInfoResult
+import com.dayu.general.databinding.ActivityCardReadBinding
+import com.dayu.general.net.ApiManager
+import com.dayu.general.net.BaseResponse
+import com.dayu.general.tool.NfcReadHelper
+import com.dayu.general.bean.card.UserCard
+import com.dayu.general.tool.CardCommon
+
+/**
+ * @author: zuo
+ * @desc: 璇诲崱Activity
+ * @since: 2025/3/6
+ */
+class CardReadActivity : BaseNfcActivity() {
+ private lateinit var binding: ActivityCardReadBinding
+ private var cardNumber: String? = null
+
+ companion object {
+ /**
+ * 鍚姩璇诲崱Activity
+ */
+ fun start(context: Context) {
+ val intent = Intent(context, CardReadActivity::class.java)
+ context.startActivity(intent)
+ }
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivityCardReadBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ initView()
+ }
+
+ private fun initView() {
+ // 璁剧疆鏍囬
+ binding.titleBar.setCenterText("璇诲崱")
+ // 璁剧疆TitleBar鐨勮繑鍥炴寜閽偣鍑讳簨浠�
+ binding.titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) {
+ finish()
+ }
+
+
+ }
+
+ /**
+ * 閲嶇疆鍒拌鍗$姸鎬�
+ */
+ private fun resetToReadingState() {
+ binding.cardReadLL.visibility = android.view.View.VISIBLE
+ binding.cardInfoContainer.visibility = android.view.View.GONE
+ cardNumber = null
+ }
+
+ /**
+ * 鏄剧ず纭瀵硅瘽妗�
+ */
+ private fun showConfirmDialog(message: String, onConfirm: () -> Unit) {
+ val confirmDialog = TipDialog(this, message) {
+ onConfirm()
+ }
+ confirmDialog.show()
+ }
+
+ override fun onNfcBack(intent: Intent?) {
+ intent?.let {
+ handleNfcIntent(it)
+ } ?: run {
+ showConfirmDialog("NFC鏁版嵁寮傚父锛岃閲嶆柊鍒峰崱") {
+ }
+ }
+ }
+
+ /**
+ * 澶勭悊NFC鍒峰崱淇℃伅
+ */
+ private fun handleNfcIntent(intent: Intent) {
+ try {
+ // 妫�鏌ntent涓槸鍚﹀寘鍚玁FC Tag
+ if (intent.getParcelableExtra<android.nfc.Tag>(android.nfc.NfcAdapter.EXTRA_TAG) == null) {
+ showConfirmDialog("鏈娴嬪埌NFC鍗$墖锛岃纭繚鍗$墖宸叉纭斁缃�") {
+ }
+ return
+ }
+
+ val nfcAdapter = NfcReadHelper.getInstance(intent, this)
+ val cardTypeAndCardNumber = nfcAdapter.getCardTypeAndCardNumber()
+ if (cardTypeAndCardNumber.isNullOrBlank() || !cardTypeAndCardNumber.contains(",")) {
+ showConfirmDialog("鍗$墖淇℃伅璇诲彇澶辫触锛岃閲嶆柊鍒峰崱") {
+ }
+ return
+ }
+ val parts = cardTypeAndCardNumber.split(",")
+ if (parts.size < 2) {
+ showConfirmDialog("鍗$墖淇℃伅鏍煎紡寮傚父锛岃閲嶆柊鍒峰崱") {
+ }
+ return
+ }
+ val cardNumber = parts[0]
+ val cardType = parts[1]
+ this.cardNumber = cardNumber
+ if (cardNumber.isBlank()) {
+ showConfirmDialog("鍗″彿涓虹┖锛屾棤娉曡繘琛屾搷浣滐紝璇烽噸鏂板埛鍗�") {
+ }
+ return
+ }
+
+ // 鏍规嵁鍗$墖绫诲瀷杩涜涓嶅悓澶勭悊
+ when (cardType) {
+ CardCommon.USER_CARD_TYPE_1,
+ CardCommon.USER_CARD_TYPE_2,
+ CardCommon.USER_CARD_TYPE_3 -> {
+ // 鐢ㄦ埛鍗★細瑙f瀽鍗″唴鏁版嵁骞惰皟鐢ㄦ帴鍙�
+ handleUserCard(cardNumber, cardType, nfcAdapter)
+ }
+ else -> {
+ // 绠$悊绫诲崱锛氭樉绀哄崱鐗囩被鍨嬩俊鎭�
+ handleManagementCard(cardNumber, cardType)
+ }
+ }
+ } catch (e: Exception) {
+ showConfirmDialog("璇诲崱寮傚父锛�${e.message}") {
+ }
+ e.printStackTrace()
+ }
+ }
+
+ /**
+ * 澶勭悊鐢ㄦ埛鍗�
+ */
+ private fun handleUserCard(cardNumber: String, cardType: String, nfcAdapter: NfcReadHelper) {
+ // 瑙f瀽鐢ㄦ埛鍗℃暟鎹�
+ val userCard = nfcAdapter.getUserCardData()
+ if (userCard == null) {
+ showConfirmDialog("瑙f瀽鍗$墖鏁版嵁澶辫触锛岃閲嶆柊鍒峰崱") {
+ }
+ return
+ }
+
+ // 鏍规嵁鍗″彿鑾峰彇鍗$墖璇︾粏淇℃伅
+ getCardInfo(cardNumber, cardType, userCard)
+ }
+
+ /**
+ * 澶勭悊绠$悊绫诲崱鐗�
+ */
+ private fun handleManagementCard(cardNumber: String, cardType: String) {
+ val cardTypeName = getCardTypeName(cardType)
+
+ // 鏄剧ず绠$悊鍗′俊鎭�
+ showManagementCardInfo(cardNumber, cardTypeName)
+ }
+
+ /**
+ * 鏄剧ず绠$悊绫诲崱鐗囦俊鎭�
+ */
+ private fun showManagementCardInfo(cardNumber: String, cardTypeName: String) {
+ // 闅愯棌璇诲崱鎻愮ず锛屾樉绀轰俊鎭尯鍩�
+ binding.cardReadLL.visibility = android.view.View.GONE
+ binding.cardInfoContainer.visibility = android.view.View.VISIBLE
+
+
+
+ // 鏄剧ず鍩烘湰淇℃伅
+ binding.tvCardNumber.text = cardNumber
+ binding.tvCardType.text = cardTypeName
+
+ // 闅愯棌鐢ㄦ埛鍗$壒鏈夌殑瀛楁
+ binding.llCardBalance.visibility = android.view.View.GONE
+ binding.llUserNumber.visibility = android.view.View.GONE
+ binding.llCardStatus.visibility = android.view.View.GONE
+ binding.llLastUseTime.visibility = android.view.View.GONE
+ }
+
+ /**
+ * 鑾峰彇鍗$墖绫诲瀷鍚嶇О
+ */
+ private fun getCardTypeName(cardType: String): String {
+ return when (cardType) {
+ CardCommon.USER_CARD_TYPE_1 -> "鐢ㄦ埛鍗�(寮�娉靛墠)"
+ CardCommon.USER_CARD_TYPE_2 -> "鐢ㄦ埛鍗�(寮�娉靛悗)"
+ CardCommon.USER_CARD_TYPE_3 -> "鐢ㄦ埛鍗�(鍙犲姞鍏呭��)"
+ CardCommon.REGION_CARD -> "鍖哄煙琛ㄥ彿鍗�"
+ CardCommon.ELECTRIC_PRICE_CARD -> "鍙栨暟鍗�(闇�瑕佸埛鍗″彇鏁�)"
+ CardCommon.MANAGE_CRAD -> "鍙栨暟鍗�(鍒峰崱鍙栨暟杩斿啓鎴愬姛)"
+ CardCommon.CHECK_CARD -> "妫�鏌ュ崱"
+ CardCommon.DEBUG_CARD -> "璋冭瘯鍗�"
+ CardCommon.CLEAN_CARD_TYPE -> "娓呴浂鍗�"
+ CardCommon.IP_CARD -> "IP鍦板潃璁剧疆鍗�"
+ CardCommon.AREA_CARD -> "鍖哄煙璁剧疆鍗�"
+ CardCommon.GPS_CARD -> "GPS璁剧疆鍗�"
+ CardCommon.VALVE_TIME_CARD -> "寮�鍏抽榾鏃堕棿閰嶇疆鍗�"
+ else -> "鏈煡绫诲瀷鍗$墖($cardType)"
+ }
+ }
+
+ /**
+ * 鑾峰彇鍗$墖璇︾粏淇℃伅锛堢敤鎴峰崱涓撶敤锛�
+ */
+ private fun getCardInfo(cardNumber: String, cardType: String, userCard: UserCard) {
+ val map = mutableMapOf<String, Any>()
+ map["cardAddr"] = cardNumber
+ ApiManager.getInstance().requestGetLoading(
+ this,
+ "terminal/card/readCard",
+ CardInfoResult::class.java,
+ map,
+ object : SubscriberListener<BaseResponse<CardInfoResult>>() {
+ override fun onNext(t: BaseResponse<CardInfoResult>) {
+ if (t.success) {
+ // 璇诲崱鎴愬姛锛屾樉绀虹敤鎴峰崱璇︾粏淇℃伅
+ showUserCardInfo(t.content, cardNumber, cardType, userCard)
+ } else {
+ // 澶勭悊鑾峰彇澶辫触鐨勬儏鍐�
+ handleCardInfoError(t.code, t.msg)
+ }
+ }
+
+ override fun onError(e: Throwable?) {
+ super.onError(e)
+ showConfirmDialog("鑾峰彇鍗′俊鎭け璐�: ${e?.message ?: "缃戠粶寮傚父锛岃妫�鏌ョ綉缁滆繛鎺�"}") {
+ }
+ }
+ }
+ )
+ }
+
+ /**
+ * 鏄剧ず鐢ㄦ埛鍗$墖淇℃伅锛堝寘鍚崱鍐呮暟鎹拰鎺ュ彛杩斿洖鏁版嵁锛�
+ */
+ private fun showUserCardInfo(cardInfo: CardInfoResult?, cardNumber: String, cardType: String, userCard: UserCard) {
+ // 闅愯棌璇诲崱鎻愮ず锛屾樉绀轰俊鎭尯鍩�
+ binding.cardReadLL.visibility = android.view.View.GONE
+ binding.cardInfoContainer.visibility = android.view.View.VISIBLE
+
+ val cardTypeName = getCardTypeName(cardType)
+
+ // 鏄剧ず鍗″唴鏁版嵁
+ binding.tvCardNumber.text = cardNumber
+ binding.tvCardType.text = cardTypeName
+
+ // 鏄剧ず鐢ㄦ埛鍗$壒鏈夊瓧娈�
+ binding.llCardBalance.visibility = android.view.View.VISIBLE
+ binding.llUserNumber.visibility = android.view.View.VISIBLE
+ binding.llCardStatus.visibility = android.view.View.VISIBLE
+
+ userCard.let { card ->
+ // 浣欓杞崲涓哄厓锛堝師濮嬫暟鎹彲鑳芥槸鍒嗭級
+ val balanceInYuan = if (card.balance > 1000) {
+ String.format("%.2f", card.balance / 100.0)
+ } else {
+ card.balance.toString()
+ }
+ binding.tvCardBalance.text = "${balanceInYuan}鍏�"
+
+ // 浣跨敤瀹屾暣鐨勭敤鎴风紪鍙�
+ binding.tvUserNumber.text = card.getMyUserCode()
+
+ // 鍗$墖鐘舵�侊紙鍋囪姝e父鐘舵�侊紝鍥犱负UserCard涓病鏈夌姸鎬佸瓧娈碉級
+ binding.tvCardStatus.text = "姝e父"
+ binding.tvCardStatus.setTextColor(android.graphics.Color.parseColor("#4CAF50"))
+
+ // 鍏呭�兼椂闂翠綔涓烘渶鍚庝娇鐢ㄦ椂闂�
+ if (card.rechargeDate != null) {
+ binding.llLastUseTime.visibility = android.view.View.VISIBLE
+ val dateFormat = java.text.SimpleDateFormat("yyyy-MM-dd HH:mm", java.util.Locale.getDefault())
+ binding.tvLastUseTime.text = dateFormat.format(card.rechargeDate!!.time)
+ } else {
+ binding.llLastUseTime.visibility = android.view.View.GONE
+ }
+ }
+
+ // 鏄剧ず鏈嶅姟鍣ㄦ暟鎹�
+ cardInfo?.let { info ->
+ binding.tvUserName.text = info.userName ?: "鏈煡"
+ binding.tvPhone.text = info.phone ?: "鏈粦瀹�"
+ binding.tvIdCard.text = info.userCode ?: "鏈綍鍏�" // 浣跨敤userCode浣滀负韬唤璇佸彿鐨勬浛浠�
+
+ // 鏍规嵁status瀛楁鏄剧ず鐘舵��
+ val statusText = when (info.status) {
+ 1 -> "姝e父"
+ 2 -> "鎸傚け"
+ 3 -> "閿佸畾"
+ else -> "鏈煡"
+ }
+
+ }
+ }
+
+ /**
+ * 澶勭悊鍗′俊鎭幏鍙栭敊璇�
+ */
+ private fun handleCardInfoError(code: String?, msg: String?) {
+ val errorMessage: String = when (code) {
+ "1001" -> {
+ "璇ュ崱鐗囨湭鍦ㄧ郴缁熶腑娉ㄥ唽锛岃鍏堣繘琛屽紑鍗℃搷浣溿��"
+ }
+ else -> {
+ when {
+ msg.isNullOrBlank() -> "鑾峰彇鍗′俊鎭け璐ワ紝璇烽噸鏂板埛鍗¢噸璇曘��"
+ msg.contains("鏁版嵁涓嶅瓨鍦�") -> "璇ュ崱鐗囨湭鍦ㄧ郴缁熶腑娉ㄥ唽锛岃鍏堣繘琛屽紑鍗℃搷浣溿��"
+ msg.contains("缃戠粶") -> "缃戠粶杩炴帴寮傚父锛岃妫�鏌ョ綉缁滆繛鎺ュ悗閲嶆柊鍒峰崱銆�"
+ msg.contains("瓒呮椂") -> "缃戠粶璇锋眰瓒呮椂锛岃閲嶆柊鍒峰崱閲嶈瘯銆�"
+ else -> "鑾峰彇鍗′俊鎭け璐ワ細$msg\n\n璇烽噸鏂板埛鍗¢噸璇曘��"
+ }
+ }
+ }
+
+ // 鏄剧ず閿欒淇℃伅鐨勫璇濇
+ showConfirmDialog(errorMessage) {
+ resetToReadingState()
+ }
+ }
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
index dbdc7ff..e1c384c 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
@@ -30,6 +30,10 @@
var cardType = ""
var cardAddr = ""
var cardFee = 0
+
+ // 鍏呭�肩浉鍏抽噾棰�
+ private var rechargeAmount = 0.0
+ private var bonusAmount = 0.0
//璁㈠崟缂栧彿
var orderNumber = ""
@@ -53,6 +57,11 @@
operationTypeCode = intent?.getIntExtra("operationTypeCode", -1) ?: -1
orderNumber = intent?.getStringExtra("orderNumber") ?: ""
operationType = CardOperationType.fromCode(operationTypeCode)
+
+ // 鑾峰彇鍏呭�肩浉鍏抽噾棰�
+ rechargeAmount = intent?.getDoubleExtra("rechargeAmount", 0.0) ?: 0.0
+ bonusAmount = intent?.getDoubleExtra("bonusAmount", 0.0) ?: 0.0
+
if (intent?.hasExtra("cardFee") == true) {
cardFee = intent?.getIntExtra("cardFee", 0) ?: 0
}
@@ -86,12 +95,23 @@
CardOperationType.Recharge -> {
var textData = StringBuilder()
textData.append("鐢ㄦ埛鍏呭�糪n")
- textData.append("璁㈠崟鍙凤細" + orderNumber + "\n")
- if (userCard.balance != 0) {
- val balanceInYuan = userCard.balance / 100.0 // 杞崲涓哄厓
- textData.append("鍏呭�奸噾棰濓細" + String.format("%.2f", balanceInYuan) + "鍏�")
+
+ // 鏄剧ず鍏呭�奸噾棰�
+ if (rechargeAmount > 0) {
+ textData.append("鍏呭�奸噾棰濓細" + String.format("%.2f", rechargeAmount) + "鍏僜n")
}
-
+
+ // 鏄剧ず璧犻�侀噾棰�
+ if (bonusAmount > 0) {
+ textData.append("璧犻�侀噾棰濓細" + String.format("%.2f", bonusAmount) + "鍏僜n")
+ }
+
+ // 鏄剧ず鎬婚噾棰濓紙鍐欏叆鍗″唴鐨勬�讳綑棰濓級
+ if (userCard.balance != 0) {
+ val totalBalanceInYuan = userCard.balance / 100.0 // 杞崲涓哄厓
+ textData.append("鍗″唴鎬讳綑棰濓細" + String.format("%.2f", totalBalanceInYuan) + "鍏�")
+ }
+
binding?.cardData?.text = textData.toString()
}
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 d8d053a..bd7b9f1 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
@@ -25,6 +25,7 @@
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() {
@@ -395,7 +396,13 @@
// 璁剧疆鐢ㄦ埛鍗′俊鎭�
cardInfo?.let { info ->
userCode = info.cardNum ?: ""
- balance = ((rechargeAmount + bonusAmount) * 100).toInt() // 杞崲涓哄垎
+
+ // 璁$畻鏂颁綑棰濓細鍘熸湁浣欓 + 鍏呭�奸噾棰� + 璧犻�侀噾棰�
+ val originalBalance = this@RechargeDetailActivity.userCard?.balance ?: 0 // 鍘熸湁浣欓锛堝垎锛�
+ val rechargeAmountInCents = (rechargeAmount * 100).toInt() // 鍏呭�奸噾棰濊浆鍒�
+ val bonusAmountInCents = (bonusAmount * 100).toInt() // 璧犻�侀噾棰濊浆鍒�
+
+ balance = originalBalance + rechargeAmountInCents + bonusAmountInCents
}
// 璁剧疆鍏朵粬蹇呰淇℃伅
@@ -406,22 +413,16 @@
// 鍚姩鍐欏崱Activity
val intent = Intent(this, NfcWreatActivity::class.java).apply {
- putExtra("cardType", "USER_CARD") // 鐢ㄦ埛鍗$被鍨�
+ 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)
-
- // 鏄剧ず鎴愬姛淇℃伅
- val formattedRecharge = String.format("%.2f", rechargeAmount)
- val formattedBonus = String.format("%.2f", bonusAmount)
- val formattedTotal = String.format("%.2f", rechargeAmount + bonusAmount)
-
- ToastUtil.show("鍏呭�艰鍗曞垱寤烘垚鍔焅n璁㈠崟鍙�: ${rechargeResult.orderNo}\n鍏呭�奸噾棰�: ${formattedRecharge}鍏僜n璧犻�侀噾棰�: ${formattedBonus}鍏僜n鎬婚噾棰�: ${formattedTotal}鍏僜n璇疯创鍗¤繘琛屽啓鍗℃搷浣�")
-
+
} catch (e: Exception) {
ToastUtil.show("鍚姩鍐欏崱鐣岄潰澶辫触: ${e.message}")
}
diff --git a/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt b/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt
index 7fc95f2..2466055 100644
--- a/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt
+++ b/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt
@@ -166,7 +166,7 @@
*/
fun getCardTypeAndCardNumber(): String {
return try {
- adapter.getCradTypeAndCardNumber(7)
+ adapter.getCradTypeAndCardNumber(7,0,8)
} catch (e: Exception) {
e.printStackTrace()
""
@@ -324,7 +324,7 @@
fun getUserCardData(): UserCard? {
return try {
// 鑾峰彇鍩虹鍗℃暟鎹�
- val baseCard = adapter.getUserCardData(UserCard())
+ val baseCard = adapter.getUserCardData(7,UserCard())
// 濡傛灉鑾峰彇鎴愬姛涓旀槸UserCard绫诲瀷锛屽垯杩斿洖
if (baseCard is UserCard) {
baseCard
diff --git a/generallibrary/src/main/res/layout/activity_card_read.xml b/generallibrary/src/main/res/layout/activity_card_read.xml
new file mode 100644
index 0000000..e6ab761
--- /dev/null
+++ b/generallibrary/src/main/res/layout/activity_card_read.xml
@@ -0,0 +1,375 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/base_green_bg">
+
+ <com.dayu.baselibrary.view.TitleBar
+ android:id="@+id/titleBar"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/dimen_title_height"
+ android:background="@color/title_bar_bg"
+ android:elevation="4dp"
+ app:centerText="璇诲崱" />
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_below="@+id/titleBar"
+ android:fillViewport="true">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:padding="16dp">
+
+ <!-- 璇诲崱鎻愮ず鍖哄煙 -->
+ <LinearLayout
+ android:id="@+id/card_read_LL"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:orientation="vertical"
+ android:visibility="gone">
+
+ <androidx.cardview.widget.CardView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginBottom="16dp"
+ app:cardCornerRadius="8dp"
+ app:cardElevation="2dp">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:orientation="vertical"
+ android:padding="16dp">
+
+ <TextView
+ android:id="@+id/text1"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dp"
+ android:gravity="center"
+ android:text="璇诲崱鎿嶄綔"
+ android:textColor="@color/base_blue_bg"
+ android:textSize="@dimen/big_text_size"
+ android:textStyle="bold" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="20dp"
+ android:gravity="center"
+ android:text="璇峰皢鍗¤创鍦ㄨ澶囦笂杩涜璇诲崱"
+ android:textColor="#333333"
+ android:textSize="@dimen/text_size"
+ android:textStyle="bold" />
+
+ <ImageView
+ android:layout_width="120dp"
+ android:layout_height="120dp"
+ android:layout_gravity="center"
+ android:layout_marginBottom="20dp"
+ android:scaleType="fitCenter"
+ android:src="@mipmap/nfc_write" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:text="璇蜂繚鎸佹墜鎸佹満鍜屽崱鐗囦笉瑕佺Щ鍔�"
+ android:textColor="#666666"
+ android:textSize="@dimen/new_card_size" />
+
+ </LinearLayout>
+ </androidx.cardview.widget.CardView>
+ </LinearLayout>
+
+ <!-- 鍗$墖淇℃伅鏄剧ず鍖哄煙 -->
+ <LinearLayout
+ android:id="@+id/card_info_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:visibility="visible">
+
+ <!-- 鍗″唴鏁版嵁鍖哄煙 -->
+ <androidx.cardview.widget.CardView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dp"
+ app:cardCornerRadius="8dp"
+ app:cardElevation="2dp">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="16dp">
+
+ <!-- 鎸佸崱浜� -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="2dp"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:background="#F8F9FA"
+ android:padding="12dp">
+
+ <TextView
+ android:layout_width="105dp"
+ android:layout_height="wrap_content"
+ android:text="鎸佸崱浜猴細"
+ android:textColor="#333333"
+ android:textSize="@dimen/text_size" />
+
+ <TextView
+ android:id="@+id/tv_user_name"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="--"
+ android:textColor="#666666"
+ android:textSize="@dimen/text_size" />
+ </LinearLayout>
+
+ <!-- 鍗″彿 -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="2dp"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:background="#FFFFFF"
+ android:padding="12dp">
+
+ <TextView
+ android:layout_width="105dp"
+ android:layout_height="wrap_content"
+ android:text="鍗″彿锛�"
+ android:textColor="#333333"
+ android:textSize="@dimen/text_size" />
+
+ <TextView
+ android:id="@+id/tv_card_number"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="--"
+ android:textColor="#666666"
+ android:textSize="@dimen/text_size" />
+ </LinearLayout>
+
+ <!-- 鍗$墖绫诲瀷 -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="2dp"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:background="#F8F9FA"
+ android:padding="12dp">
+
+ <TextView
+ android:layout_width="105dp"
+ android:layout_height="wrap_content"
+ android:text="鍗$被鍨嬶細"
+ android:textColor="#333333"
+ android:textSize="@dimen/text_size" />
+
+ <TextView
+ android:id="@+id/tv_card_type"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="--"
+ android:textColor="#666666"
+ android:textSize="@dimen/text_size" />
+ </LinearLayout>
+
+ <!-- 鍗″唴浣欓 -->
+ <LinearLayout
+ android:id="@+id/ll_card_balance"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="2dp"
+ android:orientation="horizontal"
+ android:visibility="visible"
+ android:gravity="center_vertical"
+ android:background="#FFFFFF"
+ android:padding="12dp">
+
+ <TextView
+ android:layout_width="105dp"
+ android:layout_height="wrap_content"
+ android:text="鍗′綑棰濓細"
+ android:textColor="#333333"
+ android:textSize="@dimen/text_size" />
+
+ <TextView
+ android:id="@+id/tv_card_balance"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="0.00鍏�"
+ android:textColor="#FF6B35"
+ android:textSize="@dimen/text_size"
+ android:textStyle="bold" />
+ </LinearLayout>
+
+ <!-- 鐢ㄦ埛缂栧彿 -->
+ <LinearLayout
+ android:id="@+id/ll_user_number"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="2dp"
+ android:orientation="horizontal"
+ android:visibility="visible"
+ android:gravity="center_vertical"
+ android:background="#F8F9FA"
+ android:padding="12dp">
+
+ <TextView
+ android:layout_width="105dp"
+ android:layout_height="wrap_content"
+ android:text="鐢ㄦ埛缂栧彿锛�"
+ android:textColor="#333333"
+ android:textSize="@dimen/text_size" />
+
+ <TextView
+ android:id="@+id/tv_user_number"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="--"
+ android:textColor="#666666"
+ android:textSize="@dimen/text_size" />
+ </LinearLayout>
+
+ <!-- 鎵嬫満鍙� -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="2dp"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:background="#FFFFFF"
+ android:padding="12dp">
+
+ <TextView
+ android:layout_width="105dp"
+ android:layout_height="wrap_content"
+ android:text="鎵嬫満鍙凤細"
+ android:textColor="#333333"
+ android:textSize="@dimen/text_size" />
+
+ <TextView
+ android:id="@+id/tv_phone"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="--"
+ android:textColor="#666666"
+ android:textSize="@dimen/text_size" />
+ </LinearLayout>
+
+ <!-- 韬唤璇佸彿 -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="2dp"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:background="#F8F9FA"
+ android:padding="12dp">
+
+ <TextView
+ android:layout_width="105dp"
+ android:layout_height="wrap_content"
+ android:text="韬唤璇佸彿锛�"
+ android:textColor="#333333"
+ android:textSize="@dimen/text_size" />
+
+ <TextView
+ android:id="@+id/tv_id_card"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="--"
+ android:textColor="#666666"
+ android:textSize="@dimen/text_size" />
+ </LinearLayout>
+
+ <!-- 鍗$墖鐘舵�� -->
+ <LinearLayout
+ android:id="@+id/ll_card_status"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="2dp"
+ android:orientation="horizontal"
+ android:visibility="visible"
+ android:gravity="center_vertical"
+ android:background="#FFFFFF"
+ android:padding="12dp">
+
+ <TextView
+ android:layout_width="105dp"
+ android:layout_height="wrap_content"
+ android:text="鍗$墖鐘舵�侊細"
+ android:textColor="#333333"
+ android:textSize="@dimen/text_size" />
+
+ <TextView
+ android:id="@+id/tv_card_status"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="姝e父"
+ android:textColor="#4CAF50"
+ android:textSize="@dimen/text_size" />
+ </LinearLayout>
+
+ <!-- 鏈�鍚庝娇鐢ㄦ椂闂� -->
+ <LinearLayout
+ android:id="@+id/ll_last_use_time"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="2dp"
+ android:orientation="horizontal"
+ android:visibility="visible"
+ android:gravity="center_vertical"
+ android:background="#F8F9FA"
+ android:padding="12dp">
+
+ <TextView
+ android:layout_width="105dp"
+ android:layout_height="wrap_content"
+ android:text="鏈�鍚庡厖鍊兼椂闂达細"
+ android:textColor="#333333"
+ android:textSize="@dimen/text_size" />
+
+ <TextView
+ android:id="@+id/tv_last_use_time"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="--"
+ android:textColor="#666666"
+ android:textSize="@dimen/text_size" />
+ </LinearLayout>
+
+ </LinearLayout>
+ </androidx.cardview.widget.CardView>
+
+
+ </LinearLayout>
+
+ </LinearLayout>
+ </ScrollView>
+
+</RelativeLayout>
\ No newline at end of file
--
Gitblit v1.8.0