From 5edfd12deb166302708857515a833d1471a0f208 Mon Sep 17 00:00:00 2001 From: zuoxiao <lf_zuo@163.com> Date: 星期三, 25 六月 2025 16:15:23 +0800 Subject: [PATCH] feat(database): 增加管理卡相关功能并优化数据库结构- 新增 ManagerCardBean 数据类用于管理卡信息 - 在 AppDataBase 中添加 ManagerCardDao 接口 - 实现管理卡的数据库迁移策略 - 优化支付方式 ID 类型,从 Long改为 String - 重构更新写卡和上报状态的逻辑,支持管理卡和用户卡 --- generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt | 297 ++++++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 192 insertions(+), 105 deletions(-) diff --git a/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt b/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt index 46c5a42..c2dca73 100644 --- a/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt +++ b/generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt @@ -10,18 +10,29 @@ import android.widget.Toast import androidx.lifecycle.lifecycleScope import com.dayu.baselibrary.net.subscribers.SubscriberListener +import com.dayu.baselibrary.utils.MornyUtil import com.dayu.baselibrary.view.TitleBar.ClickType_LEFT_IMAGE import com.dayu.general.BaseApplication import com.dayu.general.R +import com.dayu.general.bean.card.UserCard import com.dayu.general.bean.db.CardRegistrationBean +import com.dayu.general.bean.net.ClientInfo +import com.dayu.general.bean.net.NewCardDataResult +import com.dayu.general.bean.net.PaymentMethod +import com.dayu.general.bean.net.PaymentMethodResponse import com.dayu.general.dao.BaseDaoSingleton import com.dayu.general.databinding.ActivityNewCardGeBinding import com.dayu.general.net.ApiManager import com.dayu.general.net.BaseResponse +import com.dayu.general.tool.BaseCommon.Companion.protocol +import com.dayu.general.tool.CardCommon.Companion.USER_CARD_TYPE_1 +import com.dayu.general.tool.CardOperationType import com.dayu.general.tool.NfcReadHelper import com.dayu.general.tool.NfcWreatHelper +import com.dayu.general.utils.DateUtils import com.tencent.bugly.crashreport.CrashReport import kotlinx.coroutines.launch +import java.util.Calendar /** * Description: 鐢ㄦ埛寮�鍗$晫闈�(鍚屾淇敼鐧藉崱瀵嗙爜) @@ -34,9 +45,9 @@ // 鏀粯鏂瑰紡 private var paymentMethod: String = "鐜伴噾" - + // 鏀粯鏂瑰紡ID - private var paymentId: Long = 0 + private var paymentId: String = "" // 鏀粯鏂瑰紡鍒楄〃 private var paymentMethodList: List<PaymentMethod> = listOf() @@ -46,44 +57,22 @@ // 鐢ㄦ埛ID private var userId: String = "" - + // 瀹㈡埛ID private var clientId: String = "" + private lateinit var clientInfo: ClientInfo + + // 鏄惁宸茶鍗� + private var isReadCard: Boolean = false + + private var orderId: String = "" + companion object { private const val TAG = "NewCard2Activity" + private const val REQUEST_CODE_NFC_WRITE = 1001 } - // 鏀粯鏂瑰紡鏁版嵁绫� - data class PaymentMethod( - val id: Long, - val name: String, - val remarks: String, - val deleted: Int - ) - - // 鏀粯鏂瑰紡鎺ュ彛杩斿洖鏁版嵁绫� - data class PaymentMethodResponse( - val itemTotal: Any?, - val obj: List<PaymentMethod>, - val pageCurr: Any?, - val pageSize: Any?, - val pageTotal: Any? - ) - - // 鐢ㄦ埛淇℃伅鏁版嵁绫� - data class ClientInfo( - val clientId: String, - val clientNum: String, - val name: String, - val districtNum: String, - val phone: String, - val idCard: String, - val villageName: String, - val address: String, - val cardCount: Int, - val operateDt: String - ) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -92,14 +81,14 @@ // 鑾峰彇浼犻�掔殑clientId鍙傛暟 clientId = intent.getStringExtra("clientId") ?: "" - + initView() - + // 濡傛灉鏈塩lientId锛岃幏鍙栧鎴蜂俊鎭� if (clientId.isNotEmpty()) { getClientInfo(clientId) } - + // 鑾峰彇鏀粯鏂瑰紡 getPaymentMethods() initListener() @@ -118,7 +107,7 @@ binding.newCardRechargeAmount.addTextChangedListener(createDecimalTextWatcher()) binding.newCardCardFee.addTextChangedListener(createDecimalTextWatcher()) } - + /** * 鑾峰彇瀹㈡埛璇︾粏淇℃伅 */ @@ -131,7 +120,7 @@ object : SubscriberListener<BaseResponse<ClientInfo>>() { override fun onNext(response: BaseResponse<ClientInfo>) { if (response.success) { - val clientInfo = response.content + clientInfo = response.content!! if (clientInfo != null) { // 鏄剧ず瀹㈡埛淇℃伅鍒扮晫闈� displayClientInfo(clientInfo) @@ -162,14 +151,14 @@ } ) } - + /** * 鏄剧ず瀹㈡埛淇℃伅鍒扮晫闈� */ private fun displayClientInfo(clientInfo: ClientInfo) { // 淇濆瓨鐢ㄦ埛ID渚涘悗缁娇鐢� userId = clientInfo.clientId - + // 鏄剧ず鐢ㄦ埛鍩烘湰淇℃伅 binding.newCardUserName.text = clientInfo.name binding.newCardIdCard.text = if (clientInfo.idCard.isBlank()) "鏃�" else clientInfo.idCard @@ -182,14 +171,14 @@ private fun getPaymentMethods() { ApiManager.getInstance().requestGetLoading( this, - "sell/paymentmethod/get", - PaymentMethodResponse::class.java, + "terminal/paymentmethod/get", + Array<PaymentMethod>::class.java, null, - object : SubscriberListener<BaseResponse<PaymentMethodResponse>>() { - override fun onNext(response: BaseResponse<PaymentMethodResponse>) { + object : SubscriberListener<BaseResponse<Array<PaymentMethod>>>() { + override fun onNext(response: BaseResponse<Array<PaymentMethod>>) { if (response.success) { - // 鑾峰彇鏀粯鏂瑰紡鍒楄〃 - val paymentMethods = response.content?.obj ?: listOf() + // 鑾峰彇鏀粯鏂瑰紡鍒楄〃锛岀幇鍦╟ontent鐩存帴鏄疨aymentMethod鏁扮粍 + val paymentMethods = response.content?.toList() ?: listOf() if (paymentMethods.isNotEmpty()) { paymentMethodList = paymentMethods // 鏇存柊鏀粯鏂瑰紡鏄剧ず @@ -232,23 +221,23 @@ resources.getDimensionPixelSize(R.dimen.dimen_40), 1.0f ) - + // 濡傛灉涓嶆槸鏈�鍚庝竴涓寜閽紝娣诲姞鍙宠竟璺� if (index < paymentMethodList.size - 1) { - (radioButton.layoutParams as android.widget.LinearLayout.LayoutParams).rightMargin = + (radioButton.layoutParams as android.widget.LinearLayout.LayoutParams).rightMargin = resources.getDimensionPixelSize(R.dimen.dimen_15) } - + radioButton.text = method.name radioButton.background = resources.getDrawable(R.drawable.radio_selector) radioButton.buttonDrawable = null radioButton.gravity = android.view.Gravity.CENTER radioButton.setTextColor(resources.getColorStateList(R.color.radio_button_text_color)) radioButton.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f) - + // 娣诲姞鍒癛adioGroup binding.newCardPaymentMethod.addView(radioButton) - + // 榛樿閫変腑绗竴涓� if (index == 0) { radioButton.isChecked = true @@ -323,58 +312,134 @@ // 鑾峰彇宸ユ湰璐� val cardFeeStr = binding.newCardCardFee.text.toString() - val cardFee = if (cardFeeStr.isEmpty()) 0.0 else cardFeeStr.toDouble() - - // 鏍煎紡鍖栭噾棰濅负涓や綅灏忔暟 - val formattedRechargeAmount = String.format("%.2f", rechargeAmount) - val formattedCardFee = String.format("%.2f", cardFee) + val cardFee = if (cardFeeStr.isEmpty()) 0 else cardFeeStr.toInt() val remark = binding.newCardRemark.text.toString() // 鏋勫缓璇锋眰鍙傛暟 val params = HashMap<String, Any>() params["cardAddr"] = cardPhysicalId // 姘村崱鍦板潃锛堢墿鐞咺D锛� - params["clientNum"] = binding.newCardFarmerCode.text.toString() // 鍐滄埛缂栧彿 - params["cardCost"] = (cardFee * 100).toInt() // 璐崱閲戦锛堝伐鏈垂锛夎浆涓哄垎 - params["amount"] = (rechargeAmount * 100).toInt() // 鍏呭�奸噾棰濊浆涓哄垎 + params["clientId"] = clientId // 鍐滄埛ID + params["cardCost"] = cardFee // 璐崱閲戦锛堝伐鏈垂锛�(鍏�) + params["amount"] = rechargeAmount // 鍏呭�奸噾棰�(鍏�) params["paymentId"] = paymentId // 鏀粯鏂瑰紡ID params["remarks"] = remark // 澶囨敞 + params["protocol"] = protocol // 鍗忚 params["operator"] = BaseApplication.userId // 鎿嶄綔浜篒D // 鎵ц鍗$墖婵�娲籄PI璇锋眰 ApiManager.getInstance().requestPostLoading( this, - "sell/card/active", - String::class.java, + "terminal/card/termActiveCard", + NewCardDataResult::class.java, params, - object : SubscriberListener<BaseResponse<String>>() { - override fun onNext(response: BaseResponse<String>) { + object : SubscriberListener<BaseResponse<NewCardDataResult>>() { + override fun onNext(response: BaseResponse<NewCardDataResult>) { if (response.success) { + orderId = response.content?.orderNo.toString() // 淇濆瓨寮�鍗′俊鎭埌鏁版嵁搴� val cardRegistration = CardRegistrationBean( cardNumber = cardPhysicalId, userName = binding.newCardUserName.text.toString(), idCard = binding.newCardIdCard.text.toString(), - farmerCode = binding.newCardFarmerCode.text.toString(), + clientId = clientId, cardFee = cardFee, remark = binding.newCardRemark.text.toString(), - paymentMethod = paymentId.toInt(), + paymentMethod = paymentId.toLongOrNull()?.toInt() ?: 0, isReported = true, - isCardWritten = true - ) + isCardWritten = false, // 鍒濆璁剧疆涓篺alse锛屽啓鍗℃垚鍔熷悗鍐嶆洿鏂颁负true + operatorId = orderId, + + ) // 浣跨敤鍗忕▼鍦ㄥ悗鍙扮嚎绋嬩腑淇濆瓨鏁版嵁 lifecycleScope.launch { try { BaseDaoSingleton.getInstance(this@NewCard2Activity) .cardRegistrationDao().insert(cardRegistration) - Toast.makeText( - this@NewCard2Activity, - "寮�鍗℃垚鍔�", - Toast.LENGTH_SHORT - ).show() setResult(RESULT_OK) - finish() + Intent(this@NewCard2Activity, NfcWreatActivity::class.java).apply { + putExtra("cardType", USER_CARD_TYPE_1) + putExtra("orderNumber", orderId) + putExtra("cardAddr", cardPhysicalId) + var userCard = UserCard() + userCard.areaNumber = + response.content?.cardNum?.substring(0, 12).toString() + userCard.userCode = clientInfo.clientNum + userCard.phoneNumber = clientInfo.phone + userCard.userCodeNumber = + response.content?.cardNum?.substring(12)?.toInt()!! + userCard.projectCode = response.content?.projectNo!! + userCard.balance = + MornyUtil.changeY2F(response.content?.balance) +// userCard.surplusWater = response.content?.surplusWater?.toInt()!! + userCard.waterPrice = + MornyUtil.changeY2F(response.content?.waterPrice) + userCard.electricPrice = + MornyUtil.changeY2F(response.content?.waterPrice) + userCard.rechargeDate = + DateUtils.parseStringToCalendar(response.content?.time) + + // 杈撳嚭userCard鐨勬墍鏈変俊鎭埌鏃ュ織 + android.util.Log.d( + "NewCard2Activity", + "=== 寮�鍗serCard淇℃伅 ===" + ) + android.util.Log.d( + "NewCard2Activity", + "鍗$墖绫诲瀷: ${userCard.cardType}" + ) + android.util.Log.d( + "NewCard2Activity", + "鍥藉琛屾斂鍖哄煙鍙�: ${userCard.areaNumber}" + ) + android.util.Log.d( + "NewCard2Activity", + "鐢ㄦ埛缂栧彿: ${userCard.userCode}" + ) + android.util.Log.d( + "NewCard2Activity", + "鐢ㄦ埛鍗$紪鍙�: ${userCard.userCodeNumber}" + ) + android.util.Log.d( + "NewCard2Activity", + "瀹屾暣鐢ㄦ埛缂栧彿: ${userCard.getMyUserCode()}" + ) + android.util.Log.d( + "NewCard2Activity", + "鎵嬫満鍙�: ${userCard.phoneNumber}" + ) + android.util.Log.d( + "NewCard2Activity", + "椤圭洰缂栫爜: ${userCard.projectCode}" + ) + android.util.Log.d( + "NewCard2Activity", + "鍗″唴浣欓: ${userCard.balance}" + ) + android.util.Log.d( + "NewCard2Activity", + "鍓╀綑姘撮噺: ${userCard.surplusWater}" + ) + android.util.Log.d( + "NewCard2Activity", + "姘撮噺鍗曚环: ${userCard.waterPrice}" + ) + android.util.Log.d( + "NewCard2Activity", + "鐢甸噺鍗曚环: ${userCard.electricPrice}" + ) + android.util.Log.d( + "NewCard2Activity", + "鍏呭�兼椂闂�: ${userCard.rechargeDate}" + ) + android.util.Log.d("NewCard2Activity", "==================") + + putExtra("userCard", userCard) + putExtra("operationTypeCode", CardOperationType.OpenCard.code) + putExtra("cardFee", cardFee) + startActivityForResult(this, REQUEST_CODE_NFC_WRITE) + } } catch (e: Exception) { CrashReport.postCatchedException(e) Toast.makeText( @@ -420,48 +485,62 @@ } override fun onNfcBack(intent: Intent) { - val cardNumber = NfcReadHelper.getInstance(intent, this).getCardNumberNoClose() - if (cardNumber.isNotEmpty()) { - try { - // 鍒涘缓瀵嗛挜鍒楄〃鐨勫壇鏈紝閬垮厤ConcurrentModificationException - val keyList = ArrayList(NfcReadHelper.getInstance(intent, this).getKeyList()) + if (!isReadCard) { + val cardNumber = NfcReadHelper.getInstance(intent, this).getCardNumberNoClose() + if (cardNumber.isNotEmpty()) { + try { + // 鍒涘缓瀵嗛挜鍒楄〃鐨勫壇鏈紝閬垮厤ConcurrentModificationException + val keyList = ArrayList(NfcReadHelper.getInstance(intent, this).getKeyList()) - // 浣跨敤缇庡寲鐨勫姞杞藉姩鐢绘潵鏄剧ずNFC鎿嶄綔鐨勫姞杞界姸鎬� - val nfcHelper = NfcWreatHelper.getInstance(intent, this) - nfcHelper.setLoadingView(binding.loadingContainer, binding.nfcProgressWheel) - - // 寮傛淇敼瀵嗙爜 - nfcHelper.changePSAsync(keyList, false, true) { success: Boolean, msg: String? -> - if (success) { - // 淇濆瓨鍗$墿鐞咺D - cardPhysicalId = cardNumber - // 鏇存柊UI - binding.newCardArerNumber.text = cardNumber - // 闅愯棌NFC璇诲崱鐣岄潰 - binding.nfcContainer.visibility = View.GONE - binding.centerScroll.visibility = View.VISIBLE - binding.newCardRegistBtn.visibility = View.VISIBLE - } else { - // 瀵嗙爜淇敼澶辫触锛屽鐞嗛敊璇儏鍐� - Toast.makeText( - this@NewCard2Activity, - "鍗$墖鍒濆鍖栧け璐ワ細$msg", - Toast.LENGTH_LONG - ).show() + // 浣跨敤缇庡寲鐨勫姞杞藉姩鐢绘潵鏄剧ずNFC鎿嶄綔鐨勫姞杞界姸鎬� + val nfcHelper = NfcWreatHelper.getInstance(intent, this) + nfcHelper.setLoadingView(binding.loadingContainer, binding.nfcProgressWheel) + + // 寮傛淇敼瀵嗙爜 + nfcHelper.changePSAsync( + keyList, + false, + true + ) { success: Boolean, msg: String? -> + if (success) { + isReadCard = true + // 淇濆瓨鍗$墿鐞咺D + cardPhysicalId = cardNumber + // 鏇存柊UI + binding.newCardArerNumber.text = cardNumber + // 闅愯棌NFC璇诲崱鐣岄潰 + binding.nfcContainer.visibility = View.GONE + binding.centerScroll.visibility = View.VISIBLE + binding.newCardRegistBtn.visibility = View.VISIBLE + } else { + // 瀵嗙爜淇敼澶辫触锛屽鐞嗛敊璇儏鍐� + Toast.makeText( + this@NewCard2Activity, + "鍗$墖鍒濆鍖栧け璐ワ細$msg", + Toast.LENGTH_LONG + ).show() + } } + } catch (e: Exception) { + // 澶勭悊寮傚父鎯呭喌 + CrashReport.postCatchedException(e) + e.printStackTrace() } - } catch (e: Exception) { - // 澶勭悊寮傚父鎯呭喌 - CrashReport.postCatchedException(e) - e.printStackTrace() + } else { + Toast.makeText( + this@NewCard2Activity, + "鑾峰彇鍗″彿澶辫触", + Toast.LENGTH_SHORT + ).show() } } else { Toast.makeText( this@NewCard2Activity, - "鑾峰彇鍗″彿澶辫触", + "褰撳墠宸茶鍗★紝涓嶅彲鍐嶆璇诲崱", Toast.LENGTH_SHORT ).show() } + } override fun onDestroy() { @@ -477,4 +556,12 @@ } } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == REQUEST_CODE_NFC_WRITE && resultCode == RESULT_OK) { + // 鍐欏崱鎴愬姛锛屽叧闂綋鍓岮ctivity + finish() + } + } + } \ No newline at end of file -- Gitblit v1.8.0