Quellcode durchsuchen

G4-2 数据库建库脚本与 migration 合并 + 幂等 runner

- 两 migration 并入 base:对焦表/列(tl_setting+5 / house_well_setting+2 / 新表 house_autofocus_calibration)→ aivfo_tl_setting.sql;operation_log → log.sql
- migration 头注标"全新部署 base 已含,仅供旧库增量升级"(MySQL8 ADD COLUMN 无 IF NOT EXISTS 提醒)
- 新增幂等 runner sql/init-database.sh(建 7 库 + 导 base,可重复执行)
- 清单.md 补 operation_log/对焦表 + 一键部署段 + migrations 分工说明
- 临时 MySQL 容器全量跑通 + 二次幂等零报错验证(18 表 / tl_setting 5 列 / house_well_setting 2 列 / operation_log 齐)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
huangjie vor 4 Tagen
Ursprung
Commit
2c9f9f4b6a

+ 41 - 0
sql/aivfo_tl_setting.sql

@@ -493,6 +493,8 @@ CREATE TABLE `house_well_setting` (
   `move_down_layer` int NOT NULL COMMENT '对焦起点下移层数_更新对焦起点',
   `horizontal_motor_position` int NOT NULL COMMENT '水平电机位置',
   `eeprom_clear_position` int NOT NULL COMMENT 'E方清晰位置',
+  `focus_layer_spacing_pulse` int DEFAULT NULL COMMENT 'well级层间距覆盖(空=继承设备级) — 自动对焦数据层(migrations/2026-06-17 已并入)',
+  `focus_layer_count` int DEFAULT NULL COMMENT 'well级层数覆盖(空=继承设备级)',
   `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 '修改人',
@@ -693,6 +695,11 @@ CREATE TABLE `tl_setting` (
   `report_hospital_logo_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '报告图片url',
   `report_hospital_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '报告医院名',
   `operable_embryo_time` int NOT NULL DEFAULT '30' COMMENT '胚胎可操作时间_天',
+  `focus_layer_spacing_pulse` int DEFAULT NULL COMMENT '拍照层间距脉冲(工艺值,权威来源;缺失须报错,EEPROM仅参考) — 自动对焦数据层(migrations/2026-06-17 已并入)',
+  `focus_layer_count` int NOT NULL DEFAULT '5' COMMENT '拍照总层数(业务参数)',
+  `focus_layer_down` int NOT NULL DEFAULT '2' COMMENT '对焦起点下移层数(清晰层在第几层之上)',
+  `focus_peak_ratio_threshold` decimal(10,3) NOT NULL DEFAULT '1.200' COMMENT '标定合格峰比阈值(不同客户可松紧)',
+  `local_autofocus_enabled` int NOT NULL DEFAULT '0' COMMENT '场景B本地自动对焦安全门:0关闭(降级按基准/既有位置拍照,默认安全) 1启用;三上线前置有结论后再开',
   PRIMARY KEY (`id`) USING BTREE,
   UNIQUE KEY `one` (`tl_sn`,`deleted`) USING BTREE COMMENT '唯一索引'
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='tl设备设置表';
@@ -706,6 +713,40 @@ LOCK TABLES `tl_setting` WRITE;
 /*!40000 ALTER TABLE `tl_setting` DISABLE KEYS */;
 /*!40000 ALTER TABLE `tl_setting` ENABLE KEYS */;
 UNLOCK TABLES;
+
+--
+-- Table structure for table `house_autofocus_calibration`
+--   本地自动对焦标定结果镜像(scene:0基准/1日常);真相源为机旁 calibration.json。
+--   来源 migrations/2026-06-17-autofocus-data-layer.sql,已并入 base(全新部署一次到位)。
+--
+
+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;
+
 /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
 
 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

+ 52 - 0
sql/init-database.sh

@@ -0,0 +1,52 @@
+#!/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 抽查上述表与列。"

+ 35 - 0
sql/log.sql

@@ -50,6 +50,41 @@ LOCK TABLES `system_log` WRITE;
 /*!40000 ALTER TABLE `system_log` DISABLE KEYS */;
 /*!40000 ALTER TABLE `system_log` ENABLE KEYS */;
 UNLOCK TABLES;
+
+--
+-- Table structure for table `operation_log`
+--   全量操作日志(操作审计);与 system_log 经 trace_id 关联。见 需求文档/14 §5。
+--   来源 migrations/2026-06-18-operation-log.sql,已并入 base(全新部署一次到位)。
+--
+
+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 */;

+ 7 - 3
sql/migrations/2026-06-17-autofocus-data-layer.sql

@@ -2,9 +2,13 @@
 -- 自动对焦数据层迁移(依据 需求文档/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)
--- ⚠️ 本地无数据库连接,脚本仅成文;应用前先在【开发库】演练并 DESC 校验(见 待验证清单 V-001)。
--- ⚠️ MySQL 8 的 ADD COLUMN 不支持 IF NOT EXISTS;若需重跑,先手动判断列是否已存在。
--- 关联:house_photograph_setting(各层拍照位置)不动,由对焦结果按 §2.4 公式写入。
+--
+-- ★适用场景(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。
 -- =============================================================================
 
 -- -----------------------------------------------------------------------------

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

@@ -1,5 +1,7 @@
 -- 全量操作日志表(操作审计)。库: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',

+ 26 - 3
sql/清单.md

@@ -2,10 +2,21 @@
 
 > 时差项目(Project_TL)数据库初始化脚本汇总
 > 整理日期:2026-06-15
-> 更新日期:2026-06-17(脚本重命名为与库名一致,并更新为精简测试数据后的导出)
+> 更新日期: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/`(见下文四)。
+
 ## 一、业务库初始化脚本
 
 | 脚本文件 | 目标数据库 | 对应模块 | 表数量 | 说明 |
@@ -13,7 +24,7 @@
 | `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 控制配置) | 17 | 告警/区域等配置表,含多语言;流水表已精简 |
+| `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`(中划线,**数据传输库**)是两个不同的库,名字相近勿混淆。
@@ -22,7 +33,7 @@
 
 | 脚本文件 | 目标数据库 | 来源框架组件 | 说明 |
 |---------|-----------|------------|------|
-| `log.sql` | `log` | aivfo-log-spring-boot | 系统日志表 system_log |
+| `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_) |
 
 ## 三、说明
@@ -37,3 +48,15 @@
   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`。