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