From c5fad308499b0eb162a0f2cf25e81494aeff8af1 Mon Sep 17 00:00:00 2001 From: zhonghua Date: Thu, 2 Apr 2026 20:06:09 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2=E6=89=80=E5=B1=9E=E6=9C=BA?= =?UTF-8?q?=E6=9E=84=E5=AD=97=E6=AE=B5=E6=98=BE=E7=A4=BA=E5=8F=8A=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E8=BF=87=E6=BB=A4=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 前端所属机构字段改为使用后端返回的平铺 tenantName 字段 - users.ts: 添加 tenantName, tenantCode, tenantType, tenantIsSuper 平铺字段 - Index.vue: 表格列和详情 Drawer 使用 record.tenantName/detailData.tenantName 2. 后端修复机构用户 (org) 过滤逻辑 - SysUserServiceImpl: case "org" 分支增加 getOrgTenantIds() 调用,传递 orgTenantIdsFilter 参数 - SysUserMapper.xml: 增加 orgTenantIdsFilter 参数处理,使用 IN 查询过滤 3. 后端修复公众 (public) 和评委 (judge) 用户过滤逻辑 - 数据库中 public 租户的 tenant_type='platform',judge 租户的 tenant_type='other' - case "public"/"judge" 改为传递 tenantCodeFilter 参数,按租户 code 过滤 - SysUserMapper.xml: 增加 tenantCodeFilter 参数处理 Co-Authored-By: Claude Opus 4.6 --- .../sys/service/impl/SysUserServiceImpl.java | 31 ++++++++++++++++--- .../resources/mapper/sys/SysUserMapper.xml | 11 +++++++ .../super-admin/unified-user-management.md | 29 +++++++++++++++++ frontend/src/api/users.ts | 6 ++++ frontend/src/views/system/users/Index.vue | 4 +-- 5 files changed, 75 insertions(+), 6 deletions(-) diff --git a/backend-java/src/main/java/com/competition/modules/sys/service/impl/SysUserServiceImpl.java b/backend-java/src/main/java/com/competition/modules/sys/service/impl/SysUserServiceImpl.java index 1eb4733..21e3388 100644 --- a/backend-java/src/main/java/com/competition/modules/sys/service/impl/SysUserServiceImpl.java +++ b/backend-java/src/main/java/com/competition/modules/sys/service/impl/SysUserServiceImpl.java @@ -96,11 +96,22 @@ public class SysUserServiceImpl extends ServiceImpl impl switch (userType) { case "platform" -> params.put("isSuperTenantFilter", 1); case "org" -> { - // 排除超管、公众、评委租户 - // 此逻辑较复杂,通过 filterTenantId 或 tenantType 筛选 + // 排除超管、公众、评委租户,使用 org 租户 ID 列表过滤 + List orgTenantIds = getOrgTenantIds(); + if (orgTenantIds.isEmpty()) { + // 如果没有机构租户,返回空结果 + return new PageResult<>(List.of(), 0L, page, pageSize); + } + params.put("orgTenantIdsFilter", orgTenantIds); + } + case "judge" -> { + // 按租户 code='judge' 过滤(因为 judge 租户的 tenant_type 可能是 other) + params.put("tenantCodeFilter", "judge"); + } + case "public" -> { + // 按租户 code='public' 过滤(因为 public 租户的 tenant_type=platform,不是 public) + params.put("tenantCodeFilter", "public"); } - case "judge" -> params.put("tenantTypeFilter", "judge_pool"); - case "public" -> params.put("tenantTypeFilter", "public"); } } if (filterTenantId != null) { @@ -127,6 +138,18 @@ public class SysUserServiceImpl extends ServiceImpl impl return PageResult.from(result); } + /** + * 获取机构租户 ID 列表(排除超管、公众、评委) + */ + private List getOrgTenantIds() { + List tenants = tenantMapper.selectList( + new LambdaQueryWrapper().eq(SysTenant::getValidState, 1)); + return tenants.stream() + .filter(t -> t.getIsSuper() == 0 && !"public".equals(t.getCode()) && !"judge".equals(t.getCode())) + .map(SysTenant::getId) + .toList(); + } + @Override public Map getStats() { List tenants = tenantMapper.selectList( diff --git a/backend-java/src/main/resources/mapper/sys/SysUserMapper.xml b/backend-java/src/main/resources/mapper/sys/SysUserMapper.xml index b7a726d..35b4335 100644 --- a/backend-java/src/main/resources/mapper/sys/SysUserMapper.xml +++ b/backend-java/src/main/resources/mapper/sys/SysUserMapper.xml @@ -51,6 +51,17 @@ AND u.tenant_id = #{params.filterTenantId} + + + AND u.tenant_id IN + + #{tenantId} + + + + + AND t.code = #{params.tenantCodeFilter} + AND t.tenant_type = #{params.tenantTypeFilter} diff --git a/docs/design/super-admin/unified-user-management.md b/docs/design/super-admin/unified-user-management.md index 5bacfd7..2d5be19 100644 --- a/docs/design/super-admin/unified-user-management.md +++ b/docs/design/super-admin/unified-user-management.md @@ -308,3 +308,32 @@ public → tenant.code = 'public' **验证结果:** - 后端重启成功,编译无错误 - 前端 HMR 热更新生效,无新增 TS 错误 + +### 2026-04-02 — 机构用户过滤逻辑修复 + +**问题:** +- 前端点击"机构"统计卡片时,后端 `findAll(userType=org)` 返回 0 条数据,与统计接口返回不一致 +- 原因:`case "org"` 分支没有设置任何过滤参数,Mapper XML 中也没有对应的处理逻辑 + +**改动(2 个文件):** +- `backend/.../SysUserServiceImpl.java` — `findAll()` 方法:`case "org"` 分支增加调用 `getOrgTenantIds()` 获取机构租户 ID 列表,传递 `orgTenantIdsFilter` 参数;新增 `getOrgTenantIds()` 私有方法 +- `backend/.../SysUserMapper.xml` — `selectUserPage` 增加 `` 条件,使用 `` 遍历 ID 列表进行 `IN` 查询 + +**验证结果:** +- 后端编译成功,Maven 编译无错误 +- 机构用户列表查询应正确排除超管、公众、评委租户 + +### 2026-04-02 — 公众/评委用户过滤逻辑修复 + +**问题:** +- 前端点击"公众"卡片时,传递 `userType=public`,但返回空数据(统计显示 9 条) +- 原因:后端 `case "public"` 按 `tenant_type = 'public'` 过滤,但数据库中 public 租户的 `tenant_type = 'platform'`(不是 `'public'`) +- 同理,`case "judge"` 按 `tenant_type = 'judge_pool'` 过滤,但 judge 租户的 `tenant_type = 'other'` + +**改动(2 个文件):** +- `backend/.../SysUserServiceImpl.java` — `findAll()` 方法:`case "public"` 和 `case "judge"` 改为传递 `tenantCodeFilter` 参数(值分别为 `"public"` 和 `"judge"`),按租户 code 过滤而非 tenant_type +- `backend/.../SysUserMapper.xml` — `selectUserPage` 增加 `` 条件,使用 `t.code = #{params.tenantCodeFilter}` 过滤 + +**验证结果:** +- 后端编译成功 +- 公众/评委用户列表查询应按租户 code 正确过滤 diff --git a/frontend/src/api/users.ts b/frontend/src/api/users.ts index a74dcdf..161101e 100644 --- a/frontend/src/api/users.ts +++ b/frontend/src/api/users.ts @@ -38,6 +38,12 @@ export interface User { modifier?: number; createTime?: string; modifyTime?: string; + // 平铺的租户字段(后端直接返回) + tenantName?: string; + tenantCode?: string; + tenantType?: string; + tenantIsSuper?: number; + // 兼容嵌套对象(详情接口可能返回) tenant?: UserTenant; roles?: Array<{ id: number; diff --git a/frontend/src/views/system/users/Index.vue b/frontend/src/views/system/users/Index.vue index 2e68d3e..04396fd 100644 --- a/frontend/src/views/system/users/Index.vue +++ b/frontend/src/views/system/users/Index.vue @@ -84,7 +84,7 @@