Browse Source

fix: 迁移334 desc 保留字报错 + 启动期定时任务竞态保护 [skip ci]

Xiaogang Liao 1 day ago
parent
commit
e8ab78e5cb

+ 9 - 1
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -29,6 +29,13 @@ public class DatabaseInitializer implements CommandLineRunner {
 
     private static final Logger log = LoggerFactory.getLogger(DatabaseInitializer.class);
 
+    /** 迁移是否已全部完成(供定时任务判断,避免启动期时序竞态) */
+    private static volatile boolean migrationsComplete = false;
+
+    public static boolean isMigrationsComplete() {
+        return migrationsComplete;
+    }
+
     @Resource
     private JdbcTemplate jdbcTemplate;
 
@@ -63,6 +70,7 @@ public class DatabaseInitializer implements CommandLineRunner {
             log.info("init-test-data=false,跳过测试/种子数据初始化(生产模式)");
         }
 
+        migrationsComplete = true;
         log.info("数据库初始化完成!");
     }
 
@@ -11074,7 +11082,7 @@ log.info("迁移298: 已为无 openid 的 child 账号补齐 family_members 记
                     "popup_id BIGINT NOT NULL COMMENT '关联 guide_popup.id', " +
                     "step_order INT NOT NULL DEFAULT 0 COMMENT '步骤顺序', " +
                     "title VARCHAR(128) NOT NULL DEFAULT '' COMMENT '步骤标题', " +
-                    "desc TEXT COMMENT '步骤描述', " +
+                    "`desc` TEXT COMMENT '步骤描述', " +
                     "icon VARCHAR(256) NOT NULL DEFAULT '' COMMENT '步骤图标', " +
                     "icon_type TINYINT NOT NULL DEFAULT 0 COMMENT '图标类型:0=emoji 1=图片', " +
                     "is_intro TINYINT NOT NULL DEFAULT 0 COMMENT '是否为开场身份定义页', " +

+ 5 - 0
cfc-backend/src/main/java/com/etotem/cfc/task/OrderTimeoutCancelTask.java

@@ -14,6 +14,7 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import com.etotem.cfc.util.SortUtil;
+import com.etotem.cfc.config.DatabaseInitializer;
 
 @Component
 public class OrderTimeoutCancelTask {
@@ -28,6 +29,10 @@ public class OrderTimeoutCancelTask {
 
     @Scheduled(fixedRate = 60000) // 每分钟执行一次
     public void cancelTimeoutOrders() {
+        if (!DatabaseInitializer.isMigrationsComplete()) {
+            log.info("数据库迁移尚未完成,跳过本轮订单超时检查");
+            return;
+        }
         // 计算超时时间点
         Calendar cal = Calendar.getInstance();
         cal.add(Calendar.MINUTE, -paymentTimeoutMinutes);

+ 5 - 0
cfc-backend/src/main/java/com/etotem/cfc/task/RefundScheduledTasks.java

@@ -21,6 +21,7 @@ import javax.annotation.Resource;
 import java.util.Date;
 import java.util.List;
 import com.etotem.cfc.util.SortUtil;
+import com.etotem.cfc.config.DatabaseInitializer;
 
 /**
  * 退款定时任务
@@ -55,6 +56,10 @@ public class RefundScheduledTasks {
     @Scheduled(cron = "0 */5 * * * ?")
     @Transactional(rollbackFor = Exception.class)
     public void processPendingRefunds() {
+        if (!DatabaseInitializer.isMigrationsComplete()) {
+            log.info("数据库迁移尚未完成,跳过本轮退款处理");
+            return;
+        }
         log.info("开始执行待退款处理定时任务");
         try {
             // 获取待处理的退款记录(最多 10 条)

+ 5 - 0
cfc-backend/src/main/java/com/etotem/cfc/task/RepeatTaskGenerator.java

@@ -11,6 +11,7 @@ import org.springframework.stereotype.Component;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
+import com.etotem.cfc.config.DatabaseInitializer;
 
 /**
  * TASK-SYS-248: 重复任务定时生成器(频率分派版)
@@ -34,6 +35,10 @@ public class RepeatTaskGenerator {
      */
     @Scheduled(cron = "0 5 * * * ?")
     public void generateDailyTasks() {
+        if (!DatabaseInitializer.isMigrationsComplete()) {
+            log.info("数据库迁移尚未完成,跳过本轮重复任务生成");
+            return;
+        }
         log.info("开始按频率生成重复任务...");
 
         try {

+ 5 - 0
cfc-backend/src/main/java/com/etotem/cfc/task/VirtualPayTimeoutTask.java

@@ -27,6 +27,7 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 import com.etotem.cfc.util.SortUtil;
+import com.etotem.cfc.config.DatabaseInitializer;
 
 /**
  * 虚拟支付超时兜底任务(spec §7:success 回调丢失防丢单)。
@@ -72,6 +73,10 @@ public class VirtualPayTimeoutTask {
 
     @Scheduled(fixedRate = 60000) // 每分钟执行一次
     public void handleTimeoutOrders() {
+        if (!DatabaseInitializer.isMigrationsComplete()) {
+            log.info("数据库迁移尚未完成,跳过本轮虚拟支付超时检查");
+            return;
+        }
         Calendar cal = Calendar.getInstance();
         cal.add(Calendar.MINUTE, -paymentTimeoutMinutes);
         Date timeoutTime = cal.getTime();