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

feat(人脸识别):
- `FaceUtil`: 新增对HLK-223人脸识别模组的支持,并实现与原有虹软算法的后端切换。
- `FaceUtil`: 在HLK模式下,增加用户与人脸ID的映射管理(`registerUserIdAndLocalUserId`),以及人脸的删除接口 (`clearFace`)。
- `FaceUtil`: 在应用启动时,增加清除所有已注册人脸和设置UVC参数的逻辑,确保设备处于干净的初始状态。
- `SetFaceFragment`: 在开始人脸录入前,调用`FaceUtil.clearFace`清除当前用户可能存在的旧人脸数据。
- `LoginViewModel`: 在登录时重新启用人脸数据的加载和注册流程。

feat(异常上报):
- `ExceptionLogic`, `IsExceptionStandardVo`: 异常数据查询时,补充关联查询上报人信息。
- `ExceptionViewModel`: 上报异常时,记录当前用户的ID(`reporterId`)。

refactor(RFID&UI交互):
- `UserManageFragment`, `PointMangeFragment`, `JobExecuteFragment`: 在进行需要刷卡或人脸识别的操作时(如绑定卡、共锁确认),通过发送`InRFIDScanModeEvent(false)`事件临时禁用全局RFID扫描,并在弹窗关闭后恢复,避免在非预期场景下响应刷卡。
- `UserManageFragment`, `PointMangeFragment`: 移除过时的`startReadCard`标志位,统一使用事件驱动模式管理RFID扫描状态。

fix(作业管理):
- `JobManageFragment`: 修正批量删除作业的逻辑,从只允许删除"已取消"和"已完成"的作业,调整为只允许删除"未开始"和"已取消"的作业,并更新了提示文案。
- `JobExecuteFragment`: 修复在进行共锁人脸验证时,若用户未录入人脸数据,弹出的提示框会错误地触发后续流程的问题。
- `BleBusinessManager`: 修复钥匙归还上报时,`keyNfc`参数类型不匹配的问题(从 `long` 修正为 `String`)。

fix(UI&布局):
- `fragment_create_job.xml`, `fragment_edit_job.xml`, `fragment_create_sop.xml` 等:将多个使用`layout_weight`的布局容器高度从`0dp`改为`wrap_content`,并为其中的RecyclerView设置了`minHeight`,解决了在某些场景下布局高度计算错误导致内容显示不全或重叠的问题。
- `dialog_filter_point.xml`: 移除筛选条件中的必填星号标记,使其变为非必填项。
- `dialog_add_user.xml`, `dialog_update_user.xml`: 为"用户昵称"和"用户姓名"输入框增加必填星号。
- `ExceptionJobFragment`: 将共锁人列表的布局管理器从`grid`改为`FlexboxLayoutManager`,以实现更灵活的自动换行和对齐效果。
- `item_locker_group.xml`: 增加了分组标题的背景样式。

refactor(硬件&并发控制):
- `HardwareBusinessManager`, `SlotsManageFragment`: 在处理CAN设备事件时,为`HandlerGate`引入了基于设备(节点+类型+ID)的唯一键,并在设备取出和钥匙扣操作时正确地释放(`leave`)并发锁,防止逻辑阻塞。

chore(调试):
- `DeviceModel`: 在`deviceChange`状态变更时增加堆栈日志打印,方便追踪是哪个调用栈修改了设备状态。

周文健 2 долоо хоног өмнө
parent
commit
fa1bc77e02
44 өөрчлөгдсөн 385 нэмэгдсэн , 188 устгасан
  1. 8 4
      data/src/main/java/com/grkj/data/domain/logic/impl/ExceptionLogic.kt
  2. 7 2
      data/src/main/java/com/grkj/data/domain/vo/IsExceptionStandardVo.kt
  3. 10 0
      data/src/main/java/com/grkj/data/hardware/can/DeviceModel.kt
  4. 32 7
      data/src/main/java/com/grkj/data/hardware/face/FaceUtil.kt
  5. 1 1
      data/src/main/java/com/grkj/data/hardware/face/hlk/Hlk223PhotoEnroll.kt
  6. 1 1
      iscs_lock/src/main/java/com/grkj/iscs/features/login/viewmodel/LoginViewModel.kt
  7. 2 2
      iscs_lock/src/main/java/com/grkj/iscs/features/main/dialog/CheckFaceDialog.kt
  8. 9 0
      iscs_lock/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddRoleDialog.kt
  9. 3 2
      iscs_lock/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/RegisterFaceDialog.kt
  10. 15 4
      iscs_lock/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateRoleDialog.kt
  11. 6 0
      iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/common/SelectPointFragment.kt
  12. 1 1
      iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/DataExportFragment.kt
  13. 22 19
      iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/PointMangeFragment.kt
  14. 17 17
      iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/UserManageFragment.kt
  15. 0 12
      iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionDetailFragment.kt
  16. 29 3
      iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionJobFragment.kt
  17. 6 0
      iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/SlotsManageFragment.kt
  18. 18 2
      iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt
  19. 1 1
      iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobManageFragment.kt
  20. 3 2
      iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/user_info/SetFaceFragment.kt
  21. 1 0
      iscs_lock/src/main/java/com/grkj/iscs/features/main/viewmodel/MainViewModel.kt
  22. 1 1
      iscs_lock/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/DataExportViewModel.kt
  23. 0 4
      iscs_lock/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/PointManageViewModel.kt
  24. 0 1
      iscs_lock/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/UserManageViewModel.kt
  25. 61 13
      iscs_lock/src/main/java/com/grkj/iscs/features/main/viewmodel/exception_manage/ExceptionViewModel.kt
  26. 29 0
      iscs_lock/src/main/res/layout-land/item_select_point.xml
  27. 1 1
      iscs_lock/src/main/res/layout/dialog_add_user.xml
  28. 5 5
      iscs_lock/src/main/res/layout/dialog_filter_point.xml
  29. 3 1
      iscs_lock/src/main/res/layout/dialog_update_user.xml
  30. 10 10
      iscs_lock/src/main/res/layout/fragment_create_job.xml
  31. 20 29
      iscs_lock/src/main/res/layout/fragment_create_sop.xml
  32. 10 9
      iscs_lock/src/main/res/layout/fragment_create_sop_job.xml
  33. 9 9
      iscs_lock/src/main/res/layout/fragment_edit_job.xml
  34. 8 8
      iscs_lock/src/main/res/layout/fragment_edit_sop.xml
  35. 7 8
      iscs_lock/src/main/res/layout/fragment_edit_sop_job.xml
  36. 2 1
      iscs_lock/src/main/res/layout/item_locker_group.xml
  37. 2 2
      iscs_lock/src/main/res/layout/item_select_member.xml
  38. 2 1
      iscs_lock/src/main/res/layout/item_select_point.xml
  39. 2 1
      iscs_lock/src/main/res/layout/item_user_manage_user.xml
  40. 2 0
      iscs_lock/src/main/res/values/dimens.xml
  41. 1 1
      ui-base/src/main/java/com/grkj/ui_base/business/BleBusinessManager.kt
  42. 16 1
      ui-base/src/main/java/com/grkj/ui_base/business/HardwareBusinessManager.kt
  43. 1 1
      ui-base/src/main/res/values-zh/strings.xml
  44. 1 1
      ui-base/src/main/res/values/strings.xml

+ 8 - 4
data/src/main/java/com/grkj/data/domain/logic/impl/ExceptionLogic.kt

@@ -10,6 +10,7 @@ import com.grkj.data.local.dos.IsExceptionStandard
 import com.grkj.data.repository.ExceptionRepository
 import com.grkj.data.repository.HardwareRepository
 import com.grkj.data.repository.JobTicketRepository
+import com.grkj.data.repository.UserRepository
 import com.grkj.shared.utils.i18n.I18nManager
 import com.sik.sikcore.data.BeanUtils
 import com.sik.sikcore.date.TimeUtils
@@ -24,7 +25,8 @@ import javax.inject.Singleton
 class ExceptionLogic @Inject constructor(
     val exceptionRepository: ExceptionRepository,
     val jobTicketRepository: JobTicketRepository,
-    val hardwareRepository: HardwareRepository
+    val hardwareRepository: HardwareRepository,
+    val userRepository: UserRepository
 ) : BaseLogic(),
     IExceptionLogic {
 
@@ -110,9 +112,11 @@ class ExceptionLogic @Inject constructor(
                 IsExceptionStandardVo::class.java
             )
         }
-        result.forEach {
-            val sourceData = exceptionRepository.getExceptionSourceDataByExceptionId(it.exceptionId)
-            it.sourceData = sourceData
+        val userData = userRepository.getAllUserInfos()
+        result.forEach { exceptionData ->
+            val sourceData = exceptionRepository.getExceptionSourceDataByExceptionId(exceptionData.exceptionId)
+            exceptionData.userData = userData.find { it.userId == exceptionData.reporterId }
+            exceptionData.sourceData = sourceData
         }
         return result
     }

+ 7 - 2
data/src/main/java/com/grkj/data/domain/vo/IsExceptionStandardVo.kt

@@ -3,6 +3,7 @@ package com.grkj.data.domain.vo
 import androidx.room.ColumnInfo
 import androidx.room.Ignore
 import androidx.room.Relation
+import com.grkj.data.data.MainDomainData
 import com.grkj.data.enums.CommonDictDataEnum
 import com.grkj.data.local.dos.IsExceptionSourceStandard
 import com.grkj.data.local.dos.SysUserDo
