数据权限的bug修改260113

This commit is contained in:
1745237360-cloud
2026-01-13 11:32:57 +08:00
parent 935c154136
commit 035593b419
5 changed files with 34 additions and 9 deletions
@@ -58,21 +58,35 @@ public class ExpenseAccountApplicationService {
setDataPermission(expenseAccountDO);
// 处理 createByName 和 updateByName 字段:
// 问题:ExpenseAccountAssembler 在查询场景下会自动设置 createByName 和 updateByName 为当前登录用户名
// 问题:ExpenseAccountAssembler 在查询场景下可能会自动设置 createByName 和 updateByName 为当前登录用户名
// 这会导致 SQL 中添加 create_by_name LIKE '%nanguang%' 和 update_by_name LIKE '%nanguang%' 条件
// 解决方案:
// 1. 如果查询所有组织(organizationId 和 topOrganizationId 都为 null),清空这些字段
// 1. 如果查询所有组织(organizationId 和 topOrganizationId 都为 null),清空这些字段(除非前端明确传递了这些字段作为查询条件)
// 2. 如果查询指定组织(organizationId 不为 null),且是南光组织查询,如果 createByName 或 updateByName 等于当前登录用户名,清空它们
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId();
String currentUserName = loginUser.getUsername();
// 先保存前端传递的 createByName 和 updateByName(用于判断是否是前端传递的查询条件)
String frontendCreateByName = expenseAccountDO.getCreateByName();
String frontendUpdateByName = expenseAccountDO.getUpdateByName();
if (expenseAccountDO.getOrganizationId() == null && expenseAccountDO.getTopOrganizationId() == null) {
// 查询所有组织的数据时,不应该通过创建者或更新者来过滤,清空这些字段
log.info("查询所有组织数据,清空 createByName 和 updateByName 过滤条件,避免限制查询结果");
expenseAccountDO.setCreateByName(null);
expenseAccountDO.setUpdateByName(null);
// 除非前端明确传递了这些字段作为查询条件
if (frontendCreateByName == null || frontendCreateByName.isEmpty() ||
(currentUserName != null && frontendCreateByName.equals(currentUserName))) {
// 前端未传递,或者等于当前登录用户名(可能是 Assembler 自动设置的),清空
log.info("查询所有组织数据,清空 createByName 过滤条件(前端未传递或由 Assembler 自动设置)");
expenseAccountDO.setCreateByName(null);
}
if (frontendUpdateByName == null || frontendUpdateByName.isEmpty() ||
(currentUserName != null && frontendUpdateByName.equals(currentUserName))) {
// 前端未传递,或者等于当前登录用户名(可能是 Assembler 自动设置的),清空
log.info("查询所有组织数据,清空 updateByName 过滤条件(前端未传递或由 Assembler 自动设置)");
expenseAccountDO.setUpdateByName(null);
}
} else if (expenseAccountDO.getOrganizationId() != null && loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织查询指定组织时,如果 createByName 或 updateByName 等于当前登录用户名,说明可能是 Assembler 自动设置的
// 清空这些字段,避免限制查询结果(因为其他组织的数据可能不是当前登录用户创建的)
@@ -102,7 +102,7 @@
WHERE
a.del_flag = 1
<include refid="common_where"/>
order by a.account_type,service_items_code,upper_subject_code,show_seq
order by a.update_time DESC
</select>
<select id="selectCostSubject" parameterType="com.mhd.basic.domain.expenseAccount.repository.todo.ExpenseAccountDO"
resultType="com.mhd.basic.domain.expenseAccount.repository.po.ExpenseAccountPO">