diff --git a/muyu-common/muyu-common-core/src/main/java/com/muyu/common/core/exception/ServiceException.java b/muyu-common/muyu-common-core/src/main/java/com/muyu/common/core/exception/ServiceException.java
index 5039bc0..6b5941b 100644
--- a/muyu-common/muyu-common-core/src/main/java/com/muyu/common/core/exception/ServiceException.java
+++ b/muyu-common/muyu-common-core/src/main/java/com/muyu/common/core/exception/ServiceException.java
@@ -5,7 +5,7 @@ package com.muyu.common.core.exception;
*
* @author muyu
*/
-public final class ServiceException extends RuntimeException {
+public class ServiceException extends RuntimeException {
private static final long serialVersionUID = 1L;
/**
diff --git a/muyu-common/muyu-common-saas/pom.xml b/muyu-common/muyu-common-saas/pom.xml
new file mode 100644
index 0000000..0f5f375
--- /dev/null
+++ b/muyu-common/muyu-common-saas/pom.xml
@@ -0,0 +1,32 @@
+
+
+ 4.0.0
+
+ com.muyu
+ muyu-common
+ 3.6.3
+
+
+ muyu-common-saas
+
+ SaaS公共依赖
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+ com.muyu
+ muyu-common-datasource
+
+
+ com.muyu
+ muyu-common-security
+
+
+
diff --git a/muyu-common/muyu-common-saas/src/main/java/com/muyu/common/many/datasource/ManyDataSource.java b/muyu-common/muyu-common-saas/src/main/java/com/muyu/common/many/datasource/ManyDataSource.java
new file mode 100644
index 0000000..00da02d
--- /dev/null
+++ b/muyu-common/muyu-common-saas/src/main/java/com/muyu/common/many/datasource/ManyDataSource.java
@@ -0,0 +1,85 @@
+package com.muyu.common.many.datasource;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.muyu.common.core.utils.SpringUtils;
+import com.muyu.common.many.datasource.domain.model.DataSourceInfo;
+import com.muyu.common.many.datasource.factory.DruidDataSourceFactory;
+import com.muyu.common.saas.domain.model.EnterPriseInfo;
+import com.muyu.common.many.datasource.role.DynamicDataSource;
+import lombok.AllArgsConstructor;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 多数据源 ManyDataSource
+ *
+ * @author DeKangLiu
+ * Date 2024/6/3 20:01
+ */
+@Component
+@Log4j2
+@AllArgsConstructor
+public class ManyDataSource {
+
+ @PostConstruct
+ public void init(){
+ new Thread(()->{
+ try {
+ Thread.sleep(10000);
+ } catch (InterruptedException ignored) {}
+ DruidDataSourceFactory druidDataSourceFactory= SpringUtils.getBean(DruidDataSourceFactory.class);
+ DynamicDataSource dynamicDataSource= SpringUtils.getBean(DynamicDataSource.class);
+ EnterPriseInfo enterPriseInfo = EnterPriseInfo.builder()
+ .entCode("liu_0603")
+ .ip("192.168.116.129")
+ .port(3308)
+ .build();
+
+ DataSourceInfo dataSourceInfo = DataSourceInfo.hostAndPortBuild(enterPriseInfo.getEntCode(), enterPriseInfo.getIp(), enterPriseInfo.getPort());
+ DruidDataSource druidDataSource = druidDataSourceFactory.create(dataSourceInfo);
+ dynamicDataSource.put(dataSourceInfo.getKey(), druidDataSource);
+ }).start();
+ }
+
+
+ private List dataSourceInfoList(){
+ List list = new ArrayList<>();
+ list.add(
+ EnterPriseInfo.builder()
+ .entCode("liu_0604")
+ .ip("192.168.116.129")
+ .port(3307)
+ .build()
+ );
+ return list;
+ }
+
+ @Bean
+ @Primary
+ public DynamicDataSource dynamicDataSource(DruidDataSourceFactory druidDataSourceFactory) {
+
+ //企业列表 企业CODE 端口 ip
+ Map