package com.iplatform.base.service; import com.iplatform.model.po.S_menu; import com.walker.infrastructure.utils.StringUtils; import com.walker.jdbc.service.BaseServiceImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * 菜单权限数据操作。 * @author 时克英 * @date 2022-11-02 */ @Service public class MenuServiceImpl extends BaseServiceImpl { protected final transient Logger logger = LoggerFactory.getLogger(getClass()); private static final String SQL_QUERY_ROLE_MENUS = "select DISTINCT(menu_id) from s_role_menu where role_id in (:roleIdList)"; private static final String SQL_SAME_MENU_PARENT = "select * from s_menu where parent_id=? and menu_name = ?"; private static final String SQL_MENU_USER = "select count(menu_id) total from s_role_menu where menu_id=?"; /** * 查询给定菜单是否被分配到角色功能中 * @param menuId * @return 存在返回大于0 * @date 2022-12-29 */ public int queryRoleMenuSize(String menuId){ return this.sqlMathQuery(SQL_MENU_USER, new Object[]{menuId}, Integer.class); } /** * 查询给定父节点下是否存在已重名的菜单。 * @param parentId * @param menuName * @return * @date 2022-12-26 */ public S_menu queryExistMenuInParent(String parentId, String menuName){ List list = this.select(SQL_SAME_MENU_PARENT, new Object[]{parentId, menuName}, new S_menu()); if(StringUtils.isEmptyList(list)){ return null; } return list.get(0); } /** * 给定角色ID集合,返回对应菜单ID列表 * @param roleIdList * @return * @date 2022-11-12 */ public List queryRoleMenuIdList(List roleIdList){ if(StringUtils.isEmptyList(roleIdList)){ return null; } // 2023-07-12 安全模块传递的角色id,可能存在字符串,如:ROLE_USER等,应当过滤掉,只保留系统角色ID(数值) //------------------------------------------------- List roleIdValueList = new ArrayList<>(4); for(String roleId: roleIdList){ if(StringUtils.isNumeric(roleId)){ roleIdValueList.add(Long.parseLong(roleId)); } } if(StringUtils.isEmptyList(roleIdValueList)){ return null; } //------------------------------------------------- // Map param = new HashMap<>(2); // param.put("roleIdList", roleIdValueList); // List> list = this.select(SQL_QUERY_ROLE_MENUS, param); // 因为 oracle报错:where role_id in ([2]),所以更换写法!2023-07-19 MapSqlParameterSource sqlParameterSource = new MapSqlParameterSource(); sqlParameterSource.addValue("roleIdList", roleIdValueList); List> list = this.queryListObjectWhereIn(SQL_QUERY_ROLE_MENUS, sqlParameterSource); logger.debug("查询角色权限集合: {}", list); if(list != null && list.size() > 0){ List menuIdList = new ArrayList<>(64); for(Map map : list){ // menuIdList.add(map.get("menu_id").toString()); // 2023-07-19 由于oracle返回的是否大写:MENU_ID,因此这里可以取第一个字段(因为只有一个) // 而不能通过小写取menu_id,否则取不到数据。 menuIdList.add(map.values().toArray()[0].toString()); } return menuIdList; } return null; } /** * 查询系统所有角色与菜单对应关系集合。在security权限拦截中使用该方法 * @return 集合中包括:role_id, menu_id * @date 2022-11-02 */ public List> queryRolesPermList(){ return this.select("select * from s_role_menu", new Object[]{}); } }