Jelajahi Sumber

refactor(蓝牙):
- 统一蓝牙断连逻辑,在执行断开操作前,先发送`shutdownOrRebootReq`指令强制设备重启或关机,以确保连接状态被正确清理,避免连接假死。
- 该优化涉及`BleBusinessManager`、`ModBusController`和`BleQueueDispatcher`等多个模块的断连场景。
- 在`BleBusinessManager`中的发钥匙和取消还钥匙场景下,`scheduleDisconnect`调用增加1秒延迟,以配合新的关机指令。

fix(系统):
- `BootAndUnlockReceiver`在接收到开机广播后,增加2秒延迟再启动`SplashActivity`,以提高系统启动时的稳定性。

refactor(登录):
- `LoginActivity`中移除对`checkKeyInfoTask.isInLogin`状态的维护,简化登录流程的逻辑。
- `LoginActivity`在`onResume`时清空`MainDomainData.returnKeyList`,以确保每次进入登录页时,还钥匙数据被重置。

周文健 1 bulan lalu
induk
melakukan
3765b9e3f9

+ 3 - 2
app/src/main/java/com/grkj/iscs/features/login/activity/LoginActivity.kt

@@ -249,7 +249,8 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
     override fun onResume() {
         super.onResume()
         CountdownTimer.cancel()
-        ISCSApplication.checkKeyInfoTask.isInLogin = true
+        MainDomainData.returnKeyList.clear()
+//        ISCSApplication.checkKeyInfoTask.isInLogin = true
         MainDomainData.clear()
         FingerprintUtil.init(this)
         FingerprintUtil.start()
@@ -279,7 +280,7 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
         super.onStop()
         cardNo = ""
         FingerprintUtil.stop()
-        ISCSApplication.checkKeyInfoTask.isInLogin = false
+//        ISCSApplication.checkKeyInfoTask.isInLogin = false
     }
 
     override fun dispatchKeyEvent(event: KeyEvent): Boolean {

+ 8 - 3
app/src/main/java/com/grkj/iscs/receivers/BootAndUnlockReceiver.kt

@@ -4,7 +4,9 @@ import android.content.BroadcastReceiver
 import android.content.Context
 import android.content.Intent
 import com.grkj.iscs.features.splash.activity.SplashActivity
+import com.sik.sikcore.thread.ThreadUtils
 import org.slf4j.LoggerFactory
+import kotlinx.coroutines.*
 
 class BootAndUnlockReceiver : BroadcastReceiver() {
     private val logger = LoggerFactory.getLogger(BootAndUnlockReceiver::class.java)
@@ -14,9 +16,12 @@ class BootAndUnlockReceiver : BroadcastReceiver() {
         logger.debug("BOOT_COMPLETED(无锁设备)→ 直接拉起界面")
 
         val app = context.applicationContext
-        val start = Intent(app, SplashActivity::class.java).apply {
-            flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
+        ThreadUtils.runOnMain {
+            delay(2000)
+            val start = Intent(app, SplashActivity::class.java).apply {
+                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
+            }
+            app.startActivity(start)
         }
-        app.startActivity(start)
     }
 }

+ 1 - 1
data/src/main/java/com/grkj/data/hardware/ble/BleQueueDispatcher.kt

@@ -203,7 +203,7 @@ abstract class BleQueueDispatcher {
     private fun disconnectDeviceByMac(mac: String) {
         val device = BleManager.getAllConnectedDevice().find { it.mac == mac }
         if (device != null) {
-            BleCmdManager.bleDisconnectReq(mac, null)
+            BleCmdManager.shutdownOrRebootReq(mac)
             BleManager.disconnect(device)
         }
     }

+ 2 - 0
data/src/main/java/com/grkj/data/hardware/modbus/ModBusController.kt

@@ -3,6 +3,7 @@ package com.grkj.data.hardware.modbus
 import android.annotation.SuppressLint
 import com.grkj.data.config.ISCSConfig
 import com.grkj.data.di.LogicManager
+import com.grkj.data.hardware.ble.BleCmdManager
 import com.grkj.data.hardware.ble.BleReturnDispatcher
 import com.grkj.data.hardware.ble.BleSendDispatcher
 import com.grkj.data.model.res.CabinetSlotsRecord
@@ -1036,6 +1037,7 @@ object ModBusController {
         }
         logger.info("检查到不属于任何队列的设备:${noBelongDevice.map { it.mac }},立即断开连接让路")
         noBelongDevice.forEach {
+            BleCmdManager.shutdownOrRebootReq(it.mac)
             BleManager.disconnect(it)
         }
         var keyList = keyDockList.flatMap { it.deviceList }.apply {

+ 6 - 2
ui-base/src/main/java/com/grkj/ui_base/business/BleBusinessManager.kt

@@ -127,7 +127,8 @@ object BleBusinessManager {
             1 -> {
                 if (res == 1) {
                     // 只能在这里断开,不能全部断开
-                    BleSendDispatcher.scheduleDisconnect(bleBean.bleDevice.mac)
+                    BleCmdManager.shutdownOrRebootReq(mac = bleBean.bleDevice.mac)
+                    BleSendDispatcher.scheduleDisconnect(bleBean.bleDevice.mac, 1000)
                     logger.info("断开连接发钥匙:${bleBean.bleDevice.mac}")
                     // 打开钥匙卡扣
                     val keyBean =
@@ -392,6 +393,7 @@ object BleBusinessManager {
                         updateBo?.let { itBO ->
                             if (BleReturnDispatcher.isConnected(currentModeEvent.bleBean.bleDevice.mac)) {
                                 logger.info("当前钥匙在归还队列,断开连接")
+                                BleCmdManager.shutdownOrRebootReq(currentModeEvent.bleBean.bleDevice.mac)
                                 BleReturnDispatcher.scheduleDisconnect(currentModeEvent.bleBean.bleDevice.mac)
                             }
                             if (BleSendDispatcher.isConnected(currentModeEvent.bleBean.bleDevice.mac)) {
@@ -411,6 +413,7 @@ object BleBusinessManager {
                                 .controlKeyBuckle(false, currentModeEvent.bleBean.bleDevice.mac)
                             LoadingEvent.sendLoadingEvent()
                             ThreadUtils.runOnIO {
+                                BleCmdManager.shutdownOrRebootReq(mac = currentModeEvent.bleBean.bleDevice.mac)
                                 BleReturnDispatcher.scheduleDisconnect(currentModeEvent.bleBean.bleDevice.mac)
                                 DataBusiness.checkMyTodoForHandleKey(currentModeEvent.bleBean.bleDevice.mac)
                             }
@@ -635,7 +638,8 @@ object BleBusinessManager {
                         },
                         onCancelClick = {
                             PopTip.build().tip(CommonUtils.getStr("continue_the_ticket"))
-                            BleReturnDispatcher.scheduleDisconnect(bleDevice.mac)
+                            BleCmdManager.shutdownOrRebootReq(mac = bleDevice.mac)
+                            BleReturnDispatcher.scheduleDisconnect(bleDevice.mac, 1000)
                             logger.info("断开连接归还取消:${bleDevice.mac}")
                             // 打开卡扣,防止初始化的时候选择不处理钥匙导致无法使用
                             HardwareMode.getCurrentHardwareMode()