Kaynağa Gözat

feat(database): schema v6 with shop order columns migration

User 2 ay önce
ebeveyn
işleme
536a0efc0e

+ 81 - 3
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -43,10 +43,12 @@ public class DatabaseInitializer implements CommandLineRunner {
             initializeDefaultData();
             initFoodTables();
             runIndexMigrations();
-            recordSchemaVersion(5);
+            runShopMigrations();
+            recordSchemaVersion(6);
             log.info("数据库初始化完成!");
         } else {
-            log.info("数据库初始化已执行,跳过(schema_version >= 1)");
+            log.info("数据库初始化已执行,检查增量迁移...");
+            runShopMigrations(); // 增量迁移独立检查,不受主版本门控限制
         }
     }
 
@@ -55,7 +57,7 @@ public class DatabaseInitializer implements CommandLineRunner {
         try {
             jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS schema_version (version INT PRIMARY KEY, applied_at DATETIME DEFAULT CURRENT_TIMESTAMP)");
             Integer v = jdbcTemplate.queryForObject("SELECT version FROM schema_version ORDER BY version DESC LIMIT 1", Integer.class);
-            return v != null && v >= 1;
+            return v != null && v >= 6;
         } catch (Exception e) {
             return false;
         }
@@ -87,6 +89,39 @@ public class DatabaseInitializer implements CommandLineRunner {
         }
     }
 
+    /**
+     * 增量迁移:添加商品订单相关字段(来自 migration_add_shop_tables.sql)
+     * 幂等执行,列已存在时忽略错误
+     */
+    private void runShopMigrations() {
+        log.info("开始执行商品订单增量迁移...");
+        String[] alterStatements = {
+            "ALTER TABLE `product_orders` ADD COLUMN `delivery_method` tinyint(1) DEFAULT 1 COMMENT '配送方式:1快递 2自提'",
+            "ALTER TABLE `product_orders` ADD COLUMN `address_snapshot` json DEFAULT NULL COMMENT '收货地址快照'",
+            "ALTER TABLE `product_orders` ADD COLUMN `coupon_id` int(11) DEFAULT NULL COMMENT '使用的优惠券ID'",
+            "ALTER TABLE `product_orders` ADD COLUMN `discount_amount` decimal(10,2) DEFAULT 0 COMMENT '优惠金额'",
+            "ALTER TABLE `product_orders` ADD COLUMN `delivery_fee` decimal(10,2) DEFAULT 0 COMMENT '运费'",
+            "ALTER TABLE `product_orders` ADD COLUMN `tracking_number` varchar(128) DEFAULT NULL COMMENT '快递单号'",
+            "ALTER TABLE `product_orders` ADD COLUMN `express_company` varchar(64) DEFAULT NULL COMMENT '快递公司'",
+            "ALTER TABLE `product_orders` ADD COLUMN `refund_status` tinyint(1) DEFAULT 0 COMMENT '退款状态:0无 1申请中 2已退款 3拒绝'",
+            "ALTER TABLE `product_orders` ADD COLUMN `refund_reason` varchar(512) DEFAULT NULL COMMENT '退款原因'",
+            "ALTER TABLE `product_orders` ADD COLUMN `refund_amount` decimal(10,2) DEFAULT NULL COMMENT '退款金额'",
+            "ALTER TABLE `product_orders` ADD COLUMN `refund_time` datetime DEFAULT NULL COMMENT '退款时间'",
+            "ALTER TABLE `product_orders` ADD COLUMN `pickup_code` varchar(16) DEFAULT NULL COMMENT '自提码'",
+            "ALTER TABLE `product_orders` ADD COLUMN `remark` varchar(512) DEFAULT NULL COMMENT '买家备注'"
+        };
+        for (String sql : alterStatements) {
+            try {
+                jdbcTemplate.execute(sql);
+                String colName = sql.replaceFirst(".*ADD COLUMN `?\\w+`?\\s+.*", "$1");
+                log.info("商品订单迁移成功: ADD COLUMN {}", colName);
+            } catch (Exception e) {
+                log.debug("商品订单字段已存在,跳过: {}", e.getMessage());
+            }
+        }
+        log.info("商品订单增量迁移完成");
+    }
+
     private void initializeDatabase() {
         try {
             // 尝试连接数据库,如果不存在则创建
@@ -2216,6 +2251,49 @@ log.info("已添加template_id列到tasks表");
             log.warn("检查/添加activities表checkin_points列失败: {}", e.getMessage());
         }
 
+        // ==================== 迁移: activities表添加报名相关列 ====================
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'activities' AND COLUMN_NAME = 'require_registration'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN require_registration TINYINT DEFAULT 1 COMMENT '是否需要报名: 1=需要, 0=直接参与'");
+                log.info("已添加require_registration列到activities表");
+            } else {
+                log.info("activities表require_registration列已存在,跳过");
+            }
+        } catch (Exception e) {
+            log.warn("检查/添加activities表require_registration列失败: {}", e.getMessage());
+        }
+
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'activities' AND COLUMN_NAME = 'require_checkin_review'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN require_checkin_review TINYINT DEFAULT 1 COMMENT '打卡是否需要审核: 1=需要, 0=直接通过'");
+                log.info("已添加require_checkin_review列到activities表");
+            } else {
+                log.info("activities表require_checkin_review列已存在,跳过");
+            }
+        } catch (Exception e) {
+            log.warn("检查/添加activities表require_checkin_review列失败: {}", e.getMessage());
+        }
+
+        try {
+            Integer colExists = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'activities' AND COLUMN_NAME = 'energy_penalty_unregistered'",
+                Integer.class);
+            if (colExists == null || colExists == 0) {
+                jdbcTemplate.execute("ALTER TABLE activities ADD COLUMN energy_penalty_unregistered INT DEFAULT 5 COMMENT '未报名打卡的行能量扣减值'");
+                log.info("已添加energy_penalty_unregistered列到activities表");
+            } else {
+                log.info("activities表energy_penalty_unregistered列已存在,跳过");
+            }
+        } catch (Exception e) {
+            log.warn("检查/添加activities表energy_penalty_unregistered列失败: {}", e.getMessage());
+        }
+
         // 迁移: 创建family_invitations表(家庭邀请令牌)
         try {
             jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS family_invitations (" +