소스 검색

修复 V2.2 迁移脚本:兼容 station_id 列不存在的情况

- 迁移前自动检测并添加 station_id 列(兼容 V2.1 未执行)
- 确保平台默认分组存在
- 未关联分组的行自动归入默认分组
- 删除 station_id 列前先检测是否存在

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline 3 일 전
부모
커밋
1487fa19d4
1개의 변경된 파일54개의 추가작업 그리고 8개의 파일을 삭제
  1. 54 8
      car-wash-entity/src/main/resources/sql/v2_settlement.sql

+ 54 - 8
car-wash-entity/src/main/resources/sql/v2_settlement.sql

@@ -157,7 +157,27 @@ CREATE TABLE IF NOT EXISTS `t_recharge_config_group` (
     UNIQUE KEY `uk_station_id` (`station_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='充值配置分组表';
 
--- 9b. 为已有的 station_id(含NULL默认值)创建分组
+-- 9b. 确保 t_recharge_config 有 station_id 列(兼容 V2.1 未执行的情况)
+DROP PROCEDURE IF EXISTS add_station_id_if_missing;
+DELIMITER //
+CREATE PROCEDURE add_station_id_if_missing()
+BEGIN
+    IF NOT EXISTS (
+        SELECT 1 FROM information_schema.COLUMNS
+        WHERE TABLE_SCHEMA = DATABASE()
+          AND TABLE_NAME = 't_recharge_config'
+          AND COLUMN_NAME = 'station_id'
+    ) THEN
+        ALTER TABLE `t_recharge_config`
+            ADD COLUMN `station_id` VARCHAR(64) DEFAULT NULL COMMENT '站点ID,NULL表示平台默认配置'
+            AFTER `label`;
+    END IF;
+END //
+DELIMITER ;
+CALL add_station_id_if_missing();
+DROP PROCEDURE IF EXISTS add_station_id_if_missing;
+
+-- 9c. 为已有的 station_id(含NULL默认值)创建分组
 INSERT INTO `t_recharge_config_group` (`station_id`, `name`, `create_time`, `update_time`)
 SELECT DISTINCT `station_id`, NULL, NOW(), NOW()
 FROM `t_recharge_config`
@@ -166,26 +186,52 @@ WHERE NOT EXISTS (
     WHERE (g.`station_id` <=> `t_recharge_config`.`station_id`)
 );
 
--- 9c. t_recharge_config 新增 group_id 列
+-- 9d. 确保平台默认分组存在(station_id IS NULL)
+INSERT INTO `t_recharge_config_group` (`station_id`, `name`, `create_time`, `update_time`)
+SELECT NULL, NULL, NOW(), NOW()
+WHERE NOT EXISTS (
+    SELECT 1 FROM `t_recharge_config_group` WHERE `station_id` IS NULL
+);
+
+-- 9e. t_recharge_config 新增 group_id 列
 ALTER TABLE `t_recharge_config`
     ADD COLUMN `group_id` BIGINT DEFAULT NULL COMMENT '所属分组ID'
     AFTER `id`;
 
--- 9d. 回填 group_id
+-- 9f. 回填 group_id
 UPDATE `t_recharge_config` c
     INNER JOIN `t_recharge_config_group` g
         ON (c.`station_id` <=> g.`station_id`)
 SET c.`group_id` = g.`id`;
 
--- 9e. group_id 设为 NOT NULL
+-- 9g. 未关联到任何分组的行归入默认分组
+UPDATE `t_recharge_config`
+SET `group_id` = (SELECT id FROM `t_recharge_config_group` WHERE `station_id` IS NULL LIMIT 1)
+WHERE `group_id` IS NULL;
+
+-- 9h. group_id 设为 NOT NULL
 ALTER TABLE `t_recharge_config`
     MODIFY COLUMN `group_id` BIGINT NOT NULL COMMENT '所属分组ID';
 
--- 9f. 删除旧 station_id 列
-ALTER TABLE `t_recharge_config`
-    DROP COLUMN `station_id`;
+-- 9i. 删除旧 station_id 列
+DROP PROCEDURE IF EXISTS drop_station_id;
+DELIMITER //
+CREATE PROCEDURE drop_station_id()
+BEGIN
+    IF EXISTS (
+        SELECT 1 FROM information_schema.COLUMNS
+        WHERE TABLE_SCHEMA = DATABASE()
+          AND TABLE_NAME = 't_recharge_config'
+          AND COLUMN_NAME = 'station_id'
+    ) THEN
+        ALTER TABLE `t_recharge_config` DROP COLUMN `station_id`;
+    END IF;
+END //
+DELIMITER ;
+CALL drop_station_id();
+DROP PROCEDURE IF EXISTS drop_station_id;
 
--- 9g. 组内金额唯一约束
+-- 9j. 组内金额唯一约束
 ALTER TABLE `t_recharge_config`
     ADD INDEX `idx_group_id` (`group_id`),
     ADD UNIQUE INDEX `uk_group_recharge_amount` (`group_id`, `recharge_amount`);