|
@@ -2,33 +2,50 @@ package cn.iocoder.yudao.module.system.service.tenant;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.lang.Assert;
|
|
|
-import cn.hutool.core.util.ObjectUtil;
|
|
|
+import cn.hutool.core.util.IdUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
|
|
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
|
|
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
|
|
+import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
+import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
|
|
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
|
|
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
|
|
import cn.iocoder.yudao.framework.tenant.config.TenantProperties;
|
|
|
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
|
|
import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
|
|
|
+import cn.iocoder.yudao.module.employee.api.EmployeeApi;
|
|
|
+import cn.iocoder.yudao.module.employee.api.dto.EmployeeCreateReqDTO;
|
|
|
+import cn.iocoder.yudao.module.employee.api.dto.EmployeeQueryReqDTO;
|
|
|
+import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
|
|
|
+import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO;
|
|
|
+import cn.iocoder.yudao.module.system.controller.admin.auth.vo.AuthLoginRespVO;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSaveReqVO;
|
|
|
+import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantJoinReqVO;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.tenant.TenantSaveReqVO;
|
|
|
import cn.iocoder.yudao.module.system.controller.admin.user.vo.tenant.UserTenantRelateSaveReqVO;
|
|
|
-import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO;
|
|
|
+import cn.iocoder.yudao.module.system.convert.auth.AuthConvert;
|
|
|
import cn.iocoder.yudao.module.system.convert.tenant.TenantConvert;
|
|
|
+import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
|
|
|
import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
|
|
|
import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
|
|
|
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO;
|
|
|
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantPackageDO;
|
|
|
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
|
|
|
import cn.iocoder.yudao.module.system.dal.mysql.tenant.TenantMapper;
|
|
|
+import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum;
|
|
|
+import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum;
|
|
|
+import cn.iocoder.yudao.module.system.enums.oauth2.OAuth2ClientConstants;
|
|
|
import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum;
|
|
|
import cn.iocoder.yudao.module.system.enums.permission.RoleTypeEnum;
|
|
|
+import cn.iocoder.yudao.module.system.service.auth.AdminAuthService;
|
|
|
+import cn.iocoder.yudao.module.system.service.logger.LoginLogService;
|
|
|
+import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService;
|
|
|
import cn.iocoder.yudao.module.system.service.permission.MenuService;
|
|
|
import cn.iocoder.yudao.module.system.service.permission.PermissionService;
|
|
|
import cn.iocoder.yudao.module.system.service.permission.RoleService;
|
|
@@ -84,7 +101,14 @@ public class TenantServiceImpl implements TenantService {
|
|
|
private PermissionService permissionService;
|
|
|
@Resource
|
|
|
private UserTenantRelateService userTenantRelateService;
|
|
|
-
|
|
|
+ @Resource
|
|
|
+ private EmployeeApi employeeApi;
|
|
|
+ @Resource
|
|
|
+ private LoginLogService loginLogService;
|
|
|
+ @Resource
|
|
|
+ private OAuth2TokenService oauth2TokenService;
|
|
|
+ @Resource
|
|
|
+ private AdminAuthService authService;
|
|
|
|
|
|
@Override
|
|
|
public List<Long> getTenantIdList() {
|
|
@@ -118,27 +142,33 @@ public class TenantServiceImpl implements TenantService {
|
|
|
|
|
|
|
|
|
TenantDO tenant = BeanUtils.toBean(createReqVO, TenantDO.class);
|
|
|
+ tenant.setCorpId(IdUtil.fastSimpleUUID());
|
|
|
tenantMapper.insert(tenant);
|
|
|
|
|
|
LoginUser user = SecurityFrameworkUtils.getLoginUser();
|
|
|
|
|
|
userService.updateUserTenantId(user.getId(), tenant.getId());
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+ userTenantRelateService.deactivateAllForUser(user.getId());
|
|
|
+
|
|
|
+ userTenantRelateService.createUserTenantRelate(new UserTenantRelateSaveReqVO().setUserId(user.getId()).setTenantId(tenant.getId()).setActived(true));
|
|
|
+
|
|
|
+ AdminUserDO adminUserDO = userService.getUser(user.getId());
|
|
|
+ if (adminUserDO == null) {
|
|
|
+ throw exception(USER_NOT_EXISTS);
|
|
|
+ }
|
|
|
+
|
|
|
+ EmployeeRespDTO employeeRespDTO = employeeApi.getEmployee(new EmployeeQueryReqDTO().setUserId(user.getId()).setTenantId(tenant.getId()));
|
|
|
+ if (employeeRespDTO == null) {
|
|
|
+
|
|
|
+ employeeApi.createEmployee(new EmployeeCreateReqDTO().setUserId(user.getId()).setTenantId(tenant.getId()).setName(adminUserDO.getNickname()).setAvatar(adminUserDO.getAvatar()).setPhone(adminUserDO.getMobile()));
|
|
|
+ } else {
|
|
|
+ throw exception(USER_TENANT_EMPLOYEE_DUPLICATE, tenant.getName());
|
|
|
+ }
|
|
|
|
|
|
TenantUtils.execute(tenant.getId(), () -> {
|
|
|
|
|
|
Long roleId = createRole(0L);
|
|
|
-
|
|
|
-
|
|
|
- userTenantRelateService.deactivateAllForUser(user.getId());
|
|
|
-
|
|
|
- userTenantRelateService.createUserTenantRelate(new UserTenantRelateSaveReqVO().setUserId(user.getId()).setTenantId(tenant.getId()).setActived(true));
|
|
|
-
|
|
|
-
|
|
|
|
|
|
permissionService.assignUserRole(user.getId(), singleton(roleId));
|
|
|
|
|
@@ -147,6 +177,38 @@ public class TenantServiceImpl implements TenantService {
|
|
|
return tenant.getId();
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @DSTransactional
|
|
|
+ public Long joinTenant(TenantJoinReqVO createReqVO) {
|
|
|
+
|
|
|
+ TenantDO tenant = tenantMapper.selectByCorpId(createReqVO.getCorpId());
|
|
|
+ if (tenant == null || tenant.getId() == null) {
|
|
|
+ throw exception(TENANT_NOT_EXISTS);
|
|
|
+ }
|
|
|
+
|
|
|
+ LoginUser user = SecurityFrameworkUtils.getLoginUser();
|
|
|
+
|
|
|
+ userService.updateUserTenantId(user.getId(), tenant.getId());
|
|
|
+
|
|
|
+ userTenantRelateService.deactivateAllForUser(user.getId());
|
|
|
+
|
|
|
+ userTenantRelateService.createUserTenantRelate(new UserTenantRelateSaveReqVO().setUserId(user.getId()).setTenantId(tenant.getId()).setActived(true));
|
|
|
+
|
|
|
+ AdminUserDO adminUserDO = userService.getUser(user.getId());
|
|
|
+ if (adminUserDO == null) {
|
|
|
+ throw exception(USER_NOT_EXISTS);
|
|
|
+ }
|
|
|
+
|
|
|
+ EmployeeRespDTO employeeRespDTO = employeeApi.getEmployee(new EmployeeQueryReqDTO().setUserId(user.getId()).setTenantId(tenant.getId()));
|
|
|
+ if (employeeRespDTO == null) {
|
|
|
+
|
|
|
+ employeeApi.createEmployee(new EmployeeCreateReqDTO().setUserId(user.getId()).setTenantId(tenant.getId()).setName(adminUserDO.getNickname()).setAvatar(adminUserDO.getAvatar()).setPhone(adminUserDO.getMobile()));
|
|
|
+ } else {
|
|
|
+ throw exception(USER_TENANT_EMPLOYEE_DUPLICATE, tenant.getName());
|
|
|
+ }
|
|
|
+ return tenant.getId();
|
|
|
+ }
|
|
|
+
|
|
|
private Long createUser(Long roleId, TenantSaveReqVO createReqVO) {
|
|
|
|
|
|
Long userId = userService.createUser(TenantConvert.INSTANCE.convert02(createReqVO));
|
|
@@ -205,6 +267,34 @@ public class TenantServiceImpl implements TenantService {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @DSTransactional
|
|
|
+ public AuthLoginRespVO changeTenant(TenantJoinReqVO createReqVO) {
|
|
|
+
|
|
|
+ TenantDO tenant = tenantMapper.selectByCorpId(createReqVO.getCorpId());
|
|
|
+ if (tenant == null || tenant.getId() == null) {
|
|
|
+ throw exception(TENANT_NOT_EXISTS);
|
|
|
+ }
|
|
|
+
|
|
|
+ LoginUser user = SecurityFrameworkUtils.getLoginUser();
|
|
|
+ if (user == null) {
|
|
|
+ throw exception(USER_NOT_EXISTS);
|
|
|
+ }
|
|
|
+ AdminUserDO adminUserDO = userService.getUser(user.getId());
|
|
|
+
|
|
|
+ if (!userTenantRelateService.checkUserHasTenant(user.getId(), tenant.getId())) {
|
|
|
+ throw exception(USER_NOT_IN_TENANT);
|
|
|
+ }
|
|
|
+
|
|
|
+ userService.updateUserTenantId(user.getId(), tenant.getId());
|
|
|
+
|
|
|
+ userTenantRelateService.deactivateAllForUser(user.getId());
|
|
|
+
|
|
|
+ userTenantRelateService.activateForUser(new UserTenantRelateSaveReqVO().setUserId(user.getId()).setTenantId(tenant.getId()));
|
|
|
+ authService.logout(createReqVO.getToken(), LoginLogTypeEnum.LOGOUT_CHANGE_TENANT.getType());
|
|
|
+ return createTokenAfterLoginSuccess(adminUserDO.getId(), adminUserDO.getUsername(), LoginLogTypeEnum.LOGIN_CHANGE_TENANT);
|
|
|
+ }
|
|
|
+
|
|
|
private void validTenantNameDuplicate(String name, Long id) {
|
|
|
TenantDO tenant = tenantMapper.selectByName(name);
|
|
|
if (tenant == null) {
|
|
@@ -354,4 +444,37 @@ public class TenantServiceImpl implements TenantService {
|
|
|
return tenantProperties == null || Boolean.FALSE.equals(tenantProperties.getEnable());
|
|
|
}
|
|
|
|
|
|
+ private AuthLoginRespVO createTokenAfterLoginSuccess(Long userId, String username, LoginLogTypeEnum logType) {
|
|
|
+
|
|
|
+ createLoginLog(userId, username, logType, LoginResultEnum.SUCCESS);
|
|
|
+
|
|
|
+ OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(userId, getUserType().getValue(),
|
|
|
+ OAuth2ClientConstants.CLIENT_ID_DEFAULT, null);
|
|
|
+
|
|
|
+ return AuthConvert.INSTANCE.convert(accessTokenDO);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void createLoginLog(Long userId, String username,
|
|
|
+ LoginLogTypeEnum logTypeEnum, LoginResultEnum loginResult) {
|
|
|
+
|
|
|
+ LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO();
|
|
|
+ reqDTO.setLogType(logTypeEnum.getType());
|
|
|
+ reqDTO.setTraceId(TracerUtils.getTraceId());
|
|
|
+ reqDTO.setUserId(userId);
|
|
|
+ reqDTO.setUserType(getUserType().getValue());
|
|
|
+ reqDTO.setUsername(username);
|
|
|
+ reqDTO.setUserAgent(ServletUtils.getUserAgent());
|
|
|
+ reqDTO.setUserIp(ServletUtils.getClientIP());
|
|
|
+ reqDTO.setResult(loginResult.getResult());
|
|
|
+ loginLogService.createLoginLog(reqDTO);
|
|
|
+
|
|
|
+ if (userId != null && Objects.equals(LoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) {
|
|
|
+ userService.updateUserLogin(userId, ServletUtils.getClientIP());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private UserTypeEnum getUserType() {
|
|
|
+ return UserTypeEnum.ADMIN;
|
|
|
+ }
|
|
|
+
|
|
|
}
|