Jelajahi Sumber

refactor(更新)
- 快捷入口配置
- 分组空白列表点击选中

周文健 10 bulan lalu
induk
melakukan
76abbc5b94

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

@@ -74,6 +74,7 @@ class MainActivity() : BaseActivity<ActivityMainBinding>() {
     )
 
     override fun navHostFragmentId() = R.id.nav_host_fragment
+
     override fun getLayoutId(): Int {
         return R.layout.activity_main
     }

+ 50 - 18
app/src/main/java/com/grkj/iscs/features/main/dialog/QuickEntranceConfigDialog.kt

@@ -1,6 +1,5 @@
 package com.grkj.iscs.features.main.dialog
 
-import android.content.Context
 import android.graphics.Color
 import android.view.View
 import android.widget.LinearLayout
@@ -10,46 +9,70 @@ import com.drake.brv.BindingAdapter
 import com.drake.brv.annotaion.ItemOrientation
 import com.drake.brv.listener.DefaultItemTouchCallback
 import com.drake.brv.utils.linear
-import com.drake.brv.utils.models
 import com.drake.brv.utils.setup
 import com.google.android.flexbox.FlexboxLayoutManager
-import com.google.gson.Gson
-import com.google.gson.reflect.TypeToken
 import com.grkj.data.data.MMKVConstants
+import com.grkj.data.data.MainDomainData
 import com.grkj.data.enums.RoleFunctionalPermissionsEnum
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.DialogQuickEntranceConfigBinding
 import com.grkj.iscs.databinding.ItemQuickEntranceConfigBinding
-import com.grkj.iscs.features.main.entity.MenuItemEntity
 import com.grkj.iscs.features.main.entity.QuickEntranceMenuItemEntity
+import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.FullScreenDialog
+import com.kongzue.dialogx.dialogs.PopTip
 import com.kongzue.dialogx.interfaces.OnBindView
 import com.kongzue.dialogx.util.views.ActivityScreenShotImageView
 import com.sik.sikcore.extension.getMMKVData
+import com.sik.sikcore.extension.saveMMKVData
 import com.sik.sikcore.extension.setDebouncedClickListener
 
 /**
  * 快捷入口配置弹窗
  */
