Explorar el Código

refactor(更新)
- 角色功能权限的展示和选择逻辑优化
- 蓝牙连接扫描增加重试机制

周文健 hace 3 meses
padre
commit
8d658c7bea

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

@@ -15,6 +15,8 @@ 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 org.slf4j.Logger
+import org.slf4j.LoggerFactory
 
 /**
  * 修改角色对话框,基于 DialogX
@@ -25,7 +27,7 @@ class UpdateRoleDialog(
     private val updateEntity: UpdateRoleDataEntity,
     private val onConfirm: (UpdateRoleDataEntity, CustomDialog) -> Unit
 ) : OnBindView<CustomDialog>(R.layout.dialog_update_role) {
-
+    private val logger: Logger = LoggerFactory.getLogger(UpdateRoleDialog::class.java)
     private lateinit var binding: DialogUpdateRoleBinding
     private val indentPx: Int by lazy { AutoSizeUtils.dp2px(binding.root.context, 20f) }
     private var selectedList = mutableListOf<String>()
@@ -45,7 +47,8 @@ class UpdateRoleDialog(
         binding.statusRg.clearCheck()
         updateEntity.status?.let { binding.activateRb.isChecked = it }
         selectedList.clear()
-        selectedList.addAll(updateEntity.functionalPermissions.map { it.functionalPermission })
+        selectedList.addAll(updateEntity.functionalPermissions.flatMap { it.getFunctionalPermissionWithChildren() })
+        logger.info("selectedList: $selectedList")
         markSelected(treeData)
         binding.roleListRv.linear().setup {
             addType<RoleManageFunctionalPermissionsEntity>(R.layout.item_role)
@@ -58,7 +61,6 @@ class UpdateRoleDialog(
                 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
                 }
                 // 选中
@@ -104,14 +106,22 @@ class UpdateRoleDialog(
             updateEntity.status = binding.activateRb.isChecked
             // 收集权限
             updateEntity.functionalPermissions = collectSelected(treeData)
-            onConfirm(updateEntity,dialog)
+            onConfirm(updateEntity, dialog)
         }
     }
 
-    private fun markSelected(data: List<RoleManageFunctionalPermissionsEntity>) {
-        data.forEach {
-            it.isSelected = selectedList.contains(it.functionalPermission)
-            markSelected(it.children)
+    private fun markSelected(list: List<RoleManageFunctionalPermissionsEntity>) {
+        list.forEach { item ->
+            // step1: 根据传入的 functionalPermissions 标记自己
+            item.isSelected = selectedList.contains(item.functionalPermission)
+            // step2: 先递归标记孩子
+            if (item.children.isNotEmpty()) {
+                markSelected(item.children)
+                // step3: 如果所有孩子都被选了,那自己也打勾
+                if (item.children.all { it.isSelected }) {
+                    item.isSelected = true
+                }
+            }
         }
     }
 

+ 29 - 5
app/src/main/java/com/grkj/iscs/features/main/entity/RoleManageFunctionalPermissionsEntity.kt

@@ -22,6 +22,27 @@ class RoleManageFunctionalPermissionsEntity(
         return children
     }
 
+    /**
+     * 获取权限包括子节点
+     */
+    fun getFunctionalPermissionWithChildren(): List<String> {
+        fun flatten(list: List<RoleManageFunctionalPermissionsEntity>): List<String> {
+            val res = mutableListOf<String>()
+            list.forEach {
+                if (it.isSelected) {
+                    res += it.functionalPermission
+                }
+                res += flatten(it.children)
+            }
+            return res
+        }
+        return if (isSelected){
+            listOf(functionalPermission) + flatten(children)
+        }else{
+            listOf()
+        }
+    }
+
     companion object {
         /**
          * 获取功能权限数据
@@ -37,10 +58,10 @@ class RoleManageFunctionalPermissionsEntity(
                             item.functionalPermission
                         roleManageFunctionalPermissionsEntity.description = item.description
                         roleManageFunctionalPermissionsEntity.level = item.level
-                        item.children.forEachIndexed {index,child->
+                        item.children.forEachIndexed { index, child ->
                             roleManageFunctionalPermissionsEntity.children.add(
                                 getFunctionPermission(
-                                    index,child
+                                    index, child
                                 )
                             )
                         }
@@ -53,17 +74,20 @@ class RoleManageFunctionalPermissionsEntity(
          * 根据权限获取
          */
         @JvmStatic
-        private fun getFunctionPermission(index:Int,item: RoleFunctionalPermissionsEnum): RoleManageFunctionalPermissionsEntity {
+        private fun getFunctionPermission(
+            index: Int,
+            item: RoleFunctionalPermissionsEnum
+        ): RoleManageFunctionalPermissionsEntity {
             val roleManageFunctionalPermissionsEntity =
                 RoleManageFunctionalPermissionsEntity(false, index)
             roleManageFunctionalPermissionsEntity.functionalPermission =
                 item.functionalPermission
             roleManageFunctionalPermissionsEntity.description = item.description
             roleManageFunctionalPermissionsEntity.level = item.level
-            item.children.forEachIndexed {index,child->
+            item.children.forEachIndexed { index, child ->
                 roleManageFunctionalPermissionsEntity.children.add(
                     getFunctionPermission(
-                        index,child
+                        index, child
                     )
                 )
             }

+ 2 - 2
app/src/main/java/com/grkj/iscs/features/main/viewmodel/data_manage/RoleManageViewModel.kt

@@ -72,7 +72,7 @@ class RoleManageViewModel @Inject constructor(
                 roleKey = roleDataEntity.roleKeys
                 status = roleDataEntity.status
                 menuData =
-                    sysMenus.filter { it.perms in roleDataEntity.functionalPermissions.map { it.functionalPermission } }
+                    sysMenus.filter { it.perms in roleDataEntity.functionalPermissions.flatMap { it.getFunctionalPermissionWithChildren() } }
             })
             emit(true)
         }
@@ -90,7 +90,7 @@ class RoleManageViewModel @Inject constructor(
                 roleKey = roleDataEntity.roleKeys
                 status = roleDataEntity.status
                 menuData =
-                    sysMenus.filter { it.perms in roleDataEntity.functionalPermissions.map { it.functionalPermission } }
+                    sysMenus.filter { it.perms in roleDataEntity.functionalPermissions.flatMap { it.getFunctionalPermissionWithChildren() } }
             })
             emit(true)
         }

