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

10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
8 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
8 months ago
10 months ago
10 months ago
9 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
  1. package com.gaotao.modules.automatedWarehouse.task;
  2. import com.gaotao.common.utils.ErrorLogUtils;
  3. import com.gaotao.modules.automatedWarehouse.entity.WmsTransportTask;
  4. import com.gaotao.modules.automatedWarehouse.entity.WmsTransportTaskDetail;
  5. import com.gaotao.modules.automatedWarehouse.service.AgvTaskService;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.beans.factory.annotation.Value;
  9. import org.springframework.scheduling.annotation.Scheduled;
  10. import org.springframework.stereotype.Component;
  11. import java.util.List;
  12. /**
  13. * AGV任务调度定时任务
  14. * 职责只负责定时任务的调度具体业务逻辑委托给AgvTaskService处理
  15. */
  16. @Slf4j
  17. @Component
  18. public class AgvTaskScheduler {
  19. @Autowired
  20. private AgvTaskService agvTaskService;
  21. @Value("${scheduler.agv.enabled:true}")
  22. private boolean enabled;
  23. @Value("${agv.max-task-num:10}")
  24. private int maxTaskNum;
  25. /**
  26. * 定时任务每分钟执行一次AGV任务优先级调度
  27. * cron表达式0 * * * * ? 表示每分钟的第0秒执行
  28. * 调度策略
  29. * - 如果执行中任务数 >= 10则不下发新任务
  30. * - 如果执行中任务数 < 10则下发多个优先级高的任务但总数不超过10
  31. * 配置说明通过 scheduler.agv.enabled 控制是否启用
  32. */
  33. @Scheduled(fixedDelay = 5000)
  34. public void scheduleAgvTaskByPriority() {
  35. // 检查定时任务开关
  36. if (!enabled) {
  37. return;
  38. }
  39. log.info("=== 开始执行AGV任务优先级调度定时任务 ===");
  40. try {
  41. // 1. 检查当前执行中的任务数量
  42. int executingCount = agvTaskService.getExecutingTaskCount();
  43. log.info("当前执行中的任务数量:{}", executingCount);
  44. // 2. 如果执行中任务数 >= 10,则不下发新任务
  45. if (executingCount >= maxTaskNum) {
  46. log.info("执行中任务数量已达到上限(10个),暂不下发新任务");
  47. return;
  48. }
  49. // 3. 计算可以下发的任务数量
  50. int canDispatchCount = 10 - executingCount;
  51. log.info("可以下发的任务数量:{}", canDispatchCount);
  52. // 4. 获取所有未下发的AGV任务,按优先级降序排列
  53. List<WmsTransportTask> pendingTasks = agvTaskService.getPendingTasksByPriority();
  54. if (pendingTasks == null || pendingTasks.isEmpty()) {
  55. log.info("当前没有待下发的AGV任务");
  56. return;
  57. }
  58. log.info("找到 {} 个待下发的AGV任务", pendingTasks.size());
  59. // 5. 选择要下发的任务(取优先级最高的几个,数量不超过可下发数量)
  60. int actualDispatchCount = Math.min(canDispatchCount, pendingTasks.size());
  61. List<WmsTransportTask> tasksToDispatch = pendingTasks.subList(0, actualDispatchCount);
  62. log.info("准备下发 {} 个优先级最高的任务", actualDispatchCount);
  63. // 6. 批量下发任务
  64. int successCount = 0;
  65. for (WmsTransportTask task : tasksToDispatch) {
  66. try {
  67. log.info("下发任务:taskNo={}, priority={}, fromLocation={}, toLocation={}",
  68. task.getTaskNo(), task.getPriority(), task.getFromLocation(), task.getToLocation());
  69. // 下发任务到AGV系统
  70. agvTaskService.dispatchAgvTask(task);
  71. // 更新任务状态为已下发 - rqrq
  72. agvTaskService.updateTaskStatusToDispatched(task.getSite(), task.getTaskNo());
  73. successCount++;
  74. log.info("任务下发成功:taskNo={}", task.getTaskNo());
  75. } catch (Exception e) {
  76. ErrorLogUtils.logException(task.getSite(), "立库自动化", "AGV下发任务", task.getTaskNo(), e);
  77. log.error("任务下发失败:taskNo={}, error={}", task.getTaskNo(), e.getMessage());
  78. // 继续下发其他任务,不中断整个流程
  79. }
  80. }
  81. log.info("本次调度完成,成功下发 {} 个任务", successCount);
  82. } catch (Exception e) {
  83. log.error("=== AGV任务优先级调度定时任务执行失败 ===", e);
  84. }
  85. log.info("=== AGV任务优先级调度定时任务执行完成 ===");
  86. }
  87. /**
  88. * 定时任务每分钟执行一次AGV回调处理
  89. * cron表达式0 * * * * ? 表示每分钟的第0秒执行
  90. * 配置说明通过 scheduler.agv.enabled 控制是否启用
  91. */
  92. @Scheduled(fixedDelay = 5000)
  93. public void scheduleDOFeedback() {
  94. // 检查定时任务开关
  95. if (!enabled) {
  96. return;
  97. }
  98. log.info("=== 开始处理AGV回调相关业务 ===");
  99. try {
  100. // 获取待处理的AGV回调任务
  101. List<WmsTransportTaskDetail> list = agvTaskService.getPendingAgvFeedbackTasks("55");
  102. for (WmsTransportTaskDetail taskDetail : list) {
  103. try {
  104. // 委托给业务服务处理
  105. agvTaskService.processAgvFeedbackTask(taskDetail);
  106. } catch (Exception e) {
  107. ErrorLogUtils.logException(taskDetail.getSite(), "立库自动化", "处理AGV回调信息:"+taskDetail.getActionType(), taskDetail.getTaskNo(), e);
  108. log.error("处理AGV回调数据失败:taskNo={}, error={}", taskDetail.getTaskNo(), e.getMessage());
  109. // 继续处理下一个数据
  110. }
  111. }
  112. } catch (Exception e) {
  113. log.error("=== AGV回调定时任务执行失败 ===", e);
  114. }
  115. log.info("=== AGV回调相关业务处理完成 ===");
  116. }
  117. /**
  118. * 手动触发AGV任务调度用于测试或手动执行
  119. */
  120. public void manualSchedule() {
  121. log.info("手动触发AGV任务优先级调度");
  122. scheduleAgvTaskByPriority();
  123. }
  124. }