From 874b33557d657ac94afa29877fd0fcf47398d819 Mon Sep 17 00:00:00 2001
From: 77 <77@77.com>
Date: Tue, 14 May 2024 18:54:08 +0800
Subject: [PATCH] init
---
pom.xml | 63 +--
ruoyi-admin/pom.xml | 2 +-
.../src/main/resources/application-dev.yml | 2 +-
ruoyi-component/pom.xml | 2 +-
ruoyi-component/ruoyi-component-bom/pom.xml | 2 +-
ruoyi-component/ruoyi-component-core/pom.xml | 2 +-
.../component/core/constant/CacheNames.java | 4 +-
.../component/core/constant/Constants.java | 6 +
.../core/constant/TenantConstants.java | 45 +++
...ot.autoconfigure.AutoConfiguration.imports | 2 +-
.../ruoyi-component-encrypt/pom.xml | 2 +-
ruoyi-component/ruoyi-component-excel/pom.xml | 2 +-
.../ruoyi-component-generator/pom.xml | 2 +-
.../ruoyi-component-idempotent/pom.xml | 2 +-
ruoyi-component/ruoyi-component-job/pom.xml | 2 +-
ruoyi-component/ruoyi-component-json/pom.xml | 2 +-
ruoyi-component/ruoyi-component-log/pom.xml | 2 +-
ruoyi-component/ruoyi-component-mail/pom.xml | 2 +-
.../ruoyi-component-mybatis/pom.xml | 2 +-
ruoyi-component/ruoyi-component-oss/pom.xml | 2 +-
.../ruoyi-component-ratelimiter/pom.xml | 2 +-
ruoyi-component/ruoyi-component-redis/pom.xml | 2 +-
.../ruoyi-component-satoken/pom.xml | 2 +-
.../ruoyi-component-security/pom.xml | 2 +-
.../ruoyi-component-sensitive/pom.xml | 2 +-
ruoyi-component/ruoyi-component-sms/pom.xml | 2 +-
.../ruoyi-component-tenant/pom.xml | 18 +-
.../component/tenant/core/TenantEntity.java | 2 +-
.../ruoyi-component-translation/pom.xml | 2 +-
ruoyi-component/ruoyi-component-web/pom.xml | 2 +-
ruoyi-dk/pom.xml | 2 +-
ruoyi-system/pom.xml | 6 +-
.../controller}/SysConfigController.java | 2 +-
.../system/controller}/SysDeptController.java | 2 +-
.../controller}/SysDictDataController.java | 2 +-
.../controller}/SysDictTypeController.java | 2 +-
.../controller}/SysIndexController.java | 2 +-
.../controller}/SysLoginController.java | 2 +-
.../system/controller}/SysMenuController.java | 2 +-
.../controller}/SysNoticeController.java | 2 +-
.../controller}/SysOssConfigController.java | 2 +-
.../system/controller}/SysOssController.java | 2 +-
.../system/controller}/SysPostController.java | 2 +-
.../controller}/SysProfileController.java | 2 +-
.../controller}/SysRegisterController.java | 2 +-
.../system/controller}/SysRoleController.java | 2 +-
.../controller/SysTenantController.java | 176 ++++++++
.../SysTenantPackageController.java | 135 +++++++
.../system/controller}/SysUserController.java | 2 +-
.../controller/monitor/CacheController.java | 2 +-
.../monitor/SysLogininforController.java | 2 +-
.../monitor/SysOperlogController.java | 2 +-
.../monitor/SysUserOnlineController.java | 2 +-
.../com/ruoyi/system/domain/SysConfig.java | 3 +-
.../java/com/ruoyi/system/domain/SysDept.java | 4 +
.../com/ruoyi/system/domain/SysDictData.java | 3 +-
.../com/ruoyi/system/domain/SysDictType.java | 3 +-
.../java/com/ruoyi/system/domain/SysRole.java | 3 +-
.../com/ruoyi/system/domain/SysTenant.java | 101 +++++
.../ruoyi/system/domain/SysTenantPackage.java | 53 +++
.../java/com/ruoyi/system/domain/SysUser.java | 3 +-
.../ruoyi/system/domain/bo/SysTenantBo.java | 111 +++++
.../system/domain/bo/SysTenantPackageBo.java | 55 +++
.../system/domain/vo/SysTenantPackageVo.java | 61 +++
.../ruoyi/system/domain/vo/SysTenantVo.java | 110 +++++
.../ruoyi/system/mapper/SysTenantMapper.java | 15 +
.../system/mapper/SysTenantPackageMapper.java | 14 +
.../service/ISysTenantPackageService.java | 57 +++
.../system/service/ISysTenantService.java | 82 ++++
.../impl/SysTenantPackageServiceImpl.java | 146 +++++++
.../service/impl/SysTenantServiceImpl.java | 382 ++++++++++++++++++
71 files changed, 1637 insertions(+), 112 deletions(-)
create mode 100644 ruoyi-component/ruoyi-component-core/src/main/java/com/ruoyi/component/core/constant/TenantConstants.java
rename {ruoyi-admin/src/main/java/com/ruoyi/web/controller/system => ruoyi-system/src/main/java/com/ruoyi/system/controller}/SysConfigController.java (99%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web/controller/system => ruoyi-system/src/main/java/com/ruoyi/system/controller}/SysDeptController.java (99%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web/controller/system => ruoyi-system/src/main/java/com/ruoyi/system/controller}/SysDictDataController.java (98%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web/controller/system => ruoyi-system/src/main/java/com/ruoyi/system/controller}/SysDictTypeController.java (98%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web/controller/system => ruoyi-system/src/main/java/com/ruoyi/system/controller}/SysIndexController.java (91%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web/controller/system => ruoyi-system/src/main/java/com/ruoyi/system/controller}/SysLoginController.java (99%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web/controller/system => ruoyi-system/src/main/java/com/ruoyi/system/controller}/SysMenuController.java (99%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web/controller/system => ruoyi-system/src/main/java/com/ruoyi/system/controller}/SysNoticeController.java (98%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web/controller/system => ruoyi-system/src/main/java/com/ruoyi/system/controller}/SysOssConfigController.java (98%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web/controller/system => ruoyi-system/src/main/java/com/ruoyi/system/controller}/SysOssController.java (98%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web/controller/system => ruoyi-system/src/main/java/com/ruoyi/system/controller}/SysPostController.java (99%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web/controller/system => ruoyi-system/src/main/java/com/ruoyi/system/controller}/SysProfileController.java (99%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web/controller/system => ruoyi-system/src/main/java/com/ruoyi/system/controller}/SysRegisterController.java (96%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web/controller/system => ruoyi-system/src/main/java/com/ruoyi/system/controller}/SysRoleController.java (99%)
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/controller/SysTenantController.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/controller/SysTenantPackageController.java
rename {ruoyi-admin/src/main/java/com/ruoyi/web/controller/system => ruoyi-system/src/main/java/com/ruoyi/system/controller}/SysUserController.java (99%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web => ruoyi-system/src/main/java/com/ruoyi/system}/controller/monitor/CacheController.java (99%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web => ruoyi-system/src/main/java/com/ruoyi/system}/controller/monitor/SysLogininforController.java (98%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web => ruoyi-system/src/main/java/com/ruoyi/system}/controller/monitor/SysOperlogController.java (98%)
rename {ruoyi-admin/src/main/java/com/ruoyi/web => ruoyi-system/src/main/java/com/ruoyi/system}/controller/monitor/SysUserOnlineController.java (98%)
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTenant.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTenantPackage.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysTenantBo.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysTenantPackageBo.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysTenantPackageVo.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysTenantVo.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTenantMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTenantPackageMapper.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTenantPackageService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTenantService.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTenantPackageServiceImpl.java
create mode 100644 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTenantServiceImpl.java
diff --git a/pom.xml b/pom.xml
index acb7fc6..115d215 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,12 +6,11 @@
com.ruoyi
dk-sass-server
- 4.8.2
+ ${revision}
- RuoYi-Vue-Plus
+ Sass-Server
- 4.8.2
- 4.8.2
+ 4.8.3
2.7.18
UTF-8
UTF-8
@@ -261,59 +260,15 @@
bcprov-jdk15to18
${bouncycastle.version}
-
-
-
- com.ruoyi
- ruoyi-job
- ${ruoyi-vue-plus.version}
-
-
-
-
- com.ruoyi
- ruoyi-generator
- ${ruoyi-vue-plus.version}
-
-
-
-
- com.ruoyi
- ruoyi-framework
- ${ruoyi-vue-plus.version}
-
-
-
-
- com.ruoyi
- ruoyi-system
- ${ruoyi-vue-plus.version}
-
-
-
-
- com.ruoyi
- ruoyi-common
- ${ruoyi-vue-plus.version}
-
-
-
-
- com.ruoyi
- ruoyi-oss
- ${ruoyi-vue-plus.version}
-
-
-
-
- com.ruoyi
- ruoyi-sms
- ${ruoyi-vue-plus.version}
-
com.ruoyi
ruoyi-dk
- ${ruoyi-vue-plus.version}
+ ${revision}
+
+
+ com.ruoyi
+ ruoyi-system
+ ${revision}
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 35368d6..1591f5e 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -5,7 +5,7 @@
dk-sass-server
com.ruoyi
- 4.8.2
+ ${revision}
4.0.0
jar
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index b285300..4f8030a 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -20,7 +20,7 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
- url: jdbc:mysql://124.222.254.188:4306/dk-sass?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
+ url: jdbc:mysql://124.222.254.188:5306/dk-sass?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
username: root
password: 383200134
# 从库数据源
diff --git a/ruoyi-component/pom.xml b/ruoyi-component/pom.xml
index f250ee2..297fbed 100644
--- a/ruoyi-component/pom.xml
+++ b/ruoyi-component/pom.xml
@@ -6,7 +6,7 @@
com.ruoyi
dk-sass-server
- 4.8.2
+ ${revision}
ruoyi-component
pom
diff --git a/ruoyi-component/ruoyi-component-bom/pom.xml b/ruoyi-component/ruoyi-component-bom/pom.xml
index 76a07b3..61676e5 100644
--- a/ruoyi-component/ruoyi-component-bom/pom.xml
+++ b/ruoyi-component/ruoyi-component-bom/pom.xml
@@ -7,7 +7,7 @@
pom
- 4.8.2
+ 4.8.3
diff --git a/ruoyi-component/ruoyi-component-core/pom.xml b/ruoyi-component/ruoyi-component-core/pom.xml
index 8cc90bd..417761f 100644
--- a/ruoyi-component/ruoyi-component-core/pom.xml
+++ b/ruoyi-component/ruoyi-component-core/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-core
diff --git a/ruoyi-component/ruoyi-component-core/src/main/java/com/ruoyi/component/core/constant/CacheNames.java b/ruoyi-component/ruoyi-component-core/src/main/java/com/ruoyi/component/core/constant/CacheNames.java
index 2442a26..a05f23e 100644
--- a/ruoyi-component/ruoyi-component-core/src/main/java/com/ruoyi/component/core/constant/CacheNames.java
+++ b/ruoyi-component/ruoyi-component-core/src/main/java/com/ruoyi/component/core/constant/CacheNames.java
@@ -35,6 +35,8 @@ public interface CacheNames {
*/
String SYS_USER_NAME = "sys_user_name#30d";
+ String SYS_TENANT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_tenant#30d";
+
/**
* 部门
*/
@@ -48,7 +50,7 @@ public interface CacheNames {
/**
* OSS配置
*/
- String SYS_OSS_CONFIG = "sys_oss_config";
+ String SYS_OSS_CONFIG = GlobalConstants.GLOBAL_REDIS_KEY + "sys_oss_config";
/**
* 在线用户
diff --git a/ruoyi-component/ruoyi-component-core/src/main/java/com/ruoyi/component/core/constant/Constants.java b/ruoyi-component/ruoyi-component-core/src/main/java/com/ruoyi/component/core/constant/Constants.java
index eec0ba5..307c1f5 100644
--- a/ruoyi-component/ruoyi-component-core/src/main/java/com/ruoyi/component/core/constant/Constants.java
+++ b/ruoyi-component/ruoyi-component-core/src/main/java/com/ruoyi/component/core/constant/Constants.java
@@ -72,5 +72,11 @@ public interface Constants {
*/
String TOKEN = "token";
+
+ /**
+ * 顶级部门id
+ */
+ Long TOP_PARENT_ID = 0L;
+
}
diff --git a/ruoyi-component/ruoyi-component-core/src/main/java/com/ruoyi/component/core/constant/TenantConstants.java b/ruoyi-component/ruoyi-component-core/src/main/java/com/ruoyi/component/core/constant/TenantConstants.java
new file mode 100644
index 0000000..7dc91d4
--- /dev/null
+++ b/ruoyi-component/ruoyi-component-core/src/main/java/com/ruoyi/component/core/constant/TenantConstants.java
@@ -0,0 +1,45 @@
+package com.ruoyi.component.core.constant;
+
+/**
+ * 租户常量信息
+ *
+ * @author Lion Li
+ */
+public interface TenantConstants {
+
+ /**
+ * 租户正常状态
+ */
+ String NORMAL = "0";
+
+ /**
+ * 租户封禁状态
+ */
+ String DISABLE = "1";
+
+ /**
+ * 超级管理员ID
+ */
+ Long SUPER_ADMIN_ID = 1L;
+
+ /**
+ * 超级管理员角色 roleKey
+ */
+ String SUPER_ADMIN_ROLE_KEY = "superadmin";
+
+ /**
+ * 租户管理员角色 roleKey
+ */
+ String TENANT_ADMIN_ROLE_KEY = "admin";
+
+ /**
+ * 租户管理员角色名称
+ */
+ String TENANT_ADMIN_ROLE_NAME = "管理员";
+
+ /**
+ * 默认租户ID
+ */
+ String DEFAULT_TENANT_ID = "000000";
+
+}
diff --git a/ruoyi-component/ruoyi-component-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-component/ruoyi-component-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 4c94d21..b5e2440 100644
--- a/ruoyi-component/ruoyi-component-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/ruoyi-component/ruoyi-component-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -3,4 +3,4 @@ com.ruoyi.component.core.config.AsyncConfig
com.ruoyi.component.core.config.RuoYiConfig
com.ruoyi.component.core.config.ThreadPoolConfig
com.ruoyi.component.core.config.ValidatorConfig
-com.ruoyi.component.core.utils.SpringUtils
+com.ruoyi.component.core.util.spring.SpringUtils
diff --git a/ruoyi-component/ruoyi-component-encrypt/pom.xml b/ruoyi-component/ruoyi-component-encrypt/pom.xml
index d29a4bc..a721b15 100644
--- a/ruoyi-component/ruoyi-component-encrypt/pom.xml
+++ b/ruoyi-component/ruoyi-component-encrypt/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-encrypt
diff --git a/ruoyi-component/ruoyi-component-excel/pom.xml b/ruoyi-component/ruoyi-component-excel/pom.xml
index c494e9c..a0bbb32 100644
--- a/ruoyi-component/ruoyi-component-excel/pom.xml
+++ b/ruoyi-component/ruoyi-component-excel/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-excel
diff --git a/ruoyi-component/ruoyi-component-generator/pom.xml b/ruoyi-component/ruoyi-component-generator/pom.xml
index 01e75dc..f87d231 100644
--- a/ruoyi-component/ruoyi-component-generator/pom.xml
+++ b/ruoyi-component/ruoyi-component-generator/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-generator
diff --git a/ruoyi-component/ruoyi-component-idempotent/pom.xml b/ruoyi-component/ruoyi-component-idempotent/pom.xml
index b537e16..4d544fd 100644
--- a/ruoyi-component/ruoyi-component-idempotent/pom.xml
+++ b/ruoyi-component/ruoyi-component-idempotent/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-idempotent
diff --git a/ruoyi-component/ruoyi-component-job/pom.xml b/ruoyi-component/ruoyi-component-job/pom.xml
index 5b7e509..1726d02 100644
--- a/ruoyi-component/ruoyi-component-job/pom.xml
+++ b/ruoyi-component/ruoyi-component-job/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-job
diff --git a/ruoyi-component/ruoyi-component-json/pom.xml b/ruoyi-component/ruoyi-component-json/pom.xml
index 5c6c779..5f75f2f 100644
--- a/ruoyi-component/ruoyi-component-json/pom.xml
+++ b/ruoyi-component/ruoyi-component-json/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-json
diff --git a/ruoyi-component/ruoyi-component-log/pom.xml b/ruoyi-component/ruoyi-component-log/pom.xml
index cc96227..931c547 100644
--- a/ruoyi-component/ruoyi-component-log/pom.xml
+++ b/ruoyi-component/ruoyi-component-log/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-log
diff --git a/ruoyi-component/ruoyi-component-mail/pom.xml b/ruoyi-component/ruoyi-component-mail/pom.xml
index bf8b961..1c06633 100644
--- a/ruoyi-component/ruoyi-component-mail/pom.xml
+++ b/ruoyi-component/ruoyi-component-mail/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-mail
diff --git a/ruoyi-component/ruoyi-component-mybatis/pom.xml b/ruoyi-component/ruoyi-component-mybatis/pom.xml
index a0115b3..6bcf665 100644
--- a/ruoyi-component/ruoyi-component-mybatis/pom.xml
+++ b/ruoyi-component/ruoyi-component-mybatis/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-mybatis
jar
diff --git a/ruoyi-component/ruoyi-component-oss/pom.xml b/ruoyi-component/ruoyi-component-oss/pom.xml
index b3dd53f..5e8c744 100644
--- a/ruoyi-component/ruoyi-component-oss/pom.xml
+++ b/ruoyi-component/ruoyi-component-oss/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-oss
diff --git a/ruoyi-component/ruoyi-component-ratelimiter/pom.xml b/ruoyi-component/ruoyi-component-ratelimiter/pom.xml
index 154ad6f..ee23ff7 100644
--- a/ruoyi-component/ruoyi-component-ratelimiter/pom.xml
+++ b/ruoyi-component/ruoyi-component-ratelimiter/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-ratelimiter
diff --git a/ruoyi-component/ruoyi-component-redis/pom.xml b/ruoyi-component/ruoyi-component-redis/pom.xml
index 1a52f42..8d5a82f 100644
--- a/ruoyi-component/ruoyi-component-redis/pom.xml
+++ b/ruoyi-component/ruoyi-component-redis/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-redis
diff --git a/ruoyi-component/ruoyi-component-satoken/pom.xml b/ruoyi-component/ruoyi-component-satoken/pom.xml
index 76dd26f..6f99620 100644
--- a/ruoyi-component/ruoyi-component-satoken/pom.xml
+++ b/ruoyi-component/ruoyi-component-satoken/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-satoken
diff --git a/ruoyi-component/ruoyi-component-security/pom.xml b/ruoyi-component/ruoyi-component-security/pom.xml
index cb9597c..9ec89ff 100644
--- a/ruoyi-component/ruoyi-component-security/pom.xml
+++ b/ruoyi-component/ruoyi-component-security/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-security
diff --git a/ruoyi-component/ruoyi-component-sensitive/pom.xml b/ruoyi-component/ruoyi-component-sensitive/pom.xml
index bdd3c7e..08c630b 100644
--- a/ruoyi-component/ruoyi-component-sensitive/pom.xml
+++ b/ruoyi-component/ruoyi-component-sensitive/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-sensitive
diff --git a/ruoyi-component/ruoyi-component-sms/pom.xml b/ruoyi-component/ruoyi-component-sms/pom.xml
index 61d4b9b..1989de4 100644
--- a/ruoyi-component/ruoyi-component-sms/pom.xml
+++ b/ruoyi-component/ruoyi-component-sms/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-sms
diff --git a/ruoyi-component/ruoyi-component-tenant/pom.xml b/ruoyi-component/ruoyi-component-tenant/pom.xml
index 1cfbee1..c746b39 100644
--- a/ruoyi-component/ruoyi-component-tenant/pom.xml
+++ b/ruoyi-component/ruoyi-component-tenant/pom.xml
@@ -4,13 +4,19 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-tenant
+ jar
+
+
+ UTF-8
+
+
com.ruoyi
- ruoyi-common
+ ruoyi-component-core
com.ruoyi
@@ -20,13 +26,13 @@
com.ruoyi
ruoyi-component-satoken
-
- com.alibaba
- transmittable-thread-local
-
com.ruoyi
ruoyi-component-mybatis
+
+ com.alibaba
+ transmittable-thread-local
+
diff --git a/ruoyi-component/ruoyi-component-tenant/src/main/java/com/ruoyi/component/tenant/core/TenantEntity.java b/ruoyi-component/ruoyi-component-tenant/src/main/java/com/ruoyi/component/tenant/core/TenantEntity.java
index 2520740..015fc1b 100644
--- a/ruoyi-component/ruoyi-component-tenant/src/main/java/com/ruoyi/component/tenant/core/TenantEntity.java
+++ b/ruoyi-component/ruoyi-component-tenant/src/main/java/com/ruoyi/component/tenant/core/TenantEntity.java
@@ -1,6 +1,6 @@
package com.ruoyi.component.tenant.core;
-import com.ruoyi.common.core.domain.BaseEntity;
+import com.ruoyi.component.mybatis.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
diff --git a/ruoyi-component/ruoyi-component-translation/pom.xml b/ruoyi-component/ruoyi-component-translation/pom.xml
index b222fae..eb76e64 100644
--- a/ruoyi-component/ruoyi-component-translation/pom.xml
+++ b/ruoyi-component/ruoyi-component-translation/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-translation
diff --git a/ruoyi-component/ruoyi-component-web/pom.xml b/ruoyi-component/ruoyi-component-web/pom.xml
index 5614964..7bd0cc3 100644
--- a/ruoyi-component/ruoyi-component-web/pom.xml
+++ b/ruoyi-component/ruoyi-component-web/pom.xml
@@ -4,7 +4,7 @@
com.ruoyi
ruoyi-component
- 4.8.2
+ ${revision}
ruoyi-component-web
diff --git a/ruoyi-dk/pom.xml b/ruoyi-dk/pom.xml
index 12c30b1..06d2ca5 100644
--- a/ruoyi-dk/pom.xml
+++ b/ruoyi-dk/pom.xml
@@ -6,7 +6,7 @@
com.ruoyi
dk-sass-server
- 4.8.2
+ ${revision}
ruoyi-dk
diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml
index 49d90d2..4509216 100644
--- a/ruoyi-system/pom.xml
+++ b/ruoyi-system/pom.xml
@@ -5,7 +5,7 @@
dk-sass-server
com.ruoyi
- 4.8.2
+ ${revision}
4.0.0
@@ -66,6 +66,10 @@
com.ruoyi
ruoyi-component-mail
+
+ com.ruoyi
+ ruoyi-component-tenant
+
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysConfigController.java
similarity index 99%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/SysConfigController.java
index ed2bcbb..f52fa84 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysConfigController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system;
+package com.ruoyi.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.ruoyi.component.core.domain.R;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java
similarity index 99%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java
index 833d92e..167d688 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system;
+package com.ruoyi.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.convert.Convert;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictDataController.java
similarity index 98%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictDataController.java
index 007c8a9..ab4c3ba 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictDataController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system;
+package com.ruoyi.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.ObjectUtil;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictTypeController.java
similarity index 98%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictTypeController.java
index d6adb0f..94ed9d1 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictTypeController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system;
+package com.ruoyi.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.ruoyi.component.core.domain.R;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysIndexController.java
similarity index 91%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/SysIndexController.java
index f47bf0d..30fbb4c 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysIndexController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system;
+package com.ruoyi.system.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import lombok.RequiredArgsConstructor;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysLoginController.java
similarity index 99%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/SysLoginController.java
index a2b0769..b73d498 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysLoginController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system;
+package com.ruoyi.system.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import com.ruoyi.component.core.constant.Constants;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysMenuController.java
similarity index 99%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/SysMenuController.java
index 8a1d018..1e3facb 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysMenuController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system;
+package com.ruoyi.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.lang.tree.Tree;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysNoticeController.java
similarity index 98%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/SysNoticeController.java
index 9072d45..2225ba9 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysNoticeController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system;
+package com.ruoyi.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.ruoyi.component.core.domain.R;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysOssConfigController.java
similarity index 98%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/SysOssConfigController.java
index 29427ca..e850e69 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysOssConfigController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system;
+package com.ruoyi.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.ruoyi.component.core.domain.R;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysOssController.java
similarity index 98%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/SysOssController.java
index 5dc8773..45efa5b 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysOssController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system;
+package com.ruoyi.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysPostController.java
similarity index 99%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/SysPostController.java
index 858db2d..03b0e90 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysPostController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system;
+package com.ruoyi.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.ruoyi.component.core.constant.UserConstants;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java
similarity index 99%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java
index 93bffbd..31d36c4 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system;
+package com.ruoyi.system.controller;
import cn.dev33.satoken.secure.BCrypt;
import cn.hutool.core.io.FileUtil;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRegisterController.java
similarity index 96%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRegisterController.java
index 206cf87..cb84cb8 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRegisterController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system;
+package com.ruoyi.system.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import com.ruoyi.component.core.domain.R;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java
similarity index 99%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java
index dbca995..6650cf0 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system;
+package com.ruoyi.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.ruoyi.component.core.domain.R;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysTenantController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysTenantController.java
new file mode 100644
index 0000000..b4e8080
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysTenantController.java
@@ -0,0 +1,176 @@
+package com.ruoyi.system.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.annotation.SaCheckRole;
+import com.baomidou.lock.annotation.Lock4j;
+import com.ruoyi.component.core.constant.TenantConstants;
+import com.ruoyi.component.core.domain.R;
+import com.ruoyi.component.core.validate.AddGroup;
+import com.ruoyi.component.core.validate.EditGroup;
+import com.ruoyi.component.excel.utils.ExcelUtil;
+import com.ruoyi.component.idempotent.annotation.RepeatSubmit;
+import com.ruoyi.component.log.annotation.Log;
+import com.ruoyi.component.log.enums.BusinessType;
+import com.ruoyi.component.mybatis.core.page.PageQuery;
+import com.ruoyi.component.mybatis.core.page.TableDataInfo;
+import com.ruoyi.component.tenant.helper.TenantHelper;
+import com.ruoyi.component.web.core.BaseController;
+import com.ruoyi.system.domain.bo.SysTenantBo;
+import com.ruoyi.system.domain.vo.SysTenantVo;
+import com.ruoyi.system.service.ISysTenantService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 租户管理
+ *
+ * @author Michelle.Chung
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/tenant")
+public class SysTenantController extends BaseController {
+
+ private final ISysTenantService tenantService;
+
+ /**
+ * 查询租户列表
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @SaCheckPermission("system:tenant:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SysTenantBo bo, PageQuery pageQuery) {
+ return tenantService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出租户列表
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @SaCheckPermission("system:tenant:export")
+ @Log(title = "租户", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(SysTenantBo bo, HttpServletResponse response) {
+ List list = tenantService.queryList(bo);
+ ExcelUtil.exportExcel(list, "租户", SysTenantVo.class, response);
+ }
+
+ /**
+ * 获取租户详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @SaCheckPermission("system:tenant:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(tenantService.queryById(id));
+ }
+
+ /**
+ * 新增租户
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @SaCheckPermission("system:tenant:add")
+ @Log(title = "租户", businessType = BusinessType.INSERT)
+ @Lock4j
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody SysTenantBo bo) {
+ if (!tenantService.checkCompanyNameUnique(bo)) {
+ return R.fail("新增租户'" + bo.getCompanyName() + "'失败,企业名称已存在");
+ }
+ return toAjax(TenantHelper.ignore(() -> tenantService.insertByBo(bo)));
+ }
+
+ /**
+ * 修改租户
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @SaCheckPermission("system:tenant:edit")
+ @Log(title = "租户", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody SysTenantBo bo) {
+ tenantService.checkTenantAllowed(bo.getTenantId());
+ if (!tenantService.checkCompanyNameUnique(bo)) {
+ return R.fail("修改租户'" + bo.getCompanyName() + "'失败,公司名称已存在");
+ }
+ return toAjax(tenantService.updateByBo(bo));
+ }
+
+ /**
+ * 状态修改
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @SaCheckPermission("system:tenant:edit")
+ @Log(title = "租户", businessType = BusinessType.UPDATE)
+ @PutMapping("/changeStatus")
+ public R changeStatus(@RequestBody SysTenantBo bo) {
+ tenantService.checkTenantAllowed(bo.getTenantId());
+ return toAjax(tenantService.updateTenantStatus(bo));
+ }
+
+ /**
+ * 删除租户
+ *
+ * @param ids 主键串
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @SaCheckPermission("system:tenant:remove")
+ @Log(title = "租户", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(tenantService.deleteWithValidByIds(Arrays.asList(ids), true));
+ }
+
+ /**
+ * 动态切换租户
+ *
+ * @param tenantId 租户ID
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @GetMapping("/dynamic/{tenantId}")
+ public R dynamicTenant(@NotBlank(message = "租户ID不能为空") @PathVariable String tenantId) {
+ TenantHelper.setDynamic(tenantId);
+ return R.ok();
+ }
+
+ /**
+ * 清除动态租户
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @GetMapping("/dynamic/clear")
+ public R dynamicClear() {
+ TenantHelper.clearDynamic();
+ return R.ok();
+ }
+
+
+ /**
+ * 同步租户套餐
+ *
+ * @param tenantId 租户id
+ * @param packageId 套餐id
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @SaCheckPermission("system:tenant:edit")
+ @Log(title = "租户", businessType = BusinessType.UPDATE)
+ @GetMapping("/syncTenantPackage")
+ public R syncTenantPackage(@NotBlank(message = "租户ID不能为空") String tenantId,
+ @NotNull(message = "套餐ID不能为空") Long packageId) {
+ return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId)));
+ }
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysTenantPackageController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysTenantPackageController.java
new file mode 100644
index 0000000..a0f9483
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysTenantPackageController.java
@@ -0,0 +1,135 @@
+package com.ruoyi.system.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.annotation.SaCheckRole;
+import com.ruoyi.component.core.constant.TenantConstants;
+import com.ruoyi.component.core.domain.R;
+import com.ruoyi.component.core.validate.AddGroup;
+import com.ruoyi.component.core.validate.EditGroup;
+import com.ruoyi.component.excel.utils.ExcelUtil;
+import com.ruoyi.component.idempotent.annotation.RepeatSubmit;
+import com.ruoyi.component.log.annotation.Log;
+import com.ruoyi.component.log.enums.BusinessType;
+import com.ruoyi.component.mybatis.core.page.PageQuery;
+import com.ruoyi.component.mybatis.core.page.TableDataInfo;
+import com.ruoyi.component.web.core.BaseController;
+import com.ruoyi.system.domain.bo.SysTenantPackageBo;
+import com.ruoyi.system.domain.vo.SysTenantPackageVo;
+import com.ruoyi.system.service.ISysTenantPackageService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 租户套餐管理
+ *
+ * @author Michelle.Chung
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/tenant/package")
+public class SysTenantPackageController extends BaseController {
+
+ private final ISysTenantPackageService tenantPackageService;
+
+ /**
+ * 查询租户套餐列表
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @SaCheckPermission("system:tenantPackage:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SysTenantPackageBo bo, PageQuery pageQuery) {
+ return tenantPackageService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 查询租户套餐下拉选列表
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @SaCheckPermission("system:tenantPackage:list")
+ @GetMapping("/selectList")
+ public R> selectList() {
+ return R.ok(tenantPackageService.selectList());
+ }
+
+ /**
+ * 导出租户套餐列表
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @SaCheckPermission("system:tenantPackage:export")
+ @Log(title = "租户套餐", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(SysTenantPackageBo bo, HttpServletResponse response) {
+ List list = tenantPackageService.queryList(bo);
+ ExcelUtil.exportExcel(list, "租户套餐", SysTenantPackageVo.class, response);
+ }
+
+ /**
+ * 获取租户套餐详细信息
+ *
+ * @param packageId 主键
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @SaCheckPermission("system:tenantPackage:query")
+ @GetMapping("/{packageId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long packageId) {
+ return R.ok(tenantPackageService.queryById(packageId));
+ }
+
+ /**
+ * 新增租户套餐
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @SaCheckPermission("system:tenantPackage:add")
+ @Log(title = "租户套餐", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody SysTenantPackageBo bo) {
+ return toAjax(tenantPackageService.insertByBo(bo));
+ }
+
+ /**
+ * 修改租户套餐
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @SaCheckPermission("system:tenantPackage:edit")
+ @Log(title = "租户套餐", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody SysTenantPackageBo bo) {
+ return toAjax(tenantPackageService.updateByBo(bo));
+ }
+
+ /**
+ * 状态修改
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @SaCheckPermission("system:tenantPackage:edit")
+ @Log(title = "租户套餐", businessType = BusinessType.UPDATE)
+ @PutMapping("/changeStatus")
+ public R changeStatus(@RequestBody SysTenantPackageBo bo) {
+ return toAjax(tenantPackageService.updatePackageStatus(bo));
+ }
+
+ /**
+ * 删除租户套餐
+ *
+ * @param packageIds 主键串
+ */
+ @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+ @SaCheckPermission("system:tenantPackage:remove")
+ @Log(title = "租户套餐", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{packageIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] packageIds) {
+ return toAjax(tenantPackageService.deleteWithValidByIds(Arrays.asList(packageIds), true));
+ }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
similarity index 99%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
index 6a0ce72..f777a4b 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system;
+package com.ruoyi.system.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.secure.BCrypt;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/monitor/CacheController.java
similarity index 99%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/monitor/CacheController.java
index 9e6bf10..928d4df 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/monitor/CacheController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.monitor;
+package com.ruoyi.system.controller.monitor;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.collection.CollUtil;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/monitor/SysLogininforController.java
similarity index 98%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/monitor/SysLogininforController.java
index d41ad46..b214db3 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/monitor/SysLogininforController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.monitor;
+package com.ruoyi.system.controller.monitor;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.ruoyi.component.core.constant.CacheConstants;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/monitor/SysOperlogController.java
similarity index 98%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/monitor/SysOperlogController.java
index 6688307..da8226f 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/monitor/SysOperlogController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.monitor;
+package com.ruoyi.system.controller.monitor;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.ruoyi.component.core.domain.R;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java b/ruoyi-system/src/main/java/com/ruoyi/system/controller/monitor/SysUserOnlineController.java
similarity index 98%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/controller/monitor/SysUserOnlineController.java
index fef4df9..2caccbe 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/controller/monitor/SysUserOnlineController.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.monitor;
+package com.ruoyi.system.controller.monitor;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.exception.NotLoginException;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java
index 51b8ad9..3f49e08 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java
@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.component.excel.annotation.ExcelDictFormat;
import com.ruoyi.component.excel.convert.ExcelDictConvert;
import com.ruoyi.component.mybatis.core.domain.BaseEntity;
+import com.ruoyi.component.tenant.core.TenantEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -23,7 +24,7 @@ import javax.validation.constraints.Size;
@EqualsAndHashCode(callSuper = true)
@TableName("sys_config")
@ExcelIgnoreUnannotated
-public class SysConfig extends BaseEntity {
+public class SysConfig extends TenantEntity {
/**
* 参数主键
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysDept.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysDept.java
index fda28ed..4155f90 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysDept.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysDept.java
@@ -77,4 +77,8 @@ public class SysDept extends TreeEntity {
*/
private String ancestors;
+ /**
+ * 租户编号
+ */
+ private String tenantId;
}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysDictData.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysDictData.java
index ed27310..13e7a80 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysDictData.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysDictData.java
@@ -8,6 +8,7 @@ import com.ruoyi.component.core.constant.UserConstants;
import com.ruoyi.component.excel.annotation.ExcelDictFormat;
import com.ruoyi.component.excel.convert.ExcelDictConvert;
import com.ruoyi.component.mybatis.core.domain.BaseEntity;
+import com.ruoyi.component.tenant.core.TenantEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -24,7 +25,7 @@ import javax.validation.constraints.Size;
@EqualsAndHashCode(callSuper = true)
@TableName("sys_dict_data")
@ExcelIgnoreUnannotated
-public class SysDictData extends BaseEntity {
+public class SysDictData extends TenantEntity {
/**
* 字典编码
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysDictType.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysDictType.java
index 25274f7..55274cc 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysDictType.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysDictType.java
@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.component.excel.annotation.ExcelDictFormat;
import com.ruoyi.component.excel.convert.ExcelDictConvert;
import com.ruoyi.component.mybatis.core.domain.BaseEntity;
+import com.ruoyi.component.tenant.core.TenantEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -24,7 +25,7 @@ import javax.validation.constraints.Size;
@EqualsAndHashCode(callSuper = true)
@TableName("sys_dict_type")
@ExcelIgnoreUnannotated
-public class SysDictType extends BaseEntity {
+public class SysDictType extends TenantEntity {
/**
* 字典主键
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRole.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRole.java
index 9bb37de..b9cccf7 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRole.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRole.java
@@ -10,6 +10,7 @@ import com.ruoyi.component.core.constant.UserConstants;
import com.ruoyi.component.excel.annotation.ExcelDictFormat;
import com.ruoyi.component.excel.convert.ExcelDictConvert;
import com.ruoyi.component.mybatis.core.domain.BaseEntity;
+import com.ruoyi.component.tenant.core.TenantEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@@ -29,7 +30,7 @@ import javax.validation.constraints.Size;
@EqualsAndHashCode(callSuper = true)
@TableName("sys_role")
@ExcelIgnoreUnannotated
-public class SysRole extends BaseEntity {
+public class SysRole extends TenantEntity {
/**
* 角色ID
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTenant.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTenant.java
new file mode 100644
index 0000000..aba9d25
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTenant.java
@@ -0,0 +1,101 @@
+package com.ruoyi.system.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.component.mybatis.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 租户对象 sys_tenant
+ *
+ * @author Michelle.Chung
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_tenant")
+public class SysTenant extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * id
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 租户编号
+ */
+ private String tenantId;
+
+ /**
+ * 联系人
+ */
+ private String contactUserName;
+
+ /**
+ * 联系电话
+ */
+ private String contactPhone;
+
+ /**
+ * 企业名称
+ */
+ private String companyName;
+
+ /**
+ * 统一社会信用代码
+ */
+ private String licenseNumber;
+
+ /**
+ * 地址
+ */
+ private String address;
+
+ /**
+ * 域名
+ */
+ private String domain;
+
+ /**
+ * 企业简介
+ */
+ private String intro;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 租户套餐编号
+ */
+ private Long packageId;
+
+ /**
+ * 过期时间
+ */
+ private Date expireTime;
+
+ /**
+ * 用户数量(-1不限制)
+ */
+ private Long accountCount;
+
+ /**
+ * 租户状态(0正常 1停用)
+ */
+ private String status;
+
+ /**
+ * 删除标志(0代表存在 2代表删除)
+ */
+ @TableLogic
+ private String delFlag;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTenantPackage.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTenantPackage.java
new file mode 100644
index 0000000..d3d69bf
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTenantPackage.java
@@ -0,0 +1,53 @@
+package com.ruoyi.system.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.component.mybatis.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 租户套餐对象 sys_tenant_package
+ *
+ * @author Michelle.Chung
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_tenant_package")
+public class SysTenantPackage extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 租户套餐id
+ */
+ @TableId(value = "package_id")
+ private Long packageId;
+ /**
+ * 套餐名称
+ */
+ private String packageName;
+ /**
+ * 关联菜单id
+ */
+ private String menuIds;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示)
+ */
+ private Boolean menuCheckStrictly;
+ /**
+ * 状态(0正常 1停用)
+ */
+ private String status;
+ /**
+ * 删除标志(0代表存在 2代表删除)
+ */
+ @TableLogic
+ private String delFlag;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUser.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUser.java
index 64f6608..82eb5d8 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUser.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUser.java
@@ -8,6 +8,7 @@ import com.ruoyi.component.core.xss.Xss;
import com.ruoyi.component.mybatis.core.domain.BaseEntity;
import com.ruoyi.component.sensitive.annotation.Sensitive;
import com.ruoyi.component.sensitive.core.SensitiveStrategy;
+import com.ruoyi.component.tenant.core.TenantEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@@ -28,7 +29,7 @@ import java.util.List;
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("sys_user")
-public class SysUser extends BaseEntity {
+public class SysUser extends TenantEntity {
/**
* 用户ID
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysTenantBo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysTenantBo.java
new file mode 100644
index 0000000..edb232d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysTenantBo.java
@@ -0,0 +1,111 @@
+package com.ruoyi.system.domain.bo;
+
+import com.ruoyi.component.core.validate.AddGroup;
+import com.ruoyi.component.core.validate.EditGroup;
+import com.ruoyi.component.mybatis.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * 租户业务对象 sys_tenant
+ *
+ * @author Michelle.Chung
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SysTenantBo extends BaseEntity {
+
+ /**
+ * id
+ */
+ @NotNull(message = "id不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 租户编号
+ */
+ private String tenantId;
+
+ /**
+ * 联系人
+ */
+ @NotBlank(message = "联系人不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String contactUserName;
+
+ /**
+ * 联系电话
+ */
+ @NotBlank(message = "联系电话不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String contactPhone;
+
+ /**
+ * 企业名称
+ */
+ @NotBlank(message = "企业名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String companyName;
+
+ /**
+ * 用户名(创建系统用户)
+ */
+ @NotBlank(message = "用户名不能为空", groups = { AddGroup.class })
+ private String username;
+
+ /**
+ * 密码(创建系统用户)
+ */
+ @NotBlank(message = "密码不能为空", groups = { AddGroup.class })
+ private String password;
+
+ /**
+ * 统一社会信用代码
+ */
+ private String licenseNumber;
+
+ /**
+ * 地址
+ */
+ private String address;
+
+ /**
+ * 域名
+ */
+ private String domain;
+
+ /**
+ * 企业简介
+ */
+ private String intro;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 租户套餐编号
+ */
+ @NotNull(message = "租户套餐不能为空", groups = { AddGroup.class })
+ private Long packageId;
+
+ /**
+ * 过期时间
+ */
+ private Date expireTime;
+
+ /**
+ * 用户数量(-1不限制)
+ */
+ private Long accountCount;
+
+ /**
+ * 租户状态(0正常 1停用)
+ */
+ private String status;
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysTenantPackageBo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysTenantPackageBo.java
new file mode 100644
index 0000000..42d8a1a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysTenantPackageBo.java
@@ -0,0 +1,55 @@
+package com.ruoyi.system.domain.bo;
+
+import com.ruoyi.component.core.validate.AddGroup;
+import com.ruoyi.component.core.validate.EditGroup;
+import com.ruoyi.component.mybatis.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 租户套餐业务对象 sys_tenant_package
+ *
+ * @author Michelle.Chung
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class SysTenantPackageBo extends BaseEntity {
+
+ /**
+ * 租户套餐id
+ */
+ @NotNull(message = "租户套餐id不能为空", groups = { EditGroup.class })
+ private Long packageId;
+
+ /**
+ * 套餐名称
+ */
+ @NotBlank(message = "套餐名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String packageName;
+
+ /**
+ * 关联菜单id
+ */
+ private Long[] menuIds;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 菜单树选择项是否关联显示
+ */
+ private Boolean menuCheckStrictly;
+
+ /**
+ * 状态(0正常 1停用)
+ */
+ private String status;
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysTenantPackageVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysTenantPackageVo.java
new file mode 100644
index 0000000..b84aa23
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysTenantPackageVo.java
@@ -0,0 +1,61 @@
+package com.ruoyi.system.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.component.excel.annotation.ExcelDictFormat;
+import com.ruoyi.component.excel.convert.ExcelDictConvert;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 租户套餐视图对象 sys_tenant_package
+ *
+ * @author Michelle.Chung
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class SysTenantPackageVo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 租户套餐id
+ */
+ @ExcelProperty(value = "租户套餐id")
+ private Long packageId;
+
+ /**
+ * 套餐名称
+ */
+ @ExcelProperty(value = "套餐名称")
+ private String packageName;
+
+ /**
+ * 关联菜单id
+ */
+ @ExcelProperty(value = "关联菜单id")
+ private String menuIds;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+ /**
+ * 菜单树选择项是否关联显示
+ */
+ @ExcelProperty(value = "菜单树选择项是否关联显示")
+ private Boolean menuCheckStrictly;
+
+ /**
+ * 状态(0正常 1停用)
+ */
+ @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+ private String status;
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysTenantVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysTenantVo.java
new file mode 100644
index 0000000..565a1da
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/SysTenantVo.java
@@ -0,0 +1,110 @@
+package com.ruoyi.system.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.component.excel.annotation.ExcelDictFormat;
+import com.ruoyi.component.excel.convert.ExcelDictConvert;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 租户视图对象 sys_tenant
+ *
+ * @author Michelle.Chung
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class SysTenantVo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * id
+ */
+ @ExcelProperty(value = "id")
+ private Long id;
+
+ /**
+ * 租户编号
+ */
+ @ExcelProperty(value = "租户编号")
+ private String tenantId;
+
+ /**
+ * 联系人
+ */
+ @ExcelProperty(value = "联系人")
+ private String contactUserName;
+
+ /**
+ * 联系电话
+ */
+ @ExcelProperty(value = "联系电话")
+ private String contactPhone;
+
+ /**
+ * 企业名称
+ */
+ @ExcelProperty(value = "企业名称")
+ private String companyName;
+
+ /**
+ * 统一社会信用代码
+ */
+ @ExcelProperty(value = "统一社会信用代码")
+ private String licenseNumber;
+
+ /**
+ * 地址
+ */
+ @ExcelProperty(value = "地址")
+ private String address;
+
+ /**
+ * 域名
+ */
+ @ExcelProperty(value = "域名")
+ private String domain;
+
+ /**
+ * 企业简介
+ */
+ @ExcelProperty(value = "企业简介")
+ private String intro;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+ /**
+ * 租户套餐编号
+ */
+ @ExcelProperty(value = "租户套餐编号")
+ private Long packageId;
+
+ /**
+ * 过期时间
+ */
+ @ExcelProperty(value = "过期时间")
+ private Date expireTime;
+
+ /**
+ * 用户数量(-1不限制)
+ */
+ @ExcelProperty(value = "用户数量")
+ private Long accountCount;
+
+ /**
+ * 租户状态(0正常 1停用)
+ */
+ @ExcelProperty(value = "租户状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+ private String status;
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTenantMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTenantMapper.java
new file mode 100644
index 0000000..1011942
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTenantMapper.java
@@ -0,0 +1,15 @@
+package com.ruoyi.system.mapper;
+
+
+import com.ruoyi.component.mybatis.core.mapper.BaseMapperPlus;
+import com.ruoyi.system.domain.SysTenant;
+import com.ruoyi.system.domain.vo.SysTenantVo;
+
+/**
+ * 租户Mapper接口
+ *
+ * @author Michelle.Chung
+ */
+public interface SysTenantMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTenantPackageMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTenantPackageMapper.java
new file mode 100644
index 0000000..98ddd3d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTenantPackageMapper.java
@@ -0,0 +1,14 @@
+package com.ruoyi.system.mapper;
+
+import com.ruoyi.component.mybatis.core.mapper.BaseMapperPlus;
+import com.ruoyi.system.domain.SysTenantPackage;
+import com.ruoyi.system.domain.vo.SysTenantPackageVo;
+
+/**
+ * 租户套餐Mapper接口
+ *
+ * @author Michelle.Chung
+ */
+public interface SysTenantPackageMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTenantPackageService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTenantPackageService.java
new file mode 100644
index 0000000..d8fead8
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTenantPackageService.java
@@ -0,0 +1,57 @@
+package com.ruoyi.system.service;
+
+import com.ruoyi.component.mybatis.core.page.PageQuery;
+import com.ruoyi.component.mybatis.core.page.TableDataInfo;
+import com.ruoyi.system.domain.bo.SysTenantPackageBo;
+import com.ruoyi.system.domain.vo.SysTenantPackageVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 租户套餐Service接口
+ *
+ * @author Michelle.Chung
+ */
+public interface ISysTenantPackageService {
+
+ /**
+ * 查询租户套餐
+ */
+ SysTenantPackageVo queryById(Long packageId);
+
+ /**
+ * 查询租户套餐列表
+ */
+ TableDataInfo queryPageList(SysTenantPackageBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询租户套餐已启用列表
+ */
+ List selectList();
+
+ /**
+ * 查询租户套餐列表
+ */
+ List queryList(SysTenantPackageBo bo);
+
+ /**
+ * 新增租户套餐
+ */
+ Boolean insertByBo(SysTenantPackageBo bo);
+
+ /**
+ * 修改租户套餐
+ */
+ Boolean updateByBo(SysTenantPackageBo bo);
+
+ /**
+ * 修改套餐状态
+ */
+ int updatePackageStatus(SysTenantPackageBo bo);
+
+ /**
+ * 校验并批量删除租户套餐信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTenantService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTenantService.java
new file mode 100644
index 0000000..7074e9b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTenantService.java
@@ -0,0 +1,82 @@
+package com.ruoyi.system.service;
+
+import com.ruoyi.component.mybatis.core.page.PageQuery;
+import com.ruoyi.component.mybatis.core.page.TableDataInfo;
+import com.ruoyi.system.domain.bo.SysTenantBo;
+import com.ruoyi.system.domain.vo.SysTenantVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 租户Service接口
+ *
+ * @author Michelle.Chung
+ */
+public interface ISysTenantService {
+
+ /**
+ * 查询租户
+ */
+ SysTenantVo queryById(Long id);
+
+ /**
+ * 基于租户ID查询租户
+ */
+ SysTenantVo queryByTenantId(String tenantId);
+
+ /**
+ * 查询租户列表
+ */
+ TableDataInfo queryPageList(SysTenantBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询租户列表
+ */
+ List queryList(SysTenantBo bo);
+
+ /**
+ * 新增租户
+ */
+ Boolean insertByBo(SysTenantBo bo);
+
+ /**
+ * 修改租户
+ */
+ Boolean updateByBo(SysTenantBo bo);
+
+ /**
+ * 修改租户状态
+ */
+ int updateTenantStatus(SysTenantBo bo);
+
+ /**
+ * 校验租户是否允许操作
+ */
+ void checkTenantAllowed(String tenantId);
+
+ /**
+ * 校验并批量删除租户信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+
+ /**
+ * 校验企业名称是否唯一
+ */
+ boolean checkCompanyNameUnique(SysTenantBo bo);
+
+ /**
+ * 校验账号余额
+ */
+ boolean checkAccountBalance(String tenantId);
+
+ /**
+ * 校验有效期
+ */
+ boolean checkExpireTime(String tenantId);
+
+ /**
+ * 同步租户套餐
+ */
+ Boolean syncTenantPackage(String tenantId, Long packageId);
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTenantPackageServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTenantPackageServiceImpl.java
new file mode 100644
index 0000000..23b006b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTenantPackageServiceImpl.java
@@ -0,0 +1,146 @@
+package com.ruoyi.system.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.component.core.constant.TenantConstants;
+import com.ruoyi.component.core.exception.ServiceException;
+import com.ruoyi.component.core.util.BeanConvertUtil;
+import com.ruoyi.component.core.util.StringUtils;
+import com.ruoyi.component.mybatis.core.page.PageQuery;
+import com.ruoyi.component.mybatis.core.page.TableDataInfo;
+import com.ruoyi.system.domain.SysTenant;
+import com.ruoyi.system.domain.SysTenantPackage;
+import com.ruoyi.system.domain.bo.SysTenantPackageBo;
+import com.ruoyi.system.domain.vo.SysTenantPackageVo;
+import com.ruoyi.system.mapper.SysTenantMapper;
+import com.ruoyi.system.mapper.SysTenantPackageMapper;
+import com.ruoyi.system.service.ISysTenantPackageService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 租户套餐Service业务层处理
+ *
+ * @author Michelle.Chung
+ */
+@Service
+public class SysTenantPackageServiceImpl implements ISysTenantPackageService {
+
+ @Resource
+ private SysTenantPackageMapper baseMapper;
+ @Resource
+ private SysTenantMapper tenantMapper;
+
+ /**
+ * 查询租户套餐
+ */
+ @Override
+ public SysTenantPackageVo queryById(Long packageId){
+ return baseMapper.selectVoById(packageId);
+ }
+
+ /**
+ * 查询租户套餐列表
+ */
+ @Override
+ public TableDataInfo queryPageList(SysTenantPackageBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ @Override
+ public List selectList() {
+ return baseMapper.selectVoList(new LambdaQueryWrapper()
+ .eq(SysTenantPackage::getStatus, TenantConstants.NORMAL));
+ }
+
+ /**
+ * 查询租户套餐列表
+ */
+ @Override
+ public List queryList(SysTenantPackageBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(SysTenantPackageBo bo) {
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.like(StringUtils.isNotBlank(bo.getPackageName()), SysTenantPackage::getPackageName, bo.getPackageName());
+ lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenantPackage::getStatus, bo.getStatus());
+ lqw.orderByAsc(SysTenantPackage::getPackageId);
+ return lqw;
+ }
+
+ /**
+ * 新增租户套餐
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Boolean insertByBo(SysTenantPackageBo bo) {
+ SysTenantPackage add = BeanConvertUtil.convertTo(bo, SysTenantPackage::new);
+ // 保存菜单id
+ List menuIds = Arrays.asList(bo.getMenuIds());
+ if (CollUtil.isNotEmpty(menuIds)) {
+ add.setMenuIds(StringUtils.join(menuIds, ", "));
+ } else {
+ add.setMenuIds("");
+ }
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setPackageId(add.getPackageId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改租户套餐
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Boolean updateByBo(SysTenantPackageBo bo) {
+ SysTenantPackage update = BeanConvertUtil.convertTo(bo, SysTenantPackage::new);
+ // 保存菜单id
+ List menuIds = Arrays.asList(bo.getMenuIds());
+ if (CollUtil.isNotEmpty(menuIds)) {
+ update.setMenuIds(StringUtils.join(menuIds, ", "));
+ } else {
+ update.setMenuIds("");
+ }
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 修改套餐状态
+ *
+ * @param bo 套餐信息
+ * @return 结果
+ */
+ @Override
+ public int updatePackageStatus(SysTenantPackageBo bo) {
+ SysTenantPackage tenantPackage = BeanConvertUtil.convertTo(bo, SysTenantPackage::new);
+ return baseMapper.updateById(tenantPackage);
+ }
+
+ /**
+ * 批量删除租户套餐
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ boolean exists = tenantMapper.exists(new LambdaQueryWrapper().in(SysTenant::getPackageId, ids));
+ if (exists) {
+ throw new ServiceException("租户套餐已被使用");
+ }
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTenantServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTenantServiceImpl.java
new file mode 100644
index 0000000..943c887
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTenantServiceImpl.java
@@ -0,0 +1,382 @@
+package com.ruoyi.system.service.impl;
+
+import cn.dev33.satoken.secure.BCrypt;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.RandomUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.component.core.constant.CacheNames;
+import com.ruoyi.component.core.constant.Constants;
+import com.ruoyi.component.core.constant.TenantConstants;
+import com.ruoyi.component.core.exception.ServiceException;
+import com.ruoyi.component.core.util.BeanConvertUtil;
+import com.ruoyi.component.core.util.StringUtils;
+import com.ruoyi.component.core.util.spring.SpringUtils;
+import com.ruoyi.component.mybatis.core.page.PageQuery;
+import com.ruoyi.component.mybatis.core.page.TableDataInfo;
+import com.ruoyi.system.domain.*;
+import com.ruoyi.system.domain.bo.SysTenantBo;
+import com.ruoyi.system.domain.vo.SysTenantVo;
+import com.ruoyi.system.mapper.*;
+import com.ruoyi.system.service.ISysTenantService;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 租户Service业务层处理
+ *
+ * @author Michelle.Chung
+ */
+@Service
+public class SysTenantServiceImpl implements ISysTenantService {
+
+ @Resource
+ private SysTenantMapper baseMapper;
+ @Resource
+ private SysTenantPackageMapper tenantPackageMapper;
+ @Resource
+ private SysUserMapper userMapper;
+ @Resource
+ private SysDeptMapper deptMapper;
+ @Resource
+ private SysRoleMapper roleMapper;
+ @Resource
+ private SysRoleMenuMapper roleMenuMapper;
+ @Resource
+ private SysRoleDeptMapper roleDeptMapper;
+ @Resource
+ private SysUserRoleMapper userRoleMapper;
+ @Resource
+ private SysDictTypeMapper dictTypeMapper;
+ @Resource
+ private SysDictDataMapper dictDataMapper;
+ @Resource
+ private SysConfigMapper configMapper;
+
+ /**
+ * 查询租户
+ */
+ @Override
+ public SysTenantVo queryById(Long id) {
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 基于租户ID查询租户
+ */
+ @Cacheable(cacheNames = CacheNames.SYS_TENANT, key = "#tenantId")
+ @Override
+ public SysTenantVo queryByTenantId(String tenantId) {
+ return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysTenant::getTenantId, tenantId));
+ }
+
+ /**
+ * 查询租户列表
+ */
+ @Override
+ public TableDataInfo queryPageList(SysTenantBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询租户列表
+ */
+ @Override
+ public List queryList(SysTenantBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(SysTenantBo bo) {
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(StringUtils.isNotBlank(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId());
+ lqw.like(StringUtils.isNotBlank(bo.getContactUserName()), SysTenant::getContactUserName, bo.getContactUserName());
+ lqw.eq(StringUtils.isNotBlank(bo.getContactPhone()), SysTenant::getContactPhone, bo.getContactPhone());
+ lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), SysTenant::getCompanyName, bo.getCompanyName());
+ lqw.eq(StringUtils.isNotBlank(bo.getLicenseNumber()), SysTenant::getLicenseNumber, bo.getLicenseNumber());
+ lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysTenant::getAddress, bo.getAddress());
+ lqw.eq(StringUtils.isNotBlank(bo.getIntro()), SysTenant::getIntro, bo.getIntro());
+ lqw.like(StringUtils.isNotBlank(bo.getDomain()), SysTenant::getDomain, bo.getDomain());
+ lqw.eq(bo.getPackageId() != null, SysTenant::getPackageId, bo.getPackageId());
+ lqw.eq(bo.getExpireTime() != null, SysTenant::getExpireTime, bo.getExpireTime());
+ lqw.eq(bo.getAccountCount() != null, SysTenant::getAccountCount, bo.getAccountCount());
+ lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenant::getStatus, bo.getStatus());
+ lqw.orderByAsc(SysTenant::getId);
+ return lqw;
+ }
+
+ /**
+ * 新增租户
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Boolean insertByBo(SysTenantBo bo) {
+ SysTenant add = BeanConvertUtil.convertTo(bo, SysTenant::new);
+
+ // 获取所有租户编号
+ List tenantIds = baseMapper.selectObjs(
+ new LambdaQueryWrapper().select(SysTenant::getTenantId));
+ String tenantId = generateTenantId(tenantIds);
+ add.setTenantId(tenantId);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (!flag) {
+ throw new ServiceException("创建租户失败");
+ }
+ bo.setId(add.getId());
+
+ // 根据套餐创建角色
+ Long roleId = createTenantRole(tenantId, bo.getPackageId());
+
+ // 创建部门: 公司名是部门名称
+ SysDept dept = new SysDept();
+ dept.setTenantId(tenantId);
+ dept.setDeptName(bo.getCompanyName());
+ dept.setParentId(Constants.TOP_PARENT_ID);
+ dept.setAncestors(Constants.TOP_PARENT_ID.toString());
+ deptMapper.insert(dept);
+ Long deptId = dept.getDeptId();
+
+ // 角色和部门关联表
+ SysRoleDept roleDept = new SysRoleDept();
+ roleDept.setRoleId(roleId);
+ roleDept.setDeptId(deptId);
+ roleDeptMapper.insert(roleDept);
+
+ // 创建系统用户
+ SysUser user = new SysUser();
+ user.setTenantId(tenantId);
+ user.setUserName(bo.getUsername());
+ user.setNickName(bo.getUsername());
+ user.setPassword(BCrypt.hashpw(bo.getPassword()));
+ user.setDeptId(deptId);
+ userMapper.insert(user);
+ //新增系统用户后,默认当前用户为部门的负责人
+ SysDept sd = new SysDept();
+ sd.setLeader(user.getUserName());
+ sd.setDeptId(deptId);
+ deptMapper.updateById(sd);
+
+ // 用户和角色关联表
+ SysUserRole userRole = new SysUserRole();
+ userRole.setUserId(user.getUserId());
+ userRole.setRoleId(roleId);
+ userRoleMapper.insert(userRole);
+
+ String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID;
+ List dictTypeList = dictTypeMapper.selectList(
+ new LambdaQueryWrapper().eq(SysDictType::getTenantId, defaultTenantId));
+ List dictDataList = dictDataMapper.selectList(
+ new LambdaQueryWrapper().eq(SysDictData::getTenantId, defaultTenantId));
+ for (SysDictType dictType : dictTypeList) {
+ dictType.setDictId(null);
+ dictType.setTenantId(tenantId);
+ }
+ for (SysDictData dictData : dictDataList) {
+ dictData.setDictCode(null);
+ dictData.setTenantId(tenantId);
+ }
+ dictTypeMapper.insertBatch(dictTypeList);
+ dictDataMapper.insertBatch(dictDataList);
+
+ List sysConfigList = configMapper.selectList(
+ new LambdaQueryWrapper().eq(SysConfig::getTenantId, defaultTenantId));
+ for (SysConfig config : sysConfigList) {
+ config.setConfigId(null);
+ config.setTenantId(tenantId);
+ }
+ configMapper.insertBatch(sysConfigList);
+ return true;
+ }
+
+ /**
+ * 生成租户id
+ *
+ * @param tenantIds 已有租户id列表
+ * @return 租户id
+ */
+ private String generateTenantId(List tenantIds) {
+ // 随机生成6位
+ String numbers = RandomUtil.randomNumbers(6);
+ // 判断是否存在,如果存在则重新生成
+ if (tenantIds.contains(numbers)) {
+ generateTenantId(tenantIds);
+ }
+ return numbers;
+ }
+
+ /**
+ * 根据租户菜单创建租户角色
+ *
+ * @param tenantId 租户编号
+ * @param packageId 租户套餐id
+ * @return 角色id
+ */
+ private Long createTenantRole(String tenantId, Long packageId) {
+ // 获取租户套餐
+ SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId);
+ if (ObjectUtil.isNull(tenantPackage)) {
+ throw new ServiceException("套餐不存在");
+ }
+ // 获取套餐菜单id
+ List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong);
+
+ // 创建角色
+ SysRole role = new SysRole();
+ role.setTenantId(tenantId);
+ role.setRoleName(TenantConstants.TENANT_ADMIN_ROLE_NAME);
+ role.setRoleKey(TenantConstants.TENANT_ADMIN_ROLE_KEY);
+ role.setRoleSort(1);
+ role.setStatus(TenantConstants.NORMAL);
+ roleMapper.insert(role);
+ Long roleId = role.getRoleId();
+
+ // 创建角色菜单
+ List roleMenus = new ArrayList<>(menuIds.size());
+ menuIds.forEach(menuId -> {
+ SysRoleMenu roleMenu = new SysRoleMenu();
+ roleMenu.setRoleId(roleId);
+ roleMenu.setMenuId(menuId);
+ roleMenus.add(roleMenu);
+ });
+ roleMenuMapper.insertBatch(roleMenus);
+
+ return roleId;
+ }
+
+ /**
+ * 修改租户
+ */
+ @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId")
+ @Override
+ public Boolean updateByBo(SysTenantBo bo) {
+ SysTenant tenant = BeanConvertUtil.convertTo(bo, SysTenant::new);
+ tenant.setTenantId(null);
+ tenant.setPackageId(null);
+ return baseMapper.updateById(tenant) > 0;
+ }
+
+ /**
+ * 修改租户状态
+ *
+ * @param bo 租户信息
+ * @return 结果
+ */
+ @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId")
+ @Override
+ public int updateTenantStatus(SysTenantBo bo) {
+ SysTenant tenant = BeanConvertUtil.convertTo(bo, SysTenant::new);
+ return baseMapper.updateById(tenant);
+ }
+
+ /**
+ * 校验租户是否允许操作
+ *
+ * @param tenantId 租户ID
+ */
+ @Override
+ public void checkTenantAllowed(String tenantId) {
+ if (ObjectUtil.isNotNull(tenantId) && TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) {
+ throw new ServiceException("不允许操作管理租户");
+ }
+ }
+
+ /**
+ * 批量删除租户
+ */
+ @CacheEvict(cacheNames = CacheNames.SYS_TENANT, allEntries = true)
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if (isValid) {
+ // 做一些业务上的校验,判断是否需要校验
+ if (ids.contains(TenantConstants.SUPER_ADMIN_ID)) {
+ throw new ServiceException("超管租户不能删除");
+ }
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+
+ /**
+ * 校验企业名称是否唯一
+ */
+ @Override
+ public boolean checkCompanyNameUnique(SysTenantBo bo) {
+ boolean exist = baseMapper.exists(new LambdaQueryWrapper()
+ .eq(SysTenant::getCompanyName, bo.getCompanyName())
+ .ne(ObjectUtil.isNotNull(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId()));
+ return !exist;
+ }
+
+ /**
+ * 校验账号余额
+ */
+ @Override
+ public boolean checkAccountBalance(String tenantId) {
+ SysTenantVo tenant = SpringUtils.getAopProxy(this).queryByTenantId(tenantId);
+ // 如果余额为-1代表不限制
+ if (tenant.getAccountCount() == -1) {
+ return true;
+ }
+ Long userNumber = userMapper.selectCount(new LambdaQueryWrapper<>());
+ // 如果余额大于0代表还有可用名额
+ return tenant.getAccountCount() - userNumber > 0;
+ }
+
+ /**
+ * 校验有效期
+ */
+ @Override
+ public boolean checkExpireTime(String tenantId) {
+ SysTenantVo tenant = SpringUtils.getAopProxy(this).queryByTenantId(tenantId);
+ // 如果未设置过期时间代表不限制
+ if (ObjectUtil.isNull(tenant.getExpireTime())) {
+ return true;
+ }
+ // 如果当前时间在过期时间之前则通过
+ return new Date().before(tenant.getExpireTime());
+ }
+
+ /**
+ * 同步租户套餐
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Boolean syncTenantPackage(String tenantId, Long packageId) {
+ SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId);
+ List roles = roleMapper.selectList(
+ new LambdaQueryWrapper().eq(SysRole::getTenantId, tenantId));
+ List roleIds = new ArrayList<>(roles.size() - 1);
+ List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong);
+ roles.forEach(item -> {
+ if (TenantConstants.TENANT_ADMIN_ROLE_KEY.equals(item.getRoleKey())) {
+ List roleMenus = new ArrayList<>(menuIds.size());
+ menuIds.forEach(menuId -> {
+ SysRoleMenu roleMenu = new SysRoleMenu();
+ roleMenu.setRoleId(item.getRoleId());
+ roleMenu.setMenuId(menuId);
+ roleMenus.add(roleMenu);
+ });
+ roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, item.getRoleId()));
+ roleMenuMapper.insertBatch(roleMenus);
+ } else {
+ roleIds.add(item.getRoleId());
+ }
+ });
+ if (!roleIds.isEmpty()) {
+ roleMenuMapper.delete(
+ new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), SysRoleMenu::getMenuId, menuIds));
+ }
+ return true;
+ }
+}