From 7e06b0f6fd537aa1099b5e4bd5220477d3140f29 Mon Sep 17 00:00:00 2001 From: zzy Date: Tue, 21 Apr 2026 15:27:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/user/vo/MemberUserPageReqVO.java | 38 ++----- .../dal/mysql/user/MemberUserMapper.java | 106 +++++++++++++++--- .../mysql/user/MemberUserTenantRelMapper.java | 10 ++ .../service/user/MemberUserServiceImpl.java | 79 ++++++++++--- .../user/MemberUserTenantRelService.java | 3 + .../user/MemberUserTenantRelServiceImpl.java | 5 + .../dal/mysql/user/AdminUserMapper.java | 55 +++++++-- .../service/user/AdminUserServiceImpl.java | 28 +++-- 8 files changed, 244 insertions(+), 80 deletions(-) diff --git a/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/controller/admin/user/vo/MemberUserPageReqVO.java b/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/controller/admin/user/vo/MemberUserPageReqVO.java index 7ab73d6..576299f 100644 --- a/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/controller/admin/user/vo/MemberUserPageReqVO.java +++ b/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/controller/admin/user/vo/MemberUserPageReqVO.java @@ -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 tagIds; - - @Schema(description = "会员等级编号", example = "1") - private Long levelId; - - @Schema(description = "用户分组编号", example = "1") - private Long groupId; - - // TODO 芋艿:注册用户类型; - - // TODO 芋艿:登录用户类型; - } diff --git a/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/dal/mysql/user/MemberUserMapper.java b/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/dal/mysql/user/MemberUserMapper.java index 1f4942a..e2ec832 100644 --- a/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/dal/mysql/user/MemberUserMapper.java +++ b/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/dal/mysql/user/MemberUserMapper.java @@ -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 { + /** + * 根据手机号查询会员用户 + * + * @param mobile 手机号 + * @return 会员用户 + */ default MemberUserDO selectByMobile(String mobile) { return selectOne(MemberUserDO::getMobile, mobile); } + /** + * 根据昵称模糊查询会员用户列表 + * + * @param nickname 昵称 + * @return 会员用户列表 + */ default List selectListByNicknameLike(String nickname) { return selectList(new LambdaQueryWrapperX() .likeIfPresent(MemberUserDO::getNickname, nickname)); } - default PageResult 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 selectPageByTenantId(MemberUserPageReqVO reqVO, Long tenantId) { return selectPage(reqVO, new LambdaQueryWrapperX() .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 selectPage(MemberUserPageReqVO reqVO) { + return selectPage(reqVO, buildQueryWrapper(reqVO, null)); + } + + /** + * 根据用户ID列表分页查询会员 + * + * @param reqVO 分页条件 + * @param userIds 用户ID列表 + * @return 分页结果 + */ + default PageResult selectPageByUserIds(MemberUserPageReqVO reqVO, Collection userIds) { + // 如果用户ID列表为空,返回空结果 + if (CollUtil.isEmpty(userIds)) { + return PageResult.empty(); + } + + // 去重,避免生成冗余的 IN 语句 + List 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 buildQueryWrapper(MemberUserPageReqVO reqVO, Collection userIds) { + return new LambdaQueryWrapperX() + .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() .apply("FIND_IN_SET({0}, tag_ids)", tagId)); diff --git a/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/dal/mysql/user/MemberUserTenantRelMapper.java b/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/dal/mysql/user/MemberUserTenantRelMapper.java index 580f373..b93a209 100644 --- a/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/dal/mysql/user/MemberUserTenantRelMapper.java +++ b/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/dal/mysql/user/MemberUserTenantRelMapper.java @@ -25,6 +25,16 @@ public interface MemberUserTenantRelMapper extends BaseMapperX selectListByTenantId(Long tenantId) { + return selectList(MemberUserTenantRelDO::getTenantId, tenantId); + } + /** * 根据用户ID和租户ID查询关联关系 * diff --git a/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/service/user/MemberUserServiceImpl.java b/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/service/user/MemberUserServiceImpl.java index f9ce88f..b168650 100644 --- a/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/service/user/MemberUserServiceImpl.java +++ b/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/service/user/MemberUserServiceImpl.java @@ -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 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; diff --git a/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/service/user/MemberUserTenantRelService.java b/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/service/user/MemberUserTenantRelService.java index 40b0f04..aad7cdb 100644 --- a/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/service/user/MemberUserTenantRelService.java +++ b/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/service/user/MemberUserTenantRelService.java @@ -52,4 +52,7 @@ public interface MemberUserTenantRelService { * @param tenantIds 租户ID列表 */ void batchAssignUserToTenants(Long userId, List tenantIds); + + + List getUserTenantRelsByTenantId(Long tenantId); } diff --git a/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/service/user/MemberUserTenantRelServiceImpl.java b/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/service/user/MemberUserTenantRelServiceImpl.java index 2e23ffc..430e236 100644 --- a/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/service/user/MemberUserTenantRelServiceImpl.java +++ b/fjrcloud-module-member/src/main/java/com/fjrcloud/community/module/member/service/user/MemberUserTenantRelServiceImpl.java @@ -35,6 +35,11 @@ public class MemberUserTenantRelServiceImpl implements MemberUserTenantRelServic return memberUserTenantRelMapper.selectListByUserId(userId); } + @Override + public List getUserTenantRelsByTenantId(Long tenantId) { + return memberUserTenantRelMapper.selectListByTenantId(tenantId); + } + @Override public MemberUserTenantRelDO getUserTenantRel(Long userId, Long tenantId) { return memberUserTenantRelMapper.selectByUserIdAndTenantId(userId, tenantId); diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/dal/mysql/user/AdminUserMapper.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/dal/mysql/user/AdminUserMapper.java index 3384a59..6f3384c 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/dal/mysql/user/AdminUserMapper.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/dal/mysql/user/AdminUserMapper.java @@ -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 { + /** + * 根据角色ID和部门条件分页查询用户 + * + * @param reqVO 分页条件 + * @param deptIds 部门ID集合 + * @param userIds 用户ID集合 + * @return 分页结果 + */ + default PageResult selectPage(UserPageReqVO reqVO, Set deptIds, Set userIds) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .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 selectPageByTenantId(UserPageReqVO reqVO, Long tenantId) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .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 { return selectOne(AdminUserDO::getMobile, mobile); } - default PageResult selectPage(UserPageReqVO reqVO, Collection deptIds, Collection userIds) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .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 selectListByNickname(String nickname) { return selectList(new LambdaQueryWrapperX().like(AdminUserDO::getNickname, nickname)); } diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/user/AdminUserServiceImpl.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/user/AdminUserServiceImpl.java index 54c613e..fdd670d 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/user/AdminUserServiceImpl.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/user/AdminUserServiceImpl.java @@ -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 getUserPage(UserPageReqVO reqVO) { - Set 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 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