You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

152 lines
6.3 KiB

package com.gaotao.modules.automatedWarehouse.task;
import com.gaotao.common.utils.ErrorLogUtils;
import com.gaotao.modules.automatedWarehouse.entity.WmsTransportTask;
import com.gaotao.modules.automatedWarehouse.entity.WmsTransportTaskDetail;
import com.gaotao.modules.automatedWarehouse.service.AgvTaskService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* AGV任务调度定时任务
* 职责:只负责定时任务的调度,具体业务逻辑委托给AgvTaskService处理
*/
@Slf4j
@Component
public class AgvTaskScheduler {
@Autowired
private AgvTaskService agvTaskService;
@Value("${scheduler.agv.enabled:true}")
private boolean enabled;
@Value("${agv.max-task-num:10}")
private int maxTaskNum;
/**
* 定时任务:每分钟执行一次AGV任务优先级调度
* cron表达式:0 * * * * ? 表示每分钟的第0秒执行
* 调度策略:
* - 如果执行中任务数 >= 10,则不下发新任务
* - 如果执行中任务数 < 10,则下发多个优先级高的任务,但总数不超过10
* 配置说明:通过 scheduler.agv.enabled 控制是否启用
*/
@Scheduled(fixedDelay = 5000)
public void scheduleAgvTaskByPriority() {
// 检查定时任务开关
if (!enabled) {
return;
}
log.info("=== 开始执行AGV任务优先级调度定时任务 ===");
try {
// 1. 检查当前执行中的任务数量
int executingCount = agvTaskService.getExecutingTaskCount();
log.info("当前执行中的任务数量:{}", executingCount);
// 2. 如果执行中任务数 >= 10,则不下发新任务
if (executingCount >= maxTaskNum) {
log.info("执行中任务数量已达到上限(10个),暂不下发新任务");
return;
}
// 3. 计算可以下发的任务数量
int canDispatchCount = 10 - executingCount;
log.info("可以下发的任务数量:{}", canDispatchCount);
// 4. 获取所有未下发的AGV任务,按优先级降序排列
List<WmsTransportTask> pendingTasks = agvTaskService.getPendingTasksByPriority();
if (pendingTasks == null || pendingTasks.isEmpty()) {
log.info("当前没有待下发的AGV任务");
return;
}
log.info("找到 {} 个待下发的AGV任务", pendingTasks.size());
// 5. 选择要下发的任务(取优先级最高的几个,数量不超过可下发数量)
int actualDispatchCount = Math.min(canDispatchCount, pendingTasks.size());
List<WmsTransportTask> tasksToDispatch = pendingTasks.subList(0, actualDispatchCount);
log.info("准备下发 {} 个优先级最高的任务", actualDispatchCount);
// 6. 批量下发任务
int successCount = 0;
for (WmsTransportTask task : tasksToDispatch) {
try {
log.info("下发任务:taskNo={}, priority={}, fromLocation={}, toLocation={}",
task.getTaskNo(), task.getPriority(), task.getFromLocation(), task.getToLocation());
// 下发任务到AGV系统
agvTaskService.dispatchAgvTask(task);
// 更新任务状态为已下发 - rqrq
agvTaskService.updateTaskStatusToDispatched(task.getSite(), task.getTaskNo());
successCount++;
log.info("任务下发成功:taskNo={}", task.getTaskNo());
} catch (Exception e) {
ErrorLogUtils.logException(task.getSite(), "立库自动化", "AGV下发任务", task.getTaskNo(), e);
log.error("任务下发失败:taskNo={}, error={}", task.getTaskNo(), e.getMessage());
// 继续下发其他任务,不中断整个流程
}
}
log.info("本次调度完成,成功下发 {} 个任务", successCount);
} catch (Exception e) {
log.error("=== AGV任务优先级调度定时任务执行失败 ===", e);
}
log.info("=== AGV任务优先级调度定时任务执行完成 ===");
}
/**
* 定时任务:每分钟执行一次AGV回调处理
* cron表达式:0 * * * * ? 表示每分钟的第0秒执行
* 配置说明:通过 scheduler.agv.enabled 控制是否启用
*/
@Scheduled(fixedDelay = 5000)
public void scheduleDOFeedback() {
// 检查定时任务开关
if (!enabled) {
return;
}
log.info("=== 开始处理AGV回调相关业务 ===");
try {
// 获取待处理的AGV回调任务
List<WmsTransportTaskDetail> list = agvTaskService.getPendingAgvFeedbackTasks("55");
for (WmsTransportTaskDetail taskDetail : list) {
try {
// 委托给业务服务处理
agvTaskService.processAgvFeedbackTask(taskDetail);
} catch (Exception e) {
ErrorLogUtils.logException(taskDetail.getSite(), "立库自动化", "处理AGV回调信息:"+taskDetail.getActionType(), taskDetail.getTaskNo(), e);
log.error("处理AGV回调数据失败:taskNo={}, error={}", taskDetail.getTaskNo(), e.getMessage());
// 继续处理下一个数据
}
}
} catch (Exception e) {
log.error("=== AGV回调定时任务执行失败 ===", e);
}
log.info("=== AGV回调相关业务处理完成 ===");
}
/**
* 手动触发AGV任务调度(用于测试或手动执行)
*/
public void manualSchedule() {
log.info("手动触发AGV任务优先级调度");
scheduleAgvTaskByPriority();
}
}