diff --git a/backend/src/main/java/com/yfd/platform/data/mapper/SysUserDataScopeMapper.java b/backend/src/main/java/com/yfd/platform/data/mapper/SysUserDataScopeMapper.java index 3557ce2..e1e10f1 100644 --- a/backend/src/main/java/com/yfd/platform/data/mapper/SysUserDataScopeMapper.java +++ b/backend/src/main/java/com/yfd/platform/data/mapper/SysUserDataScopeMapper.java @@ -52,4 +52,9 @@ public interface SysUserDataScopeMapper extends BaseMapper { * orgType=RVCD时关联SD_RVCD_DIC获取rvnm(流域名称) */ List selectValidPermissionsWithName(@Param("userId") String userId); + + /** + * 批量根据用户ID查询权限列表(含关联资源名称) + */ + List selectValidPermissionsWithNameByUserIds(@Param("userIds") List userIds); } diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java b/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java index e37f595..b23df27 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java @@ -163,4 +163,10 @@ public class SysUser implements Serializable { @TableField(exist = false) List roles; + + @TableField(exist = false) + private String basinNames; + + @TableField(exist = false) + private String stationNames; } diff --git a/backend/src/main/java/com/yfd/platform/system/mapper/SysRoleMapper.java b/backend/src/main/java/com/yfd/platform/system/mapper/SysRoleMapper.java index 4852da3..ea37488 100644 --- a/backend/src/main/java/com/yfd/platform/system/mapper/SysRoleMapper.java +++ b/backend/src/main/java/com/yfd/platform/system/mapper/SysRoleMapper.java @@ -65,9 +65,9 @@ public interface SysRoleMapper extends BaseMapper { /** - * 批量获取用户角色 + * 批量获取用户角色(含userId映射) */ - List getRolesByUserIds(@Param("userIds") List userIds); + List> getUserRolesByUserIds(@Param("userIds") List userIds); /********************************** * 用途说明: 根据角色ID删除菜单与角色关联信息 diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java index a4665df..bb956d3 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java @@ -57,21 +57,13 @@ public class SysOrganizationServiceImpl extends ServiceImpl> getOrgTree(String parentid, String params) { - List orgList = new ArrayList<>(); - QueryWrapper queryWrapper = new QueryWrapper<>(); - //根据父级id查询 - queryWrapper.eq("parentid", parentid); - if (StrUtil.isNotEmpty(params)) { - queryWrapper.like("orgname", params); // 根据 部门名称 - } SysUser userInfo = userService.getUserInfo(); + + // 构建权限过滤条件 + Set allowedOrgIds = new HashSet<>(); if (userInfo.getUsertype() != 0) { - List roleByUserId = - sysRoleMapper.getRoleByUserId(userInfo.getId()); - List ids = new ArrayList<>(); - // 循环当前角色 + List roleByUserId = sysRoleMapper.getRoleByUserId(userInfo.getId()); for (SysRole sysRole : roleByUserId) { - // 获取角色的组织Id String orgscope = sysRole.getOrgscope(); if (StrUtil.isBlank(orgscope)) { continue; @@ -79,21 +71,33 @@ public class SysOrganizationServiceImpl extends ServiceImpl stringList = Arrays.asList(split); - Set set = new HashSet<>(); if (!stringList.isEmpty()) { - List list = - sysOrganizationMapper.selectList(new LambdaQueryWrapper().in(SysOrganization::getId, stringList)); - list.forEach(l -> set.add(l.getParentid())); + allowedOrgIds.addAll(stringList); + // 查询这些组织的父级ID + List list = sysOrganizationMapper.selectList( + new LambdaQueryWrapper().in(SysOrganization::getId, stringList)); + for (SysOrganization org : list) { + if (org.getParentid() != null) { + allowedOrgIds.add(org.getParentid()); + } + } } - ids.addAll(stringList); - ids.addAll(set); } - queryWrapper.in("id", ids); } - orgList = this.list(queryWrapper.orderByAsc("orgcode")); - // 将实体对象转换为 Map,确保字段名与实体类一致 - // 将实体对象转换为 Map,确保字段名与实体类一致 - List> listMap = orgList.stream().map(org -> { + + // 查询所有组织数据 + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (!allowedOrgIds.isEmpty()) { + queryWrapper.in("id", allowedOrgIds); + } + if (StrUtil.isNotEmpty(params)) { + queryWrapper.like("orgname", params); + } + + List allOrgList = this.list(queryWrapper.orderByAsc("orgcode")); + + // 将所有组织数据转换为Map结构 + List> allOrgMaps = allOrgList.stream().map(org -> { Map map = new HashMap<>(); map.put("id", org.getId()); map.put("orgtype", org.getOrgtype()); @@ -110,12 +114,39 @@ public class SysOrganizationServiceImpl extends ServiceImpl map : listMap) { - List> childList = child(map.get( - "id").toString());//查询下一子集 - map.put("childList", childList); //添加新列 子集 + + // 构建父子关系映射 + Map>> parentToChildrenMap = new HashMap<>(); + for (Map orgMap : allOrgMaps) { + String parentId = (String) orgMap.get("parentid"); + parentToChildrenMap.computeIfAbsent(parentId, k -> new ArrayList<>()).add(orgMap); + } + + // 过滤出指定父级ID的组织作为根节点 + List> rootOrgs = parentToChildrenMap.getOrDefault(parentid, new ArrayList<>()); + + // 构建完整的树形结构 + buildTreeStructure(rootOrgs, parentToChildrenMap); + + return rootOrgs; + } + + + /** + * 构建树形结构 + * @param orgList 当前层级的组织列表 + * @param parentToChildrenMap 父子关系映射 + */ + private void buildTreeStructure(List> orgList, + Map>> parentToChildrenMap) { + for (Map orgMap : orgList) { + String orgId = (String) orgMap.get("id"); + List> children = parentToChildrenMap.getOrDefault(orgId, new ArrayList<>()); + if (!children.isEmpty()) { + buildTreeStructure(children, parentToChildrenMap); // 递归构建子树 + } + orgMap.put("childList", children); } - return listMap; } /*********************************** @@ -203,35 +234,42 @@ public class SysOrganizationServiceImpl extends ServiceImpl getOrganizationById(String id, String orgName) { - - LambdaQueryWrapper queryWrapper = - new LambdaQueryWrapper<>(); SysUser userInfo = userService.getUserInfo(); + + // 收集所有允许的组织ID + Set allowedOrgIds = new HashSet<>(); if (userInfo.getUsertype() != 0) { - List roleByUserId = - sysRoleMapper.getRoleByUserId(userInfo.getId()); - List ids = new ArrayList<>(); - // 循环当前角色 + List roleByUserId = sysRoleMapper.getRoleByUserId(userInfo.getId()); for (SysRole sysRole : roleByUserId) { - // 获取角色的组织Id String orgscope = sysRole.getOrgscope(); if (StrUtil.isBlank(orgscope)) { continue; } - // 拆分组织Id + // 拆分组织Id并添加到集合中(自动去重) String[] split = orgscope.split(","); - List stringList = Arrays.asList(split); - ids.addAll(stringList); + for (String orgId : split) { + if (StrUtil.isNotBlank(orgId)) { + allowedOrgIds.add(orgId.trim()); + } + } } - if (ObjectUtil.isNotEmpty(ids)) { - queryWrapper.in(SysOrganization::getId, ids); - } - } + + // 构建查询条件 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysOrganization::getParentid, id); + if (StrUtil.isNotBlank(orgName)) { queryWrapper.like(SysOrganization::getOrgname, orgName); } - queryWrapper.eq(SysOrganization::getParentid, id).orderByDesc(SysOrganization::getOrgcode); + + // 如果有权限限制,添加IN条件 + if (!allowedOrgIds.isEmpty()) { + queryWrapper.in(SysOrganization::getId, allowedOrgIds); + } + + queryWrapper.orderByDesc(SysOrganization::getOrgcode); + return this.list(queryWrapper); } diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java index 112e8c0..87558dd 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java @@ -10,7 +10,12 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.data.domain.SysUserDataScope; import com.yfd.platform.data.mapper.SysUserDataScopeMapper; +import com.yfd.platform.env.domain.SdEngInfoBH; +import com.yfd.platform.env.domain.SdHbrvDic; +import com.yfd.platform.env.mapper.SdEngInfoBHMapper; +import com.yfd.platform.env.mapper.SdHbrvDicMapper; import com.yfd.platform.system.domain.LoginUser; import com.yfd.platform.system.domain.SysRole; import com.yfd.platform.system.domain.SysUser; @@ -56,6 +61,12 @@ public class UserServiceImpl extends ServiceImpl impleme @Resource private PasswordEncoder passwordEncoder; + + @Resource + private SdHbrvDicMapper sdHbrvDicMapper; + + @Resource + private SdEngInfoBHMapper sdEngInfoBHMapper; /** * 文件空间配置 */ @@ -636,10 +647,10 @@ public class UserServiceImpl extends ServiceImpl impleme } @Override - public Page queryPendingAuditUsers(Page page,String name,String regStatus) { + public Page queryPendingAuditUsers(Page page, String name, String regStatus) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(SysUser::getRegStatus, "PENDING","APPROVED","REJECTED"); - queryWrapper.eq(ObjectUtil.isNotEmpty(regStatus),SysUser::getRegStatus, regStatus); + queryWrapper.in(SysUser::getRegStatus, "PENDING", "APPROVED", "REJECTED"); + queryWrapper.eq(ObjectUtil.isNotEmpty(regStatus), SysUser::getRegStatus, regStatus); queryWrapper.and(StrUtil.isNotBlank(name), wrapper -> wrapper.like(SysUser::getNickname, name) .or() @@ -647,11 +658,113 @@ public class UserServiceImpl extends ServiceImpl impleme ); queryWrapper.orderByDesc(SysUser::getRegTime); Page mapPage = this.page(page, queryWrapper); - mapPage.getRecords().forEach(record -> { - String id = record.getId(); - List sysRoles = sysRoleMapper.getRoleByUserId(id); - record.setRoles(sysRoles); - }); + + List records = mapPage.getRecords(); + if (records == null || records.isEmpty()) { + return mapPage; + } + + List userIds = records.stream() + .map(SysUser::getId) + .collect(Collectors.toList()); + + Map> userRoleMap = new HashMap<>(); + List> userRoles = sysRoleMapper.getUserRolesByUserIds(userIds); + if (userRoles != null) { + for (Map row : userRoles) { + String userId = (String) row.get("userId"); + SysRole role = new SysRole(); + role.setId((String) row.get("id")); + role.setRolecode((String) row.get("rolecode")); + role.setRolename((String) row.get("rolename")); + role.setLevel((String) row.get("level")); + role.setDescription((String) row.get("description")); + role.setIsvaild((String) row.get("isvaild")); + role.setOrgscope((String) row.get("orgscope")); + role.setOptscope((String) row.get("optscope")); + role.setBusscope((String) row.get("busscope")); + userRoleMap.computeIfAbsent(userId, k -> new ArrayList<>()).add(role); + } + } + + Map> userScopeMap = new HashMap<>(); + List allScopes = sysUserDataScopeMapper.selectValidPermissionsWithNameByUserIds(userIds); + if (allScopes != null) { + for (SysUserDataScope scope : allScopes) { + userScopeMap.computeIfAbsent(scope.getUserId(), k -> new ArrayList<>()).add(scope); + } + } + List allHbrvDicts = sdHbrvDicMapper.selectList(null); + Map basinCodeToNameMap = new HashMap<>(); + if (allHbrvDicts != null) { + for (SdHbrvDic hbrv : allHbrvDicts) { + if (hbrv.getHbrvcd() != null && hbrv.getHbrvnm() != null) { + basinCodeToNameMap.put(hbrv.getHbrvcd(), hbrv.getHbrvnm()); + } + } + } + + List allStations = sdEngInfoBHMapper.selectList(null); + Map> basinToStationsMap = new HashMap<>(); + Map stationCodeToNameMap = new HashMap<>(); + + if (allStations != null) { + for (SdEngInfoBH station : allStations) { + if (station.getStcd() != null && station.getEnnm() != null) { + stationCodeToNameMap.put(station.getStcd(), station.getEnnm()); + } + if (station.getHbrvcd() != null) { + basinToStationsMap.computeIfAbsent(station.getHbrvcd(), k -> new ArrayList<>()).add(station); + } + } + } + + for (SysUser record : records) { + String userId = record.getId(); + + List roles = userRoleMap.getOrDefault(userId, Collections.emptyList()); + record.setRoles(roles); + + List scopes = userScopeMap.getOrDefault(userId, Collections.emptyList()); + Set basinNameSet = new LinkedHashSet<>(); + Set stationNameSet = new LinkedHashSet<>(); + + for (SysUserDataScope scope : scopes) { + String orgType = scope.getOrgType(); + String orgId = scope.getOrgId(); + String orgName = scope.getOrgName(); + + if ("HBRVCD".equals(orgType)) { + if (orgName != null) { + basinNameSet.add(orgName); + } + if (orgId != null) { + List stations = basinToStationsMap.get(orgId); + if (stations != null) { + for (SdEngInfoBH station : stations) { + if (station.getEnnm() != null) { + stationNameSet.add(station.getEnnm()); + } + } + } + } + } else if ("STATION".equals(orgType)) { + if (orgName != null) { + stationNameSet.add(orgName); + } + if (orgId != null) { + String stationName = stationCodeToNameMap.get(orgId); + if (stationName != null) { + stationNameSet.add(stationName); + } + } + } + } + + record.setBasinNames(basinNameSet.isEmpty() ? null : String.join(",", basinNameSet)); + record.setStationNames(stationNameSet.isEmpty() ? null : String.join(",", stationNameSet)); + } + return mapPage; } diff --git a/backend/src/main/resources/mapper/data/SysUserDataScopeMapper.xml b/backend/src/main/resources/mapper/data/SysUserDataScopeMapper.xml index 76194ae..572746d 100644 --- a/backend/src/main/resources/mapper/data/SysUserDataScopeMapper.xml +++ b/backend/src/main/resources/mapper/data/SysUserDataScopeMapper.xml @@ -103,4 +103,36 @@ ORDER BY s.CREATED_AT DESC + + diff --git a/backend/src/main/resources/mapper/system/SysRoleMapper.xml b/backend/src/main/resources/mapper/system/SysRoleMapper.xml index 9d3f206..8ebae21 100644 --- a/backend/src/main/resources/mapper/system/SysRoleMapper.xml +++ b/backend/src/main/resources/mapper/system/SysRoleMapper.xml @@ -143,6 +143,27 @@ #{id} + + delete from sys_role_users where userid !=(select u.id from sys_user u where u.account="admin") and roleid=#{roleid} and userid=#{urserid}