浏览代码

fix(作业执行)
- 点击抖动修改

周文健 3 月之前
父节点
当前提交
3fc96b9c52
共有 44 个文件被更改,包括 357 次插入291 次删除
  1. 二进制
      app/src/main/assets/data.db
  2. 2 1
      app/src/main/java/com/grkj/iscs/features/login/activity/LoginActivity.kt
  3. 5 4
      app/src/main/java/com/grkj/iscs/features/login/dialog/LoginDialog.kt
  4. 2 1
      app/src/main/java/com/grkj/iscs/features/main/activity/MainActivity.kt
  5. 7 6
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddPointDialog.kt
  6. 7 6
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddRoleDialog.kt
  7. 7 6
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddUserDialog.kt
  8. 4 3
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddWorkstationDialog.kt
  9. 6 5
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterPointDialog.kt
  10. 4 3
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterRoleDialog.kt
  11. 4 3
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterUserDialog.kt
  12. 8 7
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdatePointDialog.kt
  13. 7 6
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateRoleDialog.kt
  14. 8 7
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateUserDialog.kt
  15. 7 6
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/AddCardDialog.kt
  16. 7 6
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/AddKeyDialog.kt
  17. 6 5
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/AddLockDialog.kt
  18. 6 5
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/AddRfidTokenDialog.kt
  19. 5 4
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/FilterCardDialog.kt
  20. 4 3
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/FilterKeyDialog.kt
  21. 4 3
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/FilterLockDialog.kt
  22. 4 3
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/FilterRfidTokenDialog.kt
  23. 3 2
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/SlotsExceptionReportDialog.kt
  24. 7 6
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/UpdateCardDialog.kt
  25. 7 6
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/UpdateKeyDialog.kt
  26. 6 5
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/UpdateLockDialog.kt
  27. 6 5
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/UpdateRfidTokenDialog.kt
  28. 86 91
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/PointMangeFragment.kt
  29. 2 2
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/RoleManageFragment.kt
  30. 1 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/UserManageFragment.kt
  31. 1 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/WorkstationManageFragment.kt
  32. 38 42
      app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/CardManageFragment.kt
  33. 1 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/KeyManageFragment.kt
  34. 1 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/LockManageFragment.kt
  35. 2 2
      app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/RfidTokenManageFragment.kt
  36. 1 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/home/HomeFragment.kt
  37. 2 2
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopFragment.kt
  38. 2 2
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditJobFragment.kt
  39. 35 11
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/JobExecuteFragment.kt
  40. 28 8
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/MyTodoListFragment.kt
  41. 2 1
      app/src/main/java/com/grkj/iscs/features/main/fragment/user_info/UserInfoHomeFragment.kt
  42. 9 6
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/hardware_manage/CardManageViewModel.kt
  43. 1 1
      app/src/main/res/layout-land/fragment_workflow_setting.xml
  44. 2 1
      ui-base/src/main/java/com/grkj/ui_base/widget/CustomNavBar.kt

二进制
app/src/main/assets/data.db


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

@@ -37,6 +37,7 @@ import com.grkj.ui_base.utils.event.RFIDCardReadEvent
 import com.grkj.ui_base.utils.extension.tip
 import com.grkj.ui_base.utils.fingerprint.FingerprintUtil
 import com.kongzue.dialogx.dialogs.PopTip
+import com.sik.sikcore.extension.setDebouncedClickListener
 import com.sik.sikimage.ImageConvertUtils
 import dagger.hilt.android.AndroidEntryPoint
 
@@ -88,7 +89,7 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
         itemBinding.loginTipV.isVisible == item.needTip
         itemBinding.loginMethodTv.text = item.menuText
         itemBinding.loginMethodIv.setBackgroundResource(item.menuIconId)
