Browse Source

refactor(更新)
- 蓝牙钥匙定时任务优化
- 作业票连接钥匙优化

周文健 3 months ago
parent
commit
b0a04d8691

+ 0 - 1
app/build.gradle.kts

@@ -87,7 +87,6 @@ dependencies {
     implementation(libs.kotlinx.serialization.json)
     implementation(libs.sik.camera)
     implementation("com.github.loper7:DateTimePicker:0.6.3")
-    implementation("com.github.SilverIceKey:SIKCronJob:1.0.5")
     implementation("com.google.dagger:hilt-android:2.56.2")
     ksp("com.google.dagger:hilt-android-compiler:2.56.2")
     kapt("com.github.bingoogolapple.BGABadgeView-Android:compiler:1.2.0")

+ 10 - 0
app/src/main/java/com/grkj/iscs/ISCSApplication.kt

@@ -11,7 +11,9 @@ import ch.qos.logback.classic.Level
 import com.drake.statelayout.StateConfig
 import com.grkj.data.data.EventConstants
 import com.grkj.data.di.LogicManager
+import com.grkj.iscs.common.GlobalManager
 import com.grkj.iscs.features.splash.activity.SplashActivity
+import com.grkj.ui_base.service.CheckKeyInfoTask
 import com.grkj.shared.model.EventBean
 import com.grkj.shared.utils.ArcSoftUtil
 import com.grkj.ui_base.business.ModbusBusinessManager
@@ -22,8 +24,10 @@ import com.kongzue.dialogx.DialogX
 import com.scwang.smart.refresh.footer.ClassicsFooter
 import com.scwang.smart.refresh.header.ClassicsHeader
 import com.scwang.smart.refresh.layout.SmartRefreshLayout
+import com.sik.cronjob.managers.CronJobScanner
 import com.sik.sikcore.SIKCore
 import com.sik.sikcore.crash.GlobalCrashCatch
+import com.sik.sikcore.extension.toJson
 import com.sik.sikcore.log.LogUtils
 import com.sik.sikcore.thread.ThreadUtils
 import dagger.hilt.android.HiltAndroidApp
@@ -88,6 +92,12 @@ class ISCSApplication : Application() {
             EventConstants.EVENT_RESTART_APP -> {
                 scheduleRestart(this)
             }
+
+            EventConstants.EVENT_START_MODBUS_COMPLETE -> {
+                val jobList = CronJobScanner.scanJobs(CheckKeyInfoTask())
+                logger.info("扫描任务结果:${jobList.toJson()},开始注册")
+                GlobalManager.cronJobManager.registerJobs(jobList)
+            }
         }
     }
 

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

@@ -14,37 +14,25 @@ import com.drake.brv.utils.grid
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
-import com.google.android.gms.common.internal.service.Common
-import com.grkj.data.data.EventConstants
 import com.grkj.data.data.MainDomainData
 import com.grkj.data.enums.LoginResultEnum
 import com.grkj.data.model.local.LoginMenuEntity
 import com.grkj.iscs.R
-import com.grkj.iscs.common.GlobalManager
 import com.grkj.iscs.databinding.ActivityLoginBinding
 import com.grkj.iscs.databinding.ItemLoginMethodBinding
 import com.grkj.iscs.features.init.activity.SetRemoteServerActivity
 import com.grkj.iscs.features.login.dialog.LoginDialog
 import com.grkj.iscs.features.login.viewmodel.LoginViewModel
 import com.grkj.iscs.features.main.activity.MainActivity
-import com.grkj.iscs.service.CheckKeyInfoTask
 import com.grkj.shared.config.Constants
-import com.grkj.shared.model.EventBean
 import com.grkj.ui_base.base.BaseActivity
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.event.LoadingEvent
 import com.grkj.ui_base.utils.extension.getAppVersionName
 import com.grkj.shared.utils.extension.toByteArrays
 import com.grkj.shared.utils.extension.toHexStrings
-import com.grkj.ui_base.config.ISCSConfig
-import com.grkj.ui_base.utils.ble.BleConnectionManager
-import com.grkj.ui_base.utils.event.RFIDCardReadEvent
-import com.grkj.ui_base.utils.extension.tip
 import com.grkj.ui_base.utils.fingerprint.FingerprintUtil
-import com.kongzue.dialogx.dialogs.PopTip
-import com.sik.cronjob.managers.CronJobScanner
 import com.sik.sikcore.extension.setDebouncedClickListener
-import com.sik.sikcore.thread.ThreadUtils
 import com.sik.sikimage.ImageConvertUtils
 import dagger.hilt.android.AndroidEntryPoint
 
@@ -222,16 +210,6 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
         })
     }
 
-    override fun onEvent(event: EventBean<Any>) {
-        super.onEvent(event)
-        when (event.code) {
-            EventConstants.EVENT_START_MODBUS_COMPLETE -> {
-                val jobList = CronJobScanner.scanJobs(CheckKeyInfoTask())
-                GlobalManager.cronJobManager.registerJobs(jobList)
-            }
-        }
-    }
-
     override fun onStop() {
         super.onStop()
         cardNo = ""

+ 3 - 1
app/src/main/java/com/grkj/iscs/features/main/viewmodel/MainViewModel.kt

@@ -58,7 +58,9 @@ class MainViewModel @Inject constructor(
                         ) {
                             when (it) {
                                 0x02.toByte() -> {
-                                    DataBusiness.checkMyTodoForHandleKey(bleBean.bleDevice.mac)
+                                    ThreadUtils.runOnIO {
+                                        DataBusiness.checkMyTodoForHandleKey(bleBean.bleDevice.mac)
+                                    }
                                 }
                             }
                         }

+ 0 - 3
app/src/main/java/com/grkj/iscs/features/main/viewmodel/home/HomeViewModel.kt

@@ -143,9 +143,6 @@ class HomeViewModel @Inject constructor(
                 myTodoStepJoin.map { it.toTodoVo(todoItemData.filter { temp -> it.ticketId == temp.ticketId }) }
                     .toMutableList()
             val todoData = splitTodoSteps(todoItemVos, 1)
-            if (BleManager.getInstance().allConnectedDevice.isEmpty() && (todoData.first.any { it.enableLock || it.enableUnlock } || todoData.second.any { it.enableLock || it.enableUnlock })) {
-                BleBusinessManager.connectExistsKey()
-            }
             emit(todoData.first.size + todoData.second.size)
         }
     }

+ 0 - 3
app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobManageHomeViewModel.kt

@@ -49,9 +49,6 @@ class JobManageHomeViewModel @Inject constructor(
                 myTodoStepJoin.map { it.toTodoVo(todoItemData.filter { temp -> it.ticketId == temp.ticketId }) }
                     .toMutableList()
             val todoData = splitTodoSteps(todoItemVos, 1)
-            if (BleManager.getInstance().allConnectedDevice.isEmpty() && (todoData.first.any { it.enableLock || it.enableUnlock } || todoData.second.any { it.enableLock || it.enableUnlock })) {
-                BleBusinessManager.connectExistsKey()
-            }
             emit(todoData.first.size + todoData.second.size)
         }
     }

+ 1 - 0
shared/build.gradle.kts

@@ -55,6 +55,7 @@ dependencies {
     implementation("com.machinezoo.sourceafis:sourceafis:3.15.0")
     implementation("com.google.dagger:hilt-android:2.56.2")
     ksp("com.google.dagger:hilt-android-compiler:2.56.2")
+    api("com.github.SilverIceKey:SIKCronJob:1.0.5")
     testImplementation(libs.junit)
     api(
         fileTree(

+ 3 - 0
shared/src/main/java/com/grkj/shared/utils/ArcSoftUtil.kt

@@ -420,6 +420,9 @@ object ArcSoftUtil {
     fun verifyFaceArcSoft(
         b64a: String, b64b: String, threshold: Float = 0.7f
     ): Boolean {
+        if (b64a.isEmpty() || b64b.isEmpty()) {
+            return false
+        }
         // 1. 解码成 Bitmap
         val bmpA = decodeBase64ToBitmap(b64a)
         val bmpB = decodeBase64ToBitmap(b64b)

+ 3 - 0
ui-base/src/main/java/com/grkj/ui_base/business/DataBusiness.kt

@@ -10,6 +10,7 @@ import com.grkj.data.model.res.CabinetSlotsRes
 import com.grkj.data.model.res.KeyPageRes
 import com.grkj.data.model.res.LockPageRes
 import com.grkj.ui_base.business.BleBusinessManager.connectExistsKey
+import com.grkj.ui_base.service.CheckKeyInfoTask
 import com.grkj.ui_base.utils.ble.BleConnectionManager
 import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlin.coroutines.resume
@@ -72,6 +73,7 @@ object DataBusiness {
                 .toMutableList()
         val todoData = splitTodoSteps(todoItemVos, 1)
         if (BleManager.getInstance().allConnectedDevice.isEmpty() && (todoData.first.any { it.enableLock || it.enableUnlock } || todoData.second.any { it.enableLock || it.enableUnlock })) {
+            CheckKeyInfoTask.isTicketConnect = true
             val maxPowerMac = ModbusBusinessManager.getMaxPowerKey().mac
             if (maxPowerMac != mac) {
                 connectExistsKey(listOf(mac ?: ""))
@@ -80,6 +82,7 @@ object DataBusiness {
                 connectExistsKey()
             }
         } else {
+            CheckKeyInfoTask.isTicketConnect = false
             mac?.let {
                 BleConnectionManager.launchDisconnectJob(it)
             } ?: let {

+ 1 - 0
ui-base/src/main/java/com/grkj/ui_base/business/ModbusBusinessManager.kt

@@ -218,6 +218,7 @@ object ModbusBusinessManager {
     ) {
         // 你可以改成接收 CoroutineScope 或者直接在全局 Scope 启动
         ThreadUtils.runOnIO {
+            BleConnectionManager.cancelDisconnectAllJob()
             LoadingEvent.sendLoadingEvent(CommonUtils.getStr(R.string.check_key_and_lock))
             try {
                 // —— 串行请求1 & 2 ——

+ 32 - 8
app/src/main/java/com/grkj/iscs/service/CheckKeyInfoTask.kt → ui-base/src/main/java/com/grkj/ui_base/service/CheckKeyInfoTask.kt

@@ -1,19 +1,18 @@
-package com.grkj.iscs.service
+package com.grkj.ui_base.service
 
 import com.clj.fastble.BleManager
 import com.grkj.shared.utils.extension.startsWith
+import com.grkj.ui_base.business.DataBusiness
 import com.grkj.ui_base.business.ModbusBusinessManager
 import com.grkj.ui_base.utils.ble.BleBean
 import com.grkj.ui_base.utils.ble.BleConnectionManager
 import com.grkj.ui_base.utils.ble.BleConst
 import com.grkj.ui_base.utils.ble.BleIndicateListener
-import com.grkj.ui_base.utils.ble.BleUtil
 import com.sik.cronjob.annotations.CronJob
 import com.sik.sikcore.thread.ThreadUtils
 import kotlinx.coroutines.delay
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
-import kotlin.math.log
 
 /**
  * 检查钥匙信息任务
@@ -32,14 +31,34 @@ class CheckKeyInfoTask {
      */
     private var checkedKey: MutableList<String> = mutableListOf()
 
+    companion object {
+        /**
+         * 是否作业票连接
+         */
+        var isTicketConnect = false
+            set(value) {
+                if (value) {
+                    BleConnectionManager.removeBleIndicateListener(BLE_INDICATE_TAG)
+                }
+            }
+
+        /**
+         * 蓝牙监听标签
+         */
+        const val BLE_INDICATE_TAG = "BLE_INDICATE_TAG"
+    }
+
     /**
      * 检查钥匙信息
      */
     @CronJob(intervalMillis = 30 * 60_000L, initialDelay = 0, runOnMainThread = false)
     fun checkKeyInfo() {
+        if (isTicketConnect) {
+            return
+        }
         logger.info("开始检查钥匙信息")
         val existsKey = ModbusBusinessManager.getExistsKey()
-        BleConnectionManager.addBLeIndicateListener(this, object : BleIndicateListener {
+        BleConnectionManager.addBLeIndicateListener(BLE_INDICATE_TAG, object : BleIndicateListener {
             override fun handleRsp(
                 bleBean: BleBean,
                 byteArray: ByteArray,
@@ -48,7 +67,7 @@ class CheckKeyInfoTask {
             ) {
                 when {
                     byteArray.startsWith(BleConst.RSP_POWER_STATUS) -> {
-                        if (isCheckInfo) {
+                        if (isCheckInfo && !isTicketConnect) {
                             BleManager.getInstance().disconnect(bleBean.bleDevice)
                             BleConnectionManager.deviceList.removeIf { it.bleDevice.mac == bleBean.bleDevice.mac }
                             logger.info("断开连接检查信息:${bleBean.bleDevice.mac}")
@@ -67,10 +86,15 @@ class CheckKeyInfoTask {
         checkedKey.clear()
         isCheckInfo = true
         ThreadUtils.runOnIO {
-            existsKey.forEach {
-                it.mac?.let {
+            DataBusiness.checkMyTodoForHandleKey()
+            for (bean in existsKey) {
+                if (isTicketConnect) {
+                    isCheckInfo = false
+                    break
+                }
+                bean.mac?.let {
                     BleConnectionManager.tryConnectWithOptionalCharge(it)
-                    delay(2000)
+                    delay(1000)
                 }
             }
         }

+ 1 - 31
ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleConnectionManager.kt

@@ -10,6 +10,7 @@ import com.grkj.shared.utils.extension.startsWith
 import com.grkj.shared.utils.extension.toHexStrings
 import com.grkj.ui_base.R
 import com.grkj.ui_base.config.ISCSConfig
+import com.grkj.ui_base.service.CheckKeyInfoTask
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.event.LoadingEvent
 import com.grkj.ui_base.utils.modbus.ModBusController
@@ -663,37 +664,6 @@ object BleConnectionManager {
      */
     suspend fun tryConnectWithOptionalCharge(mac: String, withOpenCharge: Boolean = true): Boolean =
         withContext(Dispatchers.IO) {
-            // -------- 第一次尝试 --------
-//            logger.info("蓝牙连接-第一次尝试")
-//            val firstTry = suspendCancellableCoroutine<Boolean> { cont ->
-//                // 1. 定义一个 flag,确保只 resume 一次
-//                var isCalled = false
-//                registerConnectListener(mac, true) { isDone, _ ->
-//                    if (isCalled) {
-//                        return@registerConnectListener
-//                    }
-//                    isCalled = true
-//                    if (isDone) {
-//                        // 连接成功后,把电关掉(以防万一)
-//                        ModBusController.controlKeyCharge(false, mac) { }
-//                        if (cont.isActive) {
-//                            cont.resume(true)
-//                        }
-//                    } else {
-//                        if (cont.isActive) {
-//                            cont.resume(false)
-//                        }
-//                    }
-//                    cont.cancel()
-//                }
-//            }
-//            logger.info("蓝牙连接-第一次连接:${firstTry}")
-//            if (firstTry) {
-//                return@withContext true
-//            }
-//            if (!withOpenCharge) {
-//                return@withContext false
-//            }
             // -------- 第二次尝试:先开电,再连 --------
             // 开电,并等待回调
             suspendCoroutine<Unit> { unitCont ->

+ 1 - 1
ui-base/src/main/java/com/grkj/ui_base/utils/event/ModbusInitCompleteEvent.kt

@@ -15,7 +15,7 @@ class ModbusInitCompleteEvent() {
         @JvmStatic
         fun sendModbusInitCompleteEvent() {
             val startModbusCompleteEvent = ModbusInitCompleteEvent()
-            val startModbusCompleteEventBean = EventBean<ModbusInitCompleteEvent>(
+            val startModbusCompleteEventBean = EventBean(
                 EventConstants.EVENT_START_MODBUS_COMPLETE, startModbusCompleteEvent
             )
             EventHelper.sendEvent(startModbusCompleteEventBean)

+ 7 - 3
ui-base/src/main/java/com/grkj/ui_base/utils/modbus/ModBusController.kt

@@ -252,13 +252,17 @@ object ModBusController {
                                                 .filterIsInstance<DockBean.KeyBean>()
                                                 .filter { it.isExist }
                                                 .all {
-                                                    logger.info("钥匙否是准备完毕:${it.rfid}")
+                                                    logger.info("钥匙信息:${it.rfid}")
                                                     it.rfid != null
                                                 }
                                         }
-                                if (isKeyReady && !ISCSConfig.isInit) {
-                                    ISCSConfig.canInitDevice = true
+                                logger.info("钥匙是否准备完毕:${isKeyReady},${ISCSConfig.isInit}")
+                                if (isKeyReady && ISCSConfig.isInit) {
+                                    ISCSConfig.canInitDevice = false
+                                    logger.info("发送初始化完成事件")
                                     ModbusInitCompleteEvent.sendModbusInitCompleteEvent()
+                                }else{
+                                    ISCSConfig.canInitDevice = false
                                 }
                             }
                         }