From 20952db304d0f71e1ce25f3b82114bbadff1ad4a Mon Sep 17 00:00:00 2001 From: zuoxiao <470321431@qq.com> Date: 星期五, 20 六月 2025 16:51:54 +0800 Subject: [PATCH] feat(generallibrary): 补充补卡功能 --- generallibrary/src/main/java/com/dayu/general/view/CardRefundDialog.kt | 76 -- generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt | 4 generallibrary/src/main/java/com/dayu/general/activity/SearchCardListActivity.kt | 54 + generallibrary/src/main/AndroidManifest.xml | 13 generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt | 16 generallibrary/src/main/res/layout/activity_card_replace.xml | 429 ++++++++++++++++++- generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt | 516 +++++++++++++++++++++++ generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt | 38 + generallibrary/src/main/java/com/dayu/general/activity/CardUnlossActivity.kt | 61 -- generallibrary/src/main/java/com/dayu/general/activity/CardLossActivity.kt | 60 +- 10 files changed, 1,076 insertions(+), 191 deletions(-) diff --git a/generallibrary/src/main/AndroidManifest.xml b/generallibrary/src/main/AndroidManifest.xml index 3d88ae9..24cbef4 100644 --- a/generallibrary/src/main/AndroidManifest.xml +++ b/generallibrary/src/main/AndroidManifest.xml @@ -90,7 +90,7 @@ <!-- 鍐欏崱鎴愬姛椤甸潰 --> <activity android:name=".activity.CardWriteSuccessActivity" /> <!-- 鎸傚け椤甸潰 --> - <activity android:name=".activity.LossCardActivity" /> + <activity android:name=".activity.CardLossActivity" /> <!-- 璇诲崱椤甸潰 --> <activity android:name=".activity.CardReadActivity" @@ -136,9 +136,18 @@ </intent-filter> </activity> <activity - android:name=".activity.UnlossCardActivity" + android:name=".activity.CardUnlossActivity" android:exported="false" android:launchMode="singleTop"/> + <activity android:name=".activity.CardReplaceActivity" + 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 8a14a09..4bf08d0 100644 --- a/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt +++ b/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt @@ -79,7 +79,7 @@ // 鎸傚け鍗℃寜閽偣鍑讳簨浠� binding.homeLossLL.setOnClickListener { // 璺宠浆鍒版寕澶卞崱椤甸潰 - val intent = Intent(context, LossCardActivity::class.java) + val intent = Intent(context, CardLossActivity::class.java) startActivity(intent) } @@ -108,7 +108,7 @@ } binding.homeReplacement.setOnClickListener { context?.let { - val intent = Intent(context, UnlossCardActivity::class.java) + val intent = Intent(context, CardUnlossActivity::class.java) startActivity(intent) } } diff --git a/generallibrary/src/main/java/com/dayu/general/activity/LossCardActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardLossActivity.kt similarity index 86% rename from generallibrary/src/main/java/com/dayu/general/activity/LossCardActivity.kt rename to generallibrary/src/main/java/com/dayu/general/activity/CardLossActivity.kt index a2696e3..eb69ea2 100644 --- a/generallibrary/src/main/java/com/dayu/general/activity/LossCardActivity.kt +++ b/generallibrary/src/main/java/com/dayu/general/activity/CardLossActivity.kt @@ -22,7 +22,7 @@ * Author: zuo * Date: 2025/6/11 */ -class LossCardActivity : BaseActivity() { +class CardLossActivity : BaseActivity() { var binding: ActivityCardListBinding? = null private var cardAdapter: CardListAdapter? = null @@ -82,7 +82,7 @@ private fun setupRecyclerView() { cardAdapter = CardListAdapter(this) binding?.recyclerView?.apply { - layoutManager = LinearLayoutManager(this@LossCardActivity) + layoutManager = LinearLayoutManager(this@CardLossActivity) adapter = cardAdapter } @@ -96,13 +96,11 @@ card.cardNum.toString(), card.money.toString() ) - refundDialog.setOnConfirmListener { refundAmount, remark -> - // TODO: 澶勭悊閫�娆鹃�昏緫 - lossPost(card.idCard.toString()) + refundDialog.setOnConfirmListener { _username, cardNumber, balance, refundAmount, remark -> + // 璋冪敤鎸傚け鎺ュ彛 + lossPost(cardNumber, balance, refundAmount, remark) } } - - } private fun setupRefreshLayout() { @@ -247,38 +245,56 @@ ) } - - private fun lossPost(cardNumber: String) { + /** + * 鎵ц鎸傚け鎿嶄綔 + * @param cardNumber 鍗″彿 + * @param balance 浣欓 + * @param refundAmount 閫�娆鹃噾棰� + * @param remark 澶囨敞 + */ + private fun lossPost(cardNumber: String, balance: String, refundAmount: String, remark: String) { val map = mutableMapOf<String, Any>() map["cardNum"] = cardNumber + + // 澶勭悊浣欓鏍煎紡锛屽幓闄ゅ崈浣嶅垎闅旂閫楀彿鍜�"鍏�"瀛楃 + val balanceValue = balance.replace("鍏�", "").replace(",", "").toFloatOrNull() ?: 0f + map["money"] = balanceValue + + map["refund"] = refundAmount.toFloatOrNull() ?: 0f + map["remarks"] = remark.ifEmpty { "鎸傚け" } map["operator"] = BaseApplication.userId - ApiManager.getInstance().requestGetLoading( + + ApiManager.getInstance().requestPostLoading( this, - "/sell/card/loss", - SearchCardResult::class.java, + "terminal/card/termReportLoss", + ReportLossResult::class.java, map, - object : SubscriberListener<BaseResponse<SearchCardResult>>() { - override fun onNext(t: BaseResponse<SearchCardResult>) { - - - if (t.success) { - + object : SubscriberListener<BaseResponse<ReportLossResult>>() { + override fun onNext(t: BaseResponse<ReportLossResult>) { + if (t.success && t.code == "0001") { + ToastUtil.show("鎸傚け鎴愬姛") + // 鍒锋柊鍒楄〃鏁版嵁 + searchCards(currentFarmerId, currentFarmerName, currentCardNumber, true) } else { - // 澶勭悊鎼滅储澶辫触鐨勬儏鍐� - ToastUtil.show(t.msg) + ToastUtil.show(t.msg ?: "鎸傚け澶辫触") } } override fun onError(e: Throwable?) { super.onError(e) - // 瀹屾垚鍒锋柊鎴栧姞杞藉姩浣� - ToastUtil.show("鎼滅储澶辫触: ${e?.message ?: "鏈煡閿欒"}") + ToastUtil.show("鎸傚け澶辫触: ${e?.message ?: "缃戠粶閿欒"}") } } ) } + /** + * 鎸傚け鎺ュ彛杩斿洖缁撴灉 + */ + data class ReportLossResult( + val content: Boolean? = null + ) /** * 瀹屾垚鍒锋柊鎴栧姞杞芥搷浣� diff --git a/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt new file mode 100644 index 0000000..2e02be0 --- /dev/null +++ b/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt @@ -0,0 +1,516 @@ +package com.dayu.general.activity + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.util.TypedValue +import android.view.View +import android.widget.RadioButton +import android.widget.Toast +import com.dayu.baselibrary.net.subscribers.SubscriberListener +import com.dayu.baselibrary.utils.MornyUtil +import com.dayu.baselibrary.utils.ToastUtil +import com.dayu.baselibrary.view.TipDialog +import com.dayu.baselibrary.view.TitleBar +import com.dayu.general.BaseApplication +import com.dayu.general.R +import com.dayu.general.bean.card.UserCard +import com.dayu.general.bean.net.CardInfoResult +import com.dayu.general.bean.net.CardReplaceResult +import com.dayu.general.bean.net.PaymentMethod +import com.dayu.general.bean.net.PaymentMethodResponse +import com.dayu.general.databinding.ActivityCardReplaceBinding +import com.dayu.general.net.ApiManager +import com.dayu.general.net.BaseResponse +import com.dayu.general.tool.CardCommon +import com.dayu.general.tool.CardOperationType +import com.dayu.general.tool.NfcReadHelper + +/** + * @author: zuo + * @desc: 琛ュ崱Activity + * @since: 2025/6/17 + */ +class CardReplaceActivity : BaseNfcActivity() { + private lateinit var binding: ActivityCardReplaceBinding + private var cardNumber: String? = null + private var cardInfo: CardInfoResult? = null + private var userCard: UserCard? = null + + // 鏀粯鏂瑰紡鐩稿叧灞炴�� + private var paymentMethod: String = "鐜伴噾" + private var paymentId: Long = 0 + private var paymentMethodList: List<PaymentMethod> = listOf() + + companion object { + /** + * 鍚姩琛ュ崱Activity + */ + fun start(context: Context) { + val intent = Intent(context, CardReplaceActivity::class.java) + context.startActivity(intent) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityCardReplaceBinding.inflate(layoutInflater) + setContentView(binding.root) + + initView() + // 鑾峰彇鏀粯鏂瑰紡 + getPaymentMethods() + } + + private fun initView() { + // 璁剧疆TitleBar鐨勮繑鍥炴寜閽偣鍑讳簨浠� + binding.titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) { + finish() + } + + // 璁剧疆琛ュ崱鎸夐挳鐐瑰嚮浜嬩欢 + binding.btnReplace.setOnClickListener { + performCardReplace() + } + } + + /** + * 鑾峰彇鏀粯鏂瑰紡鍒楄〃 + */ + 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@CardReplaceActivity, + "鑾峰彇鏀粯鏂瑰紡澶辫触: ${response.msg}", + Toast.LENGTH_SHORT + ).show() + } + } + + override fun onError(e: Throwable?) { + super.onError(e) + Toast.makeText( + this@CardReplaceActivity, + "鑾峰彇鏀粯鏂瑰紡澶辫触: ${e?.message ?: "缃戠粶寮傚父"}", + Toast.LENGTH_SHORT + ).show() + } + } + ) + } + + /** + * 鏇存柊鏀粯鏂瑰紡RadioGroup + */ + private fun updatePaymentMethodRadioGroup() { + // 娓呯┖鍘熸湁RadioButton + binding.paymentMethodGroup.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.paymentMethodGroup.addView(radioButton) + + // 榛樿閫変腑绗竴涓� + if (index == 0) { + radioButton.isChecked = true + paymentMethod = method.name + paymentId = method.id + } + } + + // 璁剧疆鏀粯鏂瑰紡閫夋嫨鐩戝惉 + binding.paymentMethodGroup.setOnCheckedChangeListener { group, checkedId -> + // 鏍规嵁閫変腑鐨処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 + } + } + } + } + + /** + * 閲嶇疆鍒拌鍗$姸鎬� + */ + private fun resetToReadingState() { + binding.scrollReadCard.visibility = android.view.View.VISIBLE + binding.cardInfoContainer.visibility = android.view.View.GONE + binding.bottomButtonContainer.visibility = android.view.View.GONE + cardNumber = null + cardInfo = null + binding.etCardCost.setText("") + binding.etReturnAmount.setText("0") + } + + /** + * 鏄剧ず纭瀵硅瘽妗� + */ + private fun showConfirmDialog(message: String, onConfirm: () -> Unit) { + val confirmDialog = TipDialog(this, message) { + onConfirm() + } + confirmDialog.show() + } + + override fun onNfcBack(intent: Intent?) { + intent?.let { + // 澶勭悊姝e父鐨勮鍗℃搷浣� + 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瀽鍗″唴鏁版嵁骞惰皟鐢ㄦ帴鍙� + showConfirmDialog("璇ュ崱鐗囩被鍨嬩笉鏀寔琛ュ崱鎿嶄綔") { + resetToReadingState() + } + } + else -> { + // 绠$悊绫诲崱涓嶆敮鎸佽ˉ鍗� + handleUserCard(cardNumber, cardType, nfcAdapter) + } + } + } 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 + } + + // 杈撳嚭鐢ㄦ埛鍗″唴鎵�鏈変俊鎭埌鏃ュ織 + android.util.Log.d("CardReplaceActivity", "=== 鐢ㄦ埛鍗′俊鎭� ===") + android.util.Log.d("CardReplaceActivity", "鍗″彿: $cardNumber") + android.util.Log.d("CardReplaceActivity", "鍗$墖绫诲瀷: $cardType") + android.util.Log.d("CardReplaceActivity", "鍗″唴浣欓: ${userCard.balance}") + android.util.Log.d("CardReplaceActivity", "==================") + this.userCard = userCard + // 鏍规嵁鍗″彿鑾峰彇鍗$墖璇︾粏淇℃伅 + getCardInfo(cardNumber, cardType, userCard) + } + + /** + * 鑾峰彇鍗$墖璇︾粏淇℃伅锛堢敤鎴峰崱涓撶敤锛� + */ + 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.scrollReadCard.visibility = android.view.View.GONE + binding.cardInfoContainer.visibility = android.view.View.VISIBLE + binding.bottomButtonContainer.visibility = android.view.View.VISIBLE + + this.cardInfo = cardInfo + + // 鏄剧ず褰撳墠鍗″湴鍧� + binding.tvCurrentCardAddress.text = cardNumber + + // 鏄剧ず鏈嶅姟鍣ㄦ暟鎹� + cardInfo?.let { info -> + binding.tvUserName.text = info.userName ?: "鏈煡" + binding.tvPhone.text = info.phone ?: "鏈粦瀹�" + + // 鏍规嵁state瀛楁鏄剧ず鐘舵�� + val (statusText, statusColor) = when (info.state) { + 1 -> Pair("姝e父", android.graphics.Color.parseColor("#4CAF50")) // 缁胯壊 + 2 -> Pair("宸叉敞閿�", android.graphics.Color.parseColor("#FF5722")) // 娣辨鑹� + 3 -> Pair("宸叉寕澶�", android.graphics.Color.parseColor("#FF9800")) // 姗欒壊 + 4 -> Pair("鏃犳晥鍗$墖", android.graphics.Color.parseColor("#F44336")) // 绾㈣壊 + else -> Pair("鏈煡鐘舵��", android.graphics.Color.parseColor("#9E9E9E")) // 鐏拌壊 + } + binding.tvCardStatus.text = statusText + binding.tvCardStatus.setTextColor(statusColor) + } + + userCard.let { card -> + // 浣欓杞崲涓哄厓锛堝師濮嬫暟鎹彲鑳芥槸鍒嗭級 + binding.tvCardBalance.text = MornyUtil.changeF2Y(card.balance) + "鍏�" + } + } + + /** + * 澶勭悊鍗′俊鎭幏鍙栭敊璇� + */ + 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() + } + } + + /** + * 鎵ц琛ュ崱鎿嶄綔 + */ + private fun performCardReplace() { + // 楠岃瘉杈撳叆 + val cardCostStr = binding.etCardCost.text.toString().trim() + val returnAmountStr = binding.etReturnAmount.text.toString().trim() + + // 宸ユ湰璐归獙璇侊紙蹇呭~锛� + if (cardCostStr.isEmpty()) { + ToastUtil.show("璇疯緭鍏ュ伐鏈垂") + return + } + + val cardCost = try { + val cost = cardCostStr.toDouble() + if (cost < 0) { + ToastUtil.show("宸ユ湰璐逛笉鑳戒负璐熸暟") + return + } + cost + } catch (e: NumberFormatException) { + ToastUtil.show("璇疯緭鍏ユ湁鏁堢殑宸ユ湰璐�") + return + } + + // 杩斿洖閲戦楠岃瘉锛堝繀濉級 + if (returnAmountStr.isEmpty()) { + ToastUtil.show("璇疯緭鍏ヨ繑鍥為噾棰�") + return + } + + val returnAmount = try { + val amount = returnAmountStr.toDouble() + if (amount < 0) { + ToastUtil.show("杩斿洖閲戦涓嶈兘涓鸿礋鏁�") + return + } + amount + } catch (e: NumberFormatException) { + ToastUtil.show("璇疯緭鍏ユ湁鏁堢殑杩斿洖閲戦") + return + } + + callReplaceCardApi(cardCost, returnAmount) + } + + /** + * 璋冪敤琛ュ崱API鎺ュ彛 + */ + private fun callReplaceCardApi(cardCost: Double, returnAmount: Double) { + if (cardNumber.isNullOrBlank()) { + ToastUtil.show("鍗″彿淇℃伅寮傚父锛岃閲嶆柊鍒峰崱") + return + } + + val map = mutableMapOf<String, Any>() + map["cardAddr"] = cardNumber!! + map["cardNum"] = cardInfo?.cardNum.toString() + map["cardCost"] = cardCost + map["returnAmount"] = returnAmount // 浣跨敤杩斿洖閲戦 + map["paymentId"] = paymentId // 浣跨敤閫変腑鐨勬敮浠樻柟寮廔D + map["paymentMethod"] = paymentMethod // 娣诲姞鏀粯鏂瑰紡鍚嶇О + map["remarks"] = "琛ュ崱鎿嶄綔" // 鍥哄畾澶囨敞 + map["operator"] = BaseApplication.userId + + ApiManager.getInstance().requestPostLoading( + this, + "terminal/card/termReissue", + CardReplaceResult::class.java, + map, + object : SubscriberListener<BaseResponse<CardReplaceResult>>() { + override fun onNext(t: BaseResponse<CardReplaceResult>) { + if (t.success && t.content != null) { + // 琛ュ崱鎴愬姛锛岃烦杞埌鍐欏崱鐣岄潰 + startWriteCardActivity(t.content!!, cardCost, returnAmount, userCard!!) + } else { + // 琛ュ崱澶辫触 + val errorMsg = if (t.msg.isNullOrBlank()) "琛ュ崱澶辫触锛岃閲嶈瘯" else t.msg + showConfirmDialog("琛ュ崱澶辫触锛�$errorMsg") { + } + } + } + + override fun onError(e: Throwable?) { + super.onError(e) + showConfirmDialog("琛ュ崱璇锋眰澶辫触: ${e?.message ?: "缃戠粶寮傚父锛岃妫�鏌ョ綉缁滆繛鎺�"}") { + } + } + } + ) + } + + /** + * 璺宠浆鍒板啓鍗$晫闈㈣繘琛屽崱鍐呭鏇存柊 + */ + private fun startWriteCardActivity( + replaceResult: CardReplaceResult, + cardCost: Double, + returnAmount: Double, + userCard: UserCard + ) { + // 鍒涘缓鏇存柊鍚庣殑鐢ㄦ埛鍗℃暟鎹� + val updatedUserCard = UserCard().apply { + // 澶嶅埗鍘熸湁灞炴�� + cardType = userCard.cardType + areaNumber = userCard.areaNumber + userCode = userCard.userCode + userCodeNumber = userCard.userCodeNumber + phoneNumber = userCard.phoneNumber + projectCode = userCard.projectCode + surplusWater = userCard.surplusWater + waterPrice = userCard.waterPrice + electricPrice = userCard.electricPrice + rechargeDate = userCard.rechargeDate + + // 浣跨敤杩斿洖鐨勬柊浣欓 + balance = MornyUtil.changeY2F(replaceResult.balance.toString()) + } + + val intent = Intent(this, NfcWreatActivity::class.java).apply { + putExtra("cardAddr", cardNumber) + putExtra("operationTypeCode", CardOperationType.ReplaceCard.code) // 浣跨敤琛ュ崱绫诲瀷杩涜鍐欏崱 + putExtra("orderNumber", replaceResult.orderNo) + putExtra("cardCost", cardCost) + putExtra("returnAmount", returnAmount) // 浼犻�掕繑鍥為噾棰� + putExtra("paymentMethod", paymentMethod) // 浼犻�掓敮浠樻柟寮� + putExtra("paymentId", paymentId) // 浼犻�掓敮浠樻柟寮廔D + putExtra("userCard", updatedUserCard as java.io.Serializable) + } + startActivity(intent) + finish() + } +} \ No newline at end of file diff --git a/generallibrary/src/main/java/com/dayu/general/activity/UnlossCardActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardUnlossActivity.kt similarity index 85% rename from generallibrary/src/main/java/com/dayu/general/activity/UnlossCardActivity.kt rename to generallibrary/src/main/java/com/dayu/general/activity/CardUnlossActivity.kt index fee60df..b0704ac 100644 --- a/generallibrary/src/main/java/com/dayu/general/activity/UnlossCardActivity.kt +++ b/generallibrary/src/main/java/com/dayu/general/activity/CardUnlossActivity.kt @@ -22,7 +22,7 @@ * Author: zuo * Date: 2025/6/11 */ -class UnlossCardActivity : BaseActivity() { +class CardUnlossActivity : BaseActivity() { var binding: ActivityCardListBinding? = null private var cardAdapter: UnlossCardListAdapter? = null @@ -88,7 +88,7 @@ private fun setupRecyclerView() { cardAdapter = UnlossCardListAdapter(this) binding?.recyclerView?.apply { - layoutManager = LinearLayoutManager(this@UnlossCardActivity) + layoutManager = LinearLayoutManager(this@CardUnlossActivity) adapter = cardAdapter } @@ -99,7 +99,8 @@ // 璁剧疆琛ュ崱鎸夐挳鐐瑰嚮浜嬩欢 cardAdapter?.setOnReplaceClickListener { card -> - showReplaceConfirmDialog(card) + + CardReplaceActivity.start(this) } } @@ -263,26 +264,7 @@ confirmDialog.show() } - /** - * 鏄剧ず琛ュ崱纭瀵硅瘽妗� - */ - private fun showReplaceConfirmDialog(card: SearchCardResult.CardInfo) { - val confirmMessage = "纭瑕佽ˉ鍔炴柊鍗″悧锛焅n\n" + - "鍗″彿锛�${card.cardNum ?: "鏃�"}\n" + - "鎸佸崱浜猴細${card.clientName ?: "鏈煡"}\n" + - "浣欓锛�${card.money ?: "0.00"}鍏僜n\n" + - "琛ュ崱鍚庡皢鐢熸垚鏂扮殑鍗$墖锛屽師鍗′綔搴燂紒" - val confirmDialog = ConfirmDialog( - this, - "琛ュ崱纭", - confirmMessage - ) { - // 鐢ㄦ埛鐐瑰嚮纭鍚庢墽琛岃ˉ鍗℃搷浣� - replaceCard(card) - } - confirmDialog.show() - } /** * 瑙i櫎鎸傚け @@ -315,41 +297,6 @@ override fun onError(e: Throwable?) { super.onError(e) ToastUtil.show("瑙i櫎鎸傚け澶辫触: ${e?.message ?: "鏈煡閿欒"}") - } - } - ) - } - - /** - * 琛ュ崱 - */ - private fun replaceCard(card: SearchCardResult.CardInfo) { - val map = mutableMapOf<String, Any>() - map["cardNum"] = card.cardNum.toString() - map["operator"] = BaseApplication.userId - - ApiManager.getInstance().requestGetLoading( - this, - "/sell/card/replace", - SearchCardResult::class.java, - map, - object : SubscriberListener<BaseResponse<SearchCardResult>>() { - override fun onNext(t: BaseResponse<SearchCardResult>) { - if (t.success) { - ToastUtil.show("琛ュ崱鎴愬姛") - // 鍒锋柊鍒楄〃 - currentPage = 1 - hasMoreData = true - binding?.refreshLayout?.resetNoMoreData() - searchCards(currentFarmerId, currentFarmerName, currentCardNumber, true) - } else { - ToastUtil.show(t.msg) - } - } - - override fun onError(e: Throwable?) { - super.onError(e) - ToastUtil.show("琛ュ崱澶辫触: ${e?.message ?: "鏈煡閿欒"}") } } ) diff --git a/generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt index 5775875..3dbd8ca 100644 --- a/generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt +++ b/generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt @@ -85,6 +85,22 @@ binding.successMessage.text = message } + CardOperationType.ReplaceCard -> { + // 璁剧疆鏍囬 + binding.titleBar.setCenterText("琛ュ崱鎴愬姛") + + // 璁剧疆鎴愬姛淇℃伅 + binding.successTitle.text = "琛ュ崱鎴愬姛" + + // 璁剧疆璇︾粏淇℃伅 + val message = if (cardNumber.isNullOrBlank()) { + "琛ュ崱鎿嶄綔宸叉垚鍔熷畬鎴怽n鏂板崱宸插啓鍏ユ暟鎹紝鍙甯镐娇鐢�" + } else { + "琛ュ崱鎿嶄綔宸叉垚鍔熷畬鎴怽n鍗″彿锛�$cardNumber\n鏂板崱宸插啓鍏ユ暟鎹紝鍙甯镐娇鐢�" + } + binding.successMessage.text = message + } + CardOperationType.Recharge -> { binding.titleBar.setCenterText("鍐欏崱鎴愬姛") binding.successTitle.text = "鍐欏崱鎴愬姛" 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 a464809..1ccb366 100644 --- a/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt +++ b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt @@ -44,6 +44,10 @@ // 琛ユ墸鐩稿叧淇℃伅 private var deductAmount = 0.0 + // 琛ュ崱鐩稿叧淇℃伅 + private var cardCost = 0.0 + private var reissueAmount = 0.0 + //璁㈠崟缂栧彿 var orderNumber = "" private lateinit var userCard: UserCard @@ -80,6 +84,10 @@ // 鑾峰彇琛ユ墸鐩稿叧淇℃伅 deductAmount = intent?.getDoubleExtra("deductAmount", 0.0) ?: 0.0 + + // 鑾峰彇琛ュ崱鐩稿叧淇℃伅 + cardCost = intent?.getDoubleExtra("cardCost", 0.0) ?: 0.0 + reissueAmount = intent?.getDoubleExtra("reissueAmount", 0.0) ?: 0.0 if (intent?.hasExtra("cardFee") == true) { cardFee = intent?.getIntExtra("cardFee", 0) ?: 0 @@ -185,8 +193,20 @@ binding?.cardData?.text = textData.toString() } + CardOperationType.ReplaceCard -> { + var textData = StringBuilder() + textData.append("琛ュ崱\n") + textData.append("鍗″唴浣欓锛�" + MornyUtil.changeF2Y(userCard.balance) + "鍏僜n") + if (cardCost > 0) { + textData.append("宸ユ湰璐癸細" + String.format("%.2f", cardCost) + "鍏僜n") + } + if (reissueAmount > 0) { + textData.append("琛ュ崱閲戦锛�" + String.format("%.2f", reissueAmount) + "鍏�") + } + binding?.cardData?.text = textData.toString() + } + CardOperationType.CheckCard -> TODO() - CardOperationType.ReplaceCard -> TODO() null -> TODO() } } @@ -297,8 +317,22 @@ }) } + CardOperationType.ReplaceCard -> { + nfcWreatHelper.writeUserDataAsync(userCard, object : NFCCallBack { + override fun isSusses(flag: Boolean, msg: String?) { + // 纭繚Toast鍦ㄤ富绾跨▼涓皟鐢� + runOnUiThread { + if (flag) { + postCardData(cardAddr) + } else { + ToastUtil.show("琛ュ崱鍐欏崱澶辫触: ${msg ?: "鏈煡閿欒"}") + } + } + } + }) + } + CardOperationType.CheckCard -> TODO() - CardOperationType.ReplaceCard -> TODO() null -> TODO() } } else { diff --git a/generallibrary/src/main/java/com/dayu/general/activity/SearchCardListActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/SearchCardListActivity.kt index 58f452c..8139100 100644 --- a/generallibrary/src/main/java/com/dayu/general/activity/SearchCardListActivity.kt +++ b/generallibrary/src/main/java/com/dayu/general/activity/SearchCardListActivity.kt @@ -90,9 +90,9 @@ card.cardNum.toString(), card.money.toString() ) - refundDialog.setOnConfirmListener { refundAmount, remark -> - // TODO: 澶勭悊閫�娆鹃�昏緫 - lossPost(card.idCard.toString()) + refundDialog.setOnConfirmListener { _username, cardNumber, balance, refundAmount, remark -> + // 璋冪敤鎸傚け鎺ュ彛 + lossPost(cardNumber, balance, refundAmount, remark) } } @@ -217,38 +217,56 @@ ) } - - private fun lossPost(cardNumber: String) { + /** + * 鎵ц鎸傚け鎿嶄綔 + * @param cardNumber 鍗″彿 + * @param balance 浣欓 + * @param refundAmount 閫�娆鹃噾棰� + * @param remark 澶囨敞 + */ + private fun lossPost(cardNumber: String, balance: String, refundAmount: String, remark: String) { val map = mutableMapOf<String, Any>() map["cardNum"] = cardNumber + + // 澶勭悊浣欓鏍煎紡锛屽幓闄ゅ崈浣嶅垎闅旂閫楀彿鍜�"鍏�"瀛楃 + val balanceValue = balance.replace("鍏�", "").replace(",", "").toFloatOrNull() ?: 0f + map["money"] = balanceValue + + map["refund"] = refundAmount.toFloatOrNull() ?: 0f + map["remarks"] = remark.ifEmpty { "鎸傚け" } map["operator"] = BaseApplication.userId - ApiManager.getInstance().requestGetLoading( + + ApiManager.getInstance().requestPostLoading( this, - "/sell/card/loss", - SearchCardResult::class.java, + "sell/card/loss", + ReportLossResult::class.java, map, - object : SubscriberListener<BaseResponse<SearchCardResult>>() { - override fun onNext(t: BaseResponse<SearchCardResult>) { - - - if (t.success) { - + object : SubscriberListener<BaseResponse<ReportLossResult>>() { + override fun onNext(t: BaseResponse<ReportLossResult>) { + if (t.success && t.code == "0001") { + ToastUtil.show("鎸傚け鎴愬姛") + // 鍒锋柊鍒楄〃鏁版嵁 + searchCards(currentFarmerId, currentFarmerName, currentCardNumber, true) } else { - // 澶勭悊鎼滅储澶辫触鐨勬儏鍐� - ToastUtil.show(t.msg) + ToastUtil.show(t.msg ?: "鎸傚け澶辫触") } } override fun onError(e: Throwable?) { super.onError(e) - // 瀹屾垚鍒锋柊鎴栧姞杞藉姩浣� - ToastUtil.show("鎼滅储澶辫触: ${e?.message ?: "鏈煡閿欒"}") + ToastUtil.show("鎸傚け澶辫触: ${e?.message ?: "缃戠粶閿欒"}") } } ) } + /** + * 鎸傚け鎺ュ彛杩斿洖缁撴灉 + */ + data class ReportLossResult( + val content: Boolean? = null + ) /** * 瀹屾垚鍒锋柊鎴栧姞杞芥搷浣� diff --git a/generallibrary/src/main/java/com/dayu/general/view/CardRefundDialog.kt b/generallibrary/src/main/java/com/dayu/general/view/CardRefundDialog.kt index bb69c99..a6508be 100644 --- a/generallibrary/src/main/java/com/dayu/general/view/CardRefundDialog.kt +++ b/generallibrary/src/main/java/com/dayu/general/view/CardRefundDialog.kt @@ -5,21 +5,15 @@ import android.os.Bundle import android.view.Gravity import android.view.WindowManager -import com.dayu.baselibrary.net.subscribers.SubscriberListener -import com.dayu.baselibrary.utils.ToastUtil -import com.dayu.general.BaseApplication import com.dayu.general.R import com.dayu.general.databinding.DialogCardRefundBinding -import com.dayu.general.net.ApiManager -import com.dayu.general.net.BaseResponse /** *鍗$墖鎸傚け瀵硅瘽妗� */ class CardRefundDialog(context: Context) : Dialog(context) { private var binding: DialogCardRefundBinding? = null - private var onConfirmListener: ((String, String) -> Unit)? = null - private var onSuccessListener: (() -> Unit)? = null + private var onConfirmListener: ((String, String, String, String, String) -> Unit)? = null private var username: String? = null private var cardNumber: String? = null private var balance: String? = null @@ -47,8 +41,15 @@ val refundAmount = binding?.etRefundAmount?.text.toString() val remark = binding?.etRemark?.text.toString() - // 璋冪敤鎸傚け鎺ュ彛 - callReportLossApi(refundAmount, remark) + // 閫氳繃鍥炶皟灏嗘暟鎹紶閫掔粰Activity澶勭悊 + username?.let { username -> + cardNumber?.let { cardNumber -> + balance?.let { balance -> + onConfirmListener?.invoke(username, cardNumber, balance, refundAmount, remark) + dismiss() + } + } + } } // 濡傛灉鏈夐璁剧殑鐢ㄦ埛淇℃伅锛岃缃畠浠� @@ -80,58 +81,11 @@ } } - fun setOnConfirmListener(listener: (String, String) -> Unit) { + /** + * 璁剧疆纭鐩戝惉鍣� + * @param listener 鍥炶皟鍑芥暟锛屽弬鏁颁负锛氱敤鎴峰悕銆佸崱鍙枫�佷綑棰濄�侀��娆鹃噾棰濄�佸娉� + */ + fun setOnConfirmListener(listener: (String, String, String, String, String) -> Unit) { onConfirmListener = listener } - - fun setOnSuccessListener(listener: () -> Unit) { - onSuccessListener = listener - } - - /** - * 璋冪敤鎸傚け鎺ュ彛 - */ - private fun callReportLossApi(refundAmount: String, remark: String) { - val params = mutableMapOf<String, Any>() - params["cardNum"] = cardNumber ?: "" - - // 澶勭悊浣欓鏍煎紡锛屽幓闄ゅ崈浣嶅垎闅旂閫楀彿鍜�"鍏�"瀛楃 - val balanceValue = balance?.replace("鍏�", "")?.replace(",", "")?.toFloatOrNull() ?: 0f - params["money"] = balanceValue - - params["refund"] = refundAmount.toFloatOrNull() ?: 0f - params["remarks"] = remark.ifEmpty { "鎸傚け" } - params["operator"] = BaseApplication.userId - - ApiManager.getInstance().requestPostLoading( - context, - "terminal/card/termReportLoss", - ReportLossResult::class.java, - params, - object : SubscriberListener<BaseResponse<ReportLossResult>>() { - override fun onNext(response: BaseResponse<ReportLossResult>) { - if (response.success && response.code == "0001") { - ToastUtil.show("鎸傚け鎴愬姛") - onConfirmListener?.invoke(refundAmount, remark) - onSuccessListener?.invoke() - dismiss() - } else { - ToastUtil.show(response.msg ?: "鎸傚け澶辫触") - } - } - - override fun onError(e: Throwable?) { - super.onError(e) - ToastUtil.show("鎸傚け澶辫触: ${e?.message ?: "缃戠粶閿欒"}") - } - } - ) - } - - /** - * 鎸傚け鎺ュ彛杩斿洖缁撴灉 - */ - data class ReportLossResult( - val content: Boolean? = null - ) } \ No newline at end of file diff --git a/generallibrary/src/main/res/layout/activity_card_replace.xml b/generallibrary/src/main/res/layout/activity_card_replace.xml index 9d31abe..8146c65 100644 --- a/generallibrary/src/main/res/layout/activity_card_replace.xml +++ b/generallibrary/src/main/res/layout/activity_card_replace.xml @@ -1,49 +1,424 @@ <?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" +<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/white" - android:orientation="vertical"> + 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" - app:centerText="琛ュ崱" /> + android:background="@color/title_bar_bg" + android:elevation="4dp" + app:centerText="琛ュ崱" + app:leftImage="@mipmap/icon_back" /> - - - <FrameLayout + <!-- 璇诲崱鎻愮ず鍖哄煙 - 鍏ㄥ睆鏄剧ず --> + <ScrollView + android:id="@+id/scroll_read_card" android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1"> + android:layout_height="match_parent" + android:layout_below="@+id/titleBar" + android:fillViewport="true" + android:visibility="visible"> - <com.scwang.smart.refresh.layout.SmartRefreshLayout - android:id="@+id/refreshLayout" + <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_below="@+id/titleBar"> + android:orientation="vertical" + android:padding="16dp"> - <com.scwang.smart.refresh.header.ClassicsHeader - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - - <androidx.recyclerview.widget.RecyclerView - android:id="@+id/recyclerView" + <LinearLayout + android:id="@+id/card_read_LL" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/base_list_bg" - android:overScrollMode="never" - android:padding="10dp" /> + android:gravity="center" + android:orientation="vertical"> - <com.scwang.smart.refresh.footer.ClassicsFooter + <androidx.cardview.widget.CardView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginBottom="16dp" + app:cardCornerRadius="8dp" + app:cardElevation="2dp"> + + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:padding="16dp"> + + <TextView + android:id="@+id/tv_title" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="100dp" + android:gravity="center" + android:text="琛ュ崱鎿嶄綔" + android:layout_marginTop="20dp" + android:textColor="@color/base_blue_bg" + android:textSize="@dimen/big_text_size" + android:textStyle="bold" /> + + <TextView + android:id="@+id/tv_subtitle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@+id/tv_title" + android:layout_marginBottom="20dp" + android:gravity="center" + android:text="璇峰皢闇�瑕佽ˉ鍔炵殑鍗$墖璐村湪璁惧涓婅繘琛岃鍙�" + android:textColor="#333333" + android:textSize="@dimen/text_size" + android:textStyle="bold" /> + + <ImageView + android:id="@+id/iv_nfc" + android:layout_width="120dp" + android:layout_height="120dp" + android:layout_below="@+id/tv_subtitle" + android:layout_centerHorizontal="true" + android:layout_marginBottom="20dp" + android:scaleType="fitCenter" + android:src="@mipmap/nfc_write" /> + + <TextView + android:id="@+id/tv_tip" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@+id/iv_nfc" + android:gravity="center" + android:text="璇蜂繚鎸佹墜鎸佹満鍜屽崱鐗囦笉瑕佺Щ鍔�" + android:textColor="#666666" + android:textSize="@dimen/new_card_size" /> + + </RelativeLayout> + </androidx.cardview.widget.CardView> + </LinearLayout> + + </LinearLayout> + </ScrollView> + + <!-- 鍗$墖淇℃伅鏄剧ず鍖哄煙 - 甯﹀浐瀹氬簳閮ㄦ寜閽� --> + <LinearLayout + android:id="@+id/card_info_container" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_above="@+id/bottom_button_container" + android:layout_below="@+id/titleBar" + android:orientation="vertical" + android:visibility="gone"> + + <ScrollView + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:fillViewport="true" + android:padding="12dp"> + + <LinearLayout android:layout_width="match_parent" - android:layout_height="wrap_content" /> - </com.scwang.smart.refresh.layout.SmartRefreshLayout> + android:layout_height="wrap_content" + android:orientation="vertical"> + <!-- 褰撳墠鍗″湴鍧�鏄剧ず鍖哄煙 --> + <androidx.cardview.widget.CardView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="12dp" + app:cardCornerRadius="8dp" + app:cardElevation="2dp"> - </FrameLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="16dp"> -</LinearLayout> \ No newline at end of file + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="12dp" + android:text="褰撳墠鍗″湴鍧�" + android:textColor="@color/base_blue_bg" + android:textSize="18sp" + android:textStyle="bold" /> + + <TextView + android:id="@+id/tv_current_card_address" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="#F5F5F5" + android:padding="12dp" + android:text="--" + android:textColor="#333333" + android:textSize="16sp" + android:textIsSelectable="true" /> + + </LinearLayout> + </androidx.cardview.widget.CardView> + + <!-- 鏃у崱淇℃伅鍖哄煙 --> + <androidx.cardview.widget.CardView + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:cardCornerRadius="8dp" + app:cardElevation="2dp"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="16dp"> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="12dp" + android:text="鏃у崱淇℃伅" + android:textColor="@color/base_blue_bg" + android:textSize="18sp" + android:textStyle="bold" /> + + <!-- 鎸佸崱浜� --> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="1dp" + android:background="#F8F9FA" + android:gravity="center_vertical" + android:orientation="horizontal" + android:padding="12dp"> + + <TextView + android:layout_width="100dp" + android:layout_height="wrap_content" + android:text="鎸佸崱浜猴細" + android:textColor="#333333" + android:textSize="16sp" + android:textStyle="bold" /> + + <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="16sp" /> + </LinearLayout> + + <!-- 鍗$墖鐘舵�� --> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="1dp" + android:background="#FFFFFF" + android:gravity="center_vertical" + android:orientation="horizontal" + android:padding="12dp"> + + <TextView + android:layout_width="100dp" + android:layout_height="wrap_content" + android:text="鍗$墖鐘舵�侊細" + android:textColor="#333333" + android:textSize="16sp" + android:textStyle="bold" /> + + <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="16sp" /> + </LinearLayout> + + <!-- 鍗″唴浣欓 --> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="1dp" + android:background="#F8F9FA" + android:gravity="center_vertical" + android:orientation="horizontal" + android:padding="12dp"> + + <TextView + android:layout_width="100dp" + android:layout_height="wrap_content" + android:text="鍗″唴浣欓锛�" + android:textColor="#333333" + android:textSize="16sp" + android:textStyle="bold" /> + + <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="16sp" + android:textStyle="bold" /> + </LinearLayout> + + <!-- 鎵嬫満鍙� --> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="#FFFFFF" + android:gravity="center_vertical" + android:orientation="horizontal" + android:padding="12dp"> + + <TextView + android:layout_width="100dp" + android:layout_height="wrap_content" + android:text="鎵嬫満鍙凤細" + android:textColor="#333333" + android:textSize="16sp" + android:textStyle="bold" /> + + <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="16sp" /> + </LinearLayout> + + </LinearLayout> + </androidx.cardview.widget.CardView> + + </LinearLayout> + </ScrollView> + </LinearLayout> + + <!-- 搴曢儴鎿嶄綔鍖哄煙 --> + <LinearLayout + android:id="@+id/bottom_button_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:background="#FFFFFF" + android:elevation="4dp" + android:orientation="vertical" + android:padding="16dp" + android:visibility="gone"> + + <!-- 鏀粯鏂瑰紡閫夋嫨鍖哄煙 --> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:layout_marginBottom="16dp"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="8dp" + android:text="鏀粯鏂瑰紡" + android:textColor="#333333" + android:textSize="16sp" + android:textStyle="bold" /> + + <RadioGroup + android:id="@+id/payment_method_group" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + <!-- 鏀粯鏂瑰紡RadioButton灏嗗姩鎬佹坊鍔� --> + </RadioGroup> + + </LinearLayout> + + <!-- 宸ユ湰璐瑰拰杩斿洖閲戦杈撳叆鍖哄煙 --> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:layout_marginBottom="16dp"> + + <!-- 宸ユ湰璐硅緭鍏� --> + <LinearLayout + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:layout_marginEnd="8dp" + android:orientation="vertical"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="6dp" + android:text="宸ユ湰璐癸紙鍏冿級" + android:textColor="#333333" + android:textSize="14sp" + android:textStyle="bold" /> + + <EditText + android:id="@+id/et_card_cost" + android:layout_width="match_parent" + android:layout_height="48dp" + android:background="@drawable/edit_text_bg" + android:hint="宸ユ湰璐�" + android:inputType="numberDecimal" + android:padding="12dp" + android:text="" + android:textColor="#333333" + android:textColorHint="#999999" + android:textSize="16sp" /> + </LinearLayout> + + <!-- 杩斿洖閲戦杈撳叆 --> + <LinearLayout + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:layout_marginStart="8dp" + android:orientation="vertical"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="6dp" + android:text="杩斿洖閲戦锛堝厓锛�" + android:textColor="#333333" + android:textSize="14sp" + android:textStyle="bold" /> + + <EditText + android:id="@+id/et_return_amount" + android:layout_width="match_parent" + android:layout_height="48dp" + android:background="@drawable/edit_text_bg" + android:hint="杩斿洖閲戦" + android:inputType="numberDecimal" + android:padding="12dp" + android:text="0" + android:textColor="#333333" + android:textColorHint="#999999" + android:textSize="16sp" /> + </LinearLayout> + + </LinearLayout> + + <!-- 琛ュ崱鎸夐挳 --> + <Button + android:id="@+id/btn_replace" + android:layout_width="match_parent" + android:layout_height="48dp" + android:background="@drawable/button_blue_bg" + android:text="纭琛ュ崱" + android:textColor="#FFFFFF" + android:textSize="@dimen/big_text_size" + android:textStyle="bold" /> + + </LinearLayout> + +</RelativeLayout> \ No newline at end of file -- Gitblit v1.8.0