package com.ld.igds.sys.service; import com.bstek.bdf2.core.model.Role; import com.bstek.bdf2.core.model.RoleMember; import com.bstek.bdf2.core.model.RoleResource; import com.bstek.bdf2.core.model.Url; import com.bstek.bdf2.core.orm.hibernate.HibernateDao; import com.bstek.bdf2.core.service.IUrlService; import com.ld.igds.constant.RedisConst; import com.ld.igds.util.ContextUtil; import com.ld.igds.util.RedisUtil; import org.apache.commons.lang3.StringUtils; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @Repository(SysRoleService.BEAN_ID) public class SysRoleService extends HibernateDao { public static final String BEAN_ID = "sys.RoleService"; private String CACHE_ROLE_URL = "ROLE_URL"; private String CACHE_ROLE_USER = "ROLE_USER"; @Autowired private IUrlService urlService; @Autowired private RedisUtil redisUtil; public List getRolesByUsername(String username) { String hql = " from " + Role.class.getName() + " where id in(" + "select roleId from " + RoleMember.class.getName() + " where username=:username)"; Map args = new HashMap(); args.put("username", username); return this.query(hql, args); } public Role getRoleByUsername(String username) { List roles = this.getRolesByUsername(username); if (null == roles || roles.isEmpty()) return null; return roles.get(0); } public List loadRoles(String companyId) { String hql = " from " + Role.class.getName() + " where companyId=:companyId order by name"; Map args = new HashMap<>(); args.put("companyId", companyId); return this.query(hql, args); } public void updateUserRole(String username, String roleId) { if (StringUtils.isEmpty(username) || StringUtils.isEmpty(roleId)) { return; } // 删除当前用户的原来均色 Session session = this.getSessionFactory().openSession(); try { String hql = "delete from " + RoleMember.class.getName() + " where username=:username"; Query query = session.createQuery(hql); query.setString("username", username); query.executeUpdate(); // 执行新增 RoleMember member = new RoleMember(); member.setId(ContextUtil.getUUID()); member.setUsername(username); member.setRoleId(roleId); member.setCreateDate(new Date()); member.setGranted(true); session.save(member); } finally { session.flush(); session.close(); } } public String delRole(Role data) { if (null == data.getId()) return null; Session session = this.getSessionFactory().openSession(); try { // 删除角色 String hql = " delete from " + Role.class.getName() + " where id = :id"; Query query = session.createQuery(hql); query.setString("id", data.getId()); query.executeUpdate(); // 删除角色成员 hql = " delete from " + RoleMember.class.getName() + " where roleId = :id"; query = session.createQuery(hql); query.setString("id", data.getId()); query.executeUpdate(); // 删除角色资源 hql = " delete from " + RoleResource.class.getName() + " where roleId = :id"; query = session.createQuery(hql); query.setString("id", data.getId()); query.executeUpdate(); } finally { session.flush(); session.close(); } return null; } public void updateRole(Role data) { Session session = this.getSessionFactory().openSession(); try { if (null == data.getCompanyId()) { data.setCompanyId(ContextUtil.getCompanyId()); session.save(data); } else { session.update(data); } } finally { session.flush(); session.close(); } } public List loadUrls(String companyId, String parentId, String roleId) { // 已经分配的菜单 List allUrls = urlService.loadUrlsByRoleId(roleId); String hql = "from " + Url.class.getName() + " u where u.companyId=:companyId"; Map parameterMap = new HashMap(); parameterMap.put("companyId", companyId); hql += " and u.parentId=:parentId order by u.order asc"; parameterMap.put("parentId", parentId); List urls = this.query(hql, parameterMap); for (Url url : urls) { url.setUse(this.checkUse(url, allUrls)); } return urls; } public List loadUrls(String companyId, String roleId) { // 已经分配的菜单 List allUrls = urlService.loadUrlsByRoleId(roleId); String hql = "from " + Url.class.getName() + " u where u.companyId=:companyId"; Map parameterMap = new HashMap(); parameterMap.put("companyId", companyId); hql += " and u.parentId is null order by u.order asc"; List urls = this.query(hql, parameterMap); for (Url url : urls) { url.setUse(this.checkUse(url, allUrls)); } return urls; } private boolean checkUse(Url url, List allUrls) { if (null == allUrls || allUrls.isEmpty()) return false; for (Url roleUrl : allUrls) { if (url.getId().equals(roleUrl.getId())) { return true; } } return false; } /** * 根据组织编码更新缓存 * * @param companyId */ public List updateCacheRoleUrl(String companyId) { String hql = "from " + RoleResource.class.getName(); List resources = this.query(hql); if (null == resources || resources.isEmpty()) { redisUtil.del(RedisConst.buildKey(companyId, CACHE_ROLE_URL)); } else { redisUtil.set(RedisConst.buildKey(companyId, CACHE_ROLE_URL), resources); } return resources; } /** * 根据用户获取当前用户所拥有的角色下的菜单信息 * @param companyId * @param userName * @return */ public Map getMapUrlByUser(String companyId, String userName) { List resources = (List) redisUtil.get(RedisConst.buildKey(companyId, CACHE_ROLE_URL)); if (null == resources || resources.isEmpty()) return null; String roleId = (String) redisUtil.get(RedisConst.buildKey(CACHE_ROLE_USER, userName)); if (StringUtils.isEmpty(roleId)) return null; Map result = new HashMap<>(); for (RoleResource roleUrl : resources) { if (roleUrl.getRoleId().equals(roleId)) result.put(roleUrl.getUrlId(), roleUrl.getRoleId()); } return result; } public void updateCacheRoleUser(String companyId) { String hql = "from " + RoleMember.class.getName(); List resources = this.query(hql); if (null == resources || resources.isEmpty()) return; String key; for (RoleMember roleUser : resources) { key = RedisConst.buildKey(CACHE_ROLE_USER, roleUser.getUsername()); redisUtil.set(key, roleUser.getRoleId()); } } }