From 98994189864f045551f7d06f78017b5df70e1be3 Mon Sep 17 00:00:00 2001 From: zuoxiao <470321431@qq.com> Date: 星期四, 19 六月 2025 11:03:52 +0800 Subject: [PATCH] feat(card): 添加补扣功能并优化卡片操作界面 --- generallibrary/src/main/java/com/dayu/general/bean/net/CardReturnResult.kt | 33 + generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt | 3 generallibrary/src/main/java/com/dayu/general/activity/CardDeductActivity.kt | 391 +++++++++++++++++++++++ generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt | 16 generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt | 31 + generallibrary/src/main/java/com/dayu/general/activity/CardCancelActivity.kt | 20 generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt | 10 generallibrary/src/main/AndroidManifest.xml | 9 generallibrary/src/main/java/com/dayu/general/bean/net/CardCancelResult.kt | 13 generallibrary/src/main/res/layout/activity_card_deduct.xml | 412 ++++++++++++++++++++++++ generallibrary/src/main/java/com/dayu/general/bean/net/CardDeductResult.kt | 33 + generallibrary/src/main/res/drawable/button_green_bg.xml | 6 generallibrary/src/main/java/com/dayu/general/bean/net/RechargeResult.kt | 3 13 files changed, 962 insertions(+), 18 deletions(-) diff --git a/generallibrary/src/main/AndroidManifest.xml b/generallibrary/src/main/AndroidManifest.xml index 019d8dc..e873d53 100644 --- a/generallibrary/src/main/AndroidManifest.xml +++ b/generallibrary/src/main/AndroidManifest.xml @@ -126,6 +126,15 @@ <data android:mimeType="text/plain" /> </intent-filter> </activity> + <activity android:name=".activity.CardDeductActivity" + 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 7cd9a2e..db849ff 100644 --- a/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt +++ b/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt @@ -60,6 +60,9 @@ binding.homeCancelCard.setOnClickListener { context?.let { CardCancelActivity.start(it) } } + binding.homeDeduction.setOnClickListener { + context?.let { CardDeductActivity.start(it) } + } } } diff --git a/generallibrary/src/main/java/com/dayu/general/activity/CardCancelActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardCancelActivity.kt index 4d29030..06c3b3f 100644 --- a/generallibrary/src/main/java/com/dayu/general/activity/CardCancelActivity.kt +++ b/generallibrary/src/main/java/com/dayu/general/activity/CardCancelActivity.kt @@ -244,12 +244,20 @@ binding.tvUserName.text = info.userName ?: "鏈煡" binding.tvPhone.text = info.phone ?: "鏈粦瀹�" - // 鏍规嵁status瀛楁鏄剧ず鐘舵�� - val statusText = when (info.state) { - 1 -> "姝e父" - 2 -> "鎸傚け" - 3 -> "閿佸畾" - else -> "鏈煡" + // 鏍规嵁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) + if (info.state == 3) { + binding.btnCancelCard.visibility = android.view.View.GONE + } else { + binding.btnCancelCard.visibility = android.view.View.VISIBLE } } } diff --git a/generallibrary/src/main/java/com/dayu/general/activity/CardDeductActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardDeductActivity.kt new file mode 100644 index 0000000..4351298 --- /dev/null +++ b/generallibrary/src/main/java/com/dayu/general/activity/CardDeductActivity.kt @@ -0,0 +1,391 @@ +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.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.bean.card.UserCard +import com.dayu.general.bean.net.CardInfoResult +import com.dayu.general.bean.net.CardDeductResult +import com.dayu.general.databinding.ActivityCardDeductBinding +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: AI Assistant + * @desc: 琛ユ墸Activity + * @since: 2025/6/17 + */ +class CardDeductActivity : BaseNfcActivity() { + private lateinit var binding: ActivityCardDeductBinding + private var cardNumber: String? = null + private var cardInfo: CardInfoResult? = null + private var userCard: UserCard? = null + + companion object { + /** + * 鍚姩琛ユ墸Activity + */ + fun start(context: Context) { + val intent = Intent(context, CardDeductActivity::class.java) + context.startActivity(intent) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityCardDeductBinding.inflate(layoutInflater) + setContentView(binding.root) + + initView() + } + + private fun initView() { + // 璁剧疆TitleBar鐨勮繑鍥炴寜閽偣鍑讳簨浠� + binding.titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) { + finish() + } + + // 璁剧疆琛ユ墸鎸夐挳鐐瑰嚮浜嬩欢 + binding.btnDeduct.setOnClickListener { + performCardDeduct() + } + } + + /** + * 閲嶇疆鍒拌鍗$姸鎬� + */ + 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.etDeductAmount.setText("") + binding.etRemarks.setText("") + } + + /** + * 鏄剧ず纭瀵硅瘽妗� + */ + 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瀽鍗″唴鏁版嵁骞惰皟鐢ㄦ帴鍙� + handleUserCard(cardNumber, cardType, nfcAdapter) + } + + else -> { + // 绠$悊绫诲崱涓嶆敮鎸佽ˉ鎵� + showConfirmDialog("璇ュ崱鐗囩被鍨嬩笉鏀寔琛ユ墸鎿嶄綔") { + resetToReadingState() + } + } + } + } 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("CardDeductActivity", "=== 鐢ㄦ埛鍗′俊鎭� ===") + android.util.Log.d("CardDeductActivity", "鍗″彿: $cardNumber") + android.util.Log.d("CardDeductActivity", "鍗$墖绫诲瀷: $cardType") + android.util.Log.d("CardDeductActivity", "鍗″唴浣欓: ${userCard.balance}") + android.util.Log.d("CardDeductActivity", "==================") + 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.tvCardNumber.text = cardNumber + + userCard.let { card -> + // 浣欓杞崲涓哄厓锛堝師濮嬫暟鎹彲鑳芥槸鍒嗭級 + binding.tvCardBalance.text = MornyUtil.changeF2Y(card.balance) + "鍏�" + } + + // 鏄剧ず鏈嶅姟鍣ㄦ暟鎹� + 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) + } + } + + /** + * 澶勭悊鍗′俊鎭幏鍙栭敊璇� + */ + private fun handleCardInfoError(code: String?, msg: String?) { + val errorMessage: String = when (code) { + "1001" -> { + "璇ュ崱鐗囨湭鍦ㄧ郴缁熶腑娉ㄥ唽锛屾棤娉曡繘琛岃ˉ鎵f搷浣溿��" + } + + else -> { + when { + msg.isNullOrBlank() -> "鑾峰彇鍗′俊鎭け璐ワ紝璇烽噸鏂板埛鍗¢噸璇曘��" + msg.contains("鏁版嵁涓嶅瓨鍦�") -> "璇ュ崱鐗囨湭鍦ㄧ郴缁熶腑娉ㄥ唽锛屾棤娉曡繘琛岃ˉ鎵f搷浣溿��" + msg.contains("缃戠粶") -> "缃戠粶杩炴帴寮傚父锛岃妫�鏌ョ綉缁滆繛鎺ュ悗閲嶆柊鍒峰崱銆�" + msg.contains("瓒呮椂") -> "缃戠粶璇锋眰瓒呮椂锛岃閲嶆柊鍒峰崱閲嶈瘯銆�" + else -> "鑾峰彇鍗′俊鎭け璐ワ細$msg\n\n璇烽噸鏂板埛鍗¢噸璇曘��" + } + } + } + + // 鏄剧ず閿欒淇℃伅鐨勫璇濇 + showConfirmDialog(errorMessage) { + resetToReadingState() + } + } + + /** + * 鎵ц琛ユ墸鎿嶄綔 + */ + private fun performCardDeduct() { + // 楠岃瘉杈撳叆 + val deductAmountStr = binding.etDeductAmount.text.toString().trim() + val remarks = binding.etRemarks.text.toString().trim() + + // 琛ユ墸閲戦楠岃瘉锛堝繀濉級 + if (deductAmountStr.isEmpty()) { + ToastUtil.show("璇疯緭鍏ヨˉ鎵i噾棰�") + return + } + + val deductAmount = try { + val amount = deductAmountStr.toDouble() + if (amount <= 0) { + ToastUtil.show("琛ユ墸閲戦蹇呴』澶т簬0") + return + } + amount + } catch (e: NumberFormatException) { + ToastUtil.show("璇疯緭鍏ユ湁鏁堢殑琛ユ墸閲戦") + return + } + + // 澶囨敞澶勭悊锛堥潪蹇呭~锛� + val finalRemarks = if (remarks.isEmpty()) { + "琛ユ墸" // 濡傛灉鏈緭鍏ュ娉紝浣跨敤榛樿鍊� + } else { + remarks + } + + callDeductCardApi(deductAmount, finalRemarks) + } + + /** + * 璋冪敤琛ユ墸API鎺ュ彛 + */ + private fun callDeductCardApi(deductAmount: Double, finalRemarks: String) { + if (cardNumber.isNullOrBlank()) { + ToastUtil.show("鍗″彿淇℃伅寮傚父锛岃閲嶆柊鍒峰崱") + return + } + + // 鑾峰彇褰撳墠鍗″唴浣欓锛堜互鍒嗕负鍗曚綅锛� + val currentBalance = userCard?.balance?.let { MornyUtil.changeF2Y(it) } ?: 0 + + val map = mutableMapOf<String, Any>() + map["cardNum"] = cardInfo?.cardNum.toString() + map["repayMorny"] = deductAmount.toString() + map["balance"] = currentBalance.toString() + map["remarks"] = finalRemarks + map["operator"] = BaseApplication.userId + + ApiManager.getInstance().requestPostLoading( + this, + "terminal/card/termRepay", + CardDeductResult::class.java, + map, + object : SubscriberListener<BaseResponse<CardDeductResult>>() { + override fun onNext(t: BaseResponse<CardDeductResult>) { + if (t.success && t.content != null) { + // 琛ユ墸鎴愬姛锛岃烦杞埌鍐欏崱鐣岄潰 + startWriteCardActivity(t.content!!, deductAmount, 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( + deductResult: CardDeductResult, + deductAmount: 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(deductResult.balance.toString()) + } + + val intent = Intent(this, NfcWreatActivity::class.java).apply { + putExtra("cardAddr", cardNumber) + putExtra("operationTypeCode", CardOperationType.DeductCard.code) // 浣跨敤琛ユ墸绫诲瀷杩涜鍐欏崱 + putExtra("orderNumber", deductResult.orderNo) + putExtra("deductAmount", deductAmount) + 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/CardWriteSuccessActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt index 7023d35..0f7accc 100644 --- a/generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt +++ b/generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt @@ -64,6 +64,22 @@ binding.successMessage.text = message } + CardOperationType.DeductCard -> { + // 璁剧疆鏍囬 + binding.titleBar.setCenterText("琛ユ墸鎴愬姛") + + // 璁剧疆鎴愬姛淇℃伅 + binding.successTitle.text = "琛ユ墸鎴愬姛" + + // 璁剧疆璇︾粏淇℃伅 + val message = if (cardNumber.isNullOrBlank()) { + "鍗$墖琛ユ墸鎿嶄綔宸叉垚鍔熷畬鎴怽n鍗″唴浣欓宸叉洿鏂�" + } else { + "鍗$墖琛ユ墸鎿嶄綔宸叉垚鍔熷畬鎴怽n鍗″彿锛�$cardNumber\n鍗″唴浣欓宸叉洿鏂�" + } + binding.successMessage.text = message + } + else -> { // 榛樿鏄剧ず鍐欏崱鎴愬姛 binding.titleBar.setCenterText("鍐欏崱鎴愬姛") 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 af6c1dc..d4f57d4 100644 --- a/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt +++ b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt @@ -41,6 +41,9 @@ // 杩旇繕鐩稿叧淇℃伅 private var returnAmount = 0.0 + // 琛ユ墸鐩稿叧淇℃伅 + private var deductAmount = 0.0 + //璁㈠崟缂栧彿 var orderNumber = "" private lateinit var userCard: UserCard @@ -74,6 +77,9 @@ // 鑾峰彇杩旇繕鐩稿叧淇℃伅 returnAmount = intent?.getDoubleExtra("returnAmount", 0.0) ?: 0.0 + + // 鑾峰彇琛ユ墸鐩稿叧淇℃伅 + deductAmount = intent?.getDoubleExtra("deductAmount", 0.0) ?: 0.0 if (intent?.hasExtra("cardFee") == true) { cardFee = intent?.getIntExtra("cardFee", 0) ?: 0 @@ -174,8 +180,15 @@ binding?.cardData?.text = textData.toString() } + CardOperationType.DeductCard -> { + var textData = StringBuilder() + textData.append("琛ユ墸\n") + textData.append("鍗″唴浣欓锛�" + MornyUtil.changeF2Y(userCard.balance) + "鍏僜n") + textData.append("琛ユ墸閲戦锛�" + deductAmount + "鍏�") + binding?.cardData?.text = textData.toString() + } + CardOperationType.CheckCard -> TODO() - CardOperationType.DeductCard -> TODO() CardOperationType.ReplaceCard -> TODO() null -> TODO() } @@ -272,8 +285,22 @@ }) } + CardOperationType.DeductCard -> { + 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.DeductCard -> TODO() CardOperationType.ReplaceCard -> TODO() null -> TODO() } 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 f460d84..65a9a42 100644 --- a/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt +++ b/generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt @@ -405,15 +405,7 @@ val userCard = UserCard().apply { // 璁剧疆鐢ㄦ埛鍗′俊鎭� cardInfo?.let { info -> - userCode = info.cardNum ?: "" - - // 璁$畻鏂颁綑棰濓細鍘熸湁浣欓 + 鍏呭�奸噾棰� + 璧犻�侀噾棰� - val originalBalance = - this@RechargeDetailActivity.userCard?.balance ?: 0 // 鍘熸湁浣欓锛堝垎锛� - val rechargeAmountInCents = (rechargeAmount * 100).toInt() // 鍏呭�奸噾棰濊浆鍒� - val bonusAmountInCents = (bonusAmount * 100).toInt() // 璧犻�侀噾棰濊浆鍒� - - balance = originalBalance + rechargeAmountInCents + bonusAmountInCents + balance = MornyUtil.changeY2F(rechargeResult.balance) } // 璁剧疆鍏朵粬蹇呰淇℃伅 diff --git a/generallibrary/src/main/java/com/dayu/general/bean/net/CardCancelResult.kt b/generallibrary/src/main/java/com/dayu/general/bean/net/CardCancelResult.kt new file mode 100644 index 0000000..6dad537 --- /dev/null +++ b/generallibrary/src/main/java/com/dayu/general/bean/net/CardCancelResult.kt @@ -0,0 +1,13 @@ +package com.dayu.general.bean.net + +/** + * 閿�鍗$粨鏋滄暟鎹被 + * @author: zuo + * @date: 2025/01/17 + * @description: 閿�鍗℃帴鍙h繑鍥炴暟鎹� + */ +data class CardCancelResult( + val projectNo: Int, // 椤圭洰缂栧彿 + val cardNum: String, // 鍗″彿 + val orderNo: String // 璁㈠崟鍙� +) \ No newline at end of file diff --git a/generallibrary/src/main/java/com/dayu/general/bean/net/CardDeductResult.kt b/generallibrary/src/main/java/com/dayu/general/bean/net/CardDeductResult.kt new file mode 100644 index 0000000..b7939d9 --- /dev/null +++ b/generallibrary/src/main/java/com/dayu/general/bean/net/CardDeductResult.kt @@ -0,0 +1,33 @@ +/** + * @author: AI Assistant + * @desc: 琛ユ墸鎺ュ彛杩斿洖缁撴灉 + * @since: 2025/6/17 + */ +package com.dayu.general.bean.net + +import java.io.Serializable + +/** + * 琛ユ墸鎿嶄綔鐨凙PI杩斿洖缁撴灉 + */ +data class CardDeductResult( + /** + * 琛ユ墸鍚庣殑浣欓 + */ + val balance: Float = 0f, + + /** + * 姘翠环 + */ + val waterPrice: Double = 0.0, + + /** + * 鏃堕棿 + */ + val time: String = "", + + /** + * 璁㈠崟鍙� + */ + val orderNo: String = "" +) : Serializable \ No newline at end of file diff --git a/generallibrary/src/main/java/com/dayu/general/bean/net/CardReturnResult.kt b/generallibrary/src/main/java/com/dayu/general/bean/net/CardReturnResult.kt new file mode 100644 index 0000000..b18a885 --- /dev/null +++ b/generallibrary/src/main/java/com/dayu/general/bean/net/CardReturnResult.kt @@ -0,0 +1,33 @@ +/** + * @author: zuo + * @desc: 杩旇繕鎺ュ彛杩斿洖缁撴灉 + * @since: 2025/6/17 + */ +package com.dayu.general.bean.net + +import java.io.Serializable + +/** + * 杩旇繕鎿嶄綔鐨凙PI杩斿洖缁撴灉 + */ +data class CardReturnResult( + /** + * 杩旇繕鍚庣殑浣欓 + */ + val balance: Float = 0f, + + /** + * 姘翠环 + */ + val waterPrice: Double = 0.0, + + /** + * 鏃堕棿 + */ + val time: String = "", + + /** + * 璁㈠崟鍙� + */ + val orderNo: String = "" +) : Serializable \ No newline at end of file diff --git a/generallibrary/src/main/java/com/dayu/general/bean/net/RechargeResult.kt b/generallibrary/src/main/java/com/dayu/general/bean/net/RechargeResult.kt index d6507a3..9cd6c07 100644 --- a/generallibrary/src/main/java/com/dayu/general/bean/net/RechargeResult.kt +++ b/generallibrary/src/main/java/com/dayu/general/bean/net/RechargeResult.kt @@ -10,5 +10,6 @@ val cardNum: String, // 鍗″彿 val orderNo: String, // 璁㈠崟鍙� val waterPrice: Double, // 姘翠环 - val time: String // 鏃堕棿 + val time: String, // 鏃堕棿 + val balance: String // 浣欓 ) : Serializable \ No newline at end of file diff --git a/generallibrary/src/main/res/drawable/button_green_bg.xml b/generallibrary/src/main/res/drawable/button_green_bg.xml new file mode 100644 index 0000000..6ae265a --- /dev/null +++ b/generallibrary/src/main/res/drawable/button_green_bg.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <solid android:color="@color/button_select_text_color" /> + <corners android:radius="6dp" /> +</shape> \ No newline at end of file diff --git a/generallibrary/src/main/res/layout/activity_card_deduct.xml b/generallibrary/src/main/res/layout/activity_card_deduct.xml new file mode 100644 index 0000000..cea2102 --- /dev/null +++ b/generallibrary/src/main/res/layout/activity_card_deduct.xml @@ -0,0 +1,412 @@ +<?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="琛ユ墸" + app:leftImage="@mipmap/icon_back" /> + + <!-- 璇诲崱鎻愮ず鍖哄煙 - 鍏ㄥ睆鏄剧ず --> + <ScrollView + android:id="@+id/scroll_read_card" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_below="@+id/titleBar" + android:fillViewport="true" + android:visibility="visible"> + + <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"> + + <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="璇峰皢闇�瑕佽ˉ鎵g殑鍗$墖璐村湪璁惧涓婅繘琛岃鍙�" + 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" + 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"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="12dp"> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="8dp" + android:gravity="" + android:text="鍗$墖淇℃伅" + android:textColor="@color/base_blue_bg" + android:textSize="16sp" + 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="8dp"> + + <TextView + android:layout_width="80dp" + android:layout_height="wrap_content" + android:text="鎸佸崱浜猴細" + android:textColor="#333333" + android:textSize="14sp" /> + + <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="14sp" /> + </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="8dp"> + + <TextView + android:layout_width="80dp" + android:layout_height="wrap_content" + android:text="鍗″湴鍧�锛�" + android:textColor="#333333" + android:textSize="14sp" /> + + <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="14sp" /> + </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="8dp"> + + <TextView + android:layout_width="80dp" + android:layout_height="wrap_content" + android:text="鍗$墖鐘舵�侊細" + android:textColor="#333333" + android:textSize="14sp" /> + + <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="14sp" /> + </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="8dp"> + + <TextView + android:layout_width="80dp" + android:layout_height="wrap_content" + android:text="鍗″唴浣欓锛�" + android:textColor="#333333" + android:textSize="14sp" /> + + <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="14sp" + android:textStyle="bold" /> + </LinearLayout> + + <!-- 鎵嬫満鍙� --> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="#F8F9FA" + android:gravity="center_vertical" + android:orientation="horizontal" + android:padding="8dp"> + + <TextView + android:layout_width="80dp" + android:layout_height="wrap_content" + android:text="鎵嬫満鍙凤細" + android:textColor="#333333" + android:textSize="14sp" /> + + <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="14sp" /> + </LinearLayout> + + </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="12dp"> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="12dp" + android:gravity="" + android:text="琛ユ墸鎿嶄綔" + android:textColor="@color/base_blue_bg" + android:textSize="16sp" + android:textStyle="bold" /> + + <!-- 琛ユ墸閲戦鍜屽娉ㄥ苟鎺掓樉绀� --> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <!-- 琛ユ墸閲戦杈撳叆 --> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginEnd="6dp" + android:layout_weight="1" + 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_deduct_amount" + android:layout_width="match_parent" + android:layout_height="40dp" + android:layout_marginTop="5dp" + android:background="@drawable/edit_text_bg" + android:hint="璇疯緭鍏ヨˉ鎵i噾棰�" + android:inputType="numberDecimal" + android:padding="8dp" + android:textColor="#333333" + android:textColorHint="#999999" + android:textSize="14sp" /> + </LinearLayout> + + <!-- 澶囨敞杈撳叆 --> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="5dp" + android:layout_weight="1" + 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_remarks" + android:layout_width="match_parent" + android:layout_height="80dp" + android:layout_marginTop="5dp" + android:background="@drawable/edit_text_bg" + android:hint="璇疯緭鍏ヨˉ鎵e娉�" + android:inputType="text" + android:minLines="2" + android:padding="8dp" + android:textColor="#333333" + android:textColorHint="#999999" + android:textSize="14sp" /> + </LinearLayout> + + </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"> + + <!-- 琛ユ墸鎸夐挳 --> + <Button + android:id="@+id/btn_deduct" + android:layout_width="match_parent" + android:layout_height="48dp" + android:background="@drawable/button_green_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