From 086151bdd7ec596394072670112297a583ce961c Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期五, 04 九月 2026 23:36:35 +0800
Subject: [PATCH] 建立最终数据库基线
---
ruoyi-admin/src/main/java/com/ruoyi/config/FlywayMigrationConfig.java | 3
ruoyi-admin/src/main/resources/db/migration-final/V1__ruoyi_platform_baseline.sql | 586 ++++++++++++++++++++++++++++++
ruoyi-admin/src/main/resources/application.yml | 3
ruoyi-admin/src/main/resources/db/migration-final/V2__final_business_baseline.sql | 460 ++++++++++++++++++++++++
ruoyi-admin/src/test/java/com/ruoyi/config/FinalDatabaseBaselineContractTest.java | 81 ++++
5 files changed, 1,131 insertions(+), 2 deletions(-)
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/config/FlywayMigrationConfig.java b/ruoyi-admin/src/main/java/com/ruoyi/config/FlywayMigrationConfig.java
index 6bebef3..899d4b5 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/config/FlywayMigrationConfig.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/config/FlywayMigrationConfig.java
@@ -27,7 +27,8 @@
// Flyway must not use a pooled Druid connection here. Druid disables
// the connection when MySQL denies Flyway's optional performance_schema probe.
.dataSource(druidDataSource.getUrl(), druidDataSource.getUsername(), druidDataSource.getPassword())
- .locations("classpath:db/migration")
+ // 旧迁移链仅作历史保留,新库从最终业务基线初始化。
+ .locations("classpath:db/migration-final")
.baselineOnMigrate(false)
.validateOnMigrate(true)
.outOfOrder(false)
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 96346ba..0bd5b6e 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -50,7 +50,8 @@
spring:
flyway:
enabled: true
- locations: classpath:db/migration
+ # 重构使用独立最终基线;旧 db/migration 目录仅作为不可变历史保留。
+ locations: classpath:db/migration-final
baseline-on-migrate: false
validate-on-migrate: true
out-of-order: false
diff --git a/ruoyi-admin/src/main/resources/db/migration-final/V1__ruoyi_platform_baseline.sql b/ruoyi-admin/src/main/resources/db/migration-final/V1__ruoyi_platform_baseline.sql
new file mode 100644
index 0000000..9b6ef28
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/db/migration-final/V1__ruoyi_platform_baseline.sql
@@ -0,0 +1,586 @@
+-- 平台结构快照;旧迁移目录中的同名脚本作为不可变历史保留。
+-- 仅包含平台结构和登录所需的最小基础种子数据。
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+CREATE TABLE `QRTZ_BLOB_TRIGGERS` (
+ `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称',
+ `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键',
+ `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键',
+ `blob_data` blob NULL COMMENT '存放持久化Trigger对象',
+ PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'Blob类型的触发器表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `QRTZ_CALENDARS` (
+ `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称',
+ `calendar_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '日历名称',
+ `calendar` blob NOT NULL COMMENT '存放持久化calendar对象',
+ PRIMARY KEY (`sched_name`, `calendar_name`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '日历信息表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `QRTZ_CRON_TRIGGERS` (
+ `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称',
+ `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键',
+ `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键',
+ `cron_expression` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'cron表达式',
+ `time_zone_id` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '时区',
+ PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'Cron类型的触发器表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `QRTZ_FIRED_TRIGGERS` (
+ `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称',
+ `entry_id` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度器实例id',
+ `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键',
+ `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键',
+ `instance_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度器实例名',
+ `fired_time` bigint NOT NULL COMMENT '触发的时间',
+ `sched_time` bigint NOT NULL COMMENT '定时器制定的时间',
+ `priority` int NOT NULL COMMENT '优先级',
+ `state` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '状态',
+ `job_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '任务名称',
+ `job_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '任务组名',
+ `is_nonconcurrent` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否并发',
+ `requests_recovery` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否接受恢复执行',
+ PRIMARY KEY (`sched_name`, `entry_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '已触发的触发器表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `QRTZ_JOB_DETAILS` (
+ `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称',
+ `job_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务名称',
+ `job_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务组名',
+ `description` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '相关介绍',
+ `job_class_name` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '执行任务类名称',
+ `is_durable` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '是否持久化',
+ `is_nonconcurrent` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '是否并发',
+ `is_update_data` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '是否更新数据',
+ `requests_recovery` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '是否接受恢复执行',
+ `job_data` blob NULL COMMENT '存放持久化job对象',
+ PRIMARY KEY (`sched_name`, `job_name`, `job_group`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '任务详细信息表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `QRTZ_LOCKS` (
+ `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称',
+ `lock_name` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '悲观锁名称',
+ PRIMARY KEY (`sched_name`, `lock_name`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '存储的悲观锁信息表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `QRTZ_PAUSED_TRIGGER_GRPS` (
+ `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称',
+ `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键',
+ PRIMARY KEY (`sched_name`, `trigger_group`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '暂停的触发器表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `QRTZ_SCHEDULER_STATE` (
+ `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称',
+ `instance_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '实例名称',
+ `last_checkin_time` bigint NOT NULL COMMENT '上次检查时间',
+ `checkin_interval` bigint NOT NULL COMMENT '检查间隔时间',
+ PRIMARY KEY (`sched_name`, `instance_name`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '调度器状态表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `QRTZ_SIMPLE_TRIGGERS` (
+ `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称',
+ `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键',
+ `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键',
+ `repeat_count` bigint NOT NULL COMMENT '重复的次数统计',
+ `repeat_interval` bigint NOT NULL COMMENT '重复的间隔时间',
+ `times_triggered` bigint NOT NULL COMMENT '已经触发的次数',
+ PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '简单触发器的信息表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `QRTZ_SIMPROP_TRIGGERS` (
+ `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称',
+ `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键',
+ `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键',
+ `str_prop_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'String类型的trigger的第一个参数',
+ `str_prop_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'String类型的trigger的第二个参数',
+ `str_prop_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'String类型的trigger的第三个参数',
+ `int_prop_1` int NULL DEFAULT NULL COMMENT 'int类型的trigger的第一个参数',
+ `int_prop_2` int NULL DEFAULT NULL COMMENT 'int类型的trigger的第二个参数',
+ `long_prop_1` bigint NULL DEFAULT NULL COMMENT 'long类型的trigger的第一个参数',
+ `long_prop_2` bigint NULL DEFAULT NULL COMMENT 'long类型的trigger的第二个参数',
+ `dec_prop_1` decimal(13, 4) NULL DEFAULT NULL COMMENT 'decimal类型的trigger的第一个参数',
+ `dec_prop_2` decimal(13, 4) NULL DEFAULT NULL COMMENT 'decimal类型的trigger的第二个参数',
+ `bool_prop_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'Boolean类型的trigger的第一个参数',
+ `bool_prop_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'Boolean类型的trigger的第二个参数',
+ PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '同步机制的行锁表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `QRTZ_TRIGGERS` (
+ `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调度名称',
+ `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '触发器的名字',
+ `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '触发器所属组的名字',
+ `job_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_job_details表job_name的外键',
+ `job_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'qrtz_job_details表job_group的外键',
+ `description` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '相关介绍',
+ `next_fire_time` bigint NULL DEFAULT NULL COMMENT '上一次触发时间(毫秒)',
+ `prev_fire_time` bigint NULL DEFAULT NULL COMMENT '下一次触发时间(默认为-1表示不触发)',
+ `priority` int NULL DEFAULT NULL COMMENT '优先级',
+ `trigger_state` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '触发器状态',
+ `trigger_type` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '触发器的类型',
+ `start_time` bigint NOT NULL COMMENT '开始时间',
+ `end_time` bigint NULL DEFAULT NULL COMMENT '结束时间',
+ `calendar_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '日程表名称',
+ `misfire_instr` smallint NULL DEFAULT NULL COMMENT '补偿执行的策略',
+ `job_data` blob NULL COMMENT '存放持久化job对象',
+ PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE,
+ INDEX `sched_name`(`sched_name` ASC, `job_name` ASC, `job_group` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '触发器详细信息表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `gen_table` (
+ `table_id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
+ `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '表名称',
+ `table_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '表描述',
+ `sub_table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '关联子表的表名',
+ `sub_table_fk_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '子表关联的外键名',
+ `class_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '实体类名称',
+ `tpl_category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)',
+ `tpl_web_type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '前端模板类型(element-ui模版 element-plus模版)',
+ `package_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成包路径',
+ `module_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成模块名',
+ `business_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成业务名',
+ `function_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成功能名',
+ `function_author` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成功能作者',
+ `form_col_num` int NULL DEFAULT 1 COMMENT '表单布局(单列 双列 三列)',
+ `gen_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)',
+ `gen_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '/' COMMENT '生成路径(不填默认项目路径)',
+ `options` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '其它生成选项',
+ `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`table_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '代码生成业务表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `gen_table_column` (
+ `column_id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
+ `table_id` bigint NULL DEFAULT NULL COMMENT '归属表编号',
+ `column_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '列名称',
+ `column_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '列描述',
+ `column_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '列类型',
+ `java_type` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'JAVA类型',
+ `java_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'JAVA字段名',
+ `is_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否主键(1是)',
+ `is_increment` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否自增(1是)',
+ `is_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否必填(1是)',
+ `is_insert` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否为插入字段(1是)',
+ `is_edit` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否编辑字段(1是)',
+ `is_list` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否列表字段(1是)',
+ `is_query` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否查询字段(1是)',
+ `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)',
+ `html_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',
+ `dict_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典类型',
+ `sort` int NULL DEFAULT NULL COMMENT '排序',
+ `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+ PRIMARY KEY (`column_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '代码生成业务表字段' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_config` (
+ `config_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '参数主键',
+ `config_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '参数名称',
+ `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '参数键名',
+ `config_value` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '参数键值',
+ `config_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'N' COMMENT '系统内置(Y是 N否)',
+ `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`config_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '参数配置表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_dept` (
+ `dept_id` bigint NOT NULL AUTO_INCREMENT COMMENT '部门id',
+ `parent_id` bigint NULL DEFAULT 0 COMMENT '父部门id',
+ `ancestors` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '祖级列表',
+ `dept_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '部门名称',
+ `order_num` int NULL DEFAULT 0 COMMENT '显示顺序',
+ `leader` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '负责人',
+ `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '联系电话',
+ `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '邮箱',
+ `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '部门状态(0正常 1停用)',
+ `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+ `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+ PRIMARY KEY (`dept_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 200 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '部门表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_dict_data` (
+ `dict_code` bigint NOT NULL AUTO_INCREMENT COMMENT '字典编码',
+ `dict_sort` int NULL DEFAULT 0 COMMENT '字典排序',
+ `dict_label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典标签',
+ `dict_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典键值',
+ `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典类型',
+ `css_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '样式属性(其他样式扩展)',
+ `list_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '表格回显样式',
+ `is_default` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'N' COMMENT '是否默认(Y是 N否)',
+ `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)',
+ `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`dict_code`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '字典数据表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_dict_type` (
+ `dict_id` bigint NOT NULL AUTO_INCREMENT COMMENT '字典主键',
+ `dict_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典名称',
+ `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典类型',
+ `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)',
+ `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`dict_id`) USING BTREE,
+ UNIQUE INDEX `dict_type`(`dict_type` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '字典类型表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_job` (
+ `job_id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务ID',
+ `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '任务名称',
+ `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'DEFAULT' COMMENT '任务组名',
+ `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调用目标字符串',
+ `cron_expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT 'cron执行表达式',
+ `misfire_policy` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '3' COMMENT '计划执行错误策略(1立即执行 2执行一次 3放弃执行)',
+ `concurrent` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '是否并发执行(0允许 1禁止)',
+ `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '状态(0正常 1暂停)',
+ `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '备注信息',
+ PRIMARY KEY (`job_id`, `job_name`, `job_group`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '定时任务调度表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_job_log` (
+ `job_log_id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务日志ID',
+ `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务名称',
+ `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务组名',
+ `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调用目标字符串',
+ `job_message` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '日志信息',
+ `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '执行状态(0正常 1失败)',
+ `exception_info` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '异常信息',
+ `start_time` datetime NULL DEFAULT NULL COMMENT '执行开始时间',
+ `end_time` datetime NULL DEFAULT NULL COMMENT '执行结束时间',
+ `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ PRIMARY KEY (`job_log_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '定时任务调度日志表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_logininfor` (
+ `info_id` bigint NOT NULL AUTO_INCREMENT COMMENT '访问ID',
+ `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '用户账号',
+ `ipaddr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '登录IP地址',
+ `login_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '登录地点',
+ `browser` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '浏览器类型',
+ `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '操作系统',
+ `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '登录状态(0成功 1失败)',
+ `msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '提示消息',
+ `login_time` datetime NULL DEFAULT NULL COMMENT '访问时间',
+ PRIMARY KEY (`info_id`) USING BTREE,
+ INDEX `idx_sys_logininfor_s`(`status` ASC) USING BTREE,
+ INDEX `idx_sys_logininfor_lt`(`login_time` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 120 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '系统访问记录' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_menu` (
+ `menu_id` bigint NOT NULL AUTO_INCREMENT COMMENT '菜单ID',
+ `menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '菜单名称',
+ `parent_id` bigint NULL DEFAULT 0 COMMENT '父菜单ID',
+ `order_num` int NULL DEFAULT 0 COMMENT '显示顺序',
+ `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '路由地址',
+ `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '组件路径',
+ `query` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '路由参数',
+ `route_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '路由名称',
+ `is_frame` int NULL DEFAULT 1 COMMENT '是否为外链(0是 1否)',
+ `is_cache` int NULL DEFAULT 0 COMMENT '是否缓存(0缓存 1不缓存)',
+ `menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)',
+ `visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '菜单状态(0显示 1隐藏)',
+ `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '菜单状态(0正常 1停用)',
+ `perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '权限标识',
+ `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '#' COMMENT '菜单图标',
+ `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '备注',
+ PRIMARY KEY (`menu_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2000 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '菜单权限表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_notice` (
+ `notice_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '公告ID',
+ `notice_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '公告标题',
+ `notice_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '公告类型(1通知 2公告)',
+ `notice_content` longblob NULL COMMENT '公告内容',
+ `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)',
+ `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`notice_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '通知公告表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_notice_read` (
+ `read_id` bigint NOT NULL AUTO_INCREMENT COMMENT '已读主键',
+ `notice_id` int NOT NULL COMMENT '公告id',
+ `user_id` bigint NOT NULL COMMENT '用户id',
+ `read_time` datetime NOT NULL COMMENT '阅读时间',
+ PRIMARY KEY (`read_id`) USING BTREE,
+ UNIQUE INDEX `uk_user_notice`(`user_id` ASC, `notice_id` ASC) USING BTREE COMMENT '同一用户同一公告只记录一次'
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '公告已读记录表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_oper_log` (
+ `oper_id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键',
+ `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '模块标题',
+ `business_type` int NULL DEFAULT 0 COMMENT '业务类型(0其它 1新增 2修改 3删除)',
+ `method` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '方法名称',
+ `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '请求方式',
+ `operator_type` int NULL DEFAULT 0 COMMENT '操作类别(0其它 1后台用户 2手机端用户)',
+ `oper_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '操作人员',
+ `dept_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '部门名称',
+ `oper_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '请求URL',
+ `oper_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '主机地址',
+ `oper_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '操作地点',
+ `oper_param` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '请求参数',
+ `json_result` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '返回参数',
+ `status` int NULL DEFAULT 0 COMMENT '操作状态(0正常 1异常)',
+ `error_msg` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '错误消息',
+ `oper_time` datetime NULL DEFAULT NULL COMMENT '操作时间',
+ `cost_time` bigint NULL DEFAULT 0 COMMENT '消耗时间',
+ PRIMARY KEY (`oper_id`) USING BTREE,
+ INDEX `idx_sys_oper_log_bt`(`business_type` ASC) USING BTREE,
+ INDEX `idx_sys_oper_log_s`(`status` ASC) USING BTREE,
+ INDEX `idx_sys_oper_log_ot`(`oper_time` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 117 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '操作日志记录' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_post` (
+ `post_id` bigint NOT NULL AUTO_INCREMENT COMMENT '岗位ID',
+ `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '岗位编码',
+ `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '岗位名称',
+ `post_sort` int NOT NULL COMMENT '显示顺序',
+ `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '状态(0正常 1停用)',
+ `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`post_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '岗位信息表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_role` (
+ `role_id` bigint NOT NULL AUTO_INCREMENT COMMENT '角色ID',
+ `role_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色名称',
+ `role_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色权限字符串',
+ `role_sort` int NOT NULL COMMENT '显示顺序',
+ `data_scope` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)',
+ `menu_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '菜单树选择项是否关联显示',
+ `dept_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '部门树选择项是否关联显示',
+ `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色状态(0正常 1停用)',
+ `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+ `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`role_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色信息表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_role_dept` (
+ `role_id` bigint NOT NULL COMMENT '角色ID',
+ `dept_id` bigint NOT NULL COMMENT '部门ID',
+ PRIMARY KEY (`role_id`, `dept_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色和部门关联表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_role_menu` (
+ `role_id` bigint NOT NULL COMMENT '角色ID',
+ `menu_id` bigint NOT NULL COMMENT '菜单ID',
+ PRIMARY KEY (`role_id`, `menu_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色和菜单关联表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_user` (
+ `user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
+ `dept_id` bigint NULL DEFAULT NULL COMMENT '部门ID',
+ `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户账号',
+ `nick_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户昵称',
+ `user_type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '00' COMMENT '用户类型(00系统用户)',
+ `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '用户邮箱',
+ `phonenumber` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '手机号码',
+ `sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',
+ `avatar` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '头像地址',
+ `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '密码',
+ `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '账号状态(0正常 1停用)',
+ `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+ `login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '最后登录IP',
+ `login_date` datetime NULL DEFAULT NULL COMMENT '最后登录时间',
+ `pwd_update_date` datetime NULL DEFAULT NULL COMMENT '密码最后更新时间',
+ `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+ `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`user_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_user_post` (
+ `user_id` bigint NOT NULL COMMENT '用户ID',
+ `post_id` bigint NOT NULL COMMENT '岗位ID',
+ PRIMARY KEY (`user_id`, `post_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户与岗位关联表' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `sys_user_role` (
+ `user_id` bigint NOT NULL COMMENT '用户ID',
+ `role_id` bigint NOT NULL COMMENT '角色ID',
+ PRIMARY KEY (`user_id`, `role_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户和角色关联表' ROW_FORMAT = Dynamic;
+
+-- Minimal development seed data
+INSERT INTO `sys_config` VALUES (1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', '2026-08-04 16:32:36', '', NULL, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow');
+INSERT INTO `sys_config` VALUES (2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', '2026-08-04 16:32:36', '', NULL, '初始化密码 123456');
+INSERT INTO `sys_config` VALUES (3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', '2026-08-04 16:32:36', '', NULL, '深色主题theme-dark,浅色主题theme-light');
+INSERT INTO `sys_config` VALUES (4, '账号自助-验证码开关', 'sys.account.captchaEnabled', 'true', 'Y', 'admin', '2026-08-04 16:32:36', '', NULL, '是否开启验证码功能(true开启,false关闭)');
+INSERT INTO `sys_config` VALUES (5, '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 'admin', '2026-08-04 16:32:36', '', NULL, '是否开启注册用户功能(true开启,false关闭)');
+INSERT INTO `sys_config` VALUES (6, '用户登录-黑名单列表', 'sys.login.blackIPList', '', 'Y', 'admin', '2026-08-04 16:32:36', '', NULL, '设置登录IP黑名单限制,多个匹配项以;分隔,支持匹配(*通配、网段)');
+INSERT INTO `sys_config` VALUES (7, '用户管理-初始密码修改策略', 'sys.account.initPasswordModify', '1', 'Y', 'admin', '2026-08-04 16:32:36', '', NULL, '0:初始密码修改策略关闭,没有任何提示,1:提醒用户,如果未修改初始密码,则在登录时就会提醒修改密码对话框');
+INSERT INTO `sys_config` VALUES (8, '用户管理-账号密码更新周期', 'sys.account.passwordValidateDays', '0', 'Y', 'admin', '2026-08-04 16:32:36', '', NULL, '密码更新周期(填写数字,数据初始化值为0不限制,若修改必须为大于0小于365的正整数),如果超过这个周期登录系统时,则在登录时就会提醒修改密码对话框');
+INSERT INTO `sys_config` VALUES (9, '用户管理-密码字符范围', 'sys.account.chrtype', '0', 'Y', 'admin', '2026-08-04 16:32:36', '', NULL, '默认任意字符范围,0任意(密码可以输入任意字符),1数字(密码只能为0-9数字),2英文字母(密码只能为a-z和A-Z字母),3字母和数字(密码必须包含字母,数字),4字母数字和特殊字符(目前支持的特殊字符包括:~!@#$%^&*()-=_+)');
+INSERT INTO `sys_dept` VALUES (100, 0, '0', '若依科技', 0, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2026-08-04 16:32:35', '', NULL);
+INSERT INTO `sys_dept` VALUES (101, 100, '0,100', '深圳总公司', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2026-08-04 16:32:35', '', NULL);
+INSERT INTO `sys_dept` VALUES (103, 101, '0,100,101', '研发部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2026-08-04 16:32:35', '', NULL);
+INSERT INTO `sys_dict_data` VALUES (1, 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '性别男');
+INSERT INTO `sys_dict_data` VALUES (2, 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '性别女');
+INSERT INTO `sys_dict_data` VALUES (3, 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '性别未知');
+INSERT INTO `sys_dict_data` VALUES (4, 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '显示菜单');
+INSERT INTO `sys_dict_data` VALUES (5, 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '隐藏菜单');
+INSERT INTO `sys_dict_data` VALUES (6, 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '正常状态');
+INSERT INTO `sys_dict_data` VALUES (7, 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '停用状态');
+INSERT INTO `sys_dict_data` VALUES (8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '正常状态');
+INSERT INTO `sys_dict_data` VALUES (9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '停用状态');
+INSERT INTO `sys_dict_data` VALUES (10, 1, '默认', 'DEFAULT', 'sys_job_group', '', '', 'Y', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '默认分组');
+INSERT INTO `sys_dict_data` VALUES (11, 2, '系统', 'SYSTEM', 'sys_job_group', '', '', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '系统分组');
+INSERT INTO `sys_dict_data` VALUES (12, 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '系统默认是');
+INSERT INTO `sys_dict_data` VALUES (13, 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '系统默认否');
+INSERT INTO `sys_dict_data` VALUES (14, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '通知');
+INSERT INTO `sys_dict_data` VALUES (15, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '公告');
+INSERT INTO `sys_dict_data` VALUES (16, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '正常状态');
+INSERT INTO `sys_dict_data` VALUES (17, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '关闭状态');
+INSERT INTO `sys_dict_data` VALUES (18, 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '其他操作');
+INSERT INTO `sys_dict_data` VALUES (19, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '新增操作');
+INSERT INTO `sys_dict_data` VALUES (20, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '修改操作');
+INSERT INTO `sys_dict_data` VALUES (21, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '删除操作');
+INSERT INTO `sys_dict_data` VALUES (22, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '授权操作');
+INSERT INTO `sys_dict_data` VALUES (23, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '导出操作');
+INSERT INTO `sys_dict_data` VALUES (24, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '导入操作');
+INSERT INTO `sys_dict_data` VALUES (25, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '强退操作');
+INSERT INTO `sys_dict_data` VALUES (26, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '生成操作');
+INSERT INTO `sys_dict_data` VALUES (27, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '清空操作');
+INSERT INTO `sys_dict_data` VALUES (28, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '正常状态');
+INSERT INTO `sys_dict_data` VALUES (29, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '停用状态');
+INSERT INTO `sys_dict_type` VALUES (1, '用户性别', 'sys_user_sex', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '用户性别列表');
+INSERT INTO `sys_dict_type` VALUES (2, '菜单状态', 'sys_show_hide', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '菜单状态列表');
+INSERT INTO `sys_dict_type` VALUES (3, '系统开关', 'sys_normal_disable', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '系统开关列表');
+INSERT INTO `sys_dict_type` VALUES (4, '任务状态', 'sys_job_status', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '任务状态列表');
+INSERT INTO `sys_dict_type` VALUES (5, '任务分组', 'sys_job_group', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '任务分组列表');
+INSERT INTO `sys_dict_type` VALUES (6, '系统是否', 'sys_yes_no', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '系统是否列表');
+INSERT INTO `sys_dict_type` VALUES (7, '通知类型', 'sys_notice_type', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '通知类型列表');
+INSERT INTO `sys_dict_type` VALUES (8, '通知状态', 'sys_notice_status', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '通知状态列表');
+INSERT INTO `sys_dict_type` VALUES (9, '操作类型', 'sys_oper_type', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '操作类型列表');
+INSERT INTO `sys_dict_type` VALUES (10, '系统状态', 'sys_common_status', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '登录状态列表');
+INSERT INTO `sys_menu` VALUES (1, '系统管理', 0, 1, 'system', NULL, '', '', 1, 0, 'M', '0', '0', '', 'system', 'admin', '2026-08-04 16:32:36', '', NULL, '系统管理目录');
+INSERT INTO `sys_menu` VALUES (2, '系统监控', 0, 2, 'monitor', NULL, '', '', 1, 0, 'M', '0', '0', '', 'monitor', 'admin', '2026-08-04 16:32:36', '', NULL, '系统监控目录');
+INSERT INTO `sys_menu` VALUES (3, '系统工具', 0, 3, 'tool', NULL, '', '', 1, 0, 'M', '0', '0', '', 'tool', 'admin', '2026-08-04 16:32:36', '', NULL, '系统工具目录');
+INSERT INTO `sys_menu` VALUES (4, '若依官网', 0, 4, 'http://ruoyi.vip', NULL, '', '', 0, 0, 'M', '0', '0', '', 'guide', 'admin', '2026-08-04 16:32:36', '', NULL, '若依官网地址');
+INSERT INTO `sys_menu` VALUES (100, '用户管理', 1, 1, 'user', 'system/user/index', '', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 'admin', '2026-08-04 16:32:36', '', NULL, '用户管理菜单');
+INSERT INTO `sys_menu` VALUES (101, '角色管理', 1, 2, 'role', 'system/role/index', '', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 'admin', '2026-08-04 16:32:36', '', NULL, '角色管理菜单');
+INSERT INTO `sys_menu` VALUES (102, '菜单管理', 1, 3, 'menu', 'system/menu/index', '', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 'admin', '2026-08-04 16:32:36', '', NULL, '菜单管理菜单');
+INSERT INTO `sys_menu` VALUES (103, '部门管理', 1, 4, 'dept', 'system/dept/index', '', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 'admin', '2026-08-04 16:32:36', '', NULL, '部门管理菜单');
+INSERT INTO `sys_menu` VALUES (104, '岗位管理', 1, 5, 'post', 'system/post/index', '', '', 1, 0, 'C', '0', '0', 'system:post:list', 'post', 'admin', '2026-08-04 16:32:36', '', NULL, '岗位管理菜单');
+INSERT INTO `sys_menu` VALUES (105, '字典管理', 1, 6, 'dict', 'system/dict/index', '', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 'admin', '2026-08-04 16:32:36', '', NULL, '字典管理菜单');
+INSERT INTO `sys_menu` VALUES (106, '参数设置', 1, 7, 'config', 'system/config/index', '', '', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 'admin', '2026-08-04 16:32:36', '', NULL, '参数设置菜单');
+INSERT INTO `sys_menu` VALUES (107, '通知公告', 1, 8, 'notice', 'system/notice/index', '', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'message', 'admin', '2026-08-04 16:32:36', '', NULL, '通知公告菜单');
+INSERT INTO `sys_menu` VALUES (108, '日志管理', 1, 9, 'log', '', '', '', 1, 0, 'M', '0', '0', '', 'log', 'admin', '2026-08-04 16:32:36', '', NULL, '日志管理菜单');
+INSERT INTO `sys_menu` VALUES (109, '在线用户', 2, 1, 'online', 'monitor/online/index', '', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 'admin', '2026-08-04 16:32:36', '', NULL, '在线用户菜单');
+INSERT INTO `sys_menu` VALUES (110, '定时任务', 2, 2, 'job', 'monitor/job/index', '', '', 1, 0, 'C', '0', '0', 'monitor:job:list', 'job', 'admin', '2026-08-04 16:32:36', '', NULL, '定时任务菜单');
+INSERT INTO `sys_menu` VALUES (111, '数据监控', 2, 3, 'druid', 'monitor/druid/index', '', '', 1, 0, 'C', '0', '0', 'monitor:druid:list', 'druid', 'admin', '2026-08-04 16:32:36', '', NULL, '数据监控菜单');
+INSERT INTO `sys_menu` VALUES (112, '服务监控', 2, 4, 'server', 'monitor/server/index', '', '', 1, 0, 'C', '0', '0', 'monitor:server:list', 'server', 'admin', '2026-08-04 16:32:36', '', NULL, '服务监控菜单');
+INSERT INTO `sys_menu` VALUES (113, '缓存监控', 2, 5, 'cache', 'monitor/cache/index', '', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 'admin', '2026-08-04 16:32:36', '', NULL, '缓存监控菜单');
+INSERT INTO `sys_menu` VALUES (114, '缓存列表', 2, 6, 'cacheList', 'monitor/cache/list', '', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis-list', 'admin', '2026-08-04 16:32:36', '', NULL, '缓存列表菜单');
+INSERT INTO `sys_menu` VALUES (115, '表单构建', 3, 1, 'build', 'tool/build/index', '', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 'admin', '2026-08-04 16:32:36', '', NULL, '表单构建菜单');
+INSERT INTO `sys_menu` VALUES (116, '代码生成', 3, 2, 'gen', 'tool/gen/index', '', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 'admin', '2026-08-04 16:32:36', '', NULL, '代码生成菜单');
+INSERT INTO `sys_menu` VALUES (117, '系统接口', 3, 3, 'swagger', 'tool/swagger/index', '', '', 1, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', 'admin', '2026-08-04 16:32:36', '', NULL, '系统接口菜单');
+INSERT INTO `sys_menu` VALUES (500, '操作日志', 108, 1, 'operlog', 'monitor/operlog/index', '', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 'admin', '2026-08-04 16:32:36', '', NULL, '操作日志菜单');
+INSERT INTO `sys_menu` VALUES (501, '登录日志', 108, 2, 'logininfor', 'monitor/logininfor/index', '', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 'admin', '2026-08-04 16:32:36', '', NULL, '登录日志菜单');
+INSERT INTO `sys_menu` VALUES (1000, '用户查询', 100, 1, '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1001, '用户新增', 100, 2, '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1002, '用户修改', 100, 3, '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1003, '用户删除', 100, 4, '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1004, '用户导出', 100, 5, '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1005, '用户导入', 100, 6, '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1006, '重置密码', 100, 7, '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1007, '角色查询', 101, 1, '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1008, '角色新增', 101, 2, '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1009, '角色修改', 101, 3, '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1010, '角色删除', 101, 4, '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1011, '角色导出', 101, 5, '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1012, '菜单查询', 102, 1, '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1013, '菜单新增', 102, 2, '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1014, '菜单修改', 102, 3, '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1015, '菜单删除', 102, 4, '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1016, '部门查询', 103, 1, '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1017, '部门新增', 103, 2, '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1018, '部门修改', 103, 3, '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1019, '部门删除', 103, 4, '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1020, '岗位查询', 104, 1, '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1021, '岗位新增', 104, 2, '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1022, '岗位修改', 104, 3, '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1023, '岗位删除', 104, 4, '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1024, '岗位导出', 104, 5, '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1025, '字典查询', 105, 1, '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1026, '字典新增', 105, 2, '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1027, '字典修改', 105, 3, '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1028, '字典删除', 105, 4, '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1029, '字典导出', 105, 5, '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1030, '参数查询', 106, 1, '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1031, '参数新增', 106, 2, '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1032, '参数修改', 106, 3, '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1033, '参数删除', 106, 4, '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1034, '参数导出', 106, 5, '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1035, '公告查询', 107, 1, '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1036, '公告新增', 107, 2, '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1037, '公告修改', 107, 3, '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1038, '公告删除', 107, 4, '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1039, '操作查询', 500, 1, '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1040, '操作删除', 500, 2, '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1041, '日志导出', 500, 3, '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1042, '登录查询', 501, 1, '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1043, '登录删除', 501, 2, '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1044, '日志导出', 501, 3, '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1045, '账户解锁', 501, 4, '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1046, '在线查询', 109, 1, '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1047, '批量强退', 109, 2, '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1048, '单条强退', 109, 3, '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1049, '任务查询', 110, 1, '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:query', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1050, '任务新增', 110, 2, '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:add', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1051, '任务修改', 110, 3, '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:edit', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1052, '任务删除', 110, 4, '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:remove', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1053, '状态修改', 110, 5, '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1054, '任务导出', 110, 6, '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:export', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1055, '生成查询', 116, 1, '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1056, '生成修改', 116, 2, '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1057, '生成删除', 116, 3, '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1058, '导入代码', 116, 4, '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1059, '预览代码', 116, 5, '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1060, '生成代码', 116, 6, '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 'admin', '2026-08-04 16:32:36', '', NULL, '');
+INSERT INTO `sys_post` VALUES (1, 'ceo', '董事长', 1, '0', 'admin', '2026-08-04 16:32:35', '', NULL, '');
+INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', 1, '1', 1, 1, '0', '0', 'admin', '2026-08-04 16:32:36', '', NULL, '超级管理员');
+INSERT INTO `sys_user` VALUES (1, 103, 'admin', '若依', '00', 'ry@163.com', '15888888888', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', '2026-08-15 18:25:11', '2026-08-04 16:32:35', 'admin', '2026-08-04 16:32:35', '', NULL, '管理员');
+INSERT INTO `sys_user_post` VALUES (1, 1);
+INSERT INTO `sys_user_role` VALUES (1, 1);
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/ruoyi-admin/src/main/resources/db/migration-final/V2__final_business_baseline.sql b/ruoyi-admin/src/main/resources/db/migration-final/V2__final_business_baseline.sql
new file mode 100644
index 0000000..2f89740
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/db/migration-final/V2__final_business_baseline.sql
@@ -0,0 +1,460 @@
+-- 最终业务数据库基线(Ticket03)。本脚本只创建结构,不导入演示业务数据。
+-- 业务关联由事务、删除顺序、唯一约束和索引维护,不建立物理外键。
+SET NAMES utf8mb4;
+SET time_zone = '+00:00';
+
+CREATE TABLE t_battery_group (
+ group_id BIGINT NOT NULL AUTO_INCREMENT,
+ group_name VARCHAR(100) NOT NULL,
+ model VARCHAR(100) NOT NULL,
+ purpose VARCHAR(500) NULL,
+ status CHAR(1) NOT NULL DEFAULT '0',
+ del_flag TINYINT NOT NULL DEFAULT 0,
+ create_by VARCHAR(64) NOT NULL DEFAULT '',
+ create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+ update_by VARCHAR(64) NOT NULL DEFAULT '',
+ update_time DATETIME(3) NULL,
+ remark VARCHAR(500) NULL,
+ PRIMARY KEY (group_id),
+ UNIQUE KEY uk_battery_group_name_del (group_name, del_flag),
+ KEY idx_battery_group_status (status, del_flag, create_time)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='电池组';
+
+CREATE TABLE t_battery_group_battery (
+ relation_id BIGINT NOT NULL AUTO_INCREMENT,
+ group_id BIGINT NOT NULL,
+ battery_no VARCHAR(100) NOT NULL,
+ sort_order INT NOT NULL DEFAULT 0,
+ del_flag TINYINT NOT NULL DEFAULT 0,
+ PRIMARY KEY (relation_id),
+ UNIQUE KEY uk_group_battery_no_del (group_id, battery_no, del_flag),
+ KEY idx_group_battery (group_id, del_flag, sort_order)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='电池组电池号';
+
+CREATE TABLE t_battery_group_field (
+ field_id BIGINT NOT NULL AUTO_INCREMENT,
+ field_name VARCHAR(100) NOT NULL,
+ field_type VARCHAR(20) NOT NULL,
+ status CHAR(1) NOT NULL DEFAULT '0',
+ del_flag TINYINT NOT NULL DEFAULT 0,
+ create_by VARCHAR(64) NOT NULL DEFAULT '',
+ create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+ update_by VARCHAR(64) NOT NULL DEFAULT '',
+ update_time DATETIME(3) NULL,
+ remark VARCHAR(500) NULL,
+ PRIMARY KEY (field_id),
+ UNIQUE KEY uk_battery_group_field_name_del (field_name, del_flag),
+ KEY idx_battery_group_field_status (status, del_flag)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='业务字段定义';
+
+CREATE TABLE t_battery_group_template (
+ template_id BIGINT NOT NULL AUTO_INCREMENT,
+ template_name VARCHAR(100) NOT NULL,
+ create_by VARCHAR(64) NOT NULL DEFAULT '',
+ create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+ update_by VARCHAR(64) NOT NULL DEFAULT '',
+ update_time DATETIME(3) NULL,
+ PRIMARY KEY (template_id),
+ UNIQUE KEY uk_battery_group_template_name (template_name)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='电池组字段模板';
+
+CREATE TABLE t_battery_group_template_field (
+ relation_id BIGINT NOT NULL AUTO_INCREMENT,
+ template_id BIGINT NOT NULL,
+ field_id BIGINT NOT NULL,
+ sort_order INT NOT NULL DEFAULT 0,
+ create_by VARCHAR(64) NOT NULL DEFAULT '',
+ create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+ del_flag TINYINT NOT NULL DEFAULT 0,
+ PRIMARY KEY (relation_id),
+ UNIQUE KEY uk_template_field_del (template_id, field_id, del_flag),
+ KEY idx_template_field_order (template_id, del_flag, sort_order)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='模板字段关系';
+
+CREATE TABLE t_battery_group_relation_field (
+ relation_id BIGINT NOT NULL AUTO_INCREMENT,
+ group_id BIGINT NOT NULL,
+ template_id BIGINT NULL,
+ battery_group_field_id BIGINT NOT NULL,
+ field_value VARCHAR(500) NULL,
+ del_flag TINYINT NOT NULL DEFAULT 0,
+ PRIMARY KEY (relation_id),
+ UNIQUE KEY uk_group_field_del (group_id, battery_group_field_id, del_flag),
+ KEY idx_group_relation_field (group_id, del_flag)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='电池组当前字段值';
+
+CREATE TABLE t_device_adapter (
+ adapter_id BIGINT NOT NULL AUTO_INCREMENT,
+ adapter_code VARCHAR(64) NOT NULL,
+ adapter_name VARCHAR(100) NOT NULL,
+ adapter_type VARCHAR(32) NOT NULL,
+ host VARCHAR(255) NOT NULL,
+ port INT NOT NULL,
+ poll_interval_ms INT NOT NULL DEFAULT 5000,
+ timezone_id VARCHAR(64) NOT NULL DEFAULT 'Asia/Hong_Kong',
+ read_only TINYINT(1) NOT NULL DEFAULT 1,
+ capabilities JSON NOT NULL,
+ connection_status VARCHAR(16) NOT NULL DEFAULT 'OFFLINE',
+ last_error_code VARCHAR(64) NULL,
+ last_error_message VARCHAR(500) NULL,
+ last_attempt_at_utc DATETIME(3) NULL,
+ last_observed_at_utc DATETIME(3) NULL,
+ status CHAR(1) NOT NULL DEFAULT '0',
+ del_flag TINYINT NOT NULL DEFAULT 0,
+ create_by VARCHAR(64) NOT NULL DEFAULT '',
+ create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+ update_by VARCHAR(64) NOT NULL DEFAULT '',
+ update_time DATETIME(3) NULL,
+ remark VARCHAR(500) NULL,
+ PRIMARY KEY (adapter_id),
+ UNIQUE KEY uk_adapter_code_del (adapter_code, del_flag),
+ KEY idx_adapter_connection (connection_status, status, del_flag)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='设备适配器实例';
+
+CREATE TABLE t_detection_cabinet (
+ cabinet_id BIGINT NOT NULL AUTO_INCREMENT,
+ adapter_id BIGINT NOT NULL,
+ cabinet_code VARCHAR(64) NOT NULL,
+ cabinet_name VARCHAR(100) NOT NULL,
+ manufacturer VARCHAR(100) NULL,
+ model VARCHAR(100) NULL,
+ capacity DECIMAL(10,2) NOT NULL DEFAULT 1,
+ channel_count INT NOT NULL DEFAULT 1,
+ vendor_device_type INT NOT NULL,
+ vendor_device_id INT NOT NULL,
+ ip_address VARCHAR(45) NULL,
+ mac_address VARCHAR(64) NULL,
+ registration_status VARCHAR(16) NOT NULL DEFAULT 'REGISTERED',
+ online_status VARCHAR(16) NOT NULL DEFAULT 'OFFLINE',
+ last_seen_at_utc DATETIME(3) NULL,
+ status CHAR(1) NOT NULL DEFAULT '0',
+ del_flag TINYINT NOT NULL DEFAULT 0,
+ create_by VARCHAR(64) NOT NULL DEFAULT '',
+ create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+ update_by VARCHAR(64) NOT NULL DEFAULT '',
+ update_time DATETIME(3) NULL,
+ remark VARCHAR(500) NULL,
+ PRIMARY KEY (cabinet_id),
+ UNIQUE KEY uk_cabinet_code_del (cabinet_code, del_flag),
+ UNIQUE KEY uk_cabinet_vendor_identity (adapter_id, vendor_device_type, vendor_device_id, del_flag),
+ KEY idx_cabinet_status (registration_status, online_status, status, del_flag)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='检测柜';
+
+CREATE TABLE t_detection_channel (
+ channel_id BIGINT NOT NULL AUTO_INCREMENT,
+ adapter_id BIGINT NOT NULL,
+ cabinet_id BIGINT NOT NULL,
+ devtype INT NOT NULL,
+ devid INT NOT NULL,
+ subdevid INT NOT NULL,
+ chlid INT NOT NULL,
+ display_no VARCHAR(64) NULL,
+ online_status VARCHAR(16) NOT NULL DEFAULT 'OFFLINE',
+ work_status VARCHAR(32) NOT NULL DEFAULT 'UNOBSERVABLE',
+ last_seen_at_utc DATETIME(3) NULL,
+ status CHAR(1) NOT NULL DEFAULT '0',
+ del_flag TINYINT NOT NULL DEFAULT 0,
+ create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+ update_time DATETIME(3) NULL,
+ PRIMARY KEY (channel_id),
+ UNIQUE KEY uk_channel_stable_identity (adapter_id, devtype, devid, subdevid, chlid, del_flag),
+ KEY idx_channel_cabinet (cabinet_id, status, del_flag),
+ KEY idx_channel_observed (online_status, work_status, last_seen_at_utc)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='检测柜通道事实';
+
+CREATE TABLE t_collector (
+ collector_id BIGINT NOT NULL AUTO_INCREMENT,
+ collector_code VARCHAR(64) NOT NULL,
+ collector_name VARCHAR(100) NOT NULL,
+ adapter_id BIGINT NULL,
+ ip_address VARCHAR(45) NULL,
+ mac_address VARCHAR(64) NULL,
+ manufacturer VARCHAR(100) NULL,
+ model VARCHAR(100) NULL,
+ channel_count INT NOT NULL DEFAULT 0,
+ online_status VARCHAR(16) NOT NULL DEFAULT 'OFFLINE',
+ last_seen_at_utc DATETIME(3) NULL,
+ status CHAR(1) NOT NULL DEFAULT '0',
+ del_flag TINYINT NOT NULL DEFAULT 0,
+ create_by VARCHAR(64) NOT NULL DEFAULT '',
+ create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+ update_by VARCHAR(64) NOT NULL DEFAULT '',
+ update_time DATETIME(3) NULL,
+ remark VARCHAR(500) NULL,
+ PRIMARY KEY (collector_id),
+ UNIQUE KEY uk_collector_code_del (collector_code, del_flag),
+ KEY idx_collector_status (online_status, status, del_flag)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='采集器';
+
+CREATE TABLE t_test_type (
+ test_type_id BIGINT NOT NULL AUTO_INCREMENT,
+ test_type_name VARCHAR(100) NOT NULL,
+ status CHAR(1) NOT NULL DEFAULT '0',
+ del_flag TINYINT NOT NULL DEFAULT 0,
+ create_by VARCHAR(64) NOT NULL DEFAULT '',
+ create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+ update_by VARCHAR(64) NOT NULL DEFAULT '',
+ update_time DATETIME(3) NULL,
+ remark VARCHAR(500) NULL,
+ PRIMARY KEY (test_type_id),
+ UNIQUE KEY uk_test_type_name_del (test_type_name, del_flag),
+ KEY idx_test_type_status (status, del_flag)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试类型';
+
+CREATE TABLE t_test (
+ test_id BIGINT NOT NULL AUTO_INCREMENT,
+ test_name VARCHAR(100) NOT NULL,
+ creator_id BIGINT NOT NULL,
+ principal_id BIGINT NOT NULL,
+ test_type_id BIGINT NOT NULL,
+ test_purpose TEXT NOT NULL,
+ test_status VARCHAR(32) NOT NULL DEFAULT 'WAITING',
+ reception_status VARCHAR(32) NOT NULL DEFAULT 'NOT_STARTED',
+ monitor_timeout_minutes INT NOT NULL DEFAULT 30,
+ started_at_utc DATETIME(3) NULL,
+ ended_at_utc DATETIME(3) NULL,
+ logic_step_mappings_json JSON NULL,
+ console_detail_json JSON NULL,
+ del_flag TINYINT NOT NULL DEFAULT 0,
+ create_by VARCHAR(64) NOT NULL DEFAULT '',
+ create_time DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
+ update_by VARCHAR(64) NOT NULL DEFAULT '',
+ update_time DATETIME(3) NULL,
+ remark VARCHAR(500) NULL,
+ PRIMARY KEY (test_id),
+ UNIQUE KEY uk_test_name_del (test_name, del_flag),
+ KEY idx_test_status_time (test_status, reception_status, create_time),
+ KEY idx_test_principal (principal_id, test_status)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试';
+
+CREATE TABLE t_test_battery (
+ test_battery_id BIGINT NOT NULL AUTO_INCREMENT,
+ test_id BIGINT NOT NULL,
+ group_id BIGINT NOT NULL,
+ battery_no VARCHAR(100) NOT NULL,
+ collector_id BIGINT NOT NULL,
+ del_flag TINYINT NOT NULL DEFAULT 0,
+ PRIMARY KEY (test_battery_id),
+ UNIQUE KEY uk_test_battery_no_del (test_id, battery_no, del_flag),
+ KEY idx_test_battery_group (group_id, del_flag),
+ KEY idx_test_battery_test (test_id, del_flag)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试电池号';
+
+CREATE TABLE t_test_channel_binding (
+ binding_id BIGINT NOT NULL AUTO_INCREMENT,
+ test_id BIGINT NOT NULL,
+ test_battery_id BIGINT NOT NULL,
+ channel_id BIGINT NOT NULL,
+ expected_barcode VARCHAR(100) NULL,
+ claim_status VARCHAR(32) NOT NULL DEFAULT 'PENDING',
+ claimed_at_utc DATETIME(3) NULL,
+ released_at_utc DATETIME(3) NULL,
+ PRIMARY KEY (binding_id),
+ UNIQUE KEY uk_test_binding_battery (test_id, test_battery_id),
+ UNIQUE KEY uk_test_binding_channel (test_id, channel_id),
+ KEY idx_binding_channel (channel_id, claim_status)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试检测柜通道绑定';
+
+CREATE TABLE t_test_collector_channel (
+ mapping_id BIGINT NOT NULL AUTO_INCREMENT,
+ test_id BIGINT NOT NULL,
+ test_battery_id BIGINT NOT NULL,
+ collector_id BIGINT NOT NULL,
+ measurement_code VARCHAR(100) NOT NULL,
+ measurement_name VARCHAR(100) NULL,
+ channel_code VARCHAR(100) NOT NULL,
+ PRIMARY KEY (mapping_id),
+ UNIQUE KEY uk_test_collector_measurement (test_id, test_battery_id, measurement_code),
+ UNIQUE KEY uk_test_collector_channel (test_id, collector_id, channel_code),
+ KEY idx_test_collector_battery (test_battery_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试采集器通道绑定';
+
+CREATE TABLE t_test_warning_threshold (
+ threshold_id BIGINT NOT NULL AUTO_INCREMENT,
+ test_id BIGINT NOT NULL,
+ metric_code VARCHAR(100) NOT NULL,
+ min_value DECIMAL(30,12) NULL,
+ max_value DECIMAL(30,12) NULL,
+ unit VARCHAR(32) NOT NULL DEFAULT '',
+ severity VARCHAR(32) NOT NULL DEFAULT 'WARNING',
+ del_flag TINYINT NOT NULL DEFAULT 0,
+ PRIMARY KEY (threshold_id),
+ UNIQUE KEY uk_test_threshold (test_id, metric_code, del_flag),
+ KEY idx_threshold_test (test_id, severity)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试预警阈值';
+
+CREATE TABLE t_test_realtime_record (
+ record_id BIGINT NOT NULL AUTO_INCREMENT,
+ test_id BIGINT NOT NULL,
+ test_battery_id BIGINT NOT NULL,
+ binding_id BIGINT NOT NULL,
+ adapter_code VARCHAR(64) NOT NULL,
+ cabinet_devtype INT NULL,
+ cabinet_devid INT NULL,
+ cabinet_subdevid INT NULL,
+ cabinet_chlid INT NULL,
+ cabinet_sequence_id BIGINT NULL,
+ cabinet_device_time_utc DATETIME(3) NULL,
+ cabinet_device_time_raw VARCHAR(64) NULL,
+ cabinet_adapter_timezone_id VARCHAR(64) NULL,
+ collector_id BIGINT NULL,
+ collector_channel_code VARCHAR(100) NULL,
+ collector_sequence_id BIGINT NULL,
+ collector_device_time_utc DATETIME(3) NULL,
+ collector_device_time_raw VARCHAR(64) NULL,
+ collector_adapter_timezone_id VARCHAR(64) NULL,
+ capture_slot_utc DATETIME(3) NOT NULL,
+ server_received_at_utc DATETIME(3) NOT NULL,
+ cycle_no INT NULL,
+ step_no INT NULL,
+ step_type VARCHAR(64) NULL,
+ step_name VARCHAR(191) NULL,
+ voltage_v DECIMAL(30,12) NULL,
+ current_a DECIMAL(30,12) NULL,
+ capacity_ah DECIMAL(30,12) NULL,
+ energy_wh DECIMAL(30,12) NULL,
+ temperature DECIMAL(30,12) NULL,
+ positive_potential DECIMAL(30,12) NULL,
+ negative_potential DECIMAL(30,12) NULL,
+ extension_measurements_json JSON NULL,
+ content_sha256 BINARY(32) NOT NULL,
+ PRIMARY KEY (record_id),
+ UNIQUE KEY uk_realtime_slot (test_id, test_battery_id, capture_slot_utc),
+ KEY idx_realtime_test_time (test_id, capture_slot_utc),
+ KEY idx_realtime_binding_time (binding_id, server_received_at_utc)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='实时采样记录';
+
+CREATE TABLE t_test_step_record (
+ step_record_id BIGINT NOT NULL AUTO_INCREMENT,
+ test_id BIGINT NOT NULL,
+ test_battery_id BIGINT NOT NULL,
+ adapter_code VARCHAR(64) NOT NULL,
+ source_identity VARCHAR(256) NOT NULL,
+ source_record_id VARCHAR(128) NULL,
+ adapter_timezone_id VARCHAR(64) NOT NULL,
+ device_time_utc DATETIME(3) NOT NULL,
+ device_time_raw VARCHAR(64) NOT NULL,
+ cycle_no INT NOT NULL,
+ step_no INT NOT NULL,
+ step_type VARCHAR(64) NULL,
+ step_name VARCHAR(191) NULL,
+ voltage_v DECIMAL(30,12) NULL,
+ current_a DECIMAL(30,12) NULL,
+ capacity_ah DECIMAL(30,12) NULL,
+ energy_wh DECIMAL(30,12) NULL,
+ extension_measurements_json JSON NULL,
+ content_sha256 BINARY(32) NOT NULL,
+ PRIMARY KEY (step_record_id),
+ UNIQUE KEY uk_step_identity (test_battery_id, source_identity, source_record_id, device_time_utc, cycle_no, step_no),
+ KEY idx_step_test_order (test_id, test_battery_id, cycle_no, step_no)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='工步记录';
+
+CREATE TABLE t_test_cycle_record (
+ cycle_record_id BIGINT NOT NULL AUTO_INCREMENT,
+ test_id BIGINT NOT NULL,
+ test_battery_id BIGINT NOT NULL,
+ adapter_code VARCHAR(64) NOT NULL,
+ source_identity VARCHAR(256) NOT NULL,
+ source_record_id VARCHAR(128) NULL,
+ adapter_timezone_id VARCHAR(64) NOT NULL,
+ device_time_utc DATETIME(3) NOT NULL,
+ device_time_raw VARCHAR(64) NOT NULL,
+ cycle_no INT NOT NULL,
+ charge_capacity_ah DECIMAL(30,12) NULL,
+ discharge_capacity_ah DECIMAL(30,12) NULL,
+ charge_energy_wh DECIMAL(30,12) NULL,
+ discharge_energy_wh DECIMAL(30,12) NULL,
+ efficiency DECIMAL(30,12) NULL,
+ extension_measurements_json JSON NULL,
+ content_sha256 BINARY(32) NOT NULL,
+ PRIMARY KEY (cycle_record_id),
+ UNIQUE KEY uk_cycle_identity (test_battery_id, source_identity, source_record_id, device_time_utc, cycle_no),
+ KEY idx_cycle_test_order (test_id, test_battery_id, cycle_no)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='循环记录';
+
+CREATE TABLE t_test_logic_step_mapping (
+ mapping_id BIGINT NOT NULL AUTO_INCREMENT,
+ test_id BIGINT NOT NULL,
+ logical_no INT NOT NULL,
+ logical_name VARCHAR(191) NOT NULL,
+ start_step_no INT NOT NULL,
+ end_step_no INT NOT NULL,
+ PRIMARY KEY (mapping_id),
+ UNIQUE KEY uk_logic_step_no (test_id, logical_no),
+ KEY idx_logic_step_range (test_id, start_step_no, end_step_no)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试逻辑工步映射';
+
+CREATE TABLE t_test_data_revision_action (
+ action_id BIGINT NOT NULL AUTO_INCREMENT,
+ test_id BIGINT NOT NULL,
+ data_type VARCHAR(16) NOT NULL,
+ operation_type VARCHAR(16) NOT NULL,
+ scope_summary VARCHAR(1000) NOT NULL,
+ identity_summary JSON NOT NULL,
+ before_content_json JSON NULL,
+ changes_summary JSON NULL,
+ reason VARCHAR(500) NOT NULL,
+ operator_id BIGINT NULL,
+ operator_name VARCHAR(64) NOT NULL,
+ created_at_utc DATETIME(3) NOT NULL,
+ PRIMARY KEY (action_id),
+ KEY idx_data_revision_test_time (test_id, data_type, created_at_utc)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试数据修订动作';
+
+CREATE TABLE t_test_warning_exception (
+ exception_id BIGINT NOT NULL AUTO_INCREMENT,
+ test_id BIGINT NOT NULL,
+ test_battery_id BIGINT NULL,
+ threshold_id BIGINT NOT NULL,
+ source_type VARCHAR(32) NOT NULL,
+ source_identity VARCHAR(256) NOT NULL,
+ metric_code VARCHAR(100) NOT NULL,
+ abnormal_value DECIMAL(30,12) NULL,
+ unit VARCHAR(32) NOT NULL DEFAULT '',
+ rule_snapshot JSON NOT NULL,
+ severity VARCHAR(32) NOT NULL DEFAULT 'WARNING',
+ exception_status VARCHAR(16) NOT NULL DEFAULT 'OPEN',
+ first_occurred_at_utc DATETIME(3) NOT NULL,
+ last_occurred_at_utc DATETIME(3) NOT NULL,
+ occurrence_count BIGINT NOT NULL DEFAULT 1,
+ handled_by BIGINT NULL,
+ handled_at_utc DATETIME(3) NULL,
+ handling_note VARCHAR(1000) NULL,
+ open_dedupe_key VARCHAR(512) GENERATED ALWAYS AS
+ (CASE WHEN exception_status = 'OPEN'
+ THEN CONCAT(test_id, ':', threshold_id, ':', metric_code)
+ ELSE NULL END) STORED,
+ PRIMARY KEY (exception_id),
+ KEY idx_warning_exception_test (test_id, exception_status, last_occurred_at_utc),
+ UNIQUE KEY uk_warning_exception_open (open_dedupe_key)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试预警异常';
+
+ALTER TABLE t_device_adapter
+ ADD CONSTRAINT chk_adapter_connection_status
+ CHECK (connection_status IN ('ONLINE', 'OFFLINE'));
+ALTER TABLE t_detection_cabinet
+ ADD CONSTRAINT chk_cabinet_registration_status
+ CHECK (registration_status IN ('DISCOVERED', 'REGISTERED', 'DISABLED')),
+ ADD CONSTRAINT chk_cabinet_online_status
+ CHECK (online_status IN ('ONLINE', 'OFFLINE'));
+ALTER TABLE t_detection_channel
+ ADD CONSTRAINT chk_channel_online_status
+ CHECK (online_status IN ('ONLINE', 'OFFLINE')),
+ ADD CONSTRAINT chk_channel_work_status
+ CHECK (work_status IN ('RUNNING', 'PAUSED', 'ENDED', 'ABNORMAL', 'UNOBSERVABLE'));
+ALTER TABLE t_collector
+ ADD CONSTRAINT chk_collector_online_status
+ CHECK (online_status IN ('ONLINE', 'OFFLINE'));
+ALTER TABLE t_test
+ ADD CONSTRAINT chk_test_status
+ CHECK (test_status IN ('WAITING', 'RUNNING', 'PAUSED', 'COMPLETED')),
+ ADD CONSTRAINT chk_test_reception_status
+ CHECK (reception_status IN ('NOT_STARTED', 'RECEIVING', 'PAUSED', 'ENDED'));
+ALTER TABLE t_test_warning_exception
+ ADD CONSTRAINT chk_warning_exception_status
+ CHECK (exception_status IN ('OPEN', 'CLOSED'));
+ALTER TABLE t_test_data_revision_action
+ ADD CONSTRAINT chk_data_revision_type
+ CHECK (data_type IN ('REALTIME', 'STEP', 'CYCLE')),
+ ADD CONSTRAINT chk_data_revision_operation
+ CHECK (operation_type IN ('EDIT', 'IMPORT', 'DELETE'));
diff --git a/ruoyi-admin/src/test/java/com/ruoyi/config/FinalDatabaseBaselineContractTest.java b/ruoyi-admin/src/test/java/com/ruoyi/config/FinalDatabaseBaselineContractTest.java
new file mode 100644
index 0000000..e24d77c
--- /dev/null
+++ b/ruoyi-admin/src/test/java/com/ruoyi/config/FinalDatabaseBaselineContractTest.java
@@ -0,0 +1,81 @@
+package com.ruoyi.config;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Set;
+
+import org.junit.jupiter.api.Test;
+
+/** Ticket03 最终数据库基线的结构契约。 */
+class FinalDatabaseBaselineContractTest
+{
+ private static final Set<String> REQUIRED_TABLES = Set.of(
+ "t_battery_group", "t_battery_group_field", "t_battery_group_relation_field",
+ "t_device_adapter", "t_detection_cabinet", "t_detection_channel", "t_collector",
+ "t_test", "t_test_battery", "t_test_channel_binding", "t_test_collector_channel",
+ "t_test_warning_threshold", "t_test_realtime_record", "t_test_step_record",
+ "t_test_cycle_record", "t_test_data_revision_action", "t_test_warning_exception");
+
+ private static final Set<String> RETIRED_TABLES = Set.of(
+ "t_test_field_snapshot", "t_test_battery_field", "t_test_plan_step", "t_test_audit",
+ "t_protocol_message", "t_test_reception_interval", "t_history_sync_cursor", "t_data_gap",
+ "t_channel_lease", "t_collector_channel_lease", "t_test_data_override",
+ "t_test_console_import_record");
+
+ @Test
+ void finalBaselineContainsOnlyTheAcceptedBusinessModel()
+ {
+ String sql = resource("db/migration-final/V2__final_business_baseline.sql");
+ String platformSql = resource("db/migration-final/V1__ruoyi_platform_baseline.sql");
+ for (String table : REQUIRED_TABLES)
+ {
+ assertTrue(sql.matches("(?s).*CREATE TABLE\\s+" + table + "\\s*\\(.*"),
+ "缺少最终业务表 " + table);
+ }
+ for (String table : RETIRED_TABLES)
+ {
+ assertFalse(sql.matches("(?s).*CREATE TABLE\\s+" + table + "\\s*\\(.*"),
+ "不应创建废止表 " + table);
+ }
+ assertFalse(sql.matches("(?is).*\\bFOREIGN\\s+KEY\\b.*"), "最终基线不得建立物理外键");
+ assertFalse(platformSql.matches("(?is).*\\bFOREIGN\\s+KEY\\b.*"), "平台基线不得建立物理外键");
+ assertFalse(platformSql.matches("(?is).*\\bINT\\s+NOT\\s+NULL\\s+AUTO_INCREMENT\\b.*"),
+ "最终基线自增主键统一使用 BIGINT");
+ assertTrue(sql.contains("test_battery_id BIGINT NOT NULL AUTO_INCREMENT"));
+ assertTrue(sql.contains("DATETIME(3)"));
+ assertTrue(sql.contains("before_content_json JSON NULL"));
+ assertTrue(sql.contains("source_identity VARCHAR(256) NOT NULL"));
+ assertTrue(sql.contains("adapter_timezone_id VARCHAR(64) NOT NULL"));
+ assertTrue(sql.contains("connection_status IN ('ONLINE', 'OFFLINE')"));
+ assertTrue(sql.contains("reception_status IN ('NOT_STARTED', 'RECEIVING', 'PAUSED', 'ENDED')"));
+ assertTrue(sql.contains("threshold_id BIGINT NOT NULL"));
+ assertTrue(sql.contains("open_dedupe_key VARCHAR(512) GENERATED ALWAYS AS"));
+ }
+
+ @Test
+ void flywayPointsAtTheFinalBaselineLocation()
+ {
+ String config = resource("application.yml");
+ assertTrue(config.contains("locations: classpath:db/migration-final"));
+ }
+
+ private static String resource(String path)
+ {
+ try (InputStream stream = FinalDatabaseBaselineContractTest.class.getClassLoader()
+ .getResourceAsStream(path))
+ {
+ if (stream == null)
+ {
+ throw new AssertionError("缺少资源 " + path);
+ }
+ return new String(stream.readAllBytes(), StandardCharsets.UTF_8);
+ }
+ catch (Exception exception)
+ {
+ throw new AssertionError("无法读取资源 " + path, exception);
+ }
+ }
+}
--
Gitblit v1.7.1