From 465c8abaa982fba6868a900d25316c70afc20fb7 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期三, 18 六月 2025 13:59:46 +0800
Subject: [PATCH] feat(card): 优化销卡功能并添加写卡操作

---
 generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt           |    3 
 generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt |   22 +
 generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt         |   75 +++++-
 generallibrary/src/main/res/layout/activity_card_cancel.xml                        |  269 ++++++++++++++----------
 generallibrary/src/main/java/com/dayu/general/activity/CardCancelActivity.kt       |  121 +++++++---
 README.md                                                                          |  165 +++++++++++++++
 6 files changed, 482 insertions(+), 173 deletions(-)

diff --git a/README.md b/README.md
index dee3b50..0e4714c 100644
--- a/README.md
+++ b/README.md
@@ -232,6 +232,171 @@
 - CardData: 鍗$墖鏁版嵁
 - ProjectDataBean: 椤圭洰鏁版嵁
 
+## 鏁版嵁绫荤鐞嗚鑼�
+
+### Bean鍖呯粨鏋勭粍缁�
+
+椤圭洰涓墍鏈夌殑鏁版嵁绫伙紙Data Class锛夐兘搴旇缁熶竴鏀惧湪`bean`鍖呬笅鐨勭浉搴斿瓙鐩綍涓紝鎸夌収鍔熻兘鍜岀敤閫旇繘琛屽垎绫伙細
+
+```
+generallibrary/src/main/java/com/dayu/general/bean/
+鈹溾攢鈹� net/        # 缃戠粶鎺ュ彛鐩稿叧鏁版嵁绫�
+鈹溾攢鈹� card/       # 鍗$墖鐩稿叧鏁版嵁绫�  
+鈹溾攢鈹� db/         # 鏁版嵁搴撳疄浣撶被
+鈹斺攢鈹� ...         # 鍏朵粬鍔熻兘妯″潡鏁版嵁绫�
+```
+
+#### 1. 缃戠粶鎺ュ彛鏁版嵁绫� (bean/net/)
+
+鎵�鏈堿PI鎺ュ彛鐨勮姹傚拰鍝嶅簲鏁版嵁绫婚兘鏀惧湪`net`鐩綍涓嬶細
+
+```kotlin
+// 璇锋眰鏁版嵁绫荤ず渚�
+data class RechargeRequest(
+    val rechargeType: Int,
+    val cardNum: String,
+    val money: String,
+    // ... 鍏朵粬瀛楁
+)
+
+// 鍝嶅簲鏁版嵁绫荤ず渚�  
+data class CardCancelResult(
+    val projectNo: Int,
+    val cardNum: String,
+    val orderNo: String
+)
+```
+
+#### 2. 鍗$墖鐩稿叧鏁版嵁绫� (bean/card/)
+
+鎵�鏈夊崱鐗囨搷浣滅浉鍏崇殑鏁版嵁绫绘斁鍦╜card`鐩綍涓嬶細
+
+```kotlin
+data class UserCard(
+    var cardType: String = "",
+    var balance: Int = 0,
+    var userCode: String = "",
+    // ... 鍏朵粬瀛楁
+)
+```
+
+#### 3. 鏁版嵁搴撳疄浣撶被 (bean/db/)
+
+鎵�鏈塕oom鏁版嵁搴撶殑瀹炰綋绫绘斁鍦╜db`鐩綍涓嬶細
+
+```kotlin
+@Entity(tableName = "card_data")
+data class CardData(
+    @PrimaryKey val id: Long,
+    val cardNumber: String,
+    // ... 鍏朵粬瀛楁
+)
+```
+
+### 鏁版嵁绫诲懡鍚嶈鑼�
+
+1. **鎺ュ彛鍝嶅簲鏁版嵁绫�**: 浠Result`缁撳熬
+   - `CardCancelResult` - 閿�鍗℃帴鍙e搷搴�
+   - `RechargeResult` - 鍏呭�兼帴鍙e搷搴�
+   - `WaterPriceResult` - 姘翠环鎺ュ彛鍝嶅簲
+
+2. **鎺ュ彛璇锋眰鏁版嵁绫�**: 浠Request`缁撳熬
+   - `RechargeRequest` - 鍏呭�兼帴鍙h姹�
+   - `SearchUserBeanRequest` - 鐢ㄦ埛鎼滅储璇锋眰
+
+3. **涓氬姟瀹炰綋鏁版嵁绫�**: 浣跨敤涓氬姟鍚嶇О
+   - `UserCard` - 鐢ㄦ埛鍗$墖鏁版嵁
+   - `ClearCard` - 娓呴浂鍗℃暟鎹�
+
+4. **鏁版嵁搴撳疄浣撶被**: 浣跨敤琛ㄥ悕瀵瑰簲鐨勫疄浣撳悕
+   - `CardData` - 鍗$墖鏁版嵁琛�
+   - `ProjectDataBean` - 椤圭洰鏁版嵁琛�
+
+### 鏁版嵁绫诲垱寤烘渶浣冲疄璺�
+
+#### 1. 鏂囦欢澶存敞閲婅鑼�
+
+```kotlin
+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     // 璁㈠崟鍙�
+)
+```
+
+#### 2. 瀛楁娉ㄩ噴瑙勮寖
+
+- 姣忎釜瀛楁閮藉簲璇ユ坊鍔犺鍐呮敞閲婅鏄庣敤閫�
+- 瀵逛簬鏋氫妇鍊兼垨鐗规畩鍚箟鐨勫瓧娈碉紝璇︾粏璇存槑鍙栧�艰寖鍥�
+
+#### 3. 瀵煎叆浣跨敤瑙勮寖
+
+鍦ˋctivity鎴栧叾浠栫被涓娇鐢ㄦ暟鎹被鏃讹紝搴旇瀵煎叆鍏蜂綋鐨勬暟鎹被锛�
+
+```kotlin
+// 姝g‘鐨勫鍏ユ柟寮�
+import com.dayu.general.bean.net.CardCancelResult
+import com.dayu.general.bean.net.RechargeResult
+
+// 鍦ㄤ唬鐮佷腑浣跨敤
+private fun handleCancelResult(result: CardCancelResult) {
+    // 澶勭悊閿�鍗$粨鏋�
+}
+```
+
+#### 4. 绂佹鍐呰仈瀹氫箟
+
+**绂佹**鍦ˋctivity鎴栧叾浠栫被涓唴鑱斿畾涔夋暟鎹被锛�
+
+```kotlin
+// 鉂� 閿欒鍋氭硶 - 涓嶈鍦ˋctivity涓唴鑱斿畾涔夋暟鎹被
+class CardCancelActivity : BaseNfcActivity() {
+    
+    // 鉂� 绂佹杩欐牱鍋�
+    data class CardCancelResult(
+        val projectNo: Int,
+        val cardNum: String,
+        val orderNo: String
+    )
+}
+
+// 鉁� 姝g‘鍋氭硶 - 鍦╞ean鍖呬腑瀹氫箟鏁版嵁绫�
+// 鏂囦欢: generallibrary/src/main/java/com/dayu/general/bean/net/CardCancelResult.kt
+data class CardCancelResult(
+    val projectNo: Int,
+    val cardNum: String, 
+    val orderNo: String
+)
+```
+
+### 鏁版嵁绫荤鐞嗕紭鍔�
+
+1. **缁熶竴绠$悊**: 鎵�鏈夋暟鎹被闆嗕腑鍦╞ean鍖呬笅锛屼究浜庢煡鎵惧拰缁存姢
+2. **鑱岃矗鍒嗙**: 涓氬姟閫昏緫鍜屾暟鎹粨鏋勫垎绂伙紝浠g爜缁撴瀯鏇存竻鏅�
+3. **澶嶇敤鎬у己**: 鏁版嵁绫诲彲浠ュ湪澶氫釜妯″潡闂村鐢�
+4. **鏄撲簬閲嶆瀯**: 鏁版嵁缁撴瀯鍙樻洿鏃跺彧闇�淇敼涓�涓枃浠�
+5. **绫诲瀷瀹夊叏**: 缂栬瘧鏈熺被鍨嬫鏌ワ紝鍑忓皯杩愯鏃堕敊璇�
+
+### 杩佺Щ鐜版湁浠g爜
+
+瀵逛簬宸茬粡瀛樺湪鐨勫唴鑱旀暟鎹被锛屽簲璇ユ寜鐓т互涓嬫楠よ繘琛岃縼绉伙細
+
+1. 鍦╞ean鍖呯殑鐩稿簲瀛愮洰褰曚笅鍒涘缓鏁版嵁绫绘枃浠�
+2. 绉诲姩鏁版嵁绫诲畾涔夊埌鏂版枃浠�
+3. 鍦ㄥ師鏂囦欢涓坊鍔犲鍏ヨ鍙�
+4. 娴嬭瘯纭繚鍔熻兘姝e父
+5. 鎻愪氦浠g爜鍙樻洿
+
+閫氳繃缁熶竴鐨勬暟鎹被绠$悊瑙勮寖锛屽彲浠ユ彁楂樹唬鐮佺殑鍙淮鎶ゆ�у拰鍙鎬э紝浣块」鐩粨鏋勬洿鍔犳竻鏅拌鑼冦��
+
 ## 寮�鍙戠幆澧冭姹�
 
 - Android Studio Arctic Fox鎴栨洿楂樼増鏈�
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 7e4ffc1..09aae1d 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
@@ -54,6 +54,9 @@
         binding.homeRedCard.setOnClickListener {
             context?.let { CardReadActivity.start(it) }
         }
