自动化立体仓库 - WMS系统
chen.lin
2026-02-05 f8fa396c3b931bf20e342d866e5aa14076a8629a
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -160,6 +160,9 @@
                if (count == 0) {
                    throw new CoolException("条码未组托:" + barcode);
                }
                // 注意:托盘码是否在库的校验已在统一校验中处理
                ioType = 1; // AGV容器入库(实托入库)
                // 如果库位存在,更新状态为入库预约;不存在则跳过,由定时任务处理
@@ -177,6 +180,14 @@
                if (wrkMast.getIoType() != 103 && wrkMast.getIoType() != 107) {
                    throw new CoolException("条码不需要回库:" + barcode);
                }
                // 校验拣选回库托盘:当前工作档必须已完成(状态14或15)
                Long wrkSts = wrkMast.getWrkSts();
                if (wrkSts == null || (wrkSts != 14L && wrkSts != 15L)) {
                    log.warn("拣选回库托盘时,当前工作档未完成,状态:{},不允许呼叫AGV:{}", wrkSts, barcode);
                    throw new CoolException("条码在库,请更换条码" + barcode);
                }
                ioType = wrkMast.getIoType() - 50; // 103->53(拣料入库), 107->57(盘点入库)
                // 如果库位存在,更新状态为入库预约;不存在则跳过,由定时任务处理
@@ -196,19 +207,19 @@
                    throw new CoolException("条码组托档已存在:" + barcode);
                }
                
                // 检查是否有任务
                // 检查是否有任何工作档(空托盘不应该有任何工作档,包括已完成的工作档)
                int wrkMastCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("barcode", barcode));
                if (wrkMastCount != 0) {
                    log.warn("条码任务档已存在,不是空托盘:{}", barcode);
                    throw new CoolException("条码任务档已存在:" + barcode);
                }
                
                // 检查是否有库存
                int locDetlCount = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet", barcode));
                if (locDetlCount != 0) {
                    log.warn("条码库存已存在,不是空托盘:{}", barcode);
                    throw new CoolException("条码库存已存在:" + barcode);
                // 检查库位上是否有该条码
                if (locCache != null && !Cools.isEmpty(locCache.getBarcode()) && locCache.getBarcode().equals(barcode)) {
                    log.warn("空托盘入库时,库位上已有该条码,不允许呼叫AGV:库位={},条码={}", sourceSite, barcode);
                    throw new CoolException("条码在库,请更换条码" + barcode);
                }
                
                // 通过所有检查,确认为空托盘,设置为空托入库
                ioType = 10;
@@ -217,10 +228,42 @@
            default:
                throw new CoolException("入库类型错误,type:" + type);
        }
        // 条码存在agv任务
        int count = taskService.selectCount(new EntityWrapper<Task>().eq("barcode", barcode).eq("is_deleted", 0));
        if (count > 0) {
            throw new CoolException(barcode+ ":条码存在agv搬运任务!");
        // 统一校验:在所有AGV呼叫场景中都需要检查以下条件,有任何一个满足则不允许呼叫AGV
        // 1. 校验库位上的条码是否在库:检查LocCache表上是否有该条码,且该条码在LocDetl库存中
        // 注意:空托盘入库(type=3)不校验库存明细,只在校验库位上是否有条码(已在case 3中处理)
        if (type != 3 && locCache != null && !Cools.isEmpty(locCache.getBarcode())) {
            String locCacheBarcode = locCache.getBarcode();
            if (locCacheBarcode.equals(barcode)) {
                // 库位上的条码与当前要呼叫的条码相同,检查是否在库存中
                int locDetlCount = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet", barcode));
                if (locDetlCount > 0) {
                    log.warn("AGV呼叫时,库位上的条码在库中,不允许呼叫AGV:库位={},条码={}", sourceSite, barcode);
                    throw new CoolException("条码在库,请更换条码" + barcode);
                }
            }
        }
        // 2. 校验工作档中运行中的托盘码:检查是否有未完成的工作档(wrk_sts不等于4、14和15)
        // 4=入库完成,14=已出库未确认,15=出库更新完成
        int runningWrkMastCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>()
                .eq("barcode", barcode)
                .notIn("wrk_sts", Arrays.asList(4L, 14L, 15L))); // 不等于入库完成(4)和出库完成(14,15)
        if (runningWrkMastCount > 0) {
            log.warn("AGV呼叫时,托盘码在工作档中运行中,不允许呼叫AGV:{}", barcode);
            throw new CoolException("条码在工作档,请更换条码:" + barcode);
        }
        // 3. 校验AGV任务列表中未完成的托盘码:检查是否有未完成的AGV任务(is_deleted=0且wrk_sts不等于4、14和15)
        // 4=入库完成,14=已出库未确认,15=出库更新完成
        int unfinishedTaskCount = taskService.selectCount(new EntityWrapper<Task>()
                .eq("barcode", barcode)
                .eq("is_deleted", 0)
                .notIn("wrk_sts", Arrays.asList(4L, 14L, 15L))); // 不等于入库完成(4)和出库完成(14,15)
        if (unfinishedTaskCount > 0) {
            log.warn("AGV呼叫时,托盘码在AGV任务列表中未完成,不允许呼叫AGV:{}", barcode);
            throw new CoolException("条码在AGV任务档,请更换条码:" + barcode);
        }
        // 根据whs_type确定机器人组(站点分配完全由定时任务处理)