查询优化
parent
d88a9ca74a
commit
7e06b0f6fd
|
|
@ -5,44 +5,22 @@ import io.swagger.v3.oas.annotations.media.Schema;
|
|||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
import static com.fjrcloud.community.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
/**
|
||||
* 管理后台 - 会员用户分页 Request VO
|
||||
*
|
||||
* @author 福建融云
|
||||
*/
|
||||
@Schema(description = "管理后台 - 会员用户分页 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MemberUserPageReqVO extends PageParam {
|
||||
|
||||
/**
|
||||
* 手机号(模糊查询)
|
||||
*/
|
||||
@Schema(description = "手机号", example = "15601691300")
|
||||
private String mobile;
|
||||
|
||||
@Schema(description = "用户昵称", example = "李四")
|
||||
private String nickname;
|
||||
|
||||
@Schema(description = "最后登录时间")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime[] loginDate;
|
||||
|
||||
@Schema(description = "创建时间")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime[] createTime;
|
||||
|
||||
@Schema(description = "会员标签编号列表", example = "[1, 2]")
|
||||
private List<Long> tagIds;
|
||||
|
||||
@Schema(description = "会员等级编号", example = "1")
|
||||
private Long levelId;
|
||||
|
||||
@Schema(description = "用户分组编号", example = "1")
|
||||
private Long groupId;
|
||||
|
||||
// TODO 芋艿:注册用户类型;
|
||||
|
||||
// TODO 芋艿:登录用户类型;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,17 +2,16 @@ package com.fjrcloud.community.module.member.dal.mysql.user;
|
|||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.fjrcloud.community.framework.common.pojo.PageResult;
|
||||
import com.fjrcloud.community.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import com.fjrcloud.community.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import com.fjrcloud.community.module.member.controller.admin.user.vo.MemberUserPageReqVO;
|
||||
import com.fjrcloud.community.module.member.dal.dataobject.user.MemberUserDO;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 会员 User Mapper
|
||||
|
|
@ -22,43 +21,114 @@ import java.util.stream.Collectors;
|
|||
@Mapper
|
||||
public interface MemberUserMapper extends BaseMapperX<MemberUserDO> {
|
||||
|
||||
/**
|
||||
* 根据手机号查询会员用户
|
||||
*
|
||||
* @param mobile 手机号
|
||||
* @return 会员用户
|
||||
*/
|
||||
default MemberUserDO selectByMobile(String mobile) {
|
||||
return selectOne(MemberUserDO::getMobile, mobile);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据昵称模糊查询会员用户列表
|
||||
*
|
||||
* @param nickname 昵称
|
||||
* @return 会员用户列表
|
||||
*/
|
||||
default List<MemberUserDO> selectListByNicknameLike(String nickname) {
|
||||
return selectList(new LambdaQueryWrapperX<MemberUserDO>()
|
||||
.likeIfPresent(MemberUserDO::getNickname, nickname));
|
||||
}
|
||||
|
||||
default PageResult<MemberUserDO> selectPage(MemberUserPageReqVO reqVO) {
|
||||
// 处理 tagIds 过滤条件
|
||||
String tagIdSql = "";
|
||||
if (CollUtil.isNotEmpty(reqVO.getTagIds())) {
|
||||
tagIdSql = reqVO.getTagIds().stream()
|
||||
.map(tagId -> "FIND_IN_SET(" + tagId + ", tag_ids)")
|
||||
.collect(Collectors.joining(" OR "));
|
||||
}
|
||||
// 分页查询
|
||||
/**
|
||||
* 根据租户ID分页查询会员(联表查询)
|
||||
*
|
||||
* @param reqVO 分页条件
|
||||
* @param tenantId 租户ID
|
||||
* @return 分页结果
|
||||
*/
|
||||
default PageResult<MemberUserDO> selectPageByTenantId(MemberUserPageReqVO reqVO, Long tenantId) {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<MemberUserDO>()
|
||||
.likeIfPresent(MemberUserDO::getMobile, reqVO.getMobile())
|
||||
.betweenIfPresent(MemberUserDO::getLoginDate, reqVO.getLoginDate())
|
||||
.likeIfPresent(MemberUserDO::getNickname, reqVO.getNickname())
|
||||
.betweenIfPresent(MemberUserDO::getCreateTime, reqVO.getCreateTime())
|
||||
.eqIfPresent(MemberUserDO::getLevelId, reqVO.getLevelId())
|
||||
.eqIfPresent(MemberUserDO::getGroupId, reqVO.getGroupId())
|
||||
.apply(StrUtil.isNotEmpty(tagIdSql), tagIdSql)
|
||||
// 使用 EXISTS 子查询关联会员-租户关系表
|
||||
.apply("EXISTS (SELECT 1 FROM member_user_tenant_rel rel WHERE rel.user_id = member_user.id AND rel.tenant_id = {0})", tenantId)
|
||||
.orderByDesc(MemberUserDO::getId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询会员用户
|
||||
*
|
||||
* @param reqVO 分页条件
|
||||
* @return 分页结果
|
||||
*/
|
||||
default PageResult<MemberUserDO> selectPage(MemberUserPageReqVO reqVO) {
|
||||
return selectPage(reqVO, buildQueryWrapper(reqVO, null));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户ID列表分页查询会员
|
||||
*
|
||||
* @param reqVO 分页条件
|
||||
* @param userIds 用户ID列表
|
||||
* @return 分页结果
|
||||
*/
|
||||
default PageResult<MemberUserDO> selectPageByUserIds(MemberUserPageReqVO reqVO, Collection<Long> userIds) {
|
||||
// 如果用户ID列表为空,返回空结果
|
||||
if (CollUtil.isEmpty(userIds)) {
|
||||
return PageResult.empty();
|
||||
}
|
||||
|
||||
// 去重,避免生成冗余的 IN 语句
|
||||
List<Long> distinctUserIds = CollUtil.distinct(userIds);
|
||||
if (CollUtil.isEmpty(distinctUserIds)) {
|
||||
return PageResult.empty();
|
||||
}
|
||||
|
||||
return selectPage(reqVO, buildQueryWrapper(reqVO, distinctUserIds));
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建查询条件
|
||||
*
|
||||
* @param reqVO 分页条件
|
||||
* @param userIds 用户ID列表(可为空)
|
||||
* @return 查询条件
|
||||
*/
|
||||
default LambdaQueryWrapperX<MemberUserDO> buildQueryWrapper(MemberUserPageReqVO reqVO, Collection<Long> userIds) {
|
||||
return new LambdaQueryWrapperX<MemberUserDO>()
|
||||
.likeIfPresent(MemberUserDO::getMobile, reqVO.getMobile())
|
||||
.inIfPresent(MemberUserDO::getId, userIds)
|
||||
.orderByDesc(MemberUserDO::getId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户分组ID统计用户数量
|
||||
*
|
||||
* @param groupId 用户分组ID
|
||||
* @return 用户数量
|
||||
*/
|
||||
default Long selectCountByGroupId(Long groupId) {
|
||||
return selectCount(MemberUserDO::getGroupId, groupId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户等级ID统计用户数量
|
||||
*
|
||||
* @param levelId 用户等级ID
|
||||
* @return 用户数量
|
||||
*/
|
||||
default Long selectCountByLevelId(Long levelId) {
|
||||
return selectCount(MemberUserDO::getLevelId, levelId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据标签ID统计用户数量
|
||||
*
|
||||
* @param tagId 标签ID
|
||||
* @return 用户数量
|
||||
*/
|
||||
default Long selectCountByTagId(Long tagId) {
|
||||
return selectCount(new LambdaQueryWrapperX<MemberUserDO>()
|
||||
.apply("FIND_IN_SET({0}, tag_ids)", tagId));
|
||||
|
|
|
|||
|
|
@ -25,6 +25,16 @@ public interface MemberUserTenantRelMapper extends BaseMapperX<MemberUserTenantR
|
|||
return selectList(MemberUserTenantRelDO::getUserId, userId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据租户ID查询关联列表
|
||||
*
|
||||
* @param tenantId 租户ID
|
||||
* @return 关联列表
|
||||
*/
|
||||
default List<MemberUserTenantRelDO> selectListByTenantId(Long tenantId) {
|
||||
return selectList(MemberUserTenantRelDO::getTenantId, tenantId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户ID和租户ID查询关联关系
|
||||
*
|
||||
|
|
|
|||
|
|
@ -3,11 +3,15 @@ package com.fjrcloud.community.module.member.service.user;
|
|||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.collection.ListUtil;
|
||||
import cn.hutool.core.lang.Assert;
|
||||
import cn.hutool.core.util.*;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.fjrcloud.community.framework.common.enums.CommonStatusEnum;
|
||||
import com.fjrcloud.community.framework.common.enums.UserTypeEnum;
|
||||
import com.fjrcloud.community.framework.common.pojo.PageResult;
|
||||
import com.fjrcloud.community.framework.common.util.object.BeanUtils;
|
||||
import com.fjrcloud.community.framework.tenant.core.context.TenantContextHolder;
|
||||
import com.fjrcloud.community.module.member.controller.admin.user.vo.MemberUserPageReqVO;
|
||||
import com.fjrcloud.community.module.member.controller.admin.user.vo.MemberUserUpdateReqVO;
|
||||
import com.fjrcloud.community.module.member.controller.app.user.vo.*;
|
||||
|
|
@ -37,6 +41,7 @@ import java.util.List;
|
|||
|
||||
import static com.fjrcloud.community.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static com.fjrcloud.community.framework.common.util.servlet.ServletUtils.getClientIP;
|
||||
import static com.fjrcloud.community.framework.tenant.core.security.TenantSecurityWebFilter.SYSTEM_TENANT_ID;
|
||||
import static com.fjrcloud.community.module.member.enums.ErrorCodeConstants.*;
|
||||
|
||||
/**
|
||||
|
|
@ -64,6 +69,9 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
@Resource
|
||||
private MemberUserProducer memberUserProducer;
|
||||
|
||||
@Resource
|
||||
private MemberUserTenantRelService userTenantRelService;
|
||||
|
||||
@Override
|
||||
public MemberUserDO getUserByMobile(String mobile) {
|
||||
return memberUserMapper.selectByMobile(mobile);
|
||||
|
|
@ -77,7 +85,7 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public MemberUserDO createUserIfAbsent(String mobile, String registerIp, Integer terminal) {
|
||||
// 用户已经存在
|
||||
// 用户已经存在,直接返回
|
||||
MemberUserDO user = memberUserMapper.selectByMobile(mobile);
|
||||
if (user != null) {
|
||||
return user;
|
||||
|
|
@ -92,37 +100,51 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
return createUser(null, nickname, avtar, registerIp, terminal);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建会员用户
|
||||
*
|
||||
* @param mobile 手机号
|
||||
* @param nickname 昵称
|
||||
* @param avtar 头像
|
||||
* @param registerIp 注册IP
|
||||
* @param terminal 终端类型
|
||||
* @return 会员用户
|
||||
*/
|
||||
private MemberUserDO createUser(String mobile, String nickname, String avtar,
|
||||
String registerIp, Integer terminal) {
|
||||
// 生成密码
|
||||
// 生成随机密码
|
||||
String password = IdUtil.fastSimpleUUID();
|
||||
// 插入用户
|
||||
|
||||
// 构建用户对象
|
||||
MemberUserDO user = new MemberUserDO();
|
||||
user.setMobile(mobile);
|
||||
user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启
|
||||
user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启状态
|
||||
user.setPassword(encodePassword(password)); // 加密密码
|
||||
user.setRegisterIp(registerIp).setRegisterTerminal(terminal);
|
||||
user.setNickname(nickname).setAvatar(avtar); // 基础信息
|
||||
|
||||
// 昵称为空时,生成随机昵称
|
||||
if (StrUtil.isEmpty(nickname)) {
|
||||
// 昵称为空时,随机一个名字,避免一些依赖 nickname 的逻辑报错,或者有点丑。例如说,短信发送有昵称时~
|
||||
user.setNickname("用户" + RandomUtil.randomNumbers(6));
|
||||
}
|
||||
|
||||
// 插入数据库
|
||||
memberUserMapper.insert(user);
|
||||
|
||||
// 发送 MQ 消息:用户创建
|
||||
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
|
||||
|
||||
@Override
|
||||
public void afterCommit() {
|
||||
memberUserProducer.sendUserCreateMessage(user.getId());
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
return user;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserLogin(Long id, String loginIp) {
|
||||
// 更新最后登录IP和时间
|
||||
memberUserMapper.updateById(new MemberUserDO().setId(id)
|
||||
.setLoginIp(loginIp).setLoginDate(LocalDateTime.now()));
|
||||
}
|
||||
|
|
@ -155,11 +177,11 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
validateMobileUnique(null, reqVO.getMobile());
|
||||
|
||||
// 2.1 校验旧手机和旧验证码
|
||||
// 补充说明:从安全性来说,老手机也校验 oldCode 验证码会更安全。但是由于 uni-app 商城界面暂时没做,所以这里不强制校验
|
||||
if (StrUtil.isNotEmpty(reqVO.getOldCode())) {
|
||||
smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(user.getMobile()).setCode(reqVO.getOldCode())
|
||||
.setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()).setUsedIp(getClientIP()));
|
||||
}
|
||||
|
||||
// 2.2 使用新验证码
|
||||
smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(reqVO.getMobile()).setCode(reqVO.getCode())
|
||||
.setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()).setUsedIp(getClientIP()));
|
||||
|
|
@ -174,6 +196,7 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
SocialWxPhoneNumberInfoRespDTO phoneNumberInfo = socialClientApi.getWxMaPhoneNumberInfo(
|
||||
UserTypeEnum.MEMBER.getValue(), reqVO.getCode());
|
||||
Assert.notNull(phoneNumberInfo, "获得手机信息失败,结果为空");
|
||||
|
||||
// 1.2 校验新手机是否已经被绑定
|
||||
validateMobileUnique(userId, phoneNumberInfo.getPhoneNumber());
|
||||
|
||||
|
|
@ -185,6 +208,7 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
public void updateUserPassword(Long userId, AppMemberUserUpdatePasswordReqVO reqVO) {
|
||||
// 检测用户是否存在
|
||||
MemberUserDO user = validateUserExists(userId);
|
||||
|
||||
// 校验验证码
|
||||
smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(user.getMobile()).setCode(reqVO.getCode())
|
||||
.setScene(SmsSceneEnum.MEMBER_UPDATE_PASSWORD.getScene()).setUsedIp(getClientIP()));
|
||||
|
|
@ -208,6 +232,12 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
.password(passwordEncoder.encode(reqVO.getPassword())).build());
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据手机号验证用户是否存在
|
||||
*
|
||||
* @param mobile 手机号
|
||||
* @return 用户对象
|
||||
*/
|
||||
private MemberUserDO validateUserExists(String mobile) {
|
||||
MemberUserDO user = memberUserMapper.selectByMobile(mobile);
|
||||
if (user == null) {
|
||||
|
|
@ -234,12 +264,12 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void updateUser(MemberUserUpdateReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
// 校验用户存在
|
||||
validateUserExists(updateReqVO.getId());
|
||||
// 校验手机唯一
|
||||
validateMobileUnique(updateReqVO.getId(), updateReqVO.getMobile());
|
||||
|
||||
// 更新
|
||||
// 更新用户信息
|
||||
MemberUserDO updateObj = MemberUserConvert.INSTANCE.convert(updateReqVO);
|
||||
memberUserMapper.updateById(updateObj);
|
||||
}
|
||||
|
|
@ -261,14 +291,18 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
if (StrUtil.isBlank(mobile)) {
|
||||
return;
|
||||
}
|
||||
|
||||
MemberUserDO user = memberUserMapper.selectByMobile(mobile);
|
||||
if (user == null) {
|
||||
return;
|
||||
}
|
||||
// 如果 id 为空,说明不用比较是否为相同 id 的用户
|
||||
|
||||
// 如果 id 为空,说明是新增场景,手机号已被使用
|
||||
if (id == null) {
|
||||
throw exception(USER_MOBILE_USED, mobile);
|
||||
}
|
||||
|
||||
// 如果 id 不为空,检查是否为同一用户
|
||||
if (!user.getId().equals(id)) {
|
||||
throw exception(USER_MOBILE_USED, mobile);
|
||||
}
|
||||
|
|
@ -276,12 +310,27 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
|
||||
@Override
|
||||
public PageResult<MemberUserDO> getUserPage(MemberUserPageReqVO pageReqVO) {
|
||||
return memberUserMapper.selectPage(pageReqVO);
|
||||
// 获取当前租户ID
|
||||
Long currentTenantId = TenantContextHolder.getTenantId();
|
||||
|
||||
// 如果是系统租户,直接查询所有会员
|
||||
if (SYSTEM_TENANT_ID.equals(currentTenantId)) {
|
||||
return memberUserMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
// 校验租户ID有效性
|
||||
if (currentTenantId == null) {
|
||||
log.warn("[getUserPage][当前租户ID为空,返回空结果]");
|
||||
return PageResult.empty();
|
||||
}
|
||||
|
||||
// 使用联表查询,一次性获取当前租户下的会员分页数据
|
||||
return memberUserMapper.selectPageByTenantId(pageReqVO, currentTenantId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateUserLevel(Long id, Long levelId, Integer experience) {
|
||||
// 0 代表无等级:防止UpdateById时,会被过滤掉的问题
|
||||
// 0 代表无等级:防止 UpdateById 时被过滤掉
|
||||
levelId = ObjectUtil.defaultIfNull(levelId, 0L);
|
||||
memberUserMapper.updateById(new MemberUserDO()
|
||||
.setId(id)
|
||||
|
|
@ -307,8 +356,10 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|||
@Override
|
||||
public boolean updateUserPoint(Long id, Integer point) {
|
||||
if (point > 0) {
|
||||
// 积分增加
|
||||
memberUserMapper.updatePointIncr(id, point);
|
||||
} else if (point < 0) {
|
||||
// 积分减少,返回是否成功
|
||||
return memberUserMapper.updatePointDecr(id, point) > 0;
|
||||
}
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -52,4 +52,7 @@ public interface MemberUserTenantRelService {
|
|||
* @param tenantIds 租户ID列表
|
||||
*/
|
||||
void batchAssignUserToTenants(Long userId, List<Long> tenantIds);
|
||||
|
||||
|
||||
List<MemberUserTenantRelDO> getUserTenantRelsByTenantId(Long tenantId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,6 +35,11 @@ public class MemberUserTenantRelServiceImpl implements MemberUserTenantRelServic
|
|||
return memberUserTenantRelMapper.selectListByUserId(userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MemberUserTenantRelDO> getUserTenantRelsByTenantId(Long tenantId) {
|
||||
return memberUserTenantRelMapper.selectListByTenantId(tenantId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MemberUserTenantRelDO getUserTenantRel(Long userId, Long tenantId) {
|
||||
return memberUserTenantRelMapper.selectByUserIdAndTenantId(userId, tenantId);
|
||||
|
|
|
|||
|
|
@ -9,10 +9,54 @@ import org.apache.ibatis.annotations.Mapper;
|
|||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@Mapper
|
||||
public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
|
||||
|
||||
/**
|
||||
* 根据角色ID和部门条件分页查询用户
|
||||
*
|
||||
* @param reqVO 分页条件
|
||||
* @param deptIds 部门ID集合
|
||||
* @param userIds 用户ID集合
|
||||
* @return 分页结果
|
||||
*/
|
||||
default PageResult<AdminUserDO> selectPage(UserPageReqVO reqVO, Set<Long> deptIds, Set<Long> userIds) {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<AdminUserDO>()
|
||||
.likeIfPresent(AdminUserDO::getUsername, reqVO.getUsername())
|
||||
.likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile())
|
||||
.eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus())
|
||||
.betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getCreateTime())
|
||||
.inIfPresent(AdminUserDO::getDeptId, deptIds)
|
||||
.inIfPresent(AdminUserDO::getId, userIds)
|
||||
.orderByDesc(AdminUserDO::getId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据租户ID分页查询用户(联表查询)
|
||||
*
|
||||
* @param reqVO 分页条件
|
||||
* @param tenantId 租户ID
|
||||
* @return 分页结果
|
||||
*/
|
||||
default PageResult<AdminUserDO> selectPageByTenantId(UserPageReqVO reqVO, Long tenantId) {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<AdminUserDO>()
|
||||
.likeIfPresent(AdminUserDO::getUsername, reqVO.getUsername())
|
||||
.likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile())
|
||||
.eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus())
|
||||
.betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getCreateTime())
|
||||
// 使用 EXISTS 子查询关联用户-租户关系表
|
||||
.apply("EXISTS (SELECT 1 FROM system_user_tenant_rel rel WHERE rel.user_id = system_users.id AND rel.tenant_id = {0})", tenantId)
|
||||
.orderByDesc(AdminUserDO::getId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户名获取用户
|
||||
*
|
||||
* @param username 用户名
|
||||
* @return 用户对象
|
||||
*/
|
||||
default AdminUserDO selectByUsername(String username) {
|
||||
return selectOne(AdminUserDO::getUsername, username);
|
||||
}
|
||||
|
|
@ -25,17 +69,6 @@ public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
|
|||
return selectOne(AdminUserDO::getMobile, mobile);
|
||||
}
|
||||
|
||||
default PageResult<AdminUserDO> selectPage(UserPageReqVO reqVO, Collection<Long> deptIds, Collection<Long> userIds) {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<AdminUserDO>()
|
||||
.likeIfPresent(AdminUserDO::getUsername, reqVO.getUsername())
|
||||
.likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile())
|
||||
.eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus())
|
||||
.betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getCreateTime())
|
||||
.inIfPresent(AdminUserDO::getDeptId, deptIds)
|
||||
.inIfPresent(AdminUserDO::getId, userIds)
|
||||
.orderByDesc(AdminUserDO::getId));
|
||||
}
|
||||
|
||||
default List<AdminUserDO> selectListByNickname(String nickname) {
|
||||
return selectList(new LambdaQueryWrapperX<AdminUserDO>().like(AdminUserDO::getNickname, nickname));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@ import java.util.stream.Collectors;
|
|||
|
||||
import static com.fjrcloud.community.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static com.fjrcloud.community.framework.common.util.collection.CollectionUtils.*;
|
||||
import static com.fjrcloud.community.framework.tenant.core.security.TenantSecurityWebFilter.SYSTEM_TENANT_ID;
|
||||
import static com.fjrcloud.community.module.system.enums.ErrorCodeConstants.*;
|
||||
import static com.fjrcloud.community.module.system.enums.LogRecordConstants.*;
|
||||
|
||||
|
|
@ -265,15 +266,28 @@ public class AdminUserServiceImpl implements AdminUserService {
|
|||
|
||||
@Override
|
||||
public PageResult<AdminUserDO> getUserPage(UserPageReqVO reqVO) {
|
||||
Set<Long> userIds = null;
|
||||
if (reqVO.getRoleId() != null) {
|
||||
userIds = permissionService.getUserRoleIdListByRoleId(singleton(reqVO.getRoleId()));
|
||||
if (CollUtil.isEmpty(userIds)) {
|
||||
return PageResult.empty();
|
||||
Long currentTenantId = TenantContextHolder.getTenantId();
|
||||
|
||||
// 如果是系统租户,直接查询所有用户(支持按角色和部门过滤)
|
||||
if (SYSTEM_TENANT_ID.equals(currentTenantId)) {
|
||||
Set<Long> userIds = null;
|
||||
if (reqVO.getRoleId() != null) {
|
||||
userIds = permissionService.getUserRoleIdListByRoleId(singleton(reqVO.getRoleId()));
|
||||
if (CollUtil.isEmpty(userIds)) {
|
||||
return PageResult.empty();
|
||||
}
|
||||
}
|
||||
return userMapper.selectPage(reqVO, getDeptCondition(reqVO.getDeptId()), userIds);
|
||||
}
|
||||
|
||||
return userMapper.selectPage(reqVO, getDeptCondition(reqVO.getDeptId()), userIds);
|
||||
|
||||
// 校验租户ID有效性
|
||||
if (currentTenantId == null) {
|
||||
log.warn("[getUserPage][当前租户ID为空,返回空结果]");
|
||||
return PageResult.empty();
|
||||
}
|
||||
|
||||
// 如果不是系统租户,使用联表查询在当前租户下有关联的用户
|
||||
return userMapper.selectPageByTenantId(reqVO, currentTenantId);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
Loading…
Reference in New Issue