1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| @Override public DeptAndUserTreeResp getDeptAndUserTree() { List<UserPO> users = userDeptCache.queryAllUser(); List<DeptPO> depts = userDeptCache.queryAllDept();
Map<Long, DeptPO> deptPOMap = depts.stream() .collect(Collectors.toMap(DeptPO::getDeptId, v -> v, (v1, v2) -> v1));
Map<Long, UserDeptItem> itemMap = new HashMap<>(depts.size() * 2); Set<Long> rootDeptIds = new LinkedHashSet<>();
for (DeptPO deptPO : depts) { Long deptId = deptPO.getDeptId(); Long parentId = deptPO.getParentId();
UserDeptItem currentItem = itemMap.compute(deptId, (k, v) -> fillDeptItem(v, deptPO));
if (parentId == null || !deptPOMap.containsKey(parentId)) { rootDeptIds.add(deptId); } else { itemMap.computeIfAbsent(parentId, k -> new UserDeptItem().setItems(new ArrayList<>())) .getItems().add(currentItem); } }
UserDeptItem leaveGroup = new UserDeptItem() .setId(-1L) .setName("离职") .setType(RelationTypeEnum.DEPARTMENT.getType()) .setItems(new ArrayList<>());
for (UserPO userPO : Users) { if (userPO.getState() == null) continue;
UserDeptItem staffItem = new UserDeptItem() .setId(userPO.getUserId()) .setName(userPO.getName()) .setEmail(userPO.getEmail()) .setNumber(userPO.getNumber()) .setType(RelationTypeEnum.STAFF.getType());
if (userPO.getState() == UserStateEnum.LEAVE.getCode()) { leaveGroup.getItems().add(staffItem); } else { Long deptId = userPO.getDeptId(); UserDeptItem deptItem = itemMap.get(deptId); if (deptItem != null) { deptItem.getItems().add(staffItem); } else { log.warn("发现孤儿员工,其归属部门不存在: userId={}, deptId={}", userPO.getUserId(), deptId); } } }
List<UserDeptItem> finalTree = rootDeptIds.stream() .map(itemMap::get) .filter(Objects::nonNull) .collect(Collectors.toList()); finalTree.add(leaveGroup);
removeEmptyDept(finalTree);
return new DeptAndUserTreeResp().setItems(finalTree); }
private UserDeptItem fillDeptItem(UserDeptItem existItem, DeptPO po) { UserDeptItem item = (existItem != null) ? existItem : new UserDeptItem(); if (item.getItems() == null) { item.setItems(new ArrayList<>()); } item.setId(po.getDeptId()); item.setName(po.getName()); item.setLeaderId(po.getLeaderId()); item.setType(RelationTypeEnum.DEPARTMENT.getType()); return item; }
private void removeEmptyDept(List<UserDeptItem> items) { if (CollectionUtils.isEmpty(items)) { return; } Iterator<UserDeptItem> iterator = items.iterator(); while (iterator.hasNext()) { UserDeptItem next = iterator.next(); if (Objects.equals(next.getType(), RelationTypeEnum.STAFF.getType())) { continue; } removeEmptyDept(next.getItems()); if (CollectionUtils.isEmpty(next.getItems())) { iterator.remove(); } } }
|