+        binding.homeReverse.setOnClickListener {
+            context?.let { CardCancelActivity.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 163990f..4d29030 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/CardCancelActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/CardCancelActivity.kt
@@ -8,13 +8,19 @@
 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.net.CardInfoResult
+import com.dayu.general.bean.net.CardCancelResult
 import com.dayu.general.databinding.ActivityCardCancelBinding
 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
+import com.dayu.general.bean.card.ClearCard
+import com.dayu.general.tool.NfcWreatHelper
+import com.dayu.baselibrary.tools.nfc.NFCCallBack
+import com.dayu.general.tool.CardOperationType
 
 /**
  * @author: zuo
@@ -25,6 +31,7 @@
     private lateinit var binding: ActivityCardCancelBinding
     private var cardNumber: String? = null
     private var cardInfo: CardInfoResult? = null
+    private var userCard: UserCard? = null
 
     companion object {
         /**
@@ -60,8 +67,9 @@
      * 閲嶇疆鍒拌鍗$姸鎬�
      */
     private fun resetToReadingState() {
-        binding.cardReadLL.visibility = android.view.View.VISIBLE
+        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.etRefundAmount.setText("")
@@ -80,6 +88,7 @@
 
     override fun onNfcBack(intent: Intent?) {
         intent?.let {
+            // 澶勭悊姝e父鐨勮鍗℃搷浣�
             handleNfcIntent(it)
         } ?: run {
             showConfirmDialog("NFC鏁版嵁寮傚父锛岃閲嶆柊鍒峰崱") {
@@ -162,7 +171,7 @@
         android.util.Log.d("CardCancelActivity", "鍗$墖绫诲瀷: $cardType")
         android.util.Log.d("CardCancelActivity", "鍗″唴浣欓: ${userCard.balance}")
         android.util.Log.d("CardCancelActivity", "==================")
-
+        this.userCard = userCard
         // 鏍规嵁鍗″彿鑾峰彇鍗$墖璇︾粏淇℃伅
         getCardInfo(cardNumber, cardType, userCard)
     }
@@ -207,9 +216,10 @@
         cardType: String,
         userCard: UserCard
     ) {
-        // 闅愯棌璇诲崱鎻愮ず锛屾樉绀轰俊鎭尯鍩�
-        binding.cardReadLL.visibility = android.view.View.GONE
+        // 闅愯棌璇诲崱鎻愮ず锛屾樉绀轰俊鎭尯鍩熷拰搴曢儴鎸夐挳
+        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
@@ -222,9 +232,7 @@
                 card.balance.toString()
             }
             binding.tvCardBalance.text = "${balanceInYuan}鍏�"
-            
-            // 榛樿閫�娆鹃噾棰濊缃负鍗″唴浣欓
-            binding.etRefundAmount.setText(balanceInYuan)
+
 
             // 鍗$墖鐘舵��
             binding.tvCardStatus.text = "姝e父"
@@ -280,64 +288,68 @@
         val refundAmountStr = binding.etRefundAmount.text.toString().trim()
         val remarks = binding.etRemarks.text.toString().trim()
 
-        if (TextUtils.isEmpty(refundAmountStr)) {
-            ToastUtil.showToast("璇疯緭鍏ラ��娆鹃噾棰�")
-            return
+        // 閫�娆鹃噾棰濆鐞嗭紙闈炲繀濉級
+        val refundAmount = if (refundAmountStr.isEmpty()) {
+            0.0 // 濡傛灉鏈緭鍏ラ��娆鹃噾棰濓紝榛樿涓�0
+        } else {
+            try {
+                val amount = refundAmountStr.toDouble()
+                if (amount < 0) {
+                    ToastUtil.show("閫�娆鹃噾棰濅笉鑳戒负璐熸暟")
+                    return
+                }
+                amount
+            } catch (e: NumberFormatException) {
+                ToastUtil.show("璇疯緭鍏ユ湁鏁堢殑閫�娆鹃噾棰�")
+                return
+            }
         }
 
-        val refundAmount = try {
-            refundAmountStr.toDouble()
-        } catch (e: NumberFormatException) {
-            ToastUtil.showToast("璇疯緭鍏ユ湁鏁堢殑閫�娆鹃噾棰�")
-            return
-        }
-
-        if (refundAmount < 0) {
-            ToastUtil.showToast("閫�娆鹃噾棰濅笉鑳戒负璐熸暟")
-            return
-        }
-
-        if (TextUtils.isEmpty(remarks)) {
-            ToastUtil.showToast("璇疯緭鍏ュ娉ㄤ俊鎭�")
-            return
+        // 澶囨敞澶勭悊锛堥潪蹇呭~锛�
+        val finalRemarks = if (remarks.isEmpty()) {
+            "鏃犲娉�" // 濡傛灉鏈緭鍏ュ娉紝浣跨敤榛樿鍊�
+        } else {
+            remarks
         }
 
         // 纭閿�鍗�
-        showConfirmDialog(
-            "纭瑕侀攢鍗″悧锛焅n\n鍗″彿锛�${cardNumber}\n閫�娆鹃噾棰濓細${refundAmount}鍏僜n澶囨敞锛�${remarks}\n\n閿�鍗″悗姝ゅ崱灏嗘棤娉曞啀娆′娇鐢紒"
-        ) {
-            callCancelCardApi(refundAmount, remarks)
+        val confirmMessage = if (refundAmount > 0) {
+            "纭瑕侀攢鍗″悧锛焅n\n鍗″彿锛�${cardNumber}\n閫�娆鹃噾棰濓細${refundAmount}鍏僜n澶囨敞锛�${finalRemarks}\n\n閿�鍗″悗姝ゅ崱灏嗘棤娉曞啀娆′娇鐢紒"
+        } else {
+            "纭瑕侀攢鍗″悧锛焅n\n鍗″彿锛�${cardNumber}\n鏃犻��娆鹃噾棰漒n澶囨敞锛�${finalRemarks}\n\n閿�鍗″悗姝ゅ崱灏嗘棤娉曞啀娆′娇鐢紒"
+        }
+
+        showConfirmDialog(confirmMessage) {
+            callCancelCardApi(refundAmount, finalRemarks)
         }
     }
 
     /**
      * 璋冪敤閿�鍗PI鎺ュ彛
      */
-    private fun callCancelCardApi(refundAmount: Double, remarks: String) {
+    private fun callCancelCardApi(refundAmount: Double, finalRemarks: String) {
         if (cardNumber.isNullOrBlank()) {
-            ToastUtil.showToast("鍗″彿淇℃伅寮傚父锛岃閲嶆柊鍒峰崱")
+            ToastUtil.show("鍗″彿淇℃伅寮傚父锛岃閲嶆柊鍒峰崱")
             return
         }
 
         val map = mutableMapOf<String, Any>()
-        map["cardNum"] = cardNumber!!
-        map["refund"] = (refundAmount * 100).toInt() // 杞崲涓哄垎
+        map["cardNum"] = cardInfo?.cardNum.toString()
+        map["refund"] = refundAmount.toString() // 鏀逛负String绫诲瀷锛屽崟浣嶄负鍏�
         map["refundType"] = 1838466162264350700L
-        map["remarks"] = remarks
-        map["operator"] = 2024090516595200300L
+        map["remarks"] = finalRemarks
+        map["operator"] = BaseApplication.userId
 
         ApiManager.getInstance().requestPostLoading(
             this,
             "terminal/card/termCancel",
-            Boolean::class.java,
+            CardCancelResult::class.java,
             map,
-            object : SubscriberListener<BaseResponse<Boolean>>() {
-                override fun onNext(t: BaseResponse<Boolean>) {
-                    if (t.success && t.content == true) {
-                        // 閿�鍗℃垚鍔�
-                        showConfirmDialog("閿�鍗℃垚鍔燂紒\n\n閫�娆鹃噾棰濓細${refundAmount}鍏冨凡閫�杩�") {
-                            finish()
-                        }
+            object : SubscriberListener<BaseResponse<CardCancelResult>>() {
+                override fun onNext(t: BaseResponse<CardCancelResult>) {
+                    if (t.success && t.content != null) {
+                        // 閿�鍗℃垚鍔燂紝璺宠浆鍒板啓鍗$晫闈�
+                        startWriteCardActivity(t.content!!, refundAmount, userCard!!)
                     } else {
                         // 閿�鍗″け璐�
                         val errorMsg = if (t.msg.isNullOrBlank()) "閿�鍗″け璐ワ紝璇烽噸璇�" else t.msg
@@ -354,4 +366,27 @@
             }
         )
     }
+
+    /**
+     * 璺宠浆鍒板啓鍗$晫闈㈣繘琛屽崱鍐呭娓呴櫎
+     */
+    private fun startWriteCardActivity(
+        cancelResult: CardCancelResult,
+        refundAmount: Double,
+        userCard: UserCard
+    ) {
+        val intent = Intent(this, NfcWreatActivity::class.java).apply {
+            putExtra("cardAddr", cardNumber)
+            putExtra("operationTypeCode", CardOperationType.CancelCard.code)
+            putExtra("orderNumber", cancelResult.orderNo)
+            putExtra("refundAmount", refundAmount)
+            putExtra("userCard", userCard)
+            // 浼犻�掑綋鍓嶅崱鍐呬綑棰濅俊鎭�
+            cardInfo?.let { info ->
+                putExtra("cardBalance", info.balance ?: 0.0)
+            }
+        }
+        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 fb58603..73182db 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt
@@ -12,26 +12,42 @@
 class CardWriteSuccessActivity : BaseActivity() {
     
     private lateinit var binding: ActivityCardWriteSuccessBinding
+    private var cardNumber: String? = null
     
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         binding = ActivityCardWriteSuccessBinding.inflate(layoutInflater)
         setContentView(binding.root)
         
+        // 鑾峰彇浼犲叆鐨勫崱鍙�
+        cardNumber = intent.getStringExtra("cardNumber")
+        
         initView()
     }
     
     private fun initView() {
+        // 璁剧疆鏍囬
+        binding.titleBar.setCenterText("閿�鍗℃垚鍔�")
+        
+        // 璁剧疆鎴愬姛淇℃伅
+        binding.successTitle.text = "閿�鍗℃垚鍔�"
+        
+        // 璁剧疆璇︾粏淇℃伅
+        val message = if (cardNumber.isNullOrBlank()) {
+            "鍗$墖宸叉垚鍔熼攢鍗″苟娓呴櫎鍐呭\n璇ュ崱鐗囧皢鏃犳硶鍐嶆浣跨敤"
+        } else {
+            "鍗$墖宸叉垚鍔熼攢鍗″苟娓呴櫎鍐呭\n鍗″彿锛�$cardNumber\n璇ュ崱鐗囧皢鏃犳硶鍐嶆浣跨敤"
+        }
+        binding.successMessage.text = message
+        
         // 璁剧疆鐐瑰嚮纭畾鎸夐挳鍚庡叧闂〉闈�
         binding.btnConfirm.setOnClickListener {
             finish()
         }
         
         // 璁剧疆鏍囬鏍忚繑鍥炴寜閽�
-        binding.titleBar.setOnClickListener {
+        binding.titleBar.setOnItemclickListner(com.dayu.baselibrary.view.TitleBar.ClickType_LEFT_IMAGE) {
             finish()
         }
     }
-    
-
 } 
\ 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 ad1a0c3..3bf4fce 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
@@ -36,6 +36,10 @@
     private var rechargeAmount = 0.0
     private var bonusAmount = 0.0
 
+    // 閿�鍗$浉鍏充俊鎭�
+    private var refundAmount = 0.0
+    private var cardBalance = 0.0
+
     //璁㈠崟缂栧彿
     var orderNumber = ""
     private lateinit var userCard: UserCard
@@ -63,6 +67,10 @@
         rechargeAmount = intent?.getDoubleExtra("rechargeAmount", 0.0) ?: 0.0
         bonusAmount = intent?.getDoubleExtra("bonusAmount", 0.0) ?: 0.0
 
+        // 鑾峰彇閿�鍗$浉鍏充俊鎭�
+        refundAmount = intent?.getDoubleExtra("refundAmount", 0.0) ?: 0.0
+        cardBalance = intent?.getDoubleExtra("cardBalance", 0.0) ?: 0.0
+
         if (intent?.hasExtra("cardFee") == true) {
             cardFee = intent?.getIntExtra("cardFee", 0) ?: 0
         }
@@ -77,7 +85,27 @@
         if (operationTypeCode != -1) {
             when (operationType) {
                 CardOperationType.CleanCard -> {
-                    binding?.cardData?.text = "娓呴浂鍗″啓鍗�"
+                    val textData = StringBuilder()
+
+                    // 鍒ゆ柇鏄惁鏉ヨ嚜閿�鍗℃搷浣滐紙鏈夐��娆鹃噾棰濇垨鍗″唴浣欓淇℃伅锛�
+                    if (refundAmount > 0 || cardBalance > 0) {
+                        textData.append("閿�鍗℃竻闆舵搷浣淺n")
+                        textData.append("鍗″湴鍧�锛�$cardAddr\n")
+
+                        if (cardBalance > 0) {
+                            textData.append("鍗″唴浣欓锛�${String.format("%.2f", cardBalance)}鍏僜n")
+                        }
+
+                        if (refundAmount > 0) {
+                            textData.append("閫�娆鹃噾棰濓細${String.format("%.2f", refundAmount)}鍏�")
+                        } else {
+                            textData.append("鏃犻��娆鹃噾棰�")
+                        }
+                    } else {
+                        textData.append("娓呴浂鍗″啓鍗�")
+                    }
+
+                    binding?.cardData?.text = textData.toString()
                 }
 
                 CardOperationType.OpenCard -> {
@@ -126,7 +154,14 @@
                     binding?.cardData?.text = textData.toString()
                 }
 
-                CardOperationType.CancelCard -> TODO()
+                CardOperationType.CancelCard -> {
+                    var textData = StringBuilder()
+                    textData.append("閿�鍗n")
+                    textData.append("鍗″唴浣欓锛�" + MornyUtil.changeF2Y(userCard.balance) + "鍏僜n")
+                    textData.append("閫�娆鹃噾棰濓細" + refundAmount + "鍏�")
+                    binding?.cardData?.text = textData.toString()
+                }
+
                 CardOperationType.CheckCard -> TODO()
                 CardOperationType.DeductCard -> TODO()
                 CardOperationType.ReplaceCard -> TODO()
@@ -151,7 +186,7 @@
                         // 纭繚Toast鍦ㄤ富绾跨▼涓皟鐢�
                         runOnUiThread {
                             if (success) {
-                                postCardData(cardType, cardAddr)
+                                postCardData(cardAddr)
                                 ToastUtil.show("鍐欏崱鎴愬姛!")
                             } else {
                                 // 澶勭悊鍐欏崱澶辫触鐨勬儏鍐�
@@ -167,7 +202,7 @@
                             // 纭繚Toast鍦ㄤ富绾跨▼涓皟鐢�
                             runOnUiThread {
                                 if (flag) {
-                                    postCardData(cardType, cardAddr)
+                                    postCardData(cardAddr)
 
                                 } else {
                                     ToastUtil.show("鍐欏崱澶辫触: ${msg ?: "鏈煡閿欒"}")
@@ -184,8 +219,7 @@
                             // 纭繚Toast鍦ㄤ富绾跨▼涓皟鐢�
                             runOnUiThread {
                                 if (flag) {
-                                    postCardData(cardType, cardAddr)
-                                    ToastUtil.show("鍏呭�煎啓鍗℃垚鍔�!")
+                                    postCardData(cardAddr)
                                 } else {
                                     ToastUtil.show("鍏呭�煎啓鍗″け璐�: ${msg ?: "鏈煡閿欒"}")
                                 }
@@ -194,7 +228,23 @@
                     })
                 }
 
-                CardOperationType.CancelCard -> TODO()
+                CardOperationType.CancelCard -> {
+                    var userCard = UserCard()
+                    userCard.cardType = "00";
+                    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()
@@ -242,12 +292,8 @@
         }
     }
 
-    fun postCardData(cardType: String, cardAddr: String) {
-        when (cardType) {
-            CardCommon.CHECK_CARD -> {
-                binding?.cardData?.text = "鍐欑敤鎴峰崱"
-            }
-        }
+    fun postCardData(cardAddr: String) {
+
         val map = mutableMapOf<String, Any>()
 
         if (cardAddr.isNotEmpty()) {
@@ -267,10 +313,7 @@
             object : SubscriberListener<BaseResponse<String>>() {
                 override fun onNext(t: BaseResponse<String>) {
                     if (t.success) {
-
                         updateCardWrittenStatus(cardAddr)
-
-
                     } else {
                         // 澶勭悊鎼滅储澶辫触鐨勬儏鍐�
                         ToastUtil.show(t.msg)
diff --git a/generallibrary/src/main/res/layout/activity_card_cancel.xml b/generallibrary/src/main/res/layout/activity_card_cancel.xml
index 31345af..ad95c59 100644
--- a/generallibrary/src/main/res/layout/activity_card_cancel.xml
+++ b/generallibrary/src/main/res/layout/activity_card_cancel.xml
@@ -14,11 +14,14 @@
         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:fillViewport="true"
+        android:visibility="visible">
 
         <LinearLayout
             android:layout_width="match_parent"
@@ -26,14 +29,12 @@
             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="visible">
+                android:orientation="vertical">
 
                 <androidx.cardview.widget.CardView
                     android:layout_width="match_parent"
@@ -42,26 +43,28 @@
                     app:cardCornerRadius="8dp"
                     app:cardElevation="2dp">
 
-                    <LinearLayout
+                    <RelativeLayout
                         android:layout_width="match_parent"
                         android:layout_height="match_parent"
-                        android:gravity="center"
-                        android:orientation="vertical"
                         android:padding="16dp">
 
                         <TextView
+                            android:id="@+id/tv_title"
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:layout_marginBottom="16dp"
+                            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="璇峰皢闇�瑕侀攢鍗$殑鍗$墖璐村湪璁惧涓婅繘琛岃鍙�"
@@ -70,38 +73,59 @@
                             android:textStyle="bold" />
 
                         <ImageView
+                            android:id="@+id/iv_nfc"
                             android:layout_width="120dp"
                             android:layout_height="120dp"
-                            android:layout_gravity="center"
+                            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" />
 
-                    </LinearLayout>
+                    </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:id="@+id/card_info_container"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:orientation="vertical"
-                android:visibility="gone">
+                android:orientation="vertical">
 
-                <!-- 鍗″唴鏁版嵁鍖哄煙 -->
+                <!-- 鍗$墖淇℃伅鍖哄煙 -->
                 <androidx.cardview.widget.CardView
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:layout_marginBottom="16dp"
+                    android:layout_marginBottom="12dp"
                     app:cardCornerRadius="8dp"
                     app:cardElevation="2dp">
 
@@ -109,34 +133,34 @@
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:orientation="vertical"
-                        android:padding="16dp">
+                        android:padding="12dp">
 
                         <TextView
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:layout_marginBottom="12dp"
-                            android:gravity="center"
+                            android:layout_marginBottom="8dp"
+                            android:gravity=""
                             android:text="鍗$墖淇℃伅"
                             android:textColor="@color/base_blue_bg"
-                            android:textSize="@dimen/big_text_size"
+                            android:textSize="16sp"
                             android:textStyle="bold" />
 
                         <!-- 鎸佸崱浜� -->
                         <LinearLayout
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:layout_marginBottom="2dp"
+                            android:layout_marginBottom="1dp"
                             android:background="#F8F9FA"
                             android:gravity="center_vertical"
                             android:orientation="horizontal"
-                            android:padding="12dp">
+                            android:padding="8dp">
 
                             <TextView
-                                android:layout_width="105dp"
+                                android:layout_width="80dp"
                                 android:layout_height="wrap_content"
                                 android:text="鎸佸崱浜猴細"
                                 android:textColor="#333333"
-                                android:textSize="@dimen/text_size" />
+                                android:textSize="14sp" />
 
                             <TextView
                                 android:id="@+id/tv_user_name"
@@ -145,25 +169,25 @@
                                 android:layout_weight="1"
                                 android:text="--"
                                 android:textColor="#666666"
-                                android:textSize="@dimen/text_size" />
+                                android:textSize="14sp" />
                         </LinearLayout>
 
                         <!-- 鍗″彿 -->
                         <LinearLayout
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:layout_marginBottom="2dp"
+                            android:layout_marginBottom="1dp"
                             android:background="#FFFFFF"
                             android:gravity="center_vertical"
                             android:orientation="horizontal"
-                            android:padding="12dp">
+                            android:padding="8dp">
 
                             <TextView
-                                android:layout_width="105dp"
+                                android:layout_width="80dp"
                                 android:layout_height="wrap_content"
                                 android:text="鍗″湴鍧�锛�"
                                 android:textColor="#333333"
-                                android:textSize="@dimen/text_size" />
+                                android:textSize="14sp" />
 
                             <TextView
                                 android:id="@+id/tv_card_number"
@@ -172,25 +196,25 @@
                                 android:layout_weight="1"
                                 android:text="--"
                                 android:textColor="#666666"
-                                android:textSize="@dimen/text_size" />
+                                android:textSize="14sp" />
                         </LinearLayout>
 
                         <!-- 鍗$墖鐘舵�� -->
                         <LinearLayout
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:layout_marginBottom="2dp"
+                            android:layout_marginBottom="1dp"
                             android:background="#F8F9FA"
                             android:gravity="center_vertical"
                             android:orientation="horizontal"
-                            android:padding="12dp">
+                            android:padding="8dp">
 
                             <TextView
-                                android:layout_width="105dp"
+                                android:layout_width="80dp"
                                 android:layout_height="wrap_content"
                                 android:text="鍗$墖鐘舵�侊細"
                                 android:textColor="#333333"
-                                android:textSize="@dimen/text_size" />
+                                android:textSize="14sp" />
 
                             <TextView
                                 android:id="@+id/tv_card_status"
@@ -199,25 +223,25 @@
                                 android:layout_weight="1"
                                 android:text="姝e父"
                                 android:textColor="#4CAF50"
-                                android:textSize="@dimen/text_size" />
+                                android:textSize="14sp" />
                         </LinearLayout>
 
                         <!-- 鍗″唴浣欓 -->
                         <LinearLayout
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:layout_marginBottom="2dp"
+                            android:layout_marginBottom="1dp"
                             android:background="#FFFFFF"
                             android:gravity="center_vertical"
                             android:orientation="horizontal"
-                            android:padding="12dp">
+                            android:padding="8dp">
 
                             <TextView
-                                android:layout_width="105dp"
+                                android:layout_width="80dp"
                                 android:layout_height="wrap_content"
                                 android:text="鍗′綑棰濓細"
                                 android:textColor="#333333"
-                                android:textSize="@dimen/text_size" />
+                                android:textSize="14sp" />
 
                             <TextView
                                 android:id="@+id/tv_card_balance"
@@ -226,7 +250,7 @@
                                 android:layout_weight="1"
                                 android:text="0.00鍏�"
                                 android:textColor="#FF6B35"
-                                android:textSize="@dimen/text_size"
+                                android:textSize="14sp"
                                 android:textStyle="bold" />
                         </LinearLayout>
 
@@ -234,18 +258,17 @@
                         <LinearLayout
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:layout_marginBottom="2dp"
                             android:background="#F8F9FA"
                             android:gravity="center_vertical"
                             android:orientation="horizontal"
-                            android:padding="12dp">
+                            android:padding="8dp">
 
                             <TextView
-                                android:layout_width="105dp"
+                                android:layout_width="80dp"
                                 android:layout_height="wrap_content"
                                 android:text="鎵嬫満鍙凤細"
                                 android:textColor="#333333"
-                                android:textSize="@dimen/text_size" />
+                                android:textSize="14sp" />
 
                             <TextView
                                 android:id="@+id/tv_phone"
@@ -254,7 +277,7 @@
                                 android:layout_weight="1"
                                 android:text="--"
                                 android:textColor="#666666"
-                                android:textSize="@dimen/text_size" />
+                                android:textSize="14sp" />
                         </LinearLayout>
 
                     </LinearLayout>
@@ -264,7 +287,6 @@
                 <androidx.cardview.widget.CardView
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:layout_marginBottom="16dp"
                     app:cardCornerRadius="8dp"
                     app:cardElevation="2dp">
 
@@ -272,94 +294,119 @@
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:orientation="vertical"
-                        android:padding="16dp">
+                        android:padding="12dp">
 
                         <TextView
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:layout_marginBottom="16dp"
-                            android:gravity="center"
+                            android:layout_marginBottom="12dp"
+                            android:gravity=""
                             android:text="閿�鍗℃搷浣�"
                             android:textColor="@color/base_blue_bg"
-                            android:textSize="@dimen/big_text_size"
+                            android:textSize="16sp"
                             android:textStyle="bold" />
 
-                        <!-- 閫�娆鹃噾棰濊緭鍏� -->
+                        <!-- 閫�娆鹃噾棰濆拰澶囨敞骞舵帓鏄剧ず -->
                         <LinearLayout
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:layout_marginBottom="16dp"
                             android:orientation="vertical">
 
-                            <TextView
-                                android:layout_width="wrap_content"
-                                android:layout_height="wrap_content"
-                                android:layout_marginBottom="8dp"
-                                android:text="閫�娆鹃噾棰濓紙鍏冿級:"
-                                android:textColor="#333333"
-                                android:textSize="@dimen/text_size"
-                                android:textStyle="bold" />
-
-                            <EditText
-                                android:id="@+id/et_refund_amount"
+                            <!-- 閫�娆鹃噾棰濊緭鍏� -->
+                            <LinearLayout
                                 android:layout_width="match_parent"
-                                android:layout_height="48dp"
-                                android:background="@drawable/edit_text_bg"
-                                android:hint="璇疯緭鍏ラ��娆鹃噾棰�"
-                                android:inputType="numberDecimal"
-                                android:padding="12dp"
-                                android:textColor="#333333"
-                                android:textColorHint="#999999"
-                                android:textSize="@dimen/text_size" />
-                        </LinearLayout>
-
-                        <!-- 澶囨敞杈撳叆 -->
-                        <LinearLayout
-                            android:layout_width="match_parent"
-                            android:layout_height="wrap_content"
-                            android:layout_marginBottom="24dp"
-                            android:orientation="vertical">
-
-                            <TextView
-                                android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
-                                android:layout_marginBottom="8dp"
-                                android:text="澶囨敞:"
-                                android:textColor="#333333"
-                                android:textSize="@dimen/text_size"
-                                android:textStyle="bold" />
+                                android:layout_marginEnd="6dp"
+                                android:layout_weight="1"
+                                android:orientation="vertical">
 
-                            <EditText
-                                android:id="@+id/et_remarks"
+                                <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_refund_amount"
+                                    android:layout_width="match_parent"
+                                    android:layout_height="40dp"
+                                    android:layout_marginTop="5dp"
+                                    android:background="@drawable/edit_text_bg"
+                                    android:hint="璇疯緭鍏ラ��娆鹃噾棰�"
+                                    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="80dp"
-                                android:background="@drawable/edit_text_bg"
-                                android:gravity="top|start"
-                                android:hint="璇疯緭鍏ラ攢鍗″娉ㄤ俊鎭�"
-                                android:inputType="textMultiLine"
-                                android:padding="12dp"
-                                android:textColor="#333333"
-                                android:textColorHint="#999999"
-                                android:textSize="@dimen/text_size" />
-                        </LinearLayout>
+                                android:layout_height="wrap_content"
+                                android:layout_marginTop="5dp"
+                                android:layout_weight="1"
+                                android:orientation="vertical">
 
-                        <!-- 閿�鍗℃寜閽� -->
-                        <Button
-                            android:id="@+id/btn_cancel_card"
-                            android:layout_width="match_parent"
-                            android:layout_height="48dp"
-                            android:background="@drawable/button_red_bg"
-                            android:text="纭閿�鍗�"
-                            android:textColor="#FFFFFF"
-                            android:textSize="@dimen/big_text_size"
-                            android:textStyle="bold" />
+                                <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="璇疯緭鍏ラ攢鍗″娉�"
+                                    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>
-    </ScrollView>
+    <!-- 搴曢儴鎸夐挳鍖哄煙 -->
+    <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_cancel_card"
+            android:layout_width="match_parent"
+            android:layout_height="48dp"
+            android:background="@drawable/button_red_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