-        holder.itemView.setOnClickListener {
+        holder.itemView.setDebouncedClickListener {
             LoginDialog.show(this@LoginActivity, viewModel, item.loginType) {
                 LoadingEvent.sendLoadingEvent()
                 when (it) {

+ 5 - 4
app/src/main/java/com/grkj/iscs/features/login/dialog/LoginDialog.kt

@@ -19,6 +19,7 @@ import com.kongzue.dialogx.interfaces.DialogLifecycleCallback
 import com.kongzue.dialogx.interfaces.OnBindView
 import com.sik.sikandroid.activity.ActivityTracker
 import com.sik.sikcore.SIKCore
+import com.sik.sikcore.extension.setDebouncedClickListener
 import com.sik.sikcore.thread.ThreadUtils
 import com.sik.sikimage.ImageConvertUtils
 
@@ -60,14 +61,14 @@ class LoginDialog(
                 super.onDismiss(dialog)
             }
         })
-        mBinding.tvLogin.setOnClickListener {
+        mBinding.tvLogin.setDebouncedClickListener {
             if (mBinding.etAccount.text.toString().isEmpty()) {
                 PopTip.tip(CommonUtils.getStr(com.grkj.ui_base.R.string.please_input_account))
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             if (mBinding.etPassword.text.toString().isEmpty()) {
                 PopTip.tip(CommonUtils.getStr(com.grkj.ui_base.R.string.please_input_password))
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             LoadingEvent.sendLoadingEvent(
                 CommonUtils.getStr(com.grkj.ui_base.R.string.doing_login),
@@ -99,7 +100,7 @@ class LoginDialog(
                 super.onDismiss(dialog)
             }
         })
-        mBinding.tvCancel.setOnClickListener { customDialog.dismiss() }
+        mBinding.tvCancel.setDebouncedClickListener { customDialog.dismiss() }
         if (mLoginType == 3) {
             mBinding.llAccountContainer.visibility = View.VISIBLE
             mBinding.llEasyContainer.visibility = View.GONE

+ 2 - 1
app/src/main/java/com/grkj/iscs/features/main/activity/MainActivity.kt

@@ -26,6 +26,7 @@ import com.grkj.shared.utils.extension.toHexStrings
 import com.grkj.ui_base.utils.event.FlashTipEvent
 import com.grkj.ui_base.utils.event.RFIDCardReadEvent
 import com.sik.sikcore.extension.file
+import com.sik.sikcore.extension.setDebouncedClickListener
 import com.sik.sikcore.extension.toJson
 import com.sik.sikimage.ImageConvertUtils
 import dagger.hilt.android.AndroidEntryPoint
@@ -123,7 +124,7 @@ class MainActivity() : BaseActivity<ActivityMainBinding>() {
                 binding.navBar.selectedItemId = firstId
             }
         }
-        binding.userInfoLayout.setOnClickListener {
+        binding.userInfoLayout.setDebouncedClickListener {
             if (MainDomainData.permissions.contains(RoleFunctionalPermissionsEnum.USER_INFO_HOME.functionalPermission)) {
                 binding.navBar.isVisible = true
                 if (navController.graph.id == R.navigation.nav_user_info) {

+ 7 - 6
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddPointDialog.kt

@@ -11,6 +11,7 @@ import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 添加隔离点对话框,基于 DialogX
@@ -32,7 +33,7 @@ class AddPointDialog(
         dialog?.isCancelable = false
         dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-        binding.powerTypeTv.setOnClickListener {
+        binding.powerTypeTv.setDebouncedClickListener {
             val list = IsolationPointPowerTypeEnum.values().map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataId = 0L,
@@ -47,14 +48,14 @@ class AddPointDialog(
             }
         }
 
-        binding.workstationTv.setOnClickListener {
+        binding.workstationTv.setDebouncedClickListener {
             TextDropDownDialog.showSingle(workstationData,binding.workstationTv) { item ->
                 binding.workstationTv.text = item.getShowText()
                 binding.workstationTv.tag = item.getId()
             }
         }
 
-        binding.rfidTagTv.setOnClickListener {
+        binding.rfidTagTv.setDebouncedClickListener {
             TextDropDownDialog.showSingle(rfidTokenData,binding.rfidTagTv) { item ->
                 binding.rfidTagTv.text = item.getShowText()
                 binding.rfidTagTv.tag = item.getId()
@@ -62,11 +63,11 @@ class AddPointDialog(
         }
 
         // 关闭
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             if (checkData()) {
                 val vo = AddPointManageVo(
                     binding.pointNameTv.text.toString(),

+ 7 - 6
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddRoleDialog.kt

@@ -16,6 +16,7 @@ import me.jessyan.autosize.utils.AutoSizeUtils
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.PopTip
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 添加角色对话框,基于 DialogX
@@ -40,18 +41,18 @@ class AddRoleDialog(
         dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
         // 关闭
-        binding.closeIv.setOnClickListener {
+        binding.closeIv.setDebouncedClickListener {
             dialog?.dismiss()
         }
         // 确认
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             if (binding.roleNameEt.text.isNullOrBlank()) {
                 PopTip.build().tip(R.string.please_input_role_name)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             if (binding.roleKeyEt.text.isNullOrBlank()) {
                 PopTip.build().tip(R.string.please_input_permission_characters)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             val data = AddRoleDataEntity().apply {
                 roleName = binding.roleNameEt.text.toString()
@@ -66,7 +67,7 @@ class AddRoleDialog(
             onConfirm(data, dialog)
         }
         // 取消
-        binding.cancel.setOnClickListener {
+        binding.cancel.setDebouncedClickListener {
             dialog?.dismiss()
         }
 
@@ -79,7 +80,7 @@ class AddRoleDialog(
                 // 缩进
                 itemBinding.rootLayout.setPadding(indentPx * item.level, 0, 0, 0)
                 // 展开/收起
-                itemBinding.rootLayout.setOnClickListener {
+                itemBinding.rootLayout.setDebouncedClickListener {
                     if (item.itemExpand) collapse() else expand()
                     itemBinding.arrowIv.rotation = if (item.itemExpand) 90f else 0f
                 }

+ 7 - 6
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddUserDialog.kt

@@ -12,6 +12,7 @@ import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 新增用户对话框,基于 DialogX,支持多选角色和岗位
@@ -42,14 +43,14 @@ class AddUserDialog(
         binding.cardcodeEt.isEnabled = false
 
         // 角色多选
-        binding.roleTv.setOnClickListener {
+        binding.roleTv.setDebouncedClickListener {
             TextDropDownDialog.showMulti(roleData, binding.roleTv) { list ->
                 selectedRoles = list.orEmpty()
                 binding.roleTv.text = selectedRoles.joinToString(",") { it.getShowText() }
             }
         }
         // 岗位多选
-        binding.workstationNameTv.setOnClickListener {
+        binding.workstationNameTv.setDebouncedClickListener {
             TextDropDownDialog.showMulti(workstationData, binding.workstationNameTv) { list ->
                 selectedWorkstations = list.orEmpty()
                 binding.workstationNameTv.text =
@@ -58,12 +59,12 @@ class AddUserDialog(
         }
 
         // 取消/关闭
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认
-        binding.confirm.setOnClickListener {
-            if (!checkData()) return@setOnClickListener
+        binding.confirm.setDebouncedClickListener {
+            if (!checkData()) return@setDebouncedClickListener
             val vo = AddUserDataVo(
                 binding.usernameEt.text.trim().toString(),
                 binding.nicknameEt.text.trim().toString(),

+ 4 - 3
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddWorkstationDialog.kt

@@ -8,6 +8,7 @@ import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 新增区域对话框,基于 DialogX
@@ -25,9 +26,9 @@ class AddWorkstationDialog(
         dialog?.isCancelable = false
         dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
-        binding.confirm.setOnClickListener {
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
+        binding.confirm.setDebouncedClickListener {
             val name = binding.workstationNameEt.text.trim().toString()
             if (name.isEmpty()) {
                 PopTip.build().tip(R.string.please_input_workstation_name)

+ 6 - 5
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterPointDialog.kt

@@ -11,6 +11,7 @@ import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 筛选隔离点对话框,基于 DialogX
@@ -32,7 +33,7 @@ class FilterPointDialog(
         dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
         // 电源类型单选
-        binding.powerTypeTv.setOnClickListener {
+        binding.powerTypeTv.setDebouncedClickListener {
             val list = IsolationPointPowerTypeEnum.values().map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataId = 0L,
@@ -48,7 +49,7 @@ class FilterPointDialog(
         }
 
         // 工作站单选
-        binding.workstationTv.setOnClickListener {
+        binding.workstationTv.setDebouncedClickListener {
             TextDropDownDialog.showSingle(workstationData,binding.workstationTv) { item ->
                 binding.workstationTv.text = item.getShowText()
                 binding.workstationTv.tag = item.getId()
@@ -56,11 +57,11 @@ class FilterPointDialog(
         }
 
         // 关闭
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             // 构建筛选条件
             val filter = PointManageFilterVo(
                 binding.pointNameTv.text.toString(),

+ 4 - 3
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterRoleDialog.kt

@@ -8,6 +8,7 @@ import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 筛选角色对话框,基于 DialogX
@@ -26,11 +27,11 @@ class FilterRoleDialog(
         dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
         // 关闭/取消
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认筛选
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             val name = binding.roleNameTv.text.trim().toString()
             val key = binding.roleKeyEt.text.trim().toString()
             val status = when (binding.statusRg.checkedRadioButtonId) {

+ 4 - 3
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterUserDialog.kt

@@ -9,6 +9,7 @@ import com.grkj.ui_base.config.ISCSConfig
 import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 筛选用户对话框,基于 DialogX
@@ -30,11 +31,11 @@ class FilterUserDialog(
         binding.workstationLayout.isVisible = ISCSConfig.isWorkstationOn
 
         // 关闭/取消
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             val name = binding.nicknameEt.text.trim().toString()
             val card = binding.cardcodeEt.text.trim().toString()
             val station = binding.workstationEt.text.trim().toString()

+ 8 - 7
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdatePointDialog.kt

@@ -12,6 +12,7 @@ import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 修改隔离点对话框,基于 DialogX
@@ -61,21 +62,21 @@ class UpdatePointDialog(
         }
 
         // 电源类型
-        binding.powerTypeTv.setOnClickListener {
+        binding.powerTypeTv.setDebouncedClickListener {
             TextDropDownDialog.showSingle(powerTypeList,binding.powerTypeTv) { item ->
                 binding.powerTypeTv.text = item.getShowText()
                 binding.powerTypeTv.tag = item.getTag()
             }
         }
         // 工作站
-        binding.workstationTv.setOnClickListener {
+        binding.workstationTv.setDebouncedClickListener {
             TextDropDownDialog.showSingle(workstationData,binding.workstationTv) { item ->
                 binding.workstationTv.text = item.getShowText()
                 binding.workstationTv.tag = item.getId()
             }
         }
         // RFID
-        binding.rfidTagTv.setOnClickListener {
+        binding.rfidTagTv.setDebouncedClickListener {
             TextDropDownDialog.showSingle(rfidData,binding.rfidTagTv) { item ->
                 binding.rfidTagTv.text = item.getShowText()
                 binding.rfidTagTv.tag = item.getId()
@@ -83,12 +84,12 @@ class UpdatePointDialog(
         }
 
         // 关闭/取消
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认
-        binding.confirm.setOnClickListener {
-            if (!validate()) return@setOnClickListener
+        binding.confirm.setDebouncedClickListener {
+            if (!validate()) return@setDebouncedClickListener
             val updateVo = UpdatePointManageVo(
                 pointVo.pointId,
                 binding.pointNameTv.text.toString(),

+ 7 - 6
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateRoleDialog.kt

@@ -14,6 +14,7 @@ import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 import me.jessyan.autosize.utils.AutoSizeUtils
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
@@ -59,7 +60,7 @@ class UpdateRoleDialog(
                 itemBinding.rootLayout.setPadding(indentPx * item.level, 0, 0, 0)
                 // 展开收起
                 itemBinding.arrowIv.rotation = if (item.itemExpand) 90f else 0f
-                itemBinding.rootLayout.setOnClickListener {
+                itemBinding.rootLayout.setDebouncedClickListener {
                     if (item.itemExpand) collapse() else expand()
                     itemBinding.arrowIv.rotation = if (item.itemExpand) 90f else 0f
                 }
@@ -88,18 +89,18 @@ class UpdateRoleDialog(
         }
 
         // 取消
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             if (binding.roleNameEt.text.isNullOrBlank()) {
                 PopTip.build().tip(R.string.please_input_role_name)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             if (binding.roleKeyEt.text.isNullOrBlank()) {
                 PopTip.build().tip(R.string.please_input_permission_characters)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             updateEntity.roleName = binding.roleNameEt.text.toString()
             updateEntity.roleKeys = binding.roleKeyEt.text.toString()

+ 8 - 7
app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateUserDialog.kt

@@ -13,6 +13,7 @@ import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 更新用户对话框,基于 DialogX,支持多选角色和岗位
@@ -73,7 +74,7 @@ class UpdateUserDialog(
         }
 
         // 工作站多选
-        binding.workstationNameTv.setOnClickListener {
+        binding.workstationNameTv.setDebouncedClickListener {
             TextDropDownDialog.showMulti(workstationData.apply {
                 forEach {
                     it.setSelected(selectedWorkstations.map { it.getShowText() }
@@ -87,19 +88,19 @@ class UpdateUserDialog(
         }
 
         // 取消/关闭
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             val username = binding.usernameEt.text.trim().toString()
             val name = binding.nicknameEt.text.trim().toString()
             val card = binding.cardcodeEt.text.trim().toString()
-            if (name.isBlank()) return@setOnClickListener PopTip.build()
+            if (name.isBlank()) return@setDebouncedClickListener PopTip.build()
                 .tip(R.string.please_input_nickname)
-            if (selectedRoles.isEmpty()) return@setOnClickListener PopTip.build()
+            if (selectedRoles.isEmpty()) return@setDebouncedClickListener PopTip.build()
                 .tip(R.string.please_select_role)
-            if (ISCSConfig.isWorkstationOn && selectedWorkstations.isEmpty()) return@setOnClickListener PopTip.build()
+            if (ISCSConfig.isWorkstationOn && selectedWorkstations.isEmpty()) return@setDebouncedClickListener PopTip.build()
                 .tip(R.string.please_select_area)
             val isActive = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
             val updateVo = UpdateUserDataVo(

+ 7 - 6
app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/AddCardDialog.kt

@@ -14,6 +14,7 @@ import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.DialogLifecycleCallback
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
@@ -47,7 +48,7 @@ class AddCardDialog(
             }
         })
         // 用户单选
-        binding.usernameTv.setOnClickListener {
+        binding.usernameTv.setDebouncedClickListener {
             TextDropDownDialog.showSingle(userData,binding.usernameTv) { item ->
                 selectedUser = item
                 binding.usernameTv.text = item.getShowText()
@@ -55,20 +56,20 @@ class AddCardDialog(
         }
 
         // 取消/关闭
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             val nfc = binding.cardNfcEt.text.trim().toString()
             val statusChecked = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
             if (nfc.isEmpty()) {
                 PopTip.build().tip(R.string.please_input_card_nfc)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             if (selectedUser == null) {
                 PopTip.build().tip(R.string.please_select_card_username)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             // 构造并回调
             val vo = AddCardDataVo(

+ 7 - 6
app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/AddKeyDialog.kt

@@ -9,6 +9,7 @@ import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 新增钥匙对话框,基于 DialogX
@@ -27,11 +28,11 @@ class AddKeyDialog(
         dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
         // 取消/关闭
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             val code = binding.keyCodeEt.text.trim().toString()
             val nfc = binding.keyNfcEt.text.trim().toString()
             val mac = binding.keyMacEt.text.trim().toString()
@@ -39,15 +40,15 @@ class AddKeyDialog(
 
             if (code.isEmpty()) {
                 PopTip.build().tip(R.string.please_input_key_name)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             if (nfc.isEmpty()) {
                 PopTip.build().tip(R.string.please_input_key_nfc)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             if (mac.isEmpty()) {
                 PopTip.build().tip(R.string.please_input_key_mac)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             // 构建并回调(位置参数方式)
             val vo = AddKeyDataVo(

+ 6 - 5
app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/AddLockDialog.kt

@@ -9,6 +9,7 @@ import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 新增挂锁对话框,基于 DialogX
@@ -27,11 +28,11 @@ class AddLockDialog(
         dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
         // 取消/关闭
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             val code = binding.lockCodeEt.text.trim().toString()
             val nfc = binding.lockNfcEt.text.trim().toString()
             val statusChecked = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
@@ -39,11 +40,11 @@ class AddLockDialog(
 
             if (code.isEmpty()) {
                 PopTip.build().tip(R.string.please_input_lock_code)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             if (nfc.isEmpty()) {
                 PopTip.build().tip(R.string.please_input_lock_nfc)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             // 构建并回调(位置参数方式,与VO构造器一致)
             val vo = AddLockDataVo(

+ 6 - 5
app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/AddRfidTokenDialog.kt

@@ -13,6 +13,7 @@ import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.DialogLifecycleCallback
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
@@ -44,10 +45,10 @@ class AddRfidTokenDialog(
             }
         })
         // 取消/关闭
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
         // 确认
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             val code = binding.rfidCodeEt.text.trim().toString()
             val rfid = binding.rfidEt.text.trim().toString()
             val statusChecked = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
@@ -55,11 +56,11 @@ class AddRfidTokenDialog(
 
             if (code.isEmpty()) {
                 PopTip.build().tip(R.string.please_input_rfid_code)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             if (rfid.isEmpty()) {
                 PopTip.build().tip(R.string.please_input_rfid)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             // 构造并回调(位置参数方式)
             val vo = AddRfidTokenDataVo(

+ 5 - 4
app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/FilterCardDialog.kt

@@ -9,6 +9,7 @@ import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 筛选卡片对话框,基于 DialogX,支持根据用户名进行筛选
@@ -30,7 +31,7 @@ class FilterCardDialog(
         binding.usernameTv.isVisible = userData.isNotEmpty()
 
         // 用户选择
-        binding.usernameTv.setOnClickListener {
+        binding.usernameTv.setDebouncedClickListener {
             TextDropDownDialog.showSingle(userData,binding.usernameTv) { item ->
                 selectedUser = item
                 binding.usernameTv.text = item.getShowText()
@@ -38,11 +39,11 @@ class FilterCardDialog(
         }
 
         // 取消/关闭
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认筛选
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             val nfc = binding.cardNfcEt.text.trim().toString().takeIf { it.isNotBlank() }
             val username = selectedUser?.getShowText().orEmpty()
             val status = when (binding.statusRg.checkedRadioButtonId) {

+ 4 - 3
app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/FilterKeyDialog.kt

@@ -7,6 +7,7 @@ import com.grkj.iscs.databinding.DialogFilterKeyBinding
 import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 筛选钥匙对话框,基于 DialogX
@@ -25,11 +26,11 @@ class FilterKeyDialog(
         dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
         // 取消/关闭
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认筛选
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             val code = binding.keyCodeEt.text.trim().toString()
             val nfc = binding.keyNfcEt.text.trim().toString()
             val mac = binding.keyMacEt.text.trim().toString()

+ 4 - 3
app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/FilterLockDialog.kt

@@ -7,6 +7,7 @@ import com.grkj.iscs.databinding.DialogFilterLockBinding
 import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 筛选挂锁对话框,基于 DialogX
@@ -24,11 +25,11 @@ class FilterLockDialog(
         dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
         // 关闭/取消
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认筛选
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             val code = binding.lockCodeEt.text.trim().toString().takeIf { it.isNotBlank() }
             val nfc = binding.lockNfcEt.text.trim().toString().takeIf { it.isNotBlank() }
             val statusChecked = when (binding.statusRg.checkedRadioButtonId) {

+ 4 - 3
app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/FilterRfidTokenDialog.kt

@@ -7,6 +7,7 @@ import com.grkj.iscs.databinding.DialogFilterRfidTokenBinding
 import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 筛选 RFID 标签对话框,基于 DialogX
@@ -24,11 +25,11 @@ class FilterRfidTokenDialog(
         dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
         // 取消/关闭
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认筛选
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             val code = binding.rfidCodeEt.text.trim().toString().takeIf { it.isNotBlank() }
             val rfid = binding.rfidEt.text.trim().toString().takeIf { it.isNotBlank() }
             val statusChecked = when (binding.statusRg.checkedRadioButtonId) {

+ 3 - 2
app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/SlotsExceptionReportDialog.kt

@@ -8,6 +8,7 @@ import com.grkj.ui_base.utils.CommonUtils
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 仓位异常上报
@@ -29,11 +30,11 @@ class SlotsExceptionReportDialog(
             com.grkj.ui_base.R.string.hardware_info,
             "${getDeviceTypeStr(slotType)},${context.getString(com.grkj.ui_base.R.string.number)} 行${row},列${col}"
         )
-        binding.confirmBtn.setOnClickListener {
+        binding.confirmBtn.setDebouncedClickListener {
             val exceptionReason = binding.exceptionEt.text?.toString()
             if (exceptionReason?.isEmpty() == true) {
                 PopTip.tip(com.grkj.ui_base.R.string.please_input_exception_reason)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             onConfirm(exceptionReason!!)
             dialog.dismiss()

+ 7 - 6
app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/UpdateCardDialog.kt

@@ -16,6 +16,7 @@ import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 
@@ -50,7 +51,7 @@ class UpdateCardDialog(
         binding.remarkEt.setText(card.exRemark)
 
         // 用户选择
-        binding.usernameTv.setOnClickListener {
+        binding.usernameTv.setDebouncedClickListener {
             TextDropDownDialog.showSingle(userData,binding.usernameTv) { item ->
                 selectedUser = item
                 binding.usernameTv.text = item.getShowText()
@@ -58,14 +59,14 @@ class UpdateCardDialog(
         }
 
         // 取消/关闭
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             val nfc = binding.cardNfcEt.text.trim().toString()
-            if (nfc.isBlank()) return@setOnClickListener PopTip.build().tip(R.string.please_input_card_nfc)
-            val user = selectedUser ?: return@setOnClickListener PopTip.build().tip(R.string.please_select_card_username)
+            if (nfc.isBlank()) return@setDebouncedClickListener PopTip.build().tip(R.string.please_input_card_nfc)
+            val user = selectedUser ?: return@setDebouncedClickListener PopTip.build().tip(R.string.please_select_card_username)
             val statusChecked = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
             val vo = UpdateCardDataVo(
                 card.cardId,

+ 7 - 6
app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/UpdateKeyDialog.kt

@@ -11,6 +11,7 @@ import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 更新钥匙对话框,基于 DialogX
@@ -40,11 +41,11 @@ class UpdateKeyDialog(
         binding.deactivateRb.isChecked = !binding.activateRb.isChecked
 
         // 取消/关闭
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             val code = binding.keyCodeEt.text.trim().toString()
             val nfc = binding.keyNfcEt.text.trim().toString()
             val mac = binding.keyMacEt.text.trim().toString()
@@ -52,15 +53,15 @@ class UpdateKeyDialog(
 
             if (code.isEmpty()) {
                 PopTip.build().tip(R.string.please_input_key_name)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             if (nfc.isEmpty()) {
                 PopTip.build().tip(R.string.please_input_key_nfc)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             if (mac.isEmpty()) {
                 PopTip.build().tip(R.string.please_input_key_mac)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             // 构建 DTO 并回调
             val vo = UpdateKeyDataVo(

+ 6 - 5
app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/UpdateLockDialog.kt

@@ -11,6 +11,7 @@ import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 更新挂锁对话框,基于 DialogX
@@ -39,22 +40,22 @@ class UpdateLockDialog(
         binding.deactivateRb.isChecked = !binding.activateRb.isChecked
 
         // 取消/关闭
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             val code = binding.lockCodeEt.text.trim().toString()
             val nfc = binding.lockNfcEt.text.trim().toString()
             val statusChecked = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
 
             if (code.isBlank()) {
                 PopTip.build().tip(R.string.please_input_lock_code)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             if (nfc.isBlank()) {
                 PopTip.build().tip(R.string.please_input_lock_nfc)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             // 构造并回调
             val vo = UpdateLockDataVo(

+ 6 - 5
app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/UpdateRfidTokenDialog.kt

@@ -14,6 +14,7 @@ import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
+import com.sik.sikcore.extension.setDebouncedClickListener
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 
@@ -46,22 +47,22 @@ class UpdateRfidTokenDialog(
         }
 
         // 取消/关闭
-        binding.cancel.setOnClickListener { dialog?.dismiss() }
-        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setDebouncedClickListener { dialog?.dismiss() }
+        binding.closeIv.setDebouncedClickListener { dialog?.dismiss() }
 
         // 确认
-        binding.confirm.setOnClickListener {
+        binding.confirm.setDebouncedClickListener {
             val code = binding.rfidCodeEt.text.trim().toString()
             val rfid = binding.rfidEt.text.trim().toString()
             val statusChecked = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
 
             if (code.isEmpty()) {
                 PopTip.build().tip(R.string.please_input_rfid_code)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             if (rfid.isEmpty()) {
                 PopTip.build().tip(R.string.please_input_rfid)
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             // 构造 DTO 并回调
             val vo = UpdateRfidTokenDataVo(

+ 86 - 91
app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/PointMangeFragment.kt

@@ -48,62 +48,58 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
             getPointData(false)
         }
         binding.addPoint.setDebouncedClickListener {
-            viewModel.initDialogData().observe(this) {
-                AddPointDialog.show(viewModel.workstationData.map {
-                    TextDropDownDialog.SimpleTextDropDownEntity(
-                        dataId = it.workstationId,
-                        dataText = it.workstationName
-                    )
-                }, viewModel.rfidTokenData.map {
-                    TextDropDownDialog.SimpleTextDropDownEntity(
-                        dataId = it.rfidId,
-                        dataText = "${it.rfidCode}(${it.rfid})"
-                    )
-                }) { data, dialog ->
-                    viewModel.validatePointData(data.rfidId ?: 0).observe(this) {
-                        viewModel.addIsolationPoint(data).observe(this) {
-                            dialog.dismiss()
-                            if (it) {
-                                TipDialog.show(
-                                    title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_succeed)
-                                        .toString(),
-                                    dialogType = TipDialog.DialogType.SUCCESS,
-                                    msg = CommonUtils.getStr(R.string.add_point_succeed).toString(),
-                                    countDownTime = 10,
-                                    showConfirm = false,
-                                    onCancelClick = {
-                                        getPointData(nextPage = false)
-                                    }
-                                )
-                            } else {
-                                TipDialog.show(
-                                    title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_failed)
-                                        .toString(),
-                                    dialogType = TipDialog.DialogType.ERROR,
-                                    msg = CommonUtils.getStr(R.string.add_point_failed).toString(),
-                                    countDownTime = 10,
-                                    showConfirm = false,
-                                    onCancelClick = {
-                                        getPointData(nextPage = false)
-                                    }
-                                )
-                            }
+            AddPointDialog.show(viewModel.workstationData.map {
+                TextDropDownDialog.SimpleTextDropDownEntity(
+                    dataId = it.workstationId,
+                    dataText = it.workstationName
+                )
+            }, viewModel.rfidTokenData.map {
+                TextDropDownDialog.SimpleTextDropDownEntity(
+                    dataId = it.rfidId,
+                    dataText = "${it.rfidCode}(${it.rfid})"
+                )
+            }) { data, dialog ->
+                viewModel.validatePointData(data.rfidId ?: 0).observe(this) {
+                    viewModel.addIsolationPoint(data).observe(this) {
+                        dialog.dismiss()
+                        if (it) {
+                            TipDialog.show(
+                                title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_succeed)
+                                    .toString(),
+                                dialogType = TipDialog.DialogType.SUCCESS,
+                                msg = CommonUtils.getStr(R.string.add_point_succeed).toString(),
+                                countDownTime = 10,
+                                showConfirm = false,
+                                onCancelClick = {
+                                    getPointData(nextPage = false)
+                                }
+                            )
+                        } else {
+                            TipDialog.show(
+                                title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_failed)
+                                    .toString(),
+                                dialogType = TipDialog.DialogType.ERROR,
+                                msg = CommonUtils.getStr(R.string.add_point_failed).toString(),
+                                countDownTime = 10,
+                                showConfirm = false,
+                                onCancelClick = {
+                                    getPointData(nextPage = false)
+                                }
+                            )
                         }
                     }
                 }
             }
         }
         binding.filterPoint.setDebouncedClickListener {
-            viewModel.initDialogData().observe(this) {
-                FilterPointDialog.show(viewModel.workstationData.map {
-                    TextDropDownDialog.SimpleTextDropDownEntity(
-                        dataId = it.workstationId,
-                        dataText = it.workstationName
-                    )
-                }) {
-                    viewModel.pointFilterData = it
-                    getPointData(nextPage = false)
-                }
+            FilterPointDialog.show(viewModel.workstationData.map {
+                TextDropDownDialog.SimpleTextDropDownEntity(
+                    dataId = it.workstationId,
+                    dataText = it.workstationName
+                )
+            }) {
+                viewModel.pointFilterData = it
+                getPointData(nextPage = false)
             }
         }
         binding.refreshLayout.setOnRefreshListener {
@@ -154,47 +150,45 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
                 showToast(CommonUtils.getStr(R.string.point_in_use).toString())
                 return@setDebouncedClickListener
             }
-            viewModel.initDialogData().observe(this@PointMangeFragment) {
-                UpdatePointDialog.show(item, viewModel.workstationData.map {
-                    TextDropDownDialog.SimpleTextDropDownEntity(
-                        dataId = it.workstationId,
-                        dataText = it.workstationName
-                    )
-                }, viewModel.rfidTokenData.map {
-                    TextDropDownDialog.SimpleTextDropDownEntity(
-                        dataId = it.rfidId,
-                        dataText = "${it.rfidCode}(${it.rfid})"
-                    )
-                }) { data, dialog ->
-                    viewModel.updateIsolationPoint(data).observe(this@PointMangeFragment) {
-                        dialog.dismiss()
-                        if (it) {
-                            TipDialog.show(
-                                title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_succeed)
-                                    .toString(),
-                                dialogType = TipDialog.DialogType.SUCCESS,
-                                msg = CommonUtils.getStr(R.string.update_point_succeed)
-                                    .toString(),
-                                countDownTime = 10,
-                                showConfirm = false,
-                                onCancelClick = {
-                                    getPointData(nextPage = false)
-                                }
-                            )
-                        } else {
-                            TipDialog.show(
-                                title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_failed)
-                                    .toString(),
-                                dialogType = TipDialog.DialogType.ERROR,
-                                msg = CommonUtils.getStr(R.string.update_point_failed)
-                                    .toString(),
-                                countDownTime = 10,
-                                showConfirm = false,
-                                onCancelClick = {
-                                    getPointData(nextPage = false)
-                                }
-                            )
-                        }
+            UpdatePointDialog.show(item, viewModel.workstationData.map {
+                TextDropDownDialog.SimpleTextDropDownEntity(
+                    dataId = it.workstationId,
+                    dataText = it.workstationName
+                )
+            }, viewModel.rfidTokenData.map {
+                TextDropDownDialog.SimpleTextDropDownEntity(
+                    dataId = it.rfidId,
+                    dataText = "${it.rfidCode}(${it.rfid})"
+                )
+            }) { data, dialog ->
+                viewModel.updateIsolationPoint(data).observe(this@PointMangeFragment) {
+                    dialog.dismiss()
+                    if (it) {
+                        TipDialog.show(
+                            title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_succeed)
+                                .toString(),
+                            dialogType = TipDialog.DialogType.SUCCESS,
+                            msg = CommonUtils.getStr(R.string.update_point_succeed)
+                                .toString(),
+                            countDownTime = 10,
+                            showConfirm = false,
+                            onCancelClick = {
+                                getPointData(nextPage = false)
+                            }
+                        )
+                    } else {
+                        TipDialog.show(
+                            title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_failed)
+                                .toString(),
+                            dialogType = TipDialog.DialogType.ERROR,
+                            msg = CommonUtils.getStr(R.string.update_point_failed)
+                                .toString(),
+                            countDownTime = 10,
+                            showConfirm = false,
+                            onCancelClick = {
+                                getPointData(nextPage = false)
+                            }
+                        )
                     }
                 }
             }
@@ -205,6 +199,7 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
         super.initData()
         viewModel.pointFilterData = null
         viewModel.getInUsePointData().observe(this) {}
+        viewModel.initDialogData().observe(this) {}
         getPointData(nextPage = false)
     }
 

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/RoleManageFragment.kt

@@ -145,10 +145,10 @@ class RoleManageFragment : BaseFragment<FragmentRoleManageBinding>() {
             binding.selectAll.isChecked = viewModel.roleManageDataList.all { it.isSelected }
             setSelectAllListener()
         }
-        itemBinding.root.setOnClickListener {
+        itemBinding.root.setDebouncedClickListener {
             if (item.roleKey== RoleEnum.ADMIN.roleKey){
                 showToast(CommonUtils.getStr(R.string.admin_role_can_not_edit).toString())
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             viewModel.getFunctionalPermissionsByRoleId(item.roleId)
                 .observe(this@RoleManageFragment) {

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/UserManageFragment.kt

@@ -128,7 +128,7 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
             binding.selectAll.isChecked = viewModel.userManageDataList.all { it.isSelected }
             setSelectAllListener()
         }
-        itemBinding.root.setOnClickListener {
+        itemBinding.root.setDebouncedClickListener {
             viewModel.getRoleAndWorkStationData().observe(this@UserManageFragment) {
                 UpdateUserDialog.show(item, viewModel.roleData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/WorkstationManageFragment.kt

@@ -125,7 +125,7 @@ class WorkstationManageFragment : BaseFragment<FragmentWorkstationManageBinding>
                     leftMargin = indentPx * node.level
                 }
                 itemBinding.tvName.isSelected = node.isSelected
-                itemBinding.root.setOnClickListener {
+                itemBinding.root.setDebouncedClickListener {
                     if (!node.isSelected) {
                         viewModel.workstationManageData.filter { it.isSelected }
                             .forEach { it.isSelected = false }

+ 38 - 42
app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/CardManageFragment.kt

@@ -37,25 +37,23 @@ class CardManageFragment : BaseFragment<FragmentCardManageBinding>() {
     override fun initView() {
         binding.back.setDebouncedClickListener { navController.popBackStack() }
         binding.add.setDebouncedClickListener {
-            viewModel.getAllUserData().observe(this) {
-                AddCardDialog.show(it) { vo, dialog ->
-                    viewModel.validateCardData(vo.cardNfc).observe(this) {
-                        viewModel.addCard(vo).observe(this) { ok ->
-                            dialog.dismiss()
-                            @StringRes val titleRes =
-                                if (ok) com.grkj.ui_base.R.string.action_succeed else com.grkj.ui_base.R.string.action_failed
-                            @StringRes val msgRes =
-                                if (ok) R.string.add_card_succeed else R.string.add_card_failed
+            AddCardDialog.show(viewModel.dropDownData) { vo, dialog ->
+                viewModel.validateCardData(vo.cardNfc).observe(this) {
+                    viewModel.addCard(vo).observe(this) { ok ->
+                        dialog.dismiss()
+                        @StringRes val titleRes =
+                            if (ok) com.grkj.ui_base.R.string.action_succeed else com.grkj.ui_base.R.string.action_failed
+                        @StringRes val msgRes =
+                            if (ok) R.string.add_card_succeed else R.string.add_card_failed
 
-                            TipDialog.show(
-                                title = CommonUtils.getStr(titleRes).toString(),
-                                dialogType = if (ok) TipDialog.DialogType.SUCCESS else TipDialog.DialogType.ERROR,
-                                msg = CommonUtils.getStr(msgRes).toString(),
-                                countDownTime = 10,
-                                showConfirm = false,
-                                onCancelClick = { loadCards(reset = true) }
-                            )
-                        }
+                        TipDialog.show(
+                            title = CommonUtils.getStr(titleRes).toString(),
+                            dialogType = if (ok) TipDialog.DialogType.SUCCESS else TipDialog.DialogType.ERROR,
+                            msg = CommonUtils.getStr(msgRes).toString(),
+                            countDownTime = 10,
+                            showConfirm = false,
+                            onCancelClick = { loadCards(reset = true) }
+                        )
                     }
                 }
             }
@@ -65,11 +63,9 @@ class CardManageFragment : BaseFragment<FragmentCardManageBinding>() {
             loadCards(true)
         }
         binding.filter.setDebouncedClickListener {
-            viewModel.getAllUserData().observe(this) {
-                FilterCardDialog.show(it) {
-                    viewModel.cardFilterData = it
-                    loadCards(reset = true)
-                }
+            FilterCardDialog.show(viewModel.dropDownData) {
+                viewModel.cardFilterData = it
+                loadCards(reset = true)
             }
         }
         binding.delete.setDebouncedClickListener { deleteSelectedCards() }
@@ -109,25 +105,23 @@ class CardManageFragment : BaseFragment<FragmentCardManageBinding>() {
                 binding.selectAll.isChecked = viewModel.cardManageDataList.all { it.isSelected }
             }
         }
-        bind.root.setOnClickListener {
-            viewModel.getAllUserData().observe(this) {
-                UpdateCardDialog.show(item, it) { vo, dialog ->
-                    viewModel.updateCard(vo).observe(this) { ok ->
-                        dialog.dismiss()
-                        @StringRes val titleRes =
-                            if (ok) com.grkj.ui_base.R.string.action_succeed else com.grkj.ui_base.R.string.action_failed
-                        @StringRes val msgRes =
-                            if (ok) R.string.update_card_succeed else R.string.update_card_failed
+        bind.root.setDebouncedClickListener {
+            UpdateCardDialog.show(item, viewModel.dropDownData) { vo, dialog ->
+                viewModel.updateCard(vo).observe(this) { ok ->
+                    dialog.dismiss()
+                    @StringRes val titleRes =
+                        if (ok) com.grkj.ui_base.R.string.action_succeed else com.grkj.ui_base.R.string.action_failed
+                    @StringRes val msgRes =
+                        if (ok) R.string.update_card_succeed else R.string.update_card_failed
 
-                        TipDialog.show(
-                            title = CommonUtils.getStr(titleRes).toString(),
-                            dialogType = if (ok) TipDialog.DialogType.SUCCESS else TipDialog.DialogType.ERROR,
-                            msg = CommonUtils.getStr(msgRes).toString(),
-                            countDownTime = 10,
-                            showConfirm = false,
-                            onCancelClick = { loadCards(reset = true) }
-                        )
-                    }
+                    TipDialog.show(
+                        title = CommonUtils.getStr(titleRes).toString(),
+                        dialogType = if (ok) TipDialog.DialogType.SUCCESS else TipDialog.DialogType.ERROR,
+                        msg = CommonUtils.getStr(msgRes).toString(),
+                        countDownTime = 10,
+                        showConfirm = false,
+                        onCancelClick = { loadCards(reset = true) }
+                    )
                 }
             }
         }
@@ -136,7 +130,9 @@ class CardManageFragment : BaseFragment<FragmentCardManageBinding>() {
     override fun initData() {
         super.initData()
         viewModel.cardFilterData = null
-        loadCards(reset = true)
+        viewModel.getAllUserData().observe(this) {
+            loadCards(reset = true)
+        }
     }
 
     private fun loadCards(reset: Boolean = false) {

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/KeyManageFragment.kt

@@ -126,7 +126,7 @@ class KeyManageFragment : BaseFragment<FragmentKeyManageBinding>() {
             binding.selectAll.isChecked = viewModel.keyManageDataList.all { it.isSelected }
             setSelectAllListener()
         }
-        itemBinding.root.setOnClickListener {
+        itemBinding.root.setDebouncedClickListener {
             UpdateKeyDialog.show(item) { data, dialog ->
                 viewModel.updateKey(data).observe(this@KeyManageFragment) {
                     dialog.dismiss()

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/LockManageFragment.kt

@@ -108,7 +108,7 @@ class LockManageFragment : BaseFragment<FragmentLockManageBinding>() {
                 binding.selectAll.isChecked = viewModel.lockManageDataList.all { it.isSelected }
             }
         }
-        bind.root.setOnClickListener {
+        bind.root.setDebouncedClickListener {
             UpdateLockDialog.show(item) { vo, dialog ->
                 viewModel.validateLockData(vo.lockNfc ?: "").observe(this) {
                     viewModel.updateLock(vo).observe(this) { ok ->

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/RfidTokenManageFragment.kt

@@ -106,10 +106,10 @@ class RfidTokenManageFragment : BaseFragment<FragmentRfidTokenManageBinding>() {
                     viewModel.rfidTokenManageDataList.all { it.isSelected }
             }
         }
-        bind.root.setOnClickListener {
+        bind.root.setDebouncedClickListener {
             if (item.rfidId in viewModel.inUseRfidIds){
                 showToast(CommonUtils.getStr(R.string.rfid_in_use).toString())
-                return@setOnClickListener
+                return@setDebouncedClickListener
             }
             UpdateRfidTokenDialog.show(item) { vo, dialog ->
                 viewModel.updateRfidToken(vo).observe(this) { ok ->

+ 1 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/home/HomeFragment.kt

@@ -278,7 +278,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
         } else {
             itemBinding.quickEntranceLayout.showTextBadge(item.badgeNum.toString())
         }
-        itemBinding.root.setOnClickListener {
+        itemBinding.root.setDebouncedClickListener {
             onMenuClick(item)
         }
     }

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopFragment.kt

@@ -97,10 +97,10 @@ class CreateSopFragment : BaseFormFragment<FragmentCreateSopBinding>() {
                     })
             }
         }
-        binding.workstationTv.setOnClickListener {
+        binding.workstationTv.setDebouncedClickListener {
             setWorkstationData()
         }
-        binding.lockModeTv.setOnClickListener {
+        binding.lockModeTv.setDebouncedClickListener {
             setLockModeData()
         }
         binding.noSelectedPointLayout.setDebouncedClickListener {

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditJobFragment.kt

@@ -115,10 +115,10 @@ class EditJobFragment : BaseFormFragment<FragmentEditJobBinding>() {
                     })
             }
         }
-        binding.workstationTv.setOnClickListener {
+        binding.workstationTv.setDebouncedClickListener {
             setWorkstationData()
         }
-        binding.lockModeTv.setOnClickListener {
+        binding.lockModeTv.setDebouncedClickListener {
             setLockModeData()
         }
         binding.workflowModeSettingTv.setDebouncedClickListener {

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

@@ -273,7 +273,13 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                     if (workflowStep?.confirmType != 0 && (workflowStep?.enableSetLocker == true || workflowStep?.enableSetColocker == true)) {
                         stepClickConfirm(adapter, item, workflowStep)
                     } else if (workflowStep?.confirmType == 0 && (viewModel.ticketData?.createBy == MainDomainData.userInfo?.userName || workflowStep.currentUserCanConfirm())) {//手动确认 需要时创建者或者指定人员
-                        stepClickConfirm(adapter, item, workflowStep)
+                        if (workflowStep.currentUserCanConfirm()) {
+                            CheckFaceDialog.show(viewLifecycleOwner, viewModel, 0) {
+                                stepClickConfirm(adapter, item, workflowStep)
+                            }
+                        } else {
+                            stepClickConfirm(adapter, item, workflowStep)
+                        }
                     } else {
                         val errorTipData = viewModel.getStepErrorTip(workflowStep)
                         PopTip.build().tip(errorTipData.first)
@@ -702,17 +708,35 @@ class JobExecuteFragment : BaseFragment<FragmentJobExecuteBinding>() {
                 if (workflowStep?.confirmType != 0 ||//自动确认
                     (viewModel.ticketData?.createBy == MainDomainData.userInfo?.userName || workflowStep.currentUserCanConfirm())
                 ) {
-                    viewModel.currentStepData?.stepStatus = "1"
-                    viewModel.currentStepData?.updateTime =
-                        TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
-                    viewModel.currentStepData?.let {
-                        viewModel.updateStepStatus(it).observe(this@JobExecuteFragment) {
-                            if (it == false) {
-                                PopTip.build().tip(R.string.step_confirm_failed)
-                            } else {
-                                checkCurrentStep()
+                    if (workflowStep?.currentUserCanConfirm() == true) {
+                        CheckFaceDialog.show(viewLifecycleOwner, viewModel, 0) {
+                            viewModel.currentStepData?.stepStatus = "1"
+                            viewModel.currentStepData?.updateTime =
+                                TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
+                            viewModel.currentStepData?.let {
+                                viewModel.updateStepStatus(it).observe(this@JobExecuteFragment) {
+                                    if (it == false) {
+                                        PopTip.build().tip(R.string.step_confirm_failed)
+                                    } else {
+                                        checkCurrentStep()
+                                    }
+                                    binding.stepRv.adapter?.notifyDataSetChanged()
+                                }
+                            }
+                        }
+                    } else {
+                        viewModel.currentStepData?.stepStatus = "1"
+                        viewModel.currentStepData?.updateTime =
+                            TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
+                        viewModel.currentStepData?.let {
+                            viewModel.updateStepStatus(it).observe(this@JobExecuteFragment) {
+                                if (it == false) {
+                                    PopTip.build().tip(R.string.step_confirm_failed)
+                                } else {
+                                    checkCurrentStep()
+                                }
+                                binding.stepRv.adapter?.notifyDataSetChanged()
                             }
-                            binding.stepRv.adapter?.notifyDataSetChanged()
                         }
                     }
                 }

+ 28 - 8
app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/MyTodoListFragment.kt

@@ -359,9 +359,17 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
 
                             OperationTypeEnum.CONFIRM -> {
                                 jobExecuteViewModel.currentStepData?.let { stepVo ->
-                                    stepClickConfirm(
-                                        stepVo, jobExecuteViewModel.currentStepData
-                                    )
+                                    if (stepVo.currentUserCanConfirm()) {
+                                        CheckFaceDialog.show(viewLifecycleOwner, viewModel, 0) {
+                                            stepClickConfirm(
+                                                stepVo, jobExecuteViewModel.currentStepData
+                                            )
+                                        }
+                                    } else {
+                                        stepClickConfirm(
+                                            stepVo, jobExecuteViewModel.currentStepData
+                                        )
+                                    }
                                 }
                             }
 
@@ -606,12 +614,24 @@ class MyTodoListFragment : BaseFragment<FragmentMyTodoListBinding>() {
                     if (workflowStep?.confirmType != 0 ||//自动确认
                         (jobExecuteViewModel.ticketData?.createBy == MainDomainData.userInfo?.userName || workflowStep.currentUserCanConfirm())
                     ) {
-                        jobExecuteViewModel.currentStepData?.stepStatus = "1"
-                        jobExecuteViewModel.currentStepData?.let {
-                            jobExecuteViewModel.updateStepStatus(it)
-                                .observe(this@MyTodoListFragment) {
-                                    getData()
+                        if (workflowStep?.currentUserCanConfirm() == true) {
+                            CheckFaceDialog.show(viewLifecycleOwner, viewModel, 0) {
+                                jobExecuteViewModel.currentStepData?.stepStatus = "1"
+                                jobExecuteViewModel.currentStepData?.let {
+                                    jobExecuteViewModel.updateStepStatus(it)
+                                        .observe(this@MyTodoListFragment) {
+                                            getData()
+                                        }
                                 }
+                            }
+                        } else {
+                            jobExecuteViewModel.currentStepData?.stepStatus = "1"
+                            jobExecuteViewModel.currentStepData?.let {
+                                jobExecuteViewModel.updateStepStatus(it)
+                                    .observe(this@MyTodoListFragment) {
+                                        getData()
+                                    }
+                            }
                         }
                     }
                     if (workflowStep?.enableAddColocker == true || workflowStep?.enableReduceColocker == true) {

+ 2 - 1
app/src/main/java/com/grkj/iscs/features/main/fragment/user_info/UserInfoHomeFragment.kt

@@ -15,6 +15,7 @@ import com.grkj.iscs.databinding.ItemHomeMenuBinding
 import com.grkj.iscs.features.main.entity.MenuItemEntity
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.utils.event.LogoutEvent
+import com.sik.sikcore.extension.setDebouncedClickListener
 import dagger.hilt.android.AndroidEntryPoint
 
 /**
@@ -99,7 +100,7 @@ class UserInfoHomeFragment : BaseFragment<FragmentUserInfoHomeBinding>() {
         val item = holder.getModel<MenuItemEntity>()
         itemBinding.homeMenuIv.setImageResource(item.menuIconId)
         itemBinding.homeMenuTv.text = item.menuText
-        itemBinding.root.setOnClickListener {
+        itemBinding.root.setDebouncedClickListener {
             onMenuClick(item.type)
         }
     }

+ 9 - 6
app/src/main/java/com/grkj/iscs/features/main/viewmodel/hardware_manage/CardManageViewModel.kt

@@ -31,6 +31,8 @@ class CardManageViewModel @Inject constructor(
     var cardManageDataList: MutableList<IsJobCard> = mutableListOf()
     var cardFilterData: CardManageFilterVo? = null
 
+    var dropDownData: List<TextDropDownDialog.TextDropDownEntity> = mutableListOf()
+
     /**
      * 删除选中卡片
      */
@@ -63,7 +65,7 @@ class CardManageViewModel @Inject constructor(
     /**
      * 获取所有用户数据
      */
-    fun getAllUserData(): LiveData<List<TextDropDownDialog.TextDropDownEntity>> {
+    fun getAllUserData(): LiveData<Boolean> {
         return liveData(Dispatchers.IO) {
             val userData = userRepository.getAllUsers().map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
@@ -71,7 +73,8 @@ class CardManageViewModel @Inject constructor(
                     dataText = it.userName
                 )
             }
-            emit(userData)
+            dropDownData = userData
+            emit(true)
         }
     }
 
@@ -80,8 +83,8 @@ class CardManageViewModel @Inject constructor(
      */
     fun addCard(data: AddCardDataVo): LiveData<Boolean> =
         liveData(Dispatchers.IO) {
-            var defaultCardCodeSize = hardwareRepository.getDefaultCardNameCount()
-            var isCard = BeanUtils.copyProperties(data, IsJobCard::class.java)
+            val defaultCardCodeSize = hardwareRepository.getDefaultCardNameCount()
+            val isCard = BeanUtils.copyProperties(data, IsJobCard::class.java)
             isCard?.exStatus =
                 if (data.exStatus) {
                     CommonDictDataEnum.JOB_CARD_STATUS.commonDictRes.find { it.dictLabel == "正常" }?.dictValue
@@ -102,8 +105,8 @@ class CardManageViewModel @Inject constructor(
      */
     fun updateCard(data: UpdateCardDataVo): LiveData<Boolean> =
         liveData(Dispatchers.IO) {
-            var defaultCardCodeSize = hardwareRepository.getDefaultCardNameCount()
-            var isCard = BeanUtils.copyProperties(data, IsJobCard::class.java)
+            val defaultCardCodeSize = hardwareRepository.getDefaultCardNameCount()
+            val isCard = BeanUtils.copyProperties(data, IsJobCard::class.java)
             isCard?.exStatus =
                 if (data.exStatus) {
                     CommonDictDataEnum.JOB_CARD_STATUS.commonDictRes.find { it.dictLabel == "正常" }?.dictValue

+ 1 - 1
app/src/main/res/layout-land/fragment_workflow_setting.xml

@@ -227,7 +227,7 @@
                             app:layout_constraintStart_toStartOf="parent"
                             app:layout_constraintTop_toBottomOf="@+id/step_confirm_type_tv"
                             app:markPosition="end"
-                            app:required="true" />
+                            app:required="false" />
 
                         <TextView
                             android:id="@+id/step_confirm_role"

+ 2 - 1
ui-base/src/main/java/com/grkj/ui_base/widget/CustomNavBar.kt

@@ -25,6 +25,7 @@ import androidx.appcompat.view.menu.MenuBuilder
 import androidx.core.view.size
 import androidx.palette.graphics.Palette
 import com.grkj.ui_base.R
+import com.sik.sikcore.extension.setDebouncedClickListener
 import kotlin.math.tan
 
 /**
@@ -103,7 +104,7 @@ class CustomNavBar @JvmOverloads constructor(
                 } else {
                     LayoutParams(LayoutParams.WRAP_CONTENT, 0, 1f)
                 }
-                setOnClickListener { if (onItemSelected?.invoke(item) == true) selectIndex(i) }
+                setDebouncedClickListener { if (onItemSelected?.invoke(item) == true) selectIndex(i) }
             }
             val iv = ImageView(context).apply {
                 setImageDrawable(item.icon)