package cn.com.lzt.common.service.impl; import cn.com.lzt.common.dao.DataPermissionMinidao; import cn.com.lzt.common.dto.RoleDto; import cn.com.lzt.common.dto.RoleUserDto; import cn.com.lzt.common.dto.VisibleRangeDto; import cn.com.lzt.common.dto.VisibleUserDto; import cn.com.lzt.common.pmenum.Flag; import cn.com.lzt.common.service.DataPermissionServiceI; import org.jeecgframework.core.common.service.impl.CommonServiceImpl; import org.jeecgframework.core.util.ContextHolderUtils; import org.jeecgframework.web.system.pojo.base.TSDepart; import org.jeecgframework.web.system.pojo.base.TSUser; import org.jeecgframework.web.system.pojo.base.TSUserOrg; import org.jeecgframework.web.system.service.DepartServiceI; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpSession; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Service("dataPermissionService") @Transactional public class DataPermissionServiceImpl extends CommonServiceImpl implements DataPermissionServiceI{ @Autowired private DepartServiceI departService; @Autowired private DataPermissionMinidao dataPermissionMinidao; /** * 数据过滤 */ public List dataFilter(List list) { HttpSession session = ContextHolderUtils.getSession(); TSUser user = (TSUser)session.getAttribute("LOCAL_CLINET_USER"); String sql = "SELECT r.id, r.rolename, r.self_roleweight_code, r.visible_roleweight_code FROM t_s_role r WHERE r.id IN ( SELECT ru.roleid FROM t_s_role_user ru WHERE ru.userid = ?)"; List> rolemap = this.findForJdbc(sql, user.getId()); for(int i=0; i> rolemap = this.findForJdbc(sql, user.getId()); // 封装Dto List roleDtoList = new ArrayList(); for(int i=0; i rangeCodeList = this.pretreatment(visible_roleweight_code.trim());// 预处理可见范围编码 List rangeList = this.getVisibleRangeList(rangeCodeList);// 获取可见范围值列表 List useridList = this.getInvisibleUseridList(rangeList, biggestRole);// 获取可见的userid列表 dto.setUseridList(useridList); dto.setFlag(Flag.PART); return dto; } } return dto; } /** * 比较角色的大小,并返回权限最大的角色 */ private RoleDto getBiggestRole(List roleDtoList){ if(roleDtoList != null){ if(roleDtoList.size() == 1){ return roleDtoList.get(0); }else if(roleDtoList.size()>1){ RoleDto max = roleDtoList.get(0); for(int i=1; i pretreatment(String rangeCodeStrs){ List rangeCodeList = new ArrayList(); String [] arr0 = rangeCodeStrs.split(";"); for(int i=0; i getVisibleRangeList(List rangeCodeList){ List rangeList = new ArrayList(); for(String rangeCode : rangeCodeList){ if(rangeCode.contains(":") || rangeCode.contains(":")){ String [] arr1 = rangeCode.split(":");// 半角分隔 if(arr1.length > 1){ String code = arr1[0].trim(); String rangeVal = arr1[1].trim(); if(rangeVal.contains("-") || rangeVal.contains("-")){ String[] r1 = rangeVal.split("-");// 半角分隔 if(r1.length > 1){ VisibleRangeDto rangeDto = new VisibleRangeDto(); rangeDto.setCode(code); rangeDto.setLeftVal(Integer.parseInt(r1[0].trim())); rangeDto.setRightVal(Integer.parseInt(r1[1].trim())); rangeDto.setRangeVal(rangeVal); rangeList.add(rangeDto); }else{ String[] r2 = rangeCode.split("-");// 全角分隔 if(r2.length > 1){ VisibleRangeDto rangeDto = new VisibleRangeDto(); rangeDto.setCode(code); rangeDto.setLeftVal(Integer.parseInt(r2[0].trim())); rangeDto.setRightVal(Integer.parseInt(r2[1].trim())); rangeDto.setRangeVal(rangeVal); rangeList.add(rangeDto); } } } }else{ String [] arr2 = rangeCode.split(":");// 全角分隔 if(arr2.length > 1){ String code = arr2[0].trim(); String rangeVal = arr2[1].trim(); if(rangeVal.contains("-") || rangeVal.contains("-")){ String[] r1 = rangeVal.split("-");// 半角分隔 if(r1.length > 1){ VisibleRangeDto rangeDto = new VisibleRangeDto(); rangeDto.setCode(code); rangeDto.setLeftVal(Integer.parseInt(r1[0].trim())); rangeDto.setRightVal(Integer.parseInt(r1[1].trim())); rangeDto.setRangeVal(rangeVal); rangeList.add(rangeDto); }else{ String[] r2 = rangeCode.split("-");// 全角分隔 if(r2.length > 1){ VisibleRangeDto rangeDto = new VisibleRangeDto(); rangeDto.setCode(code); rangeDto.setLeftVal(Integer.parseInt(r2[0].trim())); rangeDto.setRightVal(Integer.parseInt(r2[1].trim())); rangeDto.setRangeVal(rangeVal); rangeList.add(rangeDto); } } } } } }else{ if(rangeCode.contains("-") || rangeCode.contains("-")){ String[] r1 = rangeCode.split("-");// 半角分隔 if(r1.length > 1){ VisibleRangeDto rangeDto = new VisibleRangeDto(); rangeDto.setCode(null); rangeDto.setLeftVal(Integer.parseInt(r1[0].trim())); rangeDto.setRightVal(Integer.parseInt(r1[1].trim())); rangeDto.setRangeVal(rangeCode); rangeList.add(rangeDto); }else{ String[] r2 = rangeCode.split("-");// 全角分隔 if(r2.length > 1){ VisibleRangeDto rangeDto = new VisibleRangeDto(); rangeDto.setCode(null); rangeDto.setLeftVal(Integer.parseInt(r2[0].trim())); rangeDto.setRightVal(Integer.parseInt(r2[1].trim())); rangeDto.setRangeVal(rangeCode); rangeList.add(rangeDto); } } } } } // System.out.println("rangeList:" + rangeList); return rangeList; } /** * 获取可见的userid列表 * @param rangeList * @return */ private List getInvisibleUseridList(List rangeList, RoleDto biggestRole){ List visibleUseridList = new ArrayList(); // 获取当前登录用户 HttpSession session = ContextHolderUtils.getSession(); TSUser currentLoginUser = (TSUser)session.getAttribute("LOCAL_CLINET_USER"); //查询当前登录用户所有的组织机构 List userOrgList = this.findHql("from TSUserOrg where tsUser.id=? order by intime desc", currentLoginUser.getId()); // 得到当前登录用户的当前组织机构 TSUserOrg currentUserOrg = null; if(userOrgList!=null && userOrgList.size()>0){ currentUserOrg = userOrgList.get(0);//取出该用户最新的一条组织机构关系记录 // System.out.println("currentUserOrgId:" + currentUserOrg.getTsDepart().getId()); } for(int i=0; i departList = departService.findHql(sb.toString()); if(departList != null && departList.size() > 0){ for(TSDepart depart : departList){ List useridList = filterUserid(depart.getId(), range); visibleUseridList.addAll(useridList); } } }else if(range.getCode().trim().startsWith("P_") || range.getCode().trim().startsWith("p_") || range.getCode().trim().startsWith("P_") || range.getCode().trim().startsWith("p_") || range.getCode().trim().startsWith("A_") || range.getCode().trim().startsWith("a_") || range.getCode().trim().startsWith("A_") || range.getCode().trim().startsWith("a_") || range.getCode().trim().startsWith("M_") || range.getCode().trim().startsWith("m_") || range.getCode().trim().startsWith("M_") || range.getCode().trim().startsWith("m_") ){ // 查询指定编码的组织机构 String hql = " from TSDepart d where 1=1 and d.deptCode = ?"; List departList = departService.findHql(hql.toString(), range.getCode().trim()); if(departList != null && departList.size() > 0){ TSDepart specificDepart = departList.get(0); List useridList = filterUserid(specificDepart.getId(), range); visibleUseridList.addAll(useridList); } } }else{//code为空,表示本部门内的数据可见权限 for(int j = 0; j < userOrgList.size(); j++) { TSUserOrg currentUserOrgTemp = userOrgList.get(j); List useridList = new ArrayList(); useridList = filterUserid(currentUserOrgTemp.getTsDepart().getId(), range); visibleUseridList.addAll(useridList); } } } // 加入当前登陆人的userid if(!visibleUseridList.contains(currentLoginUser.getId())){ visibleUseridList.add(currentLoginUser.getId()); } // 滤除userid重复的数据,并转为Map Map map = new HashMap(); for(String id : visibleUseridList){ map.put(id, id); } // 将Map转为List,并赋给visibleUseridList List list = new ArrayList(); for(String userid : map.values()){ list.add(userid); } visibleUseridList = list; // System.out.println("visibleUseridList.totalSize:" + visibleUseridList.size()); return visibleUseridList; } /** * 比较角色的大小,并返回权限最大的角色 * 通过用户与角色的关系列表list比较 */ private RoleUserDto getLargerRoleByRoleUserRelationList(List roleUserDtoList){ if(roleUserDtoList != null){ if(roleUserDtoList.size() == 1){ return roleUserDtoList.get(0); }else if(roleUserDtoList.size()>1){ RoleUserDto max = roleUserDtoList.get(0); for(int i=1; i getLargerRoleByRoleUserRelationMap(Map> ruMap){ if(ruMap!=null && ruMap.size()>0){ List ruList = new ArrayList();//符合过滤条件的角色列表 for (List roleUserDtoList : ruMap.values()) { if(roleUserDtoList != null){ if(roleUserDtoList.size() == 1){ ruList.add(roleUserDtoList.get(0)); continue; }else if(roleUserDtoList.size()>1){ RoleUserDto max = roleUserDtoList.get(0); for(int i=1; i filterUserid(String departid, RoleDto biggestRole){ List visibleUseridList = new ArrayList(); // 通过组织机构id获取当前组织机构及其以下所有子孙机构的id的集合 List departidList = departService.getDePartIdAndallSonDepartIds(departid); // TODO 调试用 for(String d : departidList){ System.out.println("departidList:" + d); } // 根据组织机构idlist查询用户与角色的关系列表 List roleUserList = dataPermissionMinidao.getRoleUsers(departidList); // 构建用户与角色的关系Map key:userid, value:RoleUserDto Map> ruMap = new HashMap>(); if(roleUserList != null && roleUserList.size() > 0){ for(RoleUserDto dto : roleUserList){ if(ruMap.containsKey(dto.getUserid())){ ruMap.get(dto.getUserid()).add(dto); }else{ List dtoList = new ArrayList(); dtoList.add(dto); ruMap.put(dto.getUserid(), dtoList); } } } System.out.println("ruMap:" + ruMap); System.out.println("ruMap.size:" + ruMap.size()); // 比较角色的大小,并返回权限最大的角色(通过用户与角色的关系Map比较) List roleUserDtoList = this.getLargerRoleByRoleUserRelationMap(ruMap); System.out.println("roleUserDtoList.size:" + roleUserDtoList.size()); if(roleUserDtoList != null && roleUserDtoList.size() > 0){ String visible_roleweight_code = biggestRole.getVisible_roleweight_code(); Integer leftVal = null; Integer rightVal = null; // 取出当前最大角色的范围值 if(visible_roleweight_code.contains("-") || visible_roleweight_code.contains("-")){ String[] r1 = visible_roleweight_code.split("-");// 半角分隔 if(r1.length > 1){ leftVal = Integer.parseInt(r1[0].trim()); rightVal = Integer.parseInt(r1[1].trim()); }else{ String[] r2 = visible_roleweight_code.split("-");// 全角分隔 if(r2.length > 1){ leftVal = Integer.parseInt(r2[0].trim()); rightVal = Integer.parseInt(r2[1].trim()); } } } // 过滤出可见的userid,添加到list for(RoleUserDto dto : roleUserDtoList){ Integer selfCode = Integer.parseInt(dto.getSelf_roleweight_code()); if(selfCode >= leftVal && selfCode <= rightVal){ visibleUseridList.add(dto.getUserid()); }else{ System.out.println("dto:" + dto); } } } return visibleUseridList; }*/ /** * 过滤 * @param currentUserOrg * @param biggestRole * @return */ private List filterUserid(String departid, VisibleRangeDto range){ List visibleUseridList = new ArrayList(); // 通过组织机构id获取当前组织机构及其以下所有子孙机构的id的集合 List departidList = departService.getDePartIdAndallSonDepartIds(departid); // // TODO 调试用 // for(String d : departidList){ // System.out.println("departidList:" + d); // } // 根据组织机构idlist查询用户与角色的关系列表 List roleUserList = dataPermissionMinidao.getRoleUsers(departidList); // 构建用户与角色的关系Map key:userid, value:RoleUserDto Map> ruMap = new HashMap>(); if(roleUserList != null && roleUserList.size() > 0){ for(RoleUserDto dto : roleUserList){ if(ruMap.containsKey(dto.getUserid())){ ruMap.get(dto.getUserid()).add(dto); }else{ List dtoList = new ArrayList(); dtoList.add(dto); ruMap.put(dto.getUserid(), dtoList); } } } // System.out.println("ruMap:" + ruMap); // System.out.println("ruMap.size:" + ruMap.size()); // 比较角色的大小,并返回权限最大的角色(通过用户与角色的关系Map比较) List roleUserDtoList = this.getLargerRoleByRoleUserRelationMap(ruMap); if(roleUserDtoList != null && roleUserDtoList.size() > 0){ // System.out.println("roleUserDtoList.size:" + roleUserDtoList.size()); // 过滤出可见的userid,添加到list for(RoleUserDto dto : roleUserDtoList){ Integer selfCode = Integer.parseInt(dto.getSelf_roleweight_code()); if(range.getCode() != null && range.getCode().length() > 0){ if(range.getCode().length()==1){ if(dto.getRolecode().substring(0, 1).equalsIgnoreCase(range.getCode())){ if(selfCode >= range.getLeftVal() && selfCode <= range.getRightVal()){ visibleUseridList.add(dto.getUserid()); } } }else{ boolean b = false; if( (range.getCode().trim().startsWith("P_") || range.getCode().trim().startsWith("p_") || range.getCode().trim().startsWith("P_") || range.getCode().trim().startsWith("p_")) && (dto.getRolecode().trim().startsWith("P_")) ){ b = true; }else if( (range.getCode().trim().startsWith("A_") || range.getCode().trim().startsWith("a_") || range.getCode().trim().startsWith("A_") || range.getCode().trim().startsWith("a_")) && (dto.getRolecode().trim().startsWith("A_")) ){ b = true; }else if((range.getCode().trim().startsWith("M_") || range.getCode().trim().startsWith("m_") || range.getCode().trim().startsWith("M_") || range.getCode().trim().startsWith("m_")) && (dto.getRolecode().trim().startsWith("M_"))){ b = true; } if(b){ if(selfCode >= range.getLeftVal() && selfCode <= range.getRightVal()){ visibleUseridList.add(dto.getUserid()); } } } }else{ if(selfCode >= range.getLeftVal() && selfCode <= range.getRightVal()){ visibleUseridList.add(dto.getUserid()); }else{ // System.out.println("dto:" + dto); } } } } return visibleUseridList; } }