-class QuickEntranceConfigDialog(private val context: Context, private val saved: () -> Unit) :
+class QuickEntranceConfigDialog(private val saved: () -> Unit) :
     OnBindView<FullScreenDialog>(R.layout.dialog_quick_entrance_config) {
-    private val selectedQuickEntranceConfig = mutableListOf<QuickEntranceMenuItemEntity>()
+    private var selectedQuickEntranceConfig = mutableListOf<QuickEntranceMenuItemEntity>()
+    private val allQuickEntranceConfig: MutableList<QuickEntranceMenuItemEntity> =
+        RoleFunctionalPermissionsEnum.values().filter { it.level != 0 }.mapIndexed { index, value ->
+            QuickEntranceMenuItemEntity(
+                index,
+                QuickEntranceMenuItemEntity.getMenuIconId(value),
+                value.description,
+                value,
+                QuickEntranceMenuItemEntity.getNavGraphId(value),
+                QuickEntranceMenuItemEntity.getDestId(value)
+            )
+        }
+            .filter { MainDomainData.permissions.contains(it.permission.functionalPermission) && it.navGraph != 0 }
+            .toMutableList()
     private val quickEntranceList: MutableList<QuickEntranceMenuItemEntity>
         get() {
             val quickEntryConfigJson = MMKVConstants.KEY_QUICK_ENTRY_CONFIG.getMMKVData("")
-            return if (quickEntryConfigJson.isEmpty()) {
+            val permissions = quickEntryConfigJson.split(",").filter { it.isNotBlank() }
+                .mapNotNull { runCatching { RoleFunctionalPermissionsEnum.valueOf(it) }.getOrNull() }
+            return if (permissions.isEmpty()) {
                 mutableListOf<QuickEntranceMenuItemEntity>(
                     QuickEntranceMenuItemEntity(
                         0,
                         R.mipmap.icon_job_manage_create_job,
                         RoleFunctionalPermissionsEnum.CREATE_JOB.description,
-                        RoleFunctionalPermissionsEnum.CREATE_JOB.functionalPermission
+                        RoleFunctionalPermissionsEnum.CREATE_JOB,
+                        QuickEntranceMenuItemEntity.getNavGraphId(RoleFunctionalPermissionsEnum.CREATE_JOB),
+                        QuickEntranceMenuItemEntity.getDestId(RoleFunctionalPermissionsEnum.CREATE_JOB)
                     )
                 )
             } else {
-                Gson().fromJson<MutableList<QuickEntranceMenuItemEntity>>(
-                    quickEntryConfigJson, object : TypeToken<MutableList<QuickEntranceMenuItemEntity>>() {}.type
-                )
+                permissions.mapIndexed { index, value ->
+                    QuickEntranceMenuItemEntity(
+                        index,
+                        QuickEntranceMenuItemEntity.getMenuIconId(value),
+                        value.description,
+                        value,
+                        QuickEntranceMenuItemEntity.getNavGraphId(value),
+                        QuickEntranceMenuItemEntity.getDestId(value)
+                    )
+                }.toMutableList()
             }
         }
     private lateinit var binding: DialogQuickEntranceConfigBinding
@@ -57,10 +80,13 @@ class QuickEntranceConfigDialog(private val context: Context, private val saved:
         dialog.setMaskColor(Color.parseColor("#4D000000"))
         binding = DialogQuickEntranceConfigBinding.bind(contentView)
         ActivityScreenShotImageView.hideContentView = true
+        selectedQuickEntranceConfig = quickEntranceList.onEach {
+            it.itemOrientationDrag = ItemOrientation.HORIZONTAL
+        }
         binding.selectedRvList.apply {
             linear(orientation = LinearLayout.HORIZONTAL)
         }.setup {
-            addType<MenuItemEntity>(R.layout.item_quick_entrance_config)
+            addType<QuickEntranceMenuItemEntity>(R.layout.item_quick_entrance_config)
             itemTouchHelper = ItemTouchHelper(object : DefaultItemTouchCallback() {
                 /**
                  * 当拖拽动作完成且松开手指时触发
@@ -75,16 +101,18 @@ class QuickEntranceConfigDialog(private val context: Context, private val saved:
             onBind {
                 onQuickEntranceBinding(this, false)
             }
-        }
+        }.models = selectedQuickEntranceConfig
         binding.allRvList.apply {
             layoutManager = FlexboxLayoutManager(context)
         }.setup {
-            addType<MenuItemEntity>(R.layout.item_quick_entrance_config)
+            addType<QuickEntranceMenuItemEntity>(R.layout.item_quick_entrance_config)
             onBind {
                 onQuickEntranceBinding(this, true)
             }
-        }
+        }.models = allQuickEntranceConfig
         binding.save.setDebouncedClickListener {
+            MMKVConstants.KEY_QUICK_ENTRY_CONFIG.saveMMKVData(selectedQuickEntranceConfig.map { it.permission.name }
+                .joinToString(","))
             saved()
             dialog.dismiss()
         }
@@ -105,6 +133,10 @@ class QuickEntranceConfigDialog(private val context: Context, private val saved:
         itemBinding.remove.isVisible = !showAdd
         itemBinding.root.setDebouncedClickListener {
             if (showAdd) {
+                if (selectedQuickEntranceConfig.size == 5) {
+                    PopTip.build().tip(R.string.quick_entrance_most_set_tip)
+                    return@setDebouncedClickListener
+                }
                 item.itemOrientationDrag = ItemOrientation.HORIZONTAL
                 selectedQuickEntranceConfig.add(item)
             } else {
@@ -122,8 +154,8 @@ class QuickEntranceConfigDialog(private val context: Context, private val saved:
          * 显示
          */
         @JvmStatic
-        fun show(context: Context, saved: () -> Unit) {
-            FullScreenDialog.build().setCustomView(QuickEntranceConfigDialog(context, saved)).show()
+        fun show(saved: () -> Unit) {
+            FullScreenDialog.build().setCustomView(QuickEntranceConfigDialog(saved)).show()
         }
     }
 }

+ 114 - 3
app/src/main/java/com/grkj/iscs/features/main/entity/QuickEntranceMenuItemEntity.kt

@@ -2,7 +2,8 @@ package com.grkj.iscs.features.main.entity
 
 import com.drake.brv.annotaion.ItemOrientation
 import com.drake.brv.item.ItemDrag
-import com.google.android.material.badge.BadgeDrawable
+import com.grkj.data.enums.RoleFunctionalPermissionsEnum
+import com.grkj.iscs.R
 
 /**
  * 快捷入口菜单实体
@@ -12,7 +13,117 @@ data class QuickEntranceMenuItemEntity(
     val type: Int,
     val menuIconId: Int,
     val menuText: String,
-    val permission: String,
+    val permission: RoleFunctionalPermissionsEnum,
+    val navGraph: Int,
+    val destId: Int,
     var badgeNum: Int = 0,
     override var itemOrientationDrag: Int = ItemOrientation.NONE
-) : ItemDrag
+) : ItemDrag {
+
+    companion object {
+        /**
+         * 获取图标id
+         */
+        @JvmStatic
+        fun getMenuIconId(permission: RoleFunctionalPermissionsEnum): Int {
+            return when (permission) {
+                RoleFunctionalPermissionsEnum.USER_MANAGE -> R.mipmap.icon_data_manage_menu_user_manage
+                RoleFunctionalPermissionsEnum.ROLE_MANAGE -> R.mipmap.icon_data_manage_menu_role_manage
+                RoleFunctionalPermissionsEnum.WORKSTATION_MANAGE -> R.mipmap.icon_data_manage_menu_area_manage
+                RoleFunctionalPermissionsEnum.POINT_MANAGE -> R.mipmap.icon_data_manage_menu_point_manage
+                RoleFunctionalPermissionsEnum.IN_PROGRESS_JOB -> R.mipmap.icon_job_manage_in_progress_job
+                RoleFunctionalPermissionsEnum.CREATE_SOP -> R.mipmap.icon_job_manage_create_sop
+                RoleFunctionalPermissionsEnum.SOP_MANAGE -> R.mipmap.icon_job_manage_sop_manage
+                RoleFunctionalPermissionsEnum.EXCEPTION_JOB -> R.mipmap.icon_bottom_menu_exception_manage
+                RoleFunctionalPermissionsEnum.CREATE_JOB -> R.mipmap.icon_job_manage_create_job
+                RoleFunctionalPermissionsEnum.JOB_MANAGE -> R.mipmap.icon_bottom_menu_job_manage
+                RoleFunctionalPermissionsEnum.CREATE_SOP_JOB -> R.mipmap.icon_job_manage_create_sop
+                RoleFunctionalPermissionsEnum.LOCKED_POINT -> R.mipmap.icon_data_manage_menu_point_manage
+                RoleFunctionalPermissionsEnum.SLOT_MANAGE -> R.mipmap.dock_no_key
+                RoleFunctionalPermissionsEnum.KEY_MANAGE -> R.mipmap.dock_has_key
+                RoleFunctionalPermissionsEnum.LOCK_MANAGE -> R.drawable.icon_ticket_lock
+                RoleFunctionalPermissionsEnum.CARD_MANAGE -> R.drawable.icon_login_menu_card
+                RoleFunctionalPermissionsEnum.RFID_MANAGE -> R.drawable.icon_login_menu_card
+                RoleFunctionalPermissionsEnum.EXCEPTION_REPORT -> R.mipmap.icon_exception
+                RoleFunctionalPermissionsEnum.EXCEPTION_MANAGE -> R.mipmap.icon_bottom_menu_exception_manage
+                RoleFunctionalPermissionsEnum.USER_INFO -> R.mipmap.icon_data_manage_menu_user_manage
+                RoleFunctionalPermissionsEnum.RESET_PASSWORD -> R.drawable.icon_login_menu_password
+                RoleFunctionalPermissionsEnum.FINGERPRINT_SETTING -> com.grkj.ui_base.R.drawable.icon_fingerprint
+                RoleFunctionalPermissionsEnum.FACE_SETTING -> R.drawable.icon_login_menu_face
+                RoleFunctionalPermissionsEnum.CARD_SETTING -> R.drawable.icon_login_menu_card
+                else -> 0
+            }
+        }
+
+        /**
+         * 获取导航
+         */
+        @JvmStatic
+        fun getNavGraphId(permission: RoleFunctionalPermissionsEnum): Int {
+            return when (permission) {
+                RoleFunctionalPermissionsEnum.USER_MANAGE, RoleFunctionalPermissionsEnum.ROLE_MANAGE,
+                RoleFunctionalPermissionsEnum.WORKSTATION_MANAGE, RoleFunctionalPermissionsEnum.POINT_MANAGE -> R.navigation.nav_data_manage
+
+                RoleFunctionalPermissionsEnum.IN_PROGRESS_JOB,
+                RoleFunctionalPermissionsEnum.CREATE_SOP,
+                RoleFunctionalPermissionsEnum.SOP_MANAGE,
+                RoleFunctionalPermissionsEnum.CREATE_JOB,
+                RoleFunctionalPermissionsEnum.JOB_MANAGE,
+                RoleFunctionalPermissionsEnum.LOCKED_POINT,
+                RoleFunctionalPermissionsEnum.CREATE_SOP_JOB -> R.navigation.nav_job_manage
+
+                RoleFunctionalPermissionsEnum.EXCEPTION_JOB -> R.navigation.nav_exception_job_manage
+
+                RoleFunctionalPermissionsEnum.SLOT_MANAGE,
+                RoleFunctionalPermissionsEnum.KEY_MANAGE,
+                RoleFunctionalPermissionsEnum.LOCK_MANAGE,
+                RoleFunctionalPermissionsEnum.CARD_MANAGE,
+                RoleFunctionalPermissionsEnum.RFID_MANAGE -> R.navigation.nav_hardware_manage
+
+                RoleFunctionalPermissionsEnum.EXCEPTION_REPORT,
+                RoleFunctionalPermissionsEnum.EXCEPTION_MANAGE -> R.navigation.nav_exception_manage
+
+                RoleFunctionalPermissionsEnum.USER_INFO,
+                RoleFunctionalPermissionsEnum.RESET_PASSWORD,
+                RoleFunctionalPermissionsEnum.FINGERPRINT_SETTING,
+                RoleFunctionalPermissionsEnum.FACE_SETTING,
+                RoleFunctionalPermissionsEnum.CARD_SETTING -> R.navigation.nav_user_info
+
+                else -> 0
+            }
+        }
+
+        /**
+         * 获取目标
+         */
+        @JvmStatic
+        fun getDestId(permission: RoleFunctionalPermissionsEnum): Int {
+            return when (permission) {
+                RoleFunctionalPermissionsEnum.USER_MANAGE -> R.id.action_dataManageHomeFragment_to_userManageFragment
+                RoleFunctionalPermissionsEnum.ROLE_MANAGE -> R.id.action_dataManageHomeFragment_to_roleManageFragment
+                RoleFunctionalPermissionsEnum.WORKSTATION_MANAGE -> R.id.action_dataManageHomeFragment_to_workstationManageFragment
+                RoleFunctionalPermissionsEnum.POINT_MANAGE -> R.id.action_dataManageHomeFragment_to_pointMangeFragment
+                RoleFunctionalPermissionsEnum.IN_PROGRESS_JOB -> R.id.action_jobManageHomeFragment_to_inProgressJobManageFragment
+                RoleFunctionalPermissionsEnum.CREATE_SOP -> R.id.action_jobManageHomeFragment_to_createSopFragment
+                RoleFunctionalPermissionsEnum.SOP_MANAGE -> R.id.action_jobManageHomeFragment_to_sopManageFragment
+                RoleFunctionalPermissionsEnum.CREATE_JOB -> R.id.action_jobManageHomeFragment_to_createJobFragment
+                RoleFunctionalPermissionsEnum.JOB_MANAGE -> R.id.action_jobManageHomeFragment_to_jobManageFragment
+                RoleFunctionalPermissionsEnum.CREATE_SOP_JOB -> R.id.action_jobManageHomeFragment_to_createSopJobFragment
+                RoleFunctionalPermissionsEnum.LOCKED_POINT -> R.id.action_jobManageHomeFragment_to_lockedPointsFragment
+                RoleFunctionalPermissionsEnum.SLOT_MANAGE -> R.id.action_hardwareManageHomeFragment_to_slotsManageFragment
+                RoleFunctionalPermissionsEnum.KEY_MANAGE -> R.id.action_hardwareManageHomeFragment_to_keyManageFragment
+                RoleFunctionalPermissionsEnum.LOCK_MANAGE -> R.id.action_hardwareManageHomeFragment_to_lockManageFragment
+                RoleFunctionalPermissionsEnum.CARD_MANAGE -> R.id.action_hardwareManageHomeFragment_to_cardManageFragment
+                RoleFunctionalPermissionsEnum.RFID_MANAGE -> R.id.action_hardwareManageHomeFragment_to_rfidTokenManageFragment
+                RoleFunctionalPermissionsEnum.EXCEPTION_REPORT -> R.id.action_exceptionManageHomeFragment_to_exceptionReportFragment
+                RoleFunctionalPermissionsEnum.EXCEPTION_MANAGE -> R.id.action_exceptionManageHomeFragment_to_exceptionManageFragment
+                RoleFunctionalPermissionsEnum.USER_INFO -> R.id.action_userInfoHomeFragment_to_userInfoFragment
+                RoleFunctionalPermissionsEnum.RESET_PASSWORD -> R.id.action_userInfoHomeFragment_to_resetPasswordFragment
+                RoleFunctionalPermissionsEnum.FINGERPRINT_SETTING -> R.id.action_userInfoHomeFragment_to_setFingerprintFragment
+                RoleFunctionalPermissionsEnum.FACE_SETTING -> R.id.action_userInfoHomeFragment_to_setFaceFragment
+                RoleFunctionalPermissionsEnum.CARD_SETTING -> R.id.action_userInfoHomeFragment_to_setJobCardFragment
+                else -> 0
+            }
+        }
+    }
+}

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

@@ -19,7 +19,6 @@ import com.grkj.iscs.databinding.FragmentSelectMemeberBinding
 import com.grkj.iscs.databinding.ItemSelectAllMemberBinding
 import com.grkj.iscs.databinding.ItemSelectMemberBinding
 import com.grkj.data.enums.RoleEnum
-import com.grkj.data.model.vo.JobPointVo
 import com.grkj.data.model.vo.JobTicketGroupDataVo
 import com.grkj.data.model.vo.JobTicketGroupInfoVo
 import com.grkj.data.model.vo.JobUserVo
@@ -27,6 +26,7 @@ import com.grkj.iscs.databinding.ItemLockerGroupBinding
 import com.grkj.iscs.databinding.ItemSelectColockerMemberBinding
 import com.grkj.iscs.features.main.viewmodel.common.SelectMemberViewModel
 import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.listeners.BlankAreaTouchListener
 import com.grkj.ui_base.utils.CommonUtils
 import com.grkj.ui_base.utils.extension.tip
 import com.kongzue.dialogx.dialogs.PopTip
@@ -191,7 +191,7 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
         val itemBinding = holder.getBinding<ItemLockerGroupBinding>()
         val item = holder.getModel<JobTicketGroupDataVo<JobUserVo>>()
         itemBinding.groupName.text = item.jobTicketGroupInfo.groupName
-        fun groupSelected() {
+        fun groupSelect() {
             isLockerSelect = true
             checkSelectArea()
             itemBinding.groupTitleLayout.isSelected = true
@@ -209,13 +209,20 @@ class SelectMemberFragment : BaseFragment<FragmentSelectMemeberBinding>() {
             adapter.notifyDataSetChanged()
         }
         itemBinding.groupTitleLayout.setDebouncedClickListener {
-            groupSelected()
+            groupSelect()
+        }
+        itemBinding.groupLayout.setDebouncedClickListener {
+            groupSelect()
         }
         itemBinding.groupTitleLayout.isSelected =
             isLockerSelect && item.jobTicketGroupInfo.groupId == viewModel.currentSelectGroup?.groupId
         itemBinding.groupName.isSelected =
             isLockerSelect && item.jobTicketGroupInfo.groupId == viewModel.currentSelectGroup?.groupId
-        itemBinding.groupLockerRv.linear(LinearLayout.HORIZONTAL).setup {
+        itemBinding.groupLockerRv.apply {
+            addOnItemTouchListener(BlankAreaTouchListener(this) {
+                groupSelect()
+            })
+        }.linear(LinearLayout.HORIZONTAL).setup {
             addType<JobUserVo>(R.layout.item_select_member)
             onBind {
                 onLockerRVBinding(item.jobTicketGroupInfo, item.jobTicketGroupMemberList, this)

+ 17 - 9
app/src/main/java/com/grkj/iscs/features/main/fragment/common/SelectPointFragment.kt

@@ -5,6 +5,7 @@ import android.view.inputmethod.InputMethodManager
 import android.widget.LinearLayout
 import androidx.core.view.isVisible
 import androidx.fragment.app.viewModels
+import androidx.recyclerview.widget.ItemTouchHelper
 import com.drake.brv.BindingAdapter
 import com.drake.brv.utils.grid
 import com.drake.brv.utils.linear
@@ -21,6 +22,7 @@ import com.grkj.iscs.databinding.ItemPointGroupBinding
 import com.grkj.iscs.databinding.ItemSelectPointBinding
 import com.grkj.iscs.features.main.viewmodel.common.SelectPointViewModel
 import com.grkj.ui_base.base.BaseFragment
+import com.grkj.ui_base.listeners.BlankAreaTouchListener
 import com.grkj.ui_base.utils.CommonUtils
 import com.sik.sikcore.data.GlobalDataTempStore
 import com.sik.sikcore.extension.setDebouncedClickListener
@@ -88,19 +90,21 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
     private fun BindingAdapter.BindingViewHolder.onPointGroupRVBinding(holder: BindingAdapter.BindingViewHolder) {
         val itemBinding = holder.getBinding<ItemPointGroupBinding>()
         val item = holder.getModel<JobTicketGroupDataVo<JobPointVo>>()
-        itemBinding.groupTitleLayout.setDebouncedClickListener {
+        fun groupSelect() {
             itemBinding.groupTitleLayout.isSelected = !itemBinding.groupTitleLayout.isSelected
             itemBinding.groupName.isSelected = itemBinding.groupTitleLayout.isSelected
             itemBinding.deleteGroup.isSelected = itemBinding.groupTitleLayout.isSelected
             viewModel.currentSelectGroupId = item.jobTicketGroupInfo.groupId
             adapter.notifyDataSetChanged()
         }
+        itemBinding.groupTitleLayout.setDebouncedClickListener {
+            groupSelect()
+        }
+        itemBinding.groupName.setDebouncedClickListener {
+            groupSelect()
+        }
         itemBinding.selectedPointInfoLayout.setDebouncedClickListener {
-            itemBinding.groupTitleLayout.isSelected = !itemBinding.groupTitleLayout.isSelected
-            itemBinding.groupName.isSelected = itemBinding.groupTitleLayout.isSelected
-            itemBinding.deleteGroup.isSelected = itemBinding.groupTitleLayout.isSelected
-            viewModel.currentSelectGroupId = item.jobTicketGroupInfo.groupId
-            adapter.notifyDataSetChanged()
+            groupSelect()
         }
         itemBinding.groupTitleLayout.isSelected =
             item.jobTicketGroupInfo.groupId == viewModel.currentSelectGroupId
@@ -132,7 +136,7 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
                 imm.showSoftInput(itemBinding.groupName, InputMethodManager.SHOW_IMPLICIT)
                 itemBinding.editOrSave.text = getString(R.string.save)
             } else {
-                if (itemBinding.groupName.text.toString().isEmpty()){
+                if (itemBinding.groupName.text.toString().isEmpty()) {
                     showToast(getString(R.string.group_name_must_not_empty))
                     return@setDebouncedClickListener
                 }
@@ -149,7 +153,11 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
                 adapter?.notifyDataSetChanged()
             }
         }
-        itemBinding.groupPointRv.grid(6).setup {
+        itemBinding.groupPointRv.apply {
+            addOnItemTouchListener(BlankAreaTouchListener(this) {
+                groupSelect()
+            })
+        }.grid(6).setup {
             addType<JobPointVo>(R.layout.item_select_point)
             onBind {
                 onSelectedPointRVBinding(item.jobTicketGroupInfo, this)
@@ -209,7 +217,7 @@ class SelectPointFragment : BaseFragment<FragmentSelectPointBinding>() {
             val emptyOriginGroupName = getString(R.string.selected_point_info_title)
             val jobTicketGroupVo = JobTicketGroupInfoVo(groupName = emptyOriginGroupName)
             viewModel.selectedPointData.add(
-                JobTicketGroupDataVo(jobTicketGroupVo,mutableListOf())
+                JobTicketGroupDataVo(jobTicketGroupVo, mutableListOf())
             )
             viewModel.currentSelectGroupId = jobTicketGroupVo.groupId
         }

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

@@ -10,13 +10,13 @@ import com.drake.brv.utils.setup
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
 import com.grkj.data.data.MMKVConstants
+import com.grkj.data.data.MainDomainData
 import com.grkj.data.enums.RoleFunctionalPermissionsEnum
 import com.grkj.iscs.R
 import com.grkj.iscs.databinding.FragmentHomeBinding
 import com.grkj.iscs.databinding.ItemHomeQuickEntranceBinding
 import com.grkj.iscs.features.main.dialog.QuickEntranceConfigDialog
 import com.grkj.iscs.features.main.dialog.TextDropDownDialog
-import com.grkj.iscs.features.main.entity.MenuItemEntity
 import com.grkj.iscs.features.main.entity.QuickEntranceMenuItemEntity
 import com.grkj.iscs.features.main.viewmodel.home.HomeViewModel
 import com.grkj.ui_base.base.BaseFragment
@@ -42,20 +42,30 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
     private val quickEntranceList: MutableList<QuickEntranceMenuItemEntity>
         get() {
             val quickEntryConfigJson = MMKVConstants.KEY_QUICK_ENTRY_CONFIG.getMMKVData("")
-            return if (quickEntryConfigJson.isEmpty()) {
+            val permissions = quickEntryConfigJson.split(",").filter { it.isNotBlank() }
+                .mapNotNull { runCatching { RoleFunctionalPermissionsEnum.valueOf(it) }.getOrNull() }
+            return if (permissions.isEmpty()) {
                 mutableListOf<QuickEntranceMenuItemEntity>(
                     QuickEntranceMenuItemEntity(
                         0,
                         R.mipmap.icon_job_manage_create_job,
                         RoleFunctionalPermissionsEnum.CREATE_JOB.description,
-                        RoleFunctionalPermissionsEnum.CREATE_JOB.functionalPermission
+                        RoleFunctionalPermissionsEnum.CREATE_JOB,
+                        QuickEntranceMenuItemEntity.getNavGraphId(RoleFunctionalPermissionsEnum.CREATE_JOB),
+                        QuickEntranceMenuItemEntity.getDestId(RoleFunctionalPermissionsEnum.CREATE_JOB)
                     )
                 )
             } else {
-                Gson().fromJson<MutableList<QuickEntranceMenuItemEntity>>(
-                    quickEntryConfigJson,
-                    object : TypeToken<MutableList<QuickEntranceMenuItemEntity>>() {}.type
-                )
+                permissions.mapIndexed { index, value ->
+                    QuickEntranceMenuItemEntity(
+                        index,
+                        QuickEntranceMenuItemEntity.getMenuIconId(value),
+                        value.description,
+                        value,
+                        QuickEntranceMenuItemEntity.getNavGraphId(value),
+                        QuickEntranceMenuItemEntity.getDestId(value)
+                    )
+                }.toMutableList()
             }
         }
 
@@ -128,7 +138,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
      * 快捷入口配置
      */
     private fun quickEntranceConfig() {
-        QuickEntranceConfigDialog.show(requireContext()) {
+        QuickEntranceConfigDialog.show {
             binding.quickEntranceRv.models = quickEntranceList
         }
     }
@@ -249,19 +259,16 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
         itemBinding.homeMenuIv.setImageResource(item.menuIconId)
         itemBinding.homeMenuTv.text = item.menuText
         itemBinding.root.setOnClickListener {
-            onMenuClick(item.type)
+            onMenuClick(item)
         }
     }
 
-    private fun onMenuClick(menuType: Int) {
-        when (menuType) {
-            0 -> {
-                BottomNavVisibilityEvent.sendBottomNavVisibilityEvent(false)
-                JumpViewEvent.sendJumpViewEvent(
-                    R.navigation.nav_job_manage,
-                    R.id.action_jobManageHomeFragment_to_createJobFragment
-                )
-            }
-        }
+    private fun onMenuClick(menu: QuickEntranceMenuItemEntity) {
+        BottomNavVisibilityEvent.sendBottomNavVisibilityEvent(false)
+        JumpViewEvent.sendJumpViewEvent(
+            menu.navGraph,
+            menu.destId,
+            true
+        )
     }
 }

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

@@ -7,6 +7,7 @@
         android:padding="@dimen/common_spacing">
 
         <LinearLayout
+            android:id="@+id/group_layout"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:background="@drawable/home_card_bg"

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

@@ -6,6 +6,7 @@
     <LinearLayout
         android:layout_width="@dimen/home_item_quick_entrance_layout"
         android:layout_height="@dimen/home_item_quick_entrance_layout"
+        android:layout_margin="@dimen/common_spacing"
         android:gravity="center_horizontal"
         android:orientation="vertical">
 

+ 6 - 3
app/src/main/res/layout/dialog_quick_entrance_config.xml

@@ -52,7 +52,7 @@
             android:layout_marginTop="@dimen/common_spacing"
             android:divider="@drawable/common_divider_normal_space_vertical"
             android:orientation="vertical"
-            android:paddingHorizontal="@dimen/common_spacing"
+            android:paddingHorizontal="@dimen/common_spacing_2x"
             android:showDividers="middle">
 
             <TextView
@@ -67,7 +67,8 @@
             <androidx.recyclerview.widget.RecyclerView
                 android:id="@+id/selected_rv_list"
                 android:layout_width="match_parent"
-                android:layout_height="180dp" />
+                android:layout_height="180dp"
+                android:background="@drawable/home_card_bg" />
 
             <TextView
                 android:layout_width="wrap_content"
@@ -81,7 +82,9 @@
             <androidx.recyclerview.widget.RecyclerView
                 android:id="@+id/all_rv_list"
                 android:layout_width="match_parent"
-                android:layout_height="match_parent" />
+                android:layout_height="match_parent"
+                android:layout_marginBottom="@dimen/common_spacing_2x"
+                android:background="@drawable/home_card_bg" />
         </LinearLayout>
     </LinearLayout>
 </layout>

+ 1 - 0
app/src/main/res/layout/item_locker_group.xml

@@ -7,6 +7,7 @@
         android:padding="@dimen/common_spacing">
 
         <LinearLayout
+            android:id="@+id/group_layout"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="center_vertical"

+ 1 - 0
app/src/main/res/layout/item_quick_entrance_config.xml

@@ -6,6 +6,7 @@
     <LinearLayout
         android:layout_width="@dimen/home_item_quick_entrance_layout"
         android:layout_height="@dimen/home_item_quick_entrance_layout"
+        android:layout_margin="@dimen/common_spacing"
         android:gravity="center_horizontal"
         android:orientation="vertical">
 

+ 1 - 0
app/src/main/res/values-en/strings.xml

@@ -479,5 +479,6 @@
     <string name="check_new_key_need_register">Detected a new key, is it registered</string>
     <string name="selected_quick_entrance">The configured shortcut entrance</string>
     <string name="all_quick_entrance">All Quick Entrances</string>
+    <string name="quick_entrance_most_set_tip">Up to 5 quick entry points can be set</string>
 
 </resources>

+ 1 - 0
app/src/main/res/values-zh/strings.xml

@@ -479,5 +479,6 @@
     <string name="check_new_key_need_register">检测到新钥匙,是否注册</string>
     <string name="selected_quick_entrance">已配置的快捷入口</string>
     <string name="all_quick_entrance">所有快捷入口</string>
+    <string name="quick_entrance_most_set_tip">快捷入口最多设置5个</string>
 
 </resources>

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -482,5 +482,6 @@
     <string name="check_new_key_need_register">检测到新钥匙,是否注册</string>
     <string name="selected_quick_entrance">已配置的快捷入口</string>
     <string name="all_quick_entrance">所有快捷入口</string>
+    <string name="quick_entrance_most_set_tip">快捷入口最多设置5个</string>
 
 </resources>

+ 0 - 2
data/src/main/java/com/grkj/data/enums/RoleFunctionalPermissionsEnum.kt

@@ -36,7 +36,6 @@ enum class RoleFunctionalPermissionsEnum(
     FINGERPRINT_SETTING("user_info:fingerprint_setting", "设置指纹", 1, listOf()),
     FACE_SETTING("user_info:face_setting", "设置人脸", 1, listOf()),
     CARD_SETTING("user_info:card_setting", "设置工卡", 1, listOf()),
-    MORE_SETTING("user_info:more_setting", "更多设置", 1, listOf()),
     LOGOUT("user_info:logout", "退出登录", 1, listOf()),
     USER_INFO_HOME(
         "user_info",
@@ -48,7 +47,6 @@ enum class RoleFunctionalPermissionsEnum(
             FINGERPRINT_SETTING,
             FACE_SETTING,
             CARD_SETTING,
-            MORE_SETTING,
             LOGOUT
         )
     ),

+ 52 - 0
ui-base/src/main/java/com/grkj/ui_base/listeners/BlankAreaTouchListener.kt

@@ -0,0 +1,52 @@
+package com.grkj.ui_base.listeners
+
+import android.view.MotionEvent
+import android.view.ViewConfiguration
+import androidx.recyclerview.widget.RecyclerView
+import kotlin.math.abs
+
+/**
+ * RecyclerView 空白区域点击监听
+ */
+class BlankAreaTouchListener(
+    private val rv: RecyclerView,
+    private val onBlankTap: () -> Unit
+) : RecyclerView.SimpleOnItemTouchListener() {
+
+    private val touchSlop = ViewConfiguration.get(rv.context).scaledTouchSlop
+    private var downX = 0f
+    private var downY = 0f
+    private var isPotentialClick = false
+
+    override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
+        when (e.actionMasked) {
+            MotionEvent.ACTION_DOWN -> {
+                downX = e.x
+                downY = e.y
+                isPotentialClick = true            // 先假设它是点击
+            }
+
+            MotionEvent.ACTION_MOVE -> {
+                // 超过触摸阈值 → 判定为拖动,放弃“点击”身份
+                if (abs(e.x - downX) > touchSlop ||
+                    abs(e.y - downY) > touchSlop
+                ) {
+                    isPotentialClick = false
+                }
+            }
+
+            MotionEvent.ACTION_UP -> {
+                if (isPotentialClick) {
+                    // 子 View? → 让 ItemClick 正常走
+                    val child = rv.findChildViewUnder(e.x, e.y)
+                    if (child == null) {
+                        onBlankTap()               // 🎉 空白单击命中
+                        return true                // 吞掉,让 RecyclerView 不再处理
+                    }
+                }
+            }
+        }
+        // 其它情况都不拦截,交回 RecyclerView 默认处理(滚动 / item 点击)
+        return false
+    }
+}

+ 3 - 3
ui-base/src/main/java/com/grkj/ui_base/utils/event/JumpViewEvent.kt

@@ -3,17 +3,17 @@ package com.grkj.ui_base.utils.event
 import com.grkj.shared.model.EventBean
 import com.grkj.data.data.EventConstants
 
-class JumpViewEvent(val navGraphId: Int, val targetId: Int) {
+class JumpViewEvent(val navGraphId: Int, val targetId: Int, val fromQuickEntry: Boolean) {
     companion object {
         /**
          * 发送当前模式通知
          */
         @JvmStatic
         fun sendJumpViewEvent(
-            navGraphId: Int, targetId: Int
+            navGraphId: Int, targetId: Int, fromQuickEntry: Boolean = false
         ) {
             val jumpViewEventBean = EventBean<JumpViewEvent>(
-                EventConstants.EVENT_JUMP_TO, JumpViewEvent(navGraphId, targetId)
+                EventConstants.EVENT_JUMP_TO, JumpViewEvent(navGraphId, targetId, fromQuickEntry)
             )
             EventHelper.sendEvent(jumpViewEventBean)
         }