baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
@@ -482,6 +482,8 @@ Log.i("NFCWreatActivity", "hex===" + hex); return hex.toUpperCase(); } }else { return BaseCommon.CARD_TYPE_ERROR2; } } catch (IOException e) { baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java
@@ -356,10 +356,35 @@ } try { // 连接NFC if (isConnect) { mfc.connect(); // 连接NFC - 确保总是建立连接,增加重试机制 int retryCount = 3; boolean connected = false; while (retryCount > 0 && !connected) { try { if (!mfc.isConnected()) { mfc.connect(); } connected = mfc.isConnected(); if (!connected) { Thread.sleep(100); // 短暂等待后重试 retryCount--; } } catch (Exception e) { retryCount--; if (retryCount <= 0) { throw e; } Thread.sleep(100); } } if (!connected) { if (callBack != null) { callBack.isSusses(false, "NFC连接失败,请重新靠近卡片"); } return false; } for (int i = 0; i < passWord.size(); i++) { byte[] passWordItem = passWord.get(i); // 验证扇区密码 baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java
@@ -79,7 +79,7 @@ } @Override public boolean writeData(byte[] str, int a, int b, boolean isConnect, NFCCallBack callBack) { public boolean writeData(byte[] str, int a, int b, boolean isConnect, NFCCallBack callBack) { switch (BaseNfcActivity.adapterType) { case ModelUtils.defaultType: return nativeNfcWriteHelper.writeData(str, a, b, isConnect, callBack); generallibrary/src/main/java/com/dayu/general/BaseApplication.kt
@@ -35,6 +35,9 @@ var projectDataDao: ProjectDataDao? = null @JvmStatic fun getInstance(application: Application): BaseApplication { if (myApplication == null) { generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt
@@ -1,7 +1,10 @@ package com.dayu.general.activity import android.os.Bundle import com.dayu.baselibrary.tools.print.PrintAdater import com.dayu.baselibrary.utils.DateUtil import com.dayu.baselibrary.utils.MornyUtil import com.dayu.general.BaseApplication import com.dayu.general.bean.card.UserCard import com.dayu.general.databinding.ActivityCardWriteSuccessBinding import com.dayu.general.tool.CardOperationType @@ -15,8 +18,22 @@ private lateinit var binding: ActivityCardWriteSuccessBinding private var cardNumber: String? = null private var cardAddr: String? = null private var operationTypeCode: Int = -1 private var userCard: UserCard? = null private var orderNumber: String? = null // 充值相关参数 private var rechargeAmount = 0.0 private var bonusAmount = 0.0 // 其他操作相关参数 private var refundAmount = 0.0 private var cardBalance = 0.0 private var returnAmount = 0.0 private var deductAmount = 0.0 private var cardCost = 0.0 private var reissueAmount = 0.0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -25,7 +42,22 @@ // 获取传入的卡号和操作类型 cardNumber = intent.getStringExtra("cardNumber") cardAddr = intent.getStringExtra("cardAddr") operationTypeCode = intent.getIntExtra("operationTypeCode", -1) orderNumber = intent.getStringExtra("orderNumber") // 获取充值相关参数 rechargeAmount = intent.getDoubleExtra("rechargeAmount", 0.0) bonusAmount = intent.getDoubleExtra("bonusAmount", 0.0) // 获取其他操作相关参数 refundAmount = intent.getDoubleExtra("refundAmount", 0.0) cardBalance = intent.getDoubleExtra("cardBalance", 0.0) returnAmount = intent.getDoubleExtra("returnAmount", 0.0) deductAmount = intent.getDoubleExtra("deductAmount", 0.0) cardCost = intent.getDoubleExtra("cardCost", 0.0) reissueAmount = intent.getDoubleExtra("reissueAmount", 0.0) if (intent.hasExtra("userCard")) { userCard = intent.getSerializableExtra("userCard") as UserCard } @@ -52,6 +84,11 @@ "卡片已成功销卡并清除内容\n卡号:$cardNumber\n该卡片将无法再次使用" } binding.successMessage.text = message // 销卡成功后自动打印 userCard?.let { card -> doPrint(card) } } CardOperationType.SUPPLEMENT -> { @@ -68,6 +105,11 @@ "卡片返还操作已成功完成\n卡号:$cardNumber\n卡内余额已更新" } binding.successMessage.text = message // 返还成功后自动打印 userCard?.let { card -> doPrint(card) } } CardOperationType.DeductCard -> { @@ -84,6 +126,11 @@ "卡片补扣操作已成功完成\n卡号:$cardNumber\n卡内余额已更新" } binding.successMessage.text = message // 补扣成功后自动打印 userCard?.let { card -> doPrint(card) } } CardOperationType.ReplaceCard -> { @@ -103,10 +150,28 @@ } CardOperationType.Recharge -> { binding.titleBar.setCenterText("写卡成功") binding.successTitle.text = "写卡成功" binding.successMessage.text = "卡内余额已更新为"+MornyUtil.changeF2Y(userCard?.balance?:0.toInt()) +"元" binding.titleBar.setCenterText("充值成功") binding.successTitle.text = "充值成功" val messageBuilder = StringBuilder() messageBuilder.append("充值操作已成功完成\n") if (rechargeAmount > 0) { messageBuilder.append("充值金额:${String.format("%.2f", rechargeAmount)}元\n") } if (bonusAmount > 0) { messageBuilder.append("赠送金额:${String.format("%.2f", bonusAmount)}元\n") } messageBuilder.append("卡内余额:${MornyUtil.changeF2Y(userCard?.balance ?: 0)}元") binding.successMessage.text = messageBuilder.toString() // 充值成功后自动打印 userCard?.let { card -> doPrint(card) } } else -> { @@ -133,4 +198,224 @@ finish() } } /** * 打印充值成功信息到打印机 * @param userCard 用户卡片信息,包含余额等信息 * 函数会构建打印数据并调用打印适配器进行打印 */ private fun doPrint(userCard: UserCard) { try { // 创建打印数据列表 val data: MutableList<String> = ArrayList() // 根据操作类型设置不同的打印内容 val operationType = CardOperationType.fromCode(operationTypeCode) when (operationType) { CardOperationType.Recharge -> { // 充值打印内容 data.add("*****************************") data.add(" 充值凭证") data.add("*****************************") // 添加用户编号(从UserCard中获取) if (!userCard.userCode.isNullOrEmpty()) { data.add("用户编号:${userCard.userCode}") } // 添加卡地址 val cardAddress = cardNumber ?: cardAddr if (!cardAddress.isNullOrEmpty()) { data.add("卡 地 址:$cardAddress") } // 添加用户编号(从UserCard中获取) if (!userCard.userCode.isNullOrEmpty()) { data.add("用户编号:${userCard.getMyUserCode()}") } // 添加充值金额 if (rechargeAmount > 0) { data.add("充值金额:${String.format("%.2f", rechargeAmount)} 元") } // 添加赠送金额 if (bonusAmount > 0) { data.add("赠送金额:${String.format("%.2f", bonusAmount)} 元") } // 添加充值后余额 data.add("充值后余额:${MornyUtil.changeF2Y(userCard.balance)} 元") // 添加日期信息 data.add("日 期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}") // 添加订单号 if (!orderNumber.isNullOrEmpty()) { data.add("订单号:$orderNumber") } // 添加设备操作员信息 data.add("设备操作员:${BaseApplication.userName}") data.add("*****************************") } CardOperationType.ReplaceCard -> { // 补卡打印内容 data.add("*****************************") data.add(" 补卡凭证") data.add("*****************************") val cardAddress = cardNumber ?: cardAddr if (!cardAddress.isNullOrEmpty()) { data.add("卡 地 址:$cardAddress") } if (!userCard.userCode.isNullOrEmpty()) { data.add("用户编号:${userCard.getMyUserCode()}") } if (cardCost > 0) { data.add("工 本 费:${String.format("%.2f", cardCost)} 元") } if (reissueAmount > 0) { data.add("返还金额:${String.format("%.2f", reissueAmount)} 元") } data.add("卡内余额:${MornyUtil.changeF2Y(userCard.balance)} 元") data.add("日 期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}") if (!orderNumber.isNullOrEmpty()) { data.add("订单号:$orderNumber") } data.add("设备操作员:${BaseApplication.userName}") data.add("*****************************") } CardOperationType.CancelCard -> { // 销卡打印内容 data.add("*****************************") data.add(" 销卡凭证") data.add("*****************************") val cardAddress = cardNumber ?: cardAddr if (!cardAddress.isNullOrEmpty()) { data.add("卡 地 址:$cardAddress") } if (!userCard.userCode.isNullOrEmpty()) { data.add("用户编号:${userCard.getMyUserCode()}") } if (refundAmount > 0) { data.add("退款金额:${String.format("%.2f", refundAmount)} 元") } data.add("原卡余额:${String.format("%.2f", cardBalance)} 元") data.add("日 期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}") if (!orderNumber.isNullOrEmpty()) { data.add("订单号:$orderNumber") } data.add("设备操作员:${BaseApplication.userName}") data.add("*****************************") } CardOperationType.SUPPLEMENT -> { // 返还打印内容 data.add("*****************************") data.add(" 返还凭证") data.add("*****************************") val cardAddress = cardNumber ?: cardAddr if (!cardAddress.isNullOrEmpty()) { data.add("卡 地 址:$cardAddress") } if (!userCard.userCode.isNullOrEmpty()) { data.add("用户编号:${userCard.getMyUserCode()}") } if (returnAmount > 0) { data.add("返还金额:${String.format("%.2f", returnAmount)} 元") } data.add("卡内余额:${MornyUtil.changeF2Y(userCard.balance)} 元") data.add("日 期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}") if (!orderNumber.isNullOrEmpty()) { data.add("订单号:$orderNumber") } data.add("设备操作员:${BaseApplication.userName}") data.add("*****************************") } CardOperationType.DeductCard -> { // 补扣打印内容 data.add("*****************************") data.add(" 补扣凭证") data.add("*****************************") val cardAddress = cardNumber ?: cardAddr if (!cardAddress.isNullOrEmpty()) { data.add("卡 地 址:$cardAddress") } if (!userCard.userCode.isNullOrEmpty()) { data.add("用户编号:${userCard.getMyUserCode()}") } if (deductAmount > 0) { data.add("补扣金额:${String.format("%.2f", deductAmount)} 元") } data.add("卡内余额:${MornyUtil.changeF2Y(userCard.balance)} 元") data.add("日 期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}") if (!orderNumber.isNullOrEmpty()) { data.add("订单号:$orderNumber") } data.add("设备操作员:${BaseApplication.userName}") data.add("*****************************") } else -> { // 其他操作的通用打印内容 data.add("*****************************") data.add(" 操作凭证") data.add("*****************************") val cardAddress = cardNumber ?: cardAddr if (!cardAddress.isNullOrEmpty()) { data.add("卡 地 址:$cardAddress") } data.add("操作类型:${operationType?.description ?: "未知操作"}") data.add("日 期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}") data.add("设备操作员:${BaseApplication.userName}") data.add("*****************************") } } // 设置打印字体大小 val size = 26f // 执行打印操作 PrintAdater.printText(data, size, true, false) } catch (e: Exception) { // 打印异常信息 e.printStackTrace() // 可以添加Toast提示用户打印失败 runOnUiThread { com.dayu.baselibrary.utils.ToastUtil.show("打印失败:${e.message}") } } } } generallibrary/src/main/java/com/dayu/general/activity/ManagerReadActivity.kt
@@ -5,6 +5,7 @@ import android.text.Editable import android.text.TextWatcher import android.view.View import android.widget.Toast import androidx.databinding.DataBindingUtil import com.dayu.baselibrary.net.subscribers.SubscriberListener import com.dayu.baselibrary.utils.BaseCommon @@ -18,6 +19,7 @@ import com.dayu.general.tool.BaseCommon.Companion.protocol import com.dayu.general.tool.CardCommon import com.dayu.general.tool.NfcReadHelper import com.dayu.general.tool.NfcWreatHelper class ManagerReadActivity : BaseNfcActivity() { @@ -196,16 +198,42 @@ fun getRemark(): String = viewModel.remark.get() ?: "" override fun onNfcBack(intent: Intent) { val cardNumber = NfcReadHelper.getInstance(intent, this).getCardNumberNoClose() if (cardNumber.isNotEmpty()) { val keyList = ArrayList(NfcReadHelper.getInstance(intent, this).getKeyList()) val nfcHelper = NfcWreatHelper.getInstance(intent, this) nfcHelper.setLoadingView(binding.loadingContainer, binding.nfcProgressWheel) // 异步修改密码 nfcHelper.changePSAsync( keyList, true, // 修改为true,确保建立NFC连接 true ) { success: Boolean, msg: String? -> if (success) { // 隐藏NFC读卡界面 if (cardNumber.isNotEmpty() && !cardNumber.contains(BaseCommon.CARD_TYPE_ERROR2)) { binding.btnNext.visibility = View.VISIBLE binding.dataLayout.visibility = View.VISIBLE binding.scrollReadCard.visibility = View.GONE setCardNumber(cardNumber) } else if (cardNumber.contains(BaseCommon.CARD_TYPE_ERROR2)) { ToastUtil.show("当前卡密码错误,不是本公司卡") } } else { // 密码修改失败,处理错误情况 Toast.makeText( this@ManagerReadActivity, "卡片初始化失败:$msg", Toast.LENGTH_LONG ).show() } } } // 创建密钥列表的副本,避免ConcurrentModificationException // 处理NFC读取结果 NfcReadHelper.getInstance(intent, this).getCardNumber().let { cardNumber -> if (cardNumber.isNotEmpty() && !cardNumber.contains(BaseCommon.CARD_TYPE_ERROR2)) { binding.btnNext.visibility = View.VISIBLE binding.dataLayout.visibility = View.VISIBLE binding.scrollReadCard.visibility = View.GONE setCardNumber(cardNumber) } else if (cardNumber.contains(BaseCommon.CARD_TYPE_ERROR2)) { ToastUtil.show("当前卡密码错误,不是本公司卡") } } } @@ -281,7 +309,7 @@ map["projectNumber"] = projectNumber } map["protocol"] = protocol map["securityCode"]="A0B1C289" map["securityCode"] = "A0B1C289" // 使用正确的类型参数 ApiManager.getInstance().requestPostLoading( generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
@@ -529,14 +529,18 @@ bonusAmount: Double ) { try { // 创建UserCard对象用于写卡 val userCard = UserCard().apply { // 设置用户卡信息 cardInfo?.let { info -> balance = MornyUtil.changeY2F(rechargeResult.balance) } // 检查是否有传递过来的userCard对象 val cardToWrite = this.userCard ?: run { ToastUtil.show("用户卡信息缺失") return } // 设置其他必要信息 // 更新传递过来的UserCard对象数据 cardToWrite.apply { // 更新充值后的余额 balance = MornyUtil.changeY2F(rechargeResult.balance) // 更新其他充值相关信息 projectCode = rechargeResult.projectNo waterPrice = MornyUtil.changeY2F(rechargeResult.waterPrice.toString()) rechargeDate = java.util.Calendar.getInstance() @@ -548,7 +552,7 @@ putExtra("cardAddr", cardAddress) putExtra("operationTypeCode", CardOperationType.Recharge.code) putExtra("orderNumber", rechargeResult.orderNo) putExtra("userCard", userCard) putExtra("userCard", cardToWrite) putExtra("rechargeAmount", rechargeAmount) // 传递充值金额 putExtra("bonusAmount", bonusAmount) // 传递赠送金额 } generallibrary/src/main/java/com/dayu/general/activity/RechargeFragment.kt
@@ -86,8 +86,14 @@ return } if (cardType != CardCommon.USER_CARD_TYPE_1) { showConfirmDialog("该卡片不是用户卡,请使用正确的用户卡进行充值操作。") { if(cardType == CardCommon.USER_CARD_TYPE_2){ showConfirmDialog("该卡片已开泵,请关泵后充值。") { } }else{ showConfirmDialog("该卡片不是用户卡,请使用正确的用户卡进行充值操作。") { } } return } generallibrary/src/main/res/layout/activity_manager_read.xml
@@ -156,78 +156,109 @@ <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> android:orientation="vertical"> <LinearLayout android:id="@+id/card_read_LL" <androidx.cardview.widget.CardView android:id="@+id/nfcContainer" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> android:layout_marginStart="16dp" android:layout_marginTop="24dp" android:layout_marginEnd="16dp" android:layout_marginBottom="24dp" android:visibility="visible" app:cardBackgroundColor="@android:color/white" app:cardCornerRadius="12dp" app:cardElevation="4dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/titleBar"> <androidx.cardview.widget.CardView <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="16dp" app:cardCornerRadius="8dp" app:cardElevation="2dp"> android:layout_height="match_parent"> <RelativeLayout <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" android:padding="16dp"> <TextView android:id="@+id/tv_title" android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="100dp" android:gravity="center" android:text="制作管理卡" android:layout_marginTop="20dp" android:textColor="@color/base_blue_bg" android:textSize="@dimen/big_text_size" android:text="请将新卡贴在设备上进行读卡" android:textColor="#333333" android:textSize="18sp" android:textStyle="bold" /> <TextView android:id="@+id/tv_subtitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/tv_title" android:layout_marginBottom="20dp" android:layout_marginTop="20dp" android:gravity="center" android:text="请将新卡贴在设备上进行读取" android:textColor="#333333" android:textSize="@dimen/text_size" android:text="将进行初始化卡片\n耗时较长请不要移动卡片" android:textColor="@color/base_blue_bg" android:textSize="18sp" android:textStyle="bold" /> <ImageView android:id="@+id/iv_nfc" android:layout_width="120dp" android:layout_height="120dp" android:layout_below="@+id/tv_subtitle" android:layout_centerHorizontal="true" android:layout_marginBottom="20dp" android:id="@+id/nfcImageView" android:layout_width="200dp" android:layout_height="200dp" android:layout_marginTop="24dp" android:scaleType="fitCenter" android:src="@mipmap/nfc_write" /> <TextView android:id="@+id/tv_tip" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/iv_nfc" android:layout_marginTop="16dp" android:gravity="center" android:text="读取新卡后将显示原卡信息进行制作管理卡" android:text="请保持手持机和卡片不要移动" android:textColor="#666666" android:textSize="@dimen/new_card_size" /> android:textSize="14sp" /> </LinearLayout> <RelativeLayout android:id="@+id/loadingContainer" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#80000000" android:visibility="gone"> <com.pnikosis.materialishprogress.ProgressWheel android:id="@+id/nfcProgressWheel" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" app:matProg_barColor="@color/base_blue_bg" app:matProg_barWidth="8dp" app:matProg_progressIndeterminate="true" app:matProg_rimColor="#33000000" app:matProg_rimWidth="8dp" app:matProg_spinSpeed="0.5" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/nfcProgressWheel" android:layout_centerHorizontal="true" android:layout_marginTop="12dp" android:text="正在处理NFC卡片..." android:textColor="#FFFFFF" android:textSize="16sp" /> </RelativeLayout> </androidx.cardview.widget.CardView> </LinearLayout> </FrameLayout> </androidx.cardview.widget.CardView> </LinearLayout> </ScrollView> <TextView android:id="@+id/btn_next" android:layout_width="match_parent" @@ -238,10 +269,10 @@ android:layout_marginBottom="16dp" android:background="#4285F4" android:gravity="center" android:visibility="gone" android:text="下一步" android:textColor="#FFFFFF" android:textSize="16sp" /> android:textSize="16sp" android:visibility="gone" /> </RelativeLayout> </layout>