فهرست منبع

refactor(更新)
- 修改弹窗问题

周文健 4 ماه پیش
والد
کامیت
dba6b91291
50فایلهای تغییر یافته به همراه2139 افزوده شده و 2303 حذف شده
  1. 2 2
      app/src/main/java/com/grkj/iscs/features/init/fragment/InitCardRegistrationFragment.kt
  2. 2 2
      app/src/main/java/com/grkj/iscs/features/init/fragment/InitPointRfidRegistrationFragment.kt
  3. 2 2
      app/src/main/java/com/grkj/iscs/features/init/fragment/InitSetAdminAccountFragment.kt
  4. 71 112
      app/src/main/java/com/grkj/iscs/features/main/dialog/TextDropDownDialog.kt
  5. 81 85
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddPointDialog.kt
  6. 122 150
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddRoleDialog.kt
  7. 75 76
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddUserDialog.kt
  8. 33 36
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/AddWorkstationDialog.kt
  9. 69 62
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterPointDialog.kt
  10. 47 36
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterRoleDialog.kt
  11. 58 37
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/FilterUserDialog.kt
  12. 90 103
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdatePointDialog.kt
  13. 119 189
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateRoleDialog.kt
  14. 82 127
      app/src/main/java/com/grkj/iscs/features/main/dialog/data_manage/UpdateUserDialog.kt
  15. 60 66
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/AddCardDialog.kt
  16. 61 55
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/AddKeyDialog.kt
  17. 54 44
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/AddLockDialog.kt
  18. 55 45
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/AddRfidTokenDialog.kt
  19. 61 52
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/FilterCardDialog.kt
  20. 55 35
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/FilterKeyDialog.kt
  21. 43 31
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/FilterLockDialog.kt
  22. 43 31
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/FilterRfidTokenDialog.kt
  23. 67 81
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/UpdateCardDialog.kt
  24. 71 72
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/UpdateKeyDialog.kt
  25. 64 63
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/UpdateLockDialog.kt
  26. 65 58
      app/src/main/java/com/grkj/iscs/features/main/dialog/hardware_manage/UpdateRfidTokenDialog.kt
  27. 67 85
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/PointMangeFragment.kt
  28. 91 97
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/RoleManageFragment.kt
  29. 66 83
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/UserManageFragment.kt
  30. 29 33
      app/src/main/java/com/grkj/iscs/features/main/fragment/data_manage/WorkstationManageFragment.kt
  31. 38 57
      app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/CardManageFragment.kt
  32. 62 76
      app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/KeyManageFragment.kt
  33. 39 53
      app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/LockManageFragment.kt
  34. 39 51
      app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/RfidTokenManageFragment.kt
  35. 6 11
      app/src/main/java/com/grkj/iscs/features/main/fragment/home/HomeFragment.kt
  36. 4 11
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateJobFragment.kt
  37. 8 16
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopFragment.kt
  38. 8 13
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/CreateSopJobFragment.kt
  39. 4 11
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditJobFragment.kt
  40. 4 11
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopFragment.kt
  41. 12 28
      app/src/main/java/com/grkj/iscs/features/main/fragment/job_manage/EditSopJobFragment.kt
  42. 14 12
      app/src/main/java/com/grkj/iscs/features/main/viewmodel/hardware_manage/CardManageViewModel.kt
  43. 1 1
      app/src/main/res/values-land/dimens.xml
  44. 4 0
      data/src/main/java/com/grkj/data/data/DictConstants.kt
  45. 6 0
      data/src/main/java/com/grkj/data/enums/CommonDictDataEnum.kt
  46. 1 1
      data/src/main/java/com/grkj/data/model/vo/UpdateCardDataVo.kt
  47. 31 0
      shared/src/main/java/com/grkj/shared/utils/KeyboardUtils.kt
  48. 0 1
      ui-base/build.gradle.kts
  49. 25 0
      ui-base/src/main/java/com/grkj/ui_base/base/BaseActivity.kt
  50. 28 0
      ui-base/src/main/java/com/grkj/ui_base/base/BaseFragment.kt

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/init/fragment/InitCardRegistrationFragment.kt

@@ -11,11 +11,11 @@ import com.grkj.iscs.databinding.ItemInitHardwareRfidBinding
 import com.grkj.iscs.features.init.activity.InitActivity
 import com.grkj.iscs.features.init.viewmodel.InitViewModel
 import com.grkj.shared.model.EventBean
+import com.grkj.shared.utils.KeyboardUtils
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.utils.event.CardSwipeEvent
 import com.sik.sikcore.extension.setDebouncedClickListener
 import dagger.hilt.android.AndroidEntryPoint
-import razerdp.util.KeyboardUtils
 
 /**
  * 卡片录入
@@ -72,7 +72,7 @@ class InitCardRegistrationFragment : BaseFragment<FragmentInitCardRegistrationBi
                 val cardSwipeEvent = (event.data as CardSwipeEvent)
                 cardRfidData.add(cardSwipeEvent.cardNo)
                 binding.cardRv.adapter?.notifyDataSetChanged()
-                KeyboardUtils.close(requireActivity())
+                KeyboardUtils.hideKeyboard(requireActivity())
             }
         }
     }

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/init/fragment/InitPointRfidRegistrationFragment.kt

@@ -14,13 +14,13 @@ import com.grkj.iscs.features.init.activity.InitActivity
 import com.grkj.iscs.features.init.viewmodel.InitViewModel
 import com.grkj.iscs.features.login.activity.LoginActivity
 import com.grkj.shared.model.EventBean
+import com.grkj.shared.utils.KeyboardUtils
 import com.grkj.ui_base.base.BaseFragment
 import com.grkj.ui_base.config.ISCSConfig
 import com.grkj.ui_base.utils.event.CardSwipeEvent
 import com.sik.sikcore.extension.saveMMKVData
 import com.sik.sikcore.extension.setDebouncedClickListener
 import dagger.hilt.android.AndroidEntryPoint
-import razerdp.util.KeyboardUtils
 import kotlin.getValue
 
 /**
@@ -86,7 +86,7 @@ class InitPointRfidRegistrationFragment : BaseFragment<FragmentInitPointRfidRegi
                 val cardSwipeEvent = (event.data as CardSwipeEvent)
                 pointRfidData.add(cardSwipeEvent.cardNo)
                 binding.pointRfidRv.adapter?.notifyDataSetChanged()
-                KeyboardUtils.close(requireActivity())
+                KeyboardUtils.hideKeyboard(requireActivity())
             }
         }
     }

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/init/fragment/InitSetAdminAccountFragment.kt

@@ -4,11 +4,11 @@ import androidx.fragment.app.viewModels
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentInitSetAdminAccountBinding
 import com.grkj.iscs.features.init.viewmodel.InitViewModel
+import com.grkj.shared.utils.KeyboardUtils
 import com.grkj.ui_base.base.BaseFragment
 import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.extension.setDebouncedClickListener
 import dagger.hilt.android.AndroidEntryPoint
-import razerdp.util.KeyboardUtils
 
 /**
  * 设置管理员账号
@@ -23,7 +23,7 @@ class InitSetAdminAccountFragment : BaseFragment<FragmentInitSetAdminAccountBind
 
     override fun initView() {
         binding.mainContainer.setDebouncedClickListener {
-            KeyboardUtils.close(requireActivity())
+            KeyboardUtils.hideKeyboard(requireActivity())
         }
         binding.previousBtn.setDebouncedClickListener {
             navController.popBackStack()

+ 71 - 112
app/src/main/java/com/grkj/iscs/features/main/dialog/TextDropDownDialog.kt

@@ -1,6 +1,6 @@
 package com.grkj.iscs.features.main.dialog
 
-import android.content.Context
+import android.view.Gravity
 import android.view.View
 import androidx.core.view.isVisible
 import com.drake.brv.BindingAdapter
@@ -10,122 +10,96 @@ import com.drake.brv.utils.setup
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogDropDownListBinding
 import com.grkj.iscs.databinding.ItemHomeTextDropDownBinding
-import me.jessyan.autosize.utils.AutoSizeUtils
-import razerdp.basepopup.BasePopupWindow
+import com.grkj.ui_base.utils.CommonUtils
+import com.kongzue.dialogx.dialogs.CustomDialog
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 下拉文本选择框
+ * 通用下拉文本选择框,支持单选和多选
+ * 使用方式:
+ * 1. 单选:TextDropDownDialog.showSingle(dataList) { selected -> ... }
+ * 2. 多选:TextDropDownDialog.showMulti(dataList) { selectedList -> ... }
  */
