| src/main/java/com/zy/asrs/task/handler/AgvHandler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/task/handler/AgvHandler.java
@@ -322,15 +322,65 @@ return null; } // 排除有正在搬运任务的站点(状态8:已呼叫AGV,正在搬运) List<BasDevp> availableDevList = new ArrayList<>(); Integer taskIoType = task.getIoType(); if (taskIoType != null) { // 根据任务类型确定要检查的io_type列表 List<Integer> checkIoTypes; String taskTypeName; if (taskIoType < 100) { // 入库任务:只检查入库类型(1, 10, 53, 57) checkIoTypes = Arrays.asList(1, 10, 53, 57); taskTypeName = "入库"; } else { // 出库任务:只检查出库类型(101, 110, 103, 107) checkIoTypes = Arrays.asList(101, 110, 103, 107); taskTypeName = "出库"; } // 检查每个站点是否有正在搬运的同类型任务 for (BasDevp dev : devList) { String staNo = String.valueOf(dev.getDevNo()); // 查询该站点是否有状态8(正在搬运)的同类型任务 List<Task> transportingTasks = taskService.selectList( new EntityWrapper<Task>() .eq("sta_no", staNo) .eq("task_type", "agv") .eq("wrk_sts", 8L) // 只检查正在搬运状态的任务 .in("io_type", checkIoTypes) ); if (transportingTasks.isEmpty()) { // 该站点没有正在搬运的任务,可以分配 availableDevList.add(dev); } else { log.debug("站点{}有{}个正在搬运的{}AGV任务,跳过分配", staNo, transportingTasks.size(), taskTypeName); } } } else { // 如果ioType为空,不进行过滤(保持原有逻辑) availableDevList = devList; } // 如果所有站点都在搬运,则不分配站点 if (availableDevList.isEmpty()) { log.warn("任务ID:{}的所有候选站点都有正在搬运的{}任务,暂不分配站点", task.getId(), taskIoType != null && taskIoType < 100 ? "入库" : "出库"); return null; } // 入库任务数排序 devList.sort(Comparator.comparing(BasDevp::getInQty)); availableDevList.sort(Comparator.comparing(BasDevp::getInQty)); // 选择站点 BasDevp basDevp; int minInQty = devList.get(0).getInQty(); int minInQty = availableDevList.get(0).getInQty(); // 筛选出任务数最少的站点列表 List<BasDevp> minTaskSites = devList.stream() List<BasDevp> minTaskSites = availableDevList.stream() .filter(dev -> dev.getInQty() == minInQty) .collect(Collectors.toList()); src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -69,6 +69,9 @@ @Autowired private AgvProperties agvProperties; @Autowired private WrkMastLogService wrkMastLogService; public ReturnT<String> start(WrkMast wrkMast) { // 4.入库完成 @@ -757,6 +760,60 @@ return; } // 检查工作档是否已完成或已转历史档 boolean workCompleted = false; if (outTask.getWrkNo() != null) { // 检查工作档是否存在且已完成 WrkMast wrkMast = wrkMastService.selectOne( new EntityWrapper<WrkMast>().eq("wrk_no", outTask.getWrkNo()) ); if (wrkMast != null) { Long wrkSts = wrkMast.getWrkSts(); // 出库任务完成状态:14(已出库未确认)或15(出库更新完成) if (wrkSts != null && (wrkSts == 14L || wrkSts == 15L)) { workCompleted = true; log.debug("工作档{}已完成,状态:{}", outTask.getWrkNo(), wrkSts); } } else { // 如果工作档不存在,检查历史档 WrkMastLog wrkMastLog = wrkMastLogService.selectOne( new EntityWrapper<WrkMastLog>().eq("wrk_no", outTask.getWrkNo()) ); if (wrkMastLog != null) { long logWrkSts = wrkMastLog.getWrkSts(); // 出库任务历史档完成状态:15(出库更新完成) if (logWrkSts == 15L) { workCompleted = true; log.debug("工作档{}已转历史档并完结,历史档状态:{}", outTask.getWrkNo(), logWrkSts); } } } } // 检查是否有从该出库站点到缓存区的正在搬运任务(状态8:已呼叫AGV,正在搬运) // 出库到缓存区的任务类型:101(全板出库)或110(空板出库) List<Task> transportingTasks = taskService.selectList( new EntityWrapper<Task>() .eq("source_sta_no", outboundStaNo) // 源站点是出库站点 .in("sta_no", cacheStations) // 目标站点是缓存区站点 .eq("task_type", "agv") .eq("wrk_sts", 8L) // 只检查正在搬运状态的任务 .in("io_type", 101, 110) // 出库到缓存区的任务类型 ); // 如果有正在搬运的任务,且工作档未完成,则不分配缓存库位 if (!transportingTasks.isEmpty() && !workCompleted) { log.info("出库站点{}到缓存区有{}个正在搬运的AGV任务,且工作档未完成,暂不分配缓存库位,等待搬运完成。出库任务ID:{}", outboundStaNo, transportingTasks.size(), outTask.getId()); return; // 有正在搬运的任务且工作档未完成,不分配缓存库位,等待下次检查 } if (!transportingTasks.isEmpty() && workCompleted) { log.info("出库站点{}到缓存区有{}个正在搬运的AGV任务,但工作档已完成或已转历史档,允许分配缓存库位。出库任务ID:{}", outboundStaNo, transportingTasks.size(), outTask.getId()); } // 选择缓存区目标站点(使用第一个可用站点,或可以优化为选择任务最少的站点) String cacheStaNo = cacheStations.get(0);