diff --git a/easyflow-commons/easyflow-common-all/pom.xml b/easyflow-commons/easyflow-common-all/pom.xml
index b460fdb..92d42b7 100644
--- a/easyflow-commons/easyflow-common-all/pom.xml
+++ b/easyflow-commons/easyflow-common-all/pom.xml
@@ -11,6 +11,10 @@
easyflow-common-all
+
+ tech.easyflow
+ easyflow-common-analytical-db
+
tech.easyflow
easyflow-common-ai
@@ -23,6 +27,10 @@
tech.easyflow
easyflow-common-cache
+
+ tech.easyflow
+ easyflow-common-mq
+
tech.easyflow
easyflow-common-file-storage
diff --git a/easyflow-commons/easyflow-common-analytical-db/pom.xml b/easyflow-commons/easyflow-common-analytical-db/pom.xml
new file mode 100644
index 0000000..88e0325
--- /dev/null
+++ b/easyflow-commons/easyflow-common-analytical-db/pom.xml
@@ -0,0 +1,48 @@
+
+
+ 4.0.0
+
+ tech.easyflow
+ easyflow-commons
+ ${revision}
+
+
+ easyflow-common-analytical-db
+ easyflow-common-analytical-db
+
+
+
+ tech.easyflow
+ easyflow-common-base
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+
+
+ com.clickhouse
+ clickhouse-jdbc
+ all
+
+
+ org.flywaydb
+ flyway-core
+
+
+ org.flywaydb
+ flyway-database-clickhouse
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+
diff --git a/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/config/AnalyticalDBConfiguration.java b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/config/AnalyticalDBConfiguration.java
new file mode 100644
index 0000000..d4971a6
--- /dev/null
+++ b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/config/AnalyticalDBConfiguration.java
@@ -0,0 +1,72 @@
+package tech.easyflow.common.analyticaldb.config;
+
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+import org.flywaydb.core.Flyway;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.util.StringUtils;
+import tech.easyflow.common.analyticaldb.core.AnalyticalDBOperations;
+import tech.easyflow.common.analyticaldb.core.DefaultAnalyticalDBOperations;
+
+@Configuration
+public class AnalyticalDBConfiguration {
+
+ @Bean(destroyMethod = "close")
+ @ConditionalOnProperty(prefix = "easyflow.analytical-db", name = "enabled", havingValue = "true")
+ public AnalyticalDBResources analyticalDBResources(AnalyticalDBProperties properties) {
+ HikariConfig config = new HikariConfig();
+ config.setPoolName("easyflow-analytical-db");
+ config.setDriverClassName(properties.getDriverClassName());
+ config.setJdbcUrl(properties.getUrl());
+ config.setUsername(properties.getUsername());
+ config.setPassword(properties.getPassword());
+ config.setMaximumPoolSize(properties.getPool().getMaxPoolSize());
+ config.setMinimumIdle(properties.getPool().getMinIdle());
+ config.setConnectionTimeout(properties.getPool().getConnectionTimeout());
+ config.setValidationTimeout(properties.getPool().getValidationTimeout());
+ config.setIdleTimeout(properties.getPool().getIdleTimeout());
+ config.setMaxLifetime(properties.getPool().getMaxLifetime());
+ config.setInitializationFailTimeout(-1L);
+ HikariDataSource dataSource = new HikariDataSource(config);
+ return new AnalyticalDBResources(dataSource, new JdbcTemplate(dataSource));
+ }
+
+ @Bean
+ @ConditionalOnProperty(prefix = "easyflow.analytical-db", name = "enabled", havingValue = "true")
+ public AnalyticalDBOperations analyticalDBOperations(AnalyticalDBResources resources) {
+ return new DefaultAnalyticalDBOperations(resources.jdbcTemplate());
+ }
+
+ @Bean
+ @ConditionalOnProperty(prefix = "easyflow.analytical-db", name = "enabled", havingValue = "true")
+ public InitializingBean analyticalDBFlywayInitializer(AnalyticalDBResources resources,
+ AnalyticalDBFlywayProperties properties) {
+ return () -> Flyway.configure()
+ .dataSource(resources.dataSource())
+ .locations(splitLocations(properties.getLocations()))
+ .table(properties.getTable())
+ .baselineOnMigrate(properties.isBaselineOnMigrate())
+ .validateOnMigrate(properties.isValidateOnMigrate())
+ .load()
+ .migrate();
+ }
+
+ private String[] splitLocations(String locations) {
+ if (!StringUtils.hasText(locations)) {
+ return new String[]{"classpath:db/migration/analyticaldb"};
+ }
+ return StringUtils.commaDelimitedListToStringArray(locations);
+ }
+
+ public record AnalyticalDBResources(HikariDataSource dataSource, JdbcTemplate jdbcTemplate) implements AutoCloseable {
+
+ @Override
+ public void close() {
+ dataSource.close();
+ }
+ }
+}
diff --git a/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/config/AnalyticalDBFlywayProperties.java b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/config/AnalyticalDBFlywayProperties.java
new file mode 100644
index 0000000..cb4c870
--- /dev/null
+++ b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/config/AnalyticalDBFlywayProperties.java
@@ -0,0 +1,46 @@
+package tech.easyflow.common.analyticaldb.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "easyflow.flyway.analytical-db")
+public class AnalyticalDBFlywayProperties {
+
+ private String locations = "classpath:db/migration/analyticaldb";
+ private String table = "flyway_schema_history_analytical_db";
+ private boolean baselineOnMigrate = false;
+ private boolean validateOnMigrate = true;
+
+ public String getLocations() {
+ return locations;
+ }
+
+ public void setLocations(String locations) {
+ this.locations = locations;
+ }
+
+ public String getTable() {
+ return table;
+ }
+
+ public void setTable(String table) {
+ this.table = table;
+ }
+
+ public boolean isBaselineOnMigrate() {
+ return baselineOnMigrate;
+ }
+
+ public void setBaselineOnMigrate(boolean baselineOnMigrate) {
+ this.baselineOnMigrate = baselineOnMigrate;
+ }
+
+ public boolean isValidateOnMigrate() {
+ return validateOnMigrate;
+ }
+
+ public void setValidateOnMigrate(boolean validateOnMigrate) {
+ this.validateOnMigrate = validateOnMigrate;
+ }
+}
diff --git a/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/config/AnalyticalDBProperties.java b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/config/AnalyticalDBProperties.java
new file mode 100644
index 0000000..25d04d8
--- /dev/null
+++ b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/config/AnalyticalDBProperties.java
@@ -0,0 +1,122 @@
+package tech.easyflow.common.analyticaldb.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "easyflow.analytical-db")
+public class AnalyticalDBProperties {
+
+ private boolean enabled = false;
+ private String url;
+ private String username;
+ private String password;
+ private String driverClassName = "com.clickhouse.jdbc.ClickHouseDriver";
+ private Pool pool = new Pool();
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public String getDriverClassName() {
+ return driverClassName;
+ }
+
+ public void setDriverClassName(String driverClassName) {
+ this.driverClassName = driverClassName;
+ }
+
+ public Pool getPool() {
+ return pool;
+ }
+
+ public void setPool(Pool pool) {
+ this.pool = pool;
+ }
+
+ public static class Pool {
+
+ private int maxPoolSize = 10;
+ private int minIdle = 1;
+ private long connectionTimeout = 5000L;
+ private long validationTimeout = 3000L;
+ private long idleTimeout = 600000L;
+ private long maxLifetime = 1800000L;
+
+ public int getMaxPoolSize() {
+ return maxPoolSize;
+ }
+
+ public void setMaxPoolSize(int maxPoolSize) {
+ this.maxPoolSize = maxPoolSize;
+ }
+
+ public int getMinIdle() {
+ return minIdle;
+ }
+
+ public void setMinIdle(int minIdle) {
+ this.minIdle = minIdle;
+ }
+
+ public long getConnectionTimeout() {
+ return connectionTimeout;
+ }
+
+ public void setConnectionTimeout(long connectionTimeout) {
+ this.connectionTimeout = connectionTimeout;
+ }
+
+ public long getValidationTimeout() {
+ return validationTimeout;
+ }
+
+ public void setValidationTimeout(long validationTimeout) {
+ this.validationTimeout = validationTimeout;
+ }
+
+ public long getIdleTimeout() {
+ return idleTimeout;
+ }
+
+ public void setIdleTimeout(long idleTimeout) {
+ this.idleTimeout = idleTimeout;
+ }
+
+ public long getMaxLifetime() {
+ return maxLifetime;
+ }
+
+ public void setMaxLifetime(long maxLifetime) {
+ this.maxLifetime = maxLifetime;
+ }
+ }
+}
diff --git a/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/core/AnalyticalDBOperations.java b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/core/AnalyticalDBOperations.java
new file mode 100644
index 0000000..e7055d3
--- /dev/null
+++ b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/core/AnalyticalDBOperations.java
@@ -0,0 +1,34 @@
+package tech.easyflow.common.analyticaldb.core;
+
+import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter;
+import org.springframework.jdbc.core.RowMapper;
+import tech.easyflow.common.analyticaldb.page.AnalyticalDBPageRequest;
+import tech.easyflow.common.analyticaldb.page.AnalyticalDBPageResult;
+
+import java.util.List;
+
+public interface AnalyticalDBOperations {
+
+ boolean available();
+
+ void assertAvailable();
+
+ List query(String sql, RowMapper rowMapper, Object... args);
+
+ T queryOne(String sql, Class requiredType, Object... args);
+
+ T queryOne(String sql, RowMapper rowMapper, Object... args);
+
+ List queryForList(String sql, Class elementType, Object... args);
+
+ int update(String sql, Object... args);
+
+ int[][] batchUpdate(String sql, List items, int batchSize, ParameterizedPreparedStatementSetter setter);
+
+ AnalyticalDBPageResult page(String countSql,
+ Object[] countArgs,
+ String dataSql,
+ Object[] dataArgs,
+ AnalyticalDBPageRequest pageRequest,
+ RowMapper rowMapper);
+}
diff --git a/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/core/DefaultAnalyticalDBOperations.java b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/core/DefaultAnalyticalDBOperations.java
new file mode 100644
index 0000000..2a39493
--- /dev/null
+++ b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/core/DefaultAnalyticalDBOperations.java
@@ -0,0 +1,113 @@
+package tech.easyflow.common.analyticaldb.core;
+
+import org.springframework.dao.EmptyResultDataAccessException;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter;
+import org.springframework.jdbc.core.RowMapper;
+import tech.easyflow.common.analyticaldb.exception.AnalyticalDBException;
+import tech.easyflow.common.analyticaldb.page.AnalyticalDBPageRequest;
+import tech.easyflow.common.analyticaldb.page.AnalyticalDBPageResult;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DefaultAnalyticalDBOperations implements AnalyticalDBOperations {
+
+ private final JdbcTemplate jdbcTemplate;
+
+ public DefaultAnalyticalDBOperations(JdbcTemplate jdbcTemplate) {
+ this.jdbcTemplate = jdbcTemplate;
+ }
+
+ @Override
+ public boolean available() {
+ return jdbcTemplate != null;
+ }
+
+ @Override
+ public void assertAvailable() {
+ if (!available()) {
+ throw new AnalyticalDBException("AnalyticalDB 数据源未启用");
+ }
+ }
+
+ @Override
+ public List query(String sql, RowMapper rowMapper, Object... args) {
+ assertAvailable();
+ return jdbcTemplate.query(sql, rowMapper, args);
+ }
+
+ @Override
+ public T queryOne(String sql, Class requiredType, Object... args) {
+ assertAvailable();
+ try {
+ return jdbcTemplate.queryForObject(sql, requiredType, args);
+ } catch (EmptyResultDataAccessException ex) {
+ return null;
+ }
+ }
+
+ @Override
+ public T queryOne(String sql, RowMapper rowMapper, Object... args) {
+ assertAvailable();
+ List rows = jdbcTemplate.query(sql, rowMapper, args);
+ return rows.isEmpty() ? null : rows.get(0);
+ }
+
+ @Override
+ public List queryForList(String sql, Class elementType, Object... args) {
+ assertAvailable();
+ return jdbcTemplate.queryForList(sql, elementType, args);
+ }
+
+ @Override
+ public int update(String sql, Object... args) {
+ assertAvailable();
+ return jdbcTemplate.update(sql, args);
+ }
+
+ @Override
+ public int[][] batchUpdate(String sql, List items, int batchSize, ParameterizedPreparedStatementSetter setter) {
+ assertAvailable();
+ if (items == null || items.isEmpty()) {
+ return new int[0][0];
+ }
+ return jdbcTemplate.batchUpdate(sql, items, Math.max(batchSize, 1), setter);
+ }
+
+ @Override
+ public AnalyticalDBPageResult page(String countSql,
+ Object[] countArgs,
+ String dataSql,
+ Object[] dataArgs,
+ AnalyticalDBPageRequest pageRequest,
+ RowMapper rowMapper) {
+ assertAvailable();
+ AnalyticalDBPageRequest request = pageRequest == null ? new AnalyticalDBPageRequest() : pageRequest;
+ Long total = jdbcTemplate.queryForObject(countSql, Long.class, nullSafeArgs(countArgs));
+ List records = new ArrayList<>();
+ if (total != null && total > 0) {
+ Object[] argsWithPage = appendPageArgs(dataArgs, request.getSafePageSize(), request.getOffset());
+ records = jdbcTemplate.query(dataSql + " LIMIT ? OFFSET ?", rowMapper, argsWithPage);
+ }
+ AnalyticalDBPageResult result = new AnalyticalDBPageResult<>();
+ result.setTotal(total == null ? 0L : total);
+ result.setPageNumber(request.getPageNumber());
+ result.setPageSize(request.getSafePageSize());
+ result.setRecords(records);
+ return result;
+ }
+
+ private Object[] appendPageArgs(Object[] args, int limit, int offset) {
+ Object[] safeArgs = nullSafeArgs(args);
+ Object[] merged = new Object[safeArgs.length + 2];
+ System.arraycopy(safeArgs, 0, merged, 0, safeArgs.length);
+ merged[safeArgs.length] = limit;
+ merged[safeArgs.length + 1] = offset;
+ return merged;
+ }
+
+ private Object[] nullSafeArgs(Object[] args) {
+ return args == null ? new Object[0] : args;
+ }
+}
diff --git a/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/exception/AnalyticalDBException.java b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/exception/AnalyticalDBException.java
new file mode 100644
index 0000000..dbd4431
--- /dev/null
+++ b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/exception/AnalyticalDBException.java
@@ -0,0 +1,12 @@
+package tech.easyflow.common.analyticaldb.exception;
+
+public class AnalyticalDBException extends RuntimeException {
+
+ public AnalyticalDBException(String message) {
+ super(message);
+ }
+
+ public AnalyticalDBException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/page/AnalyticalDBPageRequest.java b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/page/AnalyticalDBPageRequest.java
new file mode 100644
index 0000000..1e03e6f
--- /dev/null
+++ b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/page/AnalyticalDBPageRequest.java
@@ -0,0 +1,40 @@
+package tech.easyflow.common.analyticaldb.page;
+
+public class AnalyticalDBPageRequest {
+
+ private int pageNumber = 1;
+ private int pageSize = 20;
+
+ public AnalyticalDBPageRequest() {
+ }
+
+ public AnalyticalDBPageRequest(int pageNumber, int pageSize) {
+ this.pageNumber = pageNumber;
+ this.pageSize = pageSize;
+ }
+
+ public int getPageNumber() {
+ return pageNumber;
+ }
+
+ public void setPageNumber(int pageNumber) {
+ this.pageNumber = pageNumber;
+ }
+
+ public int getPageSize() {
+ return pageSize;
+ }
+
+ public void setPageSize(int pageSize) {
+ this.pageSize = pageSize;
+ }
+
+ public int getOffset() {
+ int safePageNumber = Math.max(pageNumber, 1);
+ return (safePageNumber - 1) * getSafePageSize();
+ }
+
+ public int getSafePageSize() {
+ return Math.max(pageSize, 1);
+ }
+}
diff --git a/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/page/AnalyticalDBPageResult.java b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/page/AnalyticalDBPageResult.java
new file mode 100644
index 0000000..0d11da9
--- /dev/null
+++ b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/page/AnalyticalDBPageResult.java
@@ -0,0 +1,44 @@
+package tech.easyflow.common.analyticaldb.page;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AnalyticalDBPageResult {
+
+ private long total;
+ private int pageNumber;
+ private int pageSize;
+ private List records = new ArrayList<>();
+
+ public long getTotal() {
+ return total;
+ }
+
+ public void setTotal(long total) {
+ this.total = total;
+ }
+
+ public int getPageNumber() {
+ return pageNumber;
+ }
+
+ public void setPageNumber(int pageNumber) {
+ this.pageNumber = pageNumber;
+ }
+
+ public int getPageSize() {
+ return pageSize;
+ }
+
+ public void setPageSize(int pageSize) {
+ this.pageSize = pageSize;
+ }
+
+ public List getRecords() {
+ return records;
+ }
+
+ public void setRecords(List records) {
+ this.records = records;
+ }
+}
diff --git a/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/support/AnalyticalDBHealthSupport.java b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/support/AnalyticalDBHealthSupport.java
new file mode 100644
index 0000000..e81e04b
--- /dev/null
+++ b/easyflow-commons/easyflow-common-analytical-db/src/main/java/tech/easyflow/common/analyticaldb/support/AnalyticalDBHealthSupport.java
@@ -0,0 +1,32 @@
+package tech.easyflow.common.analyticaldb.support;
+
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.stereotype.Component;
+import tech.easyflow.common.analyticaldb.config.AnalyticalDBFlywayProperties;
+import tech.easyflow.common.analyticaldb.core.AnalyticalDBOperations;
+
+@Component
+public class AnalyticalDBHealthSupport {
+
+ private final ObjectProvider analyticalDBOperationsProvider;
+ private final AnalyticalDBFlywayProperties flywayProperties;
+
+ public AnalyticalDBHealthSupport(ObjectProvider analyticalDBOperationsProvider,
+ AnalyticalDBFlywayProperties flywayProperties) {
+ this.analyticalDBOperationsProvider = analyticalDBOperationsProvider;
+ this.flywayProperties = flywayProperties;
+ }
+
+ public boolean enabled() {
+ return analyticalDBOperationsProvider.getIfAvailable() != null;
+ }
+
+ public void selfCheck() {
+ AnalyticalDBOperations operations = analyticalDBOperationsProvider.getIfAvailable();
+ if (operations == null) {
+ return;
+ }
+ operations.queryOne("SELECT 1", Integer.class);
+ operations.queryOne("SELECT COUNT(1) FROM " + flywayProperties.getTable(), Long.class);
+ }
+}
diff --git a/easyflow-commons/easyflow-common-chat-protocol/src/main/java/tech/easyflow/core/runtime/ChatAssistantAccumulator.java b/easyflow-commons/easyflow-common-chat-protocol/src/main/java/tech/easyflow/core/runtime/ChatAssistantAccumulator.java
new file mode 100644
index 0000000..c2b74d0
--- /dev/null
+++ b/easyflow-commons/easyflow-common-chat-protocol/src/main/java/tech/easyflow/core/runtime/ChatAssistantAccumulator.java
@@ -0,0 +1,74 @@
+package tech.easyflow.core.runtime;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ChatAssistantAccumulator {
+
+ private final StringBuilder content = new StringBuilder();
+ private final StringBuilder reasoning = new StringBuilder();
+ private final List
+
+ tech.easyflow
+ easyflow-module-chatlog
+
tech.easyflow
easyflow-module-ai
diff --git a/easyflow-starter/easyflow-starter-all/src/main/resources/application-prod.yml b/easyflow-starter/easyflow-starter-all/src/main/resources/application-prod.yml
index ec41fd3..5483297 100644
--- a/easyflow-starter/easyflow-starter-all/src/main/resources/application-prod.yml
+++ b/easyflow-starter/easyflow-starter-all/src/main/resources/application-prod.yml
@@ -14,5 +14,47 @@ spring:
password: ${REDIS_PASSWORD:123456}
easyflow:
+ chat:
+ cache:
+ session-list-ttl: 300s
+ session-summary-ttl: 600s
+ session-tail-ttl: 1800s
+ tail-size: 50
+ sync:
+ enabled: true
+ batch-size: 500
+ fixed-delay: 30000
+ repair-lookback-days: 3
+ retention-months: 3
+ mq:
+ enabled: true
+ type: redis
+ redis:
+ database: 1
+ stream-prefix: easyflow:mq
+ chat-persist-shard-count: 4
+ consumer-batch-size: 200
+ consumer-block-timeout: 2000ms
+ pending-claim-idle: 60000ms
+ max-retry: 16
+ analytical-db:
+ enabled: true
+ url: ${EASYFLOW_ANALYTICAL_DB_URL:jdbc:clickhouse://127.0.0.1:8123/easyflow?jdbc_ignore_unsupported_values=true&socket_timeout=30000&compress=false&ssl=false}
+ username: ${EASYFLOW_ANALYTICAL_DB_USERNAME:default}
+ password: ${EASYFLOW_ANALYTICAL_DB_PASSWORD:}
+ driver-class-name: com.clickhouse.jdbc.ClickHouseDriver
+ pool:
+ max-pool-size: 10
+ min-idle: 1
+ connection-timeout: 5000
+ validation-timeout: 3000
+ idle-timeout: 600000
+ max-lifetime: 1800000
+ flyway:
+ analytical-db:
+ locations: classpath:db/migration/analyticaldb
+ table: flyway_schema_history_analytical_db
+ baseline-on-migrate: false
+ validate-on-migrate: true
storage:
type: xFileStorage
diff --git a/easyflow-starter/easyflow-starter-all/src/main/resources/application.yml b/easyflow-starter/easyflow-starter-all/src/main/resources/application.yml
index 1a2fbce..0ae352a 100644
--- a/easyflow-starter/easyflow-starter-all/src/main/resources/application.yml
+++ b/easyflow-starter/easyflow-starter-all/src/main/resources/application.yml
@@ -23,7 +23,7 @@ spring:
password: root
flyway:
enabled: true
- locations: classpath:db/migration
+ locations: classpath:db/migration/mysql
baseline-on-migrate: false
validate-on-migrate: true
clean-disabled: true
@@ -79,6 +79,49 @@ easyflow:
chat:
# SSE 超时时间(毫秒),默认 10 分钟,可按需调整
sse-timeout-ms: 600000
+ cache:
+ session-list-ttl: 300s
+ session-summary-ttl: 600s
+ session-tail-ttl: 1800s
+ tail-size: 50
+ sync:
+ #是否启用分析数据同步,启用分析数据库后,此处应同步开启
+ enabled: true
+ batch-size: 500
+ fixed-delay: 30000
+ repair-lookback-days: 3
+ retention-months: 3
+ mq:
+ enabled: true
+ type: redis
+ redis:
+ database: 1
+ stream-prefix: easyflow:mq
+ chat-persist-shard-count: 4
+ consumer-batch-size: 200
+ consumer-block-timeout: 2000ms
+ pending-claim-idle: 60000ms
+ max-retry: 16
+ analytical-db:
+ # 是否启用分析数据库
+ enabled: true
+ url: jdbc:clickhouse://127.0.0.1:38123/easyflow?jdbc_ignore_unsupported_values=true&socket_timeout=30000&compress=false&ssl=false
+ username: easyflow
+ password: 123456
+ driver-class-name: com.clickhouse.jdbc.ClickHouseDriver
+ pool:
+ max-pool-size: 10
+ min-idle: 1
+ connection-timeout: 5000
+ validation-timeout: 3000
+ idle-timeout: 600000
+ max-lifetime: 1800000
+ flyway:
+ analytical-db:
+ locations: classpath:db/migration/analyticaldb
+ table: flyway_schema_history_analytical_db
+ baseline-on-migrate: false
+ validate-on-migrate: true
# 语音播放、识别服务(阿里云)
audio:
type: aliAudioService
@@ -168,7 +211,7 @@ rag:
searcher:
# 搜索方式 默认lucene
lucene:
- indexDirPath: ./luceneKnowledge
+ indexDirPath: /Users/slience/data/easyflow/luceneKnowledge
elastic:
host: https://127.0.0.1:9200
userName: elastic
diff --git a/easyflow-starter/easyflow-starter-all/src/main/resources/db/migration/analyticaldb/V1__analyticaldb_ods.sql b/easyflow-starter/easyflow-starter-all/src/main/resources/db/migration/analyticaldb/V1__analyticaldb_ods.sql
new file mode 100644
index 0000000..06c7a0a
--- /dev/null
+++ b/easyflow-starter/easyflow-starter-all/src/main/resources/db/migration/analyticaldb/V1__analyticaldb_ods.sql
@@ -0,0 +1,62 @@
+CREATE TABLE IF NOT EXISTS flyway_schema_history_analytical_db
+(
+ `installed_rank` Int32,
+ `version` Nullable(String),
+ `description` String,
+ `type` String,
+ `script` String,
+ `checksum` Nullable(Int32),
+ `installed_by` String,
+ `installed_on` DateTime DEFAULT now(),
+ `execution_time` Int32,
+ `success` UInt8
+)
+ENGINE = ReplacingMergeTree(installed_on)
+ORDER BY installed_rank;
+
+CREATE TABLE IF NOT EXISTS ods_chat_session
+(
+ `id` UInt64,
+ `tenant_id` UInt64,
+ `dept_id` UInt64,
+ `user_id` UInt64,
+ `user_account` String,
+ `assistant_id` UInt64,
+ `assistant_code` Nullable(String),
+ `assistant_name` Nullable(String),
+ `title` String,
+ `last_message_preview` Nullable(String),
+ `last_sender_id` Nullable(UInt64),
+ `last_sender_name` Nullable(String),
+ `message_count` UInt32,
+ `access_at` DateTime,
+ `last_message_at` Nullable(DateTime),
+ `created` DateTime,
+ `created_by` UInt64,
+ `modified` DateTime,
+ `modified_by` UInt64,
+ `is_deleted` UInt8
+)
+ENGINE = ReplacingMergeTree(modified)
+PARTITION BY toYYYYMM(access_at)
+ORDER BY (id);
+
+CREATE TABLE IF NOT EXISTS ods_chat_log
+(
+ `id` UInt64,
+ `session_id` UInt64,
+ `user_id` UInt64,
+ `assistant_id` UInt64,
+ `sender_id` Nullable(UInt64),
+ `sender_name` Nullable(String),
+ `sender_role` String,
+ `content_type` String,
+ `content_text` Nullable(String),
+ `content_payload` Nullable(String),
+ `created` DateTime,
+ `created_by` UInt64,
+ `sync_version` UInt64
+)
+ENGINE = ReplacingMergeTree(sync_version)
+PARTITION BY toYYYYMM(created)
+ORDER BY (session_id, created, id);
diff --git a/easyflow-starter/easyflow-starter-all/src/main/resources/db/migration/analyticaldb/V2__analyticaldb_dws.sql b/easyflow-starter/easyflow-starter-all/src/main/resources/db/migration/analyticaldb/V2__analyticaldb_dws.sql
new file mode 100644
index 0000000..1cc4307
--- /dev/null
+++ b/easyflow-starter/easyflow-starter-all/src/main/resources/db/migration/analyticaldb/V2__analyticaldb_dws.sql
@@ -0,0 +1,33 @@
+CREATE TABLE IF NOT EXISTS dws_chat_assistant_day
+(
+ `stat_date` Date,
+ `dimension_id` UInt64,
+ `session_count` UInt64,
+ `message_count` UInt64
+)
+ENGINE = MergeTree
+PARTITION BY toYYYYMM(stat_date)
+ORDER BY (stat_date, dimension_id);
+
+CREATE TABLE IF NOT EXISTS dws_chat_user_day
+(
+ `stat_date` Date,
+ `dimension_id` UInt64,
+ `session_count` UInt64,
+ `message_count` UInt64
+)
+ENGINE = MergeTree
+PARTITION BY toYYYYMM(stat_date)
+ORDER BY (stat_date, dimension_id);
+
+CREATE TABLE IF NOT EXISTS dws_chat_session_day
+(
+ `stat_date` Date,
+ `dimension_id` UInt64,
+ `assistant_id` UInt64,
+ `user_id` UInt64,
+ `message_count` UInt64
+)
+ENGINE = MergeTree
+PARTITION BY toYYYYMM(stat_date)
+ORDER BY (stat_date, dimension_id);
diff --git a/easyflow-starter/easyflow-starter-all/src/main/resources/db/migration/mysql/V1__mysql_schema.sql b/easyflow-starter/easyflow-starter-all/src/main/resources/db/migration/mysql/V1__mysql_schema.sql
new file mode 100644
index 0000000..61009f0
--- /dev/null
+++ b/easyflow-starter/easyflow-starter-all/src/main/resources/db/migration/mysql/V1__mysql_schema.sql
@@ -0,0 +1,1182 @@
+SET NAMES utf8mb4;
+SET
+FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for tb_bot
+-- ----------------------------
+CREATE TABLE `tb_bot`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键ID',
+ `alias` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '别名',
+ `dept_id` bigint UNSIGNED NOT NULL COMMENT '部门ID',
+ `tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
+ `category_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '分类ID',
+ `title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标题',
+ `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '描述',
+ `icon` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标',
+ `model_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '模型 ID',
+ `model_options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '模型配置',
+ `status` int NULL DEFAULT 0 COMMENT '数据状态',
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '选项',
+ `created` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '创建者ID',
+ `modified` datetime NULL DEFAULT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '修改者ID',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `tb_ai_bot_alias_uindex`(`alias`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'bot表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_bot_category
+-- ----------------------------
+CREATE TABLE `tb_bot_category`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `category_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分类名称',
+ `sort_no` int NULL DEFAULT 0 COMMENT '排序',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL COMMENT '修改者',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'bot分类' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for tb_bot_document_collection
+-- ----------------------------
+CREATE TABLE `tb_bot_document_collection`
+(
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+ `bot_id` bigint UNSIGNED NULL DEFAULT NULL,
+ `document_collection_id` bigint UNSIGNED NULL DEFAULT NULL,
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_bot_document_collection`(`bot_id`, `document_collection_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 36 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'bot绑定的知识库' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for chat_session
+-- ----------------------------
+CREATE TABLE `chat_session`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '会话ID',
+ `tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
+ `dept_id` bigint UNSIGNED NOT NULL COMMENT '部门ID',
+ `user_id` bigint UNSIGNED NOT NULL COMMENT '用户ID',
+ `user_account` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户账号',
+ `assistant_id` bigint UNSIGNED NOT NULL COMMENT '助手ID',
+ `assistant_code` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '助手编码',
+ `assistant_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '助手名称',
+ `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '会话标题',
+ `last_message_preview` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '最后消息预览',
+ `last_sender_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '最后发送方ID',
+ `last_sender_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '最后发送方名称',
+ `message_count` int NOT NULL DEFAULT 0 COMMENT '消息数量',
+ `access_at` datetime NOT NULL COMMENT '访问时间',
+ `last_message_at` datetime NULL DEFAULT NULL COMMENT '最后消息时间',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL COMMENT '修改者',
+ `is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '逻辑删除',
+ PRIMARY KEY (`id`) USING BTREE,
+ KEY `idx_user_deleted_access` (`user_id`, `is_deleted`, `access_at`, `id`) USING BTREE,
+ KEY `idx_user_assistant_deleted_access` (`user_id`, `assistant_id`, `is_deleted`, `access_at`, `id`) USING BTREE,
+ KEY `idx_modified` (`modified`, `id`) USING BTREE,
+ KEY `idx_access_at` (`access_at`, `id`) USING BTREE
+) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '聊天会话热数据表';
+
+-- ----------------------------
+-- Table structure for chat_log_template
+-- ----------------------------
+CREATE TABLE `chat_log_template`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
+ `dept_id` bigint UNSIGNED NOT NULL COMMENT '部门ID',
+ `session_id` bigint UNSIGNED NOT NULL COMMENT '会话ID',
+ `user_id` bigint UNSIGNED NOT NULL COMMENT '用户ID',
+ `assistant_id` bigint UNSIGNED NOT NULL COMMENT '助手ID',
+ `sender_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '发送方ID',
+ `sender_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '发送方名称',
+ `sender_role` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '发送方角色',
+ `content_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '内容类型',
+ `content_text` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '文本内容',
+ `content_payload` json NULL COMMENT '结构化内容',
+ `created` datetime NOT NULL COMMENT '发送时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `sync_version` bigint UNSIGNED NOT NULL COMMENT '同步版本',
+ PRIMARY KEY (`id`) USING BTREE,
+ KEY `idx_session_created` (`session_id`, `created`, `id`) USING BTREE,
+ KEY `idx_user_created` (`user_id`, `created`, `id`) USING BTREE,
+ KEY `idx_assistant_created` (`assistant_id`, `created`, `id`) USING BTREE
+) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '聊天消息月表模板';
+
+-- ----------------------------
+-- Table structure for chat_sync_checkpoint
+-- ----------------------------
+CREATE TABLE `chat_sync_checkpoint`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `sync_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '同步编码',
+ `shard_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '同步游标键',
+ `cursor_table` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '游标表名',
+ `cursor_time` datetime NULL DEFAULT NULL COMMENT '游标时间',
+ `cursor_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '游标ID',
+ `last_success_time` datetime NULL DEFAULT NULL COMMENT '最后成功时间',
+ `last_batch_size` int NULL DEFAULT 0 COMMENT '最后批次大小',
+ `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'READY' COMMENT '状态',
+ `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uk_sync` (`sync_code`, `shard_key`) USING BTREE
+) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '聊天同步检查点';
+
+-- ----------------------------
+-- Table structure for chat_persist_dead_letter
+-- ----------------------------
+CREATE TABLE `chat_persist_dead_letter`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `topic` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'topic',
+ `stream_key` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'stream key',
+ `stream_message_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'stream message id',
+ `event_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '事件ID',
+ `session_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '会话ID',
+ `payload` json NULL COMMENT '事件负载',
+ `retry_count` int NOT NULL DEFAULT 0 COMMENT '重试次数',
+ `error_message` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '错误信息',
+ `first_failed_at` datetime NOT NULL COMMENT '首次失败时间',
+ `last_failed_at` datetime NOT NULL COMMENT '最后失败时间',
+ `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '状态',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ PRIMARY KEY (`id`) USING BTREE,
+ KEY `idx_chat_persist_dead_letter_event` (`event_id`) USING BTREE,
+ KEY `idx_chat_persist_dead_letter_session` (`session_id`) USING BTREE,
+ KEY `idx_chat_persist_dead_letter_status` (`status`, `last_failed_at`) USING BTREE
+) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '聊天持久化死信表';
+
+-- ----------------------------
+-- Table structure for tb_bot_model
+-- ----------------------------
+CREATE TABLE `tb_bot_model`
+(
+ `id` bigint UNSIGNED NOT NULL,
+ `bot_id` bigint UNSIGNED NULL DEFAULT NULL,
+ `model_id` bigint UNSIGNED NULL DEFAULT NULL,
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'bot绑定的大模型' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_bot_plugin
+-- ----------------------------
+CREATE TABLE `tb_bot_plugin`
+(
+ `id` bigint UNSIGNED NOT NULL,
+ `bot_id` bigint UNSIGNED NULL DEFAULT NULL,
+ `plugin_item_id` bigint UNSIGNED NULL DEFAULT NULL,
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_bot_plugin`(`bot_id`, `plugin_item_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'bot绑定的插件' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_bot_recently_used
+-- ----------------------------
+CREATE TABLE `tb_bot_recently_used`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `bot_id` bigint UNSIGNED NOT NULL COMMENT 'botId',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `sort_no` int NULL DEFAULT 0 COMMENT '排序',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_bot_recently_used`(`created_by`, `bot_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '最近使用' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for tb_bot_workflow
+-- ----------------------------
+CREATE TABLE `tb_bot_workflow`
+(
+ `id` bigint UNSIGNED NOT NULL,
+ `bot_id` bigint UNSIGNED NULL DEFAULT NULL,
+ `workflow_id` bigint UNSIGNED NULL DEFAULT NULL,
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_bot_workflow`(`bot_id`, `workflow_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'bot绑定的工作流' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_datacenter_table
+-- ----------------------------
+CREATE TABLE `tb_datacenter_table`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `dept_id` bigint UNSIGNED NOT NULL COMMENT '部门ID',
+ `tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
+ `source_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '数据源ID',
+ `catalog_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '目录ID',
+ `table_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '数据表名',
+ `table_desc` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '数据表描述',
+ `actual_table` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '物理表名',
+ `table_kind` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'EXTERNAL_TABLE' COMMENT '表类型',
+ `access_mode` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'READ_ONLY' COMMENT '访问模式',
+ `materialized_table` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '物化表名',
+ `versioning_enabled` int NOT NULL DEFAULT 0 COMMENT '是否开启版本',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL COMMENT '修改者',
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '扩展项',
+ `capabilities_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '能力声明',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '数据中枢表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_datacenter_table_field
+-- ----------------------------
+CREATE TABLE `tb_datacenter_table_field`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `table_id` bigint UNSIGNED NOT NULL COMMENT '数据表ID',
+ `field_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '字段名称',
+ `source_column_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '源字段名',
+ `field_desc` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字段描述',
+ `field_type` int NOT NULL COMMENT '字段类型',
+ `jdbc_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'JDBC类型',
+ `precision` int NULL DEFAULT NULL COMMENT '精度',
+ `scale` int NULL DEFAULT NULL COMMENT '小数位',
+ `required` int NOT NULL DEFAULT 0 COMMENT '是否必填',
+ `queryable` int NOT NULL DEFAULT 1 COMMENT '可查询',
+ `sortable` int NOT NULL DEFAULT 1 COMMENT '可排序',
+ `writable` int NOT NULL DEFAULT 1 COMMENT '可写入',
+ `indexed` int NOT NULL DEFAULT 0 COMMENT '是否索引',
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '扩展项',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL COMMENT '修改者',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '数据中枢字段表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_document
+-- ----------------------------
+CREATE TABLE `tb_document`
+(
+ `id` bigint UNSIGNED NOT NULL,
+ `collection_id` bigint UNSIGNED NOT NULL COMMENT '知识库ID',
+ `document_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文档类型 pdf/word/aieditor 等',
+ `document_path` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文档路径',
+ `title` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标题',
+ `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '内容',
+ `content_type` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '内容类型',
+ `slug` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'URL 别名',
+ `order_no` int NULL DEFAULT NULL COMMENT '排序序号',
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '其他配置项',
+ `created` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '创建人ID',
+ `modified` datetime NULL DEFAULT NULL COMMENT '最后的修改时间',
+ `modified_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '最后的修改人的ID',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `knowledge_id`(`collection_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '文档' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_document_chunk
+-- ----------------------------
+CREATE TABLE `tb_document_chunk`
+(
+ `id` bigint UNSIGNED NOT NULL,
+ `document_id` bigint UNSIGNED NOT NULL COMMENT '文档ID',
+ `document_collection_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '知识库ID',
+ `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '分块内容',
+ `sorting` int NULL DEFAULT NULL COMMENT '分割顺序',
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '扩展元信息',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '文档分块表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_document_collection
+-- ----------------------------
+CREATE TABLE `tb_document_collection`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT 'Id',
+ `collection_type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'DOCUMENT' COMMENT '知识库类型: DOCUMENT/FAQ',
+ `alias` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '别名',
+ `dept_id` bigint UNSIGNED NOT NULL COMMENT '部门ID',
+ `tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
+ `icon` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'ICON',
+ `title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标题',
+ `description` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '描述',
+ `slug` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'URL 别名',
+ `vector_store_enable` tinyint NULL DEFAULT NULL COMMENT '是否启用向量存储',
+ `vector_store_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '向量数据库类型',
+ `vector_store_collection` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '向量数据库集合',
+ `vector_store_config` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '向量数据库配置',
+ `vector_embed_model_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT 'Embedding 模型ID',
+ `dimension_of_vector_model` int NULL DEFAULT NULL COMMENT '向量模型维度',
+ `created` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '创建用户ID',
+ `modified` datetime NULL DEFAULT NULL COMMENT '最后一次修改时间',
+ `modified_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '最后一次修改用户ID',
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '其他配置',
+ `rerank_model_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '重排模型id',
+ `search_engine_enable` tinyint NULL DEFAULT NULL COMMENT '是否启用搜索引擎',
+ `english_name` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '英文名称',
+ `category_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '分类ID',
+ `visibility_scope` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '可见范围',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `tb_ai_knowledge_alias_uindex`(`alias`) USING BTREE,
+ INDEX `idx_collection_type`(`collection_type`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '知识库' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for tb_document_collection_category
+-- ----------------------------
+CREATE TABLE `tb_document_collection_category`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `category_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分类名称',
+ `sort_no` int NULL DEFAULT 0 COMMENT '排序',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL COMMENT '修改者',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for tb_faq_category
+-- ----------------------------
+CREATE TABLE `tb_faq_category`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `collection_id` bigint UNSIGNED NOT NULL COMMENT '知识库ID',
+ `parent_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '父分类ID,0表示根',
+ `ancestors` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '0' COMMENT '祖先路径(逗号分隔)',
+ `level_no` tinyint UNSIGNED NOT NULL DEFAULT 1 COMMENT '层级(1-3)',
+ `category_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分类名称',
+ `sort_no` int NOT NULL DEFAULT 0 COMMENT '排序',
+ `is_default` tinyint NOT NULL DEFAULT 0 COMMENT '是否默认分类',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `created` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '创建人',
+ `modified` datetime NULL DEFAULT NULL COMMENT '更新时间',
+ `modified_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '更新人',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_faq_category_collection_parent_sort`(`collection_id`, `parent_id`, `sort_no`) USING BTREE,
+ INDEX `idx_faq_category_collection_level`(`collection_id`, `level_no`) USING BTREE,
+ INDEX `idx_faq_category_collection_status`(`collection_id`, `status`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'FAQ分类' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for tb_faq_item
+-- ----------------------------
+CREATE TABLE `tb_faq_item`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `collection_id` bigint UNSIGNED NOT NULL COMMENT '知识库ID',
+ `category_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT 'FAQ分类ID',
+ `question` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '问题',
+ `answer_html` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '答案HTML',
+ `answer_text` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '答案纯文本',
+ `order_no` int NULL DEFAULT 0 COMMENT '排序',
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '扩展项',
+ `created` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '创建人',
+ `modified` datetime NULL DEFAULT NULL COMMENT '更新时间',
+ `modified_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '更新人',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_faq_collection_id`(`collection_id`) USING BTREE,
+ INDEX `idx_faq_collection_order`(`collection_id`, `order_no`) USING BTREE,
+ INDEX `idx_faq_collection_category_order`(`collection_id`, `category_id`, `order_no`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'FAQ条目' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for tb_document_history
+-- ----------------------------
+CREATE TABLE `tb_document_history`
+(
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+ `document_id` bigint NULL DEFAULT NULL COMMENT '修改的文档ID',
+ `old_title` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '旧标题',
+ `new_title` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '新标题',
+ `old_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '旧内容',
+ `new_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '新内容',
+ `old_document_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '旧的文档类型',
+ `new_document_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '新的额文档类型',
+ `created` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `created_by` bigint NULL DEFAULT NULL COMMENT '创建人ID',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '文档历史记录' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_model
+-- ----------------------------
+CREATE TABLE `tb_model`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT 'ID',
+ `dept_id` bigint UNSIGNED NOT NULL COMMENT '部门ID',
+ `tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
+ `provider_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '供应商id',
+ `title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标题或名称',
+ `icon` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'ICON',
+ `description` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '描述',
+ `endpoint` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '大模型请求地址',
+ `request_path` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '请求路径',
+ `model_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '大模型名称',
+ `api_key` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '大模型 API KEY',
+ `extra_config` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '大模型其他属性配置',
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '其他配置内容',
+ `group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '分组名称',
+ `model_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '模型类型: chatModel/embeddingModel/rerankModel/orc..',
+ `with_used` tinyint NULL DEFAULT NULL COMMENT '是否使用',
+ `support_thinking` tinyint NULL DEFAULT NULL COMMENT '是否支持推理',
+ `support_tool` tinyint NULL DEFAULT NULL COMMENT '是否支持工具',
+ `support_image` tinyint NULL DEFAULT NULL COMMENT '是否支持图片',
+ `support_image_b64_only` tinyint NULL DEFAULT NULL COMMENT '仅支持 base64 的图片类型',
+ `support_video` tinyint NULL DEFAULT NULL COMMENT '是否支持视频',
+ `support_audio` tinyint NULL DEFAULT NULL COMMENT '是否支持音频',
+ `support_free` tinyint NULL DEFAULT NULL COMMENT '是否免费',
+ `support_tool_message` tinyint NULL DEFAULT NULL COMMENT '是否支持tool消息',
+ `invoke_code` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '统一模型调用对外标识',
+ `publish_enabled` tinyint NULL DEFAULT 0 COMMENT '是否开启统一模型调用发布',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_model_invoke_code`(`invoke_code`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '大模型管理' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for tb_model_provider
+-- ----------------------------
+CREATE TABLE `tb_model_provider`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT 'id',
+ `provider_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '供应商名称',
+ `provider_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '不同的 client 实现,默认为 openai',
+ `icon` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标',
+ `api_key` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'apiKey',
+ `endpoint` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'endPoint',
+ `chat_path` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '对话地址',
+ `embed_path` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '向量地址',
+ `rerank_path` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '重排路径',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL COMMENT '修改者',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '大模型供应商,比如 Aliyun/Gitee/火山引擎 等' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_plugin
+-- ----------------------------
+CREATE TABLE `tb_plugin`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '插件id',
+ `alias` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '别名',
+ `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '名称',
+ `description` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '描述',
+ `type` int NULL DEFAULT NULL COMMENT '类型',
+ `base_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '基础URL',
+ `auth_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '认证方式 【apiKey/none】',
+ `created` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '图标地址',
+ `position` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '认证参数位置 【headers, query】',
+ `headers` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '请求头',
+ `token_key` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'token键',
+ `token_value` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'token值',
+ `dept_id` bigint NULL DEFAULT NULL COMMENT '部门id',
+ `tenant_id` bigint NULL DEFAULT NULL COMMENT '租户id',
+ `created_by` bigint NULL DEFAULT NULL COMMENT '创建人',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `tb_ai_plugin_alias_uindex`(`alias`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '插件表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_plugin_category
+-- ----------------------------
+CREATE TABLE `tb_plugin_category`
+(
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
+ `created_at` datetime NULL DEFAULT NULL,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 44 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '插件分类' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_plugin_category_mapping
+-- ----------------------------
+CREATE TABLE `tb_plugin_category_mapping`
+(
+ `category_id` bigint UNSIGNED NOT NULL,
+ `plugin_id` bigint UNSIGNED NOT NULL
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '插件分类关联表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_plugin_item
+-- ----------------------------
+CREATE TABLE `tb_plugin_item`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '插件工具id',
+ `plugin_id` bigint UNSIGNED NOT NULL COMMENT '插件id',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '名称',
+ `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '描述',
+ `base_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '基础路径',
+ `created` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `status` int NULL DEFAULT 0 COMMENT '是否启用',
+ `input_data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '输入参数',
+ `output_data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '输出参数',
+ `request_method` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '请求方式【Post, Get, Put, Delete】',
+ `service_status` int NULL DEFAULT NULL COMMENT '服务状态[0 下线 1 上线]',
+ `debug_status` int NULL DEFAULT NULL COMMENT '调试状态【0失败 1成功】',
+ `english_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '英文名称',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '插件工具表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_resource
+-- ----------------------------
+CREATE TABLE `tb_resource`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `dept_id` bigint UNSIGNED NOT NULL COMMENT '部门ID',
+ `tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
+ `resource_type` int NOT NULL COMMENT '素材类型',
+ `resource_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '素材名称',
+ `suffix` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '后缀',
+ `resource_url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '素材地址',
+ `origin` int NOT NULL DEFAULT 0 COMMENT '素材来源',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL COMMENT '修改者',
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '扩展项',
+ `file_size` bigint UNSIGNED NULL DEFAULT NULL COMMENT '文件大小',
+ `category_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '分类ID',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '素材库' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_resource_category
+-- ----------------------------
+CREATE TABLE `tb_resource_category`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `category_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分类名称',
+ `sort_no` int NULL DEFAULT 0 COMMENT '排序',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL COMMENT '修改者',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '素材分类' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for tb_sys_account
+-- ----------------------------
+CREATE TABLE `tb_sys_account`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `dept_id` bigint UNSIGNED NOT NULL COMMENT '部门ID',
+ `tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
+ `login_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '登录账号',
+ `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码',
+ `password_reset_required` tinyint NOT NULL DEFAULT 0 COMMENT '是否需要重置密码',
+ `account_type` tinyint NOT NULL DEFAULT 0 COMMENT '账户类型',
+ `nickname` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '昵称',
+ `mobile` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '手机电话',
+ `email` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '邮件',
+ `avatar` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '账户头像',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL COMMENT '修改者',
+ `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '备注',
+ `is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '逻辑删除标识:0未删除,1已删除',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `idx_login_name`(`login_name`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_sys_account_position
+-- ----------------------------
+CREATE TABLE `tb_sys_account_position`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `account_id` bigint UNSIGNED NOT NULL COMMENT '用户ID',
+ `position_id` bigint UNSIGNED NOT NULL COMMENT '职位ID',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_account_position`(`account_id`, `position_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户-职位表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_sys_account_role
+-- ----------------------------
+CREATE TABLE `tb_sys_account_role`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `account_id` bigint UNSIGNED NOT NULL COMMENT '用户ID',
+ `role_id` bigint UNSIGNED NOT NULL COMMENT '角色ID',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_account_role`(`account_id`, `role_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户-角色表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_sys_api_key
+-- ----------------------------
+CREATE TABLE `tb_sys_api_key`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT 'id',
+ `api_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'apiKey',
+ `created` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `dept_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '部门id',
+ `tenant_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '租户id',
+ `expired_at` datetime NULL DEFAULT NULL COMMENT '失效时间',
+ `created_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '创建人',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_api_key`(`api_key`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'apikey表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_sys_api_key_resource
+-- ----------------------------
+CREATE TABLE `tb_sys_api_key_resource`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT 'id',
+ `request_interface` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '请求接口',
+ `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标题',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE KEY `uni_api` (`request_interface`)
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '请求接口表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for tb_sys_api_key_resource_mapping
+-- ----------------------------
+CREATE TABLE `tb_sys_api_key_resource_mapping`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT 'id',
+ `api_key_id` bigint UNSIGNED NOT NULL COMMENT 'api_key_id',
+ `api_key_resource_id` bigint UNSIGNED NOT NULL COMMENT '请求接口资源访问id',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_api_key_resource`(`api_key_id`, `api_key_resource_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'apikey-请求接口表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for tb_sys_dept
+-- ----------------------------
+CREATE TABLE `tb_sys_dept`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
+ `parent_id` bigint UNSIGNED NOT NULL COMMENT '父级ID',
+ `ancestors` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '父级部门ID集合',
+ `dept_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '部门名称',
+ `dept_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '部门编码',
+ `sort_no` int NULL DEFAULT 0 COMMENT '排序',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL COMMENT '修改者',
+ `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '备注',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '部门表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_sys_dict
+-- ----------------------------
+CREATE TABLE `tb_sys_dict`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '数据字典名称',
+ `code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '字典编码',
+ `description` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '字典描述或备注',
+ `dict_type` tinyint NULL DEFAULT NULL COMMENT '字典类型 1 自定义字典、2 数据表字典、 3 枚举类字典、 4 系统字典(自定义 DictLoader)',
+ `sort_no` int NULL DEFAULT NULL COMMENT '排序编号',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '扩展字典 存放 json',
+ `created` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `modified` datetime NULL DEFAULT NULL COMMENT '修改时间',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `key`(`code`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '系统字典表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_sys_dict_item
+-- ----------------------------
+CREATE TABLE `tb_sys_dict_item`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `dict_id` bigint UNSIGNED NOT NULL COMMENT '归属哪个字典',
+ `text` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '名称或内容',
+ `value` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '值',
+ `description` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '描述',
+ `sort_no` int NOT NULL DEFAULT 0 COMMENT '排序',
+ `css_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT 'css样式内容',
+ `css_class` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'css样式类名',
+ `remark` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `created` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `modified` datetime NULL DEFAULT NULL COMMENT '修改时间',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '数据字典内容' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_sys_job
+-- ----------------------------
+CREATE TABLE `tb_sys_job`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `dept_id` bigint UNSIGNED NOT NULL COMMENT '部门ID',
+ `tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
+ `job_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务名称',
+ `job_type` int NOT NULL COMMENT '任务类型',
+ `job_params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '任务参数',
+ `cron_expression` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'cron表达式',
+ `allow_concurrent` int NOT NULL DEFAULT 0 COMMENT '是否并发执行',
+ `misfire_policy` int NOT NULL DEFAULT 3 COMMENT '错过策略',
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '其他配置',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL COMMENT '修改者',
+ `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '备注',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '系统任务表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_sys_job_log
+-- ----------------------------
+CREATE TABLE `tb_sys_job_log`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `job_id` bigint UNSIGNED NOT NULL COMMENT '任务ID',
+ `job_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务名称',
+ `job_params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '任务参数',
+ `job_result` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '执行结果',
+ `error_info` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '错误信息',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `start_time` datetime NOT NULL COMMENT '开始时间',
+ `end_time` datetime NOT NULL COMMENT '结束时间',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '备注',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '系统任务日志' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_sys_log
+-- ----------------------------
+CREATE TABLE `tb_sys_log`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT 'ID',
+ `account_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '操作人',
+ `action_name` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作名称',
+ `action_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作的类型',
+ `action_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作涉及的类',
+ `action_method` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作涉及的方法',
+ `action_url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作涉及的 URL 地址',
+ `action_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作涉及的用户 IP 地址',
+ `action_params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '操作请求参数',
+ `action_body` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '操作请求body',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `created` datetime NULL DEFAULT NULL COMMENT '操作时间',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '操作日志表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_sys_menu
+-- ----------------------------
+CREATE TABLE `tb_sys_menu`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `parent_id` bigint UNSIGNED NOT NULL COMMENT '父菜单id',
+ `menu_type` int NOT NULL COMMENT '菜单类型',
+ `menu_title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '菜单标题',
+ `menu_url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '菜单url',
+ `component` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '组件路径',
+ `menu_icon` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '图标/图片地址',
+ `is_show` int NOT NULL DEFAULT 1 COMMENT '是否显示',
+ `permission_tag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '权限标识',
+ `sort_no` int NULL DEFAULT 0 COMMENT '排序',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL COMMENT '修改者',
+ `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '备注',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '菜单表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_sys_option
+-- ----------------------------
+CREATE TABLE `tb_sys_option`
+(
+ `tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
+ `key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '配置KEY',
+ `value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '配置内容',
+ UNIQUE INDEX `uni_key`(`tenant_id`, `key`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '系统配置信息表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_sys_position
+-- ----------------------------
+CREATE TABLE `tb_sys_position`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
+ `dept_id` bigint UNSIGNED NOT NULL COMMENT '部门ID',
+ `position_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '岗位名称',
+ `position_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '岗位编码',
+ `sort_no` int NULL DEFAULT 0 COMMENT '排序',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL COMMENT '修改者',
+ `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '备注',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '职位表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_sys_role
+-- ----------------------------
+CREATE TABLE `tb_sys_role`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
+ `role_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色名称',
+ `role_key` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色标识',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL COMMENT '修改者',
+ `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '备注',
+ `data_scope` int NULL DEFAULT 1 COMMENT '数据权限(EnumDataScope)',
+ `menu_check_strictly` tinyint NULL DEFAULT 1 COMMENT '菜单树选择项是否关联显示',
+ `dept_check_strictly` tinyint NULL DEFAULT 1 COMMENT '部门树选择项是否关联显示',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_tenant_role`(`tenant_id`, `role_key`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '系统角色' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_sys_role_dept
+-- ----------------------------
+CREATE TABLE `tb_sys_role_dept`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `role_id` bigint UNSIGNED NOT NULL COMMENT '角色ID',
+ `dept_id` bigint UNSIGNED NOT NULL COMMENT '部门ID',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_role_dept`(`role_id`, `dept_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色-部门表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_sys_role_menu
+-- ----------------------------
+CREATE TABLE `tb_sys_role_menu`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `role_id` bigint UNSIGNED NOT NULL COMMENT '角色ID',
+ `menu_id` bigint UNSIGNED NOT NULL COMMENT '菜单ID',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_role_menu`(`role_id`, `menu_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色-菜单表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_workflow
+-- ----------------------------
+CREATE TABLE `tb_workflow`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT 'ID 主键',
+ `alias` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '别名',
+ `dept_id` bigint UNSIGNED NOT NULL COMMENT '部门ID',
+ `tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
+ `title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '标题',
+ `description` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '描述',
+ `icon` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'ICON',
+ `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '工作流设计的 JSON 内容',
+ `created` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '创建人',
+ `modified` datetime NULL DEFAULT NULL COMMENT '最后修改时间',
+ `modified_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '最后修改的人',
+ `english_name` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '英文名称',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `category_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '分类ID',
+ `visibility_scope` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '可见范围',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `tb_ai_workflow_alias_uindex`(`alias`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '工作流' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_workflow_category
+-- ----------------------------
+CREATE TABLE `tb_workflow_category`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `category_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '分类名称',
+ `sort_no` int NULL DEFAULT 0 COMMENT '排序',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建者',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL COMMENT '修改者',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '工作流分类' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for tb_workflow_exec_result
+-- ----------------------------
+CREATE TABLE `tb_workflow_exec_result`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `exec_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '执行标识',
+ `workflow_id` bigint UNSIGNED NOT NULL COMMENT '工作流ID',
+ `title` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '标题',
+ `description` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '描述',
+ `input` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '输入',
+ `output` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '输出',
+ `workflow_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '工作流执行时的配置',
+ `start_time` datetime(3) NOT NULL COMMENT '开始时间',
+ `end_time` datetime(3) NULL DEFAULT NULL COMMENT '结束时间',
+ `tokens` bigint UNSIGNED NULL DEFAULT NULL COMMENT '消耗总token',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `created_key` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '执行人标识[有可能是用户|外部|定时任务等情况]',
+ `created_by` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '执行人',
+ `error_info` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '错误信息',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_exec_key`(`exec_key`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '工作流执行记录' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_workflow_exec_step
+-- ----------------------------
+CREATE TABLE `tb_workflow_exec_step`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `record_id` bigint UNSIGNED NOT NULL COMMENT '执行记录ID',
+ `exec_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '执行标识',
+ `node_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '节点ID',
+ `node_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '节点名称',
+ `input` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '输入',
+ `output` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '输出',
+ `node_data` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '节点信息',
+ `start_time` datetime(3) NOT NULL COMMENT '开始时间',
+ `end_time` datetime(3) NULL DEFAULT NULL COMMENT '结束时间',
+ `tokens` bigint UNSIGNED NULL DEFAULT NULL COMMENT '消耗总token',
+ `status` int NOT NULL DEFAULT 0 COMMENT '数据状态',
+ `error_info` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '错误信息',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_exec`(`exec_key`) USING BTREE,
+ INDEX `idx_record_id`(`record_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '执行记录步骤' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Table structure for tb_sys_user_feedback
+-- ----------------------------
+CREATE TABLE `tb_sys_user_feedback`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键id',
+ `feedback_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '问题摘要',
+ `feedback_type` int NOT NULL COMMENT '问题类型(1-功能故障 2-优化建议 3-账号问题 4-其他)',
+ `contact_info` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '联系方式【手机号/邮箱】',
+ `attachment_url` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '附件url',
+ `status` int NULL DEFAULT NULL COMMENT '反馈处理状态(0-未查看 1-已查看 2-已处理)',
+ `handler_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '处理人id',
+ `handle_time` datetime NULL DEFAULT NULL COMMENT '处理时间',
+ `dept_id` bigint UNSIGNED NOT NULL COMMENT '部门ID',
+ `tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL COMMENT '创建人',
+ `modified` datetime NULL DEFAULT NULL COMMENT '最后修改时间',
+ `modified_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '最后修改的人',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for tb_mcp
+-- ----------------------------
+CREATE TABLE `tb_mcp`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT 'id',
+ `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '标题',
+ `description` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '描述',
+ `config_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '完整MCP配置JSON',
+ `dept_id` bigint UNSIGNED NOT NULL COMMENT '部门ID',
+ `tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
+ `created` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '创建者ID',
+ `modified` datetime NULL DEFAULT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '修改者ID',
+ `status` tinyint NULL DEFAULT 0 COMMENT '是否启用',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'mcp表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for tb_bot_mcp
+-- ----------------------------
+CREATE TABLE `tb_bot_mcp`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT 'id',
+ `bot_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT 'botId',
+ `mcp_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT 'mcpId',
+ `mcp_tool_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'mcp工具名称',
+ `mcp_tool_description` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'mcp工具描述',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_bot_mcp`(`bot_id`, `mcp_id`, `mcp_tool_name`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+CREATE TABLE `tb_sys_role_category_scope`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `role_id` bigint UNSIGNED NOT NULL COMMENT '角色ID',
+ `resource_type` varchar(32) NOT NULL COMMENT '资源类型',
+ `scope_mode` varchar(16) NOT NULL COMMENT '范围模式',
+ `created` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '创建者',
+ `modified` datetime NULL DEFAULT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '修改者',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_role_resource_type`(`role_id`, `resource_type`) USING BTREE
+) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色分类权限范围';
+
+CREATE TABLE `tb_sys_role_category_scope_item`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `scope_id` bigint UNSIGNED NOT NULL COMMENT '范围ID',
+ `category_id` bigint UNSIGNED NOT NULL COMMENT '分类ID',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uni_scope_category`(`scope_id`, `category_id`) USING BTREE
+) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色分类权限明细';
+
+CREATE TABLE `tb_datacenter_source`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `dept_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '部门ID',
+ `tenant_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
+ `source_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '数据源名称',
+ `source_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '数据源编码',
+ `source_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '数据源类型',
+ `access_mode` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'READ_ONLY' COMMENT '访问模式',
+ `builtin_flag` int NOT NULL DEFAULT 0 COMMENT '是否内置',
+ `driver_class_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '驱动类名',
+ `jdbc_url` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'JDBC URL',
+ `host` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '主机',
+ `port` int NULL DEFAULT NULL COMMENT '端口',
+ `database_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '数据库名',
+ `schema_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'Schema名',
+ `username` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户名',
+ `credential_cipher` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '凭据密文',
+ `config_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '连接配置',
+ `capabilities_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '能力声明',
+ `last_test_status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '最近测试状态',
+ `last_test_message` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '最近测试信息',
+ `last_tested_at` datetime NULL DEFAULT NULL COMMENT '最近测试时间',
+ `status` int NOT NULL DEFAULT 0 COMMENT '状态',
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '扩展项',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改人',
+ PRIMARY KEY (`id`) USING BTREE,
+ KEY `idx_datacenter_source_tenant_type` (`tenant_id`, `source_type`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '数据中心数据源' ROW_FORMAT = DYNAMIC;
+
+CREATE TABLE `tb_datacenter_catalog`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `dept_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '部门ID',
+ `tenant_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
+ `source_id` bigint UNSIGNED NOT NULL COMMENT '数据源ID',
+ `catalog_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '目录名',
+ `catalog_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '目录描述',
+ `catalog_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'DATABASE' COMMENT '目录类型',
+ `status` int NOT NULL DEFAULT 0 COMMENT '状态',
+ `options` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '扩展项',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改人',
+ PRIMARY KEY (`id`) USING BTREE,
+ KEY `idx_datacenter_catalog_source` (`source_id`, `catalog_name`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '数据中心逻辑库/命名空间' ROW_FORMAT = DYNAMIC;
+
+CREATE TABLE `tb_datacenter_dataset_version`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `dept_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '部门ID',
+ `tenant_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
+ `table_id` bigint UNSIGNED NOT NULL COMMENT '表ID',
+ `version_no` int NOT NULL DEFAULT 1 COMMENT '版本号',
+ `version_label` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '版本标签',
+ `materialized_table` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '物化表名',
+ `snapshot_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '版本快照',
+ `status` int NOT NULL DEFAULT 0 COMMENT '状态',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改人',
+ PRIMARY KEY (`id`) USING BTREE,
+ KEY `idx_dataset_version_table` (`table_id`, `version_no`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '数据集版本' ROW_FORMAT = DYNAMIC;
+
+CREATE TABLE `tb_datacenter_import_job`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `dept_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '部门ID',
+ `tenant_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
+ `source_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '数据源ID',
+ `catalog_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '目录ID',
+ `table_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '表ID',
+ `job_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务类型',
+ `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文件名',
+ `storage_path` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文件存储路径',
+ `status` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务状态',
+ `total_rows` bigint NULL DEFAULT NULL COMMENT '总行数',
+ `success_rows` bigint NULL DEFAULT NULL COMMENT '成功行数',
+ `error_rows` bigint NULL DEFAULT NULL COMMENT '失败行数',
+ `error_summary` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '错误摘要',
+ `payload_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '任务载荷',
+ `started_at` datetime NULL DEFAULT NULL COMMENT '开始时间',
+ `finished_at` datetime NULL DEFAULT NULL COMMENT '结束时间',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改人',
+ PRIMARY KEY (`id`) USING BTREE,
+ KEY `idx_import_job_source` (`source_id`, `status`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '数据中心导入任务' ROW_FORMAT = DYNAMIC;
+
+CREATE TABLE `tb_datacenter_derived_table`
+(
+ `id` bigint UNSIGNED NOT NULL COMMENT '主键',
+ `dept_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '部门ID',
+ `tenant_id` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
+ `source_table_id` bigint UNSIGNED NOT NULL COMMENT '源表ID',
+ `derived_table_id` bigint UNSIGNED NOT NULL COMMENT '派生表ID',
+ `derive_type` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '派生类型',
+ `derive_config_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '派生配置',
+ `status` int NOT NULL DEFAULT 0 COMMENT '状态',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
+ `modified` datetime NOT NULL COMMENT '修改时间',
+ `modified_by` bigint UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改人',
+ PRIMARY KEY (`id`) USING BTREE,
+ KEY `idx_derived_table_source` (`source_table_id`, `derived_table_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '数据中心派生表关系' ROW_FORMAT = DYNAMIC;
+
+SET
+FOREIGN_KEY_CHECKS = 1;
diff --git a/easyflow-starter/easyflow-starter-all/src/main/resources/db/migration/mysql/V2__mysql_seed.sql b/easyflow-starter/easyflow-starter-all/src/main/resources/db/migration/mysql/V2__mysql_seed.sql
new file mode 100644
index 0000000..67e879d
--- /dev/null
+++ b/easyflow-starter/easyflow-starter-all/src/main/resources/db/migration/mysql/V2__mysql_seed.sql
@@ -0,0 +1,266 @@
+SET NAMES utf8mb4;
+
+-- ----------------------------
+-- Records of tb_sys_account
+-- ----------------------------
+INSERT INTO `tb_sys_account` (`id`, `dept_id`, `tenant_id`, `login_name`, `password`, `password_reset_required`, `account_type`, `nickname`, `mobile`, `email`, `avatar`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (1, 1, 1000000, 'admin', '$2a$10$Kmro/PF/MXkcV.o2I7.GiOEx/Y8l/E78ZyGW8OUgldDC46Hi.yidm', 0, 99, '超级管理员', '15555555555', 'bbb@qq.com', 'https://static.agentscenter.cn/public/1/2025/12/17/684ea528-8e42-489c-b254-4e52e0679431/b.jpeg', 1, '2025-06-06 11:32:21', 1, '2025-12-17 17:51:16', 1, '');
+
+-- ----------------------------
+-- Records of tb_sys_account_role
+-- ----------------------------
+INSERT INTO `tb_sys_account_role` (`id`, `account_id`, `role_id`) VALUES (302654483522224128, 1, 1);
+
+-- ----------------------------
+-- Records of tb_sys_dept
+-- ----------------------------
+INSERT INTO `tb_sys_dept` (`id`, `tenant_id`, `parent_id`, `ancestors`, `dept_name`, `dept_code`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (1, 1000000, 0, '0', '总公司', 'root_dept', 0, 1, '2025-03-17 09:09:57', 1, '2025-03-17 09:10:00', 1, '');
+
+-- ----------------------------
+-- Records of tb_sys_menu
+-- ----------------------------
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (183724390000000001, 258052082618335232, 0, 'menus.system.sysPosition', '/sys/sysPosition', '/system/sysPosition/SysPositionList', 'svg:position', 1, '', 300, 1, '2026-01-05 09:07:06', 0, '2026-01-05 09:12:37', 1, '岗位管理菜单');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (183724390000000002, 183724390000000001, 1, '查询', '', '', '', 0, '/api/v1/sysPosition/query', 100, 1, '2026-01-05 09:07:06', 0, '2026-01-05 09:07:06', 0, '岗位管理-查询');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (183724390000000003, 183724390000000001, 1, '保存', '', '', '', 0, '/api/v1/sysPosition/save', 101, 1, '2026-01-05 09:07:06', 0, '2026-01-05 09:07:06', 0, '岗位管理-保存');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (183724390000000004, 183724390000000001, 1, '删除', '', '', '', 0, '/api/v1/sysPosition/remove', 102, 1, '2026-01-05 09:07:06', 0, '2026-01-05 09:07:06', 0, '岗位管理-删除');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (258052082618335232, 0, 0, 'menus.system.title', '/sys', '', 'ant-design:appstore-outlined', 1, '', 200, 0, '2025-03-14 15:07:51', 1, '2025-12-02 13:39:37', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (258052774330368000, 258052082618335232, 0, 'menus.system.sysAccount', '/sys/sysAccount', '/system/sysAccount/SysAccountList', 'svg:account', 1, '', 100, 0, '2025-03-14 15:10:36', 1, '2025-12-25 16:49:03', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (258075705244676096, 258052082618335232, 0, 'menus.system.sysRole', '/sys/sysRole', '/system/sysRole/SysRoleList', 'svg:role', 1, '', 400, 0, '2025-03-14 16:41:43', 1, '2025-12-25 16:49:10', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (258075850434703360, 258052082618335232, 0, 'menus.system.sysMenu', '/sys/sysMenu', '/system/sysMenu/SysMenuList', 'svg:menu', 1, '', 500, 0, '2025-03-14 16:42:18', 1, '2025-12-25 16:49:23', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (259048038847483904, 258052082618335232, 0, 'menus.system.sysDept', '/sys/sysDept', '/system/sysDept/SysDeptList', 'svg:department', 1, '', 200, 0, '2025-03-17 09:05:25', 1, '2025-12-25 16:49:41', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (259168916721754112, 258052082618335232, 0, 'menus.settings.settingsConfig', '/sys/settings', '/config/settings/Settings', 'svg:setting', 1, '', 1000, 0, '2025-03-17 17:05:45', 1, '2025-12-26 11:17:36', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (259169318720626688, 258052082618335232, 0, 'menus.system.sysLog', '/sys/logs', '/system/sysLog/SysLogList', 'svg:log', 1, '', 600, 0, '2025-03-17 17:07:21', 1, '2025-12-25 16:49:59', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (259169837824466944, 259169540360232960, 0, 'menus.ai.bots', '/ai/bots', '/ai/bots/index', 'svg:talk', 1, '', 11, 0, '2025-03-17 17:09:24', 1, '2026-01-06 10:46:41', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (259169982154661888, 0, 0, 'menus.ai.plugin', '/ai/plugin', '/ai/plugin/Plugin', 'svg:plugin', 1, '', 21, 0, '2025-03-17 17:09:59', 1, '2025-12-26 11:14:29', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (259170117110587392, 0, 0, 'menus.ai.workflow', '/ai/workflow', '/ai/workflow/WorkflowList', 'svg:workflow', 1, '', 31, 0, '2025-03-17 17:10:31', 1, '2025-12-26 11:35:41', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (259170422338478080, 0, 0, 'menus.ai.documentCollection', '/ai/documentCollection', '/ai/documentCollection/DocumentCollection', 'svg:knowledge', 1, '', 51, 0, '2025-03-17 17:11:44', 1, '2025-12-26 11:14:42', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (259170538264846336, 0, 0, 'menus.ai.model', '/ai/model', '/ai/model/Model', 'svg:llm', 1, '', 61, 0, '2025-03-17 17:12:11', 1, '2025-12-26 11:15:16', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (270761213536096256, 258052082618335232, 0, 'menus.settings.apiKey', '/sys/sysApiKey', '/config/apikey/SysApiKey', 'svg:api', 1, '', 800, 0, '2025-04-18 16:49:24', 1, '2025-12-26 11:17:49', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (282254669269082112, 258052082618335232, 0, 'menus.system.sysJob', '/sys/sysJob', '/system/sysJob/SysJobList', 'svg:time', 1, '', 700, 0, '2025-05-20 10:00:17', 1, '2025-12-25 16:49:50', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243919118950400, 258052774330368000, 1, '查询', '', '', '', 0, '/api/v1/sysAccount/query', 1, 0, '2025-07-03 12:55:51', 1, '2025-07-03 12:55:51', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243919727124480, 258052774330368000, 1, '保存', '', '', '', 0, '/api/v1/sysAccount/save', 1, 0, '2025-07-03 12:55:51', 1, '2025-07-03 12:55:51', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243920205275136, 258052774330368000, 1, '删除', '', '', '', 0, '/api/v1/sysAccount/remove', 1, 0, '2025-07-03 12:55:51', 1, '2025-07-03 12:55:51', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243920679231488, 258075705244676096, 1, '查询', '', '', '', 0, '/api/v1/sysRole/query', 1, 0, '2025-07-03 12:55:52', 1, '2025-07-03 12:55:52', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243921161576448, 258075705244676096, 1, '保存', '', '', '', 0, '/api/v1/sysRole/save', 1, 0, '2025-07-03 12:55:52', 1, '2025-07-03 12:55:52', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243921639727104, 258075705244676096, 1, '删除', '', '', '', 0, '/api/v1/sysRole/remove', 1, 0, '2025-07-03 12:55:52', 1, '2025-07-03 12:55:52', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243922155626496, 258075850434703360, 1, '查询', '', '', '', 0, '/api/v1/sysMenu/query', 1, 0, '2025-07-03 12:55:52', 1, '2025-07-03 12:55:52', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243922637971456, 258075850434703360, 1, '保存', '', '', '', 0, '/api/v1/sysMenu/save', 1, 0, '2025-07-03 12:55:52', 1, '2025-07-03 12:55:52', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243923116122112, 258075850434703360, 1, '删除', '', '', '', 0, '/api/v1/sysMenu/remove', 1, 0, '2025-07-03 12:55:52', 1, '2025-07-03 12:55:52', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243923627827200, 259048038847483904, 1, '查询', '', '', '', 0, '/api/v1/sysDept/query', 1, 0, '2025-07-03 12:55:52', 1, '2025-07-03 12:55:52', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243924105977856, 259048038847483904, 1, '保存', '', '', '', 0, '/api/v1/sysDept/save', 1, 0, '2025-07-03 12:55:52', 1, '2025-07-03 12:55:52', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243924571545600, 259048038847483904, 1, '删除', '', '', '', 0, '/api/v1/sysDept/remove', 1, 0, '2025-07-03 12:55:52', 1, '2025-07-03 12:55:52', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243926450593792, 259168916721754112, 1, '查询', '', '', '', 0, '/api/v1/sysOption/query', 1, 0, '2025-07-03 12:55:53', 1, '2025-07-03 12:55:53', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243926920355840, 259168916721754112, 1, '保存', '', '', '', 0, '/api/v1/sysOption/save', 1, 0, '2025-07-03 12:55:53', 1, '2025-07-03 12:55:53', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243927385923584, 259168916721754112, 1, '删除', '', '', '', 0, '/api/v1/sysOption/remove', 1, 0, '2025-07-03 12:55:53', 1, '2025-07-03 12:55:53', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243929294331904, 259169318720626688, 1, '查询', '', '', '', 0, '/api/v1/sysLog/query', 1, 0, '2025-07-03 12:55:54', 1, '2025-07-03 12:55:54', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243929755705344, 259169318720626688, 1, '保存', '', '', '', 0, '/api/v1/sysLog/save', 1, 0, '2025-07-03 12:55:54', 1, '2025-07-03 12:55:54', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243930225467392, 259169318720626688, 1, '删除', '', '', '', 0, '/api/v1/sysLog/remove', 1, 0, '2025-07-03 12:55:54', 1, '2025-07-03 12:55:54', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243932104515584, 259169837824466944, 1, '查询', '', '', '', 0, '/api/v1/bot/query', 1, 0, '2025-07-03 12:55:55', 1, '2025-11-20 16:10:04', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243932607832064, 259169837824466944, 1, '保存', '', '', '', 0, '/api/v1/bot/save', 1, 0, '2025-07-03 12:55:55', 1, '2025-07-03 12:55:55', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243933077594112, 259169837824466944, 1, '删除', '', '', '', 0, '/api/v1/bot/remove', 1, 0, '2025-07-03 12:55:55', 1, '2025-07-03 12:55:55', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243933547356160, 259169982154661888, 1, '查询', '', '', '', 0, '/api/v1/plugin/query', 1, 0, '2025-07-03 12:55:55', 1, '2025-07-03 12:55:55', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243934025506816, 259169982154661888, 1, '保存', '', '', '', 0, '/api/v1/plugin/save', 1, 0, '2025-07-03 12:55:55', 1, '2025-07-03 12:55:55', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243934495268864, 259169982154661888, 1, '删除', '', '', '', 0, '/api/v1/plugin/remove', 1, 0, '2025-07-03 12:55:55', 1, '2025-07-03 12:55:55', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243934960836608, 259170117110587392, 1, '查询', '', '', '', 0, '/api/v1/workflow/query', 1, 0, '2025-07-03 12:55:55', 1, '2025-07-03 12:55:55', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243935430598656, 259170117110587392, 1, '保存', '', '', '', 0, '/api/v1/workflow/save', 1, 0, '2025-07-03 12:55:55', 1, '2025-07-03 12:55:55', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243935904555008, 259170117110587392, 1, '删除', '', '', '', 0, '/api/v1/workflow/remove', 1, 0, '2025-07-03 12:55:55', 1, '2025-07-03 12:55:55', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243936374317056, 259170422338478080, 1, '查询', '', '', '', 0, '/api/v1/documentCollection/query', 1, 0, '2025-07-03 12:55:56', 1, '2025-07-03 12:55:56', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243936848273408, 259170422338478080, 1, '保存', '', '', '', 0, '/api/v1/documentCollection/save', 1, 0, '2025-07-03 12:55:56', 1, '2025-07-03 12:55:56', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243937313841152, 259170422338478080, 1, '删除', '', '', '', 0, '/api/v1/documentCollection/remove', 1, 0, '2025-07-03 12:55:56', 1, '2025-07-03 12:55:56', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243937783603200, 259170538264846336, 1, '查询', '', '', '', 0, '/api/v1/model/query', 1, 0, '2025-07-03 12:55:56', 1, '2025-07-03 12:55:56', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243938240782336, 259170538264846336, 1, '保存', '', '', '', 0, '/api/v1/model/save', 1, 0, '2025-07-03 12:55:56', 1, '2025-07-03 12:55:56', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243938706350080, 259170538264846336, 1, '删除', '', '', '', 0, '/api/v1/model/remove', 1, 0, '2025-07-03 12:55:56', 1, '2025-07-03 12:55:56', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243939180306432, 270761213536096256, 1, '查询', '', '', '', 0, '/api/v1/sysApiKey/query', 1, 0, '2025-07-03 12:55:56', 1, '2025-07-03 12:55:56', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243939650068480, 270761213536096256, 1, '保存', '', '', '', 0, '/api/v1/sysApiKey/save', 1, 0, '2025-07-03 12:55:56', 1, '2025-07-03 12:55:56', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243940115636224, 270761213536096256, 1, '删除', '', '', '', 0, '/api/v1/sysApiKey/remove', 1, 0, '2025-07-03 12:55:56', 1, '2025-07-03 12:55:56', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243940614758400, 282254669269082112, 1, '查询', '', '', '', 0, '/api/v1/sysJob/query', 1, 0, '2025-07-03 12:55:57', 1, '2025-07-03 12:55:57', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243941080326144, 282254669269082112, 1, '保存', '', '', '', 0, '/api/v1/sysJob/save', 1, 0, '2025-07-03 12:55:57', 1, '2025-07-03 12:55:57', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (298243941545893888, 282254669269082112, 1, '删除', '', '', '', 0, '/api/v1/sysJob/remove', 1, 0, '2025-07-03 12:55:57', 1, '2025-07-03 12:55:57', 1, 'gen');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (300008008381800448, 0, 0, 'menus.ai.resources', '/ai/resource', '/ai/resource/ResourceList', 'svg:resource', 1, '', 52, 0, '2025-07-08 09:45:43', 1, '2025-12-26 11:37:42', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (300008359986110464, 300008008381800448, 1, '查询', '', '', '', 0, '/api/v1/resource/query', 0, 0, '2025-07-08 09:47:07', 1, '2025-07-08 09:47:07', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (300012644643815424, 300008008381800448, 1, '保存', '', '', '', 0, '/api/v1/resource/save', 0, 0, '2025-07-08 10:04:08', 1, '2025-07-08 10:04:08', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (300013092268326912, 300008008381800448, 1, '删除', '', '', '', 1, '/api/v1/resource/remove', 0, 0, '2025-07-08 10:05:55', 1, '2025-07-08 10:05:55', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (300817858217091072, 0, 0, 'menus.ai.datacenter', '/datacenter', '/datacenter/DatacenterWorkspace', 'svg:data-center', 1, '', 53, 0, '2025-07-10 15:23:46', 1, '2025-12-26 11:15:08', 1, '数据中心统一数据接入平台');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (363168956276838400, 258052082618335232, 0, 'menus.system.sysFeedback', '/sys/sysFeedback', '/system/sysFeedback/sysFeedbackList', 'svg:user-feedback', 1, '', 900, 0, '2025-12-29 16:44:47', 1, '2025-12-29 16:45:39', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (363435797225017344, 363168956276838400, 1, '删除', '', '', '', 0, '/api/v1/sysUserFeedback/remove', 3, 0, '2025-12-30 10:25:06', 1, '2025-12-30 10:26:15', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (363435949415337984, 363168956276838400, 1, '保存', '', '', '', 0, '/api/v1/sysUserFeedback/save', 2, 0, '2025-12-30 10:25:43', 1, '2025-12-30 10:26:10', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (363533849449447424, 363168956276838400, 1, '查询', '', '', '', 0, '/api/v1/sysUserFeedback/query', 1, 0, '2025-12-30 16:54:44', 1, '2025-12-30 16:54:44', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (365312682481553408, 0, 0, 'menus.ai.mcp', '/ai/mcp', '/ai/mcp/Mcp', 'svg:mcp', 1, '', 62, 0, '2026-01-04 14:43:11', 1, '2026-01-06 10:03:08', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (365314158356467712, 365312682481553408, 1, '查询', '', '', '', 0, '/api/v1/mcp/query', 1, 0, '2026-01-04 14:49:03', 1, '2026-01-04 14:49:03', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (365314258952654848, 365312682481553408, 1, '保存', '', '', '', 0, '/api/v1/mcp/save', 2, 0, '2026-01-04 14:49:27', 1, '2026-01-04 14:49:27', 1, '');
+INSERT INTO `tb_sys_menu` (`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`) VALUES (365314364238073856, 365312682481553408, 1, '删除', '', '', '', 0, '/api/v1/mcp/remove', 3, 0, '2026-01-04 14:49:52', 1, '2026-01-04 14:49:52', 1, '');
+
+-- ----------------------------
+-- Records of tb_sys_role
+-- ----------------------------
+INSERT INTO `tb_sys_role` (`id`, `tenant_id`, `role_name`, `role_key`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`, `data_scope`, `menu_check_strictly`, `dept_check_strictly`) VALUES (1, 1000000, '超级管理员', 'super_admin', 1, '2025-03-14 14:52:37', 1, '2025-03-14 14:52:37', 1, '', 1, 0, 0);
+
+-- ----------------------------
+-- Records of tb_sys_role_menu
+-- ----------------------------
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (183724390000000005, 1, 183724390000000001);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (183724390000000006, 1, 183724390000000002);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (183724390000000007, 1, 183724390000000003);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (183724390000000008, 1, 183724390000000004);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (259111372649250817, 1, 258052774330368000);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (259111372649250818, 1, 258075705244676096);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (259111372649250819, 1, 258075850434703360);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (259111372649250822, 1, 259048038847483904);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (259111372649250825, 1, 258052082618335232);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (259168916826611712, 1, 259168916721754112);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (259169318829678592, 1, 259169318720626688);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (259169837941907456, 1, 259169837824466944);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (259169982280491008, 1, 259169982154661888);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (259170117223833600, 1, 259170117110587392);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (259170422447529984, 1, 259170422338478080);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (259170538378092544, 1, 259170538264846336);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (270761213603205120, 1, 270761213536096256);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (282254669390716928, 1, 282254669269082112);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243919488049152, 1, 298243919118950400);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243919966199808, 1, 298243919727124480);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243920444350464, 1, 298243920205275136);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243920926695424, 1, 298243920679231488);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243921404846080, 1, 298243921161576448);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243921908162560, 1, 298243921639727104);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243922398896128, 1, 298243922155626496);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243922877046784, 1, 298243922637971456);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243923367780352, 1, 298243923116122112);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243923866902528, 1, 298243923627827200);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243924336664576, 1, 298243924105977856);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243924810620928, 1, 298243924571545600);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243926689669120, 1, 298243926450593792);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243927155236864, 1, 298243926920355840);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243927620804608, 1, 298243927385923584);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243929525018624, 1, 298243929294331904);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243929990586368, 1, 298243929755705344);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243930460348416, 1, 298243930225467392);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243932368756736, 1, 298243932104515584);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243932846907392, 1, 298243932607832064);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243933312475136, 1, 298243933077594112);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243933786431488, 1, 298243933547356160);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243934260387840, 1, 298243934025506816);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243934730149888, 1, 298243934495268864);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243935199911936, 1, 298243934960836608);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243935669673984, 1, 298243935430598656);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243936139436032, 1, 298243935904555008);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243936621780992, 1, 298243936374317056);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243937083154432, 1, 298243936848273408);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243937552916480, 1, 298243937313841152);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243938010095616, 1, 298243937783603200);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243938475663360, 1, 298243938240782336);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243938949619712, 1, 298243938706350080);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243939415187456, 1, 298243939180306432);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243939884949504, 1, 298243939650068480);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243940358905856, 1, 298243940115636224);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243940845445120, 1, 298243940614758400);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243941315207168, 1, 298243941080326144);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (298243941780774912, 1, 298243941545893888);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (300008008490852352, 1, 300008008381800448);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (300008360078385152, 1, 300008359986110464);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (300012644702535680, 1, 300012644643815424);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (300013092310269952, 1, 300013092268326912);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (300817858284199936, 1, 300817858217091072);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (363168956335558656, 1, 363168956276838400);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (363533849537527808, 1, 363533849449447424);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (365312682603188224, 1, 365312682481553408);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (365314158469713920, 1, 365314158356467712);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (365314259057512448, 1, 365314258952654848);
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES (365314364334542848, 1, 365314364238073856);
+
+
+-- ----------------------------
+-- Records of tb_model_provider
+-- ----------------------------
+INSERT INTO `tb_model_provider` (`id`, `provider_name`, `provider_type`, `icon`, `api_key`, `endpoint`, `chat_path`, `embed_path`, `rerank_path`, `created`, `created_by`, `modified`, `modified_by`) VALUES (359110667376132096, '硅基流动', 'siliconflow', '', '', 'https://api.siliconflow.cn', '/v1/chat/completions', '/v1/embeddings', '/v1/rerank', '2026-03-10 10:00:00', 1, '2026-03-10 10:00:00', 1);
+INSERT INTO `tb_model_provider` (`id`, `provider_name`, `provider_type`, `icon`, `api_key`, `endpoint`, `chat_path`, `embed_path`, `rerank_path`, `created`, `created_by`, `modified`, `modified_by`) VALUES (359110690079899648, 'Ollama', 'ollama', '', '', 'http://127.0.0.1:11434', '/v1/chat/completions', '/api/embed', '', '2026-03-10 10:00:00', 1, '2026-03-10 10:00:00', 1);
+INSERT INTO `tb_model_provider` (`id`, `provider_name`, `provider_type`, `icon`, `api_key`, `endpoint`, `chat_path`, `embed_path`, `rerank_path`, `created`, `created_by`, `modified`, `modified_by`) VALUES (359111120310632448, 'DeepSeek', 'deepseek', '', '', 'https://api.deepseek.com', '/chat/completions', '', '', '2026-03-10 10:00:00', 1, '2026-03-10 10:00:00', 1);
+INSERT INTO `tb_model_provider` (`id`, `provider_name`, `provider_type`, `icon`, `api_key`, `endpoint`, `chat_path`, `embed_path`, `rerank_path`, `created`, `created_by`, `modified`, `modified_by`) VALUES (359111228158771200, 'OpenAI', 'openai', '', '', 'https://api.openai.com', '/v1/chat/completions', '/v1/embeddings', '', '2026-03-10 10:00:00', 1, '2026-03-10 10:00:00', 1);
+INSERT INTO `tb_model_provider` (`id`, `provider_name`, `provider_type`, `icon`, `api_key`, `endpoint`, `chat_path`, `embed_path`, `rerank_path`, `created`, `created_by`, `modified`, `modified_by`) VALUES (359111448204541952, '阿里百炼', 'aliyun', '', '', 'https://dashscope.aliyuncs.com', '/compatible-mode/v1/chat/completions', '/compatible-mode/v1/embeddings', '/api/v1/services/rerank/text-rerank/text-rerank', '2026-03-10 10:00:00', 1, '2026-03-10 10:00:00', 1);
+INSERT INTO `tb_model_provider` (`id`, `provider_name`, `provider_type`, `icon`, `api_key`, `endpoint`, `chat_path`, `embed_path`, `rerank_path`, `created`, `created_by`, `modified`, `modified_by`) VALUES (366100000000000001, '智谱', 'zhipu', '', '', 'https://open.bigmodel.cn', '/api/paas/v4/chat/completions', '/api/paas/v4/embeddings', '', '2026-03-10 10:00:00', 1, '2026-03-10 10:00:00', 1);
+INSERT INTO `tb_model_provider` (`id`, `provider_name`, `provider_type`, `icon`, `api_key`, `endpoint`, `chat_path`, `embed_path`, `rerank_path`, `created`, `created_by`, `modified`, `modified_by`) VALUES (366100000000000002, 'MiniMax', 'minimax', '', '', 'https://api.minimax.io', '/v1/chat/completions', '', '', '2026-03-10 10:00:00', 1, '2026-03-10 10:00:00', 1);
+INSERT INTO `tb_model_provider` (`id`, `provider_name`, `provider_type`, `icon`, `api_key`, `endpoint`, `chat_path`, `embed_path`, `rerank_path`, `created`, `created_by`, `modified`, `modified_by`) VALUES (366100000000000003, 'Kimi', 'kimi', '', '', 'https://api.moonshot.cn', '/v1/chat/completions', '', '', '2026-03-10 10:00:00', 1, '2026-03-10 10:00:00', 1);
+INSERT INTO `tb_model_provider` (`id`, `provider_name`, `provider_type`, `icon`, `api_key`, `endpoint`, `chat_path`, `embed_path`, `rerank_path`, `created`, `created_by`, `modified`, `modified_by`) VALUES (366100000000000004, '自部署', 'self-hosted', '', '', 'http://127.0.0.1:8000', '/v1/chat/completions', '/v1/embeddings', '/v1/score', '2026-03-10 10:00:00', 1, '2026-03-10 10:00:00', 1);
+
+-- ----------------------------
+-- Records of tb_sys_option
+-- ----------------------------
+
+INSERT INTO `tb_mcp` (`id`, `title`, `description`, `config_json`, `dept_id`, `tenant_id`, `created`, `created_by`, `modified`, `modified_by`, `status`) VALUES (365597368948781056, '测试everything', 'MCP测试功能', '{
+ \"mcpServers\": {
+ \"everything\": {
+ \"command\": \"npx\",
+ \"args\": [
+ \"-y\",
+ \"@modelcontextprotocol/server-everything\"
+ ]
+ }
+ }
+}', 1, 1000000, '2026-01-06 09:57:07', 1, '2026-01-06 09:57:07', 1, 0);
+INSERT INTO `tb_mcp` (`id`, `title`, `description`, `config_json`, `dept_id`, `tenant_id`, `created`, `created_by`, `modified`, `modified_by`, `status`) VALUES (365956218142994432, '12306购票综合查询', '12306购票综合查询', '{
+ \"mcpServers\": {
+ \"12306-mcp\": {
+ \"command\": \"npx\",
+ \"args\": [
+ \"-y\",
+ \"12306-mcp\"
+ ]
+ }
+ }
+}', 1, 1000000, '2026-01-06 09:56:44', 1, '2026-01-06 09:56:44', 1, 0);
+
+INSERT INTO `tb_sys_menu` (
+ `id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`,
+ `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`
+) VALUES (
+ 366200000000000001, 0, 0, 'menus.dashboard.workspace', '/dashboard/workspace', '/dashboard/workspace/index',
+ 'carbon:workspace', 1, '', 1, 0, '2026-03-24 10:00:00', 1, '2026-03-24 10:00:00', 1, '管理员工作台'
+);
+
+INSERT INTO `tb_sys_menu` (
+ `id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`,
+ `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`
+) VALUES (
+ 366200000000000002, 366200000000000001, 1, '查询', '', '', '',
+ 0, '/api/v1/dashboard/query', 1, 0, '2026-03-24 10:00:00', 1, '2026-03-24 10:00:00', 1, '工作台统计查询权限'
+);
+
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (366200000000000101, 1, 366200000000000001),
+ (366200000000000103, 1, 366200000000000002);
+
+INSERT INTO `tb_sys_menu` (
+ `id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`,
+ `is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`
+) VALUES (
+ 366200000000000003, 0, 0, '聊天历史', '/ai/chat-history', '/ai/chatHistory/index',
+ 'svg:chat-history', 1, '', 63, 0, '2026-04-04 17:00:00', 1, '2026-04-04 17:00:00', 1, '管理端聊天历史菜单'
+);
+
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES (366200000000000104, 1, 366200000000000003);
+
+INSERT INTO `tb_sys_api_key_resource` (`id`, `request_interface`, `title`)
+VALUES
+ (366700000000000001, '/v1/chat/completions', '统一模型调用(OpenAI Chat Completions)'),
+ (366700000000000002, '/public-api/bot/chat', '外链聊天助手调用');
+
+INSERT INTO `tb_sys_role_category_scope` (`id`, `role_id`, `resource_type`, `scope_mode`, `created`, `created_by`, `modified`, `modified_by`)
+VALUES
+ (366800000000000001, 1, 'BOT', 'ALL', NOW(), 1, NOW(), 1),
+ (366800000000000002, 1, 'PLUGIN', 'ALL', NOW(), 1, NOW(), 1),
+ (366800000000000003, 1, 'WORKFLOW', 'ALL', NOW(), 1, NOW(), 1),
+ (366800000000000004, 1, 'KNOWLEDGE', 'ALL', NOW(), 1, NOW(), 1),
+ (366800000000000005, 1, 'RESOURCE', 'ALL', NOW(), 1, NOW(), 1);
+
+INSERT INTO `tb_sys_menu` (
+ `id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`,
+ `menu_icon`, `is_show`, `permission_tag`, `sort_no`, `status`,
+ `created`, `created_by`, `modified`, `modified_by`, `remark`
+)
+VALUES
+ (366300000000000003, 300817858217091072, 1, '查询', '', '', '', 0, '/api/v1/datacenterSource/query', 1, 0, '2026-03-24 10:00:00', 1, '2026-03-24 10:00:00', 1, '数据源接入-查询'),
+ (366300000000000004, 300817858217091072, 1, '保存', '', '', '', 0, '/api/v1/datacenterSource/save', 2, 0, '2026-03-24 10:00:00', 1, '2026-03-24 10:00:00', 1, '数据源接入-保存');
+
+INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`)
+VALUES
+ (366300000000000103, 1, 366300000000000003),
+ (366300000000000104, 1, 366300000000000004);
diff --git a/easyflow-starter/easyflow-starter-all/src/main/resources/db/migration/mysql/V3__mysql_quartz.sql b/easyflow-starter/easyflow-starter-all/src/main/resources/db/migration/mysql/V3__mysql_quartz.sql
new file mode 100644
index 0000000..80d899d
--- /dev/null
+++ b/easyflow-starter/easyflow-starter-all/src/main/resources/db/migration/mysql/V3__mysql_quartz.sql
@@ -0,0 +1,162 @@
+SET FOREIGN_KEY_CHECKS = 0;
+
+
+CREATE TABLE TB_QRTZ_JOB_DETAILS(
+SCHED_NAME VARCHAR(120) NOT NULL,
+JOB_NAME VARCHAR(190) NOT NULL,
+JOB_GROUP VARCHAR(190) NOT NULL,
+DESCRIPTION VARCHAR(250) NULL,
+JOB_CLASS_NAME VARCHAR(250) NOT NULL,
+IS_DURABLE VARCHAR(1) NOT NULL,
+IS_NONCONCURRENT VARCHAR(1) NOT NULL,
+IS_UPDATE_DATA VARCHAR(1) NOT NULL,
+REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
+JOB_DATA BLOB NULL,
+PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))
+ENGINE=InnoDB;
+
+CREATE TABLE TB_QRTZ_TRIGGERS (
+SCHED_NAME VARCHAR(120) NOT NULL,
+TRIGGER_NAME VARCHAR(190) NOT NULL,
+TRIGGER_GROUP VARCHAR(190) NOT NULL,
+JOB_NAME VARCHAR(190) NOT NULL,
+JOB_GROUP VARCHAR(190) NOT NULL,
+DESCRIPTION VARCHAR(250) NULL,
+NEXT_FIRE_TIME BIGINT NULL,
+PREV_FIRE_TIME BIGINT NULL,
+PRIORITY INTEGER NULL,
+TRIGGER_STATE VARCHAR(16) NOT NULL,
+TRIGGER_TYPE VARCHAR(8) NOT NULL,
+START_TIME BIGINT NOT NULL,
+END_TIME BIGINT NULL,
+CALENDAR_NAME VARCHAR(190) NULL,
+MISFIRE_INSTR SMALLINT NULL,
+JOB_DATA BLOB NULL,
+PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
+CONSTRAINT FK_TB_QRTZ_TRIGGERS_JOB_DETAILS FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
+REFERENCES TB_QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))
+ENGINE=InnoDB;
+
+CREATE TABLE TB_QRTZ_SIMPLE_TRIGGERS (
+SCHED_NAME VARCHAR(120) NOT NULL,
+TRIGGER_NAME VARCHAR(190) NOT NULL,
+TRIGGER_GROUP VARCHAR(190) NOT NULL,
+REPEAT_COUNT BIGINT NOT NULL,
+REPEAT_INTERVAL BIGINT NOT NULL,
+TIMES_TRIGGERED BIGINT NOT NULL,
+PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
+CONSTRAINT FK_TB_QRTZ_SIMPLE_TRIGGERS_TRIGGERS FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+REFERENCES TB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
+ENGINE=InnoDB;
+
+CREATE TABLE TB_QRTZ_CRON_TRIGGERS (
+SCHED_NAME VARCHAR(120) NOT NULL,
+TRIGGER_NAME VARCHAR(190) NOT NULL,
+TRIGGER_GROUP VARCHAR(190) NOT NULL,
+CRON_EXPRESSION VARCHAR(120) NOT NULL,
+TIME_ZONE_ID VARCHAR(80),
+PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
+CONSTRAINT FK_TB_QRTZ_CRON_TRIGGERS_TRIGGERS FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+REFERENCES TB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
+ENGINE=InnoDB;
+
+CREATE TABLE TB_QRTZ_SIMPROP_TRIGGERS
+ (
+ SCHED_NAME VARCHAR(120) NOT NULL,
+ TRIGGER_NAME VARCHAR(190) NOT NULL,
+ TRIGGER_GROUP VARCHAR(190) NOT NULL,
+ STR_PROP_1 VARCHAR(512) NULL,
+ STR_PROP_2 VARCHAR(512) NULL,
+ STR_PROP_3 VARCHAR(512) NULL,
+ INT_PROP_1 INT NULL,
+ INT_PROP_2 INT NULL,
+ LONG_PROP_1 BIGINT NULL,
+ LONG_PROP_2 BIGINT NULL,
+ DEC_PROP_1 NUMERIC(13,4) NULL,
+ DEC_PROP_2 NUMERIC(13,4) NULL,
+ BOOL_PROP_1 VARCHAR(1) NULL,
+ BOOL_PROP_2 VARCHAR(1) NULL,
+ PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
+ CONSTRAINT FK_TB_QRTZ_SIMPROP_TRIGGERS_TRIGGERS FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+ REFERENCES TB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
+ENGINE=InnoDB;
+
+CREATE TABLE TB_QRTZ_BLOB_TRIGGERS (
+SCHED_NAME VARCHAR(120) NOT NULL,
+TRIGGER_NAME VARCHAR(190) NOT NULL,
+TRIGGER_GROUP VARCHAR(190) NOT NULL,
+BLOB_DATA BLOB NULL,
+PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
+INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
+CONSTRAINT FK_TB_QRTZ_BLOB_TRIGGERS_TRIGGERS FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+REFERENCES TB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
+ENGINE=InnoDB;
+
+CREATE TABLE TB_QRTZ_CALENDARS (
+SCHED_NAME VARCHAR(120) NOT NULL,
+CALENDAR_NAME VARCHAR(190) NOT NULL,
+CALENDAR BLOB NOT NULL,
+PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))
+ENGINE=InnoDB;
+
+CREATE TABLE TB_QRTZ_PAUSED_TRIGGER_GRPS (
+SCHED_NAME VARCHAR(120) NOT NULL,
+TRIGGER_GROUP VARCHAR(190) NOT NULL,
+PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))
+ENGINE=InnoDB;
+
+CREATE TABLE TB_QRTZ_FIRED_TRIGGERS (
+SCHED_NAME VARCHAR(120) NOT NULL,
+ENTRY_ID VARCHAR(95) NOT NULL,
+TRIGGER_NAME VARCHAR(190) NOT NULL,
+TRIGGER_GROUP VARCHAR(190) NOT NULL,
+INSTANCE_NAME VARCHAR(190) NOT NULL,
+FIRED_TIME BIGINT NOT NULL,
+SCHED_TIME BIGINT NOT NULL,
+PRIORITY INTEGER NOT NULL,
+STATE VARCHAR(16) NOT NULL,
+JOB_NAME VARCHAR(190) NULL,
+JOB_GROUP VARCHAR(190) NULL,
+IS_NONCONCURRENT VARCHAR(1) NULL,
+REQUESTS_RECOVERY VARCHAR(1) NULL,
+PRIMARY KEY (SCHED_NAME,ENTRY_ID))
+ENGINE=InnoDB;
+
+CREATE TABLE TB_QRTZ_SCHEDULER_STATE (
+SCHED_NAME VARCHAR(120) NOT NULL,
+INSTANCE_NAME VARCHAR(190) NOT NULL,
+LAST_CHECKIN_TIME BIGINT NOT NULL,
+CHECKIN_INTERVAL BIGINT NOT NULL,
+PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))
+ENGINE=InnoDB;
+
+CREATE TABLE TB_QRTZ_LOCKS (
+SCHED_NAME VARCHAR(120) NOT NULL,
+LOCK_NAME VARCHAR(40) NOT NULL,
+PRIMARY KEY (SCHED_NAME,LOCK_NAME))
+ENGINE=InnoDB;
+
+CREATE INDEX IDX_TB_QRTZ_J_REQ_RECOVERY ON TB_QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);
+CREATE INDEX IDX_TB_QRTZ_J_GRP ON TB_QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP);
+
+CREATE INDEX IDX_TB_QRTZ_T_J ON TB_QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
+CREATE INDEX IDX_TB_QRTZ_T_JG ON TB_QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP);
+CREATE INDEX IDX_TB_QRTZ_T_C ON TB_QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME);
+CREATE INDEX IDX_TB_QRTZ_T_G ON TB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
+CREATE INDEX IDX_TB_QRTZ_T_STATE ON TB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE);
+CREATE INDEX IDX_TB_QRTZ_T_N_STATE ON TB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
+CREATE INDEX IDX_TB_QRTZ_T_N_G_STATE ON TB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
+CREATE INDEX IDX_TB_QRTZ_T_NEXT_FIRE_TIME ON TB_QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);
+CREATE INDEX IDX_TB_QRTZ_T_NFT_ST ON TB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
+CREATE INDEX IDX_TB_QRTZ_T_NFT_MISFIRE ON TB_QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
+CREATE INDEX IDX_TB_QRTZ_T_NFT_ST_MISFIRE ON TB_QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
+CREATE INDEX IDX_TB_QRTZ_T_NFT_ST_MISFIRE_GRP ON TB_QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
+
+CREATE INDEX IDX_TB_QRTZ_FT_TRIG_INST_NAME ON TB_QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);
+CREATE INDEX IDX_TB_QRTZ_FT_INST_JOB_REQ_RCVRY ON TB_QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
+CREATE INDEX IDX_TB_QRTZ_FT_J_G ON TB_QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
+CREATE INDEX IDX_TB_QRTZ_FT_JG ON TB_QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);
+CREATE INDEX IDX_TB_QRTZ_FT_T_G ON TB_QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
+CREATE INDEX IDX_TB_QRTZ_FT_TG ON TB_QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/pom.xml b/pom.xml
index 2cec0c7..bd21262 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,6 +26,8 @@
4.9.3
3.5.9
10.20.1
+ 10.20.0
+ 0.7.1
2.0.17
4.0.3
2.0.57
@@ -142,6 +144,13 @@
8.3.0
+
+ com.clickhouse
+ clickhouse-jdbc
+ ${clickhouse.version}
+ all
+
+
com.mybatis-flex
mybatis-flex-codegen
@@ -255,6 +264,11 @@
flyway-mysql
${flyway.version}
+
+ org.flywaydb
+ flyway-database-clickhouse
+ ${flyway.clickhouse.version}
+
com.alibaba
@@ -304,6 +318,11 @@
easyflow-common-ai
${revision}
+
+ tech.easyflow
+ easyflow-common-analytical-db
+ ${revision}
+
tech.easyflow
easyflow-common-all
@@ -354,6 +373,11 @@
easyflow-common-chat-protocol
${revision}
+
+ tech.easyflow
+ easyflow-common-mq
+ ${revision}
+
@@ -376,6 +400,11 @@
easyflow-module-log
${revision}
+
+ tech.easyflow
+ easyflow-module-chatlog
+ ${revision}
+
tech.easyflow
easyflow-module-system