package com.oying.modules.system.service.impl; import cn.hutool.core.collection.CollUtil; import com.oying.modules.system.domain.Dept; import com.oying.modules.system.domain.Role; import com.oying.modules.system.domain.User; import lombok.RequiredArgsConstructor; import com.oying.modules.system.service.DataService; import com.oying.modules.system.service.DeptService; import com.oying.modules.system.service.RoleService; import com.oying.utils.CacheKey; import com.oying.utils.RedisUtils; import com.oying.utils.enums.DataScopeEnum; import org.springframework.stereotype.Service; import java.util.*; import java.util.concurrent.TimeUnit; /** * @author Z * @description 数据权限服务实现 * @date 2020-05-07 **/ @Service @RequiredArgsConstructor public class DataServiceImpl implements DataService { private final RedisUtils redisUtils; private final RoleService roleService; private final DeptService deptService; /** * 用户角色和用户机构改变时需清理缓存 * @param user / * @return / */ @Override public List getDeptIds(User user) { String key = CacheKey.DATA_USER + user.getId(); List ids = redisUtils.getList(key, Long.class); if (CollUtil.isEmpty(ids)) { Set deptIds = new HashSet<>(); // 查询用户角色 List roleList = roleService.findByUsersId(user.getId()); // 获取对应的机构ID for (Role role : roleList) { DataScopeEnum dataScopeEnum = DataScopeEnum.find(role.getDataScope()); switch (Objects.requireNonNull(dataScopeEnum)) { case THIS_LEVEL: deptIds.add(user.getDept().getId()); break; case CUSTOMIZE: deptIds.addAll(getCustomize(deptIds, role)); break; default: return new ArrayList<>(); } } ids = new ArrayList<>(deptIds); redisUtils.set(key, ids, 1, TimeUnit.DAYS); } return ids; } /** * 获取自定义的数据权限 * @param deptIds 机构ID * @param role 角色 * @return 数据权限ID */ public Set getCustomize(Set deptIds, Role role){ Set depts = deptService.findByRoleId(role.getId()); for (Dept dept : depts) { deptIds.add(dept.getId()); List deptChildren = deptService.findByPid(dept.getId()); if (CollUtil.isNotEmpty(deptChildren)) { deptIds.addAll(deptService.getDeptChildren(deptChildren)); } } return deptIds; } }