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