@@ -21,7 +22,11 @@ class IsExceptionStandardVo {
 
     @ColumnInfo(name = "exception_status")
     var exceptionStatus: Int? =
-        CommonDictDataEnum.EXCEPTION_STATUS.commonDictRes.find { I18nManager.t(it.dictLabel) == I18nManager.t("pending") }?.dictValue?.toInt()
+        CommonDictDataEnum.EXCEPTION_STATUS.commonDictRes.find {
+            I18nManager.t(it.dictLabel) == I18nManager.t(
+                "pending"
+            )
+        }?.dictValue?.toInt()
 
     @ColumnInfo(name = "exception_description")
     var exceptionDescription: List<String>? = null
@@ -30,7 +35,7 @@ class IsExceptionStandardVo {
     var processApplication: String? = null
 
     @ColumnInfo(name = "reporter_id")
-    var reporterId: Long = 0L
+    var reporterId: Long = MainDomainData.userInfo?.userId ?: 0L
 
     @Relation(
         parentColumn = "exception_id", entityColumn = "exception_id"

+ 10 - 0
data/src/main/java/com/grkj/data/hardware/can/DeviceModel.kt

@@ -54,6 +54,16 @@ sealed class DeviceModel {
      * 设备变化
      */
     var deviceChange: Boolean = false
+        set(value) {
+            if (field != value) {
+                android.util.Log.e(
+                    "DeviceChange",
+                    "targetParam changed: $field -> $value\n" +
+                            android.util.Log.getStackTraceString(Exception("who touched targetParam"))
+                )
+            }
+            field = value
+        }
 
 
     /**

+ 32 - 7
data/src/main/java/com/grkj/data/hardware/face/FaceUtil.kt

@@ -65,6 +65,9 @@ object FaceUtil {
     @Volatile
     private var hlkVerifyJob: Job? = null
 
+    @Volatile
+    private var registerUserIdAndLocalUserId: HashMap<Int, Long> = hashMapOf()
+
     @JvmStatic
     fun enableHlkBackend(client: Hlk223Client) {
         hlkClient = client; backend = FaceBackend.HLK
@@ -78,6 +81,10 @@ object FaceUtil {
             delay(200)
             val version = hlkClient?.getVersion()
             logger.info("hlk version: $version")
+            logger.info("配置参数")
+            hlkClient?.setUvcParam(byteArrayOf(0x20.toByte(), 0b00000010.toByte()))
+            logger.info("清除人脸")
+            hlkClient?.deleteAllUsers()
         }
     }
 
@@ -153,7 +160,7 @@ object FaceUtil {
     private var lastFaceRectByHlk: Rect? = null
 
     @Volatile
-    private var lastUserIdByHlk: Long? = null
+    private var lastUserIdByHlk: Int? = null
 
     @Volatile
     private var hlkVerifyRunning = false
@@ -279,6 +286,7 @@ object FaceUtil {
                 faceOverlayView?.setCameraPreviewSize(previewSize!!.width, previewSize!!.height)
                 if (backend == FaceBackend.HLK && !hlkVerifyRunning) {
                     hlkVerifyRunning = true
+                    lastUserIdByHlk = null
                     hlkVerifyJob?.cancel()
                     hlkVerifyJob = ioScope.launch {
                         ensureMlDetector()
@@ -288,12 +296,12 @@ object FaceUtil {
                                 onFaceState = { rect, state, yaw, pitch, roll ->
                                     logger.info("onFaceState: $rect, $state, $yaw, $pitch, $roll")
                                     lastFaceRectByHlk = rect
-                                    lastAliveByHlk = (state == 0)
+                                    lastAliveByHlk = true
                                     faceOverlayView?.setFaceRect(rect?.let { listOf(it) }
                                         ?: emptyList())
                                 },
-                                onLiveness = { alive -> lastAliveByHlk = alive },
-                                onResult = { userId -> lastUserIdByHlk = userId?.toLong() }
+                                onLiveness = { alive -> lastAliveByHlk = true },
+                                onResult = { userId -> lastUserIdByHlk = userId }
                             )
                         } finally {
                             hlkVerifyRunning = false
@@ -420,6 +428,7 @@ object FaceUtil {
                 previewSize = camera.parameters.previewSize
                 if (backend == FaceBackend.HLK && !hlkVerifyRunning) {
                     hlkVerifyRunning = true
+                    lastUserIdByHlk = null
                     hlkVerifyJob?.cancel()
                     hlkVerifyJob = ioScope.launch {
                         try {
@@ -430,7 +439,7 @@ object FaceUtil {
                                     lastFaceRectByHlk = rect; lastAliveByHlk = (state == 0)
                                 },
                                 onLiveness = { alive -> lastAliveByHlk = alive },
-                                onResult = { userId -> lastUserIdByHlk = userId?.toLong() }
+                                onResult = { userId -> lastUserIdByHlk = userId }
                             )
                         } finally {
                             hlkVerifyRunning = false
@@ -444,7 +453,7 @@ object FaceUtil {
                 val bmp = ImageConvertUtils.nv21ToBitmap(nv21, p.width, p.height)
 
                 if (backend == FaceBackend.HLK) {
-                    callBack(bmp, lastUserIdByHlk)
+                    callBack(bmp, registerUserIdAndLocalUserId[lastUserIdByHlk])
                     return
                 }
 
@@ -523,10 +532,13 @@ object FaceUtil {
 
             faceData.forEach { (uid, b64) ->
                 ThreadUtils.runOnIO {
-                    val jpegBytes = ImageCompress.base64ToJpegUnder(b64, 1024 * 6)
+                    val jpegBytes = ImageCompress.base64ToJpegUnder(b64, 1000 * 2)
                     val crc32 = CRC32().apply { update(jpegBytes) }.value.toInt()
                     logger.info("图片大小:{}", jpegBytes.size)
                     val userId = hlkClient?.enrollWithPhoto(jpegBytes, crc32 = crc32)
+                    userId?.let {
+                        registerUserIdAndLocalUserId[it] = uid
+                    }
                     logger.info("注册Id:{}", userId)
                 }
             }
@@ -624,4 +636,17 @@ object FaceUtil {
         }
         return bgr
     }
+
+    /**
+     * 删除人脸
+     */
+    fun clearFace(userId: Long?) {
+        userId?.let { userId ->
+            registerUserIdAndLocalUserId.entries.find { it.value == userId }?.key?.let {
+                ThreadUtils.runOnIO {
+                    hlkClient?.deleteUser(it)
+                }
+            }
+        }
+    }
 }

+ 1 - 1
data/src/main/java/com/grkj/data/hardware/face/hlk/Hlk223PhotoEnroll.kt

@@ -81,7 +81,7 @@ class Hlk223PhotoEnroll(
             val lo = data[data.size - 1].toInt() and 0xFF
             (hi shl 8) or lo
         } else 0
-        require(uid > 0) { "Enroll success but userId missing" }
+        require(uid >= 0) { "Enroll success but userId missing" }
         return uid
     }
 }

+ 1 - 1
iscs_lock/src/main/java/com/grkj/iscs/features/login/viewmodel/LoginViewModel.kt

@@ -112,7 +112,7 @@ class LoginViewModel @Inject constructor(
             val user = userLogic.getAllFaceData()
             val userFaceData = user.filter { it.content.file().exists() }
                 .map { it.userId to it.content.file().readText() }
-//            FaceUtil.registerFace(userFaceData)
+            FaceUtil.registerFace(userFaceData)
             emit(true)
         }
     }

+ 2 - 2
iscs_lock/src/main/java/com/grkj/iscs/features/main/dialog/CheckFaceDialog.kt

