package com.jsl.oa.dao;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.jsl.oa.common.constant.BusinessConstants;
import com.jsl.oa.mapper.PermissionMapper;
import com.jsl.oa.model.dodata.PermissionDO;
import com.jsl.oa.utils.redis.RoleRedisUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
*
权限数据表
*
* 内容进入自定义实体类
*
* @author xiao_lfeng
* @version v1.1.0
* @since v1.1.0
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class PermissionDAO {
private final PermissionMapper permissionMapper;
private final RoleRedisUtil roleRedisUtil;
private final Gson gson;
/**
* 获取用户权限信息
*
* 通过用户 ID 获取用户权限信息
*
* @param uid 用户ID
* @return {@link List}
*/
public List getPermission(@NotNull Long uid) {
List getPermissionForString;
String permissionRedisString = roleRedisUtil.getData(BusinessConstants.NONE, uid.toString());
if (permissionRedisString == null) {
List permissionList = permissionMapper.permissionUserPid(uid);
getPermissionForString = new ArrayList<>();
forPermissionToBuildString(permissionList, getPermissionForString);
// 存入 Redis
roleRedisUtil.setData(BusinessConstants.NONE, uid.toString(), gson.toJson(getPermissionForString), 1440);
} else {
getPermissionForString = gson.fromJson(permissionRedisString, new TypeToken>() { }.getType());
}
return getPermissionForString;
}
public List getAllPermissionBuildString() {
List getPermissionForString;
String getRedisData = roleRedisUtil.getData(BusinessConstants.ALL_PERMISSION, "string");
if (getRedisData == null) {
List permissionList = permissionMapper.getAllPermission();
permissionList.removeIf(it -> it.getPid() != null);
getPermissionForString = new ArrayList<>();
forPermissionToBuildString(permissionList, getPermissionForString);
// 存入 Redis
roleRedisUtil.setData(
BusinessConstants.ALL_PERMISSION,
"string",
gson.toJson(getPermissionForString),
1440);
} else {
getPermissionForString = gson.fromJson(getRedisData, new TypeToken>() { }.getType());
}
return getPermissionForString;
}
public List getRootPermission() {
String getRedisData = roleRedisUtil.getData(BusinessConstants.ALL_PERMISSION, "all");
if (getRedisData == null) {
List permissionList = permissionMapper.getAllPermission();
if (!permissionList.isEmpty()) {
List getPermissionList = new ArrayList<>();
for (PermissionDO permission : permissionList) {
if (permission.getPid() == null) {
getPermissionList.add(permission);
}
}
roleRedisUtil.setData(BusinessConstants.ALL_PERMISSION, "all", gson.toJson(getPermissionList), 1440);
return getPermissionList;
} else {
return null;
}
} else {
return gson.fromJson(getRedisData, new TypeToken>() {
}.getType());
}
}
/**
* 获取全部权限信息
*
* 获取全部权限信息
*
* @param permissionList 权限信息
* @param getPermissionForString 存储权限信息
*/
private void forPermissionToBuildString(
@NotNull List permissionList,
List getPermissionForString) {
for (PermissionDO permission : permissionList) {
// 寻找是否存在父亲
StringBuilder permissionString = new StringBuilder();
if (permission.getPid() != null) {
// 存在父亲
this.getFatherPermission(permissionString, permission.getPid());
} else {
// 不存在父亲
permissionString.append(permission.getName());
}
// 寻找子类
this.getChildPermission(permissionString, permission.getId(), getPermissionForString);
getPermissionForString.add(permissionString.toString());
}
}
/**
* 获取子类权限信息
*
* 通过父类 ID 获取子类权限信息
* 递归调用
*
* @param permissionString 父类权限信息
* @param id 父类 ID
* @param getPermissionForString 存储权限信息
*/
private void getChildPermission(StringBuilder permissionString, Long id, List getPermissionForString) {
// 获取子类权限信息
List permissionList = permissionMapper.getChildPermission(id);
// 判断是否存在子类
if (!permissionList.isEmpty()) {
// 存在子类
for (PermissionDO permission : permissionList) {
StringBuilder childPermissionString = new StringBuilder(permissionString);
// 遍历数据检查是否依旧存在子类
List childPermissionList = permissionMapper.getChildPermission(permission.getId());
if (!childPermissionList.isEmpty()) {
// 存在子类
permissionString.append(".").append(permission.getName());
this.getChildPermission(permissionString, permission.getId(), getPermissionForString);
} else {
// 不存在子类
permissionString.append(".").append(permission.getName());
getPermissionForString.add(permissionString.toString());
}
permissionString = childPermissionString;
}
}
}
/**
* 获取父类权限信息
*
* 通过子类 ID 获取父类权限信息
* 递归调用
*
* @param permissionString 父类权限信息
* @param pid 父类 ID
*/
public void getFatherPermission(StringBuilder permissionString, Long pid) {
// 获取权限信息
PermissionDO permissionDO = permissionMapper.getPermissionById(pid);
// 判断是否存在父亲
if (permissionDO.getPid() != null) {
// 存在父亲
this.getFatherPermission(permissionString, permissionDO.getPid());
} else {
// 不存在父亲
permissionString.append(permissionDO.getCode());
}
}
}