Browse Source

Merge remote-tracking branch 'origin/master_20240722' into lc_saas

# Conflicts:
#	yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java
dongpo 6 months ago
parent
commit
63bf40db6a

+ 1 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java

@@ -33,6 +33,7 @@ public interface ErrorCodeConstants {
     ErrorCode ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE = new ErrorCode(1_002_002_003, "不能操作类型为系统内置的角色");
     ErrorCode ROLE_IS_DISABLE = new ErrorCode(1_002_002_004, "名字为【{}】的角色已被禁用");
     ErrorCode ROLE_ADMIN_CODE_ERROR = new ErrorCode(1_002_002_005, "编码【{}】不能使用");
+    ErrorCode ROLES_PERMISSIONS_CREATE_ERROR = new ErrorCode(1_002_002_006, "角色权限创建失败,原因:{}");
 
     // ========== 用户模块 1-002-003-000 ==========
     ErrorCode USER_USERNAME_EXISTS = new ErrorCode(1_002_003_000, "用户账号已经存在");

+ 24 - 19
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java

@@ -74,6 +74,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -169,10 +171,6 @@ public class TenantServiceImpl implements TenantService {
         if (adminUserDO == null) {
             throw exception(USER_NOT_EXISTS);
         }
-//        // 更新用户信息当前租户
-//        userService.updateUserTenantId(user.getId(), tenant.getId());
-//        // 将这个用户所有租户关系设为不生效
-//        userTenantRelateService.deactivateAllForUser(user.getId());
         // 插入用户租户关系
         userTenantRelateService.createUserTenantRelate(new UserTenantRelateSaveReqVO().setUserId(user.getId()).setTenantId(tenant.getId()).setActived(false));
         // 先判断该租户下员工信息是否存在,如果不存在则创建
@@ -192,20 +190,32 @@ public class TenantServiceImpl implements TenantService {
         } else {
             throw exception(USER_TENANT_EMPLOYEE_DUPLICATE, tenant.getName());
         }
+        AtomicLong roleIdHolder = new AtomicLong(0L);
         TenantUtils.execute(tenant.getId(), () -> {
-            // 创建租户内置角色
-            Long roleId = createSystemSuperAdminRole(tenant.getId());
-            createSystemAdminRole(tenant.getId());
-            createCommonEmployeeRole(tenant.getId());
-            createDepartmentLeaderRole(tenant.getId());
+            roleIdHolder.set(createSystemSuperAdminRole(tenant.getId()));
             // 分配角色
-            permissionService.assignUserRole(user.getId(), singleton(roleId));
+            permissionService.assignUserRole(user.getId(), singleton(roleIdHolder.get()));
             // 修改租户的管理员
             tenantMapper.updateById(new TenantDO().setId(tenant.getId()).setContactUserId(user.getId()));
-            // 复制部署流程(目前共12个)
-            bpmModelApi.copyAndDeploy(null, null);
-            // 添加租户字典默认类型和数据
-            dictTypeTenantService.initDictTypeAndDataForTenant(null);
+        });
+        Long roleId = roleIdHolder.get(); // 在 lambda 表达式外部获取值
+        // 使用异步处理来创建其他内置角色和分配权限
+        CompletableFuture.runAsync(() -> {
+            try {
+                TenantUtils.execute(tenant.getId(), () -> {
+                    // 复制部署流程(目前共12个)
+                    bpmModelApi.copyAndDeploy(null, null);
+                    // 添加租户字典默认类型和数据
+                    dictTypeTenantService.initDictTypeAndDataForTenant(null);
+                    this.createSystemAdminRole(tenant.getId());
+                    this.createCommonEmployeeRole(tenant.getId());
+                    this.createDepartmentLeaderRole(tenant.getId());
+                });
+            } catch (Exception e) {
+                // 处理异步任务中的异常
+                log.error("Error creating system roles and permissions for tenant", e);
+                throw exception(ROLES_PERMISSIONS_CREATE_ERROR, e.getMessage());
+            }
         });
         TenantSimpleRespVO tenantSimpleRespVO = new TenantSimpleRespVO();
         tenantSimpleRespVO.setId(tenant.getId());
@@ -228,10 +238,6 @@ public class TenantServiceImpl implements TenantService {
         if (userTenantRelateService.checkUserHasTenant(user.getId(), tenant.getId())) {
             throw exception(USER_TENANT_EXISTS, tenant.getName());
         }
-//        // 更新用户信息当前租户
-//        userService.updateUserTenantId(user.getId(), tenant.getId());
-//        // 将这个用户所有租户关系设为不生效
-//        userTenantRelateService.deactivateAllForUser(user.getId());
         // 插入用户租户关系
         userTenantRelateService.createUserTenantRelate(new UserTenantRelateSaveReqVO().setUserId(user.getId()).setTenantId(tenant.getId()).setActived(false));
         // 自动根据账号创建对应人事信息,只保存姓名、头像、手机号
@@ -298,7 +304,6 @@ public class TenantServiceImpl implements TenantService {
     }
 
     // 创建系统管理员:拥有所有OA磁贴权限和企业管理磁贴权限,只有本人数据权限,是给创建人默认授予的角色。
-    @DSTransactional
     private Long createSystemSuperAdminRole(Long tenantId) {
         // 创建角色
         RoleSaveReqVO reqVO = new RoleSaveReqVO();