-class TextDropDownDialog(context: Context) : BasePopupWindow(context) {
-    private lateinit var binding: DialogDropDownListBinding
-    private var textSize = AutoSizeUtils.dp2px(context, 12f)
-    private var onItemSelectedListener: (TextDropDownEntity) -> Unit = {}
-    private var onItemMultiSelectedListener: (List<TextDropDownEntity>?) -> Unit = {}
-    private var multiSelect: Boolean = false
+class TextDropDownDialog(
+    private val dataList: List<TextDropDownEntity>,
+    private val multiSelect: Boolean,
+    private val onSelect: (TextDropDownEntity) -> Unit,
+    private val onMultiSelect: (List<TextDropDownEntity>?) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_drop_down_list) {
 
-    init {
-        setContentView(R.layout.dialog_drop_down_list)
-    }
+    private lateinit var binding: DialogDropDownListBinding
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        setBackground(null)
-        binding = DialogDropDownListBinding.bind(contentView)
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogDropDownListBinding.bind(v)
         binding.dropDownRv.linear().setup {
             addType<TextDropDownEntity>(R.layout.item_home_text_drop_down)
             onBind {
-                onTextDropDownRVBinding(this)
-            }
-        }
-    }
-
-    private fun BindingAdapter.BindingViewHolder.onTextDropDownRVBinding(holder: BindingAdapter.BindingViewHolder) {
-        val itemBinding = holder.getBinding<ItemHomeTextDropDownBinding>()
-        val item = holder.getModel<TextDropDownEntity>()
-        itemBinding.dropDownText.text = item.getShowText()
-        itemBinding.checkIv.isVisible = item.isSelected()
-        itemBinding.root.setOnClickListener {
-            if (multiSelect) {
-                item.setSelected(!item.isSelected())
+                val item = getModel<TextDropDownEntity>()
+                val itemBinding = getBinding<ItemHomeTextDropDownBinding>()
+                itemBinding.dropDownText.text = item.getShowText()
                 itemBinding.checkIv.isVisible = item.isSelected()
-                onItemMultiSelectedListener(
-                    binding.dropDownRv.models?.filterIsInstance<TextDropDownEntity>()
-                        ?.filter { it.isSelected() }?.toList()
-                )
-            } else {
-                onItemSelectedListener(item)
-                dismiss()
+                itemBinding.root.setOnClickListener {
+                    if (multiSelect) {
+                        item.setSelected(!item.isSelected())
+                        itemBinding.checkIv.isVisible = item.isSelected()
+                        val selected = binding.dropDownRv.models
+                            ?.filterIsInstance<TextDropDownEntity>()
+                            ?.filter { it.isSelected() }
+                        onMultiSelect(selected)
+                    } else {
+                        onSelect(item)
+                        dialog?.dismiss()
+                    }
+                }
             }
         }
+        binding.dropDownRv.models = dataList
     }
 
-    /**
-     * 设置数据
-     */
-    fun setData(dropDownData: List<TextDropDownEntity> = emptyList<TextDropDownEntity>()) {
-        binding.dropDownRv.models = dropDownData
-    }
-
-    /**
-     * 设置文本大小
-     */
-    fun setTextSize(textSize: Float) {
-        this.textSize = AutoSizeUtils.dp2px(context, textSize)
-    }
-
-    /**
-     * 选择监听
-     */
-    fun setOnItemSelectListener(onItemSelected: (TextDropDownEntity) -> Unit) {
-        multiSelect = false
-        this.onItemSelectedListener = onItemSelected
-    }
+    companion object {
+        /**
+         * 显示单选弹窗
+         */
+        @JvmStatic
+        fun showSingle(
+            data: List<TextDropDownEntity>,
+            view: View,
+            onSelect: (TextDropDownEntity) -> Unit
+        ) {
+            CustomDialog.show(
+                TextDropDownDialog(data, false, onSelect) { }
+            ).setAlignBaseViewGravity(view, Gravity.BOTTOM or Gravity.CENTER).setWidth(view.width)
+        }
 
-    /**
-     * 多选监听
-     */
-    fun setOnItemMultiSelectListener(onItemMultiSelect: (List<TextDropDownEntity>?) -> Unit) {
-        multiSelect = true
-        this.onItemMultiSelectedListener = onItemMultiSelect
+        /**
+         * 显示多选弹窗
+         */
+        @JvmStatic
+        fun showMulti(
+            data: List<TextDropDownEntity>,
+            view: View,
+            onMultiSelect: (List<TextDropDownEntity>?) -> Unit
+        ) {
+            CustomDialog.show(
+                TextDropDownDialog(data, true, {}) { selected -> onMultiSelect(selected) }
+            ).setAlignBaseViewGravity(view, Gravity.BOTTOM or Gravity.CENTER).setWidth(view.width)
+        }
     }
 
     /**
-     * 文本下拉弹窗数据实体接口
+     * 下拉弹窗数据实体接口
      */
     interface TextDropDownEntity {
-        /**
-         * 获取数据id
-         */
         fun getId(): Long
-
-        /**
-         * 获取标签
-         */
         fun getTag(): String
-
-        /**
-         * 获取展示文本
-         */
         fun getShowText(): String
-
-        /**
-         * 获取保存的数据
-         */
         fun getData(): Any?
-
-        /**
-         * 是否选中
-         */
         fun isSelected(): Boolean
-
-        /**
-         * 设置是否选中
-         */
         fun setSelected(isSelect: Boolean)
     }
 
     /**
-     * 简易结构
+     * 简易实现
      */
     class SimpleTextDropDownEntity(
         var dataId: Long = 0,
@@ -133,29 +107,14 @@ class TextDropDownDialog(context: Context) : BasePopupWindow(context) {
         val dataTag: String = "",
         var dataText: String = ""
     ) : TextDropDownEntity {
-        var isSelect: Boolean = false
-        override fun getId(): Long {
-            return dataId
-        }
-
-        override fun getTag(): String {
-            return dataTag
-        }
-
-        override fun getShowText(): String {
-            return dataText
-        }
-
-        override fun getData(): Any? {
-            return dataObject
-        }
-
-        override fun isSelected(): Boolean {
-            return isSelect
-        }
-
+        private var selected = false
+        override fun getId() = dataId
+        override fun getTag() = dataTag
+        override fun getShowText() = dataText
+        override fun getData() = dataObject
+        override fun isSelected() = selected
         override fun setSelected(isSelect: Boolean) {
-            this.isSelect = isSelect
+            selected = isSelect
         }
     }
-}
+}

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

@@ -1,136 +1,132 @@
 package com.grkj.iscs.features.main.dialog.data_manage
 
-import android.content.Context
 import android.view.View
+import com.grkj.data.enums.IsolationPointPowerTypeEnum
 import com.grkj.data.model.vo.AddPointManageVo
 import com.grkj.iscs.R
-import com.grkj.iscs.databinding.DialogFilterPointBinding
-import com.grkj.iscs.features.main.dialog.TextDropDownDialog
-import com.grkj.data.enums.IsolationPointPowerTypeEnum
 import com.grkj.iscs.databinding.DialogAddPointBinding
+import com.grkj.iscs.features.main.dialog.TextDropDownDialog
+import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
-import razerdp.basepopup.BasePopupWindow
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 添加隔离点
+ * 添加隔离点对话框,基于 DialogX
+ * 使用:
+ * AddPointDialog.show(
+ *     workstationData, rfidTokenData
+ * ) { addVo -> /* handle */ }
  */
-class AddPointDialog(context: Context) : BasePopupWindow(context) {
-    private var onConfirm: (AddPointManageVo) -> Unit = {}
-    private var textDropDownDialog: TextDropDownDialog
-    private var workstationData: List<TextDropDownDialog.TextDropDownEntity> = mutableListOf()
-    private var rfidTokenData: List<TextDropDownDialog.TextDropDownEntity> = mutableListOf()
-    private var selectPowerType: TextDropDownDialog.TextDropDownEntity? = null
-    private var selectWorkstation: TextDropDownDialog.TextDropDownEntity? = null
-    private var selectRfidToken: TextDropDownDialog.TextDropDownEntity? = null
-    private lateinit var binding: DialogAddPointBinding
+class AddPointDialog(
+    private val workstationData: List<TextDropDownDialog.TextDropDownEntity>,
+    private val rfidTokenData: List<TextDropDownDialog.TextDropDownEntity>,
+    private val onConfirm: (AddPointManageVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_add_point) {
 
-    init {
-        setContentView(R.layout.dialog_add_point)
-        textDropDownDialog = TextDropDownDialog(context)
-        textDropDownDialog.setWidthAsAnchorView(true)
+    private lateinit var binding: DialogAddPointBinding
 
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogAddPointBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogAddPointBinding.bind(contentView)
         binding.powerTypeTv.setOnClickListener {
-            setPointPowerType()
-            textDropDownDialog.showPopupWindow(binding.powerTypeTv)
+            val list = IsolationPointPowerTypeEnum.values().map {
+                TextDropDownDialog.SimpleTextDropDownEntity(
+                    dataId = 0L,
+                    dataObject = null,
+                    dataTag = it.name,
+                    dataText = it.description
+                )
+            }
+            TextDropDownDialog.showSingle(list,binding.powerTypeTv) { item ->
+                binding.powerTypeTv.text = item.getShowText()
+                binding.powerTypeTv.tag = item.getTag()
+            }
         }
+
         binding.workstationTv.setOnClickListener {
-            textDropDownDialog.setData(workstationData)
-            textDropDownDialog.setOnItemSelectListener {
-                selectWorkstation = it
-                binding.workstationTv.text = it.getShowText()
+            TextDropDownDialog.showSingle(workstationData,binding.workstationTv) { item ->
+                binding.workstationTv.text = item.getShowText()
+                binding.workstationTv.tag = item.getId()
             }
-            textDropDownDialog.showPopupWindow(binding.workstationTv)
         }
+
         binding.rfidTagTv.setOnClickListener {
-            textDropDownDialog.setData(rfidTokenData)
-            textDropDownDialog.setOnItemSelectListener {
-                selectRfidToken = it
-                binding.rfidTagTv.text = it.getShowText()
+            TextDropDownDialog.showSingle(rfidTokenData,binding.rfidTagTv) { item ->
+                binding.rfidTagTv.text = item.getShowText()
+                binding.rfidTagTv.tag = item.getId()
             }
-            textDropDownDialog.showPopupWindow(binding.rfidTagTv)
         }
-        binding.closeIv.setOnClickListener { dismiss() }
+
+        // 关闭
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+
+        // 确认
         binding.confirm.setOnClickListener {
             if (checkData()) {
-                val addData = AddPointManageVo(
+                val vo = AddPointManageVo(
                     binding.pointNameTv.text.toString(),
                     binding.functionEt.text.toString(),
-                    selectPowerType?.getTag(),
-                    selectWorkstation?.getId(),
-                    selectRfidToken?.getId()
+                    binding.powerTypeTv.tag as String,
+                    binding.workstationTv.tag as Long,
+                    binding.rfidTagTv.tag as Long
                 )
-                onConfirm(addData)
-                dismiss()
-                binding.pointNameTv.setText("")
-                binding.functionEt.setText("")
-                binding.powerTypeTv.text = ""
-                binding.workstationTv.text = ""
-                binding.rfidTagTv.text = ""
-                selectPowerType = null
-                selectWorkstation = null
+                onConfirm(vo)
+                dialog?.dismiss()
+                clearFields()
             }
         }
-        binding.cancel.setOnClickListener {
-            dismiss()
-        }
-    }
-
-    fun setWorkstationData(workstationData: List<TextDropDownDialog.TextDropDownEntity>) {
-        this.workstationData = workstationData
-    }
-
-    fun setRfidTokenData(rfidTokenData: List<TextDropDownDialog.TextDropDownEntity>) {
-        this.rfidTokenData = rfidTokenData
-    }
-
-    private fun setPointPowerType() {
-        textDropDownDialog.setData(
-            IsolationPointPowerTypeEnum.values().map {
-                TextDropDownDialog.SimpleTextDropDownEntity(
-                    dataTag = it.name,
-                    dataText = it.description
-                )
-            })
-        textDropDownDialog.setOnItemSelectListener {
-            selectPowerType = it
-            binding.powerTypeTv.text = it.getShowText()
-        }
     }
 
     private fun checkData(): Boolean {
-        if (binding.pointNameTv.text.trim().toString().isEmpty()) {
+        if (binding.pointNameTv.text.isNullOrBlank()) {
             PopTip.build().tipDialog(R.string.please_input_point_name)
             return false
         }
-        if (binding.functionEt.text.trim().toString().isEmpty()) {
+        if (binding.functionEt.text.isNullOrBlank()) {
             PopTip.build().tipDialog(R.string.please_input_point_function)
             return false
         }
-        if (selectPowerType == null) {
+        if (binding.powerTypeTv.text.isNullOrBlank()) {
             PopTip.build().tipDialog(R.string.please_select_power_type)
             return false
         }
-        if (selectWorkstation == null) {
+        if (binding.workstationTv.text.isNullOrBlank()) {
             PopTip.build().tipDialog(R.string.please_select_workstation)
             return false
         }
-        if (selectRfidToken == null) {
+        if (binding.rfidTagTv.text.isNullOrBlank()) {
             PopTip.build().tipDialog(R.string.please_select_rfid_tag)
             return false
         }
         return true
     }
 
-    /**
-     * 设置确认事件
-     */
-    fun setOnConfirmListener(onConfirm: (AddPointManageVo) -> Unit) {
-        this.onConfirm = onConfirm
+    private fun clearFields() {
+        binding.pointNameTv.text?.clear()
+        binding.functionEt.text?.clear()
+        binding.powerTypeTv.text = ""
+        binding.workstationTv.text = ""
+        binding.rfidTagTv.text = ""
+    }
+
+    companion object {
+        /**
+         * 显示对话框并设置确认回调
+         */
+        @JvmStatic
+        fun show(
+            workstationData: List<TextDropDownDialog.TextDropDownEntity>,
+            rfidTokenData: List<TextDropDownDialog.TextDropDownEntity>,
+            onConfirm: (AddPointManageVo) -> Unit
+        ) {
+            CustomDialog.show(
+                AddPointDialog(workstationData, rfidTokenData, onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
+        }
     }
-}
+}

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

@@ -1,209 +1,181 @@
 package com.grkj.iscs.features.main.dialog.data_manage
 
-import android.content.Context
 import android.view.View
 import androidx.core.view.isVisible
-import com.drake.brv.BindingAdapter
-import com.drake.brv.item.ItemDepth
-import com.drake.brv.item.ItemPosition
-import com.drake.brv.utils.bindingAdapter
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
-import com.grkj.data.model.vo.RoleManageFilterVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogAddRoleBinding
 import com.grkj.iscs.databinding.ItemRoleBinding
 import com.grkj.iscs.features.main.entity.AddRoleDataEntity
 import com.grkj.iscs.features.main.entity.RoleManageFunctionalPermissionsEntity
+import com.kongzue.dialogx.dialogs.CustomDialog
+import com.kongzue.dialogx.interfaces.OnBindView
 import me.jessyan.autosize.utils.AutoSizeUtils
-import razerdp.basepopup.BasePopupWindow
+import com.grkj.ui_base.utils.CommonUtils
 
 /**
- * 添加角色
+ * 添加角色对话框,基于 DialogX
+ * 使用:AddRoleDialog.show { addRoleData -> ... }
  */
-class AddRoleDialog(context: Context) : BasePopupWindow(context) {
-    private var onConfirm: (AddRoleDataEntity) -> Unit = {}
+class AddRoleDialog(
+    private val onConfirm: (AddRoleDataEntity) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_add_role) {
+
     private lateinit var binding: DialogAddRoleBinding
-    private val indentPx: Int by lazy { AutoSizeUtils.dp2px(context, 20f) }
-    private var roleManageFunctionalPermissionsData =
-        RoleManageFunctionalPermissionsEntity.getFunctionalPermissions().reversed()
-    private var selectedPermission: MutableList<String> = mutableListOf()
+    private val indentPx: Int by lazy { AutoSizeUtils.dp2px(binding.root.context, 20f) }
+    private var roleData = RoleManageFunctionalPermissionsEntity
+        .getFunctionalPermissions()
+        .reversed()
+        .toMutableList()
+    private val selectedPermission = mutableListOf<String>()
 
-    init {
-        setContentView(R.layout.dialog_add_role)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogAddRoleBinding.bind(v)
+        // 遮罩色
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogAddRoleBinding.bind(contentView)
+        // 关闭
         binding.closeIv.setOnClickListener {
-            dismiss()
+            dialog?.dismiss()
             clearData()
         }
+        // 确认
         binding.confirm.setOnClickListener {
-            val addRoleDataEntity = AddRoleDataEntity()
-            addRoleDataEntity.roleName = binding.roleNameEt.text.toString()
-            addRoleDataEntity.roleKeys = binding.roleKeyEt.text.toString()
-            addRoleDataEntity.status = if (binding.statusRg.checkedRadioButtonId == -1) {
-                null
-            } else {
-                binding.statusRg.checkedRadioButtonId == binding.activateRb.id
+            val data = AddRoleDataEntity().apply {
+                roleName = binding.roleNameEt.text.toString()
+                roleKeys = binding.roleKeyEt.text.toString()
+                status = when (binding.statusRg.checkedRadioButtonId) {
+                    binding.activateRb.id -> true
+                    binding.deactivateRb.id -> false
+                    else -> null
+                }
+                functionalPermissions = collectSelected(roleData)
             }
-            addRoleDataEntity.functionalPermissions = getSelectedFunctionalPermissions()
-            onConfirm(addRoleDataEntity)
-            dismiss()
+            onConfirm(data)
+            dialog?.dismiss()
             clearData()
         }
+        // 取消
         binding.cancel.setOnClickListener {
-            dismiss()
+            dialog?.dismiss()
             clearData()
         }
+
+        // 列表
         binding.roleListRv.linear().setup {
             addType<RoleManageFunctionalPermissionsEntity>(R.layout.item_role)
             onBind {
-                onRoleRVListBinding(this)
-            }
-        }.models = roleManageFunctionalPermissionsData
-        binding.expandCollapse.setOnCheckedChangeListener { _, isChecked ->
-            roleManageFunctionalPermissionsData =
-                RoleManageFunctionalPermissionsEntity.getFunctionalPermissions().reversed()
-            expandOrCollapseAll(isChecked, roleManageFunctionalPermissionsData)
-            if (binding.allSelected.isChecked) {
-                selectAllOrNone(true, roleManageFunctionalPermissionsData)
-            } else {
-                setSelectedData(roleManageFunctionalPermissionsData)
+                val item = getModel<RoleManageFunctionalPermissionsEntity>()
+                val itemBinding = getBinding<ItemRoleBinding>()
+                // 缩进
+                itemBinding.rootLayout.setPadding(indentPx * item.level, 0, 0, 0)
+                // 展开/收起
+                itemBinding.rootLayout.setOnClickListener {
+                    if (item.itemExpand) collapse() else expand()
+                    itemBinding.arrowIv.rotation = if (item.itemExpand) 90f else 0f
+                }
+                itemBinding.arrowIv.rotation = if (item.itemExpand) 90f else 0f
+                // 文本和选中
+                itemBinding.roleTv.text = item.description
+                itemBinding.roleCb.setOnCheckedChangeListener(null)
+                itemBinding.roleCb.isChecked = item.isSelected
+                itemBinding.roleCb.setOnCheckedChangeListener { _, checked ->
+                    item.isSelected = checked
+                    // 子节点同步
+                    if (item.children.isNotEmpty()) syncChildren(item, checked)
+                    // 收集权限
+                    if (checked) selectedPermission += item.functionalPermission
+                    else selectedPermission.remove(item.functionalPermission)
+                    binding.allSelected.isChecked = roleData.all { it.allSelectedRecursively() }
+                    binding.roleListRv.adapter?.notifyDataSetChanged()
+                }
             }
-            binding.roleListRv.models = roleManageFunctionalPermissionsData
+        }.models = roleData
+
+        // 全部展开/收起
+        binding.expandCollapse.setOnCheckedChangeListener { _, expand ->
+            toggleExpand(roleData, expand)
+            binding.allSelected.isChecked = expand && roleData.all { it.allSelectedRecursively() }
+            binding.roleListRv.models = roleData
+        }
+
+        // 全选/全不选
+        binding.allSelected.setOnCheckedChangeListener { _, allSel ->
+            syncAll(roleData, allSel)
+            binding.roleListRv.adapter?.notifyDataSetChanged()
         }
-        setSelectAllListener()
     }
 
+    // 清空输入和状态
     private fun clearData() {
-        binding.roleNameEt.setText("")
-        binding.roleKeyEt.setText("")
+        binding.roleNameEt.text?.clear()
+        binding.roleKeyEt.text?.clear()
         binding.statusRg.clearCheck()
         binding.expandCollapse.isChecked = false
         binding.allSelected.isChecked = false
-        roleManageFunctionalPermissionsData =
-            RoleManageFunctionalPermissionsEntity.getFunctionalPermissions().reversed()
-        binding.roleListRv.models = roleManageFunctionalPermissionsData
+        roleData = RoleManageFunctionalPermissionsEntity.getFunctionalPermissions().reversed().toMutableList()
+        selectedPermission.clear()
+        binding.roleListRv.models = roleData
     }
 
-    private fun setSelectedData(dataList: List<RoleManageFunctionalPermissionsEntity>) {
-        dataList.forEach {
-            it.isSelected = selectedPermission.contains(it.functionalPermission)
-            setSelectedData(it.children)
+    // 子节点同步选中状态
+    private fun syncChildren(item: RoleManageFunctionalPermissionsEntity, checked: Boolean) {
+        item.children.forEach {
+            it.isSelected = checked
+            syncChildren(it, checked)
         }
     }
 
-    private fun setSelectAllListener() {
-        binding.allSelected.setOnCheckedChangeListener { _, isChecked ->
-            selectAllOrNone(isChecked, roleManageFunctionalPermissionsData)
-            binding.roleListRv.adapter?.notifyDataSetChanged()
-        }
-    }
-
-    /**
-     * 判断:以当前节点为根,自己和所有子孙节点是否都选中(isSelected == true)。
-     *
-     * @return 如果:当前节点本身 isSelected == true 且 所有 children 递归判断也是 true,则返回 true;否则返回 false。
-     */
-    fun RoleManageFunctionalPermissionsEntity.allSelectedRecursively(): Boolean {
-        // 如果自己没选中,直接返回 false
-        if (!isSelected) return false
-
-        // 递归检查所有子节点
-        children.forEach { child ->
-            if (!child.allSelectedRecursively()) return false
+    // 全局展开/收起
+    private fun toggleExpand(list: List<RoleManageFunctionalPermissionsEntity>, expand: Boolean) {
+        list.forEach {
+            it.itemExpand = expand
+            toggleExpand(it.children, expand)
         }
-        // 自己选中且所有子节点都选中
-        return true
     }
 
-    private fun expandOrCollapseAll(
-        isExpand: Boolean,
-        roleFunctionalPermissionsData: List<RoleManageFunctionalPermissionsEntity>
-    ) {
-        roleFunctionalPermissionsData.forEach {
-            it.itemExpand = isExpand
-            expandOrCollapseAll(isExpand, it.children)
+    // 全局同步选中
+    private fun syncAll(list: List<RoleManageFunctionalPermissionsEntity>, checked: Boolean) {
+        list.forEach {
+            it.isSelected = checked
+            if (checked) selectedPermission += it.functionalPermission
+            else selectedPermission.remove(it.functionalPermission)
+            syncAll(it.children, checked)
         }
     }
 
-    private fun selectAllOrNone(
-        isSelected: Boolean,
-        roleFunctionalPermissionsData: List<RoleManageFunctionalPermissionsEntity>
-    ) {
-        roleFunctionalPermissionsData.forEach {
-            if (isSelected) {
-                selectedPermission.add(it.functionalPermission)
-            } else {
-                selectedPermission.removeIf { selectedData -> selectedData == it.functionalPermission }
+    // 收集所有选中权限实体
+    private fun collectSelected(
+        list: List<RoleManageFunctionalPermissionsEntity>
+    ): MutableList<RoleManageFunctionalPermissionsEntity> {
+        val result = mutableListOf<RoleManageFunctionalPermissionsEntity>()
+        list.forEach {
+            if (it.isSelected) {
+                result += it
+                result += collectSelected(it.children)
             }
-            it.isSelected = isSelected
-            selectAllOrNone(isSelected, it.children)
         }
-        selectedPermission.distinct()
+        return result
     }
 
-    private fun getSelectedFunctionalPermissions(dataList: List<RoleManageFunctionalPermissionsEntity> = roleManageFunctionalPermissionsData): MutableList<RoleManageFunctionalPermissionsEntity> {
-        return mutableListOf<RoleManageFunctionalPermissionsEntity>().apply {
-            addAll(dataList.filter { it.isSelected })
-            dataList.filter { it.isSelected }.forEach {
-                addAll(getSelectedFunctionalPermissions(it.children))
-            }
-        }
-    }
-
-    private fun BindingAdapter.BindingViewHolder.onRoleRVListBinding(holder: BindingAdapter.BindingViewHolder) {
-        val itemBinding = holder.getBinding<ItemRoleBinding>()
-        val item = holder.getModel<RoleManageFunctionalPermissionsEntity>()
-        // ① 动态缩进
-        itemBinding.rootLayout.setPadding(indentPx * item.level, 0, 0, 0)
-        itemBinding.rootLayout.setOnClickListener {
-            if (item.itemExpand) {
-                itemBinding.arrowIv.rotation = 0f
-                holder.collapse()
-            } else {
-                itemBinding.arrowIv.rotation = 90f
-                holder.expand()
-            }
-        }
-        if (item.itemExpand) {
-            itemBinding.arrowIv.rotation = 90f
-        } else {
-            itemBinding.arrowIv.rotation = 0f
-        }
-        itemBinding.roleTv.text = item.description
-        itemBinding.roleCb.setOnCheckedChangeListener(null)
-        itemBinding.roleCb.isChecked = item.isSelected
-        itemBinding.roleCb.setOnCheckedChangeListener { _, isChecked ->
-            item.isSelected = isChecked
-            if (item.children.isNotEmpty()) {
-                selectAllOrNone(isChecked, item.children)
-            }
-            if (isChecked) {
-                selectedPermission.add(item.functionalPermission)
-            } else {
-                selectedPermission.removeIf { selectedData -> selectedData == item.functionalPermission }
-            }
-            checkAllSelect()
-            adapter.notifyDataSetChanged()
-        }
+    // 递归全选判断
+    private fun RoleManageFunctionalPermissionsEntity.allSelectedRecursively(): Boolean {
+        if (!isSelected) return false
+        return children.all { it.allSelectedRecursively() }
     }
 
-    private fun checkAllSelect() {
-        if (roleManageFunctionalPermissionsData.all { it.allSelectedRecursively() }) {
-            binding.allSelected.setOnCheckedChangeListener(null)
-            setSelectAllListener()
+    companion object {
+        /**
+         * 显示对话框并设置确认回调
+         */
+        @JvmStatic
+        fun show(onConfirm: (AddRoleDataEntity) -> Unit) {
+            CustomDialog.show(
+                AddRoleDialog(onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
         }
     }
-
-    /**
-     * 设置确认事件
-     */
-    fun setOnConfirmListener(onConfirm: (AddRoleDataEntity) -> Unit) {
-        this.onConfirm = onConfirm
-    }
-}
+}

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

@@ -1,6 +1,5 @@
 package com.grkj.iscs.features.main.dialog.data_manage
 
-import android.content.Context
 import android.view.View
 import androidx.core.view.isVisible
 import com.grkj.data.model.vo.AddUserDataVo
@@ -8,92 +7,86 @@ import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogAddUserBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.ui_base.config.ISCSConfig
+import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
-import razerdp.basepopup.BasePopupWindow
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 新增用户
+ * 新增用户对话框,基于 DialogX,支持多选角色和岗位
+ * 使用:
+ * AddUserDialog.show(
+ *     roleData, workstationData
+ * ) { addUserVo -> /* handle */ }
  */
-class AddUserDialog(context: Context) : BasePopupWindow(context) {
+class AddUserDialog(
+    private val roleData: List<TextDropDownDialog.TextDropDownEntity>,
+    private val workstationData: List<TextDropDownDialog.TextDropDownEntity>,
+    private val onConfirm: (AddUserDataVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_add_user) {
+
     private lateinit var binding: DialogAddUserBinding
-    private var textDropDownDialog: TextDropDownDialog
-    private var roleData: List<TextDropDownDialog.TextDropDownEntity> = listOf()
-    private var workstationData: List<TextDropDownDialog.TextDropDownEntity> = listOf()
-    private var selectedRoleData: List<TextDropDownDialog.TextDropDownEntity>? = null
-    private var selectedWorkstationData: List<TextDropDownDialog.TextDropDownEntity>? = null
-    private var onConfirm: (AddUserDataVo) -> Unit = {}
+    private var selectedRoles: List<TextDropDownDialog.TextDropDownEntity> = emptyList()
+    private var selectedWorkstations: List<TextDropDownDialog.TextDropDownEntity> = emptyList()
 
-    init {
-        setContentView(R.layout.dialog_add_user)
-        textDropDownDialog = TextDropDownDialog(context)
-        textDropDownDialog.setWidthAsAnchorView(true)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogAddUserBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogAddUserBinding.bind(contentView)
+        // 根据配置显示/隐藏工作站选择
         binding.workstationLayout.isVisible = ISCSConfig.isWorkstationOn
+
+        // 角色多选
         binding.roleTv.setOnClickListener {
-            textDropDownDialog.setData(roleData)
-            textDropDownDialog.setOnItemMultiSelectListener {
-                selectedRoleData = it
-                if (it?.isEmpty() == true) {
-                    binding.roleTv.text = ""
-                } else {
-                    binding.roleTv.text = it?.joinToString(",") { it.getShowText() }
-                }
+            TextDropDownDialog.showMulti(roleData, binding.roleTv) { list ->
+                selectedRoles = list.orEmpty()
+                binding.roleTv.text = selectedRoles.joinToString(",") { it.getShowText() }
             }
-            textDropDownDialog.showPopupWindow(binding.roleTv)
         }
+        // 岗位多选
         binding.workstationNameTv.setOnClickListener {
-            textDropDownDialog.setData(workstationData)
-            textDropDownDialog.setOnItemMultiSelectListener {
-                selectedWorkstationData = it
-                binding.workstationNameTv.text =  it?.joinToString(",") { it.getShowText() }
+            TextDropDownDialog.showMulti(workstationData, binding.workstationNameTv) { list ->
+                selectedWorkstations = list.orEmpty()
+                binding.workstationNameTv.text =
+                    selectedWorkstations.joinToString(",") { it.getShowText() }
             }
-            textDropDownDialog.showPopupWindow(binding.workstationNameTv)
         }
-        binding.cancel.setOnClickListener { dismiss() }
-        binding.closeIv.setOnClickListener { dismiss() }
+
+        // 取消/关闭
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+
+        // 确认
         binding.confirm.setOnClickListener {
-            if (checkData()) {
-                val addUserData = AddUserDataVo(
-                    binding.nicknameEt.text.toString(),
-                    binding.cardcodeEt.text.toString(),
-                    selectedRoleData?.map { it.getId() } ?: listOf(),
-                    selectedWorkstationData?.map { it.getId() } ?: listOf(),
-                    binding.statusRg.checkedRadioButtonId == binding.activateRb.id
-                )
-                onConfirm(addUserData)
-                binding.nicknameEt.setText("")
-                binding.cardcodeEt.setText("")
-                binding.roleTv.text = ""
-                binding.workstationNameTv.text = ""
-                binding.activateRb.isChecked = false
-                binding.deactivateRb.isChecked = false
-                dismiss()
-            }
+            if (!checkData()) return@setOnClickListener
+            val vo = AddUserDataVo(
+                binding.nicknameEt.text.toString(),
+                binding.cardcodeEt.text.toString(),
+                selectedRoles.map { it.getId() },
+                selectedWorkstations.map { it.getId() },
+                binding.statusRg.checkedRadioButtonId == binding.activateRb.id
+            )
+            onConfirm(vo)
+            dialog?.dismiss()
+            clearFields()
         }
     }
 
-    /**
-     * 检查数据
-     */
     private fun checkData(): Boolean {
-        if (binding.nicknameEt.text.trim().toString().isEmpty()) {
+        if (binding.nicknameEt.text.isNullOrBlank()) {
             PopTip.build().tipDialog(R.string.please_input_nickname)
             return false
         }
-        if (binding.cardcodeEt.text.trim().toString().isEmpty()) {
+        if (binding.cardcodeEt.text.isNullOrBlank()) {
             PopTip.build().tipDialog(R.string.please_input_card_code)
             return false
         }
-        if (binding.roleTv.text.trim().toString().isEmpty()) {
+        if (selectedRoles.isEmpty()) {
             PopTip.build().tipDialog(R.string.please_select_role)
             return false
         }
-        if (binding.workstationNameTv.text.trim().toString().isEmpty()) {
+        if (ISCSConfig.isWorkstationOn && selectedWorkstations.isEmpty()) {
             PopTip.build().tipDialog(R.string.please_select_area)
             return false
         }
@@ -104,24 +97,30 @@ class AddUserDialog(context: Context) : BasePopupWindow(context) {
         return true
     }
 
-    /**
-     * 设置角色数据
-     */
-    fun setRoleData(roleData: List<TextDropDownDialog.TextDropDownEntity>) {
-        this.roleData = roleData
-    }
-
-    /**
-     * 设置岗位数据
-     */
-    fun setWorkstationData(workstationData: List<TextDropDownDialog.TextDropDownEntity>) {
-        this.workstationData = workstationData
+    private fun clearFields() {
+        binding.nicknameEt.text?.clear()
+        binding.cardcodeEt.text?.clear()
+        binding.roleTv.text = ""
+        binding.workstationNameTv.text = ""
+        selectedRoles = emptyList()
+        selectedWorkstations = emptyList()
+        binding.statusRg.clearCheck()
     }
 
-    /**
-     * 设置确认监听
-     */
-    fun setOnConfirmListener(onConfirm: (AddUserDataVo) -> Unit) {
-        this.onConfirm = onConfirm
+    companion object {
+        /**
+         * 显示新增用户对话框并设置确认回调
+         */
+        @JvmStatic
+        fun show(
+            roleData: List<TextDropDownDialog.TextDropDownEntity>,
+            workstationData: List<TextDropDownDialog.TextDropDownEntity>,
+            onConfirm: (AddUserDataVo) -> Unit
+        ) {
+            CustomDialog.show(
+                AddUserDialog(roleData, workstationData, onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
+        }
     }
-}
+}

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

@@ -1,56 +1,53 @@
 package com.grkj.iscs.features.main.dialog.data_manage
 
-import android.content.Context
 import android.view.View
-import com.grkj.data.model.vo.AddUserDataVo
 import com.grkj.iscs.R
-import com.grkj.iscs.databinding.DialogAddUserBinding
 import com.grkj.iscs.databinding.DialogAddWorkstationBinding
-import com.grkj.iscs.features.main.dialog.TextDropDownDialog
+import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
-import razerdp.basepopup.BasePopupWindow
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 新增区域
+ * 新增区域对话框,基于 DialogX
+ * 使用:
+ * AddWorkstationDialog.show { name -> /* handle */ }
  */
-class AddWorkstationDialog(context: Context) : BasePopupWindow(context) {
+class AddWorkstationDialog(
+    private val onConfirm: (String) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_add_workstation) {
+
     private lateinit var binding: DialogAddWorkstationBinding
-    private var onConfirm: (String) -> Unit = {}
 
-    init {
-        setContentView(R.layout.dialog_add_workstation)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogAddWorkstationBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogAddWorkstationBinding.bind(contentView)
-        binding.cancel.setOnClickListener { dismiss() }
-        binding.closeIv.setOnClickListener { dismiss() }
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
         binding.confirm.setOnClickListener {
-            if (checkData()) {
-                onConfirm(binding.workstationNameEt.text.toString())
-                binding.workstationNameEt.setText("")
-                dismiss()
+            val name = binding.workstationNameEt.text.trim().toString()
+            if (name.isEmpty()) {
+                PopTip.build().tipDialog(R.string.please_input_workstation_name)
+            } else {
+                onConfirm(name)
+                dialog?.dismiss()
+                binding.workstationNameEt.text?.clear()
             }
         }
     }
 
-    /**
-     * 检查数据
-     */
-    private fun checkData(): Boolean {
-        if (binding.workstationNameEt.text.trim().toString().isEmpty()) {
-            PopTip.build().tipDialog(R.string.please_input_workstation_name)
-            return false
+    companion object {
+        /**
+         * 显示新增区域对话框
+         */
+        @JvmStatic
+        fun show(onConfirm: (String) -> Unit) {
+            CustomDialog.show(
+                AddWorkstationDialog(onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
         }
-        return true
-    }
-
-    /**
-     * 设置确认监听
-     */
-    fun setOnConfirmListener(onConfirm: (String) -> Unit) {
-        this.onConfirm = onConfirm
     }
-}
+}

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

@@ -1,93 +1,100 @@
 package com.grkj.iscs.features.main.dialog.data_manage
 
-import android.content.Context
 import android.view.View
+import androidx.core.view.isVisible
+import com.grkj.data.enums.IsolationPointPowerTypeEnum
 import com.grkj.data.model.vo.PointManageFilterVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogFilterPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
-import com.grkj.data.enums.IsolationPointPowerTypeEnum
-import razerdp.basepopup.BasePopupWindow
+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
 
 /**
- * 筛选隔离点
+ * 筛选隔离点对话框,基于 DialogX
+ * 使用:
+ * FilterPointDialog.show(
+ *     workstationData
+ * ) { filterVo -> /* handle */ }
  */
-class FilterPointDialog(context: Context) : BasePopupWindow(context) {
-    private var onConfirm: (PointManageFilterVo) -> Unit = {}
-    private var textDropDownDialog: TextDropDownDialog
-    private var workstationData: List<TextDropDownDialog.TextDropDownEntity> = mutableListOf()
-    private var selectPowerType: TextDropDownDialog.TextDropDownEntity? = null
-    private var selectWorkstation: TextDropDownDialog.TextDropDownEntity? = null
-    private lateinit var binding: DialogFilterPointBinding
+class FilterPointDialog(
+    private val workstationData: List<TextDropDownDialog.TextDropDownEntity>,
+    private val onConfirm: (PointManageFilterVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_filter_point) {
 
-    init {
-        setContentView(R.layout.dialog_filter_point)
-        textDropDownDialog = TextDropDownDialog(context)
-        textDropDownDialog.setWidthAsAnchorView(true)
+    private lateinit var binding: DialogFilterPointBinding
 
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogFilterPointBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogFilterPointBinding.bind(contentView)
+        // 电源类型单选
         binding.powerTypeTv.setOnClickListener {
-            setPointPowerType()
-            textDropDownDialog.showPopupWindow(binding.powerTypeTv)
+            val list = IsolationPointPowerTypeEnum.values().map {
+                TextDropDownDialog.SimpleTextDropDownEntity(
+                    dataId = 0L,
+                    dataObject = null,
+                    dataTag = it.name,
+                    dataText = it.description
+                )
+            }
+            TextDropDownDialog.showSingle(list,binding.powerTypeTv) { item ->
+                binding.powerTypeTv.text = item.getShowText()
+                binding.powerTypeTv.tag = item.getTag()
+            }
         }
+
+        // 工作站单选
         binding.workstationTv.setOnClickListener {
-            textDropDownDialog.setData(workstationData)
-            textDropDownDialog.setOnItemSelectListener {
-                selectWorkstation = it
-                binding.workstationTv.text = it.getShowText()
+            TextDropDownDialog.showSingle(workstationData,binding.workstationTv) { item ->
+                binding.workstationTv.text = item.getShowText()
+                binding.workstationTv.tag = item.getId()
             }
-            textDropDownDialog.showPopupWindow(binding.workstationTv)
         }
-        binding.closeIv.setOnClickListener { dismiss() }
+
+        // 关闭
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+
+        // 确认
         binding.confirm.setOnClickListener {
-            val filterData = PointManageFilterVo(
+            // 构建筛选条件
+            val filter = PointManageFilterVo(
                 binding.pointNameTv.text.toString(),
                 binding.functionEt.text.toString(),
-                selectPowerType?.getTag(),
-                selectWorkstation?.getId(),
+                binding.powerTypeTv.tag as String?,
+                binding.workstationTv.tag as Long?,
                 binding.rfidTagEt.text.toString()
             )
-            onConfirm(filterData)
-            dismiss()
-            binding.pointNameTv.setText("")
-            binding.functionEt.setText("")
-            binding.powerTypeTv.text = ""
-            binding.workstationTv.text = ""
-            binding.rfidTagEt.setText("")
-            selectPowerType = null
-            selectWorkstation = null
-        }
-        binding.cancel.setOnClickListener {
-            dismiss()
+            onConfirm(filter)
+            dialog?.dismiss()
+            clearFields()
         }
     }
 
-    fun setWorkstationData(workstationData: List<TextDropDownDialog.TextDropDownEntity>) {
-        this.workstationData = workstationData
+    private fun clearFields() {
+        binding.pointNameTv.text?.clear()
+        binding.functionEt.text?.clear()
+        binding.powerTypeTv.text = ""
+        binding.workstationTv.text = ""
+        binding.rfidTagEt.text?.clear()
     }
 
-    private fun setPointPowerType() {
-        textDropDownDialog.setData(
-            IsolationPointPowerTypeEnum.values().map {
-                TextDropDownDialog.SimpleTextDropDownEntity(
-                    dataTag = it.name,
-                    dataText = it.description
-                )
-            })
-        textDropDownDialog.setOnItemSelectListener {
-            selectPowerType = it
-            binding.powerTypeTv.text = it.getShowText()
+    companion object {
+        /**
+         * 显示筛选对话框并设置回调
+         */
+        @JvmStatic
+        fun show(
+            workstationData: List<TextDropDownDialog.TextDropDownEntity>,
+            onConfirm: (PointManageFilterVo) -> Unit
+        ) {
+            CustomDialog.show(
+                FilterPointDialog(workstationData, onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
         }
     }
-
-    /**
-     * 设置确认事件
-     */
-    fun setOnConfirmListener(onConfirm: (PointManageFilterVo) -> Unit) {
-        this.onConfirm = onConfirm
-    }
 }

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

@@ -1,53 +1,64 @@
 package com.grkj.iscs.features.main.dialog.data_manage
 
-import android.content.Context
 import android.view.View
 import com.grkj.data.model.vo.RoleManageFilterVo
-import com.grkj.data.model.vo.UserManageFilterVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogFilterRoleBinding
-import com.grkj.iscs.databinding.DialogFilterUserBinding
-import razerdp.basepopup.BasePopupWindow
+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
 
 /**
- * 筛选角色
+ * 筛选角色对话框,基于 DialogX
+ * 使用:
+ * FilterRoleDialog.show { filterVo -> /* handle */ }
  */
-class FilterRoleDialog(context: Context) : BasePopupWindow(context) {
-    private var onConfirm: (RoleManageFilterVo) -> Unit = {}
+class FilterRoleDialog(
+    private val onConfirm: (RoleManageFilterVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_filter_role) {
+
     private lateinit var binding: DialogFilterRoleBinding
 
-    init {
-        setContentView(R.layout.dialog_filter_role)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogFilterRoleBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
+
+        // 关闭/取消
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogFilterRoleBinding.bind(contentView)
-        binding.closeIv.setOnClickListener { dismiss() }
+        // 确认筛选
         binding.confirm.setOnClickListener {
-            val filterData = RoleManageFilterVo(
-                binding.roleNameTv.text.toString(),
-                binding.roleKeyEt.text.toString(),
-                if (binding.statusRg.checkedRadioButtonId == -1) {
-                    null
-                } else {
-                    binding.statusRg.checkedRadioButtonId == binding.activateRb.id
-                }
-            )
-            onConfirm(filterData)
-            dismiss()
-            binding.roleNameTv.setText("")
-            binding.roleKeyEt.setText("")
-        }
-        binding.cancel.setOnClickListener {
-            dismiss()
+            val name = binding.roleNameTv.text.trim().toString()
+            val key = binding.roleKeyEt.text.trim().toString()
+            val status = when (binding.statusRg.checkedRadioButtonId) {
+                binding.activateRb.id -> true
+                binding.deactivateRb.id -> false
+                else -> null
+            }
+            onConfirm(RoleManageFilterVo(name, key, status))
+            dialog?.dismiss()
+            clearFields()
         }
     }
 
-    /**
-     * 设置确认事件
-     */
-    fun setOnConfirmListener(onConfirm: (RoleManageFilterVo) -> Unit) {
-        this.onConfirm = onConfirm
+    private fun clearFields() {
+        binding.roleNameTv.text?.clear()
+        binding.roleKeyEt.text?.clear()
+        binding.statusRg.clearCheck()
+    }
+
+    companion object {
+        /**
+         * 显示筛选角色对话框并设置回调
+         */
+        @JvmStatic
+        fun show(onConfirm: (RoleManageFilterVo) -> Unit) {
+            CustomDialog.show(
+                FilterRoleDialog(onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
+        }
     }
-}
+}

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

@@ -1,56 +1,77 @@
 package com.grkj.iscs.features.main.dialog.data_manage
 
-import android.content.Context
 import android.view.View
 import androidx.core.view.isVisible
 import com.grkj.data.model.vo.UserManageFilterVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogFilterUserBinding
 import com.grkj.ui_base.config.ISCSConfig
-import razerdp.basepopup.BasePopupWindow
+import com.grkj.ui_base.utils.CommonUtils
+import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
+import com.kongzue.dialogx.dialogs.PopTip
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 筛选用户
+ * 筛选用户对话框,基于 DialogX
+ * 使用:
+ * FilterUserDialog.show { filterVo -> /* handle */ }
  */
-class FilterUserDialog(context: Context) : BasePopupWindow(context) {
-    private var onConfirm: (UserManageFilterVo) -> Unit = {}
-    private lateinit var binding: DialogFilterUserBinding
+class FilterUserDialog(
+    private val onConfirm: (UserManageFilterVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_filter_user) {
 
-    init {
-        setContentView(R.layout.dialog_filter_user)
-    }
+    private lateinit var binding: DialogFilterUserBinding
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogFilterUserBinding.bind(contentView)
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogFilterUserBinding.bind(v)
+        // 设置遮罩色
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
+        // 根据配置显示/隐藏工作站输入
         binding.workstationLayout.isVisible = ISCSConfig.isWorkstationOn
-        binding.closeIv.setOnClickListener { dismiss() }
+
+        // 关闭/取消
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+
+        // 确认
         binding.confirm.setOnClickListener {
-            val filterData = UserManageFilterVo(
-                binding.nicknameEt.text.toString(),
-                binding.cardcodeEt.text.toString(),
-                binding.workstationEt.text.toString(),
-                if (binding.statusRg.checkedRadioButtonId == -1) {
-                    null
-                } else {
-                    binding.statusRg.checkedRadioButtonId == binding.activateRb.id
-                }
-            )
-            onConfirm(filterData)
-            dismiss()
-            binding.nicknameEt.setText("")
-            binding.cardcodeEt.setText("")
-            binding.workstationEt.setText("")
-        }
-        binding.cancel.setOnClickListener {
-            dismiss()
+            val name = binding.nicknameEt.text.trim().toString()
+            val card = binding.cardcodeEt.text.trim().toString()
+            val station = binding.workstationEt.text.trim().toString()
+            val status = when (binding.statusRg.checkedRadioButtonId) {
+                binding.activateRb.id -> true
+                binding.deactivateRb.id -> false
+                else -> null
+            }
+            if (name.isEmpty() || card.isEmpty() || (ISCSConfig.isWorkstationOn && station.isEmpty()) || status == null) {
+                PopTip.build().tipDialog(
+                    when {
+                        name.isEmpty() -> R.string.please_input_nickname
+                        card.isEmpty() -> R.string.please_input_card_code
+                        ISCSConfig.isWorkstationOn && station.isEmpty() -> R.string.please_select_area
+                        else -> R.string.please_select_status
+                    }
+                )
+                return@setOnClickListener
+            }
+            onConfirm(UserManageFilterVo(name, card, station, status))
+            dialog?.dismiss()
+            clearFields()
         }
     }
 
-    /**
-     * 设置确认事件
-     */
-    fun setOnConfirmListener(onConfirm: (UserManageFilterVo) -> Unit) {
-        this.onConfirm = onConfirm
+    private fun clearFields() {
+        binding.nicknameEt.text?.clear()
+        binding.cardcodeEt.text?.clear()
+        binding.workstationEt.text?.clear()
+        binding.statusRg.clearCheck()
+    }
+
+    companion object {
+        @JvmStatic
+        fun show(onConfirm: (UserManageFilterVo) -> Unit) {
+            CustomDialog.show(FilterUserDialog(onConfirm), CustomDialog.ALIGN.CENTER)
+        }
     }
-}
+}

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

@@ -1,158 +1,145 @@
 package com.grkj.iscs.features.main.dialog.data_manage
 
-import android.content.Context
 import android.view.View
-import com.grkj.iscs.R
-import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.data.enums.IsolationPointPowerTypeEnum
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UpdatePointManageVo
+import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogUpdatePointBinding
+import com.grkj.iscs.features.main.dialog.TextDropDownDialog
+import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
-import razerdp.basepopup.BasePopupWindow
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 修改隔离点
+ * 修改隔离点对话框,基于 DialogX
+ * 使用:
+ * UpdatePointDialog.show(
+ *     pointVo, workstationData, rfidData
+ * ) { updateVo -> /* handle */ }
  */
-class UpdatePointDialog(context: Context) : BasePopupWindow(context) {
-    private var onConfirm: (UpdatePointManageVo) -> Unit = {}
-    private var pointId: Long = 0
-    private var textDropDownDialog: TextDropDownDialog
-    private var workstationData: List<TextDropDownDialog.TextDropDownEntity> = mutableListOf()
-    private var rfidTokenData: List<TextDropDownDialog.TextDropDownEntity> = mutableListOf()
-    private var selectPowerType: TextDropDownDialog.TextDropDownEntity? = null
-    private var selectWorkstation: TextDropDownDialog.TextDropDownEntity? = null
-    private var selectRfidToken: TextDropDownDialog.TextDropDownEntity? = null
-    private val powerTypeData: List<TextDropDownDialog.TextDropDownEntity> by lazy {
+class UpdatePointDialog(
+    private val pointVo: PointManageVo,
+    private val workstationData: List<TextDropDownDialog.TextDropDownEntity>,
+    private val rfidData: List<TextDropDownDialog.TextDropDownEntity>,
+    private val onConfirm: (UpdatePointManageVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_update_point) {
+
+    private lateinit var binding: DialogUpdatePointBinding
+    private val powerTypeList by lazy {
         IsolationPointPowerTypeEnum.values().map {
             TextDropDownDialog.SimpleTextDropDownEntity(
+                dataId = 0L,
+                dataObject = null,
                 dataTag = it.name,
                 dataText = it.description
             )
         }
     }
-    private lateinit var binding: DialogUpdatePointBinding
 
-    init {
-        setContentView(R.layout.dialog_update_point)
-        textDropDownDialog = TextDropDownDialog(context)
-        textDropDownDialog.setWidthAsAnchorView(true)
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogUpdatePointBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-    }
+        // 初始化
+        binding.pointNameTv.setText(pointVo.pointName)
+        binding.functionEt.setText(pointVo.pointFunction)
+        powerTypeList.find { it.getTag() == pointVo.powerType }?.also {
+            binding.powerTypeTv.text = it.getShowText()
+            binding.powerTypeTv.tag = it.getTag()
+        }
+        workstationData.find { it.getId() == pointVo.workstationId }?.also {
+            binding.workstationTv.text = it.getShowText()
+            binding.workstationTv.tag = it.getId()
+        }
+        rfidData.find { it.getId() == pointVo.rfidId }?.also {
+            binding.rfidTagTv.text = it.getShowText()
+            binding.rfidTagTv.tag = it.getId()
+        }
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogUpdatePointBinding.bind(contentView)
+        // 电源类型
         binding.powerTypeTv.setOnClickListener {
-            setPointPowerType()
-            textDropDownDialog.showPopupWindow(binding.powerTypeTv)
+            TextDropDownDialog.showSingle(powerTypeList,binding.powerTypeTv) { item ->
+                binding.powerTypeTv.text = item.getShowText()
+                binding.powerTypeTv.tag = item.getTag()
+            }
         }
+        // 工作站
         binding.workstationTv.setOnClickListener {
-            textDropDownDialog.setData(workstationData)
-            textDropDownDialog.setOnItemSelectListener {
-                selectWorkstation = it
-                binding.workstationTv.text = it.getShowText()
+            TextDropDownDialog.showSingle(workstationData,binding.workstationTv) { item ->
+                binding.workstationTv.text = item.getShowText()
+                binding.workstationTv.tag = item.getId()
             }
-            textDropDownDialog.showPopupWindow(binding.workstationTv)
         }
+        // RFID
         binding.rfidTagTv.setOnClickListener {
-            textDropDownDialog.setData(rfidTokenData)
-            textDropDownDialog.setOnItemSelectListener {
-                selectRfidToken = it
-                binding.rfidTagTv.text = it.getShowText()
-            }
-            textDropDownDialog.showPopupWindow(binding.rfidTagTv)
-        }
-        binding.closeIv.setOnClickListener { dismiss() }
-        binding.confirm.setOnClickListener {
-            if (checkData()) {
-                val updateData = UpdatePointManageVo(
-                    pointId,
-                    binding.pointNameTv.text.toString(),
-                    binding.functionEt.text.toString(),
-                    selectPowerType?.getTag(),
-                    selectWorkstation?.getId(),
-                    selectRfidToken?.getId()
-                )
-                onConfirm(updateData)
-                dismiss()
-                binding.pointNameTv.setText("")
-                binding.functionEt.setText("")
-                binding.powerTypeTv.text = ""
-                binding.workstationTv.text = ""
-                binding.rfidTagTv.text = ""
-                selectPowerType = null
-                selectWorkstation = null
+            TextDropDownDialog.showSingle(rfidData,binding.rfidTagTv) { item ->
+                binding.rfidTagTv.text = item.getShowText()
+                binding.rfidTagTv.tag = item.getId()
             }
         }
-        binding.cancel.setOnClickListener {
-            dismiss()
-        }
-    }
-
-    fun setWorkstationData(workstationData: List<TextDropDownDialog.TextDropDownEntity>) {
-        this.workstationData = workstationData
-    }
 
-    fun setRfidTokenData(rfidTokenData: List<TextDropDownDialog.TextDropDownEntity>) {
-        this.rfidTokenData = rfidTokenData
-    }
+        // 关闭/取消
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
 
-    fun setRfidData(pointManageVo: PointManageVo) {
-        pointId = pointManageVo.pointId
-        binding.pointNameTv.setText(pointManageVo.pointName.toString())
-        binding.functionEt.setText(pointManageVo.pointFunction)
-        powerTypeData.find { it.getTag() == pointManageVo.powerType }?.apply {
-            selectPowerType = this
-            binding.powerTypeTv.text = this.getShowText()
-        }
-        workstationData.find { it.getId() == pointManageVo.workstationId }?.apply {
-            selectWorkstation = this
-            binding.workstationTv.text = this.getShowText()
-        }
-        rfidTokenData.find { it.getId() == pointManageVo.rfidId }?.apply {
-            selectRfidToken = this
-            binding.rfidTagTv.text = this.getShowText()
-        }
-    }
-
-    private fun setPointPowerType() {
-        textDropDownDialog.setData(powerTypeData)
-        textDropDownDialog.setOnItemSelectListener {
-            selectPowerType = it
-            binding.powerTypeTv.text = it.getShowText()
+        // 确认
+        binding.confirm.setOnClickListener {
+            if (!validate()) return@setOnClickListener
+            val updateVo = UpdatePointManageVo(
+                pointVo.pointId,
+                binding.pointNameTv.text.toString(),
+                binding.functionEt.text.toString(),
+                binding.powerTypeTv.tag as String,
+                binding.workstationTv.tag as Long,
+                binding.rfidTagTv.tag as Long
+            )
+            onConfirm(updateVo)
+            dialog?.dismiss()
         }
     }
 
-    private fun checkData(): Boolean {
-        if (binding.pointNameTv.text.trim().toString().isEmpty()) {
+    private fun validate(): Boolean {
+        if (binding.pointNameTv.text.isNullOrBlank()) {
             PopTip.build().tipDialog(R.string.please_input_point_name)
             return false
         }
-        if (binding.functionEt.text.trim().toString().isEmpty()) {
+        if (binding.functionEt.text.isNullOrBlank()) {
             PopTip.build().tipDialog(R.string.please_input_point_function)
             return false
         }
-        if (selectPowerType == null) {
+        if (binding.powerTypeTv.tag == null) {
             PopTip.build().tipDialog(R.string.please_select_power_type)
             return false
         }
-        if (selectWorkstation == null) {
+        if (binding.workstationTv.tag == null) {
             PopTip.build().tipDialog(R.string.please_select_workstation)
             return false
         }
-        if (selectRfidToken == null) {
+        if (binding.rfidTagTv.tag == null) {
             PopTip.build().tipDialog(R.string.please_select_rfid_tag)
             return false
         }
         return true
     }
 
-    /**
-     * 设置确认事件
-     */
-    fun setOnConfirmListener(onConfirm: (UpdatePointManageVo) -> Unit) {
-        this.onConfirm = onConfirm
+    companion object {
+        /**
+         * 显示修改对话框并设置确认回调
+         */
+        @JvmStatic
+        fun show(
+            pointVo: PointManageVo,
+            workstationData: List<TextDropDownDialog.TextDropDownEntity>,
+            rfidData: List<TextDropDownDialog.TextDropDownEntity>,
+            onConfirm: (UpdatePointManageVo) -> Unit
+        ) {
+            CustomDialog.show(
+                UpdatePointDialog(pointVo, workstationData, rfidData, onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
+        }
     }
 }

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

@@ -1,238 +1,168 @@
 package com.grkj.iscs.features.main.dialog.data_manage
 
-import android.content.Context
 import android.view.View
-import com.drake.brv.BindingAdapter
 import com.drake.brv.utils.linear
 import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
-import com.grkj.data.dao.RoleDao
-import com.grkj.data.enums.RoleEnum
 import com.grkj.iscs.R
-import com.grkj.iscs.databinding.DialogAddRoleBinding
 import com.grkj.iscs.databinding.DialogUpdateRoleBinding
 import com.grkj.iscs.databinding.ItemRoleBinding
-import com.grkj.iscs.features.main.entity.AddRoleDataEntity
 import com.grkj.iscs.features.main.entity.RoleManageFunctionalPermissionsEntity
 import com.grkj.iscs.features.main.entity.UpdateRoleDataEntity
+import com.grkj.ui_base.utils.CommonUtils
+import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
+import com.kongzue.dialogx.dialogs.PopTip
+import com.kongzue.dialogx.interfaces.OnBindView
 import me.jessyan.autosize.utils.AutoSizeUtils
-import razerdp.basepopup.BasePopupWindow
 
 /**
- * 更新角色
+ * 修改角色对话框,基于 DialogX
+ * 使用:
+ * UpdateRoleDialog.show(updateEntity) { updated -> /* handle */ }
  */
-class UpdateRoleDialog(context: Context) : BasePopupWindow(context) {
-    private var onConfirm: (UpdateRoleDataEntity) -> Unit = {}
-    private lateinit var binding: DialogUpdateRoleBinding
-    private val indentPx: Int by lazy { AutoSizeUtils.dp2px(context, 20f) }
-    private var roleManageFunctionalPermissionsData =
-        RoleManageFunctionalPermissionsEntity.getFunctionalPermissions().reversed()
-    private var selectedPermission: MutableList<String> = mutableListOf()
-    private lateinit var updateRoleDataEntity: UpdateRoleDataEntity
-
-    init {
-        setContentView(R.layout.dialog_update_role)
-    }
+class UpdateRoleDialog(
+    private val updateEntity: UpdateRoleDataEntity,
+    private val onConfirm: (UpdateRoleDataEntity) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_update_role) {
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogUpdateRoleBinding.bind(contentView)
-        binding.closeIv.setOnClickListener {
-            dismiss()
-            clearData()
-        }
-        binding.confirm.setOnClickListener {
-            updateRoleDataEntity.roleName = binding.roleNameEt.text.toString()
-            updateRoleDataEntity.roleKeys = binding.roleKeyEt.text.toString()
-            updateRoleDataEntity.status = if (binding.statusRg.checkedRadioButtonId == -1) {
-                null
-            } else {
-                binding.statusRg.checkedRadioButtonId == binding.activateRb.id
-            }
-            updateRoleDataEntity.functionalPermissions = getSelectedFunctionalPermissions()
-            onConfirm(updateRoleDataEntity)
-            dismiss()
-            clearData()
-        }
-        binding.cancel.setOnClickListener {
-            dismiss()
-            clearData()
-        }
+    private lateinit var binding: DialogUpdateRoleBinding
+    private val indentPx: Int by lazy { AutoSizeUtils.dp2px(binding.root.context, 20f) }
+    private var selectedList = mutableListOf<String>()
+    private var treeData = RoleManageFunctionalPermissionsEntity
+        .getFunctionalPermissions()
+        .reversed()
+        .toMutableList()
+
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogUpdateRoleBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
+
+        // 预填数据
+        binding.roleNameEt.setText(updateEntity.roleName)
+        binding.roleKeyEt.setText(updateEntity.roleKeys)
+        binding.statusRg.clearCheck()
+        updateEntity.status?.let { binding.activateRb.isChecked = it }
+        selectedList.clear()
+        selectedList.addAll(updateEntity.functionalPermissions.map { it.functionalPermission })
+        markSelected(treeData)
         binding.roleListRv.linear().setup {
             addType<RoleManageFunctionalPermissionsEntity>(R.layout.item_role)
             onBind {
-                onRoleRVListBinding(this)
+                val item = getModel<RoleManageFunctionalPermissionsEntity>()
+                val itemBinding = getBinding<ItemRoleBinding>()
+                // 缩进
+                itemBinding.rootLayout.setPadding(indentPx * item.level, 0, 0, 0)
+                // 展开收起
+                itemBinding.arrowIv.rotation = if (item.itemExpand) 90f else 0f
+                itemBinding.rootLayout.setOnClickListener {
+                    if (item.itemExpand) collapse() else expand()
+                    item.itemExpand = !item.itemExpand
+                    itemBinding.arrowIv.rotation = if (item.itemExpand) 90f else 0f
+                }
+                // 选中
+                itemBinding.roleTv.text = item.description
+                itemBinding.roleCb.setOnCheckedChangeListener(null)
+                itemBinding.roleCb.isChecked = item.isSelected
+                itemBinding.roleCb.setOnCheckedChangeListener { _, checked ->
+                    item.isSelected = checked
+                    syncChildren(item, checked)
+                    binding.allSelected.isChecked = treeData.all { it.allSelectedRecursively() }
+                    binding.roleListRv.adapter?.notifyDataSetChanged()
+                }
             }
-        }.models = roleManageFunctionalPermissionsData
-        binding.expandCollapse.setOnCheckedChangeListener { _, isChecked ->
-            roleManageFunctionalPermissionsData =
-                RoleManageFunctionalPermissionsEntity.getFunctionalPermissions().reversed()
-            expandOrCollapseAll(isChecked, roleManageFunctionalPermissionsData)
-            if (binding.allSelected.isChecked) {
-                selectAllOrNone(true, roleManageFunctionalPermissionsData)
-            } else {
-                setSelectedData(roleManageFunctionalPermissionsData)
-            }
-            binding.roleListRv.models = roleManageFunctionalPermissionsData
-        }
-        setSelectAllListener()
-    }
+        }.models = treeData
 
-    private fun setSelectedData(dataList: List<RoleManageFunctionalPermissionsEntity>) {
-        dataList.forEach {
-            it.isSelected = selectedPermission.contains(it.functionalPermission)
-            setSelectedData(it.children)
+        // 全选展开控件
+        binding.expandCollapse.setOnCheckedChangeListener { _, expanded ->
+            toggleExpand(treeData, expanded)
+            binding.allSelected.isChecked = expanded && treeData.all { it.allSelectedRecursively() }
+            binding.roleListRv.models = treeData
+        }
+        binding.allSelected.setOnCheckedChangeListener { _, selectAll ->
+            toggleSelect(treeData, selectAll)
+            binding.roleListRv.adapter?.notifyDataSetChanged()
         }
-    }
 
-    private fun clearData() {
-        binding.roleNameEt.setText("")
-        binding.roleKeyEt.setText("")
-        binding.statusRg.clearCheck()
-        binding.expandCollapse.isChecked = false
-        binding.allSelected.isChecked = false
-        binding.roleListRv.models = null
-    }
+        // 取消
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
 
-    private fun getSelectedData(
-        dataList: List<RoleManageFunctionalPermissionsEntity>,
-        selectedPermission: MutableList<String> = mutableListOf()
-    ): MutableList<String> {
-        dataList.forEach {
-            if (it.isSelected) {
-                selectedPermission.add(it.functionalPermission)
+        // 确认
+        binding.confirm.setOnClickListener {
+            if (binding.roleNameEt.text.isNullOrBlank()) {
+                PopTip.build().tipDialog(R.string.please_input_role_name)
+                return@setOnClickListener
             }
-            getSelectedData(it.children, selectedPermission)
+            updateEntity.roleName = binding.roleNameEt.text.toString()
+            updateEntity.roleKeys = binding.roleKeyEt.text.toString()
+            updateEntity.status = binding.activateRb.isChecked
+            // 收集权限
+            updateEntity.functionalPermissions = collectSelected(treeData)
+            onConfirm(updateEntity)
+            dialog?.dismiss()
         }
-        return selectedPermission
     }
 
-    private fun setSelectAllListener() {
-        binding.allSelected.setOnCheckedChangeListener { _, isChecked ->
-            selectAllOrNone(isChecked, roleManageFunctionalPermissionsData)
-            binding.roleListRv.adapter?.notifyDataSetChanged()
+    private fun markSelected(data: List<RoleManageFunctionalPermissionsEntity>) {
+        data.forEach {
+            it.isSelected = selectedList.contains(it.functionalPermission)
+            markSelected(it.children)
         }
     }
 
-    /**
-     * 判断:以当前节点为根,自己和所有子孙节点是否都选中(isSelected == true)。
-     *
-     * @return 如果:当前节点本身 isSelected == true 且 所有 children 递归判断也是 true,则返回 true;否则返回 false。
-     */
-    fun RoleManageFunctionalPermissionsEntity.allSelectedRecursively(): Boolean {
-        // 如果自己没选中,直接返回 false
-        if (!isSelected) return false
-
-        // 递归检查所有子节点
-        children.forEach { child ->
-            if (!child.allSelectedRecursively()) return false
+    private fun syncChildren(item: RoleManageFunctionalPermissionsEntity, checked: Boolean) {
+        item.children.forEach {
+            it.isSelected = checked
+            syncChildren(it, checked)
         }
-        // 自己选中且所有子节点都选中
-        return true
     }
 
-    private fun expandOrCollapseAll(
-        isExpand: Boolean,
-        roleFunctionalPermissionsData: List<RoleManageFunctionalPermissionsEntity>
-    ) {
-        roleFunctionalPermissionsData.forEach {
-            it.itemExpand = isExpand
-            expandOrCollapseAll(isExpand, it.children)
+    private fun toggleExpand(data: List<RoleManageFunctionalPermissionsEntity>, expand: Boolean) {
+        data.forEach {
+            it.itemExpand = expand
+            toggleExpand(it.children, expand)
         }
     }
 
-    private fun selectAllOrNone(
-        isSelected: Boolean,
-        roleFunctionalPermissionsData: List<RoleManageFunctionalPermissionsEntity>
-    ) {
-        roleFunctionalPermissionsData.forEach {
-            if (isSelected) {
-                selectedPermission.add(it.functionalPermission)
-            } else {
-                selectedPermission.removeIf { selectedData -> selectedData == it.functionalPermission }
-            }
-            it.isSelected = isSelected
-            selectAllOrNone(isSelected, it.children)
+    private fun toggleSelect(data: List<RoleManageFunctionalPermissionsEntity>, select: Boolean) {
+        data.forEach {
+            it.isSelected = select
+            toggleSelect(it.children, select)
         }
-        selectedPermission.distinct()
     }
 
-    private fun getSelectedFunctionalPermissions(dataList: List<RoleManageFunctionalPermissionsEntity> = roleManageFunctionalPermissionsData): MutableList<RoleManageFunctionalPermissionsEntity> {
-        return mutableListOf<RoleManageFunctionalPermissionsEntity>().apply {
-            addAll(dataList.filter { it.isSelected })
-            dataList.filter { it.isSelected }.forEach {
-                addAll(getSelectedFunctionalPermissions(it.children))
+    private fun collectSelected(
+        data: List<RoleManageFunctionalPermissionsEntity>
+    ): MutableList<RoleManageFunctionalPermissionsEntity> {
+        val res = mutableListOf<RoleManageFunctionalPermissionsEntity>()
+        data.forEach {
+            if (it.isSelected) {
+                res += it
+                res += collectSelected(it.children)
             }
         }
+        return res
     }
 
-    private fun BindingAdapter.BindingViewHolder.onRoleRVListBinding(holder: BindingAdapter.BindingViewHolder) {
-        val itemBinding = holder.getBinding<ItemRoleBinding>()
-        val item = holder.getModel<RoleManageFunctionalPermissionsEntity>()
-        // ① 动态缩进
-        itemBinding.rootLayout.setPadding(indentPx * item.level, 0, 0, 0)
-        itemBinding.rootLayout.setOnClickListener {
-            if (item.itemExpand) {
-                itemBinding.arrowIv.rotation = 0f
-                holder.collapse()
-            } else {
-                itemBinding.arrowIv.rotation = 90f
-                holder.expand()
-            }
-        }
-        if (item.itemExpand) {
-            itemBinding.arrowIv.rotation = 90f
-        } else {
-            itemBinding.arrowIv.rotation = 0f
-        }
-        itemBinding.roleTv.text = item.description
-        itemBinding.roleCb.setOnCheckedChangeListener(null)
-        itemBinding.roleCb.isChecked = item.isSelected || item.children.any { it.isSelected }
-        itemBinding.roleCb.setOnCheckedChangeListener { _, isChecked ->
-            item.isSelected = isChecked
-            if (item.children.isNotEmpty()) {
-                selectAllOrNone(isChecked, item.children)
-            }
-            holder.findParentViewHolder()?.let {
-                val parentItem = it.getModel<RoleManageFunctionalPermissionsEntity>()
-                parentItem.isSelected = parentItem.children.any { it.isSelected }
-            }
-            if (isChecked) {
-                selectedPermission.add(item.functionalPermission)
-            } else {
-                selectedPermission.removeIf { selectedData -> selectedData == item.functionalPermission }
-            }
-            checkAllSelect()
-            adapter.notifyDataSetChanged()
-        }
+    private fun RoleManageFunctionalPermissionsEntity.allSelectedRecursively(): Boolean {
+        if (!isSelected) return false
+        return children.all { it.allSelectedRecursively() }
     }
 
-    private fun checkAllSelect() {
-        if (roleManageFunctionalPermissionsData.all { it.allSelectedRecursively() }) {
-            binding.allSelected.setOnCheckedChangeListener(null)
-            setSelectAllListener()
+    companion object {
+        /**
+         * 展示修改角色对话框
+         */
+        @JvmStatic
+        fun show(
+            updateEntity: UpdateRoleDataEntity,
+            onConfirm: (UpdateRoleDataEntity) -> Unit
+        ) {
+            CustomDialog.show(
+                UpdateRoleDialog(updateEntity, onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
         }
     }
-
-    /**
-     * 设置角色数据
-     */
-    fun setRoleData(updateRoleDataEntity: UpdateRoleDataEntity) {
-        this.updateRoleDataEntity = updateRoleDataEntity
-        binding.roleNameEt.setText(updateRoleDataEntity.roleName)
-        binding.roleKeyEt.setText(updateRoleDataEntity.roleKeys)
-        binding.activateRb.isChecked = updateRoleDataEntity.status == true
-        binding.roleKeyEt.isEnabled = updateRoleDataEntity.isPreset ==false
-        this.selectedPermission.clear()
-        this.selectedPermission.addAll(getSelectedData(updateRoleDataEntity.functionalPermissions))
-        setSelectedData(roleManageFunctionalPermissionsData)
-        binding.roleListRv.models = roleManageFunctionalPermissionsData
-    }
-
-    /**
-     * 设置确认事件
-     */
-    fun setOnConfirmListener(onConfirm: (UpdateRoleDataEntity) -> Unit) {
-        this.onConfirm = onConfirm
-    }
 }

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

@@ -1,158 +1,113 @@
 package com.grkj.iscs.features.main.dialog.data_manage
 
-import android.content.Context
 import android.view.View
 import androidx.core.view.isVisible
-import com.grkj.data.model.vo.AddUserDataVo
 import com.grkj.data.model.vo.UpdateUserDataVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogUpdateUserBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
 import com.grkj.ui_base.config.ISCSConfig
+import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
-import razerdp.basepopup.BasePopupWindow
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 更新用户
+ * 更新用户对话框,基于 DialogX,支持多选角色和岗位
+ * 使用:
+ * UpdateUserDialog.show(
+ *     userVo, roleData, workstationData
+ * ) { updateVo -> /* handle */ }
  */
-class UpdateUserDialog(context: Context) : BasePopupWindow(context) {
+class UpdateUserDialog(
+    private val userVo: UserManageVo,
+    private val roleData: List<TextDropDownDialog.TextDropDownEntity>,
+    private val workstationData: List<TextDropDownDialog.TextDropDownEntity>,
+    private val onConfirm: (UpdateUserDataVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_update_user) {
+
     private lateinit var binding: DialogUpdateUserBinding
-    private var textDropDownDialog: TextDropDownDialog
-    private var roleData: List<TextDropDownDialog.TextDropDownEntity> = listOf()
-    private var workstationData: List<TextDropDownDialog.TextDropDownEntity> = listOf()
-    private var selectedRoleData: MutableList<TextDropDownDialog.TextDropDownEntity>? =
-        mutableListOf()
-    private var selectedWorkstationData: MutableList<TextDropDownDialog.TextDropDownEntity>? =
-        mutableListOf()
-    private var onConfirm: (UpdateUserDataVo) -> Unit = {}
-    private var userId: Long = 0
+    private var selectedRoles = mutableListOf<TextDropDownDialog.TextDropDownEntity>()
+    private var selectedWorkstations = mutableListOf<TextDropDownDialog.TextDropDownEntity>()
 
-    init {
-        setContentView(R.layout.dialog_update_user)
-        textDropDownDialog = TextDropDownDialog(context)
-        textDropDownDialog.setWidthAsAnchorView(true)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogUpdateUserBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogUpdateUserBinding.bind(contentView)
+        // 显示或隐藏工作站选项
         binding.workstationLayout.isVisible = ISCSConfig.isWorkstationOn
+
+        // 预填数据
+        binding.nicknameEt.setText(userVo.nickName)
+        binding.cardcodeEt.setText(userVo.cardCodes.joinToString(","))
+        binding.roleTv.text = userVo.roleNames.filterNotNull().joinToString(",")
+        binding.workstationNameTv.text = userVo.workstationNames.filterNotNull().joinToString(",")
+        binding.activateRb.isChecked = userVo.getStatus()
+        binding.deactivateRb.isChecked = !userVo.getStatus()
+
+        // 标记已选
+        selectedRoles = roleData.filter { it.getShowText() in userVo.roleNames }.toMutableList()
+        selectedWorkstations = workstationData.filter { it.getShowText() in userVo.workstationNames }.toMutableList()
+
+        // 角色多选
         binding.roleTv.setOnClickListener {
-            textDropDownDialog.setData(roleData)
-            textDropDownDialog.setOnItemMultiSelectListener {
-                selectedRoleData = it?.toMutableList()
-                if (it?.isEmpty() == true) {
-                    binding.roleTv.text = ""
-                } else {
-                    binding.roleTv.text = it?.joinToString(",") { it.getShowText() }
-                }
+            TextDropDownDialog.showMulti(roleData,binding.roleTv) { list ->
+                selectedRoles = list.orEmpty().toMutableList()
+                binding.roleTv.text = selectedRoles.joinToString(",") { it.getShowText() }
             }
-            textDropDownDialog.showPopupWindow(binding.roleTv)
         }
+
+        // 工作站多选
         binding.workstationNameTv.setOnClickListener {
-            textDropDownDialog.setData(workstationData)
-            textDropDownDialog.setOnItemMultiSelectListener {
-                selectedWorkstationData = it?.toMutableList()
-                binding.workstationNameTv.text = it?.joinToString(",") { it.getShowText() }
+            TextDropDownDialog.showMulti(workstationData,binding.workstationNameTv) { list ->
+                selectedWorkstations = list.orEmpty().toMutableList()
+                binding.workstationNameTv.text = selectedWorkstations.joinToString(",") { it.getShowText() }
             }
-            textDropDownDialog.showPopupWindow(binding.workstationNameTv)
         }
-        binding.cancel.setOnClickListener { dismiss() }
-        binding.closeIv.setOnClickListener { dismiss() }
-        binding.confirm.setOnClickListener {
-            if (checkData()) {
-                val updateUserData = UpdateUserDataVo(
-                    userId,
-                    binding.nicknameEt.text.toString(),
-                    binding.cardcodeEt.text.toString(),
-                    selectedRoleData?.map { it.getId() } ?: listOf(),
-                    selectedWorkstationData?.map { it.getId() } ?: listOf(),
-                    binding.statusRg.checkedRadioButtonId == binding.activateRb.id
-                )
-                onConfirm(updateUserData)
-                binding.nicknameEt.setText("")
-                binding.cardcodeEt.setText("")
-                binding.roleTv.text = ""
-                binding.workstationNameTv.text = ""
-                binding.statusRg.clearCheck()
-                dismiss()
-            }
-        }
-    }
 
-    /**
-     * 检查数据
-     */
-    private fun checkData(): Boolean {
-        if (binding.nicknameEt.text.trim().toString().isEmpty()) {
-            PopTip.build().tipDialog(R.string.please_input_nickname)
-            return false
-        }
-        if (binding.cardcodeEt.text.trim().toString().isEmpty()) {
-            PopTip.build().tipDialog(R.string.please_input_card_code)
-            return false
-        }
-        if (binding.roleTv.text.trim().toString().isEmpty()) {
-            PopTip.build().tipDialog(R.string.please_select_role)
-            return false
-        }
-        if (binding.workstationNameTv.text.trim().toString().isEmpty()) {
-            PopTip.build().tipDialog(R.string.please_select_area)
-            return false
-        }
-        if (binding.statusRg.checkedRadioButtonId == -1) {
-            PopTip.build().tipDialog(R.string.please_select_status)
-            return false
-        }
-        return true
-    }
-
-    /**
-     * 设置角色数据
-     */
-    fun setRoleData(roleData: List<TextDropDownDialog.TextDropDownEntity>) {
-        this.roleData = roleData
-    }
-
-    /**
-     * 设置岗位数据
-     */
-    fun setWorkstationData(workstationData: List<TextDropDownDialog.TextDropDownEntity>) {
-        this.workstationData = workstationData
-    }
+        // 取消/关闭
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
 
-    /**
-     * 设置确认监听
-     */
-    fun setOnConfirmListener(onConfirm: (UpdateUserDataVo) -> Unit) {
-        this.onConfirm = onConfirm
+        // 确认
+        binding.confirm.setOnClickListener {
+            val name = binding.nicknameEt.text.trim().toString()
+            val card = binding.cardcodeEt.text.trim().toString()
+            if (name.isBlank()) return@setOnClickListener PopTip.build().tipDialog(R.string.please_input_nickname)
+            if (card.isBlank()) return@setOnClickListener PopTip.build().tipDialog(R.string.please_input_card_code)
+            if (selectedRoles.isEmpty()) return@setOnClickListener PopTip.build().tipDialog(R.string.please_select_role)
+            if (ISCSConfig.isWorkstationOn && selectedWorkstations.isEmpty()) return@setOnClickListener PopTip.build().tipDialog(R.string.please_select_area)
+            val isActive = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
+            val updateVo = UpdateUserDataVo(
+                userVo.userId,
+                name,
+                card,
+                selectedRoles.map { it.getId() },
+                selectedWorkstations.map { it.getId() },
+                isActive
+            )
+            onConfirm(updateVo)
+            dialog?.dismiss()
+        }
     }
 
-    /**
-     * 设置用户数据
-     */
-    fun setUserData(userData: UserManageVo) {
-        userId = userData.userId
-        binding.nicknameEt.setText(userData.nickName)
-        binding.cardcodeEt.setText(userData.cardCodes.joinToString(","))
-        binding.roleTv.text = userData.roleNames.filter { it != null }.joinToString(",")
-        roleData.forEach {
-            if (userData.roleNames.contains(it.getShowText())) {
-                it.setSelected(userData.roleNames.contains(it.getShowText()))
-                selectedRoleData?.add(it)
-            }
-        }
-        binding.workstationNameTv.text =
-            userData.workstationNames.filter { it != null }.joinToString(",")
-        workstationData.forEach {
-            if (userData.workstationNames.contains(it.getShowText())) {
-                it.setSelected(userData.workstationNames.contains(it.getShowText()))
-                selectedWorkstationData?.add(it)
-            }
+    companion object {
+        /**
+         * 显示更新用户对话框并设置回调
+         */
+        @JvmStatic
+        fun show(
+            userVo: UserManageVo,
+            roleData: List<TextDropDownDialog.TextDropDownEntity>,
+            workstationData: List<TextDropDownDialog.TextDropDownEntity>,
+            onConfirm: (UpdateUserDataVo) -> Unit
+        ) {
+            CustomDialog.show(
+                UpdateUserDialog(userVo, roleData, workstationData, onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
         }
-        binding.activateRb.isChecked = userData.getStatus()
-        binding.deactivateRb.isChecked = !userData.getStatus()
     }
-}
+}

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

@@ -1,90 +1,84 @@
 package com.grkj.iscs.features.main.dialog.hardware_manage
 
-import android.content.Context
 import android.view.View
+import androidx.core.view.isVisible
 import com.grkj.data.model.vo.AddCardDataVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogAddCardBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
+import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
-import com.sik.sikcore.extension.setDebouncedClickListener
-import razerdp.basepopup.BasePopupWindow
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 新增卡片
+ * 新增卡片对话框,基于 DialogX,支持选择用户
+ * 使用:
+ * AddCardDialog.show(userData) { addVo -> /* handle */ }
  */
-class AddCardDialog(context: Context) : BasePopupWindow(context) {
+class AddCardDialog(
+    private val userData: List<TextDropDownDialog.TextDropDownEntity>,
+    private val onConfirm: (AddCardDataVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_add_card) {
+
     private lateinit var binding: DialogAddCardBinding
-    private var userData: List<TextDropDownDialog.TextDropDownEntity> = mutableListOf()
-    private var selectUserData: TextDropDownDialog.TextDropDownEntity? = null
-    private lateinit var textDropDownDialog: TextDropDownDialog
-    private var onConfirm: (AddCardDataVo) -> Unit = {}
+    private var selectedUser: TextDropDownDialog.TextDropDownEntity? = null
 
-    init {
-        setContentView(R.layout.dialog_add_card)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogAddCardBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogAddCardBinding.bind(contentView)
-        textDropDownDialog = TextDropDownDialog(context)
-        textDropDownDialog.setWidthAsAnchorView(true)
-        binding.cancel.setOnClickListener { dismiss() }
-        binding.closeIv.setOnClickListener { dismiss() }
-        binding.confirm.setOnClickListener {
-            if (checkData()) {
-                val vo = AddCardDataVo(
-                    cardNfc = binding.cardNfcEt.text.toString(),
-                    userId = selectUserData?.getId() ?: 0,
-                    userName = selectUserData?.getShowText() ?: "",
-                    exStatus = binding.statusRg.checkedRadioButtonId == binding.activateRb.id,
-                    exRemark = binding.remarkEt.text.toString().takeIf { it.isNotBlank() }
-                )
-                onConfirm(vo)
-                // 清空
-                binding.cardNfcEt.setText("")
-                binding.usernameTv.text = ""
-                selectUserData = null
-                binding.remarkEt.setText("")
-                binding.statusRg.clearCheck()
-                dismiss()
+        // 用户单选
+        binding.usernameTv.setOnClickListener {
+            TextDropDownDialog.showSingle(userData,binding.usernameTv) { item ->
+                selectedUser = item
+                binding.usernameTv.text = item.getShowText()
             }
         }
-        binding.usernameTv.setDebouncedClickListener {
-            textDropDownDialog.setData(userData)
-            textDropDownDialog.setOnItemSelectListener {
-                selectUserData = it
-                binding.usernameTv.text = it.getShowText()
+
+        // 取消/关闭
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+
+        // 确认
+        binding.confirm.setOnClickListener {
+            val nfc = binding.cardNfcEt.text.trim().toString()
+            val statusChecked = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
+            if (nfc.isEmpty()) {
+                PopTip.build().tipDialog(R.string.please_input_card_nfc)
+                return@setOnClickListener
+            }
+            if (selectedUser == null) {
+                PopTip.build().tipDialog(R.string.please_select_card_username)
+                return@setOnClickListener
             }
-            textDropDownDialog.showPopupWindow(binding.usernameTv)
+            // 构造并回调
+            val vo = AddCardDataVo(
+                cardNfc = nfc,
+                userId = selectedUser!!.getId(),
+                userName = selectedUser!!.getShowText(),
+                exStatus = statusChecked,
+                exRemark = binding.remarkEt.text.toString().takeIf { it.isNotBlank() }
+            )
+            onConfirm(vo)
+            dialog?.dismiss()
         }
     }
 
-    private fun checkData(): Boolean {
-        if (binding.cardNfcEt.text.trim().isEmpty()) {
-            PopTip.build().tipDialog(R.string.please_input_card_nfc)
-            update()
-            return false
+    companion object {
+        /**
+         * 显示新增卡片对话框并设置回调
+         */
+        @JvmStatic
+        fun show(
+            userData: List<TextDropDownDialog.TextDropDownEntity>,
+            onConfirm: (AddCardDataVo) -> Unit
+        ) {
+            CustomDialog.show(
+                AddCardDialog(userData, onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
         }
-        if (selectUserData == null) {
-            PopTip.build().tipDialog(R.string.please_select_card_username)
-            update()
-            return false
-        }
-        if (binding.statusRg.checkedRadioButtonId == -1) {
-            PopTip.build().tipDialog(R.string.please_select_status)
-            update()
-            return false
-        }
-        return true
-    }
-
-    fun setUserData(userData: List<TextDropDownDialog.TextDropDownEntity>) {
-        this.userData = userData
-    }
-
-    fun setOnConfirmListener(listener: (AddCardDataVo) -> Unit) {
-        this.onConfirm = listener
     }
 }

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

@@ -1,77 +1,83 @@
 package com.grkj.iscs.features.main.dialog.hardware_manage
 
-import android.content.Context
 import android.view.View
 import com.grkj.data.model.vo.AddKeyDataVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogAddKeyBinding
+import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
-import razerdp.basepopup.BasePopupWindow
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 新增钥匙
+ * 新增钥匙对话框,基于 DialogX
+ * 使用:
+ * AddKeyDialog.show { keyVo -> /* handle */ }
  */
-class AddKeyDialog(context: Context) : BasePopupWindow(context) {
+class AddKeyDialog(
+    private val onConfirm: (AddKeyDataVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_add_key) {
+
     private lateinit var binding: DialogAddKeyBinding
-    private var onConfirm: (AddKeyDataVo) -> Unit = {}
 
-    init {
-        setContentView(R.layout.dialog_add_key)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogAddKeyBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
+
+        // 取消/关闭
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogAddKeyBinding.bind(contentView)
-        binding.cancel.setOnClickListener { dismiss() }
-        binding.closeIv.setOnClickListener { dismiss() }
+        // 确认
         binding.confirm.setOnClickListener {
-            if (checkData()) {
-                val addUserData = AddKeyDataVo(
-                    binding.keyCodeEt.text.toString(),
-                    binding.keyNfcEt.text.toString(),
-                    binding.keyMacEt.text.toString(),
-                    binding.statusRg.checkedRadioButtonId == binding.activateRb.id,
-                    binding.remarkEt.text.toString()
-                )
-                onConfirm(addUserData)
-                binding.keyCodeEt.setText("")
-                binding.keyNfcEt.setText("")
-                binding.keyMacEt.setText("")
-                binding.remarkEt.setText("")
-                binding.statusRg.clearCheck()
-                dismiss()
+            val code = binding.keyCodeEt.text.trim().toString()
+            val nfc = binding.keyNfcEt.text.trim().toString()
+            val mac = binding.keyMacEt.text.trim().toString()
+            val statusChecked = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
+
+            if (code.isEmpty()) {
+                PopTip.build().tipDialog(R.string.please_input_key_name)
+                return@setOnClickListener
+            }
+            if (nfc.isEmpty()) {
+                PopTip.build().tipDialog(R.string.please_input_key_nfc)
+                return@setOnClickListener
+            }
+            if (mac.isEmpty()) {
+                PopTip.build().tipDialog(R.string.please_input_key_mac)
+                return@setOnClickListener
             }
+            // 构建并回调(位置参数方式)
+            val vo = AddKeyDataVo(
+                code,
+                nfc,
+                mac,
+                statusChecked,
+                binding.remarkEt.text.toString()
+            )
+            onConfirm(vo)
+            // 清空输入
+            binding.keyCodeEt.text?.clear()
+            binding.keyNfcEt.text?.clear()
+            binding.keyMacEt.text?.clear()
+            binding.remarkEt.text?.clear()
+            binding.statusRg.clearCheck()
+            // 安全关闭对话框
+            dialog?.dismiss()
         }
     }
 
-    /**
-     * 检查数据
-     */
-    private fun checkData(): Boolean {
-        if (binding.keyCodeEt.text.trim().toString().isEmpty()) {
-            PopTip.build().tipDialog(R.string.please_input_key_name)
-            return false
+    companion object {
+        /**
+         * 显示新增钥匙对话框并设置回调
+         */
+        @JvmStatic
+        fun show(onConfirm: (AddKeyDataVo) -> Unit) {
+            CustomDialog.show(
+                AddKeyDialog(onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
         }
-        if (binding.keyNfcEt.text.trim().toString().isEmpty()) {
-            PopTip.build().tipDialog(R.string.please_input_key_nfc)
-            return false
-        }
-        if (binding.keyMacEt.text.trim().toString().isEmpty()) {
-            PopTip.build().tipDialog(R.string.please_input_key_mac)
-            return false
-        }
-        if (binding.statusRg.checkedRadioButtonId == -1) {
-            PopTip.build().tipDialog(R.string.please_select_status)
-            return false
-        }
-        return true
-    }
-
-    /**
-     * 设置确认监听
-     */
-    fun setOnConfirmListener(onConfirm: (AddKeyDataVo) -> Unit) {
-        this.onConfirm = onConfirm
     }
 }

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

@@ -1,67 +1,77 @@
 package com.grkj.iscs.features.main.dialog.hardware_manage
 
-import android.content.Context
 import android.view.View
 import com.grkj.data.model.vo.AddLockDataVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogAddLockBinding
+import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
-import razerdp.basepopup.BasePopupWindow
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 新增挂锁
+ * 新增挂锁对话框,基于 DialogX
+ * 使用:
+ * AddLockDialog.show { lockVo -> /* handle */ }
  */
-class AddLockDialog(context: Context) : BasePopupWindow(context) {
+class AddLockDialog(
+    private val onConfirm: (AddLockDataVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_add_lock) {
+
     private lateinit var binding: DialogAddLockBinding
-    private var onConfirm: (AddLockDataVo) -> Unit = {}
 
-    init {
-        setContentView(R.layout.dialog_add_lock)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogAddLockBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogAddLockBinding.bind(contentView)
+        // 取消/关闭
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
 
-        binding.cancel.setOnClickListener { dismiss() }
-        binding.closeIv.setOnClickListener { dismiss() }
+        // 确认
         binding.confirm.setOnClickListener {
-            if (checkData()) {
-                val vo = AddLockDataVo(
-                    lockCode  = binding.lockCodeEt.text.toString(),
-                    lockNfc   = binding.lockNfcEt.text.toString(),
-                    exStatus  = binding.statusRg.checkedRadioButtonId == binding.activateRb.id,
-                    exRemark  = binding.remarkEt.text.toString().takeIf { it.isNotBlank() }
-                )
-                onConfirm(vo)
-                // 清空
-                binding.lockCodeEt.setText("")
-                binding.lockNfcEt.setText("")
-                binding.remarkEt.setText("")
-                binding.statusRg.clearCheck()
-                dismiss()
+            val code = binding.lockCodeEt.text.trim().toString()
+            val nfc = binding.lockNfcEt.text.trim().toString()
+            val statusChecked = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
+            val remark = binding.remarkEt.text.toString()
+
+            if (code.isEmpty()) {
+                PopTip.build().tipDialog(R.string.please_input_lock_code)
+                return@setOnClickListener
+            }
+            if (nfc.isEmpty()) {
+                PopTip.build().tipDialog(R.string.please_input_lock_nfc)
+                return@setOnClickListener
             }
+            // 构建并回调(位置参数方式,与VO构造器一致)
+            val vo = AddLockDataVo(
+                code,
+                nfc,
+                statusChecked,
+                remark
+            )
+            onConfirm(vo)
+            // 清空输入
+            binding.lockCodeEt.text?.clear()
+            binding.lockNfcEt.text?.clear()
+            binding.remarkEt.text?.clear()
+            binding.statusRg.clearCheck()
+            // 关闭对话框
+            dialog?.dismiss()
         }
     }
 
-    private fun checkData(): Boolean {
-        if (binding.lockCodeEt.text.trim().isEmpty()) {
-            PopTip.build().tipDialog(R.string.please_input_lock_code)
-            return false
+    companion object {
+        /**
+         * 显示新增挂锁对话框并设置回调
+         */
+        @JvmStatic
+        fun show(onConfirm: (AddLockDataVo) -> Unit) {
+            CustomDialog.show(
+                AddLockDialog(onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
         }
-        if (binding.lockNfcEt.text.trim().isEmpty()) {
-            PopTip.build().tipDialog(R.string.please_input_lock_nfc)
-            return false
-        }
-        if (binding.statusRg.checkedRadioButtonId == -1) {
-            PopTip.build().tipDialog(R.string.please_select_status)
-            return false
-        }
-        return true
-    }
-
-    fun setOnConfirmListener(listener: (AddLockDataVo) -> Unit) {
-        this.onConfirm = listener
     }
 }

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

@@ -1,67 +1,77 @@
 package com.grkj.iscs.features.main.dialog.hardware_manage
 
-import android.content.Context
 import android.view.View
 import com.grkj.data.model.vo.AddRfidTokenDataVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogAddRfidTokenBinding
+import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
-import razerdp.basepopup.BasePopupWindow
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 新增 RFID 标签
+ * 新增 RFID 标签对话框,基于 DialogX
+ * 使用:
+ * AddRfidTokenDialog.show { tokenVo -> /* handle */ }
  */
-class AddRfidTokenDialog(context: Context) : BasePopupWindow(context) {
+class AddRfidTokenDialog(
+    private val onConfirm: (AddRfidTokenDataVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_add_rfid_token) {
+
     private lateinit var binding: DialogAddRfidTokenBinding
-    private var onConfirm: (AddRfidTokenDataVo) -> Unit = {}
 
-    init {
-        setContentView(R.layout.dialog_add_rfid_token)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogAddRfidTokenBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogAddRfidTokenBinding.bind(contentView)
+        // 取消/关闭
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
 
-        binding.cancel.setOnClickListener { dismiss() }
-        binding.closeIv.setOnClickListener { dismiss() }
+        // 确认
         binding.confirm.setOnClickListener {
-            if (checkData()) {
-                val vo = AddRfidTokenDataVo(
-                    rfidCode  = binding.rfidCodeEt.text.toString(),
-                    rfid      = binding.rfidEt.text.toString(),
-                    exStatus  = binding.statusRg.checkedRadioButtonId == binding.activateRb.id,
-                    exRemark  = binding.remarkEt.text.toString().takeIf { it.isNotBlank() }
-                )
-                onConfirm(vo)
-                // 清空
-                binding.rfidCodeEt.setText("")
-                binding.rfidEt.setText("")
-                binding.remarkEt.setText("")
-                binding.statusRg.clearCheck()
-                dismiss()
+            val code = binding.rfidCodeEt.text.trim().toString()
+            val rfid = binding.rfidEt.text.trim().toString()
+            val statusChecked = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
+            val remark = binding.remarkEt.text.toString().takeIf { it.isNotBlank() }
+
+            if (code.isEmpty()) {
+                PopTip.build().tipDialog(R.string.please_input_rfid_code)
+                return@setOnClickListener
+            }
+            if (rfid.isEmpty()) {
+                PopTip.build().tipDialog(R.string.please_input_rfid)
+                return@setOnClickListener
             }
+            // 构造并回调(位置参数方式)
+            val vo = AddRfidTokenDataVo(
+                code,
+                rfid,
+                statusChecked,
+                remark
+            )
+            onConfirm(vo)
+            // 清空输入
+            binding.rfidCodeEt.text?.clear()
+            binding.rfidEt.text?.clear()
+            binding.remarkEt.text?.clear()
+            binding.statusRg.clearCheck()
+            // 安全关闭对话框
+            dialog?.dismiss()
         }
     }
 
-    private fun checkData(): Boolean {
-        if (binding.rfidCodeEt.text.trim().isEmpty()) {
-            PopTip.build().tipDialog(R.string.please_input_rfid_code)
-            return false
+    companion object {
+        /**
+         * 显示新增 RFID 标签对话框并设置回调
+         */
+        @JvmStatic
+        fun show(onConfirm: (AddRfidTokenDataVo) -> Unit) {
+            CustomDialog.show(
+                AddRfidTokenDialog(onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
         }
-        if (binding.rfidEt.text.trim().isEmpty()) {
-            PopTip.build().tipDialog(R.string.please_input_rfid)
-            return false
-        }
-        if (binding.statusRg.checkedRadioButtonId == -1) {
-            PopTip.build().tipDialog(R.string.please_select_status)
-            return false
-        }
-        return true
-    }
-
-    fun setOnConfirmListener(listener: (AddRfidTokenDataVo) -> Unit) {
-        this.onConfirm = listener
     }
-}
+}

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

@@ -1,73 +1,82 @@
 package com.grkj.iscs.features.main.dialog.hardware_manage
 
-import android.content.Context
 import android.view.View
+import androidx.core.view.isVisible
 import com.grkj.data.model.vo.CardManageFilterVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogFilterCardBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
-import com.sik.sikcore.extension.setDebouncedClickListener
-import razerdp.basepopup.BasePopupWindow
+import com.grkj.ui_base.utils.CommonUtils
+import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
+import com.kongzue.dialogx.dialogs.PopTip
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 筛选卡片
+ * 筛选卡片对话框,基于 DialogX,支持根据用户名进行筛选
+ * 使用:
+ * FilterCardDialog.show(userData) { filterVo -> /* handle */ }
  */
-class FilterCardDialog(context: Context) : BasePopupWindow(context) {
-    private var onConfirm: (CardManageFilterVo) -> Unit = {}
-    private var userData: List<TextDropDownDialog.TextDropDownEntity> = mutableListOf()
-    private var selectUserData: TextDropDownDialog.TextDropDownEntity? = null
-    private lateinit var textDropDownDialog: TextDropDownDialog
+class FilterCardDialog(
+    private val userData: List<TextDropDownDialog.TextDropDownEntity>,
+    private val onConfirm: (CardManageFilterVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_filter_card) {
+
     private lateinit var binding: DialogFilterCardBinding
+    private var selectedUser: TextDropDownDialog.TextDropDownEntity? = null
 
-    init {
-        setContentView(R.layout.dialog_filter_card)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogFilterCardBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
+        binding.usernameTv.isVisible = userData.isNotEmpty()
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogFilterCardBinding.bind(contentView)
-        textDropDownDialog = TextDropDownDialog(context)
-        textDropDownDialog.setWidthAsAnchorView(true)
-        binding.closeIv.setOnClickListener { dismiss() }
-        binding.confirm.setOnClickListener {
-            val filter = CardManageFilterVo(
-                cardNfc = binding.cardNfcEt.text.toString().takeIf { it.isNotBlank() },
-                username = selectUserData?.getShowText() ?: "",
-                status = when (binding.statusRg.checkedRadioButtonId) {
-                    binding.activateRb.id -> true
-                    binding.deactivateRb.id -> false
-                    else -> null
-                }
-            )
-            onConfirm(filter)
-            dismiss()
-            binding.cardNfcEt.setText("")
-            binding.usernameTv.setText("")
-            selectUserData = null
-            binding.statusRg.clearCheck()
+        // 用户选择
+        binding.usernameTv.setOnClickListener {
+            TextDropDownDialog.showSingle(userData,binding.usernameTv) { item ->
+                selectedUser = item
+                binding.usernameTv.text = item.getShowText()
+            }
         }
-        binding.cancel.setOnClickListener { dismiss() }
-        binding.usernameTv.setDebouncedClickListener {
-            textDropDownDialog.setData(userData)
-            textDropDownDialog.setOnItemSelectListener {
-                selectUserData = it
-                binding.usernameTv.text = it.getShowText()
+
+        // 取消/关闭
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+
+        // 确认筛选
+        binding.confirm.setOnClickListener {
+            val nfc = binding.cardNfcEt.text.trim().toString().takeIf { it.isNotBlank() }
+            val username = selectedUser?.getShowText().orEmpty()
+            val status = when (binding.statusRg.checkedRadioButtonId) {
+                binding.activateRb.id -> true
+                binding.deactivateRb.id -> false
+                else -> null
             }
-            textDropDownDialog.showPopupWindow(binding.usernameTv)
+            onConfirm(CardManageFilterVo(nfc, username, status))
+            dialog?.dismiss()
+            clearFields()
         }
     }
 
-    /**
-     * 设置用户数据
-     */
-    fun setUserData(userData: List<TextDropDownDialog.TextDropDownEntity>) {
-        this.userData = userData
+    private fun clearFields() {
+        binding.cardNfcEt.text?.clear()
+        binding.usernameTv.text = ""
+        selectedUser = null
+        binding.statusRg.clearCheck()
     }
 
-    /**
-     * 设置确认事件
-     */
-    fun setOnConfirmListener(listener: (CardManageFilterVo) -> Unit) {
-        this.onConfirm = listener
+    companion object {
+        /**
+         * 显示筛选卡片对话框并设置回调
+         */
+        @JvmStatic
+        fun show(
+            userData: List<TextDropDownDialog.TextDropDownEntity>,
+            onConfirm: (CardManageFilterVo) -> Unit
+        ) {
+            CustomDialog.show(
+                FilterCardDialog(userData, onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
+        }
     }
-}
+}

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

@@ -1,53 +1,73 @@
 package com.grkj.iscs.features.main.dialog.hardware_manage
 
-import android.content.Context
 import android.view.View
+import androidx.core.view.isVisible
 import com.grkj.data.model.vo.KeyManageFilterVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogFilterKeyBinding
-import razerdp.basepopup.BasePopupWindow
+import com.grkj.ui_base.utils.CommonUtils
+import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
+import com.kongzue.dialogx.dialogs.PopTip
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 筛选钥匙
+ * 筛选钥匙对话框,基于 DialogX
+ * 使用:
+ * FilterKeyDialog.show { filterVo -> /* handle */ }
  */
-class FilterKeyDialog(context: Context) : BasePopupWindow(context) {
-    private var onConfirm: (KeyManageFilterVo) -> Unit = {}
+class FilterKeyDialog(
+    private val onConfirm: (KeyManageFilterVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_filter_key) {
+
     private lateinit var binding: DialogFilterKeyBinding
 
-    init {
-        setContentView(R.layout.dialog_filter_key)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogFilterKeyBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
+
+        // 取消/关闭
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogFilterKeyBinding.bind(contentView)
-        binding.closeIv.setOnClickListener { dismiss() }
+        // 确认筛选
         binding.confirm.setOnClickListener {
-            val filterData = KeyManageFilterVo(
-                binding.keyCodeEt.text.toString(),
-                binding.keyNfcEt.text.toString(),
-                binding.keyMacEt.text.toString(),
-                if (binding.statusRg.checkedRadioButtonId == -1) {
-                    null
-                } else {
-                    binding.statusRg.checkedRadioButtonId == binding.activateRb.id
-                }
+            val code = binding.keyCodeEt.text.trim().toString()
+            val nfc = binding.keyNfcEt.text.trim().toString()
+            val mac = binding.keyMacEt.text.trim().toString()
+            val statusChecked = when (binding.statusRg.checkedRadioButtonId) {
+                binding.activateRb.id -> true
+                binding.deactivateRb.id -> false
+                else -> null
+            }
+            // 构建并回调
+            val filter = KeyManageFilterVo(
+                code,
+                nfc,
+                mac,
+                statusChecked
             )
-            onConfirm(filterData)
-            dismiss()
-            binding.keyCodeEt.setText("")
-            binding.keyNfcEt.setText("")
-            binding.keyMacEt.setText("")
-        }
-        binding.cancel.setOnClickListener {
-            dismiss()
+            onConfirm(filter)
+            // 清空输入
+            binding.keyCodeEt.text?.clear()
+            binding.keyNfcEt.text?.clear()
+            binding.keyMacEt.text?.clear()
+            binding.statusRg.clearCheck()
+            // 关闭对话框
+            dialog?.dismiss()
         }
     }
 
-    /**
-     * 设置确认事件
-     */
-    fun setOnConfirmListener(onConfirm: (KeyManageFilterVo) -> Unit) {
-        this.onConfirm = onConfirm
+    companion object {
+        /**
+         * 显示筛选钥匙对话框并设置回调
+         */
+        @JvmStatic
+        fun show(onConfirm: (KeyManageFilterVo) -> Unit) {
+            CustomDialog.show(
+                FilterKeyDialog(onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
+        }
     }
-}
+}

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

@@ -1,51 +1,63 @@
 package com.grkj.iscs.features.main.dialog.hardware_manage
 
-import android.content.Context
 import android.view.View
 import com.grkj.data.model.vo.LockManageFilterVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogFilterLockBinding
-import razerdp.basepopup.BasePopupWindow
+import com.grkj.ui_base.utils.CommonUtils
+import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
+import com.kongzue.dialogx.dialogs.PopTip
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 筛选挂锁
+ * 筛选挂锁对话框,基于 DialogX
+ * 使用:FilterLockDialog.show { filterVo -> /* handle */ }
  */
-class FilterLockDialog(context: Context) : BasePopupWindow(context) {
-    private var onConfirm: (LockManageFilterVo) -> Unit = {}
+class FilterLockDialog(
+    private val onConfirm: (LockManageFilterVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_filter_lock) {
+
     private lateinit var binding: DialogFilterLockBinding
 
-    init {
-        setContentView(R.layout.dialog_filter_lock)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogFilterLockBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogFilterLockBinding.bind(contentView)
+        // 关闭/取消
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
 
-        binding.closeIv.setOnClickListener { dismiss() }
+        // 确认筛选
         binding.confirm.setOnClickListener {
-            val filter = LockManageFilterVo(
-                lockCode = binding.lockCodeEt.text.toString().takeIf { it.isNotBlank() },
-                lockNfc  = binding.lockNfcEt.text.toString().takeIf { it.isNotBlank() },
-                status   = when (binding.statusRg.checkedRadioButtonId) {
-                    binding.activateRb.id   -> true
-                    binding.deactivateRb.id -> false
-                    else                    -> null
-                }
-            )
+            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) {
+                binding.activateRb.id -> true
+                binding.deactivateRb.id -> false
+                else -> null
+            }
+            val filter = LockManageFilterVo(code, nfc, statusChecked)
             onConfirm(filter)
-            dismiss()
-            binding.lockCodeEt.setText("")
-            binding.lockNfcEt.setText("")
+            // 清空输入
+            binding.lockCodeEt.text?.clear()
+            binding.lockNfcEt.text?.clear()
             binding.statusRg.clearCheck()
+            // 关闭对话框
+            dialog?.dismiss()
         }
-        binding.cancel.setOnClickListener { dismiss() }
     }
 
-    /**
-     * 设置确认事件
-     */
-    fun setOnConfirmListener(listener: (LockManageFilterVo) -> Unit) {
-        this.onConfirm = listener
+    companion object {
+        /**
+         * 显示筛选挂锁对话框并设置回调
+         */
+        @JvmStatic
+        fun show(onConfirm: (LockManageFilterVo) -> Unit) {
+            CustomDialog.show(
+                FilterLockDialog(onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
+        }
     }
-}
+}

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

@@ -1,51 +1,63 @@
 package com.grkj.iscs.features.main.dialog.hardware_manage
 
-import android.content.Context
 import android.view.View
 import com.grkj.data.model.vo.RfidTokenManageFilterVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogFilterRfidTokenBinding
-import razerdp.basepopup.BasePopupWindow
+import com.grkj.ui_base.utils.CommonUtils
+import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
+import com.kongzue.dialogx.dialogs.PopTip
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 筛选 RFID 标签
+ * 筛选 RFID 标签对话框,基于 DialogX
+ * 使用:FilterRfidTokenDialog.show { filterVo -> /* handle */ }
  */
-class FilterRfidTokenDialog(context: Context) : BasePopupWindow(context) {
-    private var onConfirm: (RfidTokenManageFilterVo) -> Unit = {}
+class FilterRfidTokenDialog(
+    private val onConfirm: (RfidTokenManageFilterVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_filter_rfid_token) {
+
     private lateinit var binding: DialogFilterRfidTokenBinding
 
-    init {
-        setContentView(R.layout.dialog_filter_rfid_token)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogFilterRfidTokenBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogFilterRfidTokenBinding.bind(contentView)
+        // 取消/关闭
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
 
-        binding.closeIv.setOnClickListener { dismiss() }
+        // 确认筛选
         binding.confirm.setOnClickListener {
-            val filter = RfidTokenManageFilterVo(
-                rfidCode = binding.rfidCodeEt.text.toString().takeIf { it.isNotBlank() },
-                rfid     = binding.rfidEt.text.toString().takeIf { it.isNotBlank() },
-                status   = when (binding.statusRg.checkedRadioButtonId) {
-                    binding.activateRb.id   -> true
-                    binding.deactivateRb.id -> false
-                    else                    -> null
-                }
-            )
+            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) {
+                binding.activateRb.id -> true
+                binding.deactivateRb.id -> false
+                else -> null
+            }
+            val filter = RfidTokenManageFilterVo(code, rfid, statusChecked)
             onConfirm(filter)
-            dismiss()
-            binding.rfidCodeEt.setText("")
-            binding.rfidEt.setText("")
+            // 清空输入
+            binding.rfidCodeEt.text?.clear()
+            binding.rfidEt.text?.clear()
             binding.statusRg.clearCheck()
+            // 关闭对话框
+            dialog?.dismiss()
         }
-        binding.cancel.setOnClickListener { dismiss() }
     }
 
-    /**
-     * 设置确认事件
-     */
-    fun setOnConfirmListener(listener: (RfidTokenManageFilterVo) -> Unit) {
-        this.onConfirm = listener
+    companion object {
+        /**
+         * 显示筛选 RFID 标签对话框并设置回调
+         */
+        @JvmStatic
+        fun show(onConfirm: (RfidTokenManageFilterVo) -> Unit) {
+            CustomDialog.show(
+                FilterRfidTokenDialog(onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
+        }
     }
-}
+}

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

@@ -1,107 +1,93 @@
 package com.grkj.iscs.features.main.dialog.hardware_manage
 
-import android.content.Context
 import android.view.View
+import androidx.core.view.isVisible
 import com.grkj.data.enums.CommonDictDataEnum
 import com.grkj.data.model.dos.IsJobCard
 import com.grkj.data.model.vo.UpdateCardDataVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogUpdateCardBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
+import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
-import com.sik.sikcore.extension.setDebouncedClickListener
-import razerdp.basepopup.BasePopupWindow
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 更新卡片
+ * 更新卡片对话框,基于 DialogX
+ * 使用:
+ * UpdateCardDialog.show(card, userData) { updateVo -> /* handle */ }
  */
-class UpdateCardDialog(context: Context) : BasePopupWindow(context) {
+class UpdateCardDialog(
+    private val card: IsJobCard,
+    private val userData: List<TextDropDownDialog.TextDropDownEntity>,
+    private val onConfirm: (UpdateCardDataVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_update_card) {
+
     private lateinit var binding: DialogUpdateCardBinding
-    private var userData: List<TextDropDownDialog.TextDropDownEntity> = mutableListOf()
-    private var selectUserData: TextDropDownDialog.TextDropDownEntity? = null
-    private lateinit var textDropDownDialog: TextDropDownDialog
-    private var onConfirm: (UpdateCardDataVo) -> Unit = {}
-    private var cardId: Long = 0
+    private var selectedUser: TextDropDownDialog.TextDropDownEntity? = null
 
-    init {
-        setContentView(R.layout.dialog_update_card)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogUpdateCardBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogUpdateCardBinding.bind(contentView)
-        textDropDownDialog = TextDropDownDialog(context)
-        textDropDownDialog.setWidthAsAnchorView(true)
-        binding.cancel.setOnClickListener { dismiss() }
-        binding.closeIv.setOnClickListener { dismiss() }
-        binding.confirm.setOnClickListener {
-            if (checkData()) {
-                val dto = UpdateCardDataVo(
-                    cardId,
-                    binding.cardNfcEt.text.toString(),
-                    selectUserData?.getId() ?: 0,
-                    selectUserData?.getShowText() ?: "",
-                    binding.statusRg.checkedRadioButtonId == binding.activateRb.id,
-                    binding.remarkEt.text.toString().takeIf { it.isNotBlank() }
-                )
-                onConfirm(dto)
-                clear()
-                dismiss()
-            }
-        }
-        binding.usernameTv.setDebouncedClickListener {
-            textDropDownDialog.setData(userData)
-            textDropDownDialog.setOnItemSelectListener {
-                selectUserData = it
-                binding.usernameTv.text = it.getShowText()
-            }
-            textDropDownDialog.showPopupWindow(binding.usernameTv)
-        }
-    }
+        // 预填数据
+        binding.cardNfcEt.setText(card.cardNfc)
+        selectedUser = userData.find { it.getId() == card.userId }
+        binding.usernameTv.text = selectedUser?.getShowText().orEmpty()
+        binding.usernameTv.isVisible = true
+        val statusNormal = CommonDictDataEnum.JOB_CARD_STATUS.commonDictRes
+            .find { it.dictLabel == "正常" }?.dictValue
+        binding.activateRb.isChecked = card.exStatus == statusNormal
+        binding.deactivateRb.isChecked = !binding.activateRb.isChecked
+        binding.remarkEt.setText(card.exRemark)
 
-    private fun checkData(): Boolean {
-        if (binding.cardNfcEt.text.isBlank()) {
-            PopTip.build().tipDialog(R.string.please_input_card_nfc)
-            return false
-        }
-        if (selectUserData == null) {
-            PopTip.build().tipDialog(R.string.please_select_card_username)
-            return false
-        }
-        if (binding.statusRg.checkedRadioButtonId == -1) {
-            PopTip.build().tipDialog(R.string.please_select_status)
-            return false
+        // 用户选择
+        binding.usernameTv.setOnClickListener {
+            TextDropDownDialog.showSingle(userData,binding.usernameTv) { item ->
+                selectedUser = item
+                binding.usernameTv.text = item.getShowText()
+            }
         }
-        return true
-    }
-
-    private fun clear() {
-        binding.cardNfcEt.setText("")
-        binding.usernameTv.text = ""
-        selectUserData = null
-        binding.remarkEt.setText("")
-        binding.statusRg.clearCheck()
-    }
 
-    fun setOnConfirmListener(listener: (UpdateCardDataVo) -> Unit) {
-        this.onConfirm = listener
-    }
+        // 取消/关闭
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
 
-    fun setUserData(userData: List<TextDropDownDialog.TextDropDownEntity>) {
-        this.userData = userData
+        // 确认
+        binding.confirm.setOnClickListener {
+            val nfc = binding.cardNfcEt.text.trim().toString()
+            if (nfc.isBlank()) return@setOnClickListener PopTip.build().tipDialog(R.string.please_input_card_nfc)
+            val user = selectedUser ?: return@setOnClickListener PopTip.build().tipDialog(R.string.please_select_card_username)
+            val statusChecked = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
+            val vo = UpdateCardDataVo(
+                card.cardId,
+                nfc,
+                user.getId(),
+                user.getShowText(),
+                statusChecked,
+                binding.remarkEt.text.toString()
+            )
+            onConfirm(vo)
+            dialog?.dismiss()
+        }
     }
 
-    fun setCardData(card: IsJobCard) {
-        cardId = card.cardId
-        binding.cardNfcEt.setText(card.cardNfc)
-        binding.usernameTv.text = card.userName
-        selectUserData = userData.find { it.getId() == card.userId }
-        if (card.exStatus == CommonDictDataEnum.JOB_CARD_STATUS.commonDictRes.find { it.dictLabel == "正常" }?.dictValue) {
-            binding.activateRb.isChecked = true
-        } else {
-            binding.deactivateRb.isChecked = true
+    companion object {
+        /**
+         * 显示更新卡片对话框并设置回调
+         */
+        @JvmStatic
+        fun show(
+            card: IsJobCard,
+            userData: List<TextDropDownDialog.TextDropDownEntity>,
+            onConfirm: (UpdateCardDataVo) -> Unit
+        ) {
+            CustomDialog.show(
+                UpdateCardDialog(card, userData, onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
         }
-        binding.remarkEt.setText(card.exRemark)
     }
 }

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

@@ -1,95 +1,94 @@
 package com.grkj.iscs.features.main.dialog.hardware_manage
 
-import android.content.Context
 import android.view.View
+import androidx.core.view.isVisible
 import com.grkj.data.enums.CommonDictDataEnum
 import com.grkj.data.model.dos.IsKey
 import com.grkj.data.model.vo.UpdateKeyDataVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogUpdateKeyBinding
+import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
-import razerdp.basepopup.BasePopupWindow
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 更新钥匙
+ * 更新钥匙对话框,基于 DialogX
+ * 使用:
+ * UpdateKeyDialog.show(isKey) { updateVo -> /* handle */ }
  */
-class UpdateKeyDialog(context: Context) : BasePopupWindow(context) {
+class UpdateKeyDialog(
+    private val isKey: IsKey,
+    private val onConfirm: (UpdateKeyDataVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_update_key) {
+
     private lateinit var binding: DialogUpdateKeyBinding
-    private var onConfirm: (UpdateKeyDataVo) -> Unit = {}
-    private var keyId: Long = 0
 
-    init {
-        setContentView(R.layout.dialog_update_key)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogUpdateKeyBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
+
+        // 预填数据
+        binding.keyCodeEt.setText(isKey.keyCode)
+        binding.keyNfcEt.setText(isKey.keyNfc)
+        binding.keyMacEt.setText(isKey.macAddress)
+        binding.remarkEt.setText(isKey.exRemark)
+        val normalValue = CommonDictDataEnum.KEY_STATUS.commonDictRes
+            .find { it.dictLabel == "正常" }?.dictValue
+        binding.activateRb.isChecked = isKey.exStatus == normalValue
+        binding.deactivateRb.isChecked = !binding.activateRb.isChecked
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogUpdateKeyBinding.bind(contentView)
-        binding.cancel.setOnClickListener { dismiss() }
-        binding.closeIv.setOnClickListener { dismiss() }
+        // 取消/关闭
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
+
+        // 确认
         binding.confirm.setOnClickListener {
-            if (checkData()) {
-                val updateKeyData = UpdateKeyDataVo(
-                    keyId,
-                    binding.keyCodeEt.text.toString(),
-                    binding.keyNfcEt.text.toString(),
-                    binding.keyMacEt.text.toString(),
-                    binding.statusRg.checkedRadioButtonId == binding.activateRb.id,
-                    binding.remarkEt.text.toString(),
-                )
-                onConfirm(updateKeyData)
-                binding.keyCodeEt.setText("")
-                binding.keyNfcEt.setText("")
-                binding.remarkEt.setText("")
-                binding.statusRg.clearCheck()
-                dismiss()
-            }
-        }
-    }
+            val code = binding.keyCodeEt.text.trim().toString()
+            val nfc = binding.keyNfcEt.text.trim().toString()
+            val mac = binding.keyMacEt.text.trim().toString()
+            val statusChecked = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
 
-    /**
-     * 检查数据
-     */
-    private fun checkData(): Boolean {
-        if (binding.keyCodeEt.text.trim().toString().isEmpty()) {
-            PopTip.build().tipDialog(R.string.please_input_key_name)
-            return false
-        }
-        if (binding.keyNfcEt.text.trim().toString().isEmpty()) {
-            PopTip.build().tipDialog(R.string.please_input_key_nfc)
-            return false
-        }
-        if (binding.keyMacEt.text.trim().toString().isEmpty()) {
-            PopTip.build().tipDialog(R.string.please_input_key_mac)
-            return false
-        }
-        if (binding.statusRg.checkedRadioButtonId == -1) {
-            PopTip.build().tipDialog(R.string.please_select_status)
-            return false
+            if (code.isEmpty()) {
+                PopTip.build().tipDialog(R.string.please_input_key_name)
+                return@setOnClickListener
+            }
+            if (nfc.isEmpty()) {
+                PopTip.build().tipDialog(R.string.please_input_key_nfc)
+                return@setOnClickListener
+            }
+            if (mac.isEmpty()) {
+                PopTip.build().tipDialog(R.string.please_input_key_mac)
+                return@setOnClickListener
+            }
+            // 构建 DTO 并回调
+            val vo = UpdateKeyDataVo(
+                isKey.keyId,
+                code,
+                nfc,
+                mac,
+                statusChecked,
+                binding.remarkEt.text.toString()
+            )
+            onConfirm(vo)
+            dialog?.dismiss()
         }
-        return true
     }
 
-    /**
-     * 设置确认监听
-     */
-    fun setOnConfirmListener(onConfirm: (UpdateKeyDataVo) -> Unit) {
-        this.onConfirm = onConfirm
-    }
-
-    /**
-     * 设置钥匙数据
-     */
-    fun setKeyData(isKey: IsKey) {
-        keyId = isKey.keyId
-        binding.keyCodeEt.setText(isKey.keyCode)
-        binding.keyNfcEt.setText(isKey.keyNfc)
-        binding.keyMacEt.setText(isKey.macAddress)
-        if (CommonDictDataEnum.KEY_STATUS.commonDictRes.find { it.dictLabel == "正常" }?.dictValue == isKey.exStatus) {
-            binding.activateRb.isChecked = true
-        } else {
-            binding.deactivateRb.isChecked = true
+    companion object {
+        /**
+         * 显示更新钥匙对话框并设置回调
+         */
+        @JvmStatic
+        fun show(
+            isKey: IsKey,
+            onConfirm: (UpdateKeyDataVo) -> Unit
+        ) {
+            CustomDialog.show(
+                UpdateKeyDialog(isKey, onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
         }
     }
-}
+}

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

@@ -1,86 +1,87 @@
 package com.grkj.iscs.features.main.dialog.hardware_manage
 
-import android.content.Context
 import android.view.View
+import androidx.core.view.isVisible
 import com.grkj.data.enums.CommonDictDataEnum
 import com.grkj.data.model.dos.IsLock
 import com.grkj.data.model.vo.UpdateLockDataVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogUpdateLockBinding
+import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
-import razerdp.basepopup.BasePopupWindow
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 更新挂锁
+ * 更新挂锁对话框,基于 DialogX
+ * 使用:
+ * UpdateLockDialog.show(isLock) { updateVo -> /* handle */ }
  */
-class UpdateLockDialog(context: Context) : BasePopupWindow(context) {
+class UpdateLockDialog(
+    private val isLock: IsLock,
+    private val onConfirm: (UpdateLockDataVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_update_lock) {
+
     private lateinit var binding: DialogUpdateLockBinding
-    private var onConfirm: (UpdateLockDataVo) -> Unit = {}
-    private var lockId: Long = 0
 
-    init {
-        setContentView(R.layout.dialog_update_lock)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogUpdateLockBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogUpdateLockBinding.bind(contentView)
-        binding.cancel.setOnClickListener { dismiss() }
-        binding.closeIv.setOnClickListener { dismiss() }
-        binding.confirm.setOnClickListener {
-            if (checkData()) {
-                val dto = UpdateLockDataVo(
-                    lockId,
-                    binding.lockCodeEt.text.toString(),
-                    binding.lockNfcEt.text.toString(),
-                    binding.statusRg.checkedRadioButtonId == binding.activateRb.id,
-                    binding.remarkEt.text.toString().takeIf { it.isNotBlank() }
-                )
-                onConfirm(dto)
-                clear()
-                dismiss()
-            }
-        }
-    }
+        // 预填数据
+        binding.lockCodeEt.setText(isLock.lockCode)
+        binding.lockNfcEt.setText(isLock.lockNfc)
+        binding.remarkEt.setText(isLock.exRemark)
+        val normalValue = CommonDictDataEnum.PADLOCK_STATUS.commonDictRes
+            .find { it.dictLabel == "正常" }?.dictValue
+        binding.activateRb.isChecked = isLock.exStatus == normalValue
+        binding.deactivateRb.isChecked = !binding.activateRb.isChecked
 
-    private fun checkData(): Boolean {
-        if (binding.lockCodeEt.text.isBlank()) {
-            PopTip.build().tipDialog(R.string.please_input_lock_code)
-            return false
-        }
-        if (binding.lockNfcEt.text.isBlank()) {
-            PopTip.build().tipDialog(R.string.please_input_lock_nfc)
-            return false
-        }
-        if (binding.statusRg.checkedRadioButtonId == -1) {
-            PopTip.build().tipDialog(R.string.please_select_status)
-            return false
-        }
-        return true
-    }
+        // 取消/关闭
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
 
-    private fun clear() {
-        binding.lockCodeEt.setText("")
-        binding.lockNfcEt.setText("")
-        binding.remarkEt.setText("")
-        binding.statusRg.clearCheck()
-    }
+        // 确认
+        binding.confirm.setOnClickListener {
+            val code = binding.lockCodeEt.text.trim().toString()
+            val nfc = binding.lockNfcEt.text.trim().toString()
+            val statusChecked = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
 
-    fun setOnConfirmListener(listener: (UpdateLockDataVo) -> Unit) {
-        this.onConfirm = listener
+            if (code.isBlank()) {
+                PopTip.build().tipDialog(R.string.please_input_lock_code)
+                return@setOnClickListener
+            }
+            if (nfc.isBlank()) {
+                PopTip.build().tipDialog(R.string.please_input_lock_nfc)
+                return@setOnClickListener
+            }
+            // 构造并回调
+            val vo = UpdateLockDataVo(
+                isLock.lockId,
+                code,
+                nfc,
+                statusChecked,
+                binding.remarkEt.text.toString()
+            )
+            onConfirm(vo)
+            dialog?.dismiss()
+        }
     }
 
-    fun setLockData(lock: IsLock) {
-        lockId = lock.lockId
-        binding.lockCodeEt.setText(lock.lockCode)
-        binding.lockNfcEt.setText(lock.lockNfc)
-        if (CommonDictDataEnum.PADLOCK_STATUS.commonDictRes.find { it.dictLabel == "正常" }?.dictValue == lock.exStatus) {
-            binding.activateRb.isChecked = true
-
-        } else {
-            binding.deactivateRb.isChecked = true
+    companion object {
+        /**
+         * 显示更新挂锁对话框并设置回调
+         */
+        @JvmStatic
+        fun show(
+            isLock: IsLock,
+            onConfirm: (UpdateLockDataVo) -> Unit
+        ) {
+            CustomDialog.show(
+                UpdateLockDialog(isLock, onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
         }
-        binding.remarkEt.setText(lock.exRemark)
     }
-}
+}

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

@@ -1,81 +1,88 @@
 package com.grkj.iscs.features.main.dialog.hardware_manage
 
-import android.content.Context
 import android.view.View
+import com.grkj.data.enums.CommonDictDataEnum
 import com.grkj.data.model.dos.IsRfidToken
 import com.grkj.data.model.vo.UpdateRfidTokenDataVo
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogUpdateRfidTokenBinding
+import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tipDialog
+import com.kongzue.dialogx.dialogs.CustomDialog
 import com.kongzue.dialogx.dialogs.PopTip
-import razerdp.basepopup.BasePopupWindow
+import com.kongzue.dialogx.interfaces.OnBindView
 
 /**
- * 更新 RFID 标签
+ * 更新 RFID 标签对话框,基于 DialogX
+ * 使用:
+ * UpdateRfidTokenDialog.show(token) { updateVo -> /* handle */ }
  */
-class UpdateRfidTokenDialog(context: Context) : BasePopupWindow(context) {
+class UpdateRfidTokenDialog(
+    private val token: IsRfidToken,
+    private val onConfirm: (UpdateRfidTokenDataVo) -> Unit
+) : OnBindView<CustomDialog>(R.layout.dialog_update_rfid_token) {
+
     private lateinit var binding: DialogUpdateRfidTokenBinding
-    private var onConfirm: (UpdateRfidTokenDataVo) -> Unit = {}
-    private var rfidId: Long = 0
 
-    init {
-        setContentView(R.layout.dialog_update_rfid_token)
-    }
+    override fun onBind(dialog: CustomDialog?, v: View) {
+        binding = DialogUpdateRfidTokenBinding.bind(v)
+        dialog?.setMaskColor(CommonUtils.getColor(com.grkj.ui_base.R.color.scrim))
 
-    override fun onViewCreated(contentView: View) {
-        super.onViewCreated(contentView)
-        binding = DialogUpdateRfidTokenBinding.bind(contentView)
-        binding.cancel.setOnClickListener { dismiss() }
-        binding.closeIv.setOnClickListener { dismiss() }
-        binding.confirm.setOnClickListener {
-            if (checkData()) {
-                val dto = UpdateRfidTokenDataVo(
-                    rfidId,
-                    binding.rfidCodeEt.text.toString(),
-                    binding.rfidEt.text.toString(),
-                    binding.statusRg.checkedRadioButtonId == binding.activateRb.id,
-                    binding.remarkEt.text.toString().takeIf { it.isNotBlank() }
-                )
-                onConfirm(dto)
-                clear()
-                dismiss()
-            }
+        // 预填数据
+        binding.rfidCodeEt.setText(token.rfidCode)
+        binding.rfidEt.setText(token.rfid)
+        binding.remarkEt.setText(token.remark)
+        // 直接根据 status 字段值判断是否激活("0" 为正常)
+        if (token.status == CommonDictDataEnum.RFID_TOKEN_STATUS.commonDictRes.find { it.dictLabel == "正常" }?.dictValue) {
+            binding.activateRb.isChecked = true
+        } else {
+            binding.deactivateRb.isChecked = true
         }
-    }
 
-    private fun checkData(): Boolean {
-        if (binding.rfidCodeEt.text.isBlank()) {
-            PopTip.build().tipDialog(R.string.please_input_rfid_code)
-            return false
-        }
-        if (binding.rfidEt.text.isBlank()) {
-            PopTip.build().tipDialog(R.string.please_input_rfid)
-            return false
-        }
-        if (binding.statusRg.checkedRadioButtonId == -1) {
-            PopTip.build().tipDialog(R.string.please_select_status)
-            return false
-        }
-        return true
-    }
+        // 取消/关闭
+        binding.cancel.setOnClickListener { dialog?.dismiss() }
+        binding.closeIv.setOnClickListener { dialog?.dismiss() }
 
-    private fun clear() {
-        binding.rfidCodeEt.setText("")
-        binding.rfidEt.setText("")
-        binding.remarkEt.setText("")
-        binding.statusRg.clearCheck()
-    }
+        // 确认
+        binding.confirm.setOnClickListener {
+            val code = binding.rfidCodeEt.text.trim().toString()
+            val rfid = binding.rfidEt.text.trim().toString()
+            val statusChecked = binding.statusRg.checkedRadioButtonId == binding.activateRb.id
 
-    fun setOnConfirmListener(listener: (UpdateRfidTokenDataVo) -> Unit) {
-        this.onConfirm = listener
+            if (code.isEmpty()) {
+                PopTip.build().tipDialog(R.string.please_input_rfid_code)
+                return@setOnClickListener
+            }
+            if (rfid.isEmpty()) {
+                PopTip.build().tipDialog(R.string.please_input_rfid)
+                return@setOnClickListener
+            }
+            // 构造 DTO 并回调
+            val vo = UpdateRfidTokenDataVo(
+                token.rfidId,
+                code,
+                rfid,
+                statusChecked,
+                binding.remarkEt.text.toString()
+            )
+            onConfirm(vo)
+            dialog?.dismiss()
+        }
     }
 
-    fun setRfidTokenData(token: IsRfidToken) {
-        rfidId = token.rfidId
-        binding.rfidCodeEt.setText(token.rfidCode)
-        binding.rfidEt.setText(token.rfid)
-        binding.activateRb.isChecked = token.status == "0"
-        binding.deactivateRb.isChecked = token.status != "0"
-        binding.remarkEt.setText(token.remark)
+    companion object {
+        /**
+         * 显示更新 RFID 标签对话框并设置回调
+         */
+        @JvmStatic
+        fun show(
+            token: IsRfidToken,
+            onConfirm: (UpdateRfidTokenDataVo) -> Unit
+        ) {
+            CustomDialog.show(
+                UpdateRfidTokenDialog(token, onConfirm),
+                CustomDialog.ALIGN.CENTER
+            )
+        }
     }
 }

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

@@ -32,82 +32,11 @@ import kotlin.getValue
 @AndroidEntryPoint
 class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
     private val viewModel: PointManageViewModel by viewModels()
-    private lateinit var filterPointDialog: FilterPointDialog
-    private lateinit var addPointDialog: AddPointDialog
-    private lateinit var updatePointDialog: UpdatePointDialog
     override fun getLayoutId(): Int {
         return R.layout.fragment_point_manage
     }
 
     override fun initView() {
-        filterPointDialog = FilterPointDialog(requireContext())
-        filterPointDialog.popupGravity = Gravity.CENTER
-        addPointDialog = AddPointDialog(requireContext())
-        addPointDialog.popupGravity = Gravity.CENTER
-        updatePointDialog = UpdatePointDialog(requireContext())
-        updatePointDialog.popupGravity = Gravity.CENTER
-        filterPointDialog.setOnConfirmListener {
-            viewModel.pointFilterData = it
-            getPointData(nextPage = false)
-        }
-        addPointDialog.setOnConfirmListener {
-            viewModel.addIsolationPoint(it).observe(this) {
-                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)
-                        }
-                    )
-                }
-            }
-        }
-        updatePointDialog.setOnConfirmListener {
-            viewModel.updateIsolationPoint(it).observe(this) {
-                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)
-                        }
-                    )
-                }
-            }
-        }
         binding.back.setDebouncedClickListener {
             navController.popBackStack()
         }
@@ -116,30 +45,58 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
         }
         binding.addPoint.setDebouncedClickListener {
             viewModel.initDialogData().observe(this) {
-                addPointDialog.setWorkstationData(viewModel.workstationData.map {
+                AddPointDialog.show(viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.workstationId,
                         dataText = it.workstationName
                     )
-                })
-                addPointDialog.setRfidTokenData(viewModel.rfidTokenData.map {
+                }, viewModel.rfidTokenData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.rfidId,
                         dataText = "${it.rfidCode}(${it.rfid})"
                     )
-                })
-                addPointDialog.showPopupWindow()
+                }) {
+                    viewModel.addIsolationPoint(it).observe(this) {
+                        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.setWorkstationData(viewModel.workstationData.map {
+                FilterPointDialog.show(viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.workstationId,
                         dataText = it.workstationName
                     )
-                })
-                filterPointDialog.showPopupWindow()
+                }) {
+                    viewModel.pointFilterData = it
+                    getPointData(nextPage = false)
+                }
             }
         }
         binding.refreshLayout.setOnRefreshListener {
@@ -187,20 +144,45 @@ class PointMangeFragment : BaseFragment<FragmentPointManageBinding>() {
         }
         itemBinding.root.setDebouncedClickListener {
             viewModel.initDialogData().observe(this@PointMangeFragment) {
-                updatePointDialog.setWorkstationData(viewModel.workstationData.map {
+                UpdatePointDialog.show(item, viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.workstationId,
                         dataText = it.workstationName
                     )
-                })
-                updatePointDialog.setRfidTokenData(viewModel.rfidTokenData.map {
+                }, viewModel.rfidTokenData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.rfidId,
                         dataText = "${it.rfidCode}(${it.rfid})"
                     )
-                })
-                updatePointDialog.setRfidData(item)
-                updatePointDialog.showPopupWindow()
+                }) {
+                    viewModel.updateIsolationPoint(it).observe(this@PointMangeFragment) {
+                        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)
+                                }
+                            )
+                        }
+                    }
+                }
             }
         }
     }

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

@@ -33,121 +33,67 @@ import kotlin.getValue
 @AndroidEntryPoint
 class RoleManageFragment : BaseFragment<FragmentRoleManageBinding>() {
     private val viewModel: RoleManageViewModel by viewModels()
-    private lateinit var addRoleDialog: AddRoleDialog
-    private lateinit var updateRoleDialog: UpdateRoleDialog
-    private lateinit var filterRoleDialog: FilterRoleDialog
     override fun getLayoutId(): Int {
         return R.layout.fragment_role_manage
     }
 
     override fun initView() {
-        filterRoleDialog = FilterRoleDialog(requireContext())
-        filterRoleDialog.popupGravity = Gravity.CENTER
-        addRoleDialog = AddRoleDialog(requireContext())
-        addRoleDialog.popupGravity = Gravity.CENTER
-        updateRoleDialog = UpdateRoleDialog(requireContext())
-        updateRoleDialog.popupGravity = Gravity.CENTER
-        filterRoleDialog.setOnConfirmListener {
-            viewModel.roleFilterData = it
-            getRoleData(nextPage = false)
+        binding.back.setDebouncedClickListener {
+            navController.popBackStack()
         }
-        addRoleDialog.setOnConfirmListener {
-            if (it.roleKeys in RoleEnum.values().map { it.roleKey }) {
-                TipDialog.show(
-                    title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_failed)
-                        .toString(),
-                    dialogType = TipDialog.DialogType.ERROR,
-                    msg = CommonUtils.getStr(R.string.role_key_already_exists).toString(),
-                    countDownTime = 10,
-                    showConfirm = false,
-                    onCancelClick = {
-                        getRoleData(nextPage = false)
-                    }
-                )
-                return@setOnConfirmListener
-            }
-            viewModel.addRoleData(it).observe(this) {
-                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_role_succeed).toString(),
-                        countDownTime = 10,
-                        showConfirm = false,
-                        onCancelClick = {
-                            getRoleData(nextPage = false)
-                        }
-                    )
-                } else {
+        binding.delete.setDebouncedClickListener {
+            deleteSelect()
+        }
+        binding.add.setDebouncedClickListener {
+            AddRoleDialog.show {
+                if (it.roleKeys in RoleEnum.values().map { it.roleKey }) {
                     TipDialog.show(
                         title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_failed)
                             .toString(),
                         dialogType = TipDialog.DialogType.ERROR,
-                        msg = CommonUtils.getStr(R.string.add_role_failed).toString(),
+                        msg = CommonUtils.getStr(R.string.role_key_already_exists).toString(),
                         countDownTime = 10,
                         showConfirm = false,
                         onCancelClick = {
                             getRoleData(nextPage = false)
                         }
                     )
+                    return@show
                 }
-            }
-        }
-        updateRoleDialog.setOnConfirmListener {
-            if (it.roleKeys in RoleEnum.values().map { it.roleKey } && it.isPreset == false) {
-                TipDialog.show(
-                    title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_failed)
-                        .toString(),
-                    dialogType = TipDialog.DialogType.ERROR,
-                    msg = CommonUtils.getStr(R.string.role_key_already_exists).toString(),
-                    countDownTime = 10,
-                    showConfirm = false,
-                    onCancelClick = {
-                        getRoleData(nextPage = false)
+                viewModel.addRoleData(it).observe(this) {
+                    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_role_succeed).toString(),
+                            countDownTime = 10,
+                            showConfirm = false,
+                            onCancelClick = {
+                                getRoleData(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_role_failed).toString(),
+                            countDownTime = 10,
+                            showConfirm = false,
+                            onCancelClick = {
+                                getRoleData(nextPage = false)
+                            }
+                        )
                     }
-                )
-                return@setOnConfirmListener
-            }
-            viewModel.updateRoleData(it).observe(this) {
-                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_role_succeed).toString(),
-                        countDownTime = 10,
-                        showConfirm = false,
-                        onCancelClick = {
-                            getRoleData(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_role_failed).toString(),
-                        countDownTime = 10,
-                        showConfirm = false,
-                        onCancelClick = {
-                            getRoleData(nextPage = false)
-                        }
-                    )
                 }
             }
         }
-        binding.back.setDebouncedClickListener {
-            navController.popBackStack()
-        }
-        binding.delete.setDebouncedClickListener {
-            deleteSelect()
-        }
-        binding.add.setDebouncedClickListener {
-            addRoleDialog.showPopupWindow()
-        }
         binding.filter.setDebouncedClickListener {
-            filterRoleDialog.showPopupWindow()
+            FilterRoleDialog.show {
+                viewModel.roleFilterData = it
+                getRoleData(nextPage = false)
+            }
         }
         binding.refreshLayout.setOnRefreshListener {
             viewModel.roleFilterData = null
@@ -194,15 +140,61 @@ class RoleManageFragment : BaseFragment<FragmentRoleManageBinding>() {
         itemBinding.root.setOnClickListener {
             viewModel.getFunctionalPermissionsByRoleId(item.roleId)
                 .observe(this@RoleManageFragment) {
-                    updateRoleDialog.setRoleData(UpdateRoleDataEntity().apply {
+                    UpdateRoleDialog.show(UpdateRoleDataEntity().apply {
                         roleId = item.roleId
                         roleName = item.roleName
                         roleKeys = item.roleKey.toString()
                         status = item.status == "0"
                         functionalPermissions = it
                         isPreset = item.roleKey in RoleEnum.values().map { it.roleKey }
-                    })
-                    updateRoleDialog.showPopupWindow()
+                    }) {
+                        if (it.roleKeys in RoleEnum.values()
+                                .map { it.roleKey } && it.isPreset == false
+                        ) {
+                            TipDialog.show(
+                                title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_failed)
+                                    .toString(),
+                                dialogType = TipDialog.DialogType.ERROR,
+                                msg = CommonUtils.getStr(R.string.role_key_already_exists)
+                                    .toString(),
+                                countDownTime = 10,
+                                showConfirm = false,
+                                onCancelClick = {
+                                    getRoleData(nextPage = false)
+                                }
+                            )
+                            return@show
+                        }
+                        viewModel.updateRoleData(it).observe(this@RoleManageFragment) {
+                            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_role_succeed)
+                                        .toString(),
+                                    countDownTime = 10,
+                                    showConfirm = false,
+                                    onCancelClick = {
+                                        getRoleData(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_role_failed)
+                                        .toString(),
+                                    countDownTime = 10,
+                                    showConfirm = false,
+                                    onCancelClick = {
+                                        getRoleData(nextPage = false)
+                                    }
+                                )
+                            }
+                        }
+                    }
                 }
         }
     }
@@ -232,7 +224,9 @@ class RoleManageFragment : BaseFragment<FragmentRoleManageBinding>() {
             PopTip.tip(R.string.please_select_role)
             return
         }
-        if (viewModel.roleManageDataList.any { it.isSelected&&it.roleKey in RoleEnum.values().map { it.roleKey } }){
+        if (viewModel.roleManageDataList.any {
+                it.isSelected && it.roleKey in RoleEnum.values().map { it.roleKey }
+            }) {
             PopTip.tip(R.string.role_in_preset_tip)
             return
         }

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

@@ -32,82 +32,11 @@ import kotlin.getValue
 @AndroidEntryPoint
 class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
     private val viewModel: UserManageViewModel by viewModels()
-    private lateinit var addUserDialog: AddUserDialog
-    private lateinit var filterUserDialog: FilterUserDialog
-    private lateinit var updateUserDialog: UpdateUserDialog
     override fun getLayoutId(): Int {
         return R.layout.fragment_user_manage
     }
 
     override fun initView() {
-        addUserDialog = AddUserDialog(requireContext())
-        addUserDialog.popupGravity = Gravity.CENTER
-        filterUserDialog = FilterUserDialog(requireContext())
-        filterUserDialog.popupGravity = Gravity.CENTER
-        updateUserDialog = UpdateUserDialog(requireContext())
-        updateUserDialog.popupGravity = Gravity.CENTER
-        filterUserDialog.setOnConfirmListener {
-            viewModel.userFilterData = it
-            getUserData(nextPage = false)
-        }
-        addUserDialog.setOnConfirmListener {
-            viewModel.addUser(it).observe(this) {
-                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_user_succeed).toString(),
-                        countDownTime = 10,
-                        showConfirm = false,
-                        onCancelClick = {
-                            getUserData(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_user_failed).toString(),
-                        countDownTime = 10,
-                        showConfirm = false,
-                        onCancelClick = {
-                            getUserData(false)
-                        }
-                    )
-                }
-            }
-        }
-        updateUserDialog.setOnConfirmListener {
-            viewModel.updateUser(it).observe(this) {
-                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_user_succeed).toString(),
-                        countDownTime = 10,
-                        showConfirm = false,
-                        onCancelClick = {
-                            getUserData(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_user_failed).toString(),
-                        countDownTime = 10,
-                        showConfirm = false,
-                        onCancelClick = {
-                            getUserData(false)
-                        }
-                    )
-                }
-            }
-        }
         binding.back.setDebouncedClickListener {
             navController.popBackStack()
         }
@@ -116,23 +45,52 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
         }
         binding.addUser.setDebouncedClickListener {
             viewModel.getRoleAndWorkStationData().observe(this) {
-                addUserDialog.setRoleData(viewModel.roleData.map {
+                AddUserDialog.show(viewModel.roleData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.roleId,
                         dataText = it.roleName
                     )
-                })
-                addUserDialog.setWorkstationData(viewModel.workstationData.map {
+                }, viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.workstationId,
                         dataText = it.workstationName
                     )
-                })
-                addUserDialog.showPopupWindow()
+                }) {
+                    viewModel.addUser(it).observe(this) {
+                        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_user_succeed).toString(),
+                                countDownTime = 10,
+                                showConfirm = false,
+                                onCancelClick = {
+                                    getUserData(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_user_failed).toString(),
+                                countDownTime = 10,
+                                showConfirm = false,
+                                onCancelClick = {
+                                    getUserData(false)
+                                }
+                            )
+                        }
+                    }
+                }
             }
         }
         binding.filterUser.setDebouncedClickListener {
-            filterUserDialog.showPopupWindow()
+            FilterUserDialog.show {
+                viewModel.userFilterData = it
+                getUserData(nextPage = false)
+            }
         }
         binding.refreshLayout.setOnRefreshListener {
             viewModel.userFilterData = null
@@ -178,20 +136,45 @@ class UserManageFragment : BaseFragment<FragmentUserManageBinding>() {
         }
         itemBinding.root.setOnClickListener {
             viewModel.getRoleAndWorkStationData().observe(this@UserManageFragment) {
-                updateUserDialog.setRoleData(viewModel.roleData.map {
+                UpdateUserDialog.show(item, viewModel.roleData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.roleId,
                         dataText = it.roleName
                     )
-                })
-                updateUserDialog.setWorkstationData(viewModel.workstationData.map {
+                }, viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.workstationId,
                         dataText = it.workstationName
                     )
-                })
-                updateUserDialog.setUserData(item)
-                updateUserDialog.showPopupWindow()
+                }) {
+                    viewModel.updateUser(it).observe(this@UserManageFragment) {
+                        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_user_succeed).toString(),
+                                countDownTime = 10,
+                                showConfirm = false,
+                                onCancelClick = {
+                                    getUserData(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_user_failed).toString(),
+                                countDownTime = 10,
+                                showConfirm = false,
+                                onCancelClick = {
+                                    getUserData(false)
+                                }
+                            )
+                        }
+                    }
+                }
             }
         }
     }

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

@@ -27,49 +27,45 @@ import kotlin.getValue
 @AndroidEntryPoint
 class WorkstationManageFragment : BaseFragment<FragmentWorkstationManageBinding>() {
     private val viewModel: WorkstationManageViewModel by viewModels()
-    private lateinit var addWorkstationDialog: AddWorkstationDialog
     private val indentPx: Int by lazy { AutoSizeUtils.dp2px(requireContext(), 20f) }
     override fun getLayoutId(): Int {
         return R.layout.fragment_workstation_manage
     }
 
     override fun initView() {
-        addWorkstationDialog = AddWorkstationDialog(requireContext())
-        addWorkstationDialog.popupGravity = Gravity.CENTER
-        addWorkstationDialog.setOnConfirmListener {
-            viewModel.addWorkstation(it).observe(this) {
-                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_workstation_succeed).toString(),
-                        countDownTime = 10,
-                        showConfirm = false,
-                        onCancelClick = {
-                            getWorkstationManageData()
-                        }
-                    )
-                } 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_workstation_failed).toString(),
-                        countDownTime = 10,
-                        showConfirm = false,
-                        onCancelClick = {
-                            getWorkstationManageData()
-                        }
-                    )
-                }
-            }
-        }
         binding.back.setDebouncedClickListener {
             navController.popBackStack()
         }
         binding.addWorkstation.setDebouncedClickListener {
-            addWorkstationDialog.showPopupWindow()
+            AddWorkstationDialog.show{
+                viewModel.addWorkstation(it).observe(this) {
+                    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_workstation_succeed).toString(),
+                            countDownTime = 10,
+                            showConfirm = false,
+                            onCancelClick = {
+                                getWorkstationManageData()
+                            }
+                        )
+                    } 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_workstation_failed).toString(),
+                            countDownTime = 10,
+                            showConfirm = false,
+                            onCancelClick = {
+                                getWorkstationManageData()
+                            }
+                        )
+                    }
+                }
+            }
         }
         binding.deleteWorkstation.setDebouncedClickListener {
             deleteSelectWorkstation()

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

@@ -31,71 +31,38 @@ import dagger.hilt.android.AndroidEntryPoint
 @AndroidEntryPoint
 class CardManageFragment : BaseFragment<FragmentCardManageBinding>() {
     private val viewModel: CardManageViewModel by viewModels()
-    private lateinit var addCardDialog: AddCardDialog
-    private lateinit var filterCardDialog: FilterCardDialog
-    private lateinit var updateCardDialog: UpdateCardDialog
 
     override fun getLayoutId() = R.layout.fragment_card_manage
 
     override fun initView() {
-        addCardDialog = AddCardDialog(requireContext()).apply { popupGravity = Gravity.CENTER }
-        filterCardDialog =
-            FilterCardDialog(requireContext()).apply { popupGravity = Gravity.CENTER }
-        updateCardDialog =
-            UpdateCardDialog(requireContext()).apply { popupGravity = Gravity.CENTER }
-
-        filterCardDialog.setOnConfirmListener {
-            viewModel.cardFilterData = it
-            loadCards(reset = true)
-        }
-        // 添加卡片
-        addCardDialog.setOnConfirmListener { vo ->
-            viewModel.addCard(vo).observe(this) { ok ->
-                @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) }
-                )
-            }
-        }
-        // 更新卡片
-        updateCardDialog.setOnConfirmListener { vo ->
-            viewModel.updateCard(vo).observe(this) { ok ->
-                @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) }
-                )
-            }
-        }
-
         binding.back.setDebouncedClickListener { navController.popBackStack() }
         binding.add.setDebouncedClickListener {
             viewModel.getAllUserData().observe(this) {
-                addCardDialog.setUserData(it)
-                addCardDialog.showPopupWindow()
+                AddCardDialog.show(it) { vo ->
+                    viewModel.addCard(vo).observe(this) { ok ->
+                        @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) }
+                        )
+                    }
+                }
             }
         }
         binding.filter.setDebouncedClickListener {
             viewModel.getAllUserData().observe(this) {
-                filterCardDialog.setUserData(it)
-                filterCardDialog.showPopupWindow()
+                FilterCardDialog.show(it) {
+                    viewModel.cardFilterData = it
+                    loadCards(reset = true)
+                }
             }
         }
         binding.delete.setDebouncedClickListener { deleteSelectedCards() }
@@ -137,9 +104,23 @@ class CardManageFragment : BaseFragment<FragmentCardManageBinding>() {
         }
         bind.root.setOnClickListener {
             viewModel.getAllUserData().observe(this) {
-                updateCardDialog.setUserData(it)
-                updateCardDialog.setCardData(item)
-                updateCardDialog.showPopupWindow()
+                UpdateCardDialog.show(item, it) { vo ->
+                    viewModel.updateCard(vo).observe(this) { ok ->
+                        @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) }
+                        )
+                    }
+                }
             }
         }
     }

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

@@ -1,7 +1,6 @@
 package com.grkj.iscs.features.main.fragment.hardware_manage
 
 import android.graphics.Color
-import android.view.Gravity
 import androidx.fragment.app.viewModels
 import com.drake.brv.BindingAdapter
 import com.drake.brv.annotaion.DividerOrientation
@@ -30,82 +29,11 @@ import dagger.hilt.android.AndroidEntryPoint
 @AndroidEntryPoint
 class KeyManageFragment : BaseFragment<FragmentKeyManageBinding>() {
     private val viewModel: KeyManageViewModel by viewModels()
-    private lateinit var addKeyDialog: AddKeyDialog
-    private lateinit var filterKeyDialog: FilterKeyDialog
-    private lateinit var updateKeyDialog: UpdateKeyDialog
     override fun getLayoutId(): Int {
         return R.layout.fragment_key_manage
     }
 
     override fun initView() {
-        addKeyDialog = AddKeyDialog(requireContext())
-        addKeyDialog.popupGravity = Gravity.CENTER
-        filterKeyDialog = FilterKeyDialog(requireContext())
-        filterKeyDialog.popupGravity = Gravity.CENTER
-        updateKeyDialog = UpdateKeyDialog(requireContext())
-        updateKeyDialog.popupGravity = Gravity.CENTER
-        filterKeyDialog.setOnConfirmListener {
-            viewModel.keyFilterData = it
-            getKeyData(nextPage = false)
-        }
-        addKeyDialog.setOnConfirmListener {
-            viewModel.addKey(it).observe(this) {
-                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_key_succeed).toString(),
-                        countDownTime = 10,
-                        showConfirm = false,
-                        onCancelClick = {
-                            getKeyData(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_key_failed).toString(),
-                        countDownTime = 10,
-                        showConfirm = false,
-                        onCancelClick = {
-                            getKeyData(false)
-                        }
-                    )
-                }
-            }
-        }
-        updateKeyDialog.setOnConfirmListener {
-            viewModel.updateKey(it).observe(this) {
-                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_key_succeed).toString(),
-                        countDownTime = 10,
-                        showConfirm = false,
-                        onCancelClick = {
-                            getKeyData(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_key_failed).toString(),
-                        countDownTime = 10,
-                        showConfirm = false,
-                        onCancelClick = {
-                            getKeyData(false)
-                        }
-                    )
-                }
-            }
-        }
         binding.back.setDebouncedClickListener {
             navController.popBackStack()
         }
@@ -113,10 +41,41 @@ class KeyManageFragment : BaseFragment<FragmentKeyManageBinding>() {
             deleteSelected()
         }
         binding.add.setDebouncedClickListener {
-            addKeyDialog.showPopupWindow()
+            AddKeyDialog.show {
+                viewModel.addKey(it).observe(this) {
+                    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_key_succeed).toString(),
+                            countDownTime = 10,
+                            showConfirm = false,
+                            onCancelClick = {
+                                getKeyData(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_key_failed).toString(),
+                            countDownTime = 10,
+                            showConfirm = false,
+                            onCancelClick = {
+                                getKeyData(false)
+                            }
+                        )
+                    }
+                }
+            }
         }
         binding.filter.setDebouncedClickListener {
-            filterKeyDialog.showPopupWindow()
+            FilterKeyDialog.show {
+                viewModel.keyFilterData = it
+                getKeyData(nextPage = false)
+            }
         }
         binding.refreshLayout.setOnRefreshListener {
             viewModel.keyFilterData = null
@@ -161,8 +120,35 @@ class KeyManageFragment : BaseFragment<FragmentKeyManageBinding>() {
             setSelectAllListener()
         }
         itemBinding.root.setOnClickListener {
-            updateKeyDialog.setKeyData(item)
-            updateKeyDialog.showPopupWindow()
+            UpdateKeyDialog.show(item) {
+                viewModel.updateKey(it).observe(this@KeyManageFragment) {
+                    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_key_succeed).toString(),
+                            countDownTime = 10,
+                            showConfirm = false,
+                            onCancelClick = {
+                                getKeyData(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_key_failed).toString(),
+                            countDownTime = 10,
+                            showConfirm = false,
+                            onCancelClick = {
+                                getKeyData(false)
+                            }
+                        )
+                    }
+                }
+            }
         }
     }
 

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

@@ -33,65 +33,36 @@ import dagger.hilt.android.AndroidEntryPoint
 @AndroidEntryPoint
 class LockManageFragment : BaseFragment<FragmentLockManageBinding>() {
     private val viewModel: LockManageViewModel by viewModels()
-    private lateinit var addLockDialog: AddLockDialog
-    private lateinit var filterLockDialog: FilterLockDialog
-    private lateinit var updateLockDialog: UpdateLockDialog
 
     override fun getLayoutId() = R.layout.fragment_lock_manage
 
     override fun initView() {
-        addLockDialog = AddLockDialog(requireContext()).apply { popupGravity = Gravity.CENTER }
-        filterLockDialog =
-            FilterLockDialog(requireContext()).apply { popupGravity = Gravity.CENTER }
-        updateLockDialog =
-            UpdateLockDialog(requireContext()).apply { popupGravity = Gravity.CENTER }
-
-        filterLockDialog.setOnConfirmListener {
-            viewModel.lockFilterData = it
-            loadLocks(reset = true)
-        }
-        // 添加挂锁回调
-        addLockDialog.setOnConfirmListener { vo ->
-            viewModel.addLock(vo).observe(this) { ok ->
-                @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_lock_succeed else R.string.add_lock_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 = { loadLocks(reset = true) }
-                )
+        binding.back.setDebouncedClickListener { navController.popBackStack() }
+        binding.add.setDebouncedClickListener {
+            AddLockDialog.show { vo ->
+                viewModel.addLock(vo).observe(this) { ok ->
+                    @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_lock_succeed else R.string.add_lock_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 = { loadLocks(reset = true) }
+                    )
+                }
             }
         }
-
-        // 更新挂锁回调
-        updateLockDialog.setOnConfirmListener { vo ->
-            viewModel.updateLock(vo).observe(this) { ok ->
-                @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_lock_succeed else R.string.update_lock_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 = { loadLocks(reset = true) }
-                )
+        binding.filter.setDebouncedClickListener {
+            FilterLockDialog.show {
+                viewModel.lockFilterData = it
+                loadLocks(reset = true)
             }
         }
-
-
-        binding.back.setDebouncedClickListener { navController.popBackStack() }
-        binding.add.setDebouncedClickListener { addLockDialog.showPopupWindow() }
-        binding.filter.setDebouncedClickListener { filterLockDialog.showPopupWindow() }
         binding.delete.setDebouncedClickListener { deleteSelectedLocks() }
         binding.refreshLayout.setOnRefreshListener {
             viewModel.lockFilterData = null
@@ -131,8 +102,23 @@ class LockManageFragment : BaseFragment<FragmentLockManageBinding>() {
             }
         }
         bind.root.setOnClickListener {
-            updateLockDialog.setLockData(item)
-            updateLockDialog.showPopupWindow()
+            UpdateLockDialog.show(item) { vo ->
+                viewModel.updateLock(vo).observe(this) { ok ->
+                    @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_lock_succeed else R.string.update_lock_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 = { loadLocks(reset = true) }
+                    )
+                }
+            }
         }
     }
 

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

@@ -28,63 +28,36 @@ import dagger.hilt.android.AndroidEntryPoint
 @AndroidEntryPoint
 class RfidTokenManageFragment : BaseFragment<FragmentRfidTokenManageBinding>() {
     private val viewModel: RfidTokenManageViewModel by viewModels()
-    private lateinit var addDialog: AddRfidTokenDialog
-    private lateinit var filterDialog: FilterRfidTokenDialog
-    private lateinit var updateDialog: UpdateRfidTokenDialog
 
     override fun getLayoutId() = R.layout.fragment_rfid_token_manage
 
     override fun initView() {
-        addDialog = AddRfidTokenDialog(requireContext()).apply { popupGravity = Gravity.CENTER }
-        filterDialog =
-            FilterRfidTokenDialog(requireContext()).apply { popupGravity = Gravity.CENTER }
-        updateDialog =
-            UpdateRfidTokenDialog(requireContext()).apply { popupGravity = Gravity.CENTER }
-
-        filterDialog.setOnConfirmListener {
-            viewModel.rfidTokenFilterData = it
-            loadTokens(reset = true)
-        }
-        // 添加 RFID 标签
-        addDialog.setOnConfirmListener { vo ->
-            viewModel.addRfidToken(vo).observe(this) { ok ->
-                @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_rfid_token_succeed else R.string.add_rfid_token_failed
+        binding.back.setDebouncedClickListener { navController.popBackStack() }
+        binding.add.setDebouncedClickListener {
+            AddRfidTokenDialog.show { vo ->
+                viewModel.addRfidToken(vo).observe(this) { ok ->
+                    @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_rfid_token_succeed else R.string.add_rfid_token_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 = { loadTokens(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 = { loadTokens(reset = true) }
+                    )
+                }
             }
         }
-        // 更新 RFID 标签
-        updateDialog.setOnConfirmListener { vo ->
-            viewModel.updateRfidToken(vo).observe(this) { ok ->
-                @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_rfid_token_succeed else R.string.update_rfid_token_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 = { loadTokens(reset = true) }
-                )
+        binding.filter.setDebouncedClickListener {
+            FilterRfidTokenDialog.show {
+                viewModel.rfidTokenFilterData = it
+                loadTokens(reset = true)
             }
         }
-
-        binding.back.setDebouncedClickListener { navController.popBackStack() }
-        binding.add.setDebouncedClickListener { addDialog.showPopupWindow() }
-        binding.filter.setDebouncedClickListener { filterDialog.showPopupWindow() }
         binding.delete.setDebouncedClickListener { deleteSelectedTokens() }
         binding.refreshLayout.setOnRefreshListener {
             viewModel.rfidTokenFilterData = null
@@ -111,7 +84,7 @@ class RfidTokenManageFragment : BaseFragment<FragmentRfidTokenManageBinding>() {
     private fun bindTokenItem(holder: BindingAdapter.BindingViewHolder) {
         val bind = holder.getBinding<ItemRfidTokenManageBinding>()
         val item = holder.getModel<IsRfidToken>()
-        bind.rfidCode.text = item.rfidCode
+
         bind.rfid.text = item.rfid
         bind.status.text = if (item.status == "0") "正常" else "异常"
         bind.select.apply {
@@ -124,8 +97,23 @@ class RfidTokenManageFragment : BaseFragment<FragmentRfidTokenManageBinding>() {
             }
         }
         bind.root.setOnClickListener {
-            updateDialog.setRfidTokenData(item)
-            updateDialog.showPopupWindow()
+            UpdateRfidTokenDialog.show(item) { vo ->
+                viewModel.updateRfidToken(vo).observe(this) { ok ->
+                    @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_rfid_token_succeed else R.string.update_rfid_token_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 = { loadTokens(reset = true) }
+                    )
+                }
+            }
         }
     }
 

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

@@ -39,7 +39,6 @@ import kotlin.getValue
 @AndroidEntryPoint
 class HomeFragment : BaseFragment<FragmentHomeBinding>() {
     private val viewModel: HomeViewModel by viewModels()
-    private lateinit var textDropDownDialog: TextDropDownDialog
     private val quickEntranceList = mutableListOf<MenuItemEntity>(
         MenuItemEntity(
             0,
@@ -54,8 +53,6 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
     }
 
     override fun initView() {
-        textDropDownDialog = TextDropDownDialog(requireContext())
-        textDropDownDialog.setWidthAsAnchorView(true)
         binding.quickEntranceRv.apply {
             linear(orientation = LinearLayout.HORIZONTAL)
         }.setup {
@@ -177,7 +174,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
         onSelected: (TextDropDownDialog.TextDropDownEntity) -> Unit
     ) {
         viewModel.getWorkstationData().observe(this) {
-            textDropDownDialog.setData(
+            TextDropDownDialog.showSingle(
                 viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.workstationId,
@@ -190,18 +187,17 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
                             dataText = getString(R.string.all)
                         )
                     )
-                })
-            textDropDownDialog.setOnItemSelectListener {
+                }, workstationTv
+            ) {
                 workstationTv.text = it.getShowText()
                 onSelected(it)
                 getHomeData()
             }
-            textDropDownDialog.showPopupWindow(workstationTv)
         }
     }
 
     private fun setLockModeData() {
-        textDropDownDialog.setData(
+        TextDropDownDialog.showSingle(
             LockModeEnum.values().map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataTag = it.getLockModeType(),
@@ -214,8 +210,8 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
                         dataText = getString(R.string.all)
                     )
                 )
-            })
-        textDropDownDialog.setOnItemSelectListener {
+            }, binding.lockMode
+        ) {
             binding.lockMode.text = it.getShowText()
             if (it.getShowText() == getString(R.string.all)) {
                 viewModel.selectedLockMode = ""
@@ -224,7 +220,6 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
             }
             getHomeData()
         }
-        textDropDownDialog.showPopupWindow(binding.lockMode)
     }
 
     private fun BindingAdapter.BindingViewHolder.onQuickEntranceBinding(holder: BindingAdapter.BindingViewHolder) {

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

@@ -44,14 +44,11 @@ class CreateJobFragment : BaseFragment<FragmentCreateJobBinding>() {
     private var selectedPointData: List<PointManageVo> = mutableListOf()
     private var selectedLockerData: List<UserManageVo> = mutableListOf()
     private var selectedColockerData: List<UserManageVo> = mutableListOf()
-    private lateinit var textDropDownDialog: TextDropDownDialog
     override fun getLayoutId(): Int {
         return R.layout.fragment_create_job
     }
 
     override fun initView() {
-        textDropDownDialog = TextDropDownDialog(requireContext())
-        textDropDownDialog.setWidthAsAnchorView(true)
         binding.back.setDebouncedClickListener {
             TipDialog.show(
                 title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_hint).toString(),
@@ -433,36 +430,32 @@ class CreateJobFragment : BaseFragment<FragmentCreateJobBinding>() {
 
     private fun setWorkstationData() {
         viewModel.getWorkstationData().observe(this) {
-            textDropDownDialog.setData(
+            TextDropDownDialog.showSingle(
                 viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.workstationId,
                         dataText = it.workstationName
                     )
-                })
-            textDropDownDialog.setOnItemSelectListener {
+                },binding.workstationTv) {
                 binding.workstationTv.text = it.getShowText()
                 selectedWorkstationId = it.getId()
             }
-            textDropDownDialog.showPopupWindow(binding.workstationTv)
         }
     }
 
     private fun setLockModeData() {
-        textDropDownDialog.setData(
+        TextDropDownDialog.showSingle(
             LockModeEnum.values().map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataTag = it.getLockModeType(),
                     dataText = it.getLockModeStr()
                 )
-            })
-        textDropDownDialog.setOnItemSelectListener {
+            },binding.lockModeTv) {
             binding.lockModeTv.text = it.getShowText()
             selectedLockMode = it.getTag()
             binding.selectColockerLayout.isVisible = selectedLockMode?.contains(
                 LockStepEnum.COLOCK.type.toString()
             ) == true
         }
-        textDropDownDialog.showPopupWindow(binding.lockModeTv)
     }
 }

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

@@ -3,12 +3,13 @@ package com.grkj.iscs.features.main.fragment.job_manage
 import android.widget.LinearLayout
 import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
-import androidx.lifecycle.ViewModelProvider
 import com.drake.brv.BindingAdapter
 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.grkj.data.enums.LockModeEnum
+import com.grkj.data.enums.LockStepEnum
 import com.grkj.data.model.vo.PointManageVo
 import com.grkj.data.model.vo.UserManageVo
 import com.grkj.iscs.R
@@ -17,8 +18,6 @@ import com.grkj.iscs.databinding.FragmentCreateSopBinding
 import com.grkj.iscs.databinding.ItemSelectMemberBinding
 import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
-import com.grkj.data.enums.LockModeEnum
-import com.grkj.data.enums.LockStepEnum
 import com.grkj.iscs.features.main.viewmodel.job_manage.SopViewModel
 import com.grkj.iscs.utils.getLockModeStr
 import com.grkj.iscs.utils.getLockModeType
@@ -29,7 +28,6 @@ import com.kongzue.dialogx.dialogs.PopTip
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
 import dagger.hilt.android.AndroidEntryPoint
-import kotlin.getValue
 
 /**
  * 新建SOP
@@ -42,14 +40,11 @@ class CreateSopFragment : BaseFragment<FragmentCreateSopBinding>() {
     private var selectedPointData: List<PointManageVo> = mutableListOf()
     private var selectedLockerData: List<UserManageVo> = mutableListOf()
     private var selectedColockerData: List<UserManageVo> = mutableListOf()
-    private lateinit var textDropDownDialog: TextDropDownDialog
     override fun getLayoutId(): Int {
         return R.layout.fragment_create_sop
     }
 
     override fun initView() {
-        textDropDownDialog = TextDropDownDialog(requireContext())
-        textDropDownDialog.setWidthAsAnchorView(true)
         binding.back.setDebouncedClickListener {
             TipDialog.show(
                 title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_hint).toString(),
@@ -309,7 +304,8 @@ class CreateSopFragment : BaseFragment<FragmentCreateSopBinding>() {
         }
         if (selectedLockMode?.contains(
                 LockStepEnum.COLOCK.type.toString()
-            ) == true &&selectedColockerData.isEmpty()) {
+            ) == true && selectedColockerData.isEmpty()
+        ) {
             PopTip.tip(com.grkj.ui_base.R.string.select_coloker)
             return false
         }
@@ -372,36 +368,32 @@ class CreateSopFragment : BaseFragment<FragmentCreateSopBinding>() {
 
     private fun setWorkstationData() {
         viewModel.getWorkstationData().observe(this) {
-            textDropDownDialog.setData(
+            TextDropDownDialog.showSingle(
                 viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.workstationId,
                         dataText = it.workstationName
                     )
-                })
-            textDropDownDialog.setOnItemSelectListener {
+                },binding.workstationTv) {
                 binding.workstationTv.text = it.getShowText()
                 selectedWorkstationId = it.getId()
             }
-            textDropDownDialog.showPopupWindow(binding.workstationTv)
         }
     }
 
     private fun setLockModeData() {
-        textDropDownDialog.setData(
+        TextDropDownDialog.showSingle(
             LockModeEnum.values().map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataTag = it.getLockModeType(),
                     dataText = it.getLockModeStr()
                 )
-            })
-        textDropDownDialog.setOnItemSelectListener {
+            },binding.lockModeTv) {
             binding.lockModeTv.text = it.getShowText()
             selectedLockMode = it.getTag()
             binding.selectColockerLayout.isVisible = selectedLockMode?.contains(
                 LockStepEnum.COLOCK.type.toString()
             ) == true
         }
-        textDropDownDialog.showPopupWindow(binding.lockModeTv)
     }
 }

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

@@ -40,14 +40,11 @@ class CreateSopJobFragment : BaseFragment<FragmentCreateSopJobBinding>() {
     private var selectedPointData: List<PointManageVo> = mutableListOf()
     private var selectedLockerData: List<UserManageVo> = mutableListOf()
     private var selectedColockerData: List<UserManageVo> = mutableListOf()
-    private lateinit var textDropDownDialog: TextDropDownDialog
     override fun getLayoutId(): Int {
         return R.layout.fragment_create_sop_job
     }
 
     override fun initView() {
-        textDropDownDialog = TextDropDownDialog(requireContext())
-        textDropDownDialog.setWidthAsAnchorView(true)
         binding.back.setDebouncedClickListener {
             TipDialog.show(
                 title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_hint).toString(),
@@ -72,8 +69,10 @@ class CreateSopJobFragment : BaseFragment<FragmentCreateSopJobBinding>() {
             if (checkData()) {
                 TipDialog.show(
                     title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_hint).toString(),
-                    msg = CommonUtils.getStr(R.string.job_save_tip,
-                        args = listOf<String>(binding.jobNameEt.text.toString()).toTypedArray()).toString(),
+                    msg = CommonUtils.getStr(
+                        R.string.job_save_tip,
+                        args = listOf<String>(binding.jobNameEt.text.toString()).toTypedArray()
+                    ).toString(),
                     dialogType = TipDialog.DialogType.INFO,
                     countDownTime = 10,
                     onConfirmClick = {
@@ -311,18 +310,16 @@ class CreateSopJobFragment : BaseFragment<FragmentCreateSopJobBinding>() {
      */
     private fun setWorkstationData() {
         viewModel.getWorkstationData().observe(this) {
-            textDropDownDialog.setData(
+            TextDropDownDialog.showSingle(
                 viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.workstationId,
                         dataText = it.workstationName
                     )
-                })
-            textDropDownDialog.setOnItemSelectListener {
+                },binding.workstationTv) {
                 binding.workstationTv.text = it.getShowText()
                 selectedWorkstationId = it.getId()
             }
-            textDropDownDialog.showPopupWindow(binding.workstationTv)
         }
     }
 
@@ -330,15 +327,14 @@ class CreateSopJobFragment : BaseFragment<FragmentCreateSopJobBinding>() {
      * 设置sop数据
      */
     private fun setSopData() {
-        textDropDownDialog.setData(
+        TextDropDownDialog.showSingle(
             viewModel.sopData.map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataId = it.sopId,
                     dataObject = it,
                     dataText = it.sopName ?: ""
                 )
-            })
-        textDropDownDialog.setOnItemSelectListener {
+            },binding.sopTv) {
             binding.sopTv.text = it.getShowText()
             selectedSopId = it.getId()
             selectedSop = it.getData() as SopManageVo
@@ -347,7 +343,6 @@ class CreateSopJobFragment : BaseFragment<FragmentCreateSopJobBinding>() {
             ) == true
             loadSopData(it.getId())
         }
-        textDropDownDialog.showPopupWindow(binding.sopTv)
     }
 
     /**

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

@@ -41,14 +41,11 @@ class EditJobFragment : BaseFragment<FragmentEditJobBinding>() {
     private var selectedPointData: List<PointManageVo> = mutableListOf()
     private var selectedLockerData: List<UserManageVo> = mutableListOf()
     private var selectedColockerData: List<UserManageVo> = mutableListOf()
-    private lateinit var textDropDownDialog: TextDropDownDialog
     override fun getLayoutId(): Int {
         return R.layout.fragment_edit_job
     }
 
     override fun initView() {
-        textDropDownDialog = TextDropDownDialog(requireContext())
-        textDropDownDialog.setWidthAsAnchorView(true)
         binding.back.setDebouncedClickListener {
             TipDialog.show(
                 title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_hint).toString(),
@@ -351,36 +348,32 @@ class EditJobFragment : BaseFragment<FragmentEditJobBinding>() {
 
     private fun setWorkstationData() {
         viewModel.getWorkstationData().observe(this) {
-            textDropDownDialog.setData(
+            TextDropDownDialog.showSingle(
                 viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.workstationId,
                         dataText = it.workstationName
                     )
-                })
-            textDropDownDialog.setOnItemSelectListener {
+                },binding.workstationTv){
                 binding.workstationTv.text = it.getShowText()
                 selectedWorkstationId = it.getId()
             }
-            textDropDownDialog.showPopupWindow(binding.workstationTv)
         }
     }
 
     private fun setLockModeData() {
-        textDropDownDialog.setData(
+        TextDropDownDialog.showSingle(
             LockModeEnum.values().map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataTag = it.getLockModeType(),
                     dataText = it.getLockModeStr()
                 )
-            })
-        textDropDownDialog.setOnItemSelectListener {
+            },binding.lockModeTv){
             binding.lockModeTv.text = it.getShowText()
             selectedLockMode = it.getTag()
             binding.selectColockerLayout.isVisible = selectedLockMode?.contains(
                 LockStepEnum.COLOCK.type.toString()
             ) == true
         }
-        textDropDownDialog.showPopupWindow(binding.lockModeTv)
     }
 }

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

@@ -42,14 +42,11 @@ class EditSopFragment : BaseFragment<FragmentEditSopBinding>() {
     private var selectedPointData: List<PointManageVo> = mutableListOf()
     private var selectedLockerData: List<UserManageVo> = mutableListOf()
     private var selectedColockerData: List<UserManageVo> = mutableListOf()
-    private lateinit var textDropDownDialog: TextDropDownDialog
     override fun getLayoutId(): Int {
         return R.layout.fragment_edit_sop
     }
 
     override fun initView() {
-        textDropDownDialog = TextDropDownDialog(requireContext())
-        textDropDownDialog.setWidthAsAnchorView(true)
         binding.back.setDebouncedClickListener {
             TipDialog.show(
                 title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_hint).toString(),
@@ -316,36 +313,32 @@ class EditSopFragment : BaseFragment<FragmentEditSopBinding>() {
 
     private fun setWorkstationData() {
         viewModel.getWorkstationData().observe(this) {
-            textDropDownDialog.setData(
+            TextDropDownDialog.showSingle(
                 viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
                         dataId = it.workstationId,
                         dataText = it.workstationName
                     )
-                })
-            textDropDownDialog.setOnItemSelectListener {
+                },binding.workstationTv) {
                 binding.workstationTv.text = it.getShowText()
                 selectedWorkstationId = it.getId()
             }
-            textDropDownDialog.showPopupWindow(binding.workstationTv)
         }
     }
 
     private fun setLockModeData() {
-        textDropDownDialog.setData(
+        TextDropDownDialog.showSingle(
             LockModeEnum.values().map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
                     dataTag = it.getLockModeType(),
                     dataText = it.getLockModeStr()
                 )
-            })
-        textDropDownDialog.setOnItemSelectListener {
+            },binding.lockModeTv){
             binding.lockModeTv.text = it.getShowText()
             selectedLockMode = it.getTag()
             binding.selectColockerLayout.isVisible = selectedLockMode?.contains(
                 LockStepEnum.COLOCK.type.toString()
             ) == true
         }
-        textDropDownDialog.showPopupWindow(binding.lockModeTv)
     }
 }

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

@@ -40,14 +40,11 @@ class EditSopJobFragment : BaseFragment<FragmentEditSopJobBinding>() {
     private var selectedPointData: List<PointManageVo> = mutableListOf()
     private var selectedLockerData: List<UserManageVo> = mutableListOf()
     private var selectedColockerData: List<UserManageVo> = mutableListOf()
-    private lateinit var textDropDownDialog: TextDropDownDialog
     override fun getLayoutId(): Int {
         return R.layout.fragment_edit_sop_job
     }
 
     override fun initView() {
-        textDropDownDialog = TextDropDownDialog(requireContext())
-        textDropDownDialog.setWidthAsAnchorView(true)
         binding.back.setDebouncedClickListener {
             TipDialog.show(
                 title = CommonUtils.getStr(com.grkj.ui_base.R.string.action_hint).toString(),
@@ -121,25 +118,19 @@ class EditSopJobFragment : BaseFragment<FragmentEditSopJobBinding>() {
                     LockStepEnum.COLOCK.type.toString()
                 ) == true
             )
-            GlobalDataTempStore.getInstance()
-                .saveData(
-                    DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID,
-                    selectedWorkstationId!!
+            GlobalDataTempStore.getInstance().saveData(
+                    DataTransferConstants.KEY_SELECT_POINT_WORKSTATION_ID, selectedWorkstationId!!
                 )
             GlobalDataTempStore.getInstance()
                 .saveData(DataTransferConstants.KEY_SELECTED_MEMBER_LOCKER_DATA, selectedLockerData)
-            GlobalDataTempStore.getInstance()
-                .saveData(
-                    DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA,
-                    selectedColockerData
+            GlobalDataTempStore.getInstance().saveData(
+                    DataTransferConstants.KEY_SELECTED_MEMBER_COLOCKER_DATA, selectedColockerData
                 )
-            GlobalDataTempStore.getInstance()
-                .saveData(
+            GlobalDataTempStore.getInstance().saveData(
                     DataTransferConstants.KEY_PREVIEW_STEP_TITLE_DATA,
                     CommonUtils.getStr(R.string.create_sop_title).toString()
                 )
-            GlobalDataTempStore.getInstance()
-                .saveData(
+            GlobalDataTempStore.getInstance().saveData(
                     DataTransferConstants.KEY_PREVIEW_STEP_ICON_DATA,
                     R.mipmap.icon_data_manage_menu_point_manage
                 )
@@ -319,18 +310,15 @@ class EditSopJobFragment : BaseFragment<FragmentEditSopJobBinding>() {
      */
     private fun setWorkstationData() {
         viewModel.getWorkstationData().observe(this) {
-            textDropDownDialog.setData(
+            TextDropDownDialog.showSingle(
                 viewModel.workstationData.map {
                     TextDropDownDialog.SimpleTextDropDownEntity(
-                        dataId = it.workstationId,
-                        dataText = it.workstationName
+                        dataId = it.workstationId, dataText = it.workstationName
                     )
-                })
-            textDropDownDialog.setOnItemSelectListener {
+                },binding.workstationTv) {
                 binding.workstationTv.text = it.getShowText()
                 selectedWorkstationId = it.getId()
             }
-            textDropDownDialog.showPopupWindow(binding.workstationTv)
         }
     }
 
@@ -338,15 +326,12 @@ class EditSopJobFragment : BaseFragment<FragmentEditSopJobBinding>() {
      * 设置sop数据
      */
     private fun setSopData() {
-        textDropDownDialog.setData(
+        TextDropDownDialog.showSingle(
             viewModel.sopData.map {
                 TextDropDownDialog.SimpleTextDropDownEntity(
-                    dataId = it.sopId,
-                    dataObject = it,
-                    dataText = it.sopName ?: ""
+                    dataId = it.sopId, dataObject = it, dataText = it.sopName ?: ""
                 )
-            })
-        textDropDownDialog.setOnItemSelectListener {
+            },binding.sopTv) {
             binding.sopTv.text = it.getShowText()
             selectedSopId = it.getId()
             selectedSop = it.getData() as SopManageVo
@@ -355,7 +340,6 @@ class EditSopJobFragment : BaseFragment<FragmentEditSopJobBinding>() {
             ) == true
             loadSopData(it.getId())
         }
-        textDropDownDialog.showPopupWindow(binding.sopTv)
     }
 
     /**

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

@@ -81,17 +81,18 @@ class CardManageViewModel @Inject constructor(
     fun addCard(data: AddCardDataVo): LiveData<Boolean> =
         liveData(Dispatchers.IO) {
             var defaultCardCodeSize = hardwareRepository.getDefaultCardNameCount()
-            var isCard = IsJobCard()
-            isCard = BeanUtils.copyData<IsJobCard>(data, isCard)
-            isCard.exStatus =
+            var isCard = BeanUtils.copyProperties(data, IsJobCard::class.java)
+            isCard?.exStatus =
                 if (data.exStatus) {
                     CommonDictDataEnum.JOB_CARD_STATUS.commonDictRes.find { it.dictLabel == "正常" }?.dictValue
                 } else {
                     CommonDictDataEnum.JOB_CARD_STATUS.commonDictRes.find { it.dictLabel == "异常" }?.dictValue
                 }
-            isCard.cardCode = "CARD_${defaultCardCodeSize + 1}"
-            hardwareRepository.addCardInfo(isCard)
-            emit(true)
+            isCard?.cardCode = "CARD_${defaultCardCodeSize + 1}"
+            isCard?.let {
+                hardwareRepository.addCardInfo(it)
+                emit(true)
+            } ?: emit(false)
         }
 
     /**
@@ -100,16 +101,17 @@ class CardManageViewModel @Inject constructor(
     fun updateCard(data: UpdateCardDataVo): LiveData<Boolean> =
         liveData(Dispatchers.IO) {
             var defaultCardCodeSize = hardwareRepository.getDefaultCardNameCount()
-            var isCard = IsJobCard()
-            isCard = BeanUtils.copyData<IsJobCard>(data, isCard)
-            isCard.exStatus =
+            var isCard = BeanUtils.copyProperties(data, IsJobCard::class.java)
+            isCard?.exStatus =
                 if (data.exStatus) {
                     CommonDictDataEnum.JOB_CARD_STATUS.commonDictRes.find { it.dictLabel == "正常" }?.dictValue
                 } else {
                     CommonDictDataEnum.JOB_CARD_STATUS.commonDictRes.find { it.dictLabel == "异常" }?.dictValue
                 }
-            isCard.cardCode = "CARD_${defaultCardCodeSize + 1}"
-            hardwareRepository.updateCardInfo(isCard)
-            emit(true)
+            isCard?.cardCode = "CARD_${defaultCardCodeSize + 1}"
+            isCard?.let {
+                hardwareRepository.updateCardInfo(it)
+                emit(true)
+            } ?: emit(false)
         }
 }

+ 1 - 1
app/src/main/res/values-land/dimens.xml

@@ -64,5 +64,5 @@
     <dimen name="vector_icon_size">40.8dp</dimen>
     <dimen name="item_login_tip_v_margin_top">32dp</dimen>
     <dimen name="item_login_tip_v_margin_right">23dp</dimen>
-    <dimen name="normal_text_size_24">41.5sp</dimen>
+    <dimen name="normal_text_size_24">24sp</dimen>
 </resources>

+ 4 - 0
data/src/main/java/com/grkj/data/data/DictConstants.kt

@@ -23,6 +23,10 @@ object DictConstants {
      * 硬件工卡异常状态
      */
     const val KEY_JOB_CARD_STATUS = "job_card_status"
+    /**
+     * 硬件RFID标签异常状态
+     */
+    const val KEY_RFID_TOKEN_STATUS = "rfid_token_status"
 
     /**
      * 挂锁异常原因

+ 6 - 0
data/src/main/java/com/grkj/data/enums/CommonDictDataEnum.kt

@@ -43,6 +43,12 @@ enum class CommonDictDataEnum(val dictKey: String, val commonDictRes: List<Commo
             SimpleCommonDictRes("正常", "1"),
         )
     ),
+    RFID_TOKEN_STATUS(
+        DictConstants.KEY_RFID_TOKEN_STATUS, listOf(
+            SimpleCommonDictRes("异常", "0"),
+            SimpleCommonDictRes("正常", "1"),
+        )
+    ),
     KEY_REASON(
         DictConstants.KEY_KEY_REASON, listOf(
             SimpleCommonDictRes("钥匙损坏", "0"),

+ 1 - 1
data/src/main/java/com/grkj/data/model/vo/UpdateCardDataVo.kt

@@ -6,7 +6,7 @@ package com.grkj.data.model.vo
 data class UpdateCardDataVo(
     val cardId: Long,
     val cardNfc: String,
-    val userId: Long,
+    val userId: Long?,
     val userName: String,
     val exStatus: Boolean,
     val exRemark: String?

+ 31 - 0
shared/src/main/java/com/grkj/shared/utils/KeyboardUtils.kt

@@ -0,0 +1,31 @@
+package com.grkj.shared.utils
+
+import android.app.Activity
+import android.content.Context
+import android.view.MotionEvent
+import android.view.View
+import android.view.inputmethod.InputMethodManager
+import android.widget.EditText
+
+/**
+ * Utility to show and hide the soft keyboard.
+ */
+object KeyboardUtils {
+    /**
+     * Show the soft keyboard for the given view.
+     */
+    fun showKeyboard(context: Context, view: View) {
+        view.requestFocus()
+        val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+        imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
+    }
+
+    /**
+     * Hide the soft keyboard in the given activity.
+     */
+    fun hideKeyboard(activity: Activity) {
+        val imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+        val view = activity.currentFocus ?: View(activity)
+        imm.hideSoftInputFromWindow(view.windowToken, 0)
+    }
+}

+ 0 - 1
ui-base/build.gradle.kts

@@ -61,7 +61,6 @@ dependencies {
     api(libs.sik.extension.android)
     api(libs.dialogx)
     api(libs.fastble)
-    api("io.github.razerdp:BasePopup:3.2.1")
     api("io.github.scwang90:refresh-layout-kernel:3.0.0-alpha")
     api("io.github.scwang90:refresh-header-classics:3.0.0-alpha")
     api("io.github.scwang90:refresh-footer-classics:3.0.0-alpha")

+ 25 - 0
ui-base/src/main/java/com/grkj/ui_base/base/BaseActivity.kt

@@ -3,6 +3,8 @@ package com.grkj.ui_base.base
 import android.content.res.Configuration
 import android.content.res.Resources
 import android.os.Bundle
+import android.view.MotionEvent
+import android.widget.EditText
 import androidx.activity.enableEdgeToEdge
 import androidx.appcompat.app.AppCompatActivity
 import androidx.databinding.DataBindingUtil
@@ -13,6 +15,7 @@ import com.google.android.material.bottomnavigation.BottomNavigationView
 import com.google.android.material.navigation.NavigationBarView
 import com.grkj.shared.model.EventBean
 import com.grkj.data.data.EventConstants
+import com.grkj.shared.utils.KeyboardUtils
 import com.grkj.ui_base.config.ISCSConfig
 import com.grkj.ui_base.dialog.LoadingDialog
 import com.grkj.ui_base.utils.event.JumpViewEvent
@@ -60,6 +63,28 @@ abstract class BaseActivity<V : ViewDataBinding> : AppCompatActivity(), CustomAd
         initObservers()
     }
 
+    /** 点击空白处隐藏软键盘 */
+    override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
+        if (ev.action == MotionEvent.ACTION_DOWN) {
+            currentFocus?.let { v ->
+                if (v is EditText) {
+                    val location = IntArray(2)
+                    v.getLocationOnScreen(location)
+                    val x = ev.rawX.toInt()
+                    val y = ev.rawY.toInt()
+                    // 如果触摸点不在 EditText 内部,则隐藏键盘
+                    if (x < location[0] || x > location[0] + v.width ||
+                        y < location[1] || y > location[1] + v.height
+                    ) {
+                        KeyboardUtils.hideKeyboard(this)
+                        v.clearFocus()
+                    }
+                }
+            }
+        }
+        return super.dispatchTouchEvent(ev)
+    }
+
     /** 请求权限,基于 PermissionUtils */
     protected fun requestPermissionsIfNeeded(
         vararg permissions: String,

+ 28 - 0
ui-base/src/main/java/com/grkj/ui_base/base/BaseFragment.kt

@@ -4,8 +4,10 @@ import android.content.res.Configuration
 import android.content.res.Resources
 import android.os.Bundle
 import android.view.LayoutInflater
+import android.view.MotionEvent
 import android.view.View
 import android.view.ViewGroup
+import android.widget.EditText
 import androidx.annotation.LayoutRes
 import androidx.databinding.DataBindingUtil
 import androidx.databinding.ViewDataBinding
@@ -13,6 +15,7 @@ import androidx.fragment.app.Fragment
 import androidx.navigation.NavController
 import androidx.navigation.fragment.findNavController
 import com.grkj.shared.model.EventBean
+import com.grkj.shared.utils.KeyboardUtils
 import com.grkj.ui_base.config.ISCSConfig
 import com.grkj.ui_base.utils.event.LoadingEvent
 import com.kongzue.dialogx.dialogs.PopTip
@@ -57,9 +60,34 @@ abstract class BaseFragment<V : ViewDataBinding> : Fragment(), CustomAdapt {
             initListeners()
             initObservers()
             isFirstLoad = false
+            // 点击空白处隐藏键盘
+            setupHideKeyboardOnTouch(view)
         }
     }
 
+    /** 递归为非 EditText 的子 View 添加点击隐藏键盘 */
+    private fun setupHideKeyboardOnTouch(view: View) {
+        if (view !is EditText) {
+            view.setOnTouchListener { _, event ->
+                if (event.action == MotionEvent.ACTION_DOWN) {
+                    activity?.currentFocus?.let { focusView ->
+                        if (focusView is EditText) {
+                            KeyboardUtils.hideKeyboard(requireActivity())
+                            focusView.clearFocus()
+                        }
+                    }
+                }
+                false
+            }
+        }
+        if (view is ViewGroup) {
+            for (i in 0 until view.childCount) {
+                setupHideKeyboardOnTouch(view.getChildAt(i))
+            }
+        }
+    }
+
+
     /** EventBus 事件,子类可重写 */
     @Subscribe(threadMode = ThreadMode.MAIN)
     open fun onEvent(event: EventBean<Any>) {