选择车队不一致修改

This commit is contained in:
秦鸿展
2026-01-19 15:32:00 +08:00
parent ff334b155c
commit 7f8732dd02
8 changed files with 127 additions and 118 deletions
@@ -86,6 +86,7 @@ public class RoleApplicationService {
// 先保存前端传递的 organizationId(如果存在)
Long frontendOrganizationId = roleDo.getOrganizationId();
log.info("角色查询 - 初始 roleDo.getOrganizationId(): {}", frontendOrganizationId);
// 获取登录用户信息
Long loginUserOrganizationId = null;
@@ -94,6 +95,12 @@ public class RoleApplicationService {
loginUserOrganizationId = userPo.getOrganizationId();
topOrganizationId = userPo.getTopOrganizationId();
}
log.info("角色查询 - 当前登录用户组织ID: {}", loginUserOrganizationId);
// 先保存前端传递的 organizationId(如果存在)
// 因为后续的 BeanUtils.copyProperties 可能会覆盖掉前端传递的值
Long savedFrontendOrganizationId = frontendOrganizationId;
log.info("角色查询 - 保存的前端 organizationId: {}", savedFrontendOrganizationId);
if (userPo.getUserAccountType() != null && userPo.getUserAccountType() == 5){
roleDo.setCreateBy(userPo.getCreateBy());
@@ -102,60 +109,62 @@ public class RoleApplicationService {
userDataPermissionQueryDTO.setPermissionMenuId(roleDo.getPermissionMenuId());
userDataPermissionQueryDTO = userDataPermissionApplicationService.getUserDataPermissionQueryDTO(userDataPermissionQueryDTO);
// 在复制属性之前,先保存前端传递的 organizationId(如果存在)
// 因为 BeanUtils.copyProperties 可能会覆盖掉前端传递的值
Long savedFrontendOrganizationId = frontendOrganizationId;
BeanUtils.copyProperties(userDataPermissionQueryDTO, roleDo, IgnoreNullUtil.getNullPropertyNames(userDataPermissionQueryDTO));
UserPo loginUserPo = loginUser.getUserPo();
// 重新获取前端传递的 organizationId(优先使用前端传递的值)
// 对于南光组织,如果前端传递了 organizationId,必须使用前端传递的值
Long currentFrontendOrganizationId = savedFrontendOrganizationId != null ? savedFrontendOrganizationId : roleDo.getOrganizationId();
// 数据权限:查询权限根据 organizationId 来设置,与其他模块保持一致
// organizationId等于2827时,为南光组织,查所有;其他组织查自己
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织(organizationId=2827):可以查询所有组织的数据
// 如果前端传递 organizationId(包括2827),使用前端传递的值进行过滤
// 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据
if (currentFrontendOrganizationId != null) {
// 前端传递了 organizationId包括2827或其他组织),使用前端传递的值进行过滤
roleDo.setOrganizationId(currentFrontendOrganizationId);
roleDo.setTopOrganizationId(null);
} else {
// 前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据
roleDo.setOrganizationId(null);
roleDo.setTopOrganizationId(null);
}
if (!Strings.isNullOrEmpty(loginUserPo.getRoleCode()) && RoleEnum.SUPER_ADMIN.getCode().equals(loginUserPo.getRoleCode())) {
//角色等级:0-无状态,1-内置角色,2-组织角色
//roleDo.setRoleGrade(1);
} else {
//roleDo.setRoleGrade(2);
}
log.info("角色查询 - BeanUtils.copyProperties 后 roleDo.getOrganizationId(): {}", roleDo.getOrganizationId());
}
UserPo loginUserPo = loginUser.getUserPo();
// 数据权限:查询权限根据 organizationId 来设置,与其他模块保持一致
// organizationId等于2827时,为南光组织,查所有;其他组织查自己
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织(organizationId=2827):可以查询所有组织的数据
// 如果前端传递了 organizationId 且不等于当前登录用户的组织ID,使用前端传递的值进行过滤
// 如果前端没有传递 organizationId,或者传递的值等于当前登录用户的组织ID,清空组织过滤条件,查询所有组织的数据
log.info("角色查询 - 南光组织,savedFrontendOrganizationId: {}", savedFrontendOrganizationId);
if (savedFrontendOrganizationId != null && !savedFrontendOrganizationId.equals(loginUserOrganizationId)) {
// 前端传递了其他组织的 organizationId不等于2827),使用前端传递的值进行过滤
log.info("角色查询 - 南光组织:使用前端传递的其他组织 organizationId: {}", savedFrontendOrganizationId);
roleDo.setOrganizationId(savedFrontendOrganizationId);
roleDo.setTopOrganizationId(null);
} else {
// 前端没有传递 organizationId,或者传递的值等于当前登录用户的组织ID(2827),
// 清空组织过滤条件,查询所有组织的数据
// 注意:这里必须清空 organizationId,不能使用 roleDo.getOrganizationId()
// 因为 roleDo.getOrganizationId() 可能被 BeanUtils.copyProperties 从其他地方复制过来
log.info("角色查询 - 南光组织:前端未传递 organizationId 或传递的值等于当前登录用户组织ID,清空组织过滤条件,查询所有组织的数据");
roleDo.setOrganizationId(null);
roleDo.setTopOrganizationId(null);
}
if (!Strings.isNullOrEmpty(loginUserPo.getRoleCode()) && RoleEnum.SUPER_ADMIN.getCode().equals(loginUserPo.getRoleCode())) {
//角色等级:0-无状态,1-内置角色,2-组织角色
//roleDo.setRoleGrade(1);
} else {
// 其他组织:设置organizationId,只查询当前组织的数据
// 其他组织只能查询自己组织的数据,不能查询其他组织的数据
if (currentFrontendOrganizationId != null) {
// 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致
if (!currentFrontendOrganizationId.equals(loginUserOrganizationId)) {
// 前端传递了其他组织的 organizationId,强制使用当前登录用户的组织ID,防止越权查询
log.warn("角色查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤",
currentFrontendOrganizationId, loginUserOrganizationId);
roleDo.setOrganizationId(loginUserOrganizationId);
} else {
// 前端传递的 organizationId 与当前登录用户的组织ID一致,使用前端传递的值
roleDo.setOrganizationId(currentFrontendOrganizationId);
}
roleDo.setTopOrganizationId(topOrganizationId);
} else {
// 前端没有传递 organizationId,使用当前登录用户的组织ID
roleDo.setOrganizationId(loginUserOrganizationId);
roleDo.setTopOrganizationId(topOrganizationId);
}
//roleDo.setRoleGrade(2);
}
} else {
// 其他组织:设置organizationId,只查询当前组织的数据
// 其他组织只能查询自己组织的数据,不能查询其他组织的数据
// 重新获取前端传递的 organizationId(优先使用前端传递的值)
Long currentFrontendOrganizationId = savedFrontendOrganizationId != null ? savedFrontendOrganizationId : roleDo.getOrganizationId();
if (currentFrontendOrganizationId != null) {
// 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致
if (!currentFrontendOrganizationId.equals(loginUserOrganizationId)) {
// 前端传递了其他组织的 organizationId,强制使用当前登录用户的组织ID,防止越权查询
log.warn("角色查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤",
currentFrontendOrganizationId, loginUserOrganizationId);
roleDo.setOrganizationId(loginUserOrganizationId);
} else {
// 前端传递的 organizationId 与当前登录用户的组织ID一致,使用前端传递的值
roleDo.setOrganizationId(currentFrontendOrganizationId);
}
roleDo.setTopOrganizationId(topOrganizationId);
} else {
// 前端没有传递 organizationId,使用当前登录用户的组织ID
roleDo.setOrganizationId(loginUserOrganizationId);
roleDo.setTopOrganizationId(topOrganizationId);
}
//roleDo.setRoleGrade(2);
}
return roleDomainService.selecRolePoList(roleDo);
}
@@ -167,7 +176,9 @@ public class RoleApplicationService {
*/
@DataPermissions(cacheName = "wlhyRole_createBy")
public List<RolePO> getUserRolelist(RoleDo roleDo) {//获取登录人信息
return roleDomainService.selecRolePoList(roleDo);
// 调用应用服务层的方法,包含数据权限控制逻辑
// 当前登录用户组织ID为2827时查询全部组织信息,其他组织只查自己
return selecRolePoList(roleDo);
}
public List<RolePO> queryList(RoleDo roleDo) {