Explorar o código

chore(db): 数据库重置为全新初始化 + 以实际DB为准重导出库脚本

- 清空108各库实验/测试数据(病例/培养/胚胎/图片/视频/打标/报警/温压流水/操作日志),保留出厂配置+设备配置(tl_info/tl_setting/house/house_well_setting)+登录账号
- 删除旧的错误脚本(结构不符+含测试数据)、migrations增量、精简测试数据方案
- 从108实际DB导出7个库正确脚本到sql/(结构以实际为准、已含对焦改造列、带CREATE DATABASE、零实验数据),可直接重放部署
- 备份在 108:/home/db_backup_before_reset_2006.sql(328M)可回滚

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
huangjie hai 8 horas
pai
achega
e198db808e

+ 25 - 4
sql/aivfo-auth.sql

@@ -1,8 +1,13 @@
--- MySQL dump 10.13  Distrib 8.0.46, for Linux (x86_64)
+-- MySQL dump 10.13  Distrib 8.0.43, for Linux (x86_64)
 --
 -- Host: localhost    Database: aivfo-auth
 -- ------------------------------------------------------
--- Server version	8.0.46
+-- Server version	8.0.43
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!50503 SET NAMES utf8mb4 */;
 /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
 /*!40103 SET TIME_ZONE='+00:00' */;
 /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
@@ -10,6 +15,14 @@
 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
 /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
 
+--
+-- Current Database: `aivfo-auth`
+--
+
+CREATE DATABASE /*!32312 IF NOT EXISTS*/ `aivfo-auth` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
+
+USE `aivfo-auth`;
+
 --
 -- Table structure for table `middle`
 --
@@ -130,7 +143,7 @@ CREATE TABLE `user` (
   `deleted` timestamp NOT NULL COMMENT '已删除: 操作时间戳',
   `platform_id` int DEFAULT NULL COMMENT '操作终端',
   PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=75 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='用户账号表';
+) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='用户账号表';
 /*!40101 SET character_set_client = @saved_cs_client */;
 
 --
