|
@@ -8,15 +8,15 @@ import com.lc.ibps.cloud.entity.*;
|
|
|
import com.lc.ibps.org.auth.persistence.entity.ResourcesPo;
|
|
import com.lc.ibps.org.auth.persistence.entity.ResourcesPo;
|
|
|
import com.lc.ibps.org.party.persistence.entity.*;
|
|
import com.lc.ibps.org.party.persistence.entity.*;
|
|
|
import com.lc.ibps.platform.dao.PartyRoleProviderDao;
|
|
import com.lc.ibps.platform.dao.PartyRoleProviderDao;
|
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
+import org.slf4j.Logger;
|
|
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
|
|
-import java.util.Comparator;
|
|
|
|
|
-import java.util.List;
|
|
|
|
|
-import java.util.Optional;
|
|
|
|
|
|
|
+import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
import java.util.stream.Stream;
|
|
import java.util.stream.Stream;
|
|
|
|
|
|
|
@@ -30,6 +30,8 @@ public class PartyRoleProviderService {
|
|
|
|
|
|
|
|
private ICommonDao<?> commonDao = AppUtil.getBean(ICommonDao.class);
|
|
private ICommonDao<?> commonDao = AppUtil.getBean(ICommonDao.class);
|
|
|
|
|
|
|
|
|
|
+ protected static final Logger logger = LoggerFactory.getLogger(PartyRoleProviderService.class);
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 增加用户角色
|
|
* 增加用户角色
|
|
|
* 仅限于更新IBPS_PARTY_EMPLOYEE表的JOB_字段内容
|
|
* 仅限于更新IBPS_PARTY_EMPLOYEE表的JOB_字段内容
|
|
@@ -173,7 +175,6 @@ public class PartyRoleProviderService {
|
|
|
apiPageList.setDataResult(null);
|
|
apiPageList.setDataResult(null);
|
|
|
apiResult.setData(apiPageList);
|
|
apiResult.setData(apiPageList);
|
|
|
apiResult.setMessage("查询成功");
|
|
apiResult.setMessage("查询成功");
|
|
|
-
|
|
|
|
|
return apiResult;
|
|
return apiResult;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -278,4 +279,247 @@ public class PartyRoleProviderService {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 测试调用getRolePermissionMatrix方法
|
|
|
|
|
+ */
|
|
|
|
|
+ public void testGetRolePermissionMatrix(){
|
|
|
|
|
+ APIRequest request = new APIRequest();
|
|
|
|
|
+ Map<String, Object> customs = new HashMap<>();
|
|
|
|
|
+ //customs.put("pageName", "安全");
|
|
|
|
|
+
|
|
|
|
|
+ //customs.put("pageName", "风险评估计划");
|
|
|
|
|
+ //customs.put("peopleName", "李");
|
|
|
|
|
+
|
|
|
|
|
+ request.setCustoms(customs);
|
|
|
|
|
+
|
|
|
|
|
+ APIRequestPage requestPage = new APIRequestPage();
|
|
|
|
|
+ requestPage.setPageNo(1);
|
|
|
|
|
+ requestPage.setLimit(50);
|
|
|
|
|
+ request.setRequestPage(requestPage);
|
|
|
|
|
+
|
|
|
|
|
+ APIResult<PermissionPageList<PermissionViewDTO>> response = getPeoplePermission(request);
|
|
|
|
|
+ System.out.println("------------------------------------------------------------");
|
|
|
|
|
+ System.out.println("------------------------------------------------------------");
|
|
|
|
|
+ System.out.println(response);
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 人员权限一览表 查询(支持分页和模糊查询)
|
|
|
|
|
+ */
|
|
|
|
|
+ @Transactional(readOnly = true)
|
|
|
|
|
+ public APIResult<PermissionPageList<PermissionViewDTO>> getPeoplePermission(APIRequest request) {
|
|
|
|
|
+
|
|
|
|
|
+ String peopleName = (String) getCustomParamFormRequest(request, "peopleName");
|
|
|
|
|
+ String pageName = (String) getCustomParamFormRequest(request, "pageName");
|
|
|
|
|
+
|
|
|
|
|
+ int page = 1;
|
|
|
|
|
+ int limit = 50;
|
|
|
|
|
+ if (null != request.getRequestPage() && request.getRequestPage().getPageNo() > 0 && request.getRequestPage().getLimit() > 0) {
|
|
|
|
|
+ page = request.getRequestPage().getPageNo();
|
|
|
|
|
+ limit = request.getRequestPage().getLimit();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 1. 获取所有有效用户(按名称排序),并根据 peopleName 过滤
|
|
|
|
|
+ List<UserDO> rawUsers = partyRoleProviderDao.getAllUsers(peopleName);
|
|
|
|
|
+ // 按名称排序
|
|
|
|
|
+ rawUsers.sort(Comparator.comparing(UserDO::getName));
|
|
|
|
|
+
|
|
|
|
|
+ // 去重:若存在同名用户,保留第一个并记录警告(确保 roles 列表与权限 Map 的 key 数量一致)
|
|
|
|
|
+ Map<String, UserDO> uniqueUserMap = new LinkedHashMap<>();
|
|
|
|
|
+ for (UserDO user : rawUsers) {
|
|
|
|
|
+ if (uniqueUserMap.containsKey(user.getName())) {
|
|
|
|
|
+ logger.warn("发现重复的用户名称: {}, 已忽略其中一个", user.getName());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ uniqueUserMap.put(user.getName(), user);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ List<UserDO> allUsers = new ArrayList<>(uniqueUserMap.values());
|
|
|
|
|
+ List<String> userNames = allUsers.stream().map(UserDO::getName).collect(Collectors.toList());
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 获取所有原始资源(DISPLAY_IN_MENU_ = 'Y')
|
|
|
|
|
+ List<ResourceRawDO> rawResources = partyRoleProviderDao.getAllDisplayableResources();
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 在内存中构建有效资源树,过滤父级不显示的,生成 displayName 和 sortPath
|
|
|
|
|
+ List<ResourceDO> validResources = buildValidResources(rawResources);
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 应用资源名称过滤
|
|
|
|
|
+ if (StringUtils.isNotBlank(pageName)) {
|
|
|
|
|
+ validResources = validResources.stream()
|
|
|
|
|
+ .filter(r -> r.getDisplayName().contains(pageName))
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 5. 总记录数(用于分页)
|
|
|
|
|
+ int totalCount = validResources.size();
|
|
|
|
|
+ int totalPages = (int) Math.ceil((double) totalCount / limit);
|
|
|
|
|
+ int offset = (page - 1) * limit;
|
|
|
|
|
+
|
|
|
|
|
+ // 6. 对资源进行分页
|
|
|
|
|
+ List<ResourceDO> pagedResources = validResources.stream()
|
|
|
|
|
+ .skip(offset)
|
|
|
|
|
+ .limit(limit)
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+
|
|
|
|
|
+ // 7. 获取角色-资源权限关系
|
|
|
|
|
+ List<RoleResourceDO> roleResources = partyRoleProviderDao.getValidRoleResources();
|
|
|
|
|
+ Map<String, Set<String>> roleResMap = new HashMap<>();
|
|
|
|
|
+ for (RoleResourceDO rr : roleResources) {
|
|
|
|
|
+ roleResMap.computeIfAbsent(rr.getRoleId(), k -> new HashSet<>()).add(rr.getResId());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 8. 构建用户 -> 资源权限的映射(通过用户拥有的角色)
|
|
|
|
|
+ Map<String, Set<String>> userResMap = new HashMap<>();
|
|
|
|
|
+ for (UserDO user : allUsers) {
|
|
|
|
|
+ Set<String> userResIds = new HashSet<>();
|
|
|
|
|
+ if (StringUtils.isNotBlank(user.getJob())) {
|
|
|
|
|
+ String[] roleIds = user.getJob().split(",");
|
|
|
|
|
+ for (String roleId : roleIds) {
|
|
|
|
|
+ Set<String> resSet = roleResMap.get(roleId);
|
|
|
|
|
+ if (resSet != null) {
|
|
|
|
|
+ userResIds.addAll(resSet);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ userResMap.put(user.getId(), userResIds);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 9. 构建一个包含所有用户且默认值为 false 的 Map 模板
|
|
|
|
|
+ Map<String, Boolean> defaultUserPermissionMap = new LinkedHashMap<>();
|
|
|
|
|
+ for (UserDO user : allUsers) {
|
|
|
|
|
+ defaultUserPermissionMap.put(user.getName(), false);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 10. 构建当前页的权限数据
|
|
|
|
|
+ List<PagePermissionDTO> permissionList = new ArrayList<>();
|
|
|
|
|
+ for (ResourceDO res : pagedResources) {
|
|
|
|
|
+ PagePermissionDTO dto = new PagePermissionDTO();
|
|
|
|
|
+ dto.setPageId(res.getId());
|
|
|
|
|
+ dto.setPageName(res.getDisplayName());
|
|
|
|
|
+
|
|
|
|
|
+ // 复制默认 map,然后为有权限的用户设置为 true
|
|
|
|
|
+ Map<String, Boolean> permissions = new LinkedHashMap<>(defaultUserPermissionMap);
|
|
|
|
|
+ for (UserDO user : allUsers) {
|
|
|
|
|
+ if (userResMap.getOrDefault(user.getId(), Collections.emptySet()).contains(res.getId())) {
|
|
|
|
|
+ permissions.put(user.getName(), true);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ dto.setRolePermissions(permissions);
|
|
|
|
|
+ permissionList.add(dto);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 11. 构建返回对象
|
|
|
|
|
+ PermissionViewDTO viewDTO = new PermissionViewDTO(userNames, permissionList);
|
|
|
|
|
+ PermissionPageList<PermissionViewDTO> pageList = new PermissionPageList<>();
|
|
|
|
|
+ pageList.setData(viewDTO);
|
|
|
|
|
+ pageList.setPageResult(new APIPageResult(page, limit, totalCount));
|
|
|
|
|
+
|
|
|
|
|
+ APIResult<PermissionPageList<PermissionViewDTO>> result = new APIResult<>();
|
|
|
|
|
+ result.setState(200);
|
|
|
|
|
+ result.setMessage("查询成功");
|
|
|
|
|
+ result.setData(pageList);
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 构建有效资源列表,过滤父级不显示的,并生成 displayName 和 sortPath
|
|
|
|
|
+ */
|
|
|
|
|
+ private List<ResourceDO> buildValidResources(List<ResourceRawDO> rawResources) {
|
|
|
|
|
+ // 构建 id -> ResourceRawDO 的映射
|
|
|
|
|
+ Map<String, ResourceRawDO> rawMap = rawResources.stream()
|
|
|
|
|
+ .collect(Collectors.toMap(ResourceRawDO::getId, r -> r));
|
|
|
|
|
+
|
|
|
|
|
+ // 过滤出所有父级都显示的资源 ID
|
|
|
|
|
+ Set<String> validIds = new HashSet<>();
|
|
|
|
|
+ for (ResourceRawDO res : rawResources) {
|
|
|
|
|
+ if (allParentsDisplay(res, rawMap)) {
|
|
|
|
|
+ validIds.add(res.getId());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 对有效资源构建 displayName 和 sortPath
|
|
|
|
|
+ List<ResourceDO> result = new ArrayList<>();
|
|
|
|
|
+ for (ResourceRawDO res : rawResources) {
|
|
|
|
|
+ if (!validIds.contains(res.getId())) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ ResourceDO dto = new ResourceDO();
|
|
|
|
|
+ dto.setId(res.getId());
|
|
|
|
|
+ dto.setName(res.getName());
|
|
|
|
|
+ dto.setSn(res.getSn());
|
|
|
|
|
+ dto.setParentId(res.getParentId());
|
|
|
|
|
+ dto.setPath(res.getPath());
|
|
|
|
|
+ dto.setDisplayName(buildDisplayName(res, rawMap));
|
|
|
|
|
+ dto.setSortPath(buildSortPath(res, rawMap));
|
|
|
|
|
+ result.add(dto);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 按 sortPath 排序
|
|
|
|
|
+ result.sort(Comparator.comparing(ResourceDO::getSortPath));
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 检查资源的所有父级是否都显示
|
|
|
|
|
+ */
|
|
|
|
|
+ private boolean allParentsDisplay(ResourceRawDO res, Map<String, ResourceRawDO> rawMap) {
|
|
|
|
|
+ String path = res.getPath();
|
|
|
|
|
+ if (StringUtils.isBlank(path)) {
|
|
|
|
|
+ return true; // 根节点
|
|
|
|
|
+ }
|
|
|
|
|
+ String[] ids = path.split("\\.");
|
|
|
|
|
+ for (int i = 0; i < ids.length - 1; i++) { // 最后一个 ID 是自身,不检查
|
|
|
|
|
+ String pid = ids[i];
|
|
|
|
|
+ ResourceRawDO parent = rawMap.get(pid);
|
|
|
|
|
+ if (parent == null || !"Y".equals(parent.getDisplayInMenu())) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 构建显示名称(如:设施环境管理/安全管理)
|
|
|
|
|
+ */
|
|
|
|
|
+ private String buildDisplayName(ResourceRawDO res, Map<String, ResourceRawDO> rawMap) {
|
|
|
|
|
+ String path = res.getPath();
|
|
|
|
|
+ if (StringUtils.isBlank(path)) {
|
|
|
|
|
+ return res.getName();
|
|
|
|
|
+ }
|
|
|
|
|
+ String[] ids = path.split("\\.");
|
|
|
|
|
+ List<String> names = new ArrayList<>();
|
|
|
|
|
+ for (String id : ids) {
|
|
|
|
|
+ ResourceRawDO node = rawMap.get(id);
|
|
|
|
|
+ if (node != null) {
|
|
|
|
|
+ names.add(node.getName());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return String.join("/", names);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 构建排序路径(各层 SN_ 左补零后拼接)
|
|
|
|
|
+ */
|
|
|
|
|
+ private String buildSortPath(ResourceRawDO res, Map<String, ResourceRawDO> rawMap) {
|
|
|
|
|
+ String path = res.getPath();
|
|
|
|
|
+ if (StringUtils.isBlank(path)) {
|
|
|
|
|
+ return String.format("%010d", res.getSn() != null ? res.getSn() : 0);
|
|
|
|
|
+ }
|
|
|
|
|
+ String[] ids = path.split("\\.");
|
|
|
|
|
+ List<String> snParts = new ArrayList<>();
|
|
|
|
|
+ for (String id : ids) {
|
|
|
|
|
+ ResourceRawDO node = rawMap.get(id);
|
|
|
|
|
+ if (node != null && node.getSn() != null) {
|
|
|
|
|
+ snParts.add(String.format("%010d", node.getSn()));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return String.join(".", snParts);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|