自动化立体仓库 - WMS系统
chen.llin
20 小时以前 d7020a8f1ec6f55167b4ad14941de0e28ce3d8c1
agv出库逻辑
2个文件已修改
113 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/task/handler/AgvHandler.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 57 ●●●●● 补丁 | 查看 | 原始文档 | 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);