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/WaylineJobServiceImpl.java      |   20 ++++++++++----------
 ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineLoopTaskServiceImpl.java |   32 +++++++++++++++++++++++++++-----
 2 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineJobServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineJobServiceImpl.java
index a4ac847..f2c9683 100644
--- a/ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineJobServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineJobServiceImpl.java
@@ -366,10 +366,10 @@
         // 下发参数打印
         try{
             String json = objectMapper.writeValueAsString(flightTask);
-            log.info("机场下发航线任务的参数flightTask:{}", json);
+            log.info("机场下发循环任务子任务-定时任务的航线任务的参数flightTask:{}", json);
         }
         catch (Exception e){
-            log.error("机场下发航线任务的参数flightTask异常:{}", e.getMessage());
+            log.error("机场下发循环任务子任务-定时任务的航线任务的参数flightTask异常:{}", e.getMessage());
         }
 
         String topic = TopicConst.THING_MODEL_PRE + TopicConst.PRODUCT +
@@ -384,9 +384,9 @@
 
         ServiceReply serviceReply = messageSender.publishWithReply(topic, response);
 
-        log.info("下发任务结果: {}", serviceReply.getResult());
-        log.info("机场任务航线文件url地址:{}", httpUrl);
-        log.info("机场任务航线文件md5值:{}", md5);
+        log.info("下发循环任务子任务-定时任务的结果: {}", serviceReply.getResult());
+        log.info("机场循环任务子任务-定时任务的航线文件url地址:{}", httpUrl);
+        log.info("机场循环任务子任务-定时任务的航线文件md5值:{}", md5);
 
         if (ResponseResult.CODE_SUCCESS != serviceReply.getResult()) {
             String errorMsg = CommonErrorEnum.getMsgByCode(serviceReply.getResult());
@@ -403,11 +403,11 @@
 
         // 飞行命令先注释掉
         // Issue an immediate task execution command.
-        if (WaylineTaskTypeEnum.IMMEDIATE.getVal() == waylineJob.getTaskType()) {
-            if (!executeFlightTask(waylineJob.getJobId())) {
-                return ResponseResult.error("无法执行作业。");
-            }
-        }
+//        if (WaylineTaskTypeEnum.IMMEDIATE.getVal() == waylineJob.getTaskType()) {
+//            if (!executeFlightTask(waylineJob.getJobId())) {
+//                return ResponseResult.error("无法执行作业。");
+//            }
+//        }
 
         if (WaylineTaskTypeEnum.TIMED.getVal() == waylineJob.getTaskType()) {
             boolean isAdd = RedisOpsUtils.zAdd(RedisConst.WAYLINE_JOB_TIMED_EXECUTE,
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