+ 9 - 3
ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleConnectionManager.kt

@@ -291,13 +291,14 @@ object BleConnectionManager {
         prepareDoneCallBack: ((Boolean, BleBean?) -> Unit)?
     ) {
         ThreadUtils.runOnMain {
-            doScanBle(mac, isNeedLoading, prepareDoneCallBack)
+            doScanBle(mac, isNeedLoading, 3, prepareDoneCallBack)
         }
     }
 
     private fun doScanBle(
         mac: String,
         isNeedLoading: Boolean = false,
+        retryTimes: Int = 3,
         prepareDoneCallBack: ((Boolean, BleBean?) -> Unit)?
     ) {
         logger.info("蓝牙连接-doScanBle:$mac")
@@ -308,15 +309,20 @@ object BleConnectionManager {
                 logger.info("蓝牙连接-参数:${promptStr}")
                 BleManager.getInstance().enableBluetooth()
                 ThreadUtils.runOnIODelayed(5000) {
-                    doScanBle(mac, isNeedLoading, prepareDoneCallBack)
+                    doScanBle(mac, isNeedLoading, 3, prepareDoneCallBack)
                 }
             }
 
             override fun onScanStarted(success: Boolean) {
                 logger.info("蓝牙连接-onScanStarted:${success}")
-                if (!success) {
+                if (!success && retryTimes == 0) {
                     if (isNeedLoading) LoadingEvent.sendLoadingEvent(null, false)
                     prepareDoneCallBack?.invoke(false, null)
+                } else if (!success && retryTimes > 0) {
+                    BleManager.getInstance().cancelScan()
+                    ThreadUtils.runOnMainDelayed(3000) {
+                        doScanBle(mac, isNeedLoading, retryTimes - 1, prepareDoneCallBack)
+                    }
                 }
             }