自动化立体仓库 - WCS系统
#
luxiaotao1123
2022-03-10 46e4b708b56c0c109d2d968fd2e403a148d0aeb4
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -560,7 +560,6 @@
                continue;
            }
            // todo:小车迁入出
            // 目标库位 ===>> 最外层库位
            if (locMastService.isOutMost(wrkMast.getLocNo())) {
                // 判断小车是否在最外层库位,如果是则搬走,如果不是,则直接堆垛机入库
@@ -611,11 +610,11 @@
                // 有小车
                if (steNo != null) {
                    // 小车行走到堆垛机待搬移点
                    if (wrkMast.getWrkSts() == 2L) {
                    if (wrkMast.getWrkSts() == 2L && wrkMast.getStaNo() == null) {
                        this.letCarBeReady(wrkMast, steNo);
                    }
                    // 堆垛机将货放至小车上 3.小车待搬 ===>> 7.吊车入库中
                    if (wrkMast.getWrkSts() == 3L) {
                    // 堆垛机将货放至小车上 3.小车待搬(小车不用搬运,已经在当前组库位) / 6.小车待入  ===>> 7.吊车入库中
                    if (wrkMast.getWrkSts() == 3L || wrkMast.getWrkSts() == 6L) {
                        // 小车处于空闲
                        SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo);
                        SteProtocol steProtocol = steThread.getSteProtocol();
@@ -642,7 +641,7 @@
                                wrkMast.setCrnStrTime(now);
                                wrkMast.setModiTime(now);
                                if (wrkMastMapper.updateById(wrkMast) == 0) {
                                    log.error("修改工作档状态 3.小车待搬 => 7.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo());
                                    log.error("修改工作档状态 3.小车待搬/6.小车待入 => 7.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo());
                                }
                                return true;
                            }
@@ -650,9 +649,47 @@
                    }
                // 没有小车
                } else {
                    if (wrkMast.getWrkSts() == 2L && wrkMast.getStaNo() == null) {
                        // 寻找最近的小车
                        SteThread steThread = queryIdleCar(wrkMast);
                        if (steThread != null) {
                            // 让小车等待搬运待续
                            this.letCarBeReady(wrkMast, steThread.getSlave().getId());
                        }
                    }
                    // 堆垛机搬运小车
                    if (wrkMast.getWrkSts() == 3L) {
                        this.carMoveIn(wrkMast, wrkMast.getSteNo(), crnProtocol);
                    }
                    // 堆垛机搬运货物
                    if (wrkMast.getWrkSts() == 6L) {
                        // 堆垛机入库 命令下发区 --------------------------------------------------------------------------
                        CrnCommand crnCommand = new CrnCommand();
                        crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                        crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
                        crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                        crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                        crnCommand.setSourcePosX(crnStn.getRow().shortValue());     // 源库位排
                        crnCommand.setSourcePosY(crnStn.getBay().shortValue());     // 源库位列
                        crnCommand.setSourcePosZ(crnStn.getLev().shortValue());     // 源库位层
                        crnCommand.setDestinationPosX(Utils.getGroupRow(locMast.getLocNo()).shortValue());     // 目标库位排
                        crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列
                        crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层
                        if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                            log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
                        } else {
                            // 修改工作档状态  6.小车待入 ===>> 7.吊车入库中
                            Date now = new Date();
                            wrkMast.setWrkSts(7L);
                            wrkMast.setCrnStrTime(now);
                            wrkMast.setModiTime(now);
                            if (wrkMastMapper.updateById(wrkMast) == 0) {
                                log.error("修改工作档状态 6.小车待入 => 7.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo());
                            }
                            return true;
                        }
                    }
                }
            }
@@ -703,14 +740,11 @@
            if (!MessageQueue.offer(SlaveType.Ste, steNo, new Task(2, steCommand))) {
                log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", steNo, JSON.toJSON(steCommand));
            } else {
                // 修改工作档状态 2.设备上走 => 3.小车待搬
                Date now = new Date();
                wrkMast.setWrkSts(3L);
                // 修改工作档状态 绑定穿梭车
                wrkMast.setSteNo(steNo);
                wrkMast.setCrnStrTime(now);
                wrkMast.setModiTime(now);
                wrkMast.setModiTime(new Date());
                if (wrkMastMapper.updateById(wrkMast) == 0) {
                    log.error("修改工作档状态 2.设备上走 => 3.小车待搬 失败!!,工作号={}", wrkMast.getWrkNo());
                    log.error("修改工作档状态 绑定穿梭车 失败!!,工作号={}", wrkMast.getWrkNo());
                }
            }
        }
@@ -719,44 +753,46 @@
    /**
     * 入库  ===>>  堆垛机搬入小车
     */
    public void carMoveIn(WrkMast wrkMast, Integer steNo) {
    public void carMoveIn(WrkMast wrkMast, Integer steNo, CrnProtocol crnProtocol) {
        // 获取堆垛机信息
        SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo);
        SteProtocol steProtocol = steThread.getSteProtocol();
        if (steProtocol == null) { return; }
        if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) {
            // 堆垛机空闲
            if (crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() == 0) {
                LocMast locMast;
                if (wrkMast.getWrkSts() <= 10) {
                    locMast = locMastService.selectById(wrkMast.getLocNo());
                    // 堆垛机命令下发区 --------------------------------------------------------------------------
                    CrnCommand crnCommand = new CrnCommand();
                    crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号
                    crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
                    crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                    crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                    crnCommand.setSourcePosX(steProtocol.getRow());     // 源库位排
                    crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列
                    crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层
                    crnCommand.setDestinationPosX(Utils.getGroupRow(locMast.getLocNo()).shortValue());     // 目标库位排
                    crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列
                    crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层
                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                        log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
                    } else {
                        // 修改工作档状态 3.小车待搬 => 4.迁入小车
                        Date now = new Date();
                        wrkMast.setWrkSts(4L);
                        wrkMast.setCrnStrTime(now);
                        wrkMast.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast) == 0) {
                            log.error("修改工作档状态 3.小车待搬 => 4.迁入小车 失败!!,工作号={}", wrkMast.getWrkNo());
                        }
                    }
            String locNo = Utils.append(steProtocol.getRow(), steProtocol.getBay(), steProtocol.getLev());
            LocMast locMast = locMastService.selectById(locNo);
            // 堆垛机命令下发区 --------------------------------------------------------------------------
            CrnCommand crnCommand = new CrnCommand();
            crnCommand.setCrnNo(locMast.getCrnNo()); // 堆垛机编号
            crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
            crnCommand.setAckFinish((short) 0);  // 任务完成确认位
            crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
            crnCommand.setSourcePosX(steProtocol.getRow());     // 源库位排
            crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列
            crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层
            crnCommand.setDestinationPosX(locMast.getRow1().shortValue());     // 目标库位排
            crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列
            crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层
            if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
            } else {
                // 修改工作档状态 2.设备上走 => 4.迁入小车
                Date now = new Date();
                wrkMast.setWrkSts(4L);
                wrkMast.setCrnStrTime(now);
                wrkMast.setModiTime(now);
                if (wrkMastMapper.updateById(wrkMast) == 0) {
                    log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo());
                }
            }
        }
    }
    /**
@@ -977,22 +1013,6 @@
    }
    /**
     * 穿梭车入库
     */
    public void carGenerateStore() {
        for (SteSlave ste : slaveProperties.getSte()) {
            // 获取堆垛机信息
            SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, ste.getId());
            SteProtocol steProtocol = steThread.getSteProtocol();
            if (steProtocol == null) { continue; }
            if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) {
                wrkMastMapper.selectPakInStep8()
            }
        }
    }
    /**
     * 堆垛机针对于小车迁移工作的完成
@@ -1035,6 +1055,7 @@
     * 执行对工作档的完成操作
     */
    @Async
    @Transactional
    public void storeFinished() {
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
@@ -1051,30 +1072,146 @@
                }
                // 入库 + 库位转移
                if (wrkMast.getWrkSts() == 7 || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11)){
                    // 判断是否需要小车入库
                    if (locMastService.isOutMost(wrkMast.getLocNo())) {
                        // ==> 9.入库完成
                        wrkMast.setWrkSts(9L);
                        Date now = new Date();
                        wrkMast.setCrnEndTime(now);
                        wrkMast.setModiTime(now);
                        // 修改成功后复位堆垛机
                        if (wrkMastMapper.updateById(wrkMast) > 0) {
                            // 堆垛机复位
                            crnThread.setResetFlag(true);
                        } else {
                            log.error("修改工作档状态 7.吊车入库中 => 9.入库完成 失败!!,工作号={}", wrkMast.getWrkNo());
                        }
                    } else {
                        // ==> 8.小车搬入库
                        wrkMast.setWrkSts(8L);
                        // 给穿梭车下发命令
                        Integer steNo = wrkMast.getSteNo();
                        SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo);
                        SteProtocol steProtocol = steThread.getSteProtocol();
                        if (steProtocol == null) { continue; }
                        if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) {
                            // 命令下发区 --------------------------------------------------------------------------
                            SteCommand steCommand = new SteCommand();
                            steCommand.setSteNo(steNo); // 穿梭车编号
                            steCommand.setTaskNo(wrkMast.getWrkNo()); // 工作号
                            steCommand.setTaskMode(SteTaskModeType.TO_B); // 任务模式:  去近点 等待堆垛机叉取
                            // todo:luxiaotao
                            if (!MessageQueue.offer(SlaveType.Ste, steNo, new Task(2, steCommand))) {
                                log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", steNo, JSON.toJSON(steCommand));
                            } else {
                                // 修改工作档状态 7.吊车入库中 => 8.小车搬入库
                                Date now = new Date();
                                wrkMast.setWrkSts(8L);
                                wrkMast.setCrnStrTime(now);
                                wrkMast.setModiTime(now);
                                if (wrkMastMapper.updateById(wrkMast) > 0) {
                                    // 堆垛机复位
                                    crnThread.setResetFlag(true);
                                } else {
                                    log.error("修改工作档状态 7.吊车入库中 => 8.小车搬入库 失败!!,工作号={}", wrkMast.getWrkNo());
                                }
                            }
                        }
                    }
                } else {
                    continue;
                // 迁入小车 完成
                } else if (wrkMast.getWrkSts() == 4) {
                    // 4.迁入小车 ==> 6.小车待入
                    wrkMast.setWrkSts(6L);
                    Date now = new Date();
                    wrkMast.setCrnEndTime(now);
                    wrkMast.setModiTime(now);
                    // 修改成功后复位堆垛机
                    if (wrkMastMapper.updateById(wrkMast) > 0) {
                        // 堆垛机复位
                        crnThread.setResetFlag(true);
                    } else {
                        log.error("修改工作档状态 4.迁入小车 => 6.小车待入 失败!!,工作号={}", wrkMast.getWrkNo());
                    }
                // 迁出小车 完成
                } else if (wrkMast.getWrkSts() == 5) {
                    // 5.迁出小车 ==> 6.小车待入
                    wrkMast.setWrkSts(6L);
                    Date now = new Date();
                    wrkMast.setCrnEndTime(now);
                    wrkMast.setModiTime(now);
                    // 修改成功后复位堆垛机
                    if (wrkMastMapper.updateById(wrkMast) > 0) {
                        // 堆垛机复位
                        crnThread.setResetFlag(true);
                    } else {
                        log.error("修改工作档状态 5.迁出小车 => 6.小车待入 失败!!,工作号={}", wrkMast.getWrkNo());
                    }
                }
                Date now = new Date();
                wrkMast.setCrnEndTime(now);
                wrkMast.setModiTime(now);
                // 修改成功后复位堆垛机
                if (wrkMastMapper.updateById(wrkMast) > 0) {
                    // 堆垛机复位
                    crnThread.setResetFlag(true);
            }
        }
    }
    /**
     * 执行对工作档的完成操作
     */
    public void carGenerateStore() {
        Date now = new Date();
        for (SteSlave ste : slaveProperties.getSte()) {
            // 获取穿梭车信息
            SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, ste.getId());
            SteProtocol steProtocol = steThread.getSteProtocol();
            if (steProtocol == null) { continue; }
            if (steProtocol.getStatusType().equals(SteStatusType.WAITING) && steProtocol.getTaskNo() != 0) {
                // 查询是否有待入库的任务
                WrkMast wrkMast = wrkMastMapper.selectPakInStep8(steProtocol.getSteNo().intValue());
                if (wrkMast == null) { continue; }
                switch (wrkMast.getWrkSts().intValue()) {
                    case 2:
                        // 修改工作档状态 2.设备上走 => 3.小车待搬
                        wrkMast.setWrkSts(3L);
                        wrkMast.setCrnStrTime(now);
                        wrkMast.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast) == 0) {
                            log.error("修改工作档状态 2.设备上走 => 3.小车待搬 失败!!,工作号={}", wrkMast.getWrkNo());
                        } else {
                            steThread.setResetFlag(true);
                        }
                        break;
                    case 8:
                        // 修改工作档状态 8.小车搬入库 => 9.入库完成
                        wrkMast.setWrkSts(9L);
                        wrkMast.setCrnStrTime(now);
                        wrkMast.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast) == 0) {
                            log.error("修改工作档状态 8.小车搬入库 => 9.入库完成 失败!!,工作号={}", wrkMast.getWrkNo());
                        } else {
                            steThread.setResetFlag(true);
                        }
                        break;
                }
            }
        }
    }
    /**
     * 查找当前库位最适合的穿梭车来作业
     */
    public SteThread queryIdleCar(WrkMast wrkMast) {
        Integer crnNo = wrkMast.getCrnNo();
        BasSte basSte = basSteService.findByCrnNo(crnNo);
        // 获取穿梭车信息
        SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, basSte.getSteNo());
        SteProtocol steProtocol = steThread.getSteProtocol();
        if (steProtocol != null) {
            if (steProtocol.getStatusType().equals(SteStatusType.IDLE)) {
                return steThread;
            }
        }
        return null;
    }
    /**
     * 堆垛机异常信息记录
     */
    @Async