DataPermissionServiceImpl.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. package cn.com.lzt.common.service.impl;
  2. import cn.com.lzt.common.dao.DataPermissionMinidao;
  3. import cn.com.lzt.common.dto.RoleDto;
  4. import cn.com.lzt.common.dto.RoleUserDto;
  5. import cn.com.lzt.common.dto.VisibleRangeDto;
  6. import cn.com.lzt.common.dto.VisibleUserDto;
  7. import cn.com.lzt.common.pmenum.Flag;
  8. import cn.com.lzt.common.service.DataPermissionServiceI;
  9. import org.jeecgframework.core.common.service.impl.CommonServiceImpl;
  10. import org.jeecgframework.core.util.ContextHolderUtils;
  11. import org.jeecgframework.web.system.pojo.base.TSDepart;
  12. import org.jeecgframework.web.system.pojo.base.TSUser;
  13. import org.jeecgframework.web.system.pojo.base.TSUserOrg;
  14. import org.jeecgframework.web.system.service.DepartServiceI;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.stereotype.Service;
  17. import org.springframework.transaction.annotation.Transactional;
  18. import javax.servlet.http.HttpSession;
  19. import java.util.ArrayList;
  20. import java.util.HashMap;
  21. import java.util.List;
  22. import java.util.Map;
  23. @Service("dataPermissionService")
  24. @Transactional
  25. public class DataPermissionServiceImpl extends CommonServiceImpl implements DataPermissionServiceI{
  26. @Autowired
  27. private DepartServiceI departService;
  28. @Autowired
  29. private DataPermissionMinidao dataPermissionMinidao;
  30. /**
  31. * 数据过滤
  32. */
  33. public <T> List<T> dataFilter(List<T> list) {
  34. HttpSession session = ContextHolderUtils.getSession();
  35. TSUser user = (TSUser)session.getAttribute("LOCAL_CLINET_USER");
  36. 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 = ?)";
  37. List<Map<String, Object>> rolemap = this.findForJdbc(sql, user.getId());
  38. for(int i=0; i<rolemap.size(); i++){
  39. rolemap.get(i).get("rolename");
  40. }
  41. return list;
  42. }
  43. /**
  44. * 获取当前用户可见的userid列表
  45. */
  46. public VisibleUserDto getVisibleUserList(){
  47. // 获取当前登录用户
  48. HttpSession session = ContextHolderUtils.getSession();
  49. TSUser user = (TSUser)session.getAttribute("LOCAL_CLINET_USER");
  50. // 获取当前登录用户的所有角色列表
  51. String sql = "SELECT r.id roleid, r.rolecode, 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 = ?)";
  52. List<Map<String, Object>> rolemap = this.findForJdbc(sql, user.getId());
  53. // 封装Dto
  54. List<RoleDto> roleDtoList = new ArrayList<RoleDto>();
  55. for(int i=0; i<rolemap.size(); i++){
  56. RoleDto dto = new RoleDto();
  57. dto.setRoleid((String) rolemap.get(i).get("roleid"));
  58. dto.setRolecode((String) rolemap.get(i).get("rolecode"));
  59. dto.setRolename((String) rolemap.get(i).get("rolename"));
  60. dto.setSelf_roleweight_code(Integer.parseInt((String) rolemap.get(i).get("self_roleweight_code")));
  61. dto.setVisible_roleweight_code((String) rolemap.get(i).get("visible_roleweight_code"));
  62. roleDtoList.add(dto);
  63. }
  64. // 获取当前登录用户的最大角色
  65. RoleDto biggestRole = this.getBiggestRole(roleDtoList);
  66. // System.out.println("BiggestRole:" + biggestRole.toString());
  67. //String rolecode = biggestRole.getRolecode();//角色编码
  68. //Integer self_roleweight_code = biggestRole.getSelf_roleweight_code();// 自身权值编码
  69. String visible_roleweight_code = biggestRole.getVisible_roleweight_code();// 可见权限范围
  70. VisibleUserDto dto = new VisibleUserDto();//
  71. if(visible_roleweight_code != null && !"".equals(visible_roleweight_code.trim())){
  72. if(visible_roleweight_code.trim().equalsIgnoreCase("ALL")){
  73. dto.setFlag(Flag.ALL);
  74. return dto;
  75. }else if(visible_roleweight_code.trim().equalsIgnoreCase("NONE")){
  76. dto.setFlag(Flag.NONE);
  77. return dto;
  78. }else{
  79. List<String> rangeCodeList = this.pretreatment(visible_roleweight_code.trim());// 预处理可见范围编码
  80. List<VisibleRangeDto> rangeList = this.getVisibleRangeList(rangeCodeList);// 获取可见范围值列表
  81. List<String> useridList = this.getInvisibleUseridList(rangeList, biggestRole);// 获取可见的userid列表
  82. dto.setUseridList(useridList);
  83. dto.setFlag(Flag.PART);
  84. return dto;
  85. }
  86. }
  87. return dto;
  88. }
  89. /**
  90. * 比较角色的大小,并返回权限最大的角色
  91. */
  92. private RoleDto getBiggestRole(List<RoleDto> roleDtoList){
  93. if(roleDtoList != null){
  94. if(roleDtoList.size() == 1){
  95. return roleDtoList.get(0);
  96. }else if(roleDtoList.size()>1){
  97. RoleDto max = roleDtoList.get(0);
  98. for(int i=1; i<roleDtoList.size(); i++){
  99. RoleDto dto = roleDtoList.get(i);
  100. if(max.getRolecode().substring(0, 1).equals(dto.getRolecode().substring(0, 1))
  101. && max.getRolecode().substring(1, 2).equals("_")
  102. && dto.getRolecode().substring(1, 2).equals("_")){
  103. if(max.getSelf_roleweight_code() < dto.getSelf_roleweight_code()){
  104. max = dto;
  105. }
  106. if(max.getRolecode().equals("admin")){
  107. max = dto;
  108. }
  109. }else{
  110. if(dto.getRolecode().startsWith("M_")){
  111. max = dto;
  112. }else if(dto.getRolecode().startsWith("A_")){
  113. if(max.getRolecode().startsWith("P_")){
  114. max = dto;
  115. }
  116. }
  117. if(max.getRolecode().equals("admin")){
  118. max = dto;
  119. }
  120. }
  121. }
  122. return max;
  123. }
  124. }
  125. return null;
  126. }
  127. /**
  128. * 预处理可见范围编码rangeCodeStrs
  129. *
  130. * @param rangeCodeStrs:可见范围编码组合字符串
  131. * @return
  132. */
  133. private List<String> pretreatment(String rangeCodeStrs){
  134. List<String> rangeCodeList = new ArrayList<String>();
  135. String [] arr0 = rangeCodeStrs.split(";");
  136. for(int i=0; i<arr0.length; i++){
  137. String aa = arr0[i].trim();
  138. String [] arr1 = aa.split(";");
  139. for(int j=0; j<arr1.length; j++){
  140. rangeCodeList.add(arr1[j].trim());
  141. }
  142. }
  143. // System.out.println("rangeCodeList:" + rangeCodeList);
  144. return rangeCodeList;
  145. }
  146. /**
  147. * 获取可见范围值列表
  148. *
  149. * @param rangeCodeList:
  150. * @return
  151. */
  152. private List<VisibleRangeDto> getVisibleRangeList(List<String> rangeCodeList){
  153. List<VisibleRangeDto> rangeList = new ArrayList<VisibleRangeDto>();
  154. for(String rangeCode : rangeCodeList){
  155. if(rangeCode.contains(":") || rangeCode.contains(":")){
  156. String [] arr1 = rangeCode.split(":");// 半角分隔
  157. if(arr1.length > 1){
  158. String code = arr1[0].trim();
  159. String rangeVal = arr1[1].trim();
  160. if(rangeVal.contains("-") || rangeVal.contains("-")){
  161. String[] r1 = rangeVal.split("-");// 半角分隔
  162. if(r1.length > 1){
  163. VisibleRangeDto rangeDto = new VisibleRangeDto();
  164. rangeDto.setCode(code);
  165. rangeDto.setLeftVal(Integer.parseInt(r1[0].trim()));
  166. rangeDto.setRightVal(Integer.parseInt(r1[1].trim()));
  167. rangeDto.setRangeVal(rangeVal);
  168. rangeList.add(rangeDto);
  169. }else{
  170. String[] r2 = rangeCode.split("-");// 全角分隔
  171. if(r2.length > 1){
  172. VisibleRangeDto rangeDto = new VisibleRangeDto();
  173. rangeDto.setCode(code);
  174. rangeDto.setLeftVal(Integer.parseInt(r2[0].trim()));
  175. rangeDto.setRightVal(Integer.parseInt(r2[1].trim()));
  176. rangeDto.setRangeVal(rangeVal);
  177. rangeList.add(rangeDto);
  178. }
  179. }
  180. }
  181. }else{
  182. String [] arr2 = rangeCode.split(":");// 全角分隔
  183. if(arr2.length > 1){
  184. String code = arr2[0].trim();
  185. String rangeVal = arr2[1].trim();
  186. if(rangeVal.contains("-") || rangeVal.contains("-")){
  187. String[] r1 = rangeVal.split("-");// 半角分隔
  188. if(r1.length > 1){
  189. VisibleRangeDto rangeDto = new VisibleRangeDto();
  190. rangeDto.setCode(code);
  191. rangeDto.setLeftVal(Integer.parseInt(r1[0].trim()));
  192. rangeDto.setRightVal(Integer.parseInt(r1[1].trim()));
  193. rangeDto.setRangeVal(rangeVal);
  194. rangeList.add(rangeDto);
  195. }else{
  196. String[] r2 = rangeCode.split("-");// 全角分隔
  197. if(r2.length > 1){
  198. VisibleRangeDto rangeDto = new VisibleRangeDto();
  199. rangeDto.setCode(code);
  200. rangeDto.setLeftVal(Integer.parseInt(r2[0].trim()));
  201. rangeDto.setRightVal(Integer.parseInt(r2[1].trim()));
  202. rangeDto.setRangeVal(rangeVal);
  203. rangeList.add(rangeDto);
  204. }
  205. }
  206. }
  207. }
  208. }
  209. }else{
  210. if(rangeCode.contains("-") || rangeCode.contains("-")){
  211. String[] r1 = rangeCode.split("-");// 半角分隔
  212. if(r1.length > 1){
  213. VisibleRangeDto rangeDto = new VisibleRangeDto();
  214. rangeDto.setCode(null);
  215. rangeDto.setLeftVal(Integer.parseInt(r1[0].trim()));
  216. rangeDto.setRightVal(Integer.parseInt(r1[1].trim()));
  217. rangeDto.setRangeVal(rangeCode);
  218. rangeList.add(rangeDto);
  219. }else{
  220. String[] r2 = rangeCode.split("-");// 全角分隔
  221. if(r2.length > 1){
  222. VisibleRangeDto rangeDto = new VisibleRangeDto();
  223. rangeDto.setCode(null);
  224. rangeDto.setLeftVal(Integer.parseInt(r2[0].trim()));
  225. rangeDto.setRightVal(Integer.parseInt(r2[1].trim()));
  226. rangeDto.setRangeVal(rangeCode);
  227. rangeList.add(rangeDto);
  228. }
  229. }
  230. }
  231. }
  232. }
  233. // System.out.println("rangeList:" + rangeList);
  234. return rangeList;
  235. }
  236. /**
  237. * 获取可见的userid列表
  238. * @param rangeList
  239. * @return
  240. */
  241. private List<String> getInvisibleUseridList(List<VisibleRangeDto> rangeList, RoleDto biggestRole){
  242. List<String> visibleUseridList = new ArrayList<String>();
  243. // 获取当前登录用户
  244. HttpSession session = ContextHolderUtils.getSession();
  245. TSUser currentLoginUser = (TSUser)session.getAttribute("LOCAL_CLINET_USER");
  246. //查询当前登录用户所有的组织机构
  247. List<TSUserOrg> userOrgList = this.findHql("from TSUserOrg where tsUser.id=? order by intime desc", currentLoginUser.getId());
  248. // 得到当前登录用户的当前组织机构
  249. TSUserOrg currentUserOrg = null;
  250. if(userOrgList!=null && userOrgList.size()>0){
  251. currentUserOrg = userOrgList.get(0);//取出该用户最新的一条组织机构关系记录
  252. // System.out.println("currentUserOrgId:" + currentUserOrg.getTsDepart().getId());
  253. }
  254. for(int i=0; i<rangeList.size(); i++){
  255. VisibleRangeDto range = rangeList.get(i);
  256. if(range.getCode() != null){//code不为空,表示为其他部门的数据可见权限
  257. if(range.getCode().trim().equalsIgnoreCase("P") ||
  258. range.getCode().trim().equalsIgnoreCase("A") ||
  259. range.getCode().trim().equalsIgnoreCase("M")){
  260. StringBuffer sb = new StringBuffer("from TSDepart d where 1=1 and ");
  261. if(range.getCode().trim().equalsIgnoreCase("P")){
  262. sb.append("d.deptCode like 'P_%' OR ");
  263. sb.append("d.deptCode like 'p_%' OR ");
  264. sb.append("d.deptCode like 'P_%' OR ");
  265. sb.append("d.deptCode like 'p_%' ");
  266. }else if(range.getCode().trim().equalsIgnoreCase("A")){
  267. sb.append("d.deptCode like 'A_%' OR ");
  268. sb.append("d.deptCode like 'a_%' OR ");
  269. sb.append("d.deptCode like 'A_%' OR ");
  270. sb.append("d.deptCode like 'a_%' ");
  271. }else if(range.getCode().trim().equalsIgnoreCase("M")){
  272. sb.append("d.deptCode like 'M_%' OR ");
  273. sb.append("d.deptCode like 'm_%' OR ");
  274. sb.append("d.deptCode like 'M_%' OR ");
  275. sb.append("d.deptCode like 'm_%' ");
  276. }
  277. // 查询所有符合条件的组织机构列表
  278. List<TSDepart> departList = departService.findHql(sb.toString());
  279. if(departList != null && departList.size() > 0){
  280. for(TSDepart depart : departList){
  281. List<String> useridList = filterUserid(depart.getId(), range);
  282. visibleUseridList.addAll(useridList);
  283. }
  284. }
  285. }else if(range.getCode().trim().startsWith("P_") ||
  286. range.getCode().trim().startsWith("p_") ||
  287. range.getCode().trim().startsWith("P_") ||
  288. range.getCode().trim().startsWith("p_") ||
  289. range.getCode().trim().startsWith("A_") ||
  290. range.getCode().trim().startsWith("a_") ||
  291. range.getCode().trim().startsWith("A_") ||
  292. range.getCode().trim().startsWith("a_") ||
  293. range.getCode().trim().startsWith("M_") ||
  294. range.getCode().trim().startsWith("m_") ||
  295. range.getCode().trim().startsWith("M_") ||
  296. range.getCode().trim().startsWith("m_") ){
  297. // 查询指定编码的组织机构
  298. String hql = " from TSDepart d where 1=1 and d.deptCode = ?";
  299. List<TSDepart> departList = departService.findHql(hql.toString(), range.getCode().trim());
  300. if(departList != null && departList.size() > 0){
  301. TSDepart specificDepart = departList.get(0);
  302. List<String> useridList = filterUserid(specificDepart.getId(), range);
  303. visibleUseridList.addAll(useridList);
  304. }
  305. }
  306. }else{//code为空,表示本部门内的数据可见权限
  307. for(int j = 0; j < userOrgList.size(); j++) {
  308. TSUserOrg currentUserOrgTemp = userOrgList.get(j);
  309. List<String> useridList = new ArrayList<String>();
  310. useridList = filterUserid(currentUserOrgTemp.getTsDepart().getId(), range);
  311. visibleUseridList.addAll(useridList);
  312. }
  313. }
  314. }
  315. // 加入当前登陆人的userid
  316. if(!visibleUseridList.contains(currentLoginUser.getId())){
  317. visibleUseridList.add(currentLoginUser.getId());
  318. }
  319. // 滤除userid重复的数据,并转为Map
  320. Map<String, String> map = new HashMap<String, String>();
  321. for(String id : visibleUseridList){
  322. map.put(id, id);
  323. }
  324. // 将Map转为List,并赋给visibleUseridList
  325. List<String> list = new ArrayList<String>();
  326. for(String userid : map.values()){
  327. list.add(userid);
  328. }
  329. visibleUseridList = list;
  330. // System.out.println("visibleUseridList.totalSize:" + visibleUseridList.size());
  331. return visibleUseridList;
  332. }
  333. /**
  334. * 比较角色的大小,并返回权限最大的角色
  335. * 通过用户与角色的关系列表list比较
  336. */
  337. private RoleUserDto getLargerRoleByRoleUserRelationList(List<RoleUserDto> roleUserDtoList){
  338. if(roleUserDtoList != null){
  339. if(roleUserDtoList.size() == 1){
  340. return roleUserDtoList.get(0);
  341. }else if(roleUserDtoList.size()>1){
  342. RoleUserDto max = roleUserDtoList.get(0);
  343. for(int i=1; i<roleUserDtoList.size(); i++){
  344. RoleUserDto dto = roleUserDtoList.get(i);
  345. if(max.getRolecode().substring(0, 1).equals(dto.getRolecode().substring(0, 1))
  346. && max.getRolecode().substring(1, 2).equals("_")
  347. && dto.getRolecode().substring(1, 2).equals("_")){
  348. if(Integer.parseInt(max.getSelf_roleweight_code()) < Integer.parseInt(dto.getSelf_roleweight_code())){
  349. max = dto;
  350. }
  351. if(max.getRolecode().equals("admin")){
  352. max = dto;
  353. }
  354. }else{
  355. if(dto.getRolecode().startsWith("M_")){
  356. max = dto;
  357. }else if(dto.getRolecode().startsWith("A_")){
  358. if(max.getRolecode().startsWith("P_")){
  359. max = dto;
  360. }
  361. }
  362. if(max.getRolecode().equals("admin")){
  363. max = dto;
  364. }
  365. }
  366. }
  367. return max;
  368. }
  369. }
  370. return null;
  371. }
  372. /**
  373. * 比较角色的大小,并返回权限最大的角色
  374. * 通过用户与角色的关系列表Map比较
  375. */
  376. private List<RoleUserDto> getLargerRoleByRoleUserRelationMap(Map<String, List<RoleUserDto>> ruMap){
  377. if(ruMap!=null && ruMap.size()>0){
  378. List<RoleUserDto> ruList = new ArrayList<RoleUserDto>();//符合过滤条件的角色列表
  379. for (List<RoleUserDto> roleUserDtoList : ruMap.values()) {
  380. if(roleUserDtoList != null){
  381. if(roleUserDtoList.size() == 1){
  382. ruList.add(roleUserDtoList.get(0));
  383. continue;
  384. }else if(roleUserDtoList.size()>1){
  385. RoleUserDto max = roleUserDtoList.get(0);
  386. for(int i=1; i<roleUserDtoList.size(); i++){
  387. RoleUserDto dto = roleUserDtoList.get(i);
  388. if(max.getRolecode().substring(0, 1).equals(dto.getRolecode().substring(0, 1))
  389. && max.getRolecode().substring(1, 2).equals("_")
  390. && dto.getRolecode().substring(1, 2).equals("_")){
  391. if(Integer.parseInt(max.getSelf_roleweight_code()) < Integer.parseInt(dto.getSelf_roleweight_code())){
  392. max = dto;
  393. }
  394. if(max.getRolecode().equals("admin")){
  395. max = dto;
  396. }
  397. }else{
  398. if(dto.getRolecode().startsWith("M_")){
  399. max = dto;
  400. }else if(dto.getRolecode().startsWith("A_")){
  401. if(max.getRolecode().startsWith("P_")){
  402. max = dto;
  403. }
  404. }
  405. if(max.getRolecode().equals("admin")){
  406. max = dto;
  407. }
  408. }
  409. }
  410. ruList.add(max);
  411. }
  412. }
  413. }
  414. return ruList;
  415. }
  416. return null;
  417. }
  418. /**
  419. * 过滤
  420. * @param currentUserOrg
  421. * @param biggestRole
  422. * @return
  423. */
  424. /* private List<String> filterUserid(String departid, RoleDto biggestRole){
  425. List<String> visibleUseridList = new ArrayList<String>();
  426. // 通过组织机构id获取当前组织机构及其以下所有子孙机构的id的集合
  427. List<String> departidList = departService.getDePartIdAndallSonDepartIds(departid);
  428. // TODO 调试用
  429. for(String d : departidList){
  430. System.out.println("departidList:" + d);
  431. }
  432. // 根据组织机构idlist查询用户与角色的关系列表
  433. List<RoleUserDto> roleUserList = dataPermissionMinidao.getRoleUsers(departidList);
  434. // 构建用户与角色的关系Map key:userid, value:RoleUserDto
  435. Map<String, List<RoleUserDto>> ruMap = new HashMap<String, List<RoleUserDto>>();
  436. if(roleUserList != null && roleUserList.size() > 0){
  437. for(RoleUserDto dto : roleUserList){
  438. if(ruMap.containsKey(dto.getUserid())){
  439. ruMap.get(dto.getUserid()).add(dto);
  440. }else{
  441. List<RoleUserDto> dtoList = new ArrayList<RoleUserDto>();
  442. dtoList.add(dto);
  443. ruMap.put(dto.getUserid(), dtoList);
  444. }
  445. }
  446. }
  447. System.out.println("ruMap:" + ruMap);
  448. System.out.println("ruMap.size:" + ruMap.size());
  449. // 比较角色的大小,并返回权限最大的角色(通过用户与角色的关系Map比较)
  450. List<RoleUserDto> roleUserDtoList = this.getLargerRoleByRoleUserRelationMap(ruMap);
  451. System.out.println("roleUserDtoList.size:" + roleUserDtoList.size());
  452. if(roleUserDtoList != null && roleUserDtoList.size() > 0){
  453. String visible_roleweight_code = biggestRole.getVisible_roleweight_code();
  454. Integer leftVal = null;
  455. Integer rightVal = null;
  456. // 取出当前最大角色的范围值
  457. if(visible_roleweight_code.contains("-") || visible_roleweight_code.contains("-")){
  458. String[] r1 = visible_roleweight_code.split("-");// 半角分隔
  459. if(r1.length > 1){
  460. leftVal = Integer.parseInt(r1[0].trim());
  461. rightVal = Integer.parseInt(r1[1].trim());
  462. }else{
  463. String[] r2 = visible_roleweight_code.split("-");// 全角分隔
  464. if(r2.length > 1){
  465. leftVal = Integer.parseInt(r2[0].trim());
  466. rightVal = Integer.parseInt(r2[1].trim());
  467. }
  468. }
  469. }
  470. // 过滤出可见的userid,添加到list
  471. for(RoleUserDto dto : roleUserDtoList){
  472. Integer selfCode = Integer.parseInt(dto.getSelf_roleweight_code());
  473. if(selfCode >= leftVal && selfCode <= rightVal){
  474. visibleUseridList.add(dto.getUserid());
  475. }else{
  476. System.out.println("dto:" + dto);
  477. }
  478. }
  479. }
  480. return visibleUseridList;
  481. }*/
  482. /**
  483. * 过滤
  484. * @param currentUserOrg
  485. * @param biggestRole
  486. * @return
  487. */
  488. private List<String> filterUserid(String departid, VisibleRangeDto range){
  489. List<String> visibleUseridList = new ArrayList<String>();
  490. // 通过组织机构id获取当前组织机构及其以下所有子孙机构的id的集合
  491. List<String> departidList = departService.getDePartIdAndallSonDepartIds(departid);
  492. // // TODO 调试用
  493. // for(String d : departidList){
  494. // System.out.println("departidList:" + d);
  495. // }
  496. // 根据组织机构idlist查询用户与角色的关系列表
  497. List<RoleUserDto> roleUserList = dataPermissionMinidao.getRoleUsers(departidList);
  498. // 构建用户与角色的关系Map key:userid, value:RoleUserDto
  499. Map<String, List<RoleUserDto>> ruMap = new HashMap<String, List<RoleUserDto>>();
  500. if(roleUserList != null && roleUserList.size() > 0){
  501. for(RoleUserDto dto : roleUserList){
  502. if(ruMap.containsKey(dto.getUserid())){
  503. ruMap.get(dto.getUserid()).add(dto);
  504. }else{
  505. List<RoleUserDto> dtoList = new ArrayList<RoleUserDto>();
  506. dtoList.add(dto);
  507. ruMap.put(dto.getUserid(), dtoList);
  508. }
  509. }
  510. }
  511. // System.out.println("ruMap:" + ruMap);
  512. // System.out.println("ruMap.size:" + ruMap.size());
  513. // 比较角色的大小,并返回权限最大的角色(通过用户与角色的关系Map比较)
  514. List<RoleUserDto> roleUserDtoList = this.getLargerRoleByRoleUserRelationMap(ruMap);
  515. if(roleUserDtoList != null && roleUserDtoList.size() > 0){
  516. // System.out.println("roleUserDtoList.size:" + roleUserDtoList.size());
  517. // 过滤出可见的userid,添加到list
  518. for(RoleUserDto dto : roleUserDtoList){
  519. Integer selfCode = Integer.parseInt(dto.getSelf_roleweight_code());
  520. if(range.getCode() != null && range.getCode().length() > 0){
  521. if(range.getCode().length()==1){
  522. if(dto.getRolecode().substring(0, 1).equalsIgnoreCase(range.getCode())){
  523. if(selfCode >= range.getLeftVal() && selfCode <= range.getRightVal()){
  524. visibleUseridList.add(dto.getUserid());
  525. }
  526. }
  527. }else{
  528. boolean b = false;
  529. if( (range.getCode().trim().startsWith("P_") || range.getCode().trim().startsWith("p_") || range.getCode().trim().startsWith("P_") || range.getCode().trim().startsWith("p_")) &&
  530. (dto.getRolecode().trim().startsWith("P_")) ){
  531. b = true;
  532. }else if( (range.getCode().trim().startsWith("A_") || range.getCode().trim().startsWith("a_") || range.getCode().trim().startsWith("A_") || range.getCode().trim().startsWith("a_")) &&
  533. (dto.getRolecode().trim().startsWith("A_")) ){
  534. b = true;
  535. }else if((range.getCode().trim().startsWith("M_") || range.getCode().trim().startsWith("m_") || range.getCode().trim().startsWith("M_") || range.getCode().trim().startsWith("m_")) &&
  536. (dto.getRolecode().trim().startsWith("M_"))){
  537. b = true;
  538. }
  539. if(b){
  540. if(selfCode >= range.getLeftVal() && selfCode <= range.getRightVal()){
  541. visibleUseridList.add(dto.getUserid());
  542. }
  543. }
  544. }
  545. }else{
  546. if(selfCode >= range.getLeftVal() && selfCode <= range.getRightVal()){
  547. visibleUseridList.add(dto.getUserid());
  548. }else{
  549. // System.out.println("dto:" + dto);
  550. }
  551. }
  552. }
  553. }
  554. return visibleUseridList;
  555. }
  556. }