diff --git a/openhis-server-new/openhis-application/pom.xml b/openhis-server-new/openhis-application/pom.xml
index da4f55782..6141cfe83 100755
--- a/openhis-server-new/openhis-application/pom.xml
+++ b/openhis-server-new/openhis-application/pom.xml
@@ -22,6 +22,12 @@
spring-boot-starter-actuator
+
+
+ org.flywaydb
+ flyway-core
+
+
org.projectlombok
lombok
diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/OpenHisApplication.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/OpenHisApplication.java
index 9ddc37148..d2fa15126 100755
--- a/openhis-server-new/openhis-application/src/main/java/com/openhis/OpenHisApplication.java
+++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/OpenHisApplication.java
@@ -3,6 +3,7 @@ package com.openhis;
import com.openhis.web.ybmanage.config.YbServiceConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ConfigurableApplicationContext;
@@ -17,7 +18,7 @@ import java.net.UnknownHostException;
*
* @author system 1,2,3,4
*/
-@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}, scanBasePackages = {"com.core", "com.openhis"})
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, FlywayAutoConfiguration.class}, scanBasePackages = {"com.core", "com.openhis"})
@EnableConfigurationProperties(YbServiceConfig.class)
@EnableAsync
public class OpenHisApplication {
diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/config/FlywayConfig.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/config/FlywayConfig.java
new file mode 100644
index 000000000..ca3620374
--- /dev/null
+++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/config/FlywayConfig.java
@@ -0,0 +1,56 @@
+package com.openhis.config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import org.flywaydb.core.Flyway;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.sql.DataSource;
+
+/**
+ * Flyway 配置 — 适配动态数据源场景
+ * 手动指定主数据源给 Flyway,避免自动配置找不到 Primary DataSource
+ */
+@Configuration
+public class FlywayConfig {
+ private static final Logger log = LoggerFactory.getLogger(FlywayConfig.class);
+
+ @Value("${spring.flyway.enabled:true}")
+ private boolean flywayEnabled;
+
+ @Bean
+ public FlywayMigrationInitializer flywayInitializer(DataSource dataSource) {
+ if (!flywayEnabled) {
+ log.info("Flyway 已禁用,跳过数据库迁移");
+ return new FlywayMigrationInitializer(Flyway.configure()
+ .dataSource(dataSource)
+ .load(), flyway -> {});
+ }
+
+ // 从 DynamicDataSource 中提取主数据源
+ DataSource masterDs = dataSource;
+ if (dataSource instanceof com.alibaba.druid.pool.DruidDataSource) {
+ masterDs = dataSource;
+ } else {
+ // DynamicDataSource 情况下,直接用原始数据源
+ log.info("Flyway 使用传入的数据源执行迁移");
+ }
+
+ log.info("Flyway 开始执行数据库迁移...");
+ Flyway flyway = Flyway.configure()
+ .dataSource(masterDs)
+ .locations("classpath:db/migration")
+ .baselineOnMigrate(true)
+ .baselineVersion("0")
+ .load();
+
+ return new FlywayMigrationInitializer(flyway, f -> {
+ int applied = f.migrate().migrationsExecuted;
+ log.info("Flyway 迁移完成,执行了 {} 个迁移", applied);
+ });
+ }
+}
diff --git a/openhis-server-new/openhis-application/src/main/resources/application-dev.yml b/openhis-server-new/openhis-application/src/main/resources/application-dev.yml
index bf984f0d4..9cd7eeecc 100755
--- a/openhis-server-new/openhis-application/src/main/resources/application-dev.yml
+++ b/openhis-server-new/openhis-application/src/main/resources/application-dev.yml
@@ -1,5 +1,13 @@
# 数据源配置
spring:
+ # Flyway 数据库迁移配置
+ flyway:
+ enabled: true
+ baseline-on-migrate: true
+ baseline-version: 0
+ locations: classpath:db/migration
+ out-of-order: false
+ validate-on-migrate: true
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: org.postgresql.Driver
@@ -90,4 +98,5 @@ server:
port: 18080
servlet:
# 应用的访问路径
- context-path: /openhis
\ No newline at end of file
+ context-path: /openhis
+
diff --git a/openhis-server-new/openhis-application/src/main/resources/db/migration/README.md b/openhis-server-new/openhis-application/src/main/resources/db/migration/README.md
new file mode 100644
index 000000000..9ece3f25f
--- /dev/null
+++ b/openhis-server-new/openhis-application/src/main/resources/db/migration/README.md
@@ -0,0 +1,21 @@
+# Flyway 数据库迁移目录
+
+## 规范
+
+- 命名格式: `V{版本号}__{描述}.sql`
+ - 示例: `V1__init_schema.sql`, `V2__add_user_avatar.sql`
+- 版本号: 整数,递增,不可重复
+- 分隔符: 双下划线 `__`
+- 已有表: 通过 `baseline-on-migrate=true` 自动建立基线,无需手动迁移
+
+## 使用方式
+
+1. 新增表或修改表结构时,在此目录创建新的 SQL 文件
+2. 文件名中的版本号必须递增
+3. 启动应用时 Flyway 自动执行未执行的迁移
+
+## 注意事项
+
+- **不要修改已执行的迁移文件**
+- 生产环境部署前先在测试环境验证
+- `baseline-on-migrate=true` 仅在首次启用时生效
diff --git a/openhis-server-new/openhis-application/src/main/resources/db/migration/V1__baseline_marker.sql b/openhis-server-new/openhis-application/src/main/resources/db/migration/V1__baseline_marker.sql
new file mode 100644
index 000000000..3eb1683b3
--- /dev/null
+++ b/openhis-server-new/openhis-application/src/main/resources/db/migration/V1__baseline_marker.sql
@@ -0,0 +1,4 @@
+-- Flyway 基线标记文件
+-- 此文件为空,仅用于标记 Flyway 迁移起点
+-- 已有表结构由 baseline-on-migrate=true 自动建立基线
+-- 后续新增表或修改表结构请创建 V2__xxx.sql, V3__xxx.sql ...
diff --git a/openhis-server-new/pom.xml b/openhis-server-new/pom.xml
index b4e018f1c..43946a208 100755
--- a/openhis-server-new/pom.xml
+++ b/openhis-server-new/pom.xml
@@ -315,6 +315,7 @@
${flowable.version}
+
org.postgresql
postgresql