feat(system): 分页查询用户关联业务租户

This commit is contained in:
huk 2025-09-08 17:12:28 +08:00
parent e3dfb9b98f
commit 2e468d0ebc
6 changed files with 61 additions and 40 deletions

View File

@ -2,14 +2,18 @@ package org.dromara.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.annotation.SaMode;
import cn.dev33.satoken.secure.BCrypt;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.constant.TenantConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.enums.TenantType;
@ -303,7 +307,7 @@ public class SysUserController extends BaseController {
/**
* 保存用户关联业务租户
*/
@SaCheckPermission("system:user:tenant")
@SaCheckPermission(value = "system:user:tenant", mode = SaMode.OR, orRole = TenantConstants.TENANT_ADMIN_ROLE_KEY)
@Log(title = "保存用户关联业务租户", businessType = BusinessType.INSERT)
@PostMapping("/tenant")
public R<Void> saveUserTenant(@Validated @RequestBody SysUserTenantBO userTenantBO) {
@ -312,14 +316,15 @@ public class SysUserController extends BaseController {
}
/**
* 查询用户关联业务的指定类型租户
* 分页查询用户关联业务的指定类型租户
* @param userId 用户id
* @param type 租户类型 {@link TenantType}
* @param pageQuery
*
*/
@GetMapping("/tenantList/{userId}/{type}")
public R<List<SysUserTenantVO>> getUserTenantList(@PathVariable("userId") Long userId, @PathVariable("type") int type) {
return R.ok(userTenantService.getUserTenantList(userId, type));
public R<Page<SysUserTenantVO>> getUserTenantList(@PathVariable("userId") Long userId, @PathVariable("type") int type, PageQuery pageQuery) {
return R.ok(userTenantService.getUserTenantList(userId, type, pageQuery));
}
}

View File

@ -1,13 +1,13 @@
package org.dromara.system.domain.bo;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ -22,7 +22,5 @@ public class SysUserTenantBO {
/**
* 租户id
*/
@Size(max = 255,message = "租户id最大长度要小于 255")
@NotBlank(message = "租户id不能为空")
private String tenantId;
private List<String> tenantIds;
}

View File

@ -12,11 +12,6 @@ import lombok.NoArgsConstructor;
@Builder
public class SysUserTenantVO {
/**
* 用户ID
*/
private Long userId;
/**
* 租户id
*/
@ -26,4 +21,9 @@ public class SysUserTenantVO {
* 租户名称
*/
private String tenantName;
/**
* 是否已关联该租户
*/
private boolean has;
}

View File

@ -91,5 +91,5 @@ public interface SysTenantMapper extends BaseMapperPlus<SysTenant, SysTenantVo>
"AND status = 0 " +
"AND del_flag = '0'" +
"</script>")
List<SysTenant> selectByTenantTypeAndCreateDept(@Param("tenantType") int tenantType, @Param("deptIdList") List<Long> deptIdList);
Page<SysTenant> selectByTenantTypeAndCreateDept(@Param("page") Page<SysTenant> page, @Param("tenantType") int tenantType, @Param("deptIdList") List<Long> deptIdList);
}

View File

@ -1,5 +1,7 @@
package org.dromara.system.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.system.domain.SysUserTenant;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.system.domain.bo.SysUserTenantBO;
@ -12,5 +14,5 @@ public interface ISysUserTenantService extends IService<SysUserTenant>{
void save(SysUserTenantBO userTenantBO);
List<SysUserTenantVO> getUserTenantList(Long userId, int type);
Page<SysUserTenantVO> getUserTenantList(Long userId, int type, PageQuery pageQuery);
}

View File

@ -1,25 +1,29 @@
package org.dromara.system.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.enums.TenantType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.SysDept;
import org.dromara.system.domain.SysTenant;
import org.dromara.system.domain.bo.SysUserTenantBO;
import org.dromara.system.domain.vo.SysUserTenantVO;
import org.dromara.system.mapper.SysDeptMapper;
import org.dromara.system.mapper.SysTenantMapper;
import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.service.ISysUserService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.dromara.system.domain.SysUserTenant;
import org.dromara.system.mapper.SysUserTenantMapper;
import org.dromara.system.service.ISysUserTenantService;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
@ -31,27 +35,39 @@ public class SysUserTenantServiceImpl extends ServiceImpl<SysUserTenantMapper, S
@Override
public void save(SysUserTenantBO userTenantBO) {
this.save(SysUserTenant.builder().userId(userTenantBO.getUserId()).tenantId(userTenantBO.getTenantId()).build());
List<String> tenantIds = userTenantBO.getTenantIds();
if(CollUtil.isEmpty(tenantIds)){
this.remove(Wrappers.lambdaQuery(SysUserTenant.class).eq(SysUserTenant::getUserId, userTenantBO.getUserId()));
}else{
List<SysUserTenant> list = tenantIds.stream().map(tenantId -> SysUserTenant.builder().userId(userTenantBO.getUserId()).tenantId(tenantId).build())
.toList();
this.saveBatch(list);
}
}
@Override
public List<SysUserTenantVO> getUserTenantList(Long userId, int type) {
// 租户管理员可查当前租户下所有部门创建的指定类型租户
if (LoginHelper.isTenantAdmin()) {
ArrayList<Long> deptIdList = CollUtil.newArrayList(LoginHelper.getDeptId());
Optional.ofNullable(sysDeptMapper.selectListByParentId(LoginHelper.getDeptId()))
.ifPresent(sysDepts -> {
List<Long> list = sysDepts.stream()
.map(SysDept::getDeptId)
.filter(Objects::nonNull)
.toList();
deptIdList.addAll(list);
});
List<SysTenant> sysTenants = sysTenantMapper.selectByTenantTypeAndCreateDept(type, deptIdList);
return sysTenants.stream().map(
sysTenant -> SysUserTenantVO.builder().userId(userId).tenantId(sysTenant.getTenantId()).tenantName(sysTenant.getStoreName()).build()
).toList();
}
return baseMapper.getUserTenantList(userId, type);
public Page<SysUserTenantVO> getUserTenantList(Long userId, int type, PageQuery pageQuery) {
List<Long> deptIdList = sysDeptMapper.selectList().stream().map(SysDept::getDeptId).toList();
// 获取当前登录用户所属租户创建的指定类型租户
Page<SysTenant> tenantPage = sysTenantMapper.selectByTenantTypeAndCreateDept(pageQuery.build(), type, deptIdList);
// 转换为SysUserTenantVO分页数据
List<SysTenant> records = tenantPage.getRecords();
List<String> tenantIds = records.stream().map(SysTenant::getTenantId).toList();
// 获取指定用户关联的租户
Map<String, SysUserTenant> userTenantMap = baseMapper.selectList(new LambdaQueryWrapper<SysUserTenant>()
.eq(SysUserTenant::getUserId, userId)
.in(SysUserTenant::getTenantId, tenantIds)
).stream().collect(Collectors.toMap(SysUserTenant::getTenantId, o -> o));
List<SysUserTenantVO> userTenantVOList = records.stream()
.map(sysTenant -> SysUserTenantVO.builder()
.tenantId(sysTenant.getTenantId())
.tenantName(sysTenant.getStoreName())
.has((LoginHelper.isTenantAdmin() && userId.equals(LoginHelper.getUserId())) || userTenantMap.containsKey(sysTenant.getTenantId()))
.build())
.toList();
// 构建新的分页结果
Page<SysUserTenantVO> resultPage = new Page<>(tenantPage.getCurrent(), tenantPage.getSize(), tenantPage.getTotal());
resultPage.setRecords(userTenantVOList);
return resultPage;
}
}