#
tqs
2022-10-31 c5fb7fe6010aa53345e44ad2d69552bf52d868fd
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -3,7 +3,6 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
@@ -188,6 +187,8 @@
                            staProtocol.setWorkNo(dto.getWorkNo().shortValue());
                            staProtocol.setStaNo(dto.getStaNo().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            ledThread.errorReset();
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            if (!result) {
@@ -490,6 +491,8 @@
                            // 条码设备处理
                            barcodeThread.setBarcode("");
                            ledThread.errorReset();
                            // 更新站点信息 且 下发plc命令
                            staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());
                            staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
@@ -695,18 +698,22 @@
                continue;
            }
            // 过滤
            WrkMast pakoutWrkMast = wrkMastMapper.selectPakout(slave.getId(), null);
            if (null != pakoutWrkMast) {
                if ((pakoutWrkMast.getIoType() == 103 || pakoutWrkMast.getIoType() == 104 || pakoutWrkMast.getIoType() == 107)
                        && pakoutWrkMast.getWrkSts() == 17
                        && basDevpService.selectByWrkNo(pakoutWrkMast.getWrkNo()) != null
                ) {
                } else {
                    log.error("{}入库任务无法作业,因存在出库中任务!", wrkMast.getWrkNo());
                    continue;
                }
            // 检测是否存在出库任务
//            WrkMast pakoutWrkMast = wrkMastMapper.selectPakout(slave.getId(), null);
//            if (null != pakoutWrkMast) {
//                if ((pakoutWrkMast.getIoType() == 103 || pakoutWrkMast.getIoType() == 104 || pakoutWrkMast.getIoType() == 107)
//                        && pakoutWrkMast.getWrkSts() == 17
//                        && basDevpService.selectByWrkNo(pakoutWrkMast.getWrkNo()) != null
//                ) {
//
//                } else {
//                    log.error("{}入库任务无法作业,因存在出库中任务!", wrkMast.getWrkNo());
//                    continue;
//                }
//            }
            if (null != wrkMastMapper.selectPakout(slave.getId(), null)) {
                log.error("{}入库任务无法作业,因存在出库中任务!", wrkMast.getWrkNo());
                continue;
            }
            // 置顶任务
@@ -1014,6 +1021,22 @@
                            SteThread steThread = queryIdleCar(wrkMast);
                            if (steThread != null) {
                                // 没有其他任务
//                                boolean hasPakout = true;
//                                WrkMast pakoutWrkMast = wrkMastMapper.selectPakout(slave.getId(), steNo);
//                                if (null != pakoutWrkMast) {
//                                    if ((pakoutWrkMast.getIoType() == 103 || pakoutWrkMast.getIoType() == 104 || pakoutWrkMast.getIoType() == 107)
//                                            && pakoutWrkMast.getWrkSts() == 17
//                                            && basDevpService.selectByWrkNo(pakoutWrkMast.getWrkNo()) != null
//                                    ) {
//                                        hasPakout = false;
//                                    }
//                                } else {
//                                    hasPakout = false;
//                                }
//                                if (!hasPakout) {
//                                    // 让小车等待搬运待续
//                                    this.letCarBeReady(wrkMast, steThread.getSlave().getId(), wrkMast.getSourceLocNo());
//                                }
                                if (null == wrkMastMapper.selectPakout(slave.getId(), steNo)) {
                                    // 让小车等待搬运待续
                                    this.letCarBeReady(wrkMast, steThread.getSlave().getId(), wrkMast.getSourceLocNo());
@@ -1030,6 +1053,172 @@
            }
        }
        return false;
    }
    /**
     * 库位移转 NEW
     */
    public void locToLoc1(CrnSlave slave, CrnProtocol crnProtocol){
        // 获取工作档信息
        WrkMast wrkMast = wrkMastMapper.selectLocMove(slave.getId());
        if (null == wrkMast) {
            return;
        }
        // 获取源库位信息
        LocMast sourceLoc = locMastService.selectById(wrkMast.getSourceLocNo());
        if (null == sourceLoc) {
            log.error("工作档库位移转失败,原因:检索源库位失败!工作号={},源库位={}", wrkMast.getWrkNo(), wrkMast.getSourceLocNo());
            return;
        }
        // 源库位  库位状态判断
        if (!sourceLoc.getLocSts().equals("R")) {
            return;
        }
        // 获取目标库位信息
        LocMast loc = locMastService.selectById(wrkMast.getLocNo());
        if (null == loc || !loc.getLocSts().equals("S")) {
            log.error("工作档库位移转失败,原因:检索目标库位失败!工作号={},源库位={}", wrkMast.getWrkNo(), wrkMast.getLocNo());
            return;
        }
        // 获取堆垛机信息 并 判断是否可入出
        BasCrnp basCrnp = basCrnpService.selectById(slave.getId());
        if (!basCrnp.getInEnable().equals("Y") && !basCrnp.getOutEnable().equals("Y")) {
            return;
        }
        // 堆垛机控制过滤
        if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
            return;
        }
        // 已经存在吊车执行任务时,则过滤
        if (wrkMastMapper.selectWorking(slave.getId()) != null) {
            return;
        }
        // 置顶任务
        wrkMast.setIoPri((double) 9999);
        wrkMastMapper.updateById(wrkMast);
        // 源库位 ===>> 最外层库位
        if (locMastService.isOutMost(wrkMast.getSourceLocNo())) {
            // 目标库位 ===>> 最外层库位
            if (locMastService.isOutMost(wrkMast.getLocNo())) {
                // 命令下发区 --------------------------------------------------------------------------
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
                crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                crnCommand.setSourcePosX(sourceLoc.getRow1().shortValue());     // 源库位排
                crnCommand.setSourcePosY(sourceLoc.getBay1().shortValue());     // 源库位列
                crnCommand.setSourcePosZ(sourceLoc.getLev1().shortValue());     // 源库位层
                crnCommand.setDestinationPosX(loc.getRow1().shortValue());     // 目标库位排
                crnCommand.setDestinationPosY(loc.getBay1().shortValue());     // 目标库位列
                crnCommand.setDestinationPosZ(loc.getLev1().shortValue());     // 目标库位层
                if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                    log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
                } else {
                    // 修改工作档状态 11.生成出库ID => 16.吊车出库中
                    Date now = new Date();
                    wrkMast.setWrkSts(16L);
                    wrkMast.setCrnStrTime(now);
                    wrkMast.setModiTime(now);
                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                        log.error("【库位移转】 修改工作档状态 11.生成出库ID => 16.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo());
                    }
                }
            }
            // 不是最外层库位,需要使用穿梭车搬运后,再堆垛机移库
        } else {
            // 当前组库位是否有穿梭车
            Integer steNo = this.hasCarOfIdle(wrkMast.getSourceLocNo());
            // 有小车
            if (steNo != null) {
                if (wrkMast.getWrkSts() == 11L && wrkMast.getSteNo() == null) {
                    // 给穿梭车下发命令 让其将货物挪至堆垛机搬运点
                    SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, steNo);
                    SteProtocol steProtocol = steThread.getSteProtocol();
                    if (steProtocol == null) { return; }
                    if (steProtocol.isIdle()) {
                        // 命令下发区 --------------------------------------------------------------------------
                        SteCommand steCommand = new SteCommand();
                        steCommand.setSteNo(steNo); // 穿梭车编号
                        steCommand.setTaskNo(wrkMast.getWrkNo()); // 工作号
                        steCommand.setTaskMode(SteTaskModeType.findOutByLoc(wrkMast.getSourceLocNo())); // 任务模式:  去近点 等待堆垛机叉取
                        steCommand.setRow(Utils.getGroupRow(steProtocol.getRow().intValue()).shortValue());
                        steCommand.setBay(steProtocol.getBay());
                        steCommand.setLev(steProtocol.getLev());
                        if (!MessageQueue.offer(SlaveType.Ste, steNo, new Task(2, steCommand))) {
                            log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", steNo, JSON.toJSON(steCommand));
                        } else {
                            // 修改工作档状态 11.生成出库ID => 14.小车搬出库
                            Date now = new Date();
                            wrkMast.setWrkSts(14L);
                            wrkMast.setSteNo(steNo);
                            wrkMast.setCrnStrTime(now);
                            wrkMast.setModiTime(now);
                            if (wrkMastMapper.updateById(wrkMast) == 0) {
                                log.error("修改工作档状态 11.生成出库ID => 14.小车搬出库 失败!!,工作号={}", wrkMast.getWrkNo());
                            }
                        }
                    }
                }
                if (wrkMast.getWrkSts() == 15L) {
                    // 已经存在吊车执行任务时,则过滤
                    if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                        return;
                    }
                    // 堆垛机出库 命令下发区 --------------------------------------------------------------------------
                    CrnCommand crnCommand = new CrnCommand();
                    crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                    crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
                    crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                    crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                    crnCommand.setSourcePosX(Utils.getGroupRow(sourceLoc.getRow1()).shortValue());     // 源库位排
                    crnCommand.setSourcePosY(sourceLoc.getBay1().shortValue());     // 源库位列
                    crnCommand.setSourcePosZ(sourceLoc.getLev1().shortValue());     // 源库位层
                    crnCommand.setDestinationPosX(loc.getRow1().shortValue());     // 目标库位排
                    crnCommand.setDestinationPosY(loc.getBay1().shortValue());     // 目标库位列
                    crnCommand.setDestinationPosZ(loc.getLev1().shortValue());     // 目标库位层
                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                        log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
                    } else {
                        // 修改工作档状态 15.等待吊车 => 16.吊车出库中
                        Date now = new Date();
                        wrkMast.setWrkSts(16L);
                        wrkMast.setCrnStrTime(now);
                        wrkMast.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast) == 0) {
                            log.error("修改工作档状态 15.等待吊车 => 16.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo());
                        }
                        return;
                    }
                }
                // 没有小车
            } else {
                if (wrkMast.getWrkSts() == 11L && wrkMast.getSteNo() == null) {
                    // 寻找最近的小车
                    SteThread steThread = queryIdleCar(wrkMast);
                    if (steThread != null) {
                        if (null == wrkMastMapper.selectPakout(slave.getId(), steNo)) {
                            // 让小车等待搬运待续
                            this.letCarBeReady(wrkMast, steThread.getSlave().getId(), wrkMast.getSourceLocNo());
                        }
                    }
                }
                // 堆垛机搬运小车
                if (wrkMast.getWrkSts() == 12L) {
                    this.carMoveIn(wrkMast, wrkMast.getSteNo(), crnProtocol);
                }
            }
        }
    }
    /**
@@ -1104,9 +1293,10 @@
                    wrkMast.setCrnStrTime(now);
                    wrkMast.setModiTime(now);
                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                        log.error("【库位移转】 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo());
                        log.error("【库位移转】 修改工作档状态 11.生成出库ID => 7.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo());
                    }
                }
            } else {
                Integer steNo = this.hasCarOfIdle(wrkMast.getLocNo());
                // 有小车
@@ -1840,13 +2030,16 @@
                } else {
                    if (wrkMast.getWrkSts() == 16) {
                        Date now = new Date();
//                        if (locMastService.isOutMost(wrkMast.getLocNo())) {
//                            // 16.吊车出库中 ==> 9.入库完成
//                            wrkMast.setWrkSts(9L);
//                            wrkMast.setCrnEndTime(now);
//                        } else {
//                            // 16.吊车出库中 ==> 9.入库完成
//                            wrkMast.setWrkSts(9L);
//                        }
                        if (locMastService.isOutMost(wrkMast.getLocNo())) {
                            // 16.吊车出库中 ==> 9.入库完成
                            wrkMast.setWrkSts(9L);
                            wrkMast.setCrnEndTime(now);
                        } else {
                            // 16.吊车出库中 ==> 9.入库完成
                            wrkMast.setWrkSts(9L);
                            wrkMast.setWrkSts(17L);
                        }
                        wrkMast.setModiTime(now);
                        // 修改成功后复位堆垛机
@@ -1979,6 +2172,7 @@
            SteProtocol steProtocol = steThread.getSteProtocol();
            if (steProtocol == null) { continue; }
            if (steProtocol.getWaiting() && steProtocol.getTaskNo() != 0) {
                log.info("ste[id={}] 执行工作档完成,任务号={}", steProtocol.getSteNo(), steProtocol.getTaskNo());
                if (steProtocol.getTaskNo() == 9999) {
                    steThread.setResetFlag(true);
                } else {
@@ -2397,6 +2591,8 @@
                        if (code.equals(200)) {
                            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
                            ledThread.errorReset();
                            // 更新站点信息 且 下发plc命令
                            staProtocol.setWorkNo(dto.getWorkNo().shortValue());
                            staProtocol.setStaNo(dto.getStaNo().shortValue());