diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/AuthController.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/AuthController.java index bd3eafb..c960b03 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/AuthController.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/AuthController.java @@ -7,6 +7,7 @@ import com.fjrcloud.community.framework.common.enums.UserTypeEnum; import com.fjrcloud.community.framework.common.pojo.CommonResult; import com.fjrcloud.community.framework.security.config.SecurityProperties; import com.fjrcloud.community.framework.security.core.util.SecurityFrameworkUtils; +import com.fjrcloud.community.framework.tenant.core.aop.TenantIgnore; import com.fjrcloud.community.module.system.controller.admin.auth.vo.*; import com.fjrcloud.community.module.system.convert.auth.AuthConvert; import com.fjrcloud.community.module.system.dal.dataobject.permission.MenuDO; @@ -148,6 +149,14 @@ public class AuthController { return success(true); } + @PostMapping("/get-user-tenant-list") + @PermitAll + @TenantIgnore + @Operation(summary = "获取用户的租户列表(未登录状态)") + public CommonResult getUserTenantList(@RequestBody @Valid AuthUserTenantListReqVO reqVO) { + return success(authService.getUserTenantList(reqVO)); + } + // ========== 社交登录相关 ========== @GetMapping("/social-auth-redirect") diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/vo/AuthUserTenantListReqVO.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/vo/AuthUserTenantListReqVO.java new file mode 100644 index 0000000..e37b7fc --- /dev/null +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/vo/AuthUserTenantListReqVO.java @@ -0,0 +1,22 @@ +package com.fjrcloud.community.module.system.controller.admin.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; + +@Schema(description = "管理后台 - 获取用户租户列表 Request VO") +@Data +public class AuthUserTenantListReqVO { + + @Schema(description = "账号", requiredMode = Schema.RequiredMode.REQUIRED, example = "admin") + @NotEmpty(message = "登录账号不能为空") + @Length(min = 4, max = 30, message = "账号长度为 4-30 位") + private String username; + + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "admin123") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; +} diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/vo/AuthUserTenantListRespVO.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/vo/AuthUserTenantListRespVO.java new file mode 100644 index 0000000..f263de7 --- /dev/null +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/auth/vo/AuthUserTenantListRespVO.java @@ -0,0 +1,29 @@ +package com.fjrcloud.community.module.system.controller.admin.auth.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Schema(description = "管理后台 - 用户租户列表 Response VO") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AuthUserTenantListRespVO { + + @Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long userId; + + @Schema(description = "用户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "admin") + private String username; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "管理员") + private String nickname; + + @Schema(description = "租户列表", requiredMode = Schema.RequiredMode.REQUIRED) + private List tenants; +} diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/tenant/TenantController.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/tenant/TenantController.java index f68b4af..4bc62ac 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/tenant/TenantController.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/tenant/TenantController.java @@ -11,6 +11,7 @@ import com.fjrcloud.community.framework.tenant.core.aop.TenantIgnore; import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantRespVO; import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO; +import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSimpleRespVO; import com.fjrcloud.community.module.system.dal.dataobject.tenant.TenantDO; import com.fjrcloud.community.module.system.service.tenant.TenantService; import io.swagger.v3.oas.annotations.Operation; @@ -29,6 +30,7 @@ import java.util.List; import static com.fjrcloud.community.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static com.fjrcloud.community.framework.common.pojo.CommonResult.success; import static com.fjrcloud.community.framework.common.util.collection.CollectionUtils.convertList; +import static com.fjrcloud.community.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @Tag(name = "管理后台 - 租户") @RestController @@ -48,7 +50,7 @@ public class TenantController { return success(tenant != null ? tenant.getId() : null); } - @GetMapping({ "simple-list" }) + @GetMapping({ "simple-total-list" }) @PermitAll @TenantIgnore @Operation(summary = "获取租户精简信息列表", description = "只包含被开启的租户,用于【首页】功能的选择租户选项") @@ -133,4 +135,12 @@ public class TenantController { BeanUtils.toBean(list, TenantRespVO.class)); } + @GetMapping("/simple-list") + @Operation(summary = "获取租户精简列表") + @PermitAll + @TenantIgnore + public CommonResult> getSimpleTenantList() { + List list = tenantService.getUserTenantList(getLoginUserId()); + return success(list); + } } diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/tenant/vo/tenant/TenantSimpleRespVO.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/tenant/vo/tenant/TenantSimpleRespVO.java new file mode 100644 index 0000000..a5f2434 --- /dev/null +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/tenant/vo/tenant/TenantSimpleRespVO.java @@ -0,0 +1,21 @@ +package com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Schema(description = "管理后台 - 租户精简 Response VO") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TenantSimpleRespVO { + + @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long tenantId; + + @Schema(description = "租户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "XX小区") + private String tenantName; +} diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/user/UserController.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/user/UserController.java index e4fb936..60f9a70 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/user/UserController.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/user/UserController.java @@ -13,7 +13,9 @@ import com.fjrcloud.community.module.system.dal.dataobject.dept.DeptDO; import com.fjrcloud.community.module.system.dal.dataobject.user.AdminUserDO; import com.fjrcloud.community.module.system.enums.common.SexEnum; import com.fjrcloud.community.module.system.service.dept.DeptService; +import com.fjrcloud.community.module.system.service.tenant.TenantService; import com.fjrcloud.community.module.system.service.user.AdminUserService; +import com.fjrcloud.community.module.system.service.usertenant.UserTenantRelService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; @@ -28,6 +30,7 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -45,6 +48,10 @@ public class UserController { private AdminUserService userService; @Resource private DeptService deptService; + @Resource + private TenantService tenantService; + @Resource + private UserTenantRelService userTenantRelService; @PostMapping("/create") @Operation(summary = "新增用户") @@ -100,23 +107,24 @@ public class UserController { @Operation(summary = "获得用户分页列表") @PreAuthorize("@ss.hasPermission('system:user:query')") public CommonResult> getUserPage(@Valid UserPageReqVO pageReqVO) { - // 获得用户分页列表 PageResult pageResult = userService.getUserPage(pageReqVO); if (CollUtil.isEmpty(pageResult.getList())) { return success(new PageResult<>(pageResult.getTotal())); } - // 拼接数据 + Map deptMap = deptService.getDeptMap( convertList(pageResult.getList(), AdminUserDO::getDeptId)); - return success(new PageResult<>(UserConvert.INSTANCE.convertList(pageResult.getList(), deptMap), - pageResult.getTotal())); + List list = UserConvert.INSTANCE.convertList(pageResult.getList(), deptMap); + + userService.fillUserTenantNames(list); + + return success(new PageResult<>(list, pageResult.getTotal())); } @GetMapping({"/list-all-simple", "/simple-list"}) @Operation(summary = "获取用户精简信息列表", description = "只包含被开启的用户,主要用于前端的下拉选项") public CommonResult> getSimpleUserList() { List list = userService.getUserListByStatus(CommonStatusEnum.ENABLE.getStatus()); - // 拼接数据 Map deptMap = deptService.getDeptMap( convertList(list, AdminUserDO::getDeptId)); return success(UserConvert.INSTANCE.convertSimpleList(list, deptMap)); @@ -131,9 +139,12 @@ public class UserController { if (user == null) { return success(null); } - // 拼接数据 DeptDO dept = deptService.getDept(user.getDeptId()); - return success(UserConvert.INSTANCE.convert(user, dept)); + UserRespVO userVO = UserConvert.INSTANCE.convert(user, dept); + + userService.fillUserTenantNames(Collections.singletonList(userVO)); + + return success(userVO); } @GetMapping("/export-excel") @@ -144,24 +155,24 @@ public class UserController { HttpServletResponse response) throws IOException { exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = userService.getUserPage(exportReqVO).getList(); - // 输出 Excel Map deptMap = deptService.getDeptMap( convertList(list, AdminUserDO::getDeptId)); - ExcelUtils.write(response, "用户数据.xls", "数据", UserRespVO.class, - UserConvert.INSTANCE.convertList(list, deptMap)); + List userVOList = UserConvert.INSTANCE.convertList(list, deptMap); + + userService.fillUserTenantNames(userVOList); + + ExcelUtils.write(response, "用户数据.xls", "数据", UserRespVO.class, userVOList); } @GetMapping("/get-import-template") @Operation(summary = "获得导入用户模板") public void importTemplate(HttpServletResponse response) throws IOException { - // 手动创建导出 demo List list = Arrays.asList( UserImportExcelVO.builder().username("yunai").deptId(1L).email("yunai@fjrcloud.cn").mobile("15601691300") .nickname("融云").status(CommonStatusEnum.ENABLE.getStatus()).sex(SexEnum.MALE.getSex()).build(), UserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@fjrcloud.cn").mobile("15601701300") .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SexEnum.FEMALE.getSex()).build() ); - // 输出 ExcelUtils.write(response, "用户导入模板.xls", "用户列表", UserImportExcelVO.class, list); } diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/user/vo/user/UserRespVO.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/user/vo/user/UserRespVO.java index 3ead718..d047b80 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/user/vo/user/UserRespVO.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/controller/admin/user/vo/user/UserRespVO.java @@ -1,10 +1,10 @@ package com.fjrcloud.community.module.system.controller.admin.user.vo.user; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; import com.fjrcloud.community.framework.excel.core.annotations.DictFormat; import com.fjrcloud.community.framework.excel.core.convert.DictConvert; import com.fjrcloud.community.module.system.enums.DictTypeConstants; -import cn.idev.excel.annotation.ExcelIgnoreUnannotated; -import cn.idev.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -65,6 +65,10 @@ public class UserRespVO{ @ExcelProperty("最后登录IP") private String loginIp; + @Schema(description = "数据权限", requiredMode = Schema.RequiredMode.REQUIRED, example = "光明小区") + @ExcelProperty("数据权限") + private String tenantNames; + @Schema(description = "最后登录时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") @ExcelProperty("最后登录时间") private LocalDateTime loginDate; diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/auth/AdminAuthService.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/auth/AdminAuthService.java index 59c1b27..2c6ba2a 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/auth/AdminAuthService.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/auth/AdminAuthService.java @@ -73,16 +73,13 @@ public interface AdminAuthService { /** * 用户注册 * - * @param createReqVO 注册用户 + * @param registerReqVO 注册用户 * @return 注册结果 */ - AuthLoginRespVO register(AuthRegisterReqVO createReqVO); + AuthLoginRespVO register(@Valid AuthRegisterReqVO registerReqVO); - /** - * 重置密码 - * - * @param reqVO 验证码信息 - */ - void resetPassword(AuthResetPasswordReqVO reqVO); + void resetPassword(@Valid AuthResetPasswordReqVO reqVO); + + AuthUserTenantListRespVO getUserTenantList(@Valid AuthUserTenantListReqVO reqVO); } diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/auth/AdminAuthServiceImpl.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/auth/AdminAuthServiceImpl.java index ff8537c..b87d8a0 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/auth/AdminAuthServiceImpl.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/auth/AdminAuthServiceImpl.java @@ -334,4 +334,30 @@ public class AdminAuthServiceImpl implements AdminAuthService { userService.updateUserPassword(userByMobile.getId(), reqVO.getPassword()); } + + @Override + @DataPermission(enable = false) + public AuthUserTenantListRespVO getUserTenantList(AuthUserTenantListReqVO reqVO) { + AdminUserDO user = userService.getUserByUsername(reqVO.getUsername()); + if (user == null) { + throw exception(AUTH_LOGIN_BAD_CREDENTIALS); + } + + if (!userService.isPasswordMatch(reqVO.getPassword(), user.getPassword())) { + throw exception(AUTH_LOGIN_BAD_CREDENTIALS); + } + + if (CommonStatusEnum.isDisable(user.getStatus())) { + throw exception(AUTH_LOGIN_USER_DISABLED); + } + + List tenants = userTenantRelService.getUserTenants(user.getId()); + + return AuthUserTenantListRespVO.builder() + .userId(user.getId()) + .username(user.getUsername()) + .nickname(user.getNickname()) + .tenants(tenants) + .build(); + } } diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/tenant/TenantService.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/tenant/TenantService.java index c611a80..c4616fc 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/tenant/TenantService.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/tenant/TenantService.java @@ -4,6 +4,7 @@ import com.fjrcloud.community.framework.common.pojo.PageResult; import com.fjrcloud.community.framework.tenant.core.context.TenantContextHolder; import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO; +import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSimpleRespVO; import com.fjrcloud.community.module.system.dal.dataobject.tenant.TenantDO; import com.fjrcloud.community.module.system.service.tenant.handler.TenantInfoHandler; import com.fjrcloud.community.module.system.service.tenant.handler.TenantMenuHandler; @@ -135,11 +136,10 @@ public interface TenantService { */ List getTenantIdList(); - /** - * 校验租户是否合法 - * - * @param id 租户编号 - */ void validTenant(Long id); + List getUserTenantList(Long userId); + + List getTenantListByIds(List ids); + } diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/tenant/TenantServiceImpl.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/tenant/TenantServiceImpl.java index 5f27f12..219dc24 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/tenant/TenantServiceImpl.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/tenant/TenantServiceImpl.java @@ -3,6 +3,7 @@ package com.fjrcloud.community.module.system.service.tenant; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.fjrcloud.community.framework.common.enums.CommonStatusEnum; import com.fjrcloud.community.framework.common.pojo.PageResult; import com.fjrcloud.community.framework.common.util.collection.CollectionUtils; @@ -15,11 +16,13 @@ import com.fjrcloud.community.framework.tenant.core.util.TenantUtils; import com.fjrcloud.community.module.system.controller.admin.permission.vo.role.RoleSaveReqVO; import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO; +import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSimpleRespVO; import com.fjrcloud.community.module.system.convert.tenant.TenantConvert; import com.fjrcloud.community.module.system.dal.dataobject.permission.MenuDO; import com.fjrcloud.community.module.system.dal.dataobject.permission.RoleDO; import com.fjrcloud.community.module.system.dal.dataobject.tenant.TenantDO; import com.fjrcloud.community.module.system.dal.dataobject.tenant.TenantPackageDO; +import com.fjrcloud.community.module.system.dal.dataobject.user.UserTenantRelDO; import com.fjrcloud.community.module.system.dal.mysql.tenant.TenantMapper; import com.fjrcloud.community.module.system.enums.permission.RoleCodeEnum; import com.fjrcloud.community.module.system.enums.permission.RoleTypeEnum; @@ -29,7 +32,7 @@ import com.fjrcloud.community.module.system.service.permission.RoleService; import com.fjrcloud.community.module.system.service.tenant.handler.TenantInfoHandler; import com.fjrcloud.community.module.system.service.tenant.handler.TenantMenuHandler; import com.fjrcloud.community.module.system.service.user.AdminUserService; -import com.baomidou.dynamic.datasource.annotation.DSTransactional; +import com.fjrcloud.community.module.system.service.usertenant.UserTenantRelService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; @@ -37,9 +40,11 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; import static com.fjrcloud.community.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.fjrcloud.community.module.system.enums.ErrorCodeConstants.*; @@ -73,6 +78,8 @@ public class TenantServiceImpl implements TenantService { private MenuService menuService; @Resource private PermissionService permissionService; + @Resource + private UserTenantRelService userTenantRelService; @Override public List getTenantIdList() { @@ -317,4 +324,36 @@ public class TenantServiceImpl implements TenantService { return tenantProperties == null || Boolean.FALSE.equals(tenantProperties.getEnable()); } + @Override + public List getUserTenantList(Long userId) { + List rels = userTenantRelService.getUserTenantRels(userId); + if (CollUtil.isEmpty(rels)) { + return Collections.emptyList(); + } + + List tenantIds = CollectionUtils.convertList(rels, UserTenantRelDO::getTenantId); + List tenants = tenantMapper.selectBatchIds(tenantIds); + + return tenants.stream() + .map(tenant -> TenantSimpleRespVO.builder() + .tenantId(tenant.getId()) + .tenantName(tenant.getName()) + .build()) + .collect(Collectors.toList()); + } + + @Override + public List getTenantListByIds(List ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + List tenants = tenantMapper.selectBatchIds(ids); + return tenants.stream() + .map(tenant -> TenantSimpleRespVO.builder() + .tenantId(tenant.getId()) + .tenantName(tenant.getName()) + .build()) + .collect(Collectors.toList()); + } + } diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/user/AdminUserService.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/user/AdminUserService.java index 5cc5dad..9a02d35 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/user/AdminUserService.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/user/AdminUserService.java @@ -6,10 +6,7 @@ import com.fjrcloud.community.framework.common.util.collection.CollectionUtils; import com.fjrcloud.community.module.system.controller.admin.auth.vo.AuthRegisterReqVO; import com.fjrcloud.community.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import com.fjrcloud.community.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; -import com.fjrcloud.community.module.system.controller.admin.user.vo.user.UserImportExcelVO; -import com.fjrcloud.community.module.system.controller.admin.user.vo.user.UserImportRespVO; -import com.fjrcloud.community.module.system.controller.admin.user.vo.user.UserPageReqVO; -import com.fjrcloud.community.module.system.controller.admin.user.vo.user.UserSaveReqVO; +import com.fjrcloud.community.module.system.controller.admin.user.vo.user.*; import com.fjrcloud.community.module.system.dal.dataobject.user.AdminUserDO; import javax.validation.Valid; @@ -188,13 +185,8 @@ public interface AdminUserService { */ List getUserListByNickname(String nickname); - /** - * 批量导入用户 - * - * @param importUsers 导入用户列表 - * @param isUpdateSupport 是否支持更新 - * @return 导入结果 - */ + void fillUserTenantNames(List userList); + UserImportRespVO importUserList(List importUsers, boolean isUpdateSupport); /** 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 83b94e6..4e6bb2c 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 @@ -15,15 +15,14 @@ import com.fjrcloud.community.framework.datapermission.core.util.DataPermissionU import com.fjrcloud.community.framework.tenant.core.context.TenantContextHolder; import com.fjrcloud.community.module.infra.api.config.ConfigApi; import com.fjrcloud.community.module.system.controller.admin.auth.vo.AuthRegisterReqVO; +import com.fjrcloud.community.module.system.controller.admin.tenant.vo.tenant.TenantSimpleRespVO; import com.fjrcloud.community.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; import com.fjrcloud.community.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; -import com.fjrcloud.community.module.system.controller.admin.user.vo.user.UserImportExcelVO; -import com.fjrcloud.community.module.system.controller.admin.user.vo.user.UserImportRespVO; -import com.fjrcloud.community.module.system.controller.admin.user.vo.user.UserPageReqVO; -import com.fjrcloud.community.module.system.controller.admin.user.vo.user.UserSaveReqVO; +import com.fjrcloud.community.module.system.controller.admin.user.vo.user.*; import com.fjrcloud.community.module.system.dal.dataobject.dept.DeptDO; import com.fjrcloud.community.module.system.dal.dataobject.dept.UserPostDO; import com.fjrcloud.community.module.system.dal.dataobject.user.AdminUserDO; +import com.fjrcloud.community.module.system.dal.dataobject.user.UserTenantRelDO; import com.fjrcloud.community.module.system.dal.mysql.dept.UserPostMapper; import com.fjrcloud.community.module.system.dal.mysql.user.AdminUserMapper; import com.fjrcloud.community.module.system.service.dept.DeptService; @@ -47,6 +46,7 @@ import javax.validation.ConstraintViolationException; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; +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.*; @@ -488,6 +488,81 @@ public class AdminUserServiceImpl implements AdminUserService { return passwordEncoder.matches(rawPassword, encodedPassword); } + @Override + public void fillUserTenantNames(List userList) { + if (CollUtil.isEmpty(userList)) { + return; + } + + Map> userTenantRelMap = getUserTenantRelsBatch(userList); + Map tenantNameMap = buildTenantNameMap(userTenantRelMap); + + for (UserRespVO userVO : userList) { + Long userId = userVO.getId(); + if (userId != null && tenantNameMap.containsKey(userId)) { + userVO.setTenantNames(tenantNameMap.get(userId)); + } + } + } + + private Map> getUserTenantRelsBatch(List userList) { + List userIds = userList.stream() + .map(UserRespVO::getId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + if (CollUtil.isEmpty(userIds)) { + return Collections.emptyMap(); + } + + Map> result = new HashMap<>(); + for (Long userId : userIds) { + List rels = userTenantRelService.getUserTenantRels(userId); + if (CollUtil.isNotEmpty(rels)) { + result.put(userId, rels); + } + } + return result; + } + + private Map buildTenantNameMap(Map> userTenantRelMap) { + if (CollUtil.isEmpty(userTenantRelMap)) { + return Collections.emptyMap(); + } + + Set allTenantIds = userTenantRelMap.values().stream() + .flatMap(List::stream) + .map(UserTenantRelDO::getTenantId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + if (CollUtil.isEmpty(allTenantIds)) { + return Collections.emptyMap(); + } + + List allTenants = tenantService.getTenantListByIds(new ArrayList<>(allTenantIds)); + if (CollUtil.isEmpty(allTenants)) { + return Collections.emptyMap(); + } + + Map tenantIdNameMap = allTenants.stream() + .collect(Collectors.toMap(TenantSimpleRespVO::getTenantId, TenantSimpleRespVO::getTenantName, (v1, v2) -> v1)); + + Map result = new HashMap<>(); + for (Map.Entry> entry : userTenantRelMap.entrySet()) { + String tenantNames = entry.getValue().stream() + .map(UserTenantRelDO::getTenantId) + .filter(tenantIdNameMap::containsKey) + .map(tenantIdNameMap::get) + .collect(Collectors.joining(",")); + if (StrUtil.isNotBlank(tenantNames)) { + result.put(entry.getKey(), tenantNames); + } + } + + return result; + } + private String encodePassword(String password) { return passwordEncoder.encode(password); } diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/usertenant/UserTenantRelService.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/usertenant/UserTenantRelService.java index fd113ae..fffe59e 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/usertenant/UserTenantRelService.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/usertenant/UserTenantRelService.java @@ -13,6 +13,8 @@ public interface UserTenantRelService { UserTenantRelDO getDefaultTenant(Long userId); + List getUserTenantRels(Long userId); + void assignUserToTenant(Long userId, Long tenantId, Boolean isDefault); void removeUserFromTenant(Long userId, Long tenantId); diff --git a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/usertenant/UserTenantRelServiceImpl.java b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/usertenant/UserTenantRelServiceImpl.java index ffd36f6..6abced4 100644 --- a/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/usertenant/UserTenantRelServiceImpl.java +++ b/fjrcloud-module-system/src/main/java/com/fjrcloud/community/module/system/service/usertenant/UserTenantRelServiceImpl.java @@ -54,6 +54,11 @@ public class UserTenantRelServiceImpl implements UserTenantRelService { return userTenantRelMapper.selectDefaultByUserId(userId); } + @Override + public List getUserTenantRels(Long userId) { + return userTenantRelMapper.selectListByUserId(userId); + } + @Override @Transactional(rollbackFor = Exception.class) public void assignUserToTenant(Long userId, Long tenantId, Boolean isDefault) {