@@ -139,13 +152,21 @@ CREATE TABLE `user` (
 
 LOCK TABLES `user` WRITE;
 /*!40000 ALTER TABLE `user` DISABLE KEYS */;
+INSERT INTO `user` VALUES (75,'admin','582de128a6d0050981bf90059ceeb2d9','admin',NULL,NULL,1,'system','2026-06-23 21:00:00','system','2026-06-23 21:00:00','2016-12-31 16:00:00',NULL);
 /*!40000 ALTER TABLE `user` ENABLE KEYS */;
 UNLOCK TABLES;
+
+--
+-- Dumping routines for database 'aivfo-auth'
+--
 /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
 
 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
 /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 
--- Dump completed on 2026-06-17 14:50:29
+-- Dump completed on 2026-06-27 20:13:59

+ 7 - 148
sql/aivfo-tl.sql

@@ -1,157 +1,16 @@
--- MySQL dump 10.13  Distrib 8.0.46, for Linux (x86_64)
+-- MySQL dump 10.13  Distrib 8.0.43, for Linux (x86_64)
 --
 -- Host: localhost    Database: aivfo-tl
 -- ------------------------------------------------------
--- Server version	8.0.46
+-- Server version	8.0.43
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!50503 SET NAMES utf8mb4 */;
 /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
 /*!40103 SET TIME_ZONE='+00:00' */;
 /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
 /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
 /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Table structure for table `video`
---
-
-DROP TABLE IF EXISTS `video`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `video` (
-  `id` bigint NOT NULL AUTO_INCREMENT,
-  `tl_sn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'tl设备编号',
-  `house_sn` int NOT NULL COMMENT '仓室编号:1-11(11号仓室为缓冲瓶)',
-  `embryo_culture_record_id` bigint NOT NULL COMMENT '培养记录id',
-  `embryo_id` bigint NOT NULL COMMENT '胚胎id',
-  `well_sn` int NOT NULL COMMENT 'well编号:1-16',
-  `video_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '视频名',
-  `video_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '视频地址',
-  `picture_layer` int NOT NULL COMMENT '合成视频图层',
-  `fps` int DEFAULT NULL COMMENT '视频帧率',
-  `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '创建人',
-  `create_time` datetime NOT NULL COMMENT '创建时间',
-  `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '修改人',
-  `update_time` datetime NOT NULL COMMENT '修改时间',
-  `deleted` timestamp NOT NULL COMMENT '已删除: 操作时间戳',
-  `platform_id` int DEFAULT NULL COMMENT '操作终端',
-  `picture_max_uuid` bigint DEFAULT NULL COMMENT '视频合成的最大图片uuid',
-  PRIMARY KEY (`id`) USING BTREE,
-  UNIQUE KEY `only_one` (`embryo_culture_record_id`,`embryo_id`,`deleted`,`picture_layer`) USING BTREE COMMENT '联合唯一主键'
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='合成视频表: 记录合成视频信息';
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `video`
---
-
-LOCK TABLES `video` WRITE;
-/*!40000 ALTER TABLE `video` DISABLE KEYS */;
-/*!40000 ALTER TABLE `video` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `video_pictures`
---
-
-DROP TABLE IF EXISTS `video_pictures`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `video_pictures` (
-  `id` bigint NOT NULL AUTO_INCREMENT,
-  `tl_sn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'tl设备编号',
-  `house_sn` int NOT NULL COMMENT '仓室编号:1-11(11号仓室为缓冲瓶)',
-  `video_id` bigint DEFAULT NULL COMMENT '视频id',
-  `picture_uuid` bigint DEFAULT NULL COMMENT '图片uuid',
-  `image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '图片服务端url',
-  `image_time` datetime NOT NULL COMMENT '图片时间',
-  `state` int NOT NULL COMMENT '合成视频状态 0 失败 1成功',
-  `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '创建人',
-  `create_time` datetime NOT NULL COMMENT '创建时间',
-  `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '修改人',
-  `update_time` datetime NOT NULL COMMENT '修改时间',
-  `deleted` timestamp NOT NULL COMMENT '已删除: 操作时间戳',
-  `platform_id` int DEFAULT NULL COMMENT '操作终端',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='合成视频图片表:记录各合成视频所使用的图片信息';
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `video_pictures`
---
-
-LOCK TABLES `video_pictures` WRITE;
-/*!40000 ALTER TABLE `video_pictures` DISABLE KEYS */;
-/*!40000 ALTER TABLE `video_pictures` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `video_splice`
---
-
-DROP TABLE IF EXISTS `video_splice`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `video_splice` (
-  `id` bigint NOT NULL AUTO_INCREMENT,
-  `video_id` bigint DEFAULT NULL COMMENT '培养记录id',
-  `embryo_culture_record_id` bigint DEFAULT NULL COMMENT '需要合成视频的胚胎id',
-  `embryo_id` bigint DEFAULT NULL COMMENT '需要合成视频的胚胎id',
-  `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '创建人',
-  `create_time` datetime NOT NULL COMMENT '创建时间',
-  `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '修改人',
-  `update_time` datetime NOT NULL COMMENT '修改时间',
-  `deleted` timestamp NOT NULL COMMENT '已删除: 操作时间戳',
-  `platform_id` int DEFAULT NULL COMMENT '操作终端',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='合成视频表: 记录合成视频信息';
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `video_splice`
---
-
-LOCK TABLES `video_splice` WRITE;
-/*!40000 ALTER TABLE `video_splice` DISABLE KEYS */;
-/*!40000 ALTER TABLE `video_splice` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `video_update`
---
-
-DROP TABLE IF EXISTS `video_update`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `video_update` (
-  `id` bigint NOT NULL AUTO_INCREMENT,
-  `video_id` bigint NOT NULL COMMENT '视频id',
-  `video_local_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '视频的存储本地路径',
-  `fps` int NOT NULL COMMENT '合成视频的fps',
-  `picture_max_uuid` bigint NOT NULL COMMENT '合成视频的最大图片uuid',
-  `update_state` int NOT NULL COMMENT '视频上传状态\r\n0 等待上传\r\n1 上传中',
-  `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '创建人',
-  `create_time` datetime NOT NULL COMMENT '创建时间',
-  `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '修改人',
-  `update_time` datetime NOT NULL COMMENT '修改时间',
-  `deleted` timestamp NOT NULL COMMENT '已删除: 操作时间戳',
-  `platform_id` int DEFAULT NULL COMMENT '操作终端',
-  PRIMARY KEY (`id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='图片上传更新表';
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `video_update`
---
-
-LOCK TABLES `video_update` WRITE;
-/*!40000 ALTER TABLE `video_update` DISABLE KEYS */;
-/*!40000 ALTER TABLE `video_update` ENABLE KEYS */;
-UNLOCK TABLES;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-
--- Dump completed on 2026-06-17 14:50:30

+ 23 - 3
sql/aivfo_services.sql

@@ -1,8 +1,13 @@
--- MySQL dump 10.13  Distrib 8.0.46, for Linux (x86_64)
+-- MySQL dump 10.13  Distrib 8.0.43, for Linux (x86_64)
 --
 -- Host: localhost    Database: aivfo_services
 -- ------------------------------------------------------
--- Server version	8.0.46
+-- Server version	8.0.43
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!50503 SET NAMES utf8mb4 */;
 /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
 /*!40103 SET TIME_ZONE='+00:00' */;
 /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
@@ -10,6 +15,14 @@
 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
 /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
 
+--
+-- Current Database: `aivfo_services`
+--
+
+CREATE DATABASE /*!32312 IF NOT EXISTS*/ `aivfo_services` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
+
+USE `aivfo_services`;
+
 --
 -- Table structure for table `alarm_contacts`
 --
@@ -68,11 +81,18 @@ LOCK TABLES `tdi_log` WRITE;
 /*!40000 ALTER TABLE `tdi_log` DISABLE KEYS */;
 /*!40000 ALTER TABLE `tdi_log` ENABLE KEYS */;
 UNLOCK TABLES;
+
+--
+-- Dumping routines for database 'aivfo_services'
+--
 /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
 
 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
 /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 
--- Dump completed on 2026-06-17 14:50:30
+-- Dump completed on 2026-06-27 20:13:59

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 15 - 2
sql/aivfo_tl.sql


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 16 - 3
sql/aivfo_tl_setting.sql


+ 0 - 52
sql/init-database.sh

@@ -1,52 +0,0 @@
-#!/usr/bin/env bash
-# =============================================================================
-# 时差项目(Project_TL)数据库一键初始化 —— 幂等 runner(G4-2 / C2)
-#
-# 作用:全新部署一次到位 —— 建齐 7 个库并导入 base 全量脚本(含对焦扩列/
-#       house_autofocus_calibration / operation_log,migration 已并入 base)。
-#
-# 幂等:CREATE DATABASE IF NOT EXISTS + 各 base 脚本内的 DROP TABLE IF EXISTS,
-#       可重复执行;重跑会把表结构与"精简测试数据"重置为脚本内容(慎对生产)。
-#
-# 用法:
-#   ./init-database.sh                         # 默认连 127.0.0.1:3306 root/root
-#   ./init-database.sh <HOST> <PORT> <USER> <PASS>
-#   # Docker 容器内 mysql 客户端示例(把脚本目录挂进容器后):
-#   #   docker exec -i tl-mysql bash /sql/init-database.sh 127.0.0.1 3306 root root
-#
-# 注意:
-#   · 已部署旧库的"增量升级"不要用本脚本(会重建表丢数据),改跑 migrations/ 下脚本。
-#   · 本地 SQLite 列迁移另见 待验证清单 V-046 / 开发计划 G4-3。
-# =============================================================================
-set -euo pipefail
-
-HOST="${1:-127.0.0.1}"
-PORT="${2:-3306}"
-USER="${3:-root}"
-PASS="${4:-root}"
-
-DIR="$(cd "$(dirname "$0")" && pwd)"
-MYSQL=(mysql -h"${HOST}" -P"${PORT}" -u"${USER}" "-p${PASS}")
-
-# 库名 → base 脚本(顺序固定;库名含中划线/下划线均按文件名=库名对齐,勿改库名)
-import_db() {
-  local db="$1" file="$2"
-  echo "==> [${db}] CREATE DATABASE IF NOT EXISTS + import ${file}"
-  "${MYSQL[@]}" -e "CREATE DATABASE IF NOT EXISTS \`${db}\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;"
-  "${MYSQL[@]}" "${db}" < "${DIR}/${file}"
-}
-
-echo "时差项目数据库初始化 → ${USER}@${HOST}:${PORT}"
-
-import_db "aivfo-auth"       "aivfo-auth.sql"        # 认证/网关:middle/permission/role/user
-import_db "aivfo_services"   "aivfo_services.sql"    # 核心服务:alarm_contacts/tdi_log
-import_db "aivfo-tl"         "aivfo-tl.sql"          # 数据传输(中划线):video/video_pictures/video_splice/video_update
-import_db "aivfo_tl_setting" "aivfo_tl_setting.sql"  # TL控制配置:含对焦扩列 + house_autofocus_calibration
-import_db "aivfo_tl"         "aivfo_tl.sql"          # 业务管理(下划线):病例/胚胎/字典
-import_db "log"              "log.sql"               # 框架日志:system_log + operation_log(全量操作日志)
-import_db "quartz"           "quartz.sql"            # 定时任务:t_qrtz_*
-
-echo ""
-echo "✅ 全部 7 库初始化完成。"
-echo "   已含:对焦扩列(tl_setting 5列 / house_well_setting 2列)、house_autofocus_calibration、operation_log。"
-echo "   验证:对照 sql/清单.md;或 SHOW TABLES / DESC 抽查上述表与列。"

+ 64 - 35
sql/log.sql

@@ -1,8 +1,13 @@
--- MySQL dump 10.13  Distrib 8.0.46, for Linux (x86_64)
+-- MySQL dump 10.13  Distrib 8.0.43, for Linux (x86_64)
 --
 -- Host: localhost    Database: log
 -- ------------------------------------------------------
--- Server version	8.0.46
+-- Server version	8.0.43
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!50503 SET NAMES utf8mb4 */;
 /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
 /*!40103 SET TIME_ZONE='+00:00' */;
 /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
@@ -10,6 +15,58 @@
 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
 /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
 
+--
+-- Current Database: `log`
+--
+
+CREATE DATABASE /*!32312 IF NOT EXISTS*/ `log` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
+
+USE `log`;
+
+--
+-- Table structure for table `operation_log`
+--
+
+DROP TABLE IF EXISTS `operation_log`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+CREATE TABLE `operation_log` (
+  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
+  `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '全链路串联ID',
+  `parent_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '父子调用层级ID',
+  `op_time` datetime(3) DEFAULT NULL COMMENT '操作时间(毫秒)',
+  `project` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '端/服务:operate/front/tl-control...',
+  `module` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '功能模块(可读):对焦/串口/患者...',
+  `operation` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '操作(可读):一键标定/打开端口...',
+  `operator` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '谁:登录用户/工程师/系统/设备SN',
+  `input` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '输入(JSON;大对象只存文件名/关键字段)',
+  `output` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '输出(JSON;同上)',
+  `result` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '结果:成功/失败',
+  `error` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT '报错:消息+堆栈摘要',
+  `elapsed_ms` bigint DEFAULT NULL COMMENT '耗时(ms)',
+  `level` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '级别(操作级默认)',
+  `house_sn` int DEFAULT NULL COMMENT '仓室号(便于按舱过滤)',
+  `well_sn` int DEFAULT NULL COMMENT 'well号',
+  `tl_sn` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '设备SN',
+  `host` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '来源主机/IP',
+  `create_time` datetime(3) DEFAULT NULL COMMENT '入库时间',
+  PRIMARY KEY (`id`) USING BTREE,
+  KEY `idx_trace` (`trace_id`) USING BTREE COMMENT '按trace_id拉链路/join system_log',
+  KEY `idx_query` (`project`,`module`,`op_time`) USING BTREE COMMENT '按项目>模块>时间查询',
+  KEY `idx_device` (`tl_sn`,`house_sn`,`op_time`) USING BTREE COMMENT '按设备/舱查询',
+  KEY `idx_optime` (`op_time`) USING BTREE COMMENT '保留期清理用'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='全量操作日志(操作审计);与system_log经trace_id关联';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `operation_log`
+--
+
+LOCK TABLES `operation_log` WRITE;
+/*!40000 ALTER TABLE `operation_log` DISABLE KEYS */;
+/*!40000 ALTER TABLE `operation_log` ENABLE KEYS */;
+UNLOCK TABLES;
+
 --
 -- Table structure for table `system_log`
 --
@@ -52,44 +109,16 @@ LOCK TABLES `system_log` WRITE;
 UNLOCK TABLES;
 
 --
--- Table structure for table `operation_log`
---   全量操作日志(操作审计);与 system_log 经 trace_id 关联。见 需求文档/14 §5。
---   来源 migrations/2026-06-18-operation-log.sql,已并入 base(全新部署一次到位)。
+-- Dumping routines for database 'log'
 --
-
-DROP TABLE IF EXISTS `operation_log`;
-CREATE TABLE `operation_log` (
-  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
-  `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '全链路串联ID',
-  `parent_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '父子调用层级ID',
-  `op_time` datetime(3) NULL DEFAULT NULL COMMENT '操作时间(毫秒)',
-  `project` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '端/服务:operate/front/tl-control...',
-  `module` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '功能模块(可读):对焦/串口/患者...',
-  `operation` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作(可读):一键标定/打开端口...',
-  `operator` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '谁:登录用户/工程师/系统/设备SN',
-  `input` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '输入(JSON;大对象只存文件名/关键字段)',
-  `output` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '输出(JSON;同上)',
-  `result` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '结果:成功/失败',
-  `error` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '报错:消息+堆栈摘要',
-  `elapsed_ms` bigint NULL DEFAULT NULL COMMENT '耗时(ms)',
-  `level` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '级别(操作级默认)',
-  `house_sn` int NULL DEFAULT NULL COMMENT '仓室号(便于按舱过滤)',
-  `well_sn` int NULL DEFAULT NULL COMMENT 'well号',
-  `tl_sn` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '设备SN',
-  `host` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '来源主机/IP',
-  `create_time` datetime(3) NULL DEFAULT NULL COMMENT '入库时间',
-  PRIMARY KEY (`id`) USING BTREE,
-  INDEX `idx_trace`(`trace_id`) USING BTREE COMMENT '按trace_id拉链路/join system_log',
-  INDEX `idx_query`(`project`, `module`, `op_time`) USING BTREE COMMENT '按项目>模块>时间查询',
-  INDEX `idx_device`(`tl_sn`, `house_sn`, `op_time`) USING BTREE COMMENT '按设备/舱查询',
-  INDEX `idx_optime`(`op_time`) USING BTREE COMMENT '保留期清理用'
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '全量操作日志(操作审计);与system_log经trace_id关联' ROW_FORMAT = Dynamic;
-
 /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
 
 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
 /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 
--- Dump completed on 2026-06-17 14:50:30
+-- Dump completed on 2026-06-27 20:13:59

+ 0 - 87
sql/migrations/2026-06-17-autofocus-data-layer.sql

@@ -1,87 +0,0 @@
--- =============================================================================
--- 自动对焦数据层迁移(依据 需求文档/12-工作计划表与自动对焦数据设计.md §2.7/2.8)
--- 库:aivfo_tl_setting(与 tl_setting/house_well_setting/house_photograph_setting 同库)
--- 引擎/字符集:InnoDB / utf8mb4 / utf8mb4_0900_ai_ci(MySQL 8)
---
--- ★适用场景(G4-2 已合并 base):
---   · 全新部署 → 不需要本文件:base 脚本 sql/aivfo_tl_setting.sql 已含本表+扩列,
---     跑 sql/init-database.sh 一次到位。
---   · 已部署旧库增量升级 → 才跑本文件(旧库无这些表/列时)。
---   ⚠️ MySQL 8 的 ADD COLUMN 不支持 IF NOT EXISTS:旧库重跑前先手动 DESC 判断列是否已存在,
---      否则报 Duplicate column。本地 SQLite 列迁移另见 待验证清单 V-046 / G4-3。
--- =============================================================================
-
--- -----------------------------------------------------------------------------
--- 1) 新增表:house_autofocus_calibration
---    本地自动对焦标定结果的库内镜像。真相源仍为机旁 autofocustool/calibration.json。
---    scene 区分:0=出厂基准(每well一条,upsert)  1=日常对焦(append,受清理周期约束)。
---    清理约定:tl_setting.clean_autofocus_data(默认30天) 的清理任务【只删 scene=1】,
---    scene=0 基准永久保留(见 §2.7 约束1)。
--- -----------------------------------------------------------------------------
-DROP TABLE IF EXISTS `house_autofocus_calibration`;
-CREATE TABLE `house_autofocus_calibration` (
-  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
-  `tl_sn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'tl设备sn',
-  `house_sn` int NOT NULL COMMENT '仓室编号:1-11(11号为缓冲瓶,无相机不对焦)',
-  `well_sn` int NOT NULL COMMENT 'well编号:1-16',
-  `scene` int NOT NULL COMMENT '场景:0=出厂基准 1=日常对焦',
-  `focus_z` int NOT NULL COMMENT '对焦算出的最清晰层Z脉冲(锚点)',
-  `exposure` int NULL DEFAULT NULL COMMENT '曝光(100us单位)',
-  `horizontal_pulse` int NULL DEFAULT NULL COMMENT '水平电机位置脉冲',
-  `peak_ratio` decimal(10, 3) NULL DEFAULT NULL COMMENT '清晰度峰比(合格判据,阈值见tl_setting.focus_peak_ratio_threshold)',
-  `circle_found` tinyint NULL DEFAULT NULL COMMENT '是否检到well圆:0否1是',
-  `center_offset_pct` decimal(10, 3) NULL DEFAULT NULL COMMENT '居中偏移百分比',
-  `calib_time` datetime NOT NULL COMMENT '标定时间',
-  `source` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'LOCAL_JSON' COMMENT '结果来源(LOCAL_JSON=本地标定镜像)',
-  `note` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
-  `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '创建人',
-  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
-  `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '修改人',
-  `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
-  `deleted` timestamp NULL DEFAULT NULL COMMENT '已删除:操作时间戳(mybatis-plus逻辑删除约定)',
-  `platform_id` int NULL DEFAULT NULL COMMENT '操作终端',
-  PRIMARY KEY (`id`) USING BTREE,
-  INDEX `idx_query`(`tl_sn`, `house_sn`, `well_sn`, `calib_time`) USING BTREE COMMENT '按设备/well/时间查询',
-  INDEX `idx_scene`(`tl_sn`, `scene`, `deleted`) USING BTREE COMMENT '区分基准/日常+清理'
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '本地自动对焦标定结果镜像(scene:0基准/1日常);真相源为机旁calibration.json' ROW_FORMAT = Dynamic;
--- 注:scene=0 基准"每well唯一(upsert)"的唯一性,由 M2-04 实现时按 mybatis-plus 逻辑删除
---     (deleted) 与业务 upsert 逻辑保证;此处不加 (tl_sn,house_sn,well_sn,scene) 硬唯一键,
---     以免与 scene=1 的多条追加/逻辑删除占位冲突。最终策略在 M2-04 子计划确认。
-
--- -----------------------------------------------------------------------------
--- 2) tl_setting 设备级对焦配置扩列(依据 §2.5/2.8)
---    层间距=机器工艺值,不给默认(缺失须报错,不用魔法数;EEPROM仅参考);
---    层数/下移/峰比阈值=业务参数,给默认。
--- -----------------------------------------------------------------------------
-ALTER TABLE `tl_setting`
-  ADD COLUMN `focus_layer_spacing_pulse` int NULL DEFAULT NULL COMMENT '拍照层间距脉冲(工艺值,权威来源;缺失须报错,EEPROM仅参考)',
-  ADD COLUMN `focus_layer_count` int NOT NULL DEFAULT 5 COMMENT '拍照总层数(业务参数)' AFTER `focus_layer_spacing_pulse`,
-  ADD COLUMN `focus_layer_down` int NOT NULL DEFAULT 2 COMMENT '对焦起点下移层数(清晰层在第几层之上)' AFTER `focus_layer_count`,
-  ADD COLUMN `focus_peak_ratio_threshold` decimal(10, 3) NOT NULL DEFAULT 1.200 COMMENT '标定合格峰比阈值(不同客户可松紧)' AFTER `focus_layer_down`;
-
--- -----------------------------------------------------------------------------
--- 2b) tl_setting 场景B产线本地自动对焦安全门(M2-06,依据 计划 M2-06 小节 + 03 §6 三上线前置)
---    设备级安全门:算法严谨性未在真机验证通过前(74000 伪峰/真胚胎峰比/EEPROM 回写三前置),
---    默认 0=关闭本地自动对焦 → 场景B走降级(按 scene=0 基准/既有位置拍照,不做实际对焦),
---    避免错误对焦污染真实胚胎拍摄;三前置有结论后人工置 1=启用本地对焦(场景B正式上线)。
---    ⚠ 默认 0(安全):与 03 §2「场景B 稳定后再启用」一致,不在 M2 强行打开。
--- -----------------------------------------------------------------------------
-ALTER TABLE `tl_setting`
-  ADD COLUMN `local_autofocus_enabled` int NOT NULL DEFAULT 0 COMMENT '场景B本地自动对焦安全门:0关闭(降级按基准/既有位置拍照,默认安全) 1启用(本地四步标定对焦);三上线前置有结论后再开' AFTER `focus_peak_ratio_threshold`;
-
--- -----------------------------------------------------------------------------
--- 3) house_well_setting well级可选覆盖列(依据 §2.5)
---    留空=继承 tl_setting 设备级。下移层数复用现有 move_down_layer,不新增。
--- -----------------------------------------------------------------------------
-ALTER TABLE `house_well_setting`
-  ADD COLUMN `focus_layer_spacing_pulse` int NULL DEFAULT NULL COMMENT 'well级层间距覆盖(空=继承设备级)',
-  ADD COLUMN `focus_layer_count` int NULL DEFAULT NULL COMMENT 'well级层数覆盖(空=继承设备级)' AFTER `focus_layer_spacing_pulse`;
-
--- =============================================================================
--- 配置解析就近优先(§2.5):well级(house_well_setting,非空) > 设备级(tl_setting) > 报错。
---   层间距 focus_layer_spacing_pulse:两级皆空 → 报错"设备{tl_sn}对焦层间距未配置,请先初始化"。
---   下移层数:house_well_setting.move_down_layer 非空则覆盖 tl_setting.focus_layer_down。
--- 拍摄层位置公式(§2.4):
---   对焦起点(第0层)=FocusZ - focus_layer_down × focus_layer_spacing_pulse
---   第i层=对焦起点 + i × focus_layer_spacing_pulse  (i=0..focus_layer_count-1)
--- =============================================================================

+ 0 - 31
sql/migrations/2026-06-18-operation-log.sql

@@ -1,31 +0,0 @@
--- 全量操作日志表(操作审计)。库:log。与 system_log 并列,共享 trace_id 可 join。见 需求文档/14 §5。
--- 幂等:DROP IF EXISTS + CREATE。
--- ★适用场景(G4-2 已合并 base):全新部署不需要本文件——base 脚本 sql/log.sql 已含 operation_log,
---   跑 sql/init-database.sh 一次到位;本文件仅供已部署旧 log 库增量补表。
-DROP TABLE IF EXISTS `operation_log`;
-CREATE TABLE `operation_log` (
-  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增id',
-  `trace_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '全链路串联ID',
-  `parent_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '父子调用层级ID',
-  `op_time` datetime(3) NULL DEFAULT NULL COMMENT '操作时间(毫秒)',
-  `project` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '端/服务:operate/front/tl-control...',
-  `module` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '功能模块(可读):对焦/串口/患者...',
-  `operation` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作(可读):一键标定/打开端口...',
-  `operator` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '谁:登录用户/工程师/系统/设备SN',
-  `input` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '输入(JSON;大对象只存文件名/关键字段)',
-  `output` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '输出(JSON;同上)',
-  `result` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '结果:成功/失败',
-  `error` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '报错:消息+堆栈摘要',
-  `elapsed_ms` bigint NULL DEFAULT NULL COMMENT '耗时(ms)',
-  `level` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '级别(操作级默认)',
-  `house_sn` int NULL DEFAULT NULL COMMENT '仓室号(便于按舱过滤)',
-  `well_sn` int NULL DEFAULT NULL COMMENT 'well号',
-  `tl_sn` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '设备SN',
-  `host` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '来源主机/IP',
-  `create_time` datetime(3) NULL DEFAULT NULL COMMENT '入库时间',
-  PRIMARY KEY (`id`) USING BTREE,
-  INDEX `idx_trace`(`trace_id`) USING BTREE COMMENT '按trace_id拉链路/join system_log',
-  INDEX `idx_query`(`project`, `module`, `op_time`) USING BTREE COMMENT '按项目>模块>时间查询',
-  INDEX `idx_device`(`tl_sn`, `house_sn`, `op_time`) USING BTREE COMMENT '按设备/舱查询',
-  INDEX `idx_optime`(`op_time`) USING BTREE COMMENT '保留期清理用'
-) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '全量操作日志(操作审计);与system_log经trace_id关联' ROW_FORMAT = Dynamic;

+ 0 - 18
sql/migrations/2026-06-25-autofocus-range.sql

@@ -1,18 +0,0 @@
--- =============================================================================
--- 自动对焦 per-well 运动范围迁移(依据 需求文档 2026-06-25 §七)
--- 库:aivfo_tl_setting(MySQL 8,InnoDB/utf8mb4)
--- 范围 = 中心 ± 半幅:中心复用现有 horizontal_motor_position / eeprom_clear_position,
---        本次仅加"半幅"列 + 设备级默认/曝光范围。
--- ⚠ MySQL 8 ADD COLUMN 不支持 IF NOT EXISTS:旧库重跑前先 DESC 判断列是否已存在。
--- 全新部署不需要本文件(base 脚本 sql/aivfo_tl_setting.sql 已含,见 Task 1.2)。
--- =============================================================================
-
-ALTER TABLE `house_well_setting`
-  ADD COLUMN `horizontal_focus_range` int NULL DEFAULT NULL COMMENT 'well级水平搜索半幅(围绕horizontal_motor_position;空=继承tl_setting.focus_h_range_default)',
-  ADD COLUMN `vertical_focus_range` int NULL DEFAULT NULL COMMENT 'well级垂直搜索半幅(围绕eeprom_clear_position;空=继承tl_setting.focus_v_range_default)';
-
-ALTER TABLE `tl_setting`
-  ADD COLUMN `focus_h_range_default` int NULL DEFAULT NULL COMMENT '水平半幅设备级默认(well级留空时用)',
-  ADD COLUMN `focus_v_range_default` int NULL DEFAULT NULL COMMENT '垂直半幅设备级默认',
-  ADD COLUMN `focus_exposure_min` int NOT NULL DEFAULT 10 COMMENT '对焦曝光二分下限(沿用引擎现值)',
-  ADD COLUMN `focus_exposure_max` int NOT NULL DEFAULT 800 COMMENT '对焦曝光二分上限(沿用引擎现值)';

+ 23 - 3
sql/quartz.sql

@@ -1,8 +1,13 @@
--- MySQL dump 10.13  Distrib 8.0.46, for Linux (x86_64)
+-- MySQL dump 10.13  Distrib 8.0.43, for Linux (x86_64)
 --
 -- Host: localhost    Database: quartz
 -- ------------------------------------------------------
--- Server version	8.0.46
+-- Server version	8.0.43
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!50503 SET NAMES utf8mb4 */;
 /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
 /*!40103 SET TIME_ZONE='+00:00' */;
 /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
@@ -10,6 +15,14 @@
 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
 /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
 
+--
+-- Current Database: `quartz`
+--
+
+CREATE DATABASE /*!32312 IF NOT EXISTS*/ `quartz` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
+
+USE `quartz`;
+
 --
 -- Table structure for table `t_qrtz_blob_triggers`
 --
@@ -345,11 +358,18 @@ LOCK TABLES `t_qrtz_triggers` WRITE;
 /*!40000 ALTER TABLE `t_qrtz_triggers` DISABLE KEYS */;
 /*!40000 ALTER TABLE `t_qrtz_triggers` ENABLE KEYS */;
 UNLOCK TABLES;
+
+--
+-- Dumping routines for database 'quartz'
+--
 /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
 
 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
 /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 
--- Dump completed on 2026-06-17 14:50:30
+-- Dump completed on 2026-06-27 20:13:59

+ 0 - 97
sql/数据库测试数据精简方案.md

@@ -1,97 +0,0 @@
-# 11 · 数据库测试数据精简方案(瘦身,便于开发查阅)
-
-> 父文档:`../00-需求总览.md`
-> **目标**:库**结构不动**(开发中按需自行调结构),只把**测试数据**精简成**少量种子数据**,方便开发查库时不被海量数据淹没。
-> **核心约束**:很多表**没有主外键约束**,不能每表随便留 N 条——必须按**业务主线**保留**能互相关联**的整链数据,否则留下的数据断链、无意义。
-> ⚠️ 删数据不可逆:**先备份 → 测试库演练 → 确认 → 再执行**。本方案产出 SQL 脚本,由你在数据库工具执行(无库连接,不直连)。
-
----
-
-## 1. 表分类(5 库全覆盖)
-
-### A. 基础/配置/字典(**全留**,删了系统跑不起来)
-
-| 库 | 表 |
-|----|----|
-| auth | `user` `role` `permission` `middle` |
-| tl_setting | `tl_info`(设备) `tl_setting`(配置) `house`(舱配置) `house_well_setting` `house_photograph_setting` `house_collect` `alarm_type`(告警字典) `alarm_template` `alarm_permissions` `alarm_personnel` `language_configuration`(多语言) `cn_region_info`(地区) |
-| business | `dictionary`(字典) `embryo_level` `mark` `mark_key` `mark_weight` `identify_config` `photo_search_button` `software_version` |
-| services | `alarm_contacts` |
-
-> 这些是"配置/枚举/基础",数据量本身不大,**全保留**,保证系统可启动、界面可用、多语言正常。
-
-### B. 业务流水(**按主线精简**)—— 数据膨胀的根源
-
-| 库 | 表 | 说明 |
-|----|----|----|
-| business | `case_info` 病例 / `embryo_culture_record` 培养记录 / `embryo` 胚胎 / `embryo_mark` `embryo_mark_splice` 标记 / `balance` 平衡 | 业务主体 |
-| business | `picture` 图片记录(及运行期 `t_picture_*` 分表) / `debug_picture` 调试图 | 图片,量最大 |
-| business | `video` `video_pictures` `video_splice` `video_update` | 视频 |
-| business | `picture_identify_result` `picture_identify_middle` `picture_identify_result_cache` | AI 识别结果 |
-| business | `message` 消息 / `log` 业务日志 | 流水 |
-| data_transmission | `video` `video_pictures` `video_splice` `video_update` | 视频(该库副本) |
-| tl_setting | `alarm_data` 报警历史 / `alarm` / `alarm_send_info` / `environment_temperature` 环境采样 / `mqtt_message` 指令流水 | 流水,量大 |
-| services | `tdi_log` 系统日志 | 流水 |
-| 框架 | `system_log` / `t_qrtz_*` quartz | 日志/定时,量大 |
-
----
-
-## 2. 关联主线(没主外键,靠逻辑键串联)
-
-业务数据靠这些**逻辑关联键**串起来(非数据库约束,是字段约定):
-
-```
-case_info.case_id
-   ▲ (case_id)
-embryo_culture_record.id ────────────┐  培养记录=主线根
-   ▲ embryo_culture_record_id         │ (tl_sn, house_sn)
-   ├── embryo.embryo_culture_record_id│
-   ├── picture.embryo_culture_record_id(+embryo_id, picture_uuid)
-   ├── video.embryo_culture_record_id(+embryo_id)
-   │      ▲ video_id
-   │      ├── video_pictures.video_id
-   │      ├── video_splice.video_id
-   │      └── video_update.video_id
-   ├── embryo_mark.embryo_culture_record_id(+embryo_id, picture_uuid)
-   └── picture_identify_result.embryo_culture_record_id(+embryo_id, picture_uuid)
-
-设备维度:tl_sn / house_sn 贯穿大部分表
-   alarm_data / environment_temperature / message / log 按 tl_sn+house_sn 关联设备
-   picture_identify_result_cache 按 picture_uuid 关联
-```
-
-**保留策略**:选 **2-3 个 `embryo_culture_record`(培养记录)作为种子根**(覆盖不同状态:培养中/已结束/已移植),顺着上面的键,把它们关联的 case_info、embryo、picture、video(+三张子表)、embryo_mark、identify_result 一并保留;其余删除。设备维度的 alarm_data/environment_temperature/message/log 按"保留的 tl_sn+house_sn + 近期时间窗"留少量。
-
----
-
-## 3. 精简规则(每类怎么留)
-
-| 表类 | 规则 |
-|------|------|
-| 主线根 `embryo_culture_record` | 保留选定的 2-3 条(按 id 或状态挑) |
-| 跟随主线(embryo/picture/video*/embryo_mark/identify_result) | 只保留 `embryo_culture_record_id ∈ 选定根` 的记录 |
-| case_info | 只保留被选定培养记录引用的 `case_id` |
-| 设备流水(alarm_data/environment_temperature/message/log/mqtt_message) | 按"选定 tl_sn+house_sn"且"近 N 条/近 X 天"保留少量 |
-| 纯日志(system_log/tdi_log/t_qrtz_*/debug_picture) | 可全清空或留最近少量(开发查结构无需历史) |
-| 运行期 `t_picture_*` 分表 | 只保留选定培养记录关联的 picture_uuid;空分表可 drop(结构不动指逻辑表,分表是运行期产物) |
-
----
-
-## 4. 执行步骤(你在数据库工具按序跑)
-
-1. **全量备份**所有库(mysqldump 或工具导出),留回滚。
-2. 在**开发库/测试库**先跑,确认系统能启动、界面能查到那 2-3 个病例的完整链。
-3. 选定种子根 id(脚本里用变量),按 §3 规则**先删跟随表、再删根表**(避免悬挂),最后清日志表。
-4. 校验:选定病例 → 胚胎 → 图片 → 视频 → 识别结果 → 报警,链路完整、界面可展示。
-5. 配置/字典表(§1.A)**一条都不删**。
-
----
-
-## 5. 待你拍板(定了我产出可执行 SQL 脚本)
-
-1. **种子根**:按"2-3 个培养记录"留,对吗?还是按设备 tl_sn 留某台的全部?
-2. **保留量**:培养记录留几个?设备流水(报警/环境温度)留"近多少条/几天"?
-3. **日志表**:system_log/tdi_log/quartz/debug_picture 全清空,还是各留最近 N 条?
-4. **环境**:仅开发库执行(可放手),确认不会碰生产?
-
-> 结论:本方案**只删数据、不动结构**;按业务主线保留可关联的少量种子数据 + 全留配置字典。脚本待你定上面 4 点后产出。

+ 0 - 62
sql/清单.md

@@ -1,62 +0,0 @@
-# 数据库脚本清单
-
-> 时差项目(Project_TL)数据库初始化脚本汇总
-> 整理日期:2026-06-15
-> 更新日期:2026-06-20(G4-2:两 migration 已并入 base;补幂等 runner `init-database.sh`)
-> 所有脚本均从源代码各模块中抽取,统一存放于本目录。
-> **文件名已与目标数据库名保持一致**,导入时直接按文件名指定同名库即可。
-
-## 〇、一键全新部署(推荐)
-
-```bash
-# 建齐 7 库 + 导入全部 base(含对焦扩列 / house_autofocus_calibration / operation_log),幂等可重跑
-cd sql && ./init-database.sh                              # 默认 127.0.0.1:3306 root/root
-./init-database.sh 192.168.0.108 3306 root root          # 指定服务器
-```
-
-> `init-database.sh` 对每个库做 `CREATE DATABASE IF NOT EXISTS` + 导入对应 base 脚本(脚本内 `DROP TABLE IF EXISTS`),
-> **全新部署一次跑完不缺表/列**。⚠️ 已部署旧库的"增量升级"勿用本脚本(会重建表丢数据),改跑 `migrations/`(见下文四)。
-
-## 一、业务库初始化脚本
-
-| 脚本文件 | 目标数据库 | 对应模块 | 表数量 | 说明 |
-|---------|-----------|---------|-------|------|
-| `aivfo-auth.sql` | `aivfo-auth` | aivfo-gateway(认证/网关) | 4 | middle、permission、role、user 等认证授权表 |
-| `aivfo_services.sql` | `aivfo_services` | aivfo-service(核心服务) | 2 | alarm_contacts、tdi_log |
-| `aivfo-tl.sql` | `aivfo-tl` | aivfo-data-transmission(数据传输) | 4 | video、video_pictures、video_splice、video_update |
-| `aivfo_tl_setting.sql` | `aivfo_tl_setting` | aivof-tl-control(TL 控制配置) | 18 | 告警/区域等配置表,含多语言;流水表已精简。**含对焦扩列**(tl_setting +5 / house_well_setting +2)与新表 `house_autofocus_calibration`(migrations/2026-06-17 已并入) |
-| `aivfo_tl.sql` | `aivfo_tl` | aivfo-business-manage(业务管理) | 25 | 病例/胚胎/字典等业务表,含多语言;流水表已精简 |
-
-> ⚠️ 注意:`aivfo_tl.sql`(下划线,**业务库**)与 `aivfo-tl.sql`(中划线,**数据传输库**)是两个不同的库,名字相近勿混淆。
-
-## 二、框架组件表结构脚本
-
-| 脚本文件 | 目标数据库 | 来源框架组件 | 说明 |
-|---------|-----------|------------|------|
-| `log.sql` | `log` | aivfo-log-spring-boot | 系统日志表 `system_log` + 全量操作日志表 `operation_log`(migrations/2026-06-18 已并入) |
-| `quartz.sql` | `quartz` | aivfo-quartz-spring-boot | Quartz 定时任务表(MySQL 8.x 版本,表前缀 t_qrtz_) |
-
-## 三、说明
-
-- 每个脚本均为对应库的**全量初始化脚本**(含 `DROP TABLE IF EXISTS` + 建表),部署时导入同名库即可。
-- 脚本文件名 = 目标数据库名;`aivfo-auth` / `aivfo-tl`(中划线)与 `aivfo_tl` / `aivfo_tl_setting` / `aivfo_services`(下划线)的命名差异源自各服务 `application-local.properties` 中的 jdbc 配置,**库名不可改动**(应用引用),故以文件名向库名对齐。
-- `log` 与 `quartz` 两库需手动创建(其余库已存在);脚本不含 `CREATE DATABASE`/`USE`,导入时由 mysql 客户端指定目标库。
-- 当前脚本为**精简测试数据后的导出**:业务流水/日志表(embryo_culture_record、video、log、message、alarm_data、mqtt_message、tdi_log 等)已清空,配置/字典/多语言表(mark、dictionary、photo_search_button、cn_region_info、language_configuration 等)完整保留。精简规则见 `项目文档/需求文档/精简测试数据.sql`(适配本地实际库名的版本为 `精简测试数据_adapted.sql`)。
-- 导入命令示例(Docker 容器 `tl-mysql`):
-  ```bash
-  docker exec -i tl-mysql mysql -uroot -proot 'aivfo-auth' < aivfo-auth.sql
-  docker exec -i tl-mysql mysql -uroot -proot 'aivfo_tl'   < aivfo_tl.sql
-  # …其余库同理,按文件名=库名导入
-  ```
-
-## 四、迁移脚本 `migrations/`(仅供已部署旧库增量升级)
-
-| 脚本 | 目标库 | 内容 | 全新部署 |
-|------|--------|------|----------|
-| `migrations/2026-06-17-autofocus-data-layer.sql` | `aivfo_tl_setting` | tl_setting +5 对焦列、house_well_setting +2 覆盖列、新表 `house_autofocus_calibration` | **不需要**(已并入 `aivfo_tl_setting.sql`) |
-| `migrations/2026-06-18-operation-log.sql` | `log` | 新表 `operation_log` | **不需要**(已并入 `log.sql`) |
-
-- **全新部署**:只跑 base(`init-database.sh` 或逐库导入),已含上述表/列,**勿再跑 migration**。
-- **已部署旧库升级**:无这些表/列时才跑对应 migration。⚠️ MySQL 8 `ADD COLUMN` 不支持 `IF NOT EXISTS`,
-  旧库重跑 autofocus 迁移前先 `DESC` 判断列是否已存在,否则报 Duplicate column。
-- **本地 SQLite**(operate 端 tl_setting/house_well_setting 缓存)列迁移不在此,见 待验证清单 `V-046` / 开发计划 `G4-3`。

+ 0 - 149
sql/精简测试数据.sql

@@ -1,149 +0,0 @@
--- =============================================================
--- 时差项目 · 数据库测试数据精简脚本(开发用)
--- 目的:库结构不动,只精简测试数据;按业务主线保留少量可关联的种子数据
--- 默认参数:保留 3 个培养记录 + 关联链;设备流水留近 30 天;日志清空;配置字典全留
--- 作者:依据 项目文档/需求文档/11-数据库测试数据精简方案.md 生成
---
--- ⚠️ 执行前务必:
---   1) 全量备份所有库(mysqldump)
---   2) 仅在【开发库】执行,不要碰生产
---   3) 先整段在测试库演练,确认系统能启动、能查到保留的病例完整链
---   4) 各库名按你的实际库名替换(下方用占位库名,已按模块分段)
--- 说明:很多表无主外键,故用"保留集合临时表 + NOT IN 删除"保证不断链
--- =============================================================
-
--- ╔══════════════════════════════════════════════════════════╗
--- ║ 第一部分:business 库(病例/胚胎/图片/视频/识别/标记)          ║
--- ║   USE aivfo_business;   -- ← 改成你的实际业务库名             ║
--- ╚══════════════════════════════════════════════════════════╝
-USE `aivfo_business`;
-SET SQL_SAFE_UPDATES = 0;
-START TRANSACTION;
-
--- 1. 选种子根:保留最近 3 个培养记录(可改 WHERE/LIMIT 或手动指定 id)
-DROP TEMPORARY TABLE IF EXISTS keep_record;
-CREATE TEMPORARY TABLE keep_record (id BIGINT PRIMARY KEY);
-INSERT INTO keep_record(id)
-SELECT id FROM embryo_culture_record ORDER BY id DESC LIMIT 3;
--- 如需覆盖不同状态,改用:按 state 各取若干,例如:
---   INSERT INTO keep_record SELECT id FROM (
---     (SELECT id FROM embryo_culture_record WHERE state=1 ORDER BY id DESC LIMIT 1)
---     UNION (SELECT id FROM embryo_culture_record WHERE state=2 ORDER BY id DESC LIMIT 1)
---     UNION (SELECT id FROM embryo_culture_record WHERE state=3 ORDER BY id DESC LIMIT 1)
---   ) t;
-
--- 2. 衍生保留集合:case_id / tl_sn+house_sn / video_id / picture_uuid
-DROP TEMPORARY TABLE IF EXISTS keep_case;
-CREATE TEMPORARY TABLE keep_case (case_id VARCHAR(64));
-INSERT INTO keep_case SELECT DISTINCT case_id FROM embryo_culture_record WHERE id IN (SELECT id FROM keep_record);
-
-DROP TEMPORARY TABLE IF EXISTS keep_dev;
-CREATE TEMPORARY TABLE keep_dev (tl_sn VARCHAR(64), house_sn INT);
-INSERT INTO keep_dev SELECT DISTINCT tl_sn, house_sn FROM embryo_culture_record WHERE id IN (SELECT id FROM keep_record);
-
-DROP TEMPORARY TABLE IF EXISTS keep_video;
-CREATE TEMPORARY TABLE keep_video (id BIGINT PRIMARY KEY);
-INSERT INTO keep_video SELECT id FROM video WHERE embryo_culture_record_id IN (SELECT id FROM keep_record);
-
--- 3. 删除"跟随主线"的表里 不属于保留根 的数据(先子后父)
-DELETE FROM video_update   WHERE video_id NOT IN (SELECT id FROM keep_video);
-DELETE FROM video_pictures WHERE video_id NOT IN (SELECT id FROM keep_video);
-DELETE FROM video_splice   WHERE video_id NOT IN (SELECT id FROM keep_video);
-DELETE FROM video          WHERE embryo_culture_record_id NOT IN (SELECT id FROM keep_record);
-
-DELETE FROM picture_identify_result_cache WHERE embryo_culture_record_id NOT IN (SELECT id FROM keep_record);
-DELETE FROM picture_identify_middle        WHERE embryo_culture_record_id NOT IN (SELECT id FROM keep_record);
-DELETE FROM picture_identify_result        WHERE embryo_culture_record_id NOT IN (SELECT id FROM keep_record);
-
-DELETE FROM embryo_mark_splice WHERE embryo_culture_record_id NOT IN (SELECT id FROM keep_record);
-DELETE FROM embryo_mark         WHERE embryo_culture_record_id NOT IN (SELECT id FROM keep_record);
-
-DELETE FROM picture WHERE embryo_culture_record_id NOT IN (SELECT id FROM keep_record);
-DELETE FROM embryo  WHERE embryo_culture_record_id NOT IN (SELECT id FROM keep_record);
-
--- 4. 删除主线根 与 病例(保留被引用的 case)
-DELETE FROM embryo_culture_record WHERE id NOT IN (SELECT id FROM keep_record);
-DELETE FROM case_info WHERE case_id NOT IN (SELECT case_id FROM keep_case);
-DELETE FROM balance   WHERE (tl_sn, house_sn) NOT IN (SELECT tl_sn, house_sn FROM keep_dev);
-
--- 5. 流水/日志类:清空(开发查结构不需历史)
-TRUNCATE TABLE `log`;
-TRUNCATE TABLE `message`;
-TRUNCATE TABLE `debug_picture`;
-
--- 6. 配置/字典表:不动(dictionary / embryo_level / mark / mark_key / mark_weight /
---    identify_config / photo_search_button / software_version)
-
-COMMIT;
-
--- 7. ⚠️ 图片动态分表 t_picture_*:每个培养记录的图片在 embryo_culture_record.picture_table_name 指定的分表里
---    保留根的分表保留,其余分表整张 DROP。手动执行下面生成的语句:
-SELECT CONCAT('DROP TABLE IF EXISTS `', table_name, '`;') AS drop_sql
-FROM information_schema.tables
-WHERE table_schema = 'aivfo_business'
-  AND table_name LIKE 't_picture%'
-  AND table_name NOT IN (
-      SELECT picture_table_name FROM embryo_culture_record WHERE id IN (SELECT id FROM keep_record)
-  );
--- 把查询结果复制出来执行即可(不自动执行,避免误删)。
-SET SQL_SAFE_UPDATES = 1;
-
-
--- ╔══════════════════════════════════════════════════════════╗
--- ║ 第二部分:tl_setting 库(报警历史/环境采样/指令流水)          ║
--- ║   配置类全留;流水类留近 30 天                                ║
--- ╚══════════════════════════════════════════════════════════╝
-USE `aivfo_tl_setting`;   -- ← 改成你的实际库名
-SET SQL_SAFE_UPDATES = 0;
-START TRANSACTION;
-
-DELETE FROM alarm_data              WHERE create_time  < DATE_SUB(NOW(), INTERVAL 30 DAY);
-DELETE FROM alarm_send_info         WHERE create_time  < DATE_SUB(NOW(), INTERVAL 30 DAY);
-DELETE FROM environment_temperature WHERE collect_time < DATE_SUB(NOW(), INTERVAL 30 DAY);
-DELETE FROM mqtt_message            WHERE create_time  < DATE_SUB(NOW(), INTERVAL 30 DAY);
-
--- 配置/字典/设备表不动:tl_info / tl_setting / house / house_well_setting /
---   house_photograph_setting / house_collect / alarm / alarm_type / alarm_template /
---   alarm_permissions / alarm_personnel / language_configuration / cn_region_info
-
-COMMIT;
-SET SQL_SAFE_UPDATES = 1;
-
-
--- ╔══════════════════════════════════════════════════════════╗
--- ║ 第三部分:data_transmission 库(视频副本)                    ║
--- ╚══════════════════════════════════════════════════════════╝
-USE `aivfo_data_transmission`;   -- ← 改成你的实际库名
-SET SQL_SAFE_UPDATES = 0;
-START TRANSACTION;
--- 该库 video* 为传输态流水,开发查阅可清空(如需留样改为 WHERE 时间过滤)
-TRUNCATE TABLE `video_update`;
-TRUNCATE TABLE `video_pictures`;
-TRUNCATE TABLE `video_splice`;
-TRUNCATE TABLE `video`;
-COMMIT;
-SET SQL_SAFE_UPDATES = 1;
-
-
--- ╔══════════════════════════════════════════════════════════╗
--- ║ 第四部分:services 库 + 框架日志/定时                         ║
--- ╚══════════════════════════════════════════════════════════╝
-USE `aivfo_services`;     -- ← 改成你的实际库名
-TRUNCATE TABLE `tdi_log`;
--- alarm_contacts 是配置(告警联系人),不动
-
--- 系统日志库(system_log 表所在库,按实际库名)
--- TRUNCATE TABLE `system_log`;
-
--- Quartz 定时任务(按实际库名,t_qrtz_* 为运行态,可清触发历史;定义表谨慎)
--- DELETE FROM `t_qrtz_fired_triggers`;
--- DELETE FROM `t_qrtz_scheduler_state`;
-
--- =============================================================
--- 执行后校验(应能查到保留的病例完整链):
---   SELECT * FROM embryo_culture_record;                 -- 应剩 3 条
---   SELECT count(*) FROM embryo;                          -- 仅这 3 条记录的胚胎
---   SELECT count(*) FROM picture;                         -- 仅关联图片
---   SELECT count(*) FROM video;                           -- 仅关联视频
--- 配置类表数量应不变。
--- =============================================================

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio