generallibrary/src/main/java/com/dayu/general/activity/CardReadActivity.kt
@@ -43,8 +43,6 @@ } private fun initView() { // 设置标题 binding.titleBar.setCenterText("读卡") // 设置TitleBar的返回按钮点击事件 binding.titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) { finish() @@ -123,6 +121,7 @@ // 用户卡:解析卡内数据并调用接口 handleUserCard(cardNumber, cardType, nfcAdapter) } else -> { // 管理类卡:显示卡片类型信息 handleManagementCard(cardNumber, cardType) @@ -146,6 +145,23 @@ } return } binding.tvCardNumber.text = cardNumber // 输出用户卡内所有信息到日志 android.util.Log.d("CardReadActivity", "=== 用户卡信息 ===") android.util.Log.d("CardReadActivity", "卡号: $cardNumber") android.util.Log.d("CardReadActivity", "卡片类型: $cardType") android.util.Log.d("CardReadActivity", "国家行政区域号: ${userCard.areaNumber}") android.util.Log.d("CardReadActivity", "用户编号: ${userCard.userCode}") android.util.Log.d("CardReadActivity", "用户卡编号: ${userCard.userCodeNumber}") android.util.Log.d("CardReadActivity", "完整用户编号: ${userCard.getMyUserCode()}") android.util.Log.d("CardReadActivity", "手机号: ${userCard.phoneNumber}") android.util.Log.d("CardReadActivity", "项目编码: ${userCard.projectCode}") android.util.Log.d("CardReadActivity", "卡内余额: ${userCard.balance}") android.util.Log.d("CardReadActivity", "剩余水量: ${userCard.surplusWater}") android.util.Log.d("CardReadActivity", "水量单价: ${userCard.waterPrice}") android.util.Log.d("CardReadActivity", "电量单价: ${userCard.electricPrice}") android.util.Log.d("CardReadActivity", "充值时间: ${userCard.rechargeDate}") android.util.Log.d("CardReadActivity", "==================") // 根据卡号获取卡片详细信息 getCardInfo(cardNumber, cardType, userCard) @@ -170,9 +186,8 @@ binding.cardInfoContainer.visibility = android.view.View.VISIBLE // 显示基本信息 binding.tvCardNumber.text = cardNumber binding.tvCardType.text = cardTypeName // 隐藏用户卡特有的字段 @@ -238,7 +253,12 @@ /** * 显示用户卡片信息(包含卡内数据和接口返回数据) */ private fun showUserCardInfo(cardInfo: CardInfoResult?, cardNumber: String, cardType: String, userCard: UserCard) { private fun showUserCardInfo( cardInfo: CardInfoResult?, cardNumber: String, cardType: String, userCard: UserCard ) { // 隐藏读卡提示,显示信息区域 binding.cardReadLL.visibility = android.view.View.GONE binding.cardInfoContainer.visibility = android.view.View.VISIBLE @@ -246,9 +266,8 @@ val cardTypeName = getCardTypeName(cardType) // 显示卡内数据 binding.tvCardNumber.text = cardNumber binding.tvCardType.text = cardTypeName binding.tvCardType.text = cardTypeName // 显示用户卡特有字段 binding.llCardBalance.visibility = android.view.View.VISIBLE binding.llUserNumber.visibility = android.view.View.VISIBLE @@ -264,7 +283,7 @@ binding.tvCardBalance.text = "${balanceInYuan}元" // 使用完整的用户编号 binding.tvUserNumber.text = card.getMyUserCode() binding.tvUserNumber.text = cardInfo?.cardNum // 卡片状态(假设正常状态,因为UserCard中没有状态字段) binding.tvCardStatus.text = "正常" @@ -273,7 +292,8 @@ // 充值时间作为最后使用时间 if (card.rechargeDate != null) { binding.llLastUseTime.visibility = android.view.View.VISIBLE val dateFormat = java.text.SimpleDateFormat("yyyy-MM-dd HH:mm", java.util.Locale.getDefault()) val dateFormat = java.text.SimpleDateFormat("yyyy-MM-dd HH:mm", java.util.Locale.getDefault()) binding.tvLastUseTime.text = dateFormat.format(card.rechargeDate!!.time) } else { binding.llLastUseTime.visibility = android.view.View.GONE @@ -305,6 +325,7 @@ "1001" -> { "该卡片未在系统中注册,请先进行开卡操作。" } else -> { when { msg.isNullOrBlank() -> "获取卡信息失败,请重新刷卡重试。" generallibrary/src/main/java/com/dayu/general/activity/NewCard2Activity.kt
@@ -362,16 +362,78 @@ putExtra("orderNumber", orderId) putExtra("cardAddr", cardPhysicalId) var userCard = UserCard() userCard.areaNumber = response.content?.cardNum?.substring(0, 12).toString() 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.userCodeNumber = response.content?.cardNum?.substring(12)?.toInt()!! userCard.projectCode = response.content?.projectNo!! userCard.balance = MornyUtil.changeY2F(response.content?.balance) userCard.balance = MornyUtil.changeY2F(response.content?.balance) // userCard.surplusWater = response.content?.surplusWater?.toInt()!! userCard.waterPrice = response.content?.waterPrice?.toFloat()!! // userCard.electricPrice = response.content?.electricPrice?.toFloat()!! userCard.rechargeDate = DateUtils.parseStringToCalendar(response.content?.time) 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", "=== 开卡UserCard信息 ===" ) 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) generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
@@ -5,6 +5,7 @@ import androidx.lifecycle.lifecycleScope import com.dayu.baselibrary.net.subscribers.SubscriberListener import com.dayu.baselibrary.tools.nfc.NFCCallBack import com.dayu.baselibrary.utils.MornyUtil import com.dayu.baselibrary.utils.ToastUtil import com.dayu.general.bean.card.ClearCard import com.dayu.general.bean.card.UserCard @@ -86,7 +87,7 @@ textData.append("工本费:" + cardFee + "元\n") } if (userCard.balance != 0) { textData.append("充值金额:" + userCard.balance + "元") textData.append("充值金额:" + MornyUtil.changeF2Y(userCard.balance) + "元") } binding?.cardData?.text = textData.toString() @@ -98,7 +99,12 @@ // 显示充值金额 if (rechargeAmount > 0) { textData.append("充值金额:" + String.format("%.2f", rechargeAmount) + "元\n") textData.append( "充值金额:" + String.format( "%.2f", rechargeAmount ) + "元\n" ) } // 显示赠送金额 @@ -109,7 +115,12 @@ // 显示总金额(写入卡内的总余额) if (userCard.balance != 0) { val totalBalanceInYuan = userCard.balance / 100.0 // 转换为元 textData.append("卡内总余额:" + String.format("%.2f", totalBalanceInYuan) + "元") textData.append( "卡内总余额:" + String.format( "%.2f", totalBalanceInYuan ) + "元" ) } binding?.cardData?.text = textData.toString() generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
@@ -12,6 +12,7 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.dayu.baselibrary.net.subscribers.SubscriberListener import com.dayu.baselibrary.utils.MornyUtil import com.dayu.baselibrary.utils.ToastUtil import com.dayu.baselibrary.view.TitleBar import com.dayu.general.BaseApplication @@ -45,7 +46,12 @@ private const val EXTRA_CARD_ADDRESS = "extra_card_address" private const val EXTRA_USER_CARD = "extra_user_card" fun start(context: Context, cardInfo: CardInfoResult?, cardAddress: String?, userCard: UserCard?) { fun start( context: Context, cardInfo: CardInfoResult?, cardAddress: String?, userCard: UserCard? ) { val intent = Intent(context, RechargeDetailActivity::class.java) intent.putExtra(EXTRA_CARD_INFO, cardInfo) intent.putExtra(EXTRA_CARD_ADDRESS, cardAddress) @@ -389,7 +395,11 @@ /** * 启动写卡界面 */ private fun startWriteCardActivity(rechargeResult: RechargeResult, rechargeAmount: Double, bonusAmount: Double) { private fun startWriteCardActivity( rechargeResult: RechargeResult, rechargeAmount: Double, bonusAmount: Double ) { try { // 创建UserCard对象用于写卡 val userCard = UserCard().apply { @@ -398,7 +408,8 @@ userCode = info.cardNum ?: "" // 计算新余额:原有余额 + 充值金额 + 赠送金额 val originalBalance = this@RechargeDetailActivity.userCard?.balance ?: 0 // 原有余额(分) val originalBalance = this@RechargeDetailActivity.userCard?.balance ?: 0 // 原有余额(分) val rechargeAmountInCents = (rechargeAmount * 100).toInt() // 充值金额转分 val bonusAmountInCents = (bonusAmount * 100).toInt() // 赠送金额转分 @@ -407,7 +418,7 @@ // 设置其他必要信息 projectCode = rechargeResult.projectNo waterPrice = rechargeResult.waterPrice.toFloat() waterPrice = MornyUtil.changeY2F(rechargeResult.waterPrice.toString()) rechargeDate = java.util.Calendar.getInstance() } generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt
@@ -17,10 +17,10 @@ var userCodeNumber: Int = 0 // 用户卡编号(HEX) var phoneNumber: String = "" // 手机号(BCD) var projectCode: Int = 0 // 项目编码(HEX 1-255) var balance: Int = 0 // 剩余金额(2位小数点,单位元) var balance: Int = 0 // 剩余金额(2位小数点,单位分) var surplusWater: Int = 0 // 剩余水量(2位小数点,单位立方米) var waterPrice: Float = 0f // 水量单价(最大655.35,2位小数点。单位:m3/元) var electricPrice: Float = 0f // 电量单价(最大655.35,2位小数点。单位: 元/度) var waterPrice: Int = 0 // 水量单价(2位小数点,单位分/m3) var electricPrice: Int = 0 // 电量单价(2位小数点,单位分/度) var rechargeDate: Calendar? = null // 充值时间 /** @@ -74,7 +74,7 @@ projectCode = HexUtil.get16To10LowHightByBytes(byteArrayOf(one[0])) balance = HexUtil.get16To10LowHightByBytes(one.copyOfRange(1, 5)) surplusWater = HexUtil.get16To10LowHightByBytes(one.copyOfRange(5, 9)) electricPrice = HexUtil.hexToFloatLowHigh(one.copyOfRange(9, 11)) electricPrice = HexUtil.get16To10LowHightByBytes(one.copyOfRange(9, 11)) // 解析充值时间 val year = HexUtil.getBcdToInt(one[11]) @@ -90,7 +90,7 @@ // 解析第2块 val two = data[2] userCard.apply { waterPrice = HexUtil.hexToFloatLowHigh(two.copyOfRange(9, 11)) waterPrice = HexUtil.get16To10LowHightByBytes(two.copyOfRange(9, 11)) } return userCard @@ -157,10 +157,11 @@ System.arraycopy(waterPadded, 0, data, 5, 4) // 设置电价 - 修复:确保数组长度正确 val priceBytes = HexUtil.hexToByteArray(HexUtil.floatToHexLowHigh(electricPrice)) val pricePadded = ByteArray(2) System.arraycopy(priceBytes, 0, pricePadded, 0, minOf(priceBytes.size, 2)) System.arraycopy(pricePadded, 0, data, 9, 2) val electricPriceHex = HexUtil.get10To16LowHigh(electricPrice) val electricPriceBytes = HexUtil.hexToByteArray(electricPriceHex) val electricPricePadded = ByteArray(2) System.arraycopy(electricPriceBytes, 0, electricPricePadded, 0, minOf(electricPriceBytes.size, 2)) System.arraycopy(electricPricePadded, 0, data, 9, 2) // 设置充值时间 rechargeDate?.let { @@ -196,10 +197,11 @@ System.arraycopy(waterPadded, 0, data, 5, 4) // 设置水价 - 修复:确保数组长度正确 val priceBytes = HexUtil.hexToByteArray(HexUtil.floatToHexLowHigh(waterPrice)) val pricePadded = ByteArray(2) System.arraycopy(priceBytes, 0, pricePadded, 0, minOf(priceBytes.size, 2)) System.arraycopy(pricePadded, 0, data, 9, 2) val waterPriceHex = HexUtil.get10To16LowHigh(waterPrice) val waterPriceBytes = HexUtil.hexToByteArray(waterPriceHex) val waterPricePadded = ByteArray(2) System.arraycopy(waterPriceBytes, 0, waterPricePadded, 0, minOf(waterPriceBytes.size, 2)) System.arraycopy(waterPricePadded, 0, data, 9, 2) // 设置充值时间 rechargeDate?.let { generallibrary/src/main/res/layout/activity_card_read.xml
@@ -11,7 +11,8 @@ android:layout_height="@dimen/dimen_title_height" android:background="@color/title_bar_bg" android:elevation="4dp" app:centerText="读卡" /> app:centerText="读卡" app:leftImage="@mipmap/icon_back" /> <ScrollView android:layout_width="match_parent" @@ -32,7 +33,7 @@ android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" android:visibility="gone"> android:visibility="visible"> <androidx.cardview.widget.CardView android:layout_width="match_parent" @@ -95,7 +96,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:visibility="visible"> android:visibility="gone"> <!-- 卡内数据区域 --> <androidx.cardview.widget.CardView @@ -116,9 +117,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="2dp" android:orientation="horizontal" android:gravity="center_vertical" android:background="#F8F9FA" android:gravity="center_vertical" android:orientation="horizontal" android:padding="12dp"> <TextView @@ -143,15 +144,15 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="2dp" android:orientation="horizontal" android:gravity="center_vertical" android:background="#FFFFFF" android:gravity="center_vertical" android:orientation="horizontal" android:padding="12dp"> <TextView android:layout_width="105dp" android:layout_height="wrap_content" android:text="卡号:" android:text="卡地址:" android:textColor="#333333" android:textSize="@dimen/text_size" /> @@ -164,15 +165,42 @@ android:textColor="#666666" android:textSize="@dimen/text_size" /> </LinearLayout> <!-- 卡片状态 --> <LinearLayout android:id="@+id/ll_card_status" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="2dp" android:background="#FFFFFF" android:gravity="center_vertical" android:orientation="horizontal" android:padding="12dp" android:visibility="visible"> <TextView android:layout_width="105dp" android:layout_height="wrap_content" android:text="卡片状态:" android:textColor="#333333" android:textSize="@dimen/text_size" /> <TextView android:id="@+id/tv_card_status" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="正常" android:textColor="#4CAF50" android:textSize="@dimen/text_size" /> </LinearLayout> <!-- 卡片类型 --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="2dp" android:orientation="horizontal" android:gravity="center_vertical" android:background="#F8F9FA" android:gravity="center_vertical" android:orientation="horizontal" android:padding="12dp"> <TextView @@ -198,11 +226,11 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="2dp" android:orientation="horizontal" android:visibility="visible" android:gravity="center_vertical" android:background="#FFFFFF" android:padding="12dp"> android:gravity="center_vertical" android:orientation="horizontal" android:padding="12dp" android:visibility="visible"> <TextView android:layout_width="105dp" @@ -228,11 +256,11 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="2dp" android:orientation="horizontal" android:visibility="visible" android:gravity="center_vertical" android:background="#F8F9FA" android:padding="12dp"> android:gravity="center_vertical" android:orientation="horizontal" android:padding="12dp" android:visibility="visible"> <TextView android:layout_width="105dp" @@ -256,9 +284,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="2dp" android:orientation="horizontal" android:gravity="center_vertical" android:background="#FFFFFF" android:gravity="center_vertical" android:orientation="horizontal" android:padding="12dp"> <TextView @@ -283,9 +311,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="2dp" android:orientation="horizontal" android:gravity="center_vertical" android:background="#F8F9FA" android:gravity="center_vertical" android:orientation="horizontal" android:padding="12dp"> <TextView @@ -305,34 +333,6 @@ android:textSize="@dimen/text_size" /> </LinearLayout> <!-- 卡片状态 --> <LinearLayout android:id="@+id/ll_card_status" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="2dp" android:orientation="horizontal" android:visibility="visible" android:gravity="center_vertical" android:background="#FFFFFF" android:padding="12dp"> <TextView android:layout_width="105dp" android:layout_height="wrap_content" android:text="卡片状态:" android:textColor="#333333" android:textSize="@dimen/text_size" /> <TextView android:id="@+id/tv_card_status" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="正常" android:textColor="#4CAF50" android:textSize="@dimen/text_size" /> </LinearLayout> <!-- 最后使用时间 --> <LinearLayout @@ -340,11 +340,11 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="2dp" android:orientation="horizontal" android:visibility="visible" android:gravity="center_vertical" android:background="#F8F9FA" android:padding="12dp"> android:gravity="center_vertical" android:orientation="horizontal" android:padding="12dp" android:visibility="visible"> <TextView android:layout_width="105dp"