|
|
@ -10,7 +10,11 @@ import org.springframework.stereotype.Component; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 数据库初始化配置 |
|
|
* 数据库初始化配置 |
|
|
* 应用启动时检查并创建必要的表 |
|
|
|
|
|
|
|
|
* 应用启动时检查并创建必要的表、迁移列、同步种子数据。 |
|
|
|
|
|
* |
|
|
|
|
|
* ⚠️ 开发规范:任何涉及建表、增删改列、初始数据的变更, |
|
|
|
|
|
* 必须同时更新本类(init 方法)和 init-database.sql(手动备用脚本), |
|
|
|
|
|
* 保持两者一致,否则新部署环境会丢失变更。 |
|
|
*/ |
|
|
*/ |
|
|
@Component |
|
|
@Component |
|
|
@Slf4j |
|
|
@Slf4j |
|
|
@ -181,6 +185,9 @@ public class DatabaseInitConfig { |
|
|
// P0-001: 混合检索 - 为 vector_store 添加全文检索列 |
|
|
// P0-001: 混合检索 - 为 vector_store 添加全文检索列 |
|
|
safeInit("初始化 vector_store 全文检索", this::initVectorStoreFullTextSearch); |
|
|
safeInit("初始化 vector_store 全文检索", this::initVectorStoreFullTextSearch); |
|
|
|
|
|
|
|
|
|
|
|
// 迁移 vector_store.create_time 列(Spring AI 自动建表时不包含此列) |
|
|
|
|
|
safeInit("迁移 vector_store.create_time 列", this::addVectorStoreCreateTimeColumn); |
|
|
|
|
|
|
|
|
// 为所有表添加注释(幂等,可重复执行) |
|
|
// 为所有表添加注释(幂等,可重复执行) |
|
|
safeInit("应用数据库表注释", this::applyTableComments); |
|
|
safeInit("应用数据库表注释", this::applyTableComments); |
|
|
|
|
|
|
|
|
@ -754,6 +761,33 @@ public class DatabaseInitConfig { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 为 vector_store 表添加 create_time 列。 |
|
|
|
|
|
* Spring AI 自动建表时不会创建此列,但 DocumentService 查询分块列表时需要按 create_time 排序。 |
|
|
|
|
|
* 幂等:已有列则跳过。 |
|
|
|
|
|
*/ |
|
|
|
|
|
private void addVectorStoreCreateTimeColumn() { |
|
|
|
|
|
try { |
|
|
|
|
|
// 表不存在时直接跳过,等待 Spring AI 创建后再迁移 |
|
|
|
|
|
if (!checkTableExists("vector_store")) { |
|
|
|
|
|
log.debug("vector_store 表尚未创建,跳过 create_time 列迁移"); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
String checkSql = "SELECT COUNT(*) FROM information_schema.columns WHERE table_name = 'vector_store' AND column_name = 'create_time'"; |
|
|
|
|
|
Integer count = jdbcTemplate.queryForObject(checkSql, Integer.class); |
|
|
|
|
|
if (count != null && count == 0) { |
|
|
|
|
|
log.info("添加 vector_store.create_time 列"); |
|
|
|
|
|
jdbcTemplate.execute("ALTER TABLE vector_store ADD COLUMN create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL"); |
|
|
|
|
|
// 为已有记录回填创建时间(使用当前时间作为兜底) |
|
|
|
|
|
jdbcTemplate.execute("UPDATE vector_store SET create_time = CURRENT_TIMESTAMP WHERE create_time IS NULL"); |
|
|
|
|
|
log.info("vector_store.create_time 列添加完成"); |
|
|
|
|
|
} |
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
log.error("添加 vector_store.create_time 列失败,请手动执行: ALTER TABLE vector_store ADD COLUMN create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL", e); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// ==================== P1-001: 用户认证与多用户管理 ==================== |
|
|
// ==================== P1-001: 用户认证与多用户管理 ==================== |
|
|
|
|
|
|
|
|
private void createSysUserTable() { |
|
|
private void createSysUserTable() { |
|
|
|