Просмотр исходного кода

fix: 迁移40 ALTER ENUM前先UPDATE非法role值,避免Data truncated错误

Xiaogang Liao 2 месяцев назад
Родитель
Сommit
00afdd82aa

+ 76 - 0
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -4363,6 +4363,8 @@ try {
 
         // 迁移40: 添加supplier_admin角色到users.role ENUM
         try {
+            // 先将非法role值统一修正为parent,避免ALTER ENUM时Data truncated错误
+            jdbcTemplate.execute("UPDATE users SET role='parent' WHERE role NOT IN ('parent','child','teacher','supplier_admin')");
             jdbcTemplate.execute("ALTER TABLE users MODIFY COLUMN role ENUM('parent','child','teacher','supplier_admin') NOT NULL DEFAULT 'parent' COMMENT '当前活跃角色'");
             log.info("已添加supplier_admin到users.role ENUM");
         } catch (Exception e) {
@@ -5881,5 +5883,79 @@ try {
         } catch (Exception e) {
             // 表已存在,忽略错误
         }
+
+        // 迁移 96: product_orders 添加活动provision字段 + activity_provisions 表(活动商品统一管理)
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN activity_id BIGINT DEFAULT NULL COMMENT '关联活动ID(product_type=activity时有效)'");
+            log.info("已添加activity_id列到product_orders表");
+        } catch (Exception e) {
+            // 列已存在,忽略错误
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN provision_status VARCHAR(32) DEFAULT NULL COMMENT '活动provision状态: unprovisioned(待审核)/provisioned(已发货)/signed_in(已签到)/completed(已完成)/cancelled(审核拒绝)'");
+            log.info("已添加provision_status列到product_orders表");
+        } catch (Exception e) {
+            // 列已存在,忽略错误
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN auditor_id BIGINT DEFAULT NULL COMMENT '审核人ID'");
+            log.info("已添加auditor_id列到product_orders表");
+        } catch (Exception e) {
+            // 列已存在,忽略错误
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN audited_at DATETIME DEFAULT NULL COMMENT '审核时间'");
+            log.info("已添加audited_at列到product_orders表");
+        } catch (Exception e) {
+            // 列已存在,忽略错误
+        }
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN audit_reason TEXT DEFAULT NULL COMMENT '审核拒绝原因'");
+            log.info("已添加audit_reason列到product_orders表");
+        } catch (Exception e) {
+            // 列已存在,忽略错误
+        }
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS activity_provisions (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "order_id BIGINT NOT NULL COMMENT '商品订单ID', " +
+                    "order_no VARCHAR(64) NOT NULL COMMENT '订单编号', " +
+                    "product_id BIGINT NOT NULL COMMENT '商品ID', " +
+                    "activity_id BIGINT NOT NULL COMMENT '活动ID', " +
+                    "buyer_id BIGINT NOT NULL COMMENT '购买者用户ID', " +
+                    "family_id BIGINT COMMENT '家庭ID', " +
+                    "child_id BIGINT COMMENT '报名孩子ID(签到时填写)', " +
+                    "status VARCHAR(32) NOT NULL DEFAULT 'unprovisioned' COMMENT 'unprovisioned/provisioned/signed_in/completed/cancelled', " +
+                    "qr_code VARCHAR(512) COMMENT '签到二维码', " +
+                    "checked_in_at DATETIME COMMENT '签到时间', " +
+                    "completed_at DATETIME COMMENT '完成时间', " +
+                    "refund_amount INT COMMENT '退款金额(分)', " +
+                    "refund_at DATETIME COMMENT '退款时间', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "INDEX idx_order (order_id), " +
+                    "INDEX idx_activity (activity_id), " +
+                    "INDEX idx_buyer (buyer_id), " +
+                    "INDEX idx_status (status)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动provision记录表'");
+            log.info("已创建activity_provisions表");
+        } catch (Exception e) {
+            // 表已存在,忽略错误
+        }
+
+        // 迁移 97: DAN测评服务佣金配置
+        seedDanCommissionConfig();
+    }
+
+    private void seedDanCommissionConfig() {
+        try {
+            jdbcTemplate.execute("INSERT IGNORE INTO sys_config (config_key, config_value, description, created_at) VALUES " +
+                    "('dan_commission_rate', '10', 'DAN测评服务通用佣金比例(%)', NOW()), " +
+                    "('dan_commission_rate_assessor', '10', 'DAN测评评估师佣金比例(%)', NOW()), " +
+                    "('dan_commission_rate_planner', '10', 'DAN测评规划师佣金比例(%)', NOW())");
+            log.info("已初始化DAN测评佣金配置");
+        } catch (Exception e) {
+            log.warn("DAN佣金配置种子数据可能已存在: " + e.getMessage());
+        }
     }
 }