Sfoglia il codice sorgente

1. 基础版本BUG修复

bjb 2 mesi fa
parent
commit
cc7e50de4d

+ 23 - 26
data/src/main/java/com/grkj/data/hardware/face/FaceUtil.kt

@@ -33,9 +33,17 @@ import com.grkj.shared.widget.FaceOverlayView
 import com.sik.sikcore.thread.ThreadUtils
 import com.sik.sikimage.ImageConvertUtils
 import com.sik.sikimage.ImageUtils
-import kotlinx.coroutines.*
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.asCoroutineDispatcher
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.sync.Mutex
 import kotlinx.coroutines.sync.withLock
+import kotlinx.coroutines.withContext
 import org.json.JSONObject
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
@@ -44,9 +52,9 @@ import java.lang.ref.WeakReference
 import java.util.concurrent.Executors
 import java.util.concurrent.atomic.AtomicBoolean
 import java.util.concurrent.atomic.AtomicLong
+import java.util.concurrent.locks.ReentrantLock
 import java.util.zip.CRC32
 import kotlin.coroutines.CoroutineContext
-import java.util.concurrent.locks.ReentrantLock
 
 /**
  * FaceUtil 人脸:兼容 HLK 模组;对外 API 不变
@@ -550,14 +558,17 @@ object FaceUtil {
         }
     }
 
+    // 尝试次数
+    private var retryCheckCount = 0
+
     // ================= checkCamera:命中即停 =================
     fun checkCamera(
         preview: View,
         faceOverlayView: FaceOverlayView? = null,
         callBack: (Bitmap?, face: Rect?, Long?) -> Unit
     ) {
+        retryCheckCount = 3
         stashAppContext(preview.context)
-
         // 进入 checkCamera 时重置“命中即停”标记
         stopAfterHit.set(false)
 
@@ -654,11 +665,7 @@ object FaceUtil {
                         val alive = liveList.any { it.liveness == LivenessInfo.ALIVE }
                         if (!alive) {
                             if (shouldEmit(lastCheckCbTs)) ThreadUtils.runOnMain {
-                                callBack(
-                                    null,
-                                    null,
-                                    null
-                                )
+                                callBack(null, null, null)
                             }
                             return@launch
                         }
@@ -679,34 +686,24 @@ object FaceUtil {
                             if (stopAfterHit.compareAndSet(false, true)) {
                                 if (shouldEmit(lastCheckCbTs)) {
                                     val bmp = withContext(Dispatchers.IO) {
-                                        ImageConvertUtils.nv21ToBitmap(
-                                            data,
-                                            p.width,
-                                            p.height
-                                        )
+                                        ImageConvertUtils.nv21ToBitmap(data, p.width, p.height)
                                     }
                                     ThreadUtils.runOnMain {
-                                        callBack(
-                                            bmp,
-                                            faces[0].rect,
-                                            searchResult?.faceFeatureInfo?.searchId?.toLong()
-                                        )
+                                        callBack(bmp, faces[0].rect, searchResult?.faceFeatureInfo?.searchId?.toLong())
                                     }
                                 }
                                 requestStop = true // 解锁之后再 stop()
                             }
                             return@launch
                         }
-
                         // 未命中:按原逻辑回调空
                         if (shouldEmit(lastCheckCbTs)) ThreadUtils.runOnMain {
-                            callBack(
-                                null,
-                                null,
-                                null
-                            )
+                            if (retryCheckCount == 0) {
+                                callBack(null, null, null)
+                                requestStop = true
+                            }
+                            retryCheckCount--
                         }
-
                     } catch (e: Throwable) {
                         logger.warn("ARC check error: ${e.message}", e)
                     } finally {
@@ -770,7 +767,7 @@ object FaceUtil {
     fun registerFace(faceData: List<Pair<Long, String>>) {
         if (backend == FaceBackend.HLK) {
             ThreadUtils.runOnIO {
-                faceData.forEach { (uid, b64)  ->
+                faceData.forEach { (uid, b64) ->
                     val jpegBytes = ImageCompress.base64ToJpegUnderMB(b64)
 //                    val jpegBytes = Base64.decode(b64, Base64.DEFAULT)
                     val crc32 = CRC32().apply { update(jpegBytes) }.value

+ 10 - 14
iscs_lock/src/main/java/com/grkj/iscs/features/login/dialog/LoginDialog.kt

@@ -4,16 +4,15 @@ import android.graphics.Bitmap
 import android.view.View
 import androidx.lifecycle.LifecycleOwner
 import com.grkj.data.enums.LoginResultEnum
+import com.grkj.data.hardware.face.FaceUtil
+import com.grkj.data.hardware.face.FaceUtil.inDetecting
+import com.grkj.data.utils.event.LoadingEvent
+import com.grkj.data.utils.event.ToastEvent
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogLoginBinding
 import com.grkj.iscs.features.login.viewmodel.LoginViewModel
-import com.grkj.data.hardware.face.FaceUtil
-import com.grkj.data.hardware.face.FaceUtil.inDetecting
 import com.grkj.ui_base.skin.loadSkinIcon
 import com.grkj.ui_base.utils.CommonUtils
-import com.grkj.data.utils.event.LoadingEvent
-import com.grkj.data.utils.event.ToastEvent
-import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.fingerprint.FingerprintUtil
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
@@ -118,7 +117,7 @@ class LoginDialog(
                             CommonUtils.getStr("face_can_not_process")
                         )
                     } else {
-                        startFace()
+                        startFace(customDialog)
                     }
                 }
 
@@ -180,14 +179,14 @@ class LoginDialog(
     }
 
 
-    private fun startFace() {
+    private fun startFace(dialog: CustomDialog?) {
         inDetecting = false
         ActivityTracker.getCurrentActivity()?.let { context ->
-            FaceUtil.checkCamera(
-                mBinding.preview, mBinding.faceOverlayView
-            ) { bitmap, faceRect, userId ->
+            FaceUtil.checkCamera(mBinding.preview, mBinding.faceOverlayView) { bitmap, faceRect, userId ->
                 if (bitmap == null || userId == null) {
                     ToastEvent.sendToastEvent(CommonUtils.getStr(com.grkj.ui_base.R.string.face_login_failed))
+                    FaceUtil.stop()
+                    dialog?.dismiss()
                     return@checkCamera
                 }
                 viewModel.loginWithUserId(userId).observe(lifecycleOwner) {
@@ -209,10 +208,7 @@ class LoginDialog(
                         callBack?.invoke(it)
                     }
                 }
-                LoadingEvent.sendLoadingEvent(
-                    CommonUtils.getStr("face_detected_do_login"),
-                    true
-                )
+                LoadingEvent.sendLoadingEvent(CommonUtils.getStr("face_detected_do_login"), true)
             }
         }
     }

+ 10 - 15
iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt

@@ -10,7 +10,6 @@ import androidx.lifecycle.repeatOnLifecycle
 import com.drake.brv.BindingAdapter
 import com.drake.brv.annotaion.DividerOrientation
 import com.drake.brv.utils.dividerSpace
-import com.drake.brv.utils.grid
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
@@ -23,12 +22,12 @@ import com.grkj.data.data.EventConstants
 import com.grkj.data.data.MMKVConstants
 import com.grkj.data.data.MainDomainData
 import com.grkj.data.data.Type
-import com.grkj.data.enums.LoginResultEnum
-import com.grkj.data.enums.RoleEnum
 import com.grkj.data.domain.vo.IsJobTicketPointsDataVo
 import com.grkj.data.domain.vo.IsJobTicketStepDataVo
 import com.grkj.data.domain.vo.IsJobTicketUserDataVo
 import com.grkj.data.domain.vo.JobTicketGroupInfoVo
+import com.grkj.data.enums.LoginResultEnum
+import com.grkj.data.enums.RoleEnum
 import com.grkj.iscs.R
 import com.grkj.iscs.common.DataTransferConstants
 import com.grkj.iscs.databinding.FragmentJobExecuteBinding
@@ -746,25 +745,21 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
     override fun onResume() {
         super.onResume()
         InRFIDScanModeEvent.sendInRFIDScanModeEvent()
-        if (GlobalDataTempStore.getInstance()
-                .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)
-        ) {
-            viewModel.selectedLockerData = GlobalDataTempStore.getInstance().getData(
-                DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA, Type.lockerGroupType
-            ) ?: listOf()
+        if (GlobalDataTempStore.getInstance().hasData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA)) {
+            viewModel.selectedLockerData = GlobalDataTempStore.getInstance()
+                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA, Type.lockerGroupType) ?: listOf()
             viewModel.checkMemberFinish = true
         }
-        if (GlobalDataTempStore.getInstance()
-                .hasData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
-        ) {
-            viewModel.selecteColockerData = GlobalDataTempStore.getInstance()
-                .getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA) ?: listOf()
+        if (GlobalDataTempStore.getInstance().hasData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)) {
+            viewModel.selecteColockerData =
+                GlobalDataTempStore.getInstance().getData(DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA)
+                    ?: listOf()
             viewModel.checkMemberFinish = true
         }
         if (viewModel.checkMemberFinish) {
             viewModel.updateLockerAndColockerData().observe(this) {
                 val workflowStep = viewModel.currentStepData
-                if (workflowStep?.confirmType != 0 ||//自动确认
+                if (workflowStep?.confirmType != 0 || // 自动确认
                     ((viewModel.ticketData?.createBy == MainDomainData.userInfo?.userName && workflowStep.confirmUser == null) || workflowStep.currentUserCanConfirm())
                 ) {
                     viewModel.currentStepData?.stepStatus = "1"

+ 1 - 2
iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/MyTodoListFragment.kt

@@ -381,8 +381,7 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
             })
         }
         itemBinding.cardRoot.setDebouncedClickListener {
-            GlobalDataTempStore.getInstance()
-                .saveData(DataTransferConstants.KEY_JOB_TICKET_ID, item.ticketId)
+            GlobalDataTempStore.getInstance().saveData(DataTransferConstants.KEY_JOB_TICKET_ID, item.ticketId)
             navController.navigate(R.id.action_myTodoListFragment_to_jobExecuteFragment)
         }
     }

+ 10 - 10
iscs_lock/src/main/java/com/grkj/iscs/features/main/viewmodel/job_manage/JobExecuteViewModel.kt

@@ -4,16 +4,9 @@ import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
 import com.grkj.data.data.MainDomainData
 import com.grkj.data.di.LogicManager
-import com.grkj.data.enums.HardwareMode
-import com.grkj.data.enums.JobTicketStatusEnum
-import com.grkj.data.enums.RoleEnum
-import com.grkj.data.hardware.modbus.DeviceConst
 import com.grkj.data.domain.logic.IJobTicketLogic
 import com.grkj.data.domain.logic.IUserLogic
 import com.grkj.data.domain.logic.IWorkflowLogic
-import com.grkj.data.local.dos.IsJobTicketStep
-import com.grkj.data.local.dos.WorkflowMode
-import com.grkj.data.entity.local.DeviceTakeUpdate
 import com.grkj.data.domain.vo.IsJobTicketDataVo
 import com.grkj.data.domain.vo.IsJobTicketKeyDataVo
 import com.grkj.data.domain.vo.IsJobTicketLockDataVo
@@ -24,6 +17,13 @@ import com.grkj.data.domain.vo.JobTicketGroupDataVo
 import com.grkj.data.domain.vo.JobTicketGroupInfoVo
 import com.grkj.data.domain.vo.JobUserVo
 import com.grkj.data.domain.vo.SysBiometricDataVo
+import com.grkj.data.entity.local.DeviceTakeUpdate
+import com.grkj.data.enums.HardwareMode
+import com.grkj.data.enums.JobTicketStatusEnum
+import com.grkj.data.enums.RoleEnum
+import com.grkj.data.hardware.modbus.DeviceConst
+import com.grkj.data.local.dos.IsJobTicketStep
+import com.grkj.data.local.dos.WorkflowMode
 import com.grkj.data.utils.event.LoadingEvent
 import com.grkj.ui_base.base.BaseViewModel
 import com.grkj.ui_base.business.BleBusinessManager
@@ -157,6 +157,7 @@ class JobExecuteViewModel @Inject constructor(
      * 更新上锁人和共锁人数据
      */
     fun updateLockerAndColockerData(): LiveData<Boolean> {
+        logger.debug("updateLockerAndColockerData")
         return liveData(Dispatchers.IO) {
             jobTicketRepository.updateClockerAndColockerData(
                 ticketData!!.ticketId, selectedLockerData, selecteColockerData
@@ -512,6 +513,7 @@ class JobExecuteViewModel @Inject constructor(
      * 更新步骤状态(点击确认的时候需要)
      */
     fun updateStepStatus(jobTicketStepDataVo: IsJobTicketStepDataVo): LiveData<Boolean> {
+        logger.debug("updateStepStatus $jobTicketStepDataVo")
         return liveData(Dispatchers.IO) {
             val ticketStepData = BeanUtils.copyProperties(
                 jobTicketStepDataVo, IsJobTicketStep::class.java
@@ -534,9 +536,7 @@ class JobExecuteViewModel @Inject constructor(
      */
     fun updateStepStatusBack(jobTicketStepDataVo: IsJobTicketStepDataVo): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
-            val ticketStepData = BeanUtils.copyProperties(
-                jobTicketStepDataVo, IsJobTicketStep::class.java
-            )
+            val ticketStepData = BeanUtils.copyProperties(jobTicketStepDataVo, IsJobTicketStep::class.java)
             ticketStepData?.let {
                 jobTicketRepository.updateTicketStepData(it)
                 jobTicketRepository.updateTicketDataStatus(