6 changed files with 298 additions and 0 deletions
-
52src/main/java/com/gaotao/modules/automatedWarehouse/controller/AgvTaskController.java
-
18src/main/java/com/gaotao/modules/automatedWarehouse/mapper/AgvTaskMapper.java
-
18src/main/java/com/gaotao/modules/automatedWarehouse/service/AgvTaskService.java
-
15src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/AgvTaskServiceImpl.java
-
136src/main/java/com/gaotao/modules/automatedWarehouse/task/AgvTaskScheduler.java
-
59src/main/resources/mapper/automatedWarehouse/AgvTaskMapper.xml
@ -0,0 +1,136 @@ |
|||
package com.gaotao.modules.automatedWarehouse.task; |
|||
|
|||
import com.gaotao.common.utils.AgvClientUtil; |
|||
import com.gaotao.modules.automatedWarehouse.entity.WmsTransportTask; |
|||
import com.gaotao.modules.automatedWarehouse.service.AgvTaskService; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.scheduling.annotation.Scheduled; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
import java.util.Arrays; |
|||
import java.util.Date; |
|||
import java.util.List; |
|||
|
|||
/** |
|||
* AGV任务优先级调度定时任务 |
|||
* 每分钟执行一次,获取所有未下发的AGV任务,按优先级排序后下发优先级最高的任务 |
|||
*/ |
|||
@Slf4j |
|||
@Component |
|||
public class AgvTaskScheduler { |
|||
|
|||
@Autowired |
|||
private AgvTaskService agvTaskService; |
|||
|
|||
@Autowired |
|||
private AgvClientUtil agvClientUtil; |
|||
|
|||
/** |
|||
* 定时任务:每分钟执行一次AGV任务优先级调度 |
|||
* cron表达式:0 * * * * ? 表示每分钟的第0秒执行 |
|||
* |
|||
* 调度策略: |
|||
* - 如果执行中任务数 >= 10,则不下发新任务 |
|||
* - 如果执行中任务数 < 10,则下发多个优先级高的任务,但总数不超过10 |
|||
*/ |
|||
@Scheduled(cron = "0 * * * * ?") |
|||
public void scheduleAgvTaskByPriority() { |
|||
log.info("=== 开始执行AGV任务优先级调度定时任务 ==="); |
|||
|
|||
try { |
|||
// 1. 检查当前执行中的任务数量 |
|||
int executingCount = agvTaskService.getExecutingTaskCount(); |
|||
log.info("当前执行中的任务数量:{}", executingCount); |
|||
|
|||
// 2. 如果执行中任务数 >= 10,则不下发新任务 |
|||
if (executingCount >= 10) { |
|||
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系统 |
|||
dispatchTaskToAgv(task); |
|||
|
|||
// 更新任务状态为已下发 |
|||
agvTaskService.updateTaskStatusToDispatched(task.getTaskNo()); |
|||
|
|||
successCount++; |
|||
log.info("任务下发成功:taskNo={}", task.getTaskNo()); |
|||
|
|||
} catch (Exception e) { |
|||
log.error("任务下发失败:taskNo={}, error={}", task.getTaskNo(), e.getMessage()); |
|||
// 继续下发其他任务,不中断整个流程 |
|||
} |
|||
} |
|||
|
|||
log.info("本次调度完成,成功下发 {} 个任务", successCount); |
|||
|
|||
} catch (Exception e) { |
|||
log.error("=== AGV任务优先级调度定时任务执行失败 ===", e); |
|||
} |
|||
|
|||
log.info("=== AGV任务优先级调度定时任务执行完成 ==="); |
|||
} |
|||
|
|||
/** |
|||
* 将任务下发到AGV系统 |
|||
* @param task 运输任务 |
|||
*/ |
|||
private void dispatchTaskToAgv(WmsTransportTask task) { |
|||
try { |
|||
// 构建目标点列表(从起始位置到目标位置) |
|||
List<String> targets = Arrays.asList(task.getFromLocation(), task.getToLocation()); |
|||
|
|||
// 调用AGV接口创建任务 |
|||
agvClientUtil.createTask( |
|||
task.getTaskNo(), // 任务ID |
|||
targets, // 目标点列表 |
|||
"DEFAULT_CONFIG", // 配置ID(可根据需要调整) |
|||
task.getPriority() // 优先级 |
|||
); |
|||
|
|||
log.info("成功调用AGV接口创建任务:taskNo={}, targets={}, priority={}", |
|||
task.getTaskNo(), targets, task.getPriority()); |
|||
|
|||
} catch (Exception e) { |
|||
log.error("下发AGV任务失败:taskNo={}, error={}", task.getTaskNo(), e.getMessage()); |
|||
throw new RuntimeException("下发AGV任务失败:" + e.getMessage(), e); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 手动触发AGV任务调度(用于测试或手动执行) |
|||
*/ |
|||
public void manualSchedule() { |
|||
log.info("手动触发AGV任务优先级调度"); |
|||
scheduleAgvTaskByPriority(); |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue