diff --git a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java index f3f93d22..2049d5bf 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java @@ -1,5 +1,6 @@ package com.yfd.platform.system.controller; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import cn.hutool.jwt.JWTUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -258,103 +259,129 @@ public class SmsVerifyCodeController { } } + /** + * 给用户分配流域/电站数据权限 + 默认角色。 + *

+ * 逻辑说明: + * 1. 收集前端传入的电站编码,按流域分组 + * 2. 如果用户选了某流域的所有电站 → 保存流域权限(RVCD) + * 3. 如果用户只选了某流域的部分电站 → 逐个保存电站权限(STATION) + * 4. 数据库中查不到的孤立电站编码 → 直接保存电站权限 + *

+ * 示例: + * - 选了 A流域全部6个电站 + B流域全部3个电站 + C流域1个电站 + * → 两条 RVCD(A、B)+ 一条 STATION(C的电站) + */ private boolean addDefaultRole(String userId, SmsVerifyCodeRequest smsVerifyCodeRequest) { if (userId == null || userId.isEmpty()) { return false; } + // 1. 收集前端传入的电站编码 String stationCode = smsVerifyCodeRequest.getStationCode(); - String rvcdCode = smsVerifyCodeRequest.getRvcdCode(); - Set selectedStationCodes = new HashSet<>(); if (StringUtils.isNotEmpty(stationCode)) { selectedStationCodes.addAll(Arrays.asList(stationCode.split(","))); } - Set selectedBasinCodes = new HashSet<>(); - if (StringUtils.isNotEmpty(rvcdCode)) { - selectedBasinCodes.addAll(Arrays.asList(rvcdCode.split(","))); - } - -// Set addedStationCodes = new HashSet<>(); - - for (String basinCode : selectedBasinCodes) { - if (StringUtils.isEmpty(basinCode)) { - continue; - } - - List allStationsInBasin = engInfoBHService.lambdaQuery() - .eq(SdEngInfoBH::getRvcd, basinCode) - .list(); - - if (allStationsInBasin == null || allStationsInBasin.isEmpty()) { - SysUserDataScope scope = new SysUserDataScope(); - scope.setUserId(userId); - scope.setOrgType("RVCD"); - scope.setOrgId(basinCode); - scope.setStatus(1); - scope.setPermissionType("READ"); - sysUserDataScopeService.addDataScope(scope); - continue; - } - - Set allStationCodesInBasin = allStationsInBasin.stream() - .map(SdEngInfoBH::getStcd) - .collect(Collectors.toSet()); - - boolean allStationsSelected = allStationCodesInBasin.containsAll(selectedStationCodes) - && selectedStationCodes.containsAll(allStationCodesInBasin); - - if (allStationsSelected) { - SysUserDataScope scope = new SysUserDataScope(); - scope.setUserId(userId); - scope.setOrgType("RVCD"); - scope.setOrgId(basinCode); - scope.setStatus(1); - scope.setPermissionType("READ"); - sysUserDataScopeService.addDataScope(scope); -// addedStationCodes.add(basinCode); - } else { - Set stationsInBasinAndSelected = allStationCodesInBasin.stream() - .filter(selectedStationCodes::contains) - .collect(Collectors.toSet()); - - for (String stationCd : stationsInBasinAndSelected) { - SysUserDataScope scope = new SysUserDataScope(); - scope.setUserId(userId); - scope.setOrgType("STATION"); - scope.setOrgId(stationCd); - scope.setStatus(1); - scope.setPermissionType("READ"); - sysUserDataScopeService.addDataScope(scope); -// addedStationCodes.add(stationCd); + // 2. 如果没有选择任何电站 + if (selectedStationCodes.isEmpty()) { + // 如果只传了流域,直接保存流域权限 + String rvcdCode = smsVerifyCodeRequest.getRvcdCode(); + if (StringUtils.isNotEmpty(rvcdCode)) { + for (String basinCode : rvcdCode.split(",")) { + if (StringUtils.isNotEmpty(basinCode)) { + addDataScope(userId, "RVCD", basinCode); + } } } + assignRoleToUser(userId); + return true; } -// Set standaloneStations = selectedStationCodes.stream() -// .filter(code -> !addedStationCodes.contains(code)) -// .collect(Collectors.toSet()); -// -// for (String stationCd : standaloneStations) { -// if (StringUtils.isEmpty(stationCd)) { -// continue; -// } -// SysUserDataScope scope = new SysUserDataScope(); -// scope.setUserId(userId); -// scope.setOrgType("STATION"); -// scope.setOrgId(stationCd); -// scope.setStatus(1); -// scope.setPermissionType("READ"); -// sysUserDataScopeService.addDataScope(scope); -// } + // 3. 批量查询所有选中电站的工程信息,获取每个电站所属的流域 + List selectedStations = engInfoBHService.lambdaQuery() + .in(SdEngInfoBH::getStcd, selectedStationCodes) + .list(); + + // 已通过电站权限处理过的电站编码 + Set processedStationCodes = new HashSet<>(); + + if (!selectedStations.isEmpty()) { + // 4. 按流域分组:{rvcd -> Set} + Map> basinToStations = new LinkedHashMap<>(); + for (SdEngInfoBH station : selectedStations) { + String reachcd = station.getReachcd(); + String stcd = station.getStcd(); + if (StrUtil.isBlank(reachcd)) { + // 无流域归属的电站,直接保存电站权限 + addDataScope(userId, "STATION", stcd); + processedStationCodes.add(stcd); + continue; + } + basinToStations.computeIfAbsent(reachcd, k -> new HashSet<>()).add(stcd); + } + + // 5. 对每个流域,判断用户是否选中了该流域的全部电站 + for (Map.Entry> entry : basinToStations.entrySet()) { + String basinCode = entry.getKey(); + Set selectedInThisBasin = entry.getValue(); + + // 查询该流域下的所有电站 + List allStationsInBasin = engInfoBHService.lambdaQuery() + .eq(SdEngInfoBH::getReachcd, basinCode) + .list(); + Set allStationCodesInBasin = allStationsInBasin.stream() + .map(SdEngInfoBH::getStcd) + .collect(Collectors.toSet()); + + if (allStationCodesInBasin.equals(selectedInThisBasin)) { + // 全选 → 保存流域权限 + addDataScope(userId, "RVCD", basinCode); + } else { + // 部分选 → 逐个保存电站权限 + for (String stcd : selectedInThisBasin) { + addDataScope(userId, "STATION", stcd); + } + } + processedStationCodes.addAll(selectedInThisBasin); + } + } + + // 6. 处理数据库中查不到的电站编码(孤立的电站),直接保存电站权限 + for (String stcd : selectedStationCodes) { + if (!processedStationCodes.contains(stcd)) { + addDataScope(userId, "STATION", stcd); + } + } + + // 7. 分配默认角色 + assignRoleToUser(userId); + return true; + } + + /** + * 保存一条数据权限 + */ + private void addDataScope(String userId, String orgType, String orgId) { + SysUserDataScope scope = new SysUserDataScope(); + scope.setUserId(userId); + scope.setOrgType(orgType); + scope.setOrgId(orgId); + scope.setStatus(1); + scope.setPermissionType("READ"); + sysUserDataScopeService.addDataScope(scope); + } + + /** + * 给用户分配默认角色 + */ + private void assignRoleToUser(String userId) { SysUser user = new SysUser(); SysRole aDefault = roleMapper.selectOne(new LambdaQueryWrapper().eq(SysRole::getCustom1, "default")); String roleids = aDefault == null ? null : aDefault.getId(); user.setId(userId); userService.updateUserRoles(user, roleids); - // 加上角色权限 - return true; } /**