|
|
@@ -2,10 +2,11 @@ package com.grkj.data.domain.logic.impl
|
|
|
|
|
|
import com.grkj.data.domain.logic.BaseLogic
|
|
|
import com.grkj.data.domain.logic.ISysMenuLogic
|
|
|
-import com.grkj.data.enums.RoleEnum
|
|
|
-import com.grkj.data.enums.RoleFunctionalPermissionsEnum
|
|
|
import com.grkj.data.local.dos.SysMenu
|
|
|
import com.grkj.data.local.dos.SysRoleMenu
|
|
|
+import com.grkj.data.perms.RoleMenuPolicy
|
|
|
+import com.grkj.data.perms.RolePermBridge
|
|
|
+import com.grkj.data.perms.RolePermNode
|
|
|
import com.grkj.data.repository.RoleRepository
|
|
|
import com.grkj.data.repository.SysMenuRepository
|
|
|
import com.grkj.shared.utils.i18n.I18nManager
|
|
|
@@ -18,95 +19,37 @@ import javax.inject.Singleton
|
|
|
@Singleton
|
|
|
class SysMenuLogic @Inject constructor(
|
|
|
val sysMenuRepository: SysMenuRepository,
|
|
|
- val roleRepository: RoleRepository
|
|
|
+ val roleRepository: RoleRepository,
|
|
|
+ private val permBridge: RolePermBridge,
|
|
|
+ private val roleMenuPolicy: RoleMenuPolicy
|
|
|
) :
|
|
|
BaseLogic(), ISysMenuLogic {
|
|
|
override fun checkSysMenuAndRole() {
|
|
|
- // 找出所有顶层菜单(level == 0),依次递归插入/更新
|
|
|
- RoleFunctionalPermissionsEnum.values()
|
|
|
- .filter { it.level == 0 }
|
|
|
- .forEach { topEnum ->
|
|
|
- processMenuEnumRecursive(topEnum, parentId = null)
|
|
|
- }
|
|
|
+ // 先灌根节点
|
|
|
+ permBridge.roots().forEach { top ->
|
|
|
+ processMenuNodeRecursive(top, parentId = null)
|
|
|
+ }
|
|
|
+
|
|
|
val sysMenuData = sysMenuRepository.getAll()
|
|
|
- roleRepository.getRoleData().filter { it.roleKey in RoleEnum.values().map { it.roleKey } }
|
|
|
+
|
|
|
+ roleRepository.getRoleData()
|
|
|
.forEach { roleData ->
|
|
|
- when (roleData.roleKey) {
|
|
|
- //超管权限
|
|
|
- RoleEnum.ADMIN.roleKey -> {
|
|
|
- val roleMenuData = mutableListOf<SysRoleMenu>().apply {
|
|
|
- for (permissionsEnum in RoleFunctionalPermissionsEnum.except()) {
|
|
|
- sysMenuData.find { it.perms == permissionsEnum.functionalPermission }?.menuId?.let { menuId ->
|
|
|
- val sysRoleMenu = SysRoleMenu()
|
|
|
- sysRoleMenu.roleId = roleData.roleId
|
|
|
- sysRoleMenu.menuId = menuId
|
|
|
- add(sysRoleMenu)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- sysMenuRepository.insertRoleMenus(roleMenuData)
|
|
|
- }
|
|
|
- //作业管理员权限
|
|
|
- RoleEnum.JTDRAWER.roleKey -> {
|
|
|
- val roleMenuData = mutableListOf<SysRoleMenu>().apply {
|
|
|
- for (permissionsEnum in RoleFunctionalPermissionsEnum.except(
|
|
|
- RoleFunctionalPermissionsEnum.USER_MANAGE,
|
|
|
- RoleFunctionalPermissionsEnum.ROLE_MANAGE,
|
|
|
- RoleFunctionalPermissionsEnum.BACKUP_AND_RESTORE,
|
|
|
- RoleFunctionalPermissionsEnum.HARDWARE_HOME_MANAGE,
|
|
|
- RoleFunctionalPermissionsEnum.SETTINGS
|
|
|
- )) {
|
|
|
- sysMenuData.find { it.perms == permissionsEnum.functionalPermission }?.menuId?.let { menuId ->
|
|
|
- val sysRoleMenu = SysRoleMenu()
|
|
|
- sysRoleMenu.roleId = roleData.roleId
|
|
|
- sysRoleMenu.menuId = menuId
|
|
|
- add(sysRoleMenu)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- sysMenuRepository.insertRoleMenus(roleMenuData)
|
|
|
- }
|
|
|
- //作业负责人权限
|
|
|
- RoleEnum.JTLOCKER.roleKey -> {
|
|
|
- val roleMenuData = mutableListOf<SysRoleMenu>().apply {
|
|
|
- for (permissionsEnum in RoleFunctionalPermissionsEnum.except(
|
|
|
- RoleFunctionalPermissionsEnum.DATA_HOME_MANAGE,
|
|
|
- RoleFunctionalPermissionsEnum.HARDWARE_HOME_MANAGE,
|
|
|
- RoleFunctionalPermissionsEnum.EXCEPTION_JOB,
|
|
|
- RoleFunctionalPermissionsEnum.EXCEPTION_MANAGE,
|
|
|
- RoleFunctionalPermissionsEnum.SETTINGS,
|
|
|
- )) {
|
|
|
- sysMenuData.find { it.perms == permissionsEnum.functionalPermission }?.menuId?.let { menuId ->
|
|
|
- val sysRoleMenu = SysRoleMenu()
|
|
|
- sysRoleMenu.roleId = roleData.roleId
|
|
|
- sysRoleMenu.menuId = menuId
|
|
|
- add(sysRoleMenu)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- sysMenuRepository.insertRoleMenus(roleMenuData)
|
|
|
- }
|
|
|
- //作业参与人权限
|
|
|
- RoleEnum.JTCOLOCKER.roleKey -> {
|
|
|
- val roleMenuData = mutableListOf<SysRoleMenu>().apply {
|
|
|
- for (permissionsEnum in RoleFunctionalPermissionsEnum.except(
|
|
|
- RoleFunctionalPermissionsEnum.DATA_HOME_MANAGE,
|
|
|
- RoleFunctionalPermissionsEnum.HARDWARE_HOME_MANAGE,
|
|
|
- RoleFunctionalPermissionsEnum.EXCEPTION_JOB,
|
|
|
- RoleFunctionalPermissionsEnum.EXCEPTION_MANAGE,
|
|
|
- RoleFunctionalPermissionsEnum.SETTINGS,
|
|
|
- )) {
|
|
|
- sysMenuData.find { it.perms == permissionsEnum.functionalPermission }?.menuId?.let { menuId ->
|
|
|
- val sysRoleMenu = SysRoleMenu()
|
|
|
- sysRoleMenu.roleId = roleData.roleId
|
|
|
- sysRoleMenu.menuId = menuId
|
|
|
- add(sysRoleMenu)
|
|
|
- }
|
|
|
- }
|
|
|
+ val picked: List<RolePermNode> =
|
|
|
+ roleMenuPolicy.menusFor(roleData.roleKey, permBridge)
|
|
|
+
|
|
|
+ val roleMenuData = buildList {
|
|
|
+ for (node in picked) {
|
|
|
+ val menuId =
|
|
|
+ sysMenuData.find { it.perms == node.functionalPermission }?.menuId
|
|
|
+ if (menuId != null) {
|
|
|
+ add(SysRoleMenu().apply {
|
|
|
+ roleId = roleData.roleId
|
|
|
+ this.menuId = menuId
|
|
|
+ })
|
|
|
}
|
|
|
- sysMenuRepository.insertRoleMenus(roleMenuData)
|
|
|
}
|
|
|
}
|
|
|
+ sysMenuRepository.insertRoleMenus(roleMenuData.toMutableList())
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -130,45 +73,25 @@ class SysMenuLogic @Inject constructor(
|
|
|
return sysMenuRepository.getPermissionsByRoleIds(roleIds)
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 递归“插入或更新”一个枚举项,以及它的子节点。
|
|
|
- *
|
|
|
- * @param menuEnum 当前要处理的枚举项
|
|
|
- * @param parentId 父菜单在数据库里的 menuId (顶层传 null)
|
|
|
- * @return 返回在数据库里最终存在的 SysMenu 对象
|
|
|
- */
|
|
|
- private fun processMenuEnumRecursive(
|
|
|
- menuEnum: RoleFunctionalPermissionsEnum,
|
|
|
- parentId: Long?
|
|
|
- ): SysMenu {
|
|
|
- // 1. 查找数据库里是否已存在相同 perms 的菜单
|
|
|
- val existing: SysMenu? = sysMenuRepository.findByPerms(menuEnum.functionalPermission)
|
|
|
-
|
|
|
- val currentMenu: SysMenu = if (existing == null) {
|
|
|
- // 不存在,构造一个新的实体并插入
|
|
|
+ /** 把递归函数的参数类型从枚举换成 Node 接口,逻辑不变 */
|
|
|
+ private fun processMenuNodeRecursive(menuNode: RolePermNode, parentId: Long?): SysMenu {
|
|
|
+ val existing = sysMenuRepository.findByPerms(menuNode.functionalPermission)
|
|
|
+ val current = if (existing == null) {
|
|
|
val newMenu = SysMenu().apply {
|
|
|
- menuName = I18nManager.t(menuEnum.description)
|
|
|
- perms = menuEnum.functionalPermission
|
|
|
- // 这里用 level 做 orderNum(仅示意),可根据业务自由调整
|
|
|
- orderNum = menuEnum.level
|
|
|
+ menuName = I18nManager.t(menuNode.description)
|
|
|
+ perms = menuNode.functionalPermission
|
|
|
+ orderNum = menuNode.level
|
|
|
this.parentId = parentId
|
|
|
- // 其它字段(path、component、isFrame、icon 等)可在此处赋值
|
|
|
- // 例如:path = "/${menuEnum.functionalPermission.replace(":", "/")}"
|
|
|
}
|
|
|
- val newId: Long = sysMenuRepository.insert(newMenu)
|
|
|
+ val newId = sysMenuRepository.insert(newMenu)
|
|
|
if (newId <= 0) {
|
|
|
- // 如果 onConflict = IGNORE 导致插入被忽略(并发、重复等),则重新查询一次
|
|
|
- sysMenuRepository.findByPerms(menuEnum.functionalPermission)
|
|
|
- ?: throw IllegalStateException(
|
|
|
- "插入 SysMenu(${menuEnum.functionalPermission}) 失败,且数据库中没有已存在记录"
|
|
|
- )
|
|
|
+ sysMenuRepository.findByPerms(menuNode.functionalPermission)
|
|
|
+ ?: error("插入失败且未找到:${menuNode.functionalPermission}")
|
|
|
} else {
|
|
|
- // 插入成功,Room 会自动把自增主键分配给 newMenu.menuId
|
|
|
newMenu.menuId = newId
|
|
|
newMenu
|
|
|
}
|
|
|
} else {
|
|
|
- // 已经存在,检查 parentId 是否需要更新
|
|
|
if (existing.parentId != parentId) {
|
|
|
existing.parentId = parentId
|
|
|
sysMenuRepository.update(existing)
|
|
|
@@ -176,13 +99,8 @@ class SysMenuLogic @Inject constructor(
|
|
|
existing
|
|
|
}
|
|
|
|
|
|
- // 2. 递归处理它的子节点
|
|
|
- if (menuEnum.children.isNotEmpty()) {
|
|
|
- menuEnum.children.forEach { childEnum ->
|
|
|
- processMenuEnumRecursive(childEnum, parentId = currentMenu.menuId)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return currentMenu
|
|
|
+ // 递归子节点
|
|
|
+ menuNode.children.forEach { child -> processMenuNodeRecursive(child, current.menuId) }
|
|
|
+ return current
|
|
|
}
|
|
|
}
|