Эх сурвалжийг харах

refactor(作业执行)
- 优化作业执行步骤确认逻辑,确保在无当前步骤时可确认最后步骤
- 调整作业执行步骤点击确认条件,确保创建者可确认未指派确认人的步骤

refactor(蓝牙业务)
- 移除蓝牙连接时的第一次尝试逻辑,直接进行带充电的第二次尝试
- 优化蓝牙连接成功后的断开逻辑,确保在无任务时断开连接

feat(全局异常)
- 新增全局异常捕获及日志记录功能

周文健 3 сар өмнө
parent
commit
9ff24882b5

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

@@ -33,6 +33,7 @@ import com.scwang.smart.refresh.layout.api.RefreshLayout
 import com.scwang.smart.refresh.layout.listener.DefaultRefreshFooterCreator
 import com.scwang.smart.refresh.layout.listener.DefaultRefreshHeaderCreator
 import com.sik.sikcore.SIKCore
+import com.sik.sikcore.crash.GlobalCrashCatch
 import com.sik.sikcore.log.LogUtils
 import com.sik.sikcore.thread.ThreadUtils
 import dagger.hilt.android.HiltAndroidApp
@@ -78,6 +79,10 @@ class ISCSApplication : Application() {
         if (!EventBus.getDefault().isRegistered(this)) {
             EventBus.getDefault().register(this)
         }
+        GlobalCrashCatch.instance.init(this).setGlobalCrashHandlerListener {
+            logger.error("异常发生", it)
+            true
+        }
         if (ISCSConfig.DEBUG) {
             LogUtils.setGlobalLogLevel(Level.DEBUG)
         }

+ 6 - 3
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt

@@ -256,12 +256,15 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         //点击确认的时候需要
         itemBinding.stepLayout.setDebouncedClickListener {
             val workflowStep = viewModel.currentStepData
+            if (workflowStep == null) {
+                return@setDebouncedClickListener
+            }
             viewModel.canCheckStep().observe(this@JobExecuteFragment) {
                 if (it) {
                     if (item.stepIndex < viewModel.currentStepData?.stepIndex!!) {
                         return@observe
                     }
-                    if (item.stepId != viewModel.currentStepData?.stepId && workflowStep?.enableSetLocker == false && !workflowStep.enableSetColocker) {
+                    if (item.stepId != viewModel.currentStepData?.stepId && !workflowStep.enableSetLocker && !workflowStep.enableSetColocker) {
                         PopTip(
                             getString(
                                 R.string.please_done_operation,
@@ -271,9 +274,9 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                         return@observe
                     }
                     //自动确认并且是设置上锁人或者共锁人
-                    if (workflowStep?.confirmType != 0 && (workflowStep?.enableSetLocker == true || workflowStep?.enableSetColocker == true)) {
+                    if (workflowStep.confirmType != 0 && (workflowStep.enableSetLocker || workflowStep.enableSetColocker)) {
                         stepClickConfirm(adapter, item, workflowStep)
-                    } else if (workflowStep?.confirmType == 0 && ((viewModel.ticketData?.createBy == MainDomainData.userInfo?.userName && workflowStep.confirmUser == null) || workflowStep.currentUserCanConfirm())) {//手动确认 需要时创建者或者指定人员
+                    } else if (workflowStep.confirmType == 0 && ((viewModel.ticketData?.createBy == MainDomainData.userInfo?.userName && workflowStep.confirmUser == null) || workflowStep.currentUserCanConfirm())) {//手动确认 需要时创建者或者指定人员
                         if (workflowStep.currentUserCanConfirm()) {
                             CheckFaceDialog.show(viewLifecycleOwner, viewModel, 0) {
                                 if (it in listOf(

+ 7 - 7
app/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobExecuteViewModel.kt

@@ -807,7 +807,11 @@ class JobExecuteViewModel @Inject constructor(
         if (userId == null || userName == null) {
             return false
         }
-        val isMyTodo = currentStepData?.isMyTodoConfirm(userId, userName) == true
+        val isMyTodo =
+            (currentStepData ?: ticketStep.maxByOrNull { it.stepIndex }!!).isMyTodoConfirm(
+                userId,
+                userName
+            )
         return isMyTodo
     }
 
@@ -815,7 +819,7 @@ class JobExecuteViewModel @Inject constructor(
         currentUserId: Long,
         currentUserName: String
     ): Boolean {
-        val isCreator = createBy == currentUserName
+        val isCreator = ticketData?.createBy == currentUserName
 
         // ---- 判定共锁/解除共锁(由创建者) ----=
         //todo 共锁人的共锁暂时不算代办 currentUserId in colockerUserId
@@ -829,7 +833,7 @@ class JobExecuteViewModel @Inject constructor(
         val confirmToCurrentUser =
             confirmUser == currentUserId || (isCreator && confirmUser == null)
 
-        return !hasAnyHardwareOperationFunction() && confirmToCurrentUser
+        return confirmToCurrentUser
     }
 
     /**
@@ -855,8 +859,4 @@ class JobExecuteViewModel @Inject constructor(
                 .contains(RoleEnum.JTLOCKER.roleKey)) return true
         return false
     }
-
-    // WorkflowStep 扩展:判定是否包含任何硬件相关动作
-    fun IsJobTicketStepDataVo.hasAnyHardwareOperationFunction(): Boolean =
-        enableLock || enableColock || enableReleaseColock || enableUnlock
 }

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

@@ -401,10 +401,8 @@ object BleBusinessManager {
                         )
                         LoadingEvent.sendLoadingEvent()
                         //连上之后没有工作票要下发就断开 看是否还有设备等待连接并且连接数是否大于等于预期,没有就不断开,有就让路,一般是初始化的时候
-                        if (BleConnectionManager.hasConnectWait() && BleManager.getInstance().allConnectedDevice.size >= BleConst.MAX_KEY_CONNECT_COUNT) {
-                            BleManager.getInstance().disconnect(currentModeEvent.bleBean.bleDevice)
-                            BleConnectionManager.deviceList.removeIf { it.bleDevice.mac == currentModeEvent.bleBean.bleDevice.mac }
-                        }
+                        BleManager.getInstance().disconnect(currentModeEvent.bleBean.bleDevice)
+                        BleConnectionManager.deviceList.removeIf { it.bleDevice.mac == currentModeEvent.bleBean.bleDevice.mac }
                     }
                 }
             }

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

@@ -633,36 +633,36 @@ 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
-            }
+//            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 ->
@@ -688,7 +688,7 @@ object BleConnectionManager {
                     }
                     isCalled = true
                     // 无论成功或失败,都先把电关掉
-                    ModBusController.controlKeyCharge(false, mac) { }
+//                    ModBusController.controlKeyCharge(false, mac) { }
                     if (cont.isActive) {
                         cont.resume(isDone)
                     }
@@ -713,39 +713,6 @@ object BleConnectionManager {
             }
 
         }, knownDevices = existsMac, stopFirst = true, nameFilter = BleConst.BLE_LOCAL_NAME)
-//        BleUtil.instance?.scan(object : CustomBleScanCallback() {
-//            override fun onPrompt(promptStr: String?) {
-//                // 蓝牙未启动重试
-//                logger.info("设备录入-参数:${promptStr}")
-//                PopTip.build().tip(R.string.please_reopen_ble)
-//                BleManager.getInstance().enableBluetooth()
-//                ThreadUtils.runOnMainDelayed(5000) {
-//                    scanOnlineKeyLockMac(existsMac, callback)
-//                }
-//            }
-//
-//            override fun onScanStarted(success: Boolean) {
-//                logger.info("设备录入-onScanStarted:${success}")
-//                if (!success) {
-//                    ThreadUtils.runOnMainDelayed(300) {
-//                        scanOnlineKeyLockMac(existsMac, callback)
-//                    }
-//                }
-//            }
-//
-//            override fun onScanning(bleDevice: BleDevice?) {
-//                val mac = bleDevice?.mac ?: return
-//                logger.info("设备录入-onScanning:$mac")
-//                if (mac !in existsMac) {
-//                    BleManager.getInstance().cancelScan()
-//                }
-//            }
-//
-//            override fun onScanFinished(scanResultList: MutableList<BleDevice>?) {
-//                logger.info("设备录入-扫描完成:${scanResultList?.joinToString(",") { it.mac }}")
-//                callback(scanResultList?.find { it.mac !in existsMac }?.mac)
-//            }
-//        })
     }