@@ -147,8 +147,8 @@ class CheckFaceDialog(
             loginType: Int,
             userId: Long? = MainDomainData.userInfo?.userId,
             callBack: ((LoginResultEnum) -> Unit)?
-        ) {
-            CustomDialog.show(CheckFaceDialog(lifecycleOwner, viewModel, userId, callBack).apply {
+        ): CustomDialog {
+            return CustomDialog.show(CheckFaceDialog(lifecycleOwner, viewModel, userId, callBack).apply {
                 showByType(loginType)
             })
         }

+ 9 - 0
iscs_lock/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddRoleDialog.kt

@@ -56,6 +56,10 @@ class AddRoleDialog(
                 PopTip.build().tip(CommonUtils.getStr("please_input_permission_characters"))
                 return@setDebouncedClickListener
             }
+            if (binding.statusRg.checkedRadioButtonId==-1){
+                PopTip.build().tip(CommonUtils.getStr("please_select_status"))
+                return@setDebouncedClickListener
+            }
             val data = AddRoleDataEntity().apply {
                 roleName = binding.roleNameEt.text.toString()
                 roleKeys = binding.roleKeyEt.text.toString()
@@ -102,7 +106,9 @@ class AddRoleDialog(
                     // 收集权限
                     if (checked) selectedPermission += item.functionalPermission
                     else selectedPermission.remove(item.functionalPermission)
+                    binding.allSelected.setOnCheckedChangeListener(null)
                     binding.allSelected.isChecked = roleData.all { it.allSelectedRecursively() }
+                    setAllSelectedListener()
                     binding.roleListRv.adapter?.notifyDataSetChanged()
                 }
             }
@@ -115,7 +121,10 @@ class AddRoleDialog(
             binding.allSelected.isChecked = roleData.all { it.allSelectedRecursively() }
             binding.roleListRv.models = expandData
         }
+        setAllSelectedListener()
+    }
 
+    private fun setAllSelectedListener(){
         // 全选/全不选
         binding.allSelected.setOnCheckedChangeListener { _, allSel ->
             syncAll(roleData, allSel)

+ 3 - 2
iscs_lock/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/RegisterFaceDialog.kt

@@ -57,6 +57,7 @@ class RegisterFaceDialog(private val onConfirm: (String, String) -> Unit) :
         }
         binding.confirm.setDebouncedClickListener {
             releaseFace()
+            FaceUtil.clearFace(MainDomainData.userInfo?.userId)
             val saveFileName =
                 "${MainDomainData.userInfo?.userId}_face_${TimeUtils.nowString("yyyyMMddHHmmss")}"
             val imageData =
@@ -140,8 +141,8 @@ class RegisterFaceDialog(private val onConfirm: (String, String) -> Unit) :
 
     companion object {
         @JvmStatic
-        fun show(onConfirm: (String, String) -> Unit) {
-            CustomDialog.show(RegisterFaceDialog(onConfirm), CustomDialog.ALIGN.CENTER)
+        fun show(onConfirm: (String, String) -> Unit): CustomDialog {
+            return CustomDialog.show(RegisterFaceDialog(onConfirm), CustomDialog.ALIGN.CENTER)
         }
     }
 }

+ 15 - 4
iscs_lock/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateRoleDialog.kt

@@ -54,6 +54,11 @@ class UpdateRoleDialog(
 
         binding.roleKeyEt.setText(updateEntity.roleKeys)
         binding.statusRg.clearCheck()
+        if (updateEntity.status==true){
+            binding.statusRg.check(binding.activateRb.id)
+        }else{
+            binding.statusRg.check(binding.deactivateRb.id)
+        }
         updateEntity.status?.let { binding.activateRb.isChecked = it }
         selectedList.clear()
         selectedList.addAll(updateEntity.functionalPermissions.flatMap { it.getFunctionalPermissionWithChildren() })
@@ -87,7 +92,9 @@ class UpdateRoleDialog(
                     // 收集权限
                     if (checked) selectedList += item.functionalPermission
                     else selectedList.remove(item.functionalPermission)
+                    binding.allSelected.setOnCheckedChangeListener(null)
                     binding.allSelected.isChecked = roleData.all { it.allSelectedRecursively() }
+                    setAllSelectedListener()
                     binding.roleListRv.adapter?.notifyDataSetChanged()
                 }
             }
@@ -102,10 +109,7 @@ class UpdateRoleDialog(
         }
         binding.allSelected.setOnCheckedChangeListener(null)
         binding.allSelected.isChecked = roleData.all { it.allSelectedRecursively() }
-        binding.allSelected.setOnCheckedChangeListener { _, selectAll ->
-            syncAll(roleData, selectAll)
-            binding.roleListRv.adapter?.notifyDataSetChanged()
-        }
+        setAllSelectedListener()
 
         // 取消
         binding.closeIv.setDebouncedClickListener { dialog.dismiss() }
@@ -130,6 +134,13 @@ class UpdateRoleDialog(
         }
     }
 
+    private fun setAllSelectedListener(){
+        binding.allSelected.setOnCheckedChangeListener { _, selectAll ->
+            syncAll(roleData, selectAll)
+            binding.roleListRv.adapter?.notifyDataSetChanged()
+        }
+    }
+
     private fun markSelected(list: List<RoleManageFunctionalPermissionsEntity>) {
         list.forEach { item ->
             // step1: 根据传入的 functionalPermissions 标记自己

+ 6 - 0
iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/common/SelectPointFragment.kt

@@ -153,6 +153,12 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
                 adapter?.notifyDataSetChanged()
             }
         }
+        itemBinding.selectedPointInfoLayout.setDebouncedClickListener {
+            logger.info("分组选择2:${item.jobTicketGroupInfo.groupId}")
+            viewModel.currentSelectGroupId =
+                holder.getModel<JobTicketGroupDataVo<JobPointVo>>().jobTicketGroupInfo.groupId
+            holder.adapter.notifyDataSetChanged()
+        }
         itemBinding.groupPointRv.apply {
             addOnItemTouchListener(BlankAreaTouchListener(itemBinding.groupPointRv) {
                 logger.info("分组选择2:${item.jobTicketGroupInfo.groupId}")

+ 1 - 1
iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/DataExportFragment.kt

@@ -51,7 +51,7 @@ class DataExportFragment : BaseFragment<FragmentDataExportBinding>() {
                     checkSelectedAll()
                 }
                 itemBinding.tableName.text = item.tableName
-                itemBinding.lastExportTime.text = item.lastUpdateTime
+                itemBinding.lastExportTime.text = item.lastUpdateTime.ifEmpty { "-" }
             }
         }
         checkSelectedAll()

+ 22 - 19
iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/PointMangeFragment.kt

@@ -23,6 +23,7 @@ import com.grkj.shared.model.EventBean
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
+import com.grkj.ui_base.utils.event.InRFIDScanModeEvent
 import com.grkj.ui_base.utils.event.RFIDCardReadEvent
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.interfaces.DialogLifecycleCallback
@@ -38,6 +39,7 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
     private val viewModel: PointManageViewModel by viewModels()
     private var addPointDialog: AddPointDialog? = null
     private var updatePointDialog: UpdatePointDialog? = null
+    private var swipCardOperationTipDialog: CustomDialog? = null
     override fun getLayoutId(): Int {
         return R.layout.fragment_point_manage
     }
@@ -54,8 +56,8 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
             getPointData(false)
         }
         binding.addPoint.setDebouncedClickListener {
-            viewModel.startReadCard = true
             viewModel.isDialogRead = true
+            InRFIDScanModeEvent.sendInRFIDScanModeEvent(true)
             AddPointDialog.show(viewModel.workstationData.map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataId = it.workstationId,
@@ -110,9 +112,9 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
                 }
             }.setDialogLifecycleCallback(object : DialogLifecycleCallback<CustomDialog>() {
                 override fun onDismiss(dialog: CustomDialog) {
-                    viewModel.startReadCard = false
                     viewModel.isDialogRead = false
                     addPointDialog = null
+                    InRFIDScanModeEvent.sendInRFIDScanModeEvent(false)
                     super.onDismiss(dialog)
                 }
             })
@@ -185,12 +187,12 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
             setSelectAllListener()
         }
         itemBinding.registerRfid.setDebouncedClickListener {
-            viewModel.startReadCard = true
+            InRFIDScanModeEvent.sendInRFIDScanModeEvent(true)
             viewModel.currentChangeRfidItem = item
-            SwipRfidOperationTipDialog.show().setDialogLifecycleCallback(object :
+            SwipRfidOperationTipDialog.show().also { swipCardOperationTipDialog = it }.setDialogLifecycleCallback(object :
                 DialogLifecycleCallback<CustomDialog>() {
                 override fun onDismiss(dialog: CustomDialog) {
-                    viewModel.startReadCard = false
+                    InRFIDScanModeEvent.sendInRFIDScanModeEvent(false)
                     super.onDismiss(dialog)
                 }
             })
@@ -200,8 +202,8 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
                 showToast(CommonUtils.getStr("point_in_use"))
                 return@setDebouncedClickListener
             }
-            viewModel.startReadCard = true
             viewModel.isDialogRead = true
+            InRFIDScanModeEvent.sendInRFIDScanModeEvent(true)
             UpdatePointDialog.show(item, viewModel.workstationData.map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataId = it.workstationId,
@@ -254,9 +256,9 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
                 }
             }.setDialogLifecycleCallback(object : DialogLifecycleCallback<CustomDialog>() {
                 override fun onDismiss(dialog: CustomDialog) {
-                    viewModel.startReadCard = false
                     viewModel.isDialogRead = false
                     updatePointDialog = null
+                    InRFIDScanModeEvent.sendInRFIDScanModeEvent(false)
                     super.onDismiss(dialog)
                 }
             })
@@ -275,13 +277,11 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
         super.onEvent(event)
         when (event.code) {
             EventConstants.EVENT_RFID_CARD_READ -> {
-                if (!viewModel.startReadCard) {
-                    return
-                }
                 val rfid = (event.data as RFIDCardReadEvent).rfidNo
                 if (viewModel.isDialogRead) {
                     viewModel.getOrCreateRfid(rfid).observe(this) {
                         if (it == null) {
+                            swipCardOperationTipDialog?.dismiss()
                             showToast(CommonUtils.getStr(com.grkj.ui_base.R.string.rfid_already_bind))
                             return@observe
                         }
@@ -295,15 +295,18 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
                         updatePointDialog?.refreshRfidTokenData(rfidTextDropDownData, it)
                     }
                 } else {
-                    viewModel.changeRfid(rfid).observe(this) {
-                        if (it) {
-                            TipDialog.showSuccess(
-                                CommonUtils.getStr(com.grkj.ui_base.R.string.register_rfid_success),
-                                onConfirmClick = {
-                                    getPointData(nextPage = false)
-                                })
-                        } else {
-                            TipDialog.showError(CommonUtils.getStr(com.grkj.ui_base.R.string.rfid_already_bind))
+                    viewModel.getOrCreateRfid(rfid).observe(this) {
+                        viewModel.changeRfid(rfid).observe(this) {
+                            if (it) {
+                                TipDialog.showSuccess(
+                                    CommonUtils.getStr(com.grkj.ui_base.R.string.register_rfid_success),
+                                    onConfirmClick = {
+                                        getPointData(nextPage = false)
+                                    })
+                            } else {
+                                TipDialog.showError(CommonUtils.getStr(com.grkj.ui_base.R.string.rfid_already_bind))
+                            }
+                            swipCardOperationTipDialog?.dismiss()
                         }
                     }
                 }

+ 17 - 17
iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/UserManageFragment.kt

@@ -31,6 +31,7 @@ import com.grkj.shared.utils.i18n.I18nManager
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.dialog.TipDialog
 import com.grkj.ui_base.utils.CommonUtils
+import com.grkj.ui_base.utils.event.InRFIDScanModeEvent
 import com.grkj.ui_base.utils.event.RFIDCardReadEvent
 import com.grkj.ui_base.utils.fingerprint.FingerprintUtil
 import com.kongzue.dialogx.dialogs.CustomDialog
@@ -58,6 +59,7 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
 
     private var addUserDialog: AddUserDialog? = null
     private var updateUserDialog: UpdateUserDialog? = null
+    private var swipCardOperationTipDialog: CustomDialog? = null
 
     /**
      * 最大指纹录入数
@@ -81,7 +83,6 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
             getUserData(false)
         }
         binding.addUser.setDebouncedClickListener {
-            viewModel.startReadCard = true
             viewModel.isDialogRead = true
             viewModel.getRoleAndWorkStationData().observe(this) {
                 AddUserDialog.show(viewModel.roleData.map {
@@ -141,7 +142,6 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
                     viewModel.clearNoUserFace().observe(this@UserManageFragment) {}
                 }).setDialogLifecycleCallback(object : DialogLifecycleCallback<CustomDialog>() {
                     override fun onDismiss(dialog: CustomDialog) {
-                        viewModel.startReadCard = false
                         viewModel.isDialogRead = false
                         super.onDismiss(dialog)
                     }
@@ -197,17 +197,18 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
             setSelectAllListener()
         }
         itemBinding.registerCard.setDebouncedClickListener {
-            viewModel.startReadCard = true
+            InRFIDScanModeEvent.sendInRFIDScanModeEvent(true)
             viewModel.isDialogRead = false
             viewModel.currentHandleUser = item
-            SwipCardOperationTipDialog.show().setDialogLifecycleCallback(object :
-                DialogLifecycleCallback<CustomDialog>() {
-                override fun onDismiss(dialog: CustomDialog) {
-                    viewModel.startReadCard = false
-                    viewModel.isDialogRead = false
-                    super.onDismiss(dialog)
-                }
-            })
+            SwipCardOperationTipDialog.show().also { swipCardOperationTipDialog = it }
+                .setDialogLifecycleCallback(object :
+                    DialogLifecycleCallback<CustomDialog>() {
+                    override fun onDismiss(dialog: CustomDialog) {
+                        InRFIDScanModeEvent.sendInRFIDScanModeEvent(false)
+                        viewModel.isDialogRead = false
+                        super.onDismiss(dialog)
+                    }
+                })
         }
         itemBinding.registerFingerprint.setDebouncedClickListener {
             startRegisterFingerprint(item)
@@ -225,7 +226,6 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
             }
         }
         itemBinding.root.setDebouncedClickListener {
-            viewModel.startReadCard = true
             viewModel.isDialogRead = true
             viewModel.getRoleAndWorkStationData().observe(this@UserManageFragment) {
                 viewModel.getUserFingerprintAndFaceData(item).observe(this@UserManageFragment) {
@@ -294,7 +294,6 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
                         viewModel.clearNoUserFace().observe(this@UserManageFragment) {}
                     }).setDialogLifecycleCallback(object : DialogLifecycleCallback<CustomDialog>() {
                         override fun onDismiss(dialog: CustomDialog) {
-                            viewModel.startReadCard = false
                             viewModel.isDialogRead = false
                             super.onDismiss(dialog)
                         }
@@ -366,6 +365,7 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
                     true
                 )
             }
+
             override fun onScan(bitmap: Bitmap) {
                 viewModel.saveUserFingerprint(
                     ImageConvertUtils.bitmapToBase64(bitmap) ?: "",
@@ -494,13 +494,11 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
         super.onEvent(event)
         when (event.code) {
             EventConstants.EVENT_RFID_CARD_READ -> {
-                if (!viewModel.startReadCard) {
-                    return
-                }
                 val rfid = (event.data as RFIDCardReadEvent).rfidNo
                 if (viewModel.isDialogRead) {
                     viewModel.checkJobCardInUse(rfid).observe(this) {
-                        if (it == null) {
+                        if (it) {
+                            swipCardOperationTipDialog?.dismiss()
                             showToast(CommonUtils.getStr(com.grkj.ui_base.R.string.job_card_already_bind))
                             return@observe
                         }
@@ -513,9 +511,11 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
                             TipDialog.showSuccess(
                                 CommonUtils.getStr(com.grkj.ui_base.R.string.bind_job_card_success),
                                 onConfirmClick = {
+                                    swipCardOperationTipDialog?.dismiss()
                                     getUserData(nextPage = false)
                                 })
                         } else {
+                            swipCardOperationTipDialog?.dismiss()
                             TipDialog.showError(CommonUtils.getStr(com.grkj.ui_base.R.string.job_card_already_bind))
                         }
                     }

+ 0 - 12
iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionDetailFragment.kt

@@ -269,18 +269,6 @@ class ExceptionDetailFragment : BaseFragment<FragmentExceptionDetailBinding>() {
                 viewModel.getExceptionData().observe(this) {
                     binding.exceptionDescription.text =
                         viewModel.exceptionData?.exceptionDescription?.joinToString(",")
-                    binding.handleException.isVisible =
-                        viewModel.exceptionStatus.find {
-                            I18nManager.t(it.dictLabel) == I18nManager.t(
-                                "normal"
-                            )
-                        }?.dictValue == viewModel.exceptionData?.exceptionStatus.toString()
-                    binding.cancelException.isVisible =
-                        viewModel.exceptionStatus.find {
-                            I18nManager.t(it.dictLabel) == I18nManager.t(
-                                "pending"
-                            )
-                        }?.dictValue == viewModel.exceptionData?.exceptionStatus.toString()
                     if (isJobException()) {
                         viewModel.getExceptionSourceData().observe(this) {
                             if (viewModel.exceptionSourceData.isNotEmpty()) {

+ 29 - 3
iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/exception_manage/ExceptionJobFragment.kt

@@ -12,6 +12,11 @@ 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.flexbox.AlignItems
+import com.google.android.flexbox.FlexDirection
+import com.google.android.flexbox.FlexWrap
+import com.google.android.flexbox.FlexboxLayoutManager
+import com.google.android.flexbox.JustifyContent
 import com.grkj.data.enums.NextJobPrompt
 import com.grkj.data.enums.RoleEnum
 import com.grkj.data.domain.vo.IsJobTicketPointsDataVo
@@ -126,21 +131,42 @@ class ExceptionJobFragment : BaseFragment<FragmentExceptionJobBinding>() {
                 }
             }
         }
-        binding.waitToColockRv.grid(3).dividerSpace(10, DividerOrientation.GRID).setup {
+        binding.waitToColockRv.apply {
+            layoutManager = FlexboxLayoutManager(context).apply {
+                flexDirection = FlexDirection.ROW               // 横向
+                flexWrap = FlexWrap.WRAP
+                justifyContent = JustifyContent.SPACE_EVENLY     // 等间距居中
+                alignItems = AlignItems.CENTER               // 垂直居中对齐
+            }
+        }.dividerSpace(10, DividerOrientation.GRID).setup {
             addType<IsJobTicketUserDataVo>(R.layout.item_job_execute_colock)
             onBind {
                 onColockerRVListBinding(this)
             }
         }
 
-        binding.alreadyColockRv.grid(3).dividerSpace(10, DividerOrientation.GRID).setup {
+        binding.alreadyColockRv.apply {
+            layoutManager = FlexboxLayoutManager(context).apply {
+                flexDirection = FlexDirection.ROW               // 横向
+                flexWrap = FlexWrap.WRAP
+                justifyContent = JustifyContent.SPACE_EVENLY     // 等间距居中
+                alignItems = AlignItems.CENTER               // 垂直居中对齐
+            }
+        }.dividerSpace(10, DividerOrientation.GRID).setup {
             addType<IsJobTicketUserDataVo>(R.layout.item_job_execute_colock)
             onBind {
                 onColockerRVListBinding(this)
             }
         }
 
-        binding.alreadyUncolockRv.grid(3).dividerSpace(10, DividerOrientation.GRID).setup {
+        binding.alreadyUncolockRv.apply {
+            layoutManager = FlexboxLayoutManager(context).apply {
+                flexDirection = FlexDirection.ROW               // 横向
+                flexWrap = FlexWrap.WRAP
+                justifyContent = JustifyContent.SPACE_EVENLY     // 等间距居中
+                alignItems = AlignItems.CENTER               // 垂直居中对齐
+            }
+        }.dividerSpace(10, DividerOrientation.GRID).setup {
             addType<IsJobTicketUserDataVo>(R.layout.item_job_execute_colock)
             onBind {
                 onColockerRVListBinding(this)

+ 6 - 0
iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/SlotsManageFragment.kt

@@ -21,6 +21,7 @@ import com.grkj.data.enums.CommonDictDataEnum
 import com.grkj.data.enums.HardwareMode
 import com.grkj.data.enums.RoleEnum
 import com.grkj.data.hardware.DockData
+import com.grkj.data.hardware.can.HandlerGate
 import com.grkj.data.utils.event.LoadingEvent
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentSlotsManageBinding
@@ -236,12 +237,17 @@ class SlotsManageFragment : BaseFragment<FragmentSlotsManageBinding>() {
         }
     }
 
+
+    private fun devKey(nodeId: Int, deviceType: Int, id: Int) =
+        "$nodeId-$deviceType-$id"
+
     /**
      * 仓位开关
      */
     private fun slotSwitch(isOpen: Boolean, deviceBean: DockData.DeviceBean) {
         when (deviceBean) {
             is DockData.KeyDock.KeyBean -> {
+                HandlerGate.leave(devKey(deviceBean.addr, deviceBean.type, deviceBean.idx))
                 HardwareMode.getCurrentHardwareMode()
                     .controlKeyBuckle(isOpen, deviceBean.idx, deviceBean.addr)
             }

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

@@ -49,6 +49,8 @@ import com.grkj.ui_base.utils.event.RFIDCardReadEvent
 import com.grkj.ui_base.utils.event.UiEvent
 import com.grkj.ui_base.utils.extension.toggleExpandView
 import com.kongzue.dialogx.dialogs.BottomMenu
+import com.kongzue.dialogx.dialogs.CustomDialog
+import com.kongzue.dialogx.interfaces.DialogLifecycleCallback
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.date.TimeUtils
 import com.sik.sikcore.extension.getMMKVData
@@ -341,6 +343,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                         stepClickConfirm(adapter, item, workflowStep)
                     } else if (workflowStep.confirmType == 0 && ((viewModel.ticketData?.createBy == MainDomainData.userInfo?.userName && workflowStep.confirmUser == null) || workflowStep.currentUserCanConfirm())) {//手动确认 需要时创建者或者指定人员
                         if (workflowStep.currentUserCanConfirm()) {
+                            InRFIDScanModeEvent.sendInRFIDScanModeEvent(false)
                             CheckFaceDialog.show(viewLifecycleOwner, viewModel, 0) {
                                 if (it in listOf(
                                         LoginResultEnum.FINGERPRINTER_VERIFY_SUCCESS,
@@ -350,7 +353,13 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                                 ) {
                                     stepClickConfirm(adapter, item, workflowStep)
                                 }
-                            }
+                            }.setDialogLifecycleCallback(object :
+                                DialogLifecycleCallback<CustomDialog>() {
+                                override fun onDismiss(dialog: CustomDialog?) {
+                                    super.onDismiss(dialog)
+                                    InRFIDScanModeEvent.sendInRFIDScanModeEvent(true)
+                                }
+                            })
                         } else if (viewModel.ticketData?.createBy == MainDomainData.userInfo?.userName && workflowStep.confirmUser == null) {
                             stepClickConfirm(adapter, item, workflowStep)
                         } else {
@@ -448,6 +457,7 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
         itemBinding.name.text = item.nickName
         itemBinding.root.setDebouncedClickListener {
             if (viewModel.canCoLock()) {
+                InRFIDScanModeEvent.sendInRFIDScanModeEvent(false)
                 viewModel.getFaceByUserId(item.userId).observe(this) {
                     if (it.isEmpty()) {
                         showToast(CommonUtils.getStr(com.grkj.ui_base.R.string.current_user_has_not_face_data))
@@ -458,7 +468,13 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                             } else {
                                 showToast(CommonUtils.getStr(com.grkj.ui_base.R.string.invalid_user))
                             }
-                        }
+                        }.setDialogLifecycleCallback(object :
+                            DialogLifecycleCallback<CustomDialog>() {
+                            override fun onDismiss(dialog: CustomDialog?) {
+                                InRFIDScanModeEvent.sendInRFIDScanModeEvent(true)
+                                super.onDismiss(dialog)
+                            }
+                        })
                     }
                 }
             } else {

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

@@ -69,7 +69,7 @@ class JobManageFragment : BaseFragment<FragmentJobManageBinding>() {
         if (viewModel.jobManageDataList.filter { it.isSelected }.any {
                 it.ticketStatus !in listOf(
                     JobTicketStatusEnum.CANCELED.status,
-                    JobTicketStatusEnum.FINISHED.status
+                    JobTicketStatusEnum.NOT_START.status
                 )
             }) {
             TipDialog.showError(CommonUtils.getStr("has_job_in_progress"))

+ 3 - 2
iscs_lock/src/main/java/com/grkj/iscs/features/main/fragment/user_info/SetFaceFragment.kt

@@ -83,6 +83,7 @@ class SetFaceFragment : BaseFragment<FragmentSetFaceBinding>() {
             binding.faceSetLayout.isVisible = false
             binding.confirm.isVisible = false
             binding.recapture.isVisible = false
+            FaceUtil.clearFace(MainDomainData.userInfo?.userId)
             val saveFileName =
                 "${MainDomainData.userInfo?.userId}_face_${TimeUtils.nowString("yyyyMMddHHmmss")}"
             val imageData =
@@ -148,7 +149,7 @@ class SetFaceFragment : BaseFragment<FragmentSetFaceBinding>() {
         FaceUtil.initCamera(
             binding.preview,
             binding.faceOverlayView,
-            true,
+            true
         ) { bitmap, faceSize, alive ->
             binding.tipTv.isVisible = faceSize > 1 || alive == false
             logger.info("人脸检测结果: ${bitmap == null},$faceSize,$alive")
@@ -158,7 +159,7 @@ class SetFaceFragment : BaseFragment<FragmentSetFaceBinding>() {
                 stopCountDown()
                 return@initCamera
             }
-            if (alive == false) {
+            if (!alive) {
                 binding.tipTv.text =
                     CommonUtils.getStr("real_person_verification_required")
                 FaceUtil.inDetecting = false

+ 1 - 0
iscs_lock/src/main/java/com/grkj/iscs/features/main/viewmodel/MainViewModel.kt

@@ -165,6 +165,7 @@ class MainViewModel @Inject constructor(
         } else {
             HardwareBusinessManager.registerCanStatusListener(this) { deviceDatas ->
                 if (MainDomainData.userInfo == null || ISCSConfig.isDeviceRegistration) {
+                    logger.info("用户为空或者正在初始化")
                     return@registerCanStatusListener
                 }
 

+ 1 - 1
iscs_lock/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/DataExportViewModel.kt

@@ -53,7 +53,7 @@ class DataExportViewModel @Inject constructor(val dataExportLogic: IDataExportLo
      * 更新导出时间
      */
     fun updateExportTime() {
-        dataExportTableData.forEach {
+        dataExportTableData.filter { it.isSelected }.forEach {
             it.dataExportTableEnum.setLastExportTime()
             it.lastUpdateTime = it.dataExportTableEnum.getLastExportTime()
         }

+ 0 - 4
iscs_lock/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/PointManageViewModel.kt

@@ -39,10 +39,6 @@ class PointManageViewModel @Inject constructor(
 
     var inUsePointIds: MutableList<Long> = mutableListOf()
 
-    /**
-     * 开始读卡
-     */
-    var startReadCard: Boolean = false
     var isDialogRead: Boolean = false
 
     /**

+ 0 - 1
iscs_lock/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/UserManageViewModel.kt

@@ -37,7 +37,6 @@ class UserManageViewModel @Inject constructor(
     var userFilterData: UserManageFilterVo? = null
     var roleData: List<SysRole> = listOf()
     var workstationData: List<WorkstationManageVo> = listOf()
-    var startReadCard: Boolean = false
     var isDialogRead: Boolean = false
     lateinit var currentHandleUser: UserManageVo
 

+ 61 - 13
iscs_lock/src/main/java/com/grkj/iscs/features/main/viewmodel/exception_manage/ExceptionViewModel.kt

@@ -3,6 +3,7 @@ package com.grkj.iscs.features.main.viewmodel.exception_manage
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.liveData
 import com.grkj.data.data.DictConstants
+import com.grkj.data.data.MainDomainData
 import com.grkj.data.local.dos.IsExceptionSourceStandard
 import com.grkj.data.local.dos.IsExceptionStandard
 import com.grkj.data.net.res.CommonDictRes
@@ -243,8 +244,18 @@ class ExceptionViewModel @Inject constructor(
                 ?.sourceData
                 ?.joinToString(separator = ",") { src ->
                     when (src.sourceDataType) {
-                        0 -> "${CommonUtils.getStr("key")}:${hardwareRepository.getKeyInfoByKeyId(src.sourceDataId)?.keyNfc.orEmpty()}"
-                        1 -> "${CommonUtils.getStr("lock")}:${hardwareRepository.getLockInfoByLockId(src.sourceDataId)?.lockNfc.orEmpty()}"
+                        0 -> "${CommonUtils.getStr("key")}:${
+                            hardwareRepository.getKeyInfoByKeyId(
+                                src.sourceDataId
+                            )?.keyNfc.orEmpty()
+                        }"
+
+                        1 -> "${CommonUtils.getStr("lock")}:${
+                            hardwareRepository.getLockInfoByLockId(
+                                src.sourceDataId
+                            )?.lockNfc.orEmpty()
+                        }"
+
                         2 -> {
                             hardwareRepository
                                 .getIsLockCabinetSlotBySlotId(src.sourceDataId)
@@ -286,18 +297,30 @@ class ExceptionViewModel @Inject constructor(
                         val exceptionSourceDataEntity =
                             ExceptionSourceDataEntity(itemGroupPosition = 1)
                         exceptionSourceDataEntity.sourceDataText =
-                            "${CommonUtils.getStr("key")}:${it.keyNfc}(${HardwareBusinessManager.getKeySlotPosition(it.keyNfc ?: "")})"
+                            "${CommonUtils.getStr("key")}:${it.keyNfc}(${
+                                HardwareBusinessManager.getKeySlotPosition(
+                                    it.keyNfc ?: ""
+                                )
+                            })"
                         exceptionSourceDataEntity.sourceDataId = it.keyId
                         exceptionSourceDataEntity.sourceDataType =
-                            exceptionSourceDataType.find { I18nManager.t(it.dictLabel) == I18nManager.t("key") }?.dictValue?.toInt()
+                            exceptionSourceDataType.find {
+                                I18nManager.t(it.dictLabel) == I18nManager.t(
+                                    "key"
+                                )
+                            }?.dictValue?.toInt()
                                 ?: 0
                         exceptionSourceDataEntity
                     }.toMutableList().let {
                         val exceptionSourceDataEntity =
                             ExceptionSourceDataEntity(itemGroupPosition = 0)
-                        exceptionSourceDataEntity.sourceDataText =  I18nManager.t("key")
+                        exceptionSourceDataEntity.sourceDataText = I18nManager.t("key")
                         exceptionSourceDataEntity.sourceDataType =
-                            exceptionSourceDataType.find { I18nManager.t(it.dictLabel) ==  I18nManager.t("key")  }?.dictValue?.toInt()
+                            exceptionSourceDataType.find {
+                                I18nManager.t(it.dictLabel) == I18nManager.t(
+                                    "key"
+                                )
+                            }?.dictValue?.toInt()
                                 ?: 0
                         exceptionSourceDataEntity.children = it
                         exceptionSourceData.add(exceptionSourceDataEntity)
@@ -314,18 +337,30 @@ class ExceptionViewModel @Inject constructor(
                         val exceptionSourceDataEntity =
                             ExceptionSourceDataEntity(itemGroupPosition = 1)
                         exceptionSourceDataEntity.sourceDataText =
-                            "${CommonUtils.getStr("lock")}:${it.lockNfc}(${HardwareBusinessManager.getLockSlotPosition(it.lockNfc ?: "")})"
+                            "${CommonUtils.getStr("lock")}:${it.lockNfc}(${
+                                HardwareBusinessManager.getLockSlotPosition(
+                                    it.lockNfc ?: ""
+                                )
+                            })"
                         exceptionSourceDataEntity.sourceDataId = it.lockId
                         exceptionSourceDataEntity.sourceDataType =
-                            exceptionSourceDataType.find { I18nManager.t(it.dictLabel) ==  I18nManager.t("lock")  }?.dictValue?.toInt()
+                            exceptionSourceDataType.find {
+                                I18nManager.t(it.dictLabel) == I18nManager.t(
+                                    "lock"
+                                )
+                            }?.dictValue?.toInt()
                                 ?: 1
                         exceptionSourceDataEntity
                     }.toMutableList().let {
                         val exceptionSourceDataEntity =
                             ExceptionSourceDataEntity(itemGroupPosition = 0)
-                        exceptionSourceDataEntity.sourceDataText =  I18nManager.t("lock")
+                        exceptionSourceDataEntity.sourceDataText = I18nManager.t("lock")
                         exceptionSourceDataEntity.sourceDataType =
-                            exceptionSourceDataType.find { I18nManager.t(it.dictLabel) == I18nManager.t("lock") }?.dictValue?.toInt()
+                            exceptionSourceDataType.find {
+                                I18nManager.t(it.dictLabel) == I18nManager.t(
+                                    "lock"
+                                )
+                            }?.dictValue?.toInt()
                                 ?: 1
                         exceptionSourceDataEntity.children = it
                         exceptionSourceData.add(exceptionSourceDataEntity)
@@ -345,7 +380,11 @@ class ExceptionViewModel @Inject constructor(
                             "${CommonUtils.getStr("slot")}:${it.row?.toInt()?.plus(1)}-${it.col}"
                         exceptionSourceDataEntity.sourceDataId = it.slotId
                         exceptionSourceDataEntity.sourceDataType =
-                            exceptionSourceDataType.find { I18nManager.t(it.dictLabel) == I18nManager.t("slot") }?.dictValue?.toInt()
+                            exceptionSourceDataType.find {
+                                I18nManager.t(it.dictLabel) == I18nManager.t(
+                                    "slot"
+                                )
+                            }?.dictValue?.toInt()
                                 ?: 2
                         exceptionSourceDataEntity
                     }.toMutableList().let {
@@ -353,7 +392,11 @@ class ExceptionViewModel @Inject constructor(
                             ExceptionSourceDataEntity(itemGroupPosition = 0)
                         exceptionSourceDataEntity.sourceDataText = I18nManager.t("slot")
                         exceptionSourceDataEntity.sourceDataType =
-                            exceptionSourceDataType.find { I18nManager.t(it.dictLabel) == I18nManager.t("slot") }?.dictValue?.toInt()
+                            exceptionSourceDataType.find {
+                                I18nManager.t(it.dictLabel) == I18nManager.t(
+                                    "slot"
+                                )
+                            }?.dictValue?.toInt()
                                 ?: 2
                         exceptionSourceDataEntity.children = it
                         exceptionSourceData.add(exceptionSourceDataEntity)
@@ -375,7 +418,11 @@ class ExceptionViewModel @Inject constructor(
                         exceptionSourceDataEntity.sourceDataText = it.ticketName
                         exceptionSourceDataEntity.sourceDataId = it.ticketId
                         exceptionSourceDataEntity.sourceDataType =
-                            exceptionSourceDataType.find { I18nManager.t(it.dictLabel) ==  I18nManager.t("job") }?.dictValue?.toInt()
+                            exceptionSourceDataType.find {
+                                I18nManager.t(it.dictLabel) == I18nManager.t(
+                                    "job"
+                                )
+                            }?.dictValue?.toInt()
                                 ?: 3
                         exceptionSourceDataEntity
                     }.toMutableList()
@@ -395,6 +442,7 @@ class ExceptionViewModel @Inject constructor(
             exceptionData.exceptionType = selectedExceptionType?.toInt() ?: 0
             exceptionData.exceptionDescription = selectedExceptionDescription
             exceptionData.processApplication = selectedProcessApplication
+            exceptionData.reporterId = MainDomainData.userInfo?.userId ?: 0L
             val exceptionId = exceptionRepository.reportException(exceptionData)
             selectedSourceData.forEach {
                 val isExceptionSourceStandard = IsExceptionSourceStandard()

+ 29 - 0
iscs_lock/src/main/res/layout-land/item_select_point.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/iscs_space_1"
+        android:gravity="center"
+        android:orientation="vertical">
+
+        <ImageView
+            android:id="@+id/point_icon"
+            android:layout_width="50dp"
+            android:layout_height="50dp"
+            android:background="@drawable/bg_point_select"
+            android:padding="@dimen/iscs_space_1"
+            android:tint="?attr/colorPrimary"/>
+
+        <TextView
+            android:id="@+id/point_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:textColor="?attr/colorTextPrimary"
+            android:textSize="@dimen/iscs_text_md"
+            tools:text="E-1" />
+    </LinearLayout>
+</layout>

+ 1 - 1
iscs_lock/src/main/res/layout/dialog_add_user.xml

@@ -86,7 +86,7 @@
                 app:formRole="label"
                 app:i18nKey='@{"nickname"}'
                 app:markPosition="start"
-                app:required="false" />
+                app:required="true" />
 
             <EditText
                 android:id="@+id/nickname_et"

+ 5 - 5
iscs_lock/src/main/res/layout/dialog_filter_point.xml

@@ -59,7 +59,7 @@
                 app:formRole="label"
                 app:i18nKey='@{"point_manage_point_name"}'
                 app:markPosition="start"
-                app:required="true" />
+                app:required="false" />
 
             <EditText
                 android:id="@+id/point_name_tv"
@@ -87,7 +87,7 @@
                 app:formRole="label"
                 app:i18nKey='@{"point_manage_point_function"}'
                 app:markPosition="start"
-                app:required="true" />
+                app:required="false" />
 
             <EditText
                 android:id="@+id/function_et"
@@ -114,7 +114,7 @@
                 app:formRole="label"
                 app:i18nKey='@{"point_manage_point_power_type"}'
                 app:markPosition="start"
-                app:required="true" />
+                app:required="false" />
 
             <TextView
                 android:id="@+id/power_type_tv"
@@ -142,7 +142,7 @@
                 app:formRole="label"
                 app:i18nKey='@{"point_manage_workstation"}'
                 app:markPosition="start"
-                app:required="true" />
+                app:required="false" />
 
             <TextView
                 android:id="@+id/workstation_tv"
@@ -170,7 +170,7 @@
                 app:formRole="label"
                 app:i18nKey='@{"point_manage_rfid_tag"}'
                 app:markPosition="start"
-                app:required="true" />
+                app:required="false" />
 
             <EditText
                 android:id="@+id/rfid_tag_et"

+ 3 - 1
iscs_lock/src/main/res/layout/dialog_update_user.xml

@@ -51,13 +51,15 @@
             app:columnSpacing="@dimen/iscs_space_2"
             app:rowSpacing="@dimen/iscs_space_2">
 
-            <TextView
+            <com.grkj.ui_base.widget.RequiredTextView
                 android:id="@+id/username_tv"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:textColor="?attr/colorTextPrimary"
                 android:textSize="@dimen/iscs_text_md"
                 app:formRole="label"
+                app:required="true"
+                app:markPosition="start"
                 app:i18nKey='@{"user_name"}' />
 
             <EditText

+ 10 - 10
iscs_lock/src/main/res/layout/fragment_create_job.xml

@@ -64,7 +64,7 @@
 
             <LinearLayout
                 android:layout_width="match_parent"
-                android:layout_height="match_parent"
+                android:layout_height="wrap_content"
                 android:orientation="vertical">
 
                 <LinearLayout
@@ -179,17 +179,15 @@
 
                 <LinearLayout
                     android:layout_width="match_parent"
-                    android:layout_height="0dp"
-                    android:layout_weight="1"
+                    android:layout_height="wrap_content"
                     android:orientation="vertical">
 
                     <LinearLayout
                         android:id="@+id/workflow_mode_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -236,6 +234,7 @@
                                 android:layout_width="match_parent"
                                 android:layout_height="match_parent"
                                 android:paddingHorizontal="@dimen/iscs_space_2"
+                                android:minHeight="@dimen/common_rv_min_height_sm"
                                 android:scrollbars="horizontal" />
 
                             <TextView
@@ -255,10 +254,9 @@
                     <LinearLayout
                         android:id="@+id/point_info_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -303,6 +301,7 @@
                                 android:id="@+id/point_rv"
                                 android:layout_width="match_parent"
                                 android:layout_height="match_parent"
+                                android:minHeight="@dimen/common_rv_min_height_sm"
                                 android:paddingBottom="@dimen/iscs_space_2" />
 
                             <LinearLayout
@@ -335,10 +334,9 @@
                     <LinearLayout
                         android:id="@+id/member_info_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -413,6 +411,7 @@
                                         android:id="@+id/locker_rv"
                                         android:layout_width="wrap_content"
                                         android:layout_height="match_parent"
+                                        android:minHeight="@dimen/common_rv_min_height_sm"
                                         android:layout_gravity="center" />
                                 </LinearLayout>
 
@@ -443,7 +442,8 @@
                                     <androidx.recyclerview.widget.RecyclerView
                                         android:id="@+id/colocker_rv"
                                         android:layout_width="wrap_content"
-                                        android:layout_height="match_parent" />
+                                        android:layout_height="match_parent"
+                                        android:minHeight="@dimen/common_rv_min_height_sm" />
                                 </LinearLayout>
 
                             </LinearLayout>

+ 20 - 29
iscs_lock/src/main/res/layout/fragment_create_sop.xml

@@ -64,7 +64,7 @@
 
             <LinearLayout
                 android:layout_width="match_parent"
-                android:layout_height="match_parent"
+                android:layout_height="wrap_content"
                 android:orientation="vertical">
 
                 <LinearLayout
@@ -92,7 +92,6 @@
                         android:layout_height="@dimen/divider_line_space"
                         android:background="?attr/colorDivider" />
 
-
                     <com.grkj.ui_base.widget.FormLayout
                         android:layout_width="wrap_content"
                         android:layout_height="match_parent"
@@ -180,17 +179,15 @@
 
                 <LinearLayout
                     android:layout_width="match_parent"
-                    android:layout_height="0dp"
-                    android:layout_weight="1"
+                    android:layout_height="wrap_content"
                     android:orientation="vertical">
 
                     <LinearLayout
                         android:id="@+id/workflow_mode_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -214,9 +211,7 @@
                                 android:id="@+id/workflow_mode_setting_tv"
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
-                                android:layout_marginVertical="5dp"
-                                android:layout_marginLeft="@dimen/iscs_space_2"
-                                android:layout_marginRight="@dimen/iscs_space_2"
+                                android:layout_margin="@dimen/iscs_space_1"
                                 android:background="@drawable/common_btn_secondary"
                                 android:paddingHorizontal="@dimen/iscs_space_4"
                                 android:textColor="?attr/colorTextPrimary"
@@ -239,6 +234,7 @@
                                 android:layout_width="match_parent"
                                 android:layout_height="match_parent"
                                 android:paddingHorizontal="@dimen/iscs_space_2"
+                                android:minHeight="@dimen/common_rv_min_height_sm"
                                 android:scrollbars="horizontal" />
 
                             <TextView
@@ -249,7 +245,7 @@
                                 android:gravity="center"
                                 android:paddingHorizontal="@dimen/iscs_space_4"
                                 android:paddingVertical="@dimen/iscs_space_2"
-                                android:textColor="?attr/colorTextPrimary"
+                                android:textColor="?attr/colorTextSecondary"
                                 android:textSize="@dimen/iscs_text_md"
                                 app:i18nKey='@{"please_select_workflow_mode"}' />
                         </FrameLayout>
@@ -258,10 +254,9 @@
                     <LinearLayout
                         android:id="@+id/point_info_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -285,9 +280,7 @@
                                 android:id="@+id/select_point_tv"
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
-                                android:layout_marginVertical="5dp"
-                                android:layout_marginLeft="@dimen/iscs_space_2"
-                                android:layout_marginRight="@dimen/iscs_space_2"
+                                android:layout_margin="@dimen/iscs_space_1"
                                 android:background="@drawable/common_btn_secondary"
                                 android:paddingHorizontal="@dimen/iscs_space_4"
                                 android:textColor="?attr/colorTextPrimary"
@@ -306,8 +299,9 @@
 
                             <androidx.recyclerview.widget.RecyclerView
                                 android:id="@+id/point_rv"
-                                android:layout_width="match_parent"
+                                android:layout_width="wrap_content"
                                 android:layout_height="match_parent"
+                                android:minHeight="@dimen/common_rv_min_height_sm"
                                 android:paddingBottom="@dimen/iscs_space_2" />
 
                             <LinearLayout
@@ -335,17 +329,14 @@
                                     app:i18nKey='@{"please_must_select_at_least_one_point"}' />
                             </LinearLayout>
                         </FrameLayout>
-
                     </LinearLayout>
 
                     <LinearLayout
                         android:id="@+id/member_info_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
-
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -369,20 +360,18 @@
                                 android:id="@+id/select_member_tv"
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
-                                android:layout_marginVertical="5dp"
-                                android:layout_marginLeft="@dimen/iscs_space_2"
-                                android:layout_marginRight="@dimen/iscs_space_2"
+                                android:layout_margin="@dimen/iscs_space_1"
                                 android:background="@drawable/common_btn_secondary"
                                 android:paddingHorizontal="@dimen/iscs_space_4"
                                 android:textColor="?attr/colorTextPrimary"
                                 android:textSize="@dimen/iscs_text_md"
-                                app:i18nKey='@{"select"}' />
+                                app:i18nKey='@{"select"}'  />
                         </LinearLayout>
 
                         <View
                             android:layout_width="match_parent"
                             android:layout_height="@dimen/divider_line_space"
-                            android:background="?attr/colorBlack" />
+                            android:background="?attr/colorDivider" />
 
                         <FrameLayout
                             android:layout_width="match_parent"
@@ -392,6 +381,7 @@
                                 android:layout_width="match_parent"
                                 android:layout_height="match_parent"
                                 android:gravity="center"
+                                android:minHeight="@dimen/common_rv_min_height_sm"
                                 android:orientation="horizontal">
 
                                 <LinearLayout
@@ -415,7 +405,7 @@
                                     <View
                                         android:layout_width="match_parent"
                                         android:layout_height="@dimen/divider_line_space"
-                                        android:background="?attr/colorBlack" />
+                                        android:background="?attr/colorDivider" />
 
 
                                     <androidx.recyclerview.widget.RecyclerView
@@ -447,12 +437,13 @@
                                     <View
                                         android:layout_width="match_parent"
                                         android:layout_height="@dimen/divider_line_space"
-                                        android:background="?attr/colorBlack" />
+                                        android:background="?attr/colorDivider" />
 
                                     <androidx.recyclerview.widget.RecyclerView
                                         android:id="@+id/colocker_rv"
                                         android:layout_width="wrap_content"
-                                        android:layout_height="match_parent" />
+                                        android:layout_height="match_parent"
+                                        android:minHeight="@dimen/common_rv_min_height_sm" />
                                 </LinearLayout>
 
                             </LinearLayout>
@@ -463,6 +454,7 @@
                                 android:layout_height="match_parent"
                                 android:background="@drawable/card_white_bg"
                                 android:gravity="center"
+                                android:visibility="visible"
                                 android:orientation="vertical">
 
                                 <ImageView
@@ -483,7 +475,6 @@
                             </LinearLayout>
                         </FrameLayout>
                     </LinearLayout>
-
                 </LinearLayout>
             </LinearLayout>
         </androidx.core.widget.NestedScrollView>

+ 10 - 9
iscs_lock/src/main/res/layout/fragment_create_sop_job.xml

@@ -182,17 +182,15 @@
 
                 <LinearLayout
                     android:layout_width="match_parent"
-                    android:layout_height="0dp"
-                    android:layout_weight="1"
+                    android:layout_height="wrap_content"
                     android:orientation="vertical">
 
                     <LinearLayout
                         android:id="@+id/workflow_mode_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -239,6 +237,7 @@
                                 android:layout_width="match_parent"
                                 android:layout_height="match_parent"
                                 android:paddingHorizontal="@dimen/iscs_space_2"
+                                android:minHeight="@dimen/common_rv_min_height_sm"
                                 android:scrollbars="horizontal" />
 
                             <TextView
@@ -258,10 +257,9 @@
                     <LinearLayout
                         android:id="@+id/point_info_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -295,6 +293,7 @@
                                 android:id="@+id/point_rv"
                                 android:layout_width="match_parent"
                                 android:layout_height="match_parent"
+                                android:minHeight="@dimen/common_rv_min_height_sm"
                                 android:paddingBottom="@dimen/iscs_space_2" />
 
                             <LinearLayout
@@ -322,10 +321,9 @@
                     <LinearLayout
                         android:id="@+id/member_info_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -400,6 +398,7 @@
                                         android:id="@+id/locker_rv"
                                         android:layout_width="wrap_content"
                                         android:layout_height="match_parent"
+                                        android:minHeight="@dimen/common_rv_min_height_sm"
                                         android:layout_gravity="center" />
                                 </LinearLayout>
 
@@ -430,7 +429,8 @@
                                     <androidx.recyclerview.widget.RecyclerView
                                         android:id="@+id/colocker_rv"
                                         android:layout_width="wrap_content"
-                                        android:layout_height="match_parent" />
+                                        android:layout_height="match_parent"
+                                        android:minHeight="@dimen/common_rv_min_height_sm" />
                                 </LinearLayout>
 
                             </LinearLayout>
@@ -441,6 +441,7 @@
                                 android:layout_height="match_parent"
                                 android:background="@drawable/card_white_bg"
                                 android:gravity="center"
+                                android:visibility="gone"
                                 android:orientation="vertical">
 
                                 <TextView

+ 9 - 9
iscs_lock/src/main/res/layout/fragment_edit_job.xml

@@ -180,17 +180,15 @@
 
                 <LinearLayout
                     android:layout_width="match_parent"
-                    android:layout_height="0dp"
-                    android:layout_weight="1"
+                    android:layout_height="wrap_content"
                     android:orientation="vertical">
 
                     <LinearLayout
                         android:id="@+id/workflow_mode_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -237,6 +235,7 @@
                                 android:layout_width="match_parent"
                                 android:layout_height="match_parent"
                                 android:paddingHorizontal="@dimen/iscs_space_2"
+                                android:minHeight="@dimen/common_rv_min_height_sm"
                                 android:scrollbars="horizontal" />
                         </FrameLayout>
                     </LinearLayout>
@@ -244,10 +243,9 @@
                     <LinearLayout
                         android:id="@+id/point_info_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -288,6 +286,7 @@
                             android:id="@+id/point_rv"
                             android:layout_width="match_parent"
                             android:layout_height="match_parent"
+                            android:minHeight="@dimen/common_rv_min_height_sm"
                             android:paddingBottom="@dimen/iscs_space_2" />
 
                     </LinearLayout>
@@ -295,10 +294,9 @@
                     <LinearLayout
                         android:id="@+id/member_info_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -370,6 +368,7 @@
                                     android:id="@+id/locker_rv"
                                     android:layout_width="wrap_content"
                                     android:layout_height="match_parent"
+                                    android:minHeight="@dimen/common_rv_min_height_sm"
                                     android:layout_gravity="center" />
                             </LinearLayout>
 
@@ -400,7 +399,8 @@
                                 <androidx.recyclerview.widget.RecyclerView
                                     android:id="@+id/colocker_rv"
                                     android:layout_width="wrap_content"
-                                    android:layout_height="match_parent" />
+                                    android:layout_height="match_parent"
+                                    android:minHeight="@dimen/common_rv_min_height_sm" />
                             </LinearLayout>
 
                         </LinearLayout>

+ 8 - 8
iscs_lock/src/main/res/layout/fragment_edit_sop.xml

@@ -179,17 +179,15 @@
 
                 <LinearLayout
                     android:layout_width="match_parent"
-                    android:layout_height="0dp"
-                    android:layout_weight="1"
+                    android:layout_height="wrap_content"
                     android:orientation="vertical">
 
                     <LinearLayout
                         android:id="@+id/workflow_mode_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -236,6 +234,7 @@
                                 android:layout_width="match_parent"
                                 android:layout_height="match_parent"
                                 android:paddingHorizontal="@dimen/iscs_space_2"
+                                android:minHeight="@dimen/common_rv_min_height_sm"
                                 android:scrollbars="horizontal" />
                         </FrameLayout>
                     </LinearLayout>
@@ -243,10 +242,9 @@
                     <LinearLayout
                         android:id="@+id/point_info_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -288,6 +286,7 @@
                             android:id="@+id/point_rv"
                             android:layout_width="match_parent"
                             android:layout_height="match_parent"
+                            android:minHeight="@dimen/common_rv_min_height_sm"
                             android:paddingBottom="@dimen/iscs_space_2" />
 
                     </LinearLayout>
@@ -295,10 +294,9 @@
                     <LinearLayout
                         android:id="@+id/member_info_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -369,6 +367,7 @@
                                     android:id="@+id/locker_rv"
                                     android:layout_width="wrap_content"
                                     android:layout_height="match_parent"
+                                    android:minHeight="@dimen/common_rv_min_height_sm"
                                     android:layout_gravity="center" />
                             </LinearLayout>
 
@@ -399,6 +398,7 @@
                                 <androidx.recyclerview.widget.RecyclerView
                                     android:id="@+id/colocker_rv"
                                     android:layout_width="wrap_content"
+                                    android:minHeight="@dimen/common_rv_min_height_sm"
                                     android:layout_height="match_parent" />
                             </LinearLayout>
 

+ 7 - 8
iscs_lock/src/main/res/layout/fragment_edit_sop_job.xml

@@ -183,17 +183,15 @@
 
                 <LinearLayout
                     android:layout_width="match_parent"
-                    android:layout_height="0dp"
-                    android:layout_weight="1"
+                    android:layout_height="wrap_content"
                     android:orientation="vertical">
 
                     <LinearLayout
                         android:id="@+id/workflow_mode_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -240,6 +238,7 @@
                                 android:layout_width="match_parent"
                                 android:layout_height="match_parent"
                                 android:paddingHorizontal="@dimen/iscs_space_2"
+                                android:minHeight="@dimen/common_rv_min_height_sm"
                                 android:scrollbars="horizontal" />
                         </FrameLayout>
                     </LinearLayout>
@@ -247,10 +246,9 @@
                     <LinearLayout
                         android:id="@+id/point_info_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -287,10 +285,9 @@
                     <LinearLayout
                         android:id="@+id/member_info_layout"
                         android:layout_width="match_parent"
-                        android:layout_height="0dp"
+                        android:layout_height="wrap_content"
                         android:layout_marginHorizontal="@dimen/iscs_space_4"
                         android:layout_marginVertical="@dimen/iscs_space_2"
-                        android:layout_weight="1"
                         android:background="@drawable/home_card_bg"
                         android:gravity="center_vertical"
                         android:orientation="vertical">
@@ -361,6 +358,7 @@
                                     android:id="@+id/locker_rv"
                                     android:layout_width="wrap_content"
                                     android:layout_height="match_parent"
+                                    android:minHeight="@dimen/common_rv_min_height_sm"
                                     android:layout_gravity="center" />
                             </LinearLayout>
 
@@ -391,6 +389,7 @@
                                 <androidx.recyclerview.widget.RecyclerView
                                     android:id="@+id/colocker_rv"
                                     android:layout_width="wrap_content"
+                                    android:minHeight="@dimen/common_rv_min_height_sm"
                                     android:layout_height="match_parent" />
                             </LinearLayout>
 

+ 2 - 1
iscs_lock/src/main/res/layout/item_locker_group.xml

@@ -4,7 +4,7 @@
 
     <FrameLayout
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content">
+        android:layout_height="match_parent">
 
         <LinearLayout
             android:id="@+id/group_layout"
@@ -23,6 +23,7 @@
                 android:layout_gravity="center"
                 android:gravity="center"
                 android:minWidth="@dimen/item_locker_group_min_width"
+                android:background="@drawable/bg_item_group_title_layout"
                 android:orientation="horizontal"
                 android:paddingVertical="@dimen/iscs_space_1">
 

+ 2 - 2
iscs_lock/src/main/res/layout/item_select_member.xml

@@ -4,8 +4,8 @@
     <LinearLayout
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
-        android:layout_marginLeft="@dimen/iscs_space_2"
-        android:layout_marginTop="@dimen/iscs_space_2"
+        android:layout_marginLeft="@dimen/iscs_space_1"
+        android:layout_marginTop="@dimen/iscs_space_1"
         android:gravity="center"
         android:orientation="vertical">
 

+ 2 - 1
iscs_lock/src/main/res/layout/item_select_point.xml

@@ -3,9 +3,10 @@
     xmlns:tools="http://schemas.android.com/tools">
 
     <LinearLayout
-        android:layout_width="match_parent"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginTop="@dimen/iscs_space_1"
+        android:layout_marginLeft="@dimen/iscs_space_1"
         android:gravity="center"
         android:orientation="vertical">
 

+ 2 - 1
iscs_lock/src/main/res/layout/item_user_manage_user.xml

@@ -48,6 +48,8 @@
             android:layout_width="0dp"
             android:layout_height="wrap_content"
             android:layout_weight="1"
+            android:layout_gravity="center_vertical"
+            android:paddingVertical="@dimen/iscs_space_1"
             android:gravity="center_vertical"
             app:alignItems="center"
             app:dividerDrawableHorizontal="@drawable/common_divider_small_space_horizontal"
@@ -88,7 +90,6 @@
                 android:gravity="center"
                 android:singleLine="true"
                 android:paddingHorizontal="@dimen/common_spacing"
-                android:paddingVertical="@dimen/iscs_space_1"
                 android:text="@string/register_face"
                 android:textColor="?attr/colorTextClick"
                 android:textSize="@dimen/iscs_text_md" />

+ 2 - 0
iscs_lock/src/main/res/values/dimens.xml

@@ -70,6 +70,8 @@
     <dimen name="icon_size">30dp</dimen>
     <dimen name="selected_point_info_layout_width">400dp</dimen>
     <dimen name="common_rv_min_height">200dp</dimen>
+    <dimen name="common_rv_min_height_sm">140dp</dimen>
+    <dimen name="common_rv_min_width_sm">140dp</dimen>
     <dimen name="item_locker_group_min_width">100dp</dimen>
     <dimen name="locker_item_min_height">50dp</dimen>
     <dimen name="common_badge_icon_size">15dp</dimen>

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

@@ -759,7 +759,7 @@ object BleBusinessManager {
                         // 上报钥匙归还
                         LogicManager.jobTicketLogic.updateKeyReturn(
                             data.taskCode?.toLong()!!,
-                            keyNfc!!,
+                            keyNfc.toString(),
                             groupId,
                             SIKCore.getApplication().serialNo()
                         ) { isSuccess, msg, code ->

+ 16 - 1
ui-base/src/main/java/com/grkj/ui_base/business/HardwareBusinessManager.kt

@@ -16,6 +16,7 @@ import com.grkj.data.hardware.modbus.DeviceConst
 import com.grkj.data.hardware.modbus.DockBean
 import com.grkj.data.hardware.modbus.ModBusController
 import com.grkj.data.entity.local.DeviceTakeUpdate
+import com.grkj.data.hardware.can.HandlerGate
 import com.grkj.data.net.req.LockTakeUpdateReq
 import com.grkj.data.utils.event.LoadingEvent
 import com.grkj.shared.utils.extension.removeLeadingZeros
@@ -146,6 +147,9 @@ object HardwareBusinessManager {
         return mDeviceTakeList.any { it.deviceType == deviceType && it.ticketId == ticketId }
     }
 
+    private fun devKey(nodeId: Int, deviceType: Int, id: Int) =
+        "$nodeId-$deviceType-$id"
+
     /**
      * 处理设备取出
      */
@@ -174,7 +178,18 @@ object HardwareBusinessManager {
                                 removeDeviceTake(DeviceConst.DEVICE_TYPE_KEY, info.nfc)
                                 logger.info("设备取出信息:${mDeviceTakeList}")
                                 HardwareMode.getCurrentHardwareMode().getKeyMacByRfid(info.nfc)
-                                    ?.let { BleSendDispatcher.scheduleDisconnect(it) }
+                                    ?.let {
+                                        HardwareMode.getCurrentHardwareMode().getKeyBeanByMac(it)?.let {
+                                            HandlerGate.leave(
+                                                devKey(
+                                                    it.addr,
+                                                    it.type,
+                                                    it.idx
+                                                )
+                                            )
+                                        }
+                                        BleSendDispatcher.scheduleDisconnect(it)
+                                    }
                             } else {
                                 logger.info("更新钥匙取出异常")
                             }

+ 1 - 1
ui-base/src/main/res/values-zh/strings.xml

@@ -295,7 +295,7 @@
     <string name="hardware_mode">硬件模式(模式修改保存需要重启应用)</string>
     <string name="init_hardware_mode">硬件模式</string>
     <string name="hardware_unknown">未知</string>
-    <string name="has_job_in_progress">存在正在进行中的作业</string>
+    <string name="has_job_in_progress">只能删除未开始和已取消的作业</string>
     <string name="has_locked">已上锁</string>
     <string name="has_user_in_progress_job">有用户在进行的作业中</string>
     <string name="header_failed">刷新失败</string>

+ 1 - 1
ui-base/src/main/res/values/strings.xml

@@ -295,7 +295,7 @@
     <string name="hardware_mode">硬件模式(模式修改保存需要重启应用)</string>
     <string name="init_hardware_mode">硬件模式</string>
     <string name="hardware_unknown">未知</string>
-    <string name="has_job_in_progress">存在正在进行中的作业</string>
+    <string name="has_job_in_progress">只能删除未开始和已取消的作业</string>
     <string name="has_locked">已上锁</string>
     <string name="has_user_in_progress_job">有用户在进行的作业中</string>
     <string name="header_failed">刷新失败</string>