diff --git a/src/main/java/com/wflow/workflow/service/impl/MemoryOrgOwnershipServiceImpl.java b/src/main/java/com/wflow/workflow/service/impl/MemoryOrgOwnershipServiceImpl.java index 50d83e4..f917d5e 100644 --- a/src/main/java/com/wflow/workflow/service/impl/MemoryOrgOwnershipServiceImpl.java +++ b/src/main/java/com/wflow/workflow/service/impl/MemoryOrgOwnershipServiceImpl.java @@ -28,10 +28,10 @@ import java.util.stream.Collectors; public class MemoryOrgOwnershipServiceImpl implements OrgOwnershipService { //用户ID与其所有层级所属部门ID级联映射 - private static final Map> userDeptMap = new ConcurrentHashMap<>(); + private static Map> userDeptMap = new ConcurrentHashMap<>(); //部门ID与其所有父级部门ID级联关系映射 - private static final Map> deptAndDeptMap = new ConcurrentHashMap<>(); + private static Map> deptAndDeptMap = new ConcurrentHashMap<>(); @Autowired private OrgRepositoryService orgRepositoryService; @@ -96,32 +96,34 @@ public class MemoryOrgOwnershipServiceImpl implements OrgOwnershipService { * 实例化时从数据库加载组织架构关系 */ @PostConstruct - public void loadByDbToCatch(){ + public void loadByDbToCatch() { //查询全量数据 log.info("开始加载全量组织架构关系数据"); List userDepartments = orgRepositoryService.getSysAllUserDepts(); List departments = orgRepositoryService.getSysAllDepts(); - userDeptMap.clear(); - deptAndDeptMap.clear(); + //先加载部门级联关系,部门map化 + // 构建新的临时 Map + Map> newDeptAndDeptMap = new ConcurrentHashMap<>(); Map deptMap = departments.stream().collect(Collectors.toMap(DeptDo::getId, v -> v)); deptMap.forEach((k, v) -> { Set set = new LinkedHashSet<>(); loadCascade(set, deptMap, v); - deptAndDeptMap.put(k, set); + newDeptAndDeptMap.put(k, set); }); //再加载用户与所属部门的级联关系 + Map> newUserDeptMap = new ConcurrentHashMap<>(); userDepartments.forEach(ud -> { if (ud.getDeptId() != null) { - Set userDeptSet = userDeptMap.get(ud.getUserId()); - if (CollectionUtil.isEmpty(userDeptSet)){ - userDeptSet = new LinkedHashSet<>(); - userDeptMap.put(ud.getUserId(), userDeptSet); - } + Set userDeptSet = newUserDeptMap.computeIfAbsent(ud.getUserId(), k -> new LinkedHashSet<>()); userDeptSet.add(ud.getDeptId()); - userDeptSet.addAll(deptAndDeptMap.getOrDefault(ud.getDeptId(), new HashSet<>())); + userDeptSet.addAll(newDeptAndDeptMap.getOrDefault(ud.getDeptId(), new HashSet<>())); } }); + + // 原子替换引用 + deptAndDeptMap = newDeptAndDeptMap; + userDeptMap = newUserDeptMap; } /**