From 8ad22c47f5d44635618f75e7085743893cdace4c Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期五, 20 六月 2025 14:22:01 +0800
Subject: [PATCH] refactor(generallibrary):重构制卡首页并添加解除挂失功能

---
 generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt               |    3 
 /dev/null                                                                      |  173 ----------
 generallibrary/src/main/java/com/dayu/general/activity/LossCardActivity.kt     |    4 
 generallibrary/src/main/res/layout/item_unloss_card_list.xml                   |  145 +++++++++
 generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt       |   69 +++
 generallibrary/src/main/AndroidManifest.xml                                    |   12 
 generallibrary/src/main/res/values/colors.xml                                  |    2 
 generallibrary/src/main/java/com/dayu/general/activity/UnlossCardActivity.kt   |  380 +++++++++++++++++++++++
 generallibrary/src/main/java/com/dayu/general/adapter/UnlossCardListAdapter.kt |  138 ++++++++
 9 files changed, 736 insertions(+), 190 deletions(-)

diff --git a/generallibrary/src/main/AndroidManifest.xml b/generallibrary/src/main/AndroidManifest.xml
index e873d53..3d88ae9 100644
--- a/generallibrary/src/main/AndroidManifest.xml
+++ b/generallibrary/src/main/AndroidManifest.xml
@@ -86,8 +86,6 @@
             </intent-filter>
         </activity>
 
-        <!-- 鏂板琛ュ崱Activity -->
-        <activity android:name=".activity.CardReplaceActivity" />
 
         <!-- 鍐欏崱鎴愬姛椤甸潰 -->
         <activity android:name=".activity.CardWriteSuccessActivity" />
@@ -117,7 +115,8 @@
             </intent-filter>
         </activity>
 
-        <activity android:name=".activity.CardReturnActivity"
+        <activity
+            android:name=".activity.CardReturnActivity"
             android:exported="false"
             android:launchMode="singleTop">
             <intent-filter>
@@ -126,7 +125,8 @@
                 <data android:mimeType="text/plain" />
             </intent-filter>
         </activity>
-        <activity android:name=".activity.CardDeductActivity"
+        <activity
+            android:name=".activity.CardDeductActivity"
             android:exported="false"
             android:launchMode="singleTop">
             <intent-filter>
@@ -135,6 +135,10 @@
                 <data android:mimeType="text/plain" />
             </intent-filter>
         </activity>
+        <activity
+            android:name=".activity.UnlossCardActivity"
+            android:exported="false"
+            android:launchMode="singleTop"/>
 
         <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 db849ff..8a14a09 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/BSCardFragment.kt
@@ -10,59 +10,108 @@
 
 /**
  * @author: zuo
- * @desc: 鍒跺崱棣栭〉
- * @since:2025/3/6
+ * @desc: 鍒跺崱棣栭〉 - 鍏呭�肩郴缁熺殑鍒跺崱鍔熻兘涓荤晫闈ragment
+ * @since: 2025/3/6
+ *
+ * 璇ragment鎻愪緵鍒跺崱鐩稿叧鐨勫悇绉嶅姛鑳藉叆鍙o紝鍖呮嫭锛�
+ * - 鏂扮敤鎴峰埗鍗�
+ * - 鍗$墖绠$悊
+ * - 鎸傚け鍗�
+ * - 琛ュ崱
+ * - 璇诲崱
+ * - 閫�鍗�
+ * - 閿�鍗�
+ * - 鎵h垂
  */
-class BSCardFragment :Fragment() {
+class BSCardFragment : Fragment() {
 
+    // 瑙嗗浘缁戝畾瀵硅薄锛岀敤浜庡畨鍏ㄨ闂瓼ragment甯冨眬涓殑鎺т欢
     private lateinit var binding: FragmentCardBinding
+
+    /**
+     * Fragment鍒涘缓鏃剁殑鍒濆鍖栨柟娉�
+     * @param savedInstanceState 淇濆瓨鐨勫疄渚嬬姸鎬�
+     */
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
     }
 
+    /**
+     * 鍒涘缓Fragment鐨勮鍥�
+     * @param inflater 甯冨眬鍔犺浇鍣�
+     * @param container 鐖跺鍣�
+     * @param savedInstanceState 淇濆瓨鐨勫疄渚嬬姸鎬�
+     * @return 杩斿洖Fragment鐨勬牴瑙嗗浘
+     */
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View? {
+        // 浣跨敤ViewBinding鍔犺浇Fragment甯冨眬
         binding = FragmentCardBinding.inflate(LayoutInflater.from(context), container, false)
+        // 鍒濆鍖栬鍥炬帶浠跺拰浜嬩欢鐩戝惉
         initView()
         return binding?.root
     }
 
+    /**
+     * 鍒濆鍖栬鍥炬帶浠跺拰璁剧疆鐐瑰嚮浜嬩欢鐩戝惉鍣�
+     * 涓哄埗鍗¢椤电殑鍚勪釜鍔熻兘鎸夐挳璁剧疆瀵瑰簲鐨勭偣鍑讳簨浠�
+     */
     private fun initView() {
+        // 鏂扮敤鎴峰埗鍗℃寜閽偣鍑讳簨浠�
         binding.homeNewCard.setOnClickListener {
+            // 璺宠浆鍒扮敤鎴锋悳绱㈠垪琛ㄩ〉闈紝浼犻�掑埗鍗$被鍨嬪弬鏁�
             val intent = Intent(context, SearchUserListActivity::class.java).apply {
-                putExtra("type", "newUser")
+                putExtra("type", "newUser") // 鏍囪瘑涓烘柊鐢ㄦ埛鍒跺崱绫诲瀷
             }
             startActivity(intent)
         }
+
+        // 鍗$墖绠$悊鎸夐挳鐐瑰嚮浜嬩欢
         binding.homeManage.setOnClickListener {
+            // 璺宠浆鍒扮鐞嗗垪琛ㄩ〉闈�
             val intent = Intent(context, ManageListActivity::class.java)
             startActivity(intent)
         }
+
+        // 鎸傚け鍗℃寜閽偣鍑讳簨浠�
         binding.homeLossLL.setOnClickListener {
+            // 璺宠浆鍒版寕澶卞崱椤甸潰
             val intent = Intent(context, LossCardActivity::class.java)
             startActivity(intent)
         }
-        binding.homeReplaceLL.setOnClickListener{
-            val intent = Intent(context, SearchCardListActivity::class.java).apply{
-                putExtra("type", "replace")
-            }
-            startActivity(intent)
-        }
+
+        // 璇诲崱鎸夐挳鐐瑰嚮浜嬩欢
         binding.homeRedCard.setOnClickListener {
+            // 浣跨敤CardReadActivity鐨勯潤鎬佹柟娉曞惎鍔ㄨ鍗¢〉闈�
             context?.let { CardReadActivity.start(it) }
         }
+
+        // 閫�鍗℃寜閽偣鍑讳簨浠�
         binding.homeReverse.setOnClickListener {
+            // 浣跨敤CardReturnActivity鐨勯潤鎬佹柟娉曞惎鍔ㄩ��鍗¢〉闈�
             context?.let { CardReturnActivity.start(it) }
         }
+
+        // 閿�鍗℃寜閽偣鍑讳簨浠�
         binding.homeCancelCard.setOnClickListener {
+            // 浣跨敤CardCancelActivity鐨勯潤鎬佹柟娉曞惎鍔ㄩ攢鍗¢〉闈�
             context?.let { CardCancelActivity.start(it) }
         }
+
+        // 鎵h垂鎸夐挳鐐瑰嚮浜嬩欢
         binding.homeDeduction.setOnClickListener {
+            // 浣跨敤CardDeductActivity鐨勯潤鎬佹柟娉曞惎鍔ㄦ墸璐归〉闈�
             context?.let { CardDeductActivity.start(it) }
         }
+        binding.homeReplacement.setOnClickListener {
+            context?.let {
+                val intent = Intent(context, UnlossCardActivity::class.java)
+                startActivity(intent)
+            }
+        }
     }
 }
 
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt
deleted file mode 100644
index fae0023..0000000
--- a/generallibrary/src/main/java/com/dayu/general/activity/CardReplaceActivity.kt
+++ /dev/null
@@ -1,173 +0,0 @@
-package com.dayu.general.activity
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.inputmethod.EditorInfo
-import androidx.recyclerview.widget.LinearLayoutManager
-import com.dayu.baselibrary.net.subscribers.SubscriberListener
-import com.dayu.baselibrary.utils.ToastUtil
-import com.dayu.general.adapter.CardReplaceAdapter
-import com.dayu.general.bean.net.CardReplaceInfo
-import com.dayu.general.bean.net.CardReplaceResponse
-import com.dayu.general.databinding.ActivityCardReplaceBinding
-import com.dayu.general.net.ApiManager
-import com.dayu.general.net.BaseResponse
-import com.scwang.smart.refresh.layout.api.RefreshLayout
-import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
-
-/**
- * 鍗$墖琛ュ姙Activity
- */
-class CardReplaceActivity : BaseActivity() {
-
-    private lateinit var binding: ActivityCardReplaceBinding
-    private var currentCardInfo: CardReplaceInfo? = null
-    private lateinit var adapter: CardReplaceAdapter
-    
-    // 鍒嗛〉鍙傛暟
-    private var pageCurr: Int = 1
-    private val pageSize: Int = 20
-    private var hasMoreData: Boolean = true
-    
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        binding = ActivityCardReplaceBinding.inflate(LayoutInflater.from(this))
-        setContentView(binding.root)
-        
-        initView()
-        initRecyclerView()
-        setupRefreshLayout()
-        loadCardReplaceList(true)
-    }
-    
-    /**
-     * 鍒濆鍖栬鍥�
-     */
-    private fun initView() {
-        // 鍒濆鍖栨爣棰樻爮
-        binding.titleBar.setOnItemclickListner(com.dayu.baselibrary.view.TitleBar.ClickType_LEFT_IMAGE) { 
-            finish() 
-        }
-    }
-    
-    /**
-     * 鍒濆鍖朢ecyclerView
-     */
-    private fun initRecyclerView() {
-        // 鍒涘缓閫傞厤鍣�
-        adapter = CardReplaceAdapter(this)
-        
-        // 璁剧疆甯冨眬绠$悊鍣ㄥ拰閫傞厤鍣�
-        binding.recyclerView.apply {
-            layoutManager = LinearLayoutManager(this@CardReplaceActivity)
-            adapter = this@CardReplaceActivity.adapter
-        }
-        
-        // 璁剧疆鍗$墖鐐瑰嚮鐩戝惉鍣� - 鐐瑰嚮鍒楄〃椤规椂鎵ц琛ュ姙鎿嶄綔
-        adapter.setOnItemClickListener { cardInfo ->
-            currentCardInfo = cardInfo
-            // 鐩存帴鎵ц琛ュ姙鎿嶄綔
-            performCardReplace(cardInfo)
-        }
-    }
-    
-    /**
-     * 璁剧疆鍒锋柊甯冨眬
-     */
-    private fun setupRefreshLayout() {
-        binding.refreshLayout.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener {
-            override fun onRefresh(refreshLayout: RefreshLayout) {
-                // 涓嬫媺鍒锋柊锛岄噸缃〉鐮佸苟閲嶆柊鍔犺浇鏁版嵁
-                pageCurr = 1
-                hasMoreData = true
-                loadCardReplaceList(true)
-            }
-            
-            override fun onLoadMore(refreshLayout: RefreshLayout) {
-                // 涓婃媺鍔犺浇鏇村
-                if (hasMoreData) {
-                    pageCurr++
-                    loadCardReplaceList(false)
-                } else {
-                    // 娌℃湁鏇村鏁版嵁鏃讹紝缁撴潫鍔犺浇鏇村
-                    refreshLayout.finishLoadMoreWithNoMoreData()
-                }
-            }
-        })
-    }
-
-    /**
-     * 鍔犺浇鍙ˉ鍔炲崱鐗囧垪琛�
-     * 
-     * @param isRefresh 鏄惁涓哄埛鏂版搷浣滐紙true: 鍒锋柊锛宖alse: 鍔犺浇鏇村锛�
-     */
-    private fun loadCardReplaceList(isRefresh: Boolean = true) {
-        // 鏋勫缓鏌ヨ鍙傛暟
-        val params = HashMap<String, Any>().apply {
-            put("pageCurr", pageCurr)
-            put("pageSize", pageSize)
-        }
-
-        // 璋冪敤API鏌ヨ鎸傚け鍗$墖淇℃伅
-        ApiManager.getInstance().requestGetLoading(
-            this,
-            "sell/clientcard/getUnreplaced",
-            CardReplaceResponse::class.java,
-            params,
-            object : SubscriberListener<BaseResponse<CardReplaceResponse>>() {
-                override fun onNext(response: BaseResponse<CardReplaceResponse>) {
-                    // 缁撴潫鍒锋柊鎴栧姞杞芥洿澶氱姸鎬�
-                    finishRefreshOrLoadMore(isRefresh)
-                    
-                    if (response.success) {
-                        val cardResponse = response.content
-                        val cardList = cardResponse?.obj ?: emptyList()
-                        
-                        // 鏇存柊鏁版嵁鍒楄〃
-                        if (isRefresh) {
-                            adapter.setData(cardList)
-                        } else {
-                            adapter.addData(cardList)
-                        }
-                        
-                        // 鍒ゆ柇鏄惁杩樻湁鏇村鏁版嵁
-                        hasMoreData = cardList.size >= pageSize
-                        if (!hasMoreData && !isRefresh) {
-                            binding.refreshLayout.finishLoadMoreWithNoMoreData()
-                        }
-                    } else {
-                        ToastUtil.show(response.msg)
-                    }
-                }
-                
-                override fun onError(e: Throwable?) {
-                    // 缁撴潫鍒锋柊鎴栧姞杞芥洿澶氱姸鎬�
-                    finishRefreshOrLoadMore(isRefresh)
-                    ToastUtil.show("鏌ヨ澶辫触: ${e?.message ?: "鏈煡閿欒"}")
-                }
-            }
-        )
-    }
-    
-    /**
-     * 缁撴潫鍒锋柊鎴栧姞杞芥洿澶氱姸鎬�
-     */
-    private fun finishRefreshOrLoadMore(isRefresh: Boolean) {
-        if (isRefresh) {
-            binding.refreshLayout.finishRefresh()
-        } else {
-            binding.refreshLayout.finishLoadMore()
-        }
-    }
-    
-    /**
-     * 鎵ц鍗$墖琛ュ姙鎿嶄綔
-     */
-    private fun performCardReplace(cardInfo: CardReplaceInfo) {
-        // 杩欓噷瀹炵幇鍗$墖琛ュ姙鐨勪笟鍔¢�昏緫
-        ToastUtil.show("閫夋嫨浜嗗崱鐗囪繘琛岃ˉ鍔烇細${cardInfo.cardNum}")
-        
-        // TODO: 璋冪敤琛ュ姙鍗$墖API
-    }
-} 
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/LossCardActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/LossCardActivity.kt
index 424d5f0..a2696e3 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/LossCardActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/LossCardActivity.kt
@@ -18,7 +18,7 @@
 import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
 
 /**
- * Description:
+ * Description: 鎸傚け
  * Author: zuo
  * Date: 2025/6/11
  */
@@ -177,7 +177,7 @@
         // 浣跨敤姝g‘鐨勭被鍨嬪弬鏁�
         ApiManager.getInstance().requestGetLoading(
             this,
-            "sell/clientcard/getcards",
+            "terminal/card/getcards",
             SearchCardResult::class.java,
             map,
             object : SubscriberListener<BaseResponse<SearchCardResult>>() {
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/UnlossCardActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/UnlossCardActivity.kt
new file mode 100644
index 0000000..fee60df
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/activity/UnlossCardActivity.kt
@@ -0,0 +1,380 @@
+package com.dayu.general.activity
+
+import android.os.Bundle
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.dayu.baselibrary.net.subscribers.SubscriberListener
+import com.dayu.baselibrary.utils.ToastUtil
+import com.dayu.baselibrary.view.ConfirmDialog
+import com.dayu.baselibrary.view.TitleBar.ClickType_LEFT_IMAGE
+import com.dayu.baselibrary.view.TitleBar.ClickType_RIGHT_IMAGE
+import com.dayu.general.BaseApplication
+import com.dayu.general.adapter.UnlossCardListAdapter
+import com.dayu.general.bean.net.SearchCardResult
+import com.dayu.general.databinding.ActivityCardListBinding
+import com.dayu.general.net.ApiManager
+import com.dayu.general.net.BaseResponse
+import com.dayu.general.view.SearchDialog
+import com.scwang.smart.refresh.layout.api.RefreshLayout
+import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener
+
+/**
+ * Description: 瑙i櫎鎸傚け鍜岃ˉ鍗�
+ * Author: zuo
+ * Date: 2025/6/11
+ */
+class UnlossCardActivity : BaseActivity() {
+
+    var binding: ActivityCardListBinding? = null
+    private var cardAdapter: UnlossCardListAdapter? = null
+    var searchDialog: SearchDialog? = null
+
+    // 鍒嗛〉鐩稿叧鍙橀噺
+    private var currentPage = 1
+    private val pageSize = 20
+    private var hasMoreData = true
+
+    // 淇濆瓨褰撳墠鎼滅储鏉′欢
+    private var currentFarmerId = ""
+    private var currentFarmerName = ""
+    private var currentCardNumber = ""
+
+    lateinit var confirmDialog: ConfirmDialog
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding = ActivityCardListBinding.inflate(layoutInflater)
+        setContentView(binding?.root)
+        initView()
+        setupRecyclerView()
+        setupRefreshLayout()
+
+        // 纭繚Footer鍒濆鐘舵�佹纭�
+        binding?.refreshLayout?.setEnableLoadMore(true)
+    }
+
+    fun initView() {
+
+        binding?.titleBar?.setOnItemclickListner(ClickType_LEFT_IMAGE) { this.finish() }
+
+        // 璁剧疆鏍囬
+        binding?.titleBar?.setCenterText("瑙i櫎鎸傚け/琛ュ崱")
+        searchDialog = SearchDialog(this)
+        // 璁剧疆鎼滅储鐩戝惉鍣�
+        searchDialog?.setOnSearchListener(object : SearchDialog.OnSearchListener {
+            override fun onSearch(farmerId: String, farmerName: String, cardNumber: String) {
+                // 淇濆瓨褰撳墠鎼滅储鏉′欢
+                currentCardNumber = cardNumber
+                currentFarmerId = farmerId
+                currentFarmerName = farmerName
+
+                // 閲嶇疆鍒嗛〉鐘舵��
+                currentPage = 1
+                hasMoreData = true
+
+                // 閲嶇疆鏃犳洿澶氭暟鎹姸鎬�
+                binding?.refreshLayout?.resetNoMoreData()
+
+                // 鎵ц鎼滅储
+                searchCards(currentFarmerId, currentFarmerName, currentCardNumber, true)
+            }
+        })
+        binding?.titleBar?.setOnItemclickListner(ClickType_RIGHT_IMAGE) {
+            // 鏄剧ず鎼滅储瀵硅瘽妗�
+            searchDialog?.show()
+        }
+        searchCards(currentFarmerId, currentFarmerName, currentCardNumber, true)
+    }
+
+    private fun setupRecyclerView() {
+        cardAdapter = UnlossCardListAdapter(this)
+        binding?.recyclerView?.apply {
+            layoutManager = LinearLayoutManager(this@UnlossCardActivity)
+            adapter = cardAdapter
+        }
+
+        // 璁剧疆瑙i櫎鎸傚け鎸夐挳鐐瑰嚮浜嬩欢
+        cardAdapter?.setOnUnlossClickListener { card ->
+            showUnlossConfirmDialog(card)
+        }
+
+        // 璁剧疆琛ュ崱鎸夐挳鐐瑰嚮浜嬩欢  
+        cardAdapter?.setOnReplaceClickListener { card ->
+            showReplaceConfirmDialog(card)
+        }
+    }
+
+    private fun setupRefreshLayout() {
+        binding?.refreshLayout?.apply {
+            // 璁剧疆Footer璺熼殢鍔熻兘锛岀‘淇濇棤鏇村鏁版嵁鏃禙ooter鑳芥纭樉绀�
+            setEnableFooterFollowWhenNoMoreData(true)
+            // 璁剧疆鍔犺浇鏇村瀹屾垚鍚庢粴鍔ㄥ唴瀹规樉绀烘柊鏁版嵁
+            setEnableScrollContentWhenLoaded(true)
+            // 绂佺敤绾粴鍔ㄦā寮忥紝纭繚Footer鑳芥甯稿伐浣�
+            setEnableOverScrollDrag(false)
+
+            // 璁剧疆鍒锋柊鍜屽姞杞芥洿澶氱洃鍚櫒
+            setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener {
+                override fun onRefresh(refreshLayout: RefreshLayout) {
+                    // 閲嶇疆椤电爜骞跺埛鏂版暟鎹�
+                    currentPage = 1
+                    hasMoreData = true
+                    // 閲嶇疆鏃犳洿澶氭暟鎹姸鎬�
+                    refreshLayout.resetNoMoreData()
+                    searchCards(currentFarmerId, currentFarmerName, currentCardNumber, true)
+                }
+
+                override fun onLoadMore(refreshLayout: RefreshLayout) {
+                    // 濡傛灉杩樻湁鏇村鏁版嵁锛屽姞杞戒笅涓�椤�
+                    if (hasMoreData) {
+                        currentPage++
+                        searchCards(currentFarmerId, currentFarmerName, currentCardNumber, false)
+                    } else {
+                        // 瀹屾垚鍔犺浇骞舵樉绀哄凡鍒板簳鐘舵��
+                        refreshLayout.finishLoadMoreWithNoMoreData()
+                    }
+                }
+            })
+        }
+    }
+
+    /**
+     * 鏍规嵁鍗″彿銆佸鎴风紪鍙峰拰瀹㈡埛濮撳悕鎼滅储宸叉寕澶辩殑鍗$墖
+     *
+     * @param farmerId 瀹㈡埛缂栧彿
+     * @param farmerName 瀹㈡埛濮撳悕
+     * @param cardNumber 鍗″彿
+     * @param isRefresh 鏄惁涓哄埛鏂版搷浣�
+     */
+    private fun searchCards(
+        farmerId: String,
+        farmerName: String,
+        cardNumber: String,
+        isRefresh: Boolean = true
+    ) {
+        val map = mutableMapOf<String, Any>()
+
+        if (cardNumber.isNotEmpty()) {
+            map["cardNum"] = cardNumber
+        }
+
+        if (farmerId.isNotEmpty()) {
+            map["clientNum"] = farmerId
+        }
+
+        if (farmerName.isNotEmpty()) {
+            map["clientName"] = farmerName
+        }
+
+        // 娣诲姞鍒嗛〉鍙傛暟
+        map["pageCurr"] = currentPage
+        map["pageSize"] = pageSize
+
+        // 浣跨敤涓撻棬鐨勬寕澶卞崱鐗囨帴鍙�
+        ApiManager.getInstance().requestGetLoading(
+            this,
+            "terminal/card/getlostcards",
+            SearchCardResult::class.java,
+            map,
+            object : SubscriberListener<BaseResponse<SearchCardResult>>() {
+                override fun onNext(t: BaseResponse<SearchCardResult>) {
+                    if (t.success) {
+                        // 澶勭悊鎼滅储鎴愬姛鐨勬儏鍐�
+                        val result = t.content
+                        if (result != null) {
+                            // 澶勭悊鎼滅储缁撴灉
+                            if (result.obj.isNotEmpty()) {
+                                // 鏍规嵁鏄惁涓哄埛鏂版搷浣滃喅瀹氬浣曟洿鏂版暟鎹�
+                                if (isRefresh) {
+                                    cardAdapter?.setData(result.obj)
+                                } else {
+                                    cardAdapter?.addData(result.obj)
+                                }
+
+                                // 鍒ゆ柇鏄惁杩樻湁鏇村鏁版嵁锛氭牴鎹綋鍓嶉〉鐮佸拰鎬婚〉鏁板垽鏂�
+                                hasMoreData = currentPage < result.pageTotal
+
+                                // 瀹屾垚鍒锋柊鎴栧姞杞藉姩浣�
+                                if (isRefresh) {
+                                    binding?.refreshLayout?.finishRefresh(true)
+                                } else {
+                                    // 濡傛灉娌℃湁鏇村鏁版嵁浜嗭紝璁剧疆宸插埌搴曠姸鎬�
+                                    if (!hasMoreData) {
+                                        binding?.refreshLayout?.finishLoadMoreWithNoMoreData()
+                                    } else {
+                                        binding?.refreshLayout?.finishLoadMore(true)
+                                    }
+                                }
+                            } else {
+                                if (isRefresh) {
+                                    cardAdapter?.setData(emptyList())
+                                    binding?.refreshLayout?.finishRefresh(true)
+                                    ToastUtil.show("鏈壘鍒板尮閰嶇殑鍗$墖")
+                                } else {
+                                    hasMoreData = false
+                                    // 浣跨敤finishLoadMoreWithNoMoreData鏄剧ず宸插埌搴曠姸鎬�
+                                    binding?.refreshLayout?.finishLoadMoreWithNoMoreData()
+                                }
+                            }
+                        } else {
+                            if (isRefresh) {
+                                cardAdapter?.setData(emptyList())
+                                binding?.refreshLayout?.finishRefresh(true)
+                                ToastUtil.show("鏈壘鍒板尮閰嶇殑鍗$墖")
+                            } else {
+                                hasMoreData = false
+                                binding?.refreshLayout?.finishLoadMoreWithNoMoreData()
+                            }
+                        }
+                    } else {
+                        // 澶勭悊鎼滅储澶辫触鐨勬儏鍐�
+                        finishRefreshOrLoad(isRefresh)
+                        ToastUtil.show(t.msg)
+                    }
+                }
+
+                override fun onError(e: Throwable?) {
+                    super.onError(e)
+                    // 瀹屾垚鍒锋柊鎴栧姞杞藉姩浣�
+                    finishRefreshOrLoad(isRefresh)
+                    ToastUtil.show("鎼滅储澶辫触: ${e?.message ?: "鏈煡閿欒"}")
+                }
+            }
+        )
+    }
+
+    /**
+     * 鏄剧ず瑙i櫎鎸傚け纭瀵硅瘽妗�
+     */
+    private fun showUnlossConfirmDialog(card: SearchCardResult.CardInfo) {
+        val confirmMessage =
+            "鍗″彿锛�${card.cardNum ?: "鏃�"}\n\n" +
+                    "鎸佸崱浜猴細${card.clientName ?: "鏈煡"}\n\n" +
+                    "浣欓锛�${card.money ?: "0.00"}鍏�"
+
+        confirmDialog = ConfirmDialog(
+            this,
+            "瑙i櫎鎸傚け纭",
+            confirmMessage
+        ) {
+            // 鐢ㄦ埛鐐瑰嚮纭鍚庢墽琛岃В闄ゆ寕澶辨搷浣�
+            unlossCard(card)
+            confirmDialog.dismiss()
+        }
+        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櫎鎸傚け
+     */
+    private fun unlossCard(cardInfo: SearchCardResult.CardInfo) {
+        val map = mutableMapOf<String, Any>()
+        map["cardNum"] = cardInfo.cardNum.toString()
+        map["operator"] = BaseApplication.userId
+        map["money"] = cardInfo.money?.replace(",", "") ?: "0"
+
+        ApiManager.getInstance().requestPostLoading(
+            this,
+            "terminal/card/termUnlock",
+            SearchCardResult::class.java,
+            map,
+            object : SubscriberListener<BaseResponse<SearchCardResult>>() {
+                override fun onNext(t: BaseResponse<SearchCardResult>) {
+                    if (t.success) {
+                        ToastUtil.show("瑙i櫎鎸傚け鎴愬姛")
+                        // 鍒锋柊鍒楄〃
+                        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("瑙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 ?: "鏈煡閿欒"}")
+                }
+            }
+        )
+    }
+
+    /**
+     * 瀹屾垚鍒锋柊鎴栧姞杞芥搷浣�
+     * @param isRefresh 鏄惁涓哄埛鏂版搷浣�
+     */
+    private fun finishRefreshOrLoad(isRefresh: Boolean) {
+        if (isRefresh) {
+            binding?.refreshLayout?.finishRefresh(true)
+        } else {
+            // 濡傛灉娌℃湁鏇村鏁版嵁锛屼笉鍦ㄨ繖閲岃皟鐢╢inishLoadMore锛岀敱鍏蜂綋閫昏緫璋冪敤finishLoadMoreWithNoMoreData
+            // 濡傛灉鏈夋洿澶氭暟鎹紝鍒欐甯歌皟鐢╢inishLoadMore
+            if (hasMoreData) {
+                binding?.refreshLayout?.finishLoadMore(true)
+            }
+            // 娉ㄦ剰锛氬綋hasMoreData涓篺alse鏃讹紝涓嶈皟鐢ㄤ换浣昮inish鏂规硶锛�
+            // 鍥犱负宸茬粡鍦ㄥ叿浣撻�昏緫涓皟鐢ㄤ簡finishLoadMoreWithNoMoreData()
+        }
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        searchDialog?.dismiss()
+    }
+} 
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/adapter/UnlossCardListAdapter.kt b/generallibrary/src/main/java/com/dayu/general/adapter/UnlossCardListAdapter.kt
new file mode 100644
index 0000000..7ec78b3
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/adapter/UnlossCardListAdapter.kt
@@ -0,0 +1,138 @@
+package com.dayu.general.adapter
+
+import android.content.Context
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.databinding.DataBindingUtil
+import androidx.recyclerview.widget.RecyclerView
+import com.dayu.baselibrary.databinding.ItemNoMoreBinding
+import com.dayu.general.R
+import com.dayu.general.bean.net.SearchCardResult
+import com.dayu.general.databinding.ItemUnlossCardListBinding
+
+/**
+ * Description: 瑙i櫎鎸傚け鍜岃ˉ鍗″垪琛ㄩ�傞厤鍣�
+ * Author: zuo
+ * Date: 2025/6/11
+ */
+class UnlossCardListAdapter(context: Context) : BaseRecycleAdapter<RecyclerView.ViewHolder>() {
+
+    private var cardList: List<SearchCardResult.CardInfo> = emptyList()
+    private var onUnlossClickListener: ((SearchCardResult.CardInfo) -> Unit)? = null
+    private var onReplaceClickListener: ((SearchCardResult.CardInfo) -> Unit)? = null
+    var mContext: Context = context
+
+    fun setData(data: List<SearchCardResult.CardInfo>) {
+        cardList = data
+        notifyDataSetChanged()
+    }
+
+    fun addData(data: List<SearchCardResult.CardInfo>) {
+        val oldSize = cardList.size
+        cardList = cardList + data
+        notifyItemRangeInserted(oldSize, data.size)
+    }
+
+    fun setOnUnlossClickListener(listener: (SearchCardResult.CardInfo) -> Unit) {
+        onUnlossClickListener = listener
+    }
+
+    fun setOnReplaceClickListener(listener: (SearchCardResult.CardInfo) -> Unit) {
+        onReplaceClickListener = listener
+    }
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
+        if (viewType == VIEW_TYPE_EMPTY) {
+            val emptyView: ItemNoMoreBinding = DataBindingUtil.inflate(
+                (mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater)!!,
+                com.dayu.baselibrary.R.layout.item_no_more,
+                parent,
+                false
+            )
+            return ViewHolderEmpty(emptyView)
+        } else {
+            val binding = ItemUnlossCardListBinding.inflate(
+                mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater,
+                parent,
+                false
+            )
+            return CardViewHolder(binding)
+        }
+    }
+
+    override fun getItemViewType(position: Int): Int {
+        if (cardList.size == 0) {
+            return VIEW_TYPE_EMPTY
+        } else {
+            return VIEW_TYPE_ITEM
+        }
+    }
+
+    override fun getItemCount(): Int {
+        //鍚屾椂杩欓噷涔熼渶瑕佹坊鍔犲垽鏂紝濡傛灉mData.size()涓�0鐨勮瘽锛屽彧寮曞叆涓�涓竷灞�锛屽氨鏄痚mptyView
+        // 閭d箞锛岃繖涓猺ecyclerView鐨刬temCount涓�1
+        if (cardList.size == 0) {
+            return 1
+        }
+        return cardList.size
+    }
+
+    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
+        if (holder is ViewHolderEmpty) {
+            // 绌鸿鍥句笉闇�瑕佺粦瀹氭暟鎹�
+            return
+        }
+        
+        if (holder is CardViewHolder) {
+            val card = cardList[position]
+            holder.bind(card)
+        }
+    }
+
+    inner class CardViewHolder(private val binding: ItemUnlossCardListBinding) : RecyclerView.ViewHolder(binding.root) {
+
+        fun bind(card: SearchCardResult.CardInfo) {
+            // 璁剧疆鏁版嵁鏄剧ず锛屾坊鍔犲垽绌哄鐞�
+            binding.tvCardNumber.text = "鍗″彿锛�${card.cardNum ?: "鏃�"}"
+            binding.tvCardType.text = "鍗$被鍨嬶細${card.cardType ?: "鏈煡"}"
+            binding.tvCardStatus.text = "鐘舵�侊細${card.stateName ?: "鏈煡"}"
+            binding.tvClientName.text = "濮撳悕锛�${card.clientName ?: "鏈煡"}"
+            binding.tvClientNum.text = "瀹㈡埛缂栧彿锛�${card.clientNum ?: "鏃�"}"
+            binding.tvCardBalance.text = "浣欓锛�${card.money ?: "0.00"} 鍏�"
+            binding.tvPhone.text = "鐢佃瘽锛�${formatPhone(card.phone)}"
+            binding.tvIdCard.text = "韬唤璇侊細${formatIdCard(card.idCard)}"
+
+            // 璁剧疆瑙i櫎鎸傚け鎸夐挳鐐瑰嚮浜嬩欢
+            binding.btnUnloss.setOnClickListener {
+                onUnlossClickListener?.invoke(card)
+            }
+
+            // 璁剧疆琛ュ崱鎸夐挳鐐瑰嚮浜嬩欢
+            binding.btnReplace.setOnClickListener {
+                onReplaceClickListener?.invoke(card)
+            }
+        }
+
+        // 鏍煎紡鍖栬韩浠借瘉鍙凤紝淇濇姢闅愮
+        private fun formatIdCard(idCard: String?): String {
+            return if (!idCard.isNullOrEmpty() && idCard.length >= 18) {
+                val start = idCard.substring(0, 6)
+                val end = idCard.substring(idCard.length - 4)
+                "$start****$end"
+            } else {
+                idCard ?: "鏃�"
+            }
+        }
+
+        // 鏍煎紡鍖栨墜鏈哄彿锛屼繚鎶ら殣绉�
+        private fun formatPhone(phone: String?): String {
+            return if (!phone.isNullOrEmpty() && phone.length >= 11) {
+                val start = phone.substring(0, 3)
+                val end = phone.substring(phone.length - 4)
+                "$start****$end"
+            } else {
+                phone ?: "鏃�"
+            }
+        }
+    }
+} 
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt b/generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt
index 42a877f..177a96d 100644
--- a/generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt
+++ b/generallibrary/src/main/java/com/dayu/general/net/NetConstans.kt
@@ -7,8 +7,9 @@
  */
 class NetConstans {
     companion object {
-        const val BASE_URL: String = "https://no253541tf71.vicp.fun/"
+//        const val BASE_URL: String = "https://no253541tf71.vicp.fun/"
 //        const val BASE_URL: String = "http://192.168.40.166:54321/"
+        const val BASE_URL: String = "http://192.168.10.87:54321/"
 
         const val TOKEN_INVALID: String = "0000"
     }
diff --git a/generallibrary/src/main/res/layout/item_unloss_card_list.xml b/generallibrary/src/main/res/layout/item_unloss_card_list.xml
new file mode 100644
index 0000000..ba7c9aa
--- /dev/null
+++ b/generallibrary/src/main/res/layout/item_unloss_card_list.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.cardview.widget.CardView 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="wrap_content"
+    android:layout_marginHorizontal="12dp"
+    android:layout_marginVertical="6dp"
+    app:cardCornerRadius="8dp"
+    app:cardElevation="2dp">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:padding="12dp">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <TextView
+                android:id="@+id/tv_card_number"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="鍗″彿锛�"
+                android:textColor="@color/black"
+                android:textSize="16sp"
+                android:textStyle="bold" />
+
+            <TextView
+                android:id="@+id/tv_card_status"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="鐘舵�侊細"
+                android:textColor="@color/red"
+                android:textSize="14sp" />
+        </LinearLayout>
+
+        <TextView
+            android:id="@+id/tv_client_name"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="4dp"
+            android:text="濮撳悕锛�"
+            android:textColor="@color/black"
+            android:textSize="14sp" />
+
+        <TextView
+            android:id="@+id/tv_card_type"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="4dp"
+            android:text="鍗$被鍨嬶細"
+            android:textColor="@color/black"
+            android:textSize="14sp" />
+
+        <TextView
+            android:id="@+id/tv_client_num"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="4dp"
+            android:text="瀹㈡埛缂栧彿锛�"
+            android:textColor="@color/black"
+            android:textSize="14sp" />
+
+
+        <TextView
+            android:id="@+id/tv_id_card"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="4dp"
+            android:text="韬唤璇侊細"
+            android:textColor="@color/black"
+            android:textSize="14sp"
+            android:visibility="visible" />
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="4dp"
+            android:orientation="horizontal">
+
+            <TextView
+                android:id="@+id/tv_phone"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+
+                android:text="鐢佃瘽锛�"
+                android:layout_weight="1"
+                android:textColor="@color/black"
+                android:textSize="14sp" />
+
+            <TextView
+                android:id="@+id/tv_card_balance"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="浣欓锛氬厓"
+                android:textColor="@color/black"
+                android:textSize="14sp"
+                android:textStyle="bold" />
+        </LinearLayout>
+
+        <!-- 鍒嗗壊绾� -->
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:layout_marginTop="12dp"
+            android:layout_marginBottom="8dp"
+            android:background="@color/line_color" />
+
+        <!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:gravity="end">
+
+            <Button
+                android:id="@+id/btn_unloss"
+                android:layout_width="wrap_content"
+                android:layout_height="36dp"
+                android:layout_marginEnd="8dp"
+                android:background="@drawable/button_green_bg"
+                android:minWidth="80dp"
+                android:text="瑙i櫎鎸傚け"
+                android:textColor="@color/white"
+                android:textSize="12sp"
+                style="?android:attr/borderlessButtonStyle" />
+
+            <Button
+                android:id="@+id/btn_replace"
+                android:layout_width="wrap_content"
+                android:layout_height="36dp"
+                android:background="@drawable/button_blue_bg"
+                android:minWidth="80dp"
+                android:text="琛ュ崱"
+                android:textColor="@color/white"
+                android:textSize="12sp"
+                style="?android:attr/borderlessButtonStyle" />
+
+        </LinearLayout>
+
+    </LinearLayout>
+</androidx.cardview.widget.CardView> 
\ No newline at end of file
diff --git a/generallibrary/src/main/res/values/colors.xml b/generallibrary/src/main/res/values/colors.xml
index 4b52ad5..3ce05b6 100644
--- a/generallibrary/src/main/res/values/colors.xml
+++ b/generallibrary/src/main/res/values/colors.xml
@@ -9,4 +9,6 @@
     <color name="blue">#007BFF</color>
     <color name="grey">#808080</color>
     <color name="light_grey">#E0E0E0</color>
+    <color name="line_color">#E0E0E0</color>
+    <color name="red">#FF0000</color>
 </resources>
\ No newline at end of file

--
Gitblit v1.8.0