Xiajijian
2026-01-28 71f1ecb26bc9f8f92be176bb03052212beff221a
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);
@@ -82,6 +104,7 @@
    private CreateJobParam getCreateJobParam(WaylineJobEntity waylineJobEntity, Long newTime) {
        CreateJobParam param = new CreateJobParam();
        param.setRth_mode(1);
        param.setName(waylineJobEntity.getName() + "-子任务");
        param.setFileId(waylineJobEntity.getFileId());
        param.setDockSn(waylineJobEntity.getDockSn());