From dd2562d8dc2b01bcdfca3152f82f09efbbd09259 Mon Sep 17 00:00:00 2001 From: zuoxiao <lf_zuo@163.com> Date: 星期三, 25 六月 2025 19:49:48 +0800 Subject: [PATCH] fix(generallibrary): 优化卡片处理和支付方式获取逻辑- 修复地区卡处理逻辑,增加对"00"类型卡的特殊处理 - 优化用户卡数据解析和显示逻辑,提高容错性 - 改进支付方式获取方法,增加错误处理和日志记录 -调整充值接口调用参数,确保正确传递当前余额等信息- 修复 AreaCard 中 areaNumber 类型,改为字符串处理 --- generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt | 200 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 196 insertions(+), 4 deletions(-) diff --git a/generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt index 4e425e0..9c52341 100644 --- a/generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt +++ b/generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt @@ -1,37 +1,107 @@ package com.dayu.general.activity +import android.content.Intent import android.os.Bundle +import android.os.Handler +import android.os.Looper import android.view.KeyEvent import android.view.LayoutInflater import android.widget.Toast import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment +import androidx.lifecycle.lifecycleScope import com.dayu.baselibrary.net.subscribers.SubscriberListener import com.dayu.baselibrary.utils.ToastUtil import com.dayu.general.BaseApplication import com.dayu.general.R import com.dayu.general.adapter.TabAdapter import com.dayu.general.bean.net.UserInfoResult +import com.dayu.general.bean.net.WaterPriceResult +import com.dayu.general.dao.BaseDaoSingleton import com.dayu.general.databinding.ActivityMainBinding import com.dayu.general.net.ApiManager import com.dayu.general.net.BaseResponse +import com.dayu.general.tool.CardOperationType +import com.tencent.bugly.crashreport.CrashReport +import kotlinx.coroutines.launch -class MainActivity : BaseActivity() { +class MainActivity : BaseNfcActivity() { var binding: ActivityMainBinding? = null private val fragments: ArrayList<Fragment> = ArrayList() var mExitTime: Long = 0 + private val handler = Handler(Looper.getMainLooper()) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(LayoutInflater.from(this)) setContentView(binding?.root) + + // 娉ㄥ唽MainActivity瀹炰緥鍒癇aseApplication + BaseApplication.setMainActivity(this) + setupFragments() initView() initTab() getUserInfo() + + // 寤舵椂20绉掑悗鑾峰彇姘翠环 + handler.postDelayed({ + getWaterPriceFromActivity() + }, 20000) // 20绉掑欢鏃� } + override fun onDestroy() { + super.onDestroy() + // 娓呯悊Handler鍥炶皟锛岄槻姝㈠唴瀛樻硠婕� + handler.removeCallbacksAndMessages(null) + // 娓呯悊BaseApplication涓殑MainActivity寮曠敤 + BaseApplication.setMainActivity(null) + } + + override fun onNfcBack(intent: Intent) { + intent.let { nfcIntent -> + // 鑾峰彇褰撳墠鏄剧ず鐨凢ragment + val currentFragment = fragments[binding?.viewPager?.currentItem ?: 0] + + // 濡傛灉褰撳墠鏄剧ず鐨勬槸鍏呭�糉ragment锛屽垯灏哊FC淇℃伅浼犻�掔粰瀹冨鐞� + if (currentFragment is RechargeFragment) { + currentFragment.handleNfcIntent(nfcIntent) + } + } + } + + /** + * 鑾峰彇姘翠环淇℃伅 - 鍏紑鏂规硶渚涘叾浠栧湴鏂硅皟鐢� + */ + fun getWaterPriceFromActivity() { + // 濡傛灉姘翠环宸插瓨鍦ㄤ笖澶т簬0锛屽垯涓嶉噸澶嶈幏鍙� + if (BaseApplication.waterPrice > 0.0) { + return + } + + ApiManager.getInstance().requestGetHideLoading( + this, + "terminal/client/getWaterPrice", + WaterPriceResult::class.java, + null, + object : SubscriberListener<BaseResponse<WaterPriceResult>>() { + override fun onNext(response: BaseResponse<WaterPriceResult>) { + if (response.success && response.code == "0001") { + // 鑾峰彇姘翠环鎴愬姛锛屼繚瀛樺埌BaseApplication + response.content?.let { waterPriceResult -> + BaseApplication.waterPrice = waterPriceResult.price + } + } + } + + override fun onError(e: Throwable?) { + super.onError(e) + // 缃戠粶寮傚父鏃朵笉鏄剧ず閿欒淇℃伅锛岄伩鍏嶅奖鍝嶇敤鎴蜂綋楠� + } + } + ) + } private fun getUserInfo() { // 浣跨敤姝g‘鐨勭被鍨嬪弬鏁� @@ -63,8 +133,8 @@ private fun initView() { binding!!.BSCardLL.setOnClickListener { changeBottomState(Tab.BSC) } - binding!!.rechargeLL.setOnClickListener { changeBottomState(Tab.RECHARGE) } binding!!.myLL.setOnClickListener { changeBottomState(Tab.MY) } + binding!!.rechargeLL.setOnClickListener { changeBottomState(Tab.RECHARGE) } } @@ -153,8 +223,6 @@ } } - - //鐐瑰嚮涓ゆ閫�鍑虹▼搴� 鏈夋椂闂撮棿闅� 闂撮殧鍐呯偣鍑诲垯閫�鍑虹▼搴� 鍚﹀垯 鍒欐彁绀� override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { if (keyCode == KeyEvent.KEYCODE_BACK) { @@ -170,5 +238,129 @@ return super.onKeyDown(keyCode, event) } + /** + * 鍚戞湇鍔″櫒涓婃姤鍐欏崱鎿嶄綔缁撴灉 + * 鍐欏崱鎴愬姛鍚庤皟鐢ㄦ鏂规硶閫氱煡鏈嶅姟鍣ㄦ搷浣滃畬鎴愶紝鎴愬姛鍚庢洿鏂版湰鍦版暟鎹簱isReported涓簍rue + * + * @param cardAddr 鍗″湴鍧�/鍗″彿 + * @param operationTypeCode 鎿嶄綔绫诲瀷浠g爜 + * @param orderNumber 璁㈠崟鍙� + * @param regionNumber 鍖哄煙鍙� + * @param projectNumber 椤圭洰鍙� + */ + fun postCardData( + cardAddr: String, + operationTypeCode: Int, + orderNumber: String = "", + regionNumber: String = "", + projectNumber: String = "" + ) { + val map = mutableMapOf<String, Any>() + // 娣诲姞鍗″湴鍧�鍙傛暟 + if (cardAddr.isNotEmpty()) { + map["cardAddr"] = cardAddr + } + + // 娣诲姞鎿嶄綔绫诲瀷鍙傛暟 + // 鍒ゆ柇鏄惁涓虹鐞嗗崱鍒朵綔鎿嶄綔绫诲瀷锛�100-108锛夛紝濡傛灉鏄垯浼犻�扢ANAGEMENT_CARD_WRITE鐨勫�硷紙7锛� + val operateTypeToSend = if (operationTypeCode in 100..108) { + CardOperationType.MANAGEMENT_CARD_WRITE.code + } else { + operationTypeCode + } + map["operateType"] = operateTypeToSend + + // 娣诲姞璁㈠崟鍙峰弬鏁帮紙濡傛灉瀛樺湪锛� + if (orderNumber.isNotEmpty()) { + map["orderNumber"] = orderNumber + } + + // 娣诲姞鍖哄煙鍙峰拰椤圭洰鍙峰弬鏁� + if (regionNumber.isNotEmpty()) { + map["regionNumber"] = regionNumber + } + if (projectNumber.isNotEmpty()) { + map["projectNumber"] = projectNumber + } + + // 璋冪敤鏈嶅姟鍣ㄦ帴鍙d笂鎶ユ搷浣滅粨鏋� + ApiManager.getInstance().requestPostHideLoading( + this, + "terminal/card/termCallBack", // 缁堢鍐欏崱鍥炶皟鎺ュ彛 + String::class.java, + map, + object : SubscriberListener<BaseResponse<String>>() { + override fun onNext(t: BaseResponse<String>) { + if (t.success) { + // 涓婃姤鎴愬姛锛屾洿鏂版湰鍦版暟鎹簱isReported涓簍rue + updateCardReportedStatus(cardAddr, orderNumber, operationTypeCode) + } else { + // 涓婃姤澶辫触锛岃褰曢敊璇絾涓嶅奖鍝嶇敤鎴锋搷浣� + CrashReport.postCatchedException(Exception("涓婃姤鍐欏崱缁撴灉澶辫触: ${t.msg}")) + } + } + + override fun onError(e: Throwable?) { + super.onError(e) + // 缃戠粶閿欒锛岃褰曢敊璇絾涓嶅奖鍝嶇敤鎴锋搷浣� + CrashReport.postCatchedException(e ?: Exception("涓婃姤鍐欏崱缁撴灉缃戠粶閿欒")) + } + } + ) + } + + /** + * 鏇存柊鏈湴鏁版嵁搴撲腑鐨勪笂鎶ョ姸鎬� + * 鏍规嵁鎿嶄綔绫诲瀷鍒ゆ柇鏄洿鏂癕anagerCardBean杩樻槸CardRegistrationBean鐨刬sReported鐘舵�佷负true + * + * @param cardNumber 鍗″彿 + * @param orderNumber 璁㈠崟鍙� + * @param operationTypeCode 鎿嶄綔绫诲瀷浠g爜 + */ + private fun updateCardReportedStatus(cardNumber: String, orderNumber: String = "", operationTypeCode: Int = -1) { + lifecycleScope.launch { + try { + val baseDaoSingleton = BaseDaoSingleton.getInstance(this@MainActivity) + + // 鏍规嵁鎿嶄綔绫诲瀷鍒ゆ柇鏄鐞嗗崱杩樻槸鐢ㄦ埛鍗℃搷浣� + val isManagerCardOperation = operationTypeCode in 100..108 + + if (isManagerCardOperation) { + // 绠$悊鍗″埗浣滄搷浣滅被鍨嬶紝鏌ヨ鍜屾洿鏂癕anagerCardBean + val managerCardDao = baseDaoSingleton.managerCardDao() + val managerCard = if (orderNumber.isNotEmpty()) { + managerCardDao.getByOrderId(orderNumber) + } else { + managerCardDao.getByCardAddress(cardNumber) + } + + if (managerCard != null) { + val updatedManagerCard = managerCard.copy(isReported = true) + managerCardDao.update(updatedManagerCard) + } + } else { + // 鐢ㄦ埛鍗℃搷浣滅被鍨嬶紝鏌ヨ鍜屾洿鏂癈ardRegistrationBean + val cardRegistrationDao = baseDaoSingleton.cardRegistrationDao() + val cardRegistration = if (orderNumber.isNotEmpty()) { + cardRegistrationDao.getByOrderId(orderNumber) + } else { + // 濡傛灉娌℃湁璁㈠崟鍙凤紝鍒欓�氳繃鍗″彿鏌ユ壘 + cardRegistrationDao.getByCardNumber(cardNumber) + } + + if (cardRegistration != null) { + // 鍒涘缓鏇存柊鍚庣殑CardRegistrationBean瀵硅薄锛屽皢isReported璁剧疆涓簍rue + val updatedCardRegistration = cardRegistration.copy(isReported = true) + // 鏇存柊鏁版嵁搴撹褰� + cardRegistrationDao.update(updatedCardRegistration) + } + } + } catch (e: Exception) { + // 璁板綍寮傚父淇℃伅锛屼絾涓嶅奖鍝嶇敤鎴锋搷浣� + CrashReport.postCatchedException(e) + e.printStackTrace() + } + } + } } \ No newline at end of file -- Gitblit v1.8.0