From 0fcc9721259214b647fe1b7fed0e00b09dfd4457 Mon Sep 17 00:00:00 2001
From: zhaowenyu <35589726@qq.com>
Date: Tue, 16 Dec 2025 08:14:47 +0800
Subject: [PATCH] 2025-12-16 zwy 优化循环任务逻辑

---
 ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineLoopTaskServiceImpl.java |   32 +++++++++++++++++++++++++++-----
 1 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineLoopTaskServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineLoopTaskServiceImpl.java
index 7c14a92..29191a5 100644
--- a/ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineLoopTaskServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineLoopTaskServiceImpl.java
@@ -13,6 +13,7 @@
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Optional;
+import java.util.concurrent.TimeUnit;
 
 @Slf4j
 @Component
@@ -27,6 +28,7 @@
      * 定时任务,生成循环任务在有效其内的每天的定时任务
      * */
 //    @Scheduled(cron = "0 0 10 * * ?")
+    @Scheduled(initialDelay = 1, fixedRate = 10, timeUnit = TimeUnit.SECONDS)
     public void loopTask() {
         try {
             // 执行定时任务逻辑,例如检查并执行已到时间的飞行任务
@@ -37,8 +39,28 @@
                 if (waylineJobEntity.getStatus() == WaylineJobStatusEnum.SUCCESS.getVal()) {
                     continue;
                 }
+
                 // 判断时间是否在有期内,循环任务的逻辑是,开始执行时间+循环次数。
                 Long beginTime = waylineJobEntity.getBeginTime();
+
+                // 优化判断逻辑,定时任务每10分钟执行一次,将今天下发的循环任务,时间在当前时间之后的任务生成第一次定时任务。
+                // 前提是时间要在当前时间10分钟以上的时间。
+                // 判断父任务是否生成当天子任务,如果已经生成,则不重复生成。
+                Long dayTime = _timestampUtils.combine(beginTime);
+                // 先判断当前时间是否大于预生成子任务的执行时间
+                Long dayTime10 = _timestampUtils.plusMinutesByMillis(dayTime, -10);
+                if(dayTime10.compareTo(System.currentTimeMillis()) < 0)
+                {
+                    log.info("循环子任务时间在当前时间之前,主任务ID:{}。", waylineJobEntity.getJobId());
+                    continue;
+                }
+                List<WaylineJobEntity> jobDayList = _waylineJobService.selectList(1L, dayTime, waylineJobEntity.getJobId());
+                if(!jobDayList.isEmpty()){
+                    log.info("循环子任务已经存在,主任务ID:{}。", waylineJobEntity.getJobId());
+                    continue;
+                }
+
+
                 // 获取循环任务开始的那天的0点0分0秒的时间戳,方便比对时间有效期范围;
                 // 循环任务按每天下发定时任务走,必须要在当次任务执行时间之前执行。
                 Long beginTime_Start = _timestampUtils.getDayStartTimestamp(beginTime);
@@ -61,11 +83,11 @@
                                 .code(0).build());
                         continue;
                     }
-                    List<WaylineJobEntity> jobEntities = _waylineJobService.selectList(null, newTime, waylineJobEntity.getJobId());
-                    if (!jobEntities.isEmpty()) {
-                        log.info("循环子任务已经存在,主任务ID:{},时间:{}!", waylineJobEntity.getJobId(), _timestampUtils.formatByMillis(newTime));
-                        continue;
-                    }
+//                    List<WaylineJobEntity> jobEntities = _waylineJobService.selectList(null, newTime, waylineJobEntity.getJobId());
+//                    if (!jobEntities.isEmpty()) {
+//                        log.info("循环子任务已经存在,主任务ID:{},时间:{}!", waylineJobEntity.getJobId(), _timestampUtils.formatByMillis(newTime));
+//                        continue;
+//                    }
                     CreateJobParam param = getCreateJobParam(waylineJobEntity, newTime);
                     Optional<WaylineJobDTO> waylineJobDTO = _waylineJobService.createWaylineJob(param, waylineJobEntity.getUsername(), newTime, newTime);
                     _waylineJobService.publishFlightTaskPrepare(waylineJobDTO);

--
Gitblit v1.9.3