修复排序bug

This commit is contained in:
chenxing
2026-08-13 08:15:03 +08:00
parent 3855ea2eca
commit 8113045471
2 changed files with 32 additions and 7 deletions
@@ -61,4 +61,26 @@ public interface SysUserRepository extends JpaRepository<SysUser, Integer>, JpaS
@Param("name") String name,
@Param("disabled") Integer disabled,
Pageable pageable);
/**
* 组上下文导出专用(原生 SQL,非分页):INNER JOIN 关联表后按 user_id 聚合,
* 仅返回「属于指定组范围」的用户(无组归属的用户天然被排除);超管(type=1)豁免
* (type 为 NULL 视为非超管,一并保留)。入参 name 为可空:为空时跳过关键字过滤。
* 排序按 user_id 升序,保证导出结果稳定。
*/
@Query(value =
"SELECT u.id " +
"FROM sys_user u " +
"INNER JOIN sys_user_group_rel r ON r.user_id = u.id " +
"WHERE r.group_id IN (:groupIds) " +
" AND (:name IS NULL OR u.username LIKE CONCAT('%', :name, '%') " +
" OR u.real_name LIKE CONCAT('%', :name, '%') " +
" OR u.idcard LIKE CONCAT('%', :name, '%') " +
" OR u.phone = :name) " +
" AND (u.type IS NULL OR u.type != 1) " +
"GROUP BY u.id " +
"ORDER BY u.id ASC",
nativeQuery = true)
List<Integer> findGroupUserIds(@Param("groupIds") List<Integer> groupIds,
@Param("name") String name);
}
@@ -500,15 +500,18 @@ public class SysUserService implements ISysUserService {
*/
@Override
public void exportUsers(Integer groupId, Integer withSub, String name, HttpServletResponse response) throws IOException {
// 1. 解析组范围(含子孙)并查询范围内全部用户(不分页)
SysUserQuery query = new SysUserQuery();
query.setGroupId(groupId);
query.setWithSub(withSub);
query.setName(name);
List<SysUser> users = sysUserRepository.findAll(buildSpecification(query));
// 1. 解析组范围(含子孙),复用与列表一致的 INNER JOIN 原生 SQL 取范围内用户(含超管豁免),不分页。
// 无组归属的用户被 INNER JOIN 天然排除;type=1 超管在 SQL 中显式豁免,永不导出。
List<Integer> groupIds = resolveGroupIds(groupId, withSub);
String nameKey = StringUtils.isNotBlank(name) ? name.trim() : null;
List<Integer> userIds = sysUserRepository.findGroupUserIds(groupIds, nameKey);
List<SysUser> users = userIds.isEmpty()
? Collections.emptyList()
: sysUserRepository.findAllById(userIds).stream()
.sorted(Comparator.comparing(SysUser::getId))
.collect(Collectors.toList());
// 2. 批量取每个用户的主组(isMain=1),用于填充「组名 / 组id」参考列
List<Integer> userIds = users.stream().map(SysUser::getId).collect(Collectors.toList());
Map<Integer, Integer> userMainGroup = resolveUserMainGroup(userIds);
// 3. 批量取组名