#
1
7 天以前 8980782bebfd40b2a56169e4fb53686882e87a97
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -114,6 +114,8 @@
    @Autowired
    private BasDevpOptService basDevpOptService;
    @Autowired
    private BasRgvOptService basRgvOptService;
    @Autowired
    private MatService matService;
    @Value("${wms.url}")
@@ -1038,7 +1040,11 @@
                        if (jsonObject.getInteger("code").equals(200)) {
                            staProtocolOut.setWorkNo(9997);
                            devpThread.setPakMk(staProtocolOut.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocolOut));
                            Integer devpId = 1;
                            if(staProtocolOut.getSiteId() > 2000){
                                devpId = 2;
                            }
                            boolean result = MessageQueue.offer(SlaveType.Devp, devpId, new Task(2, staProtocolOut));
                            if (!result) {
                                throw new CoolException("更新plc站点信息失败");
@@ -1082,7 +1088,11 @@
                    if (jsonObject.getInteger("code").equals(200)) {
                        staProtocolIn.setWorkNo(9996);
                        devpThread.setPakMk(staProtocolIn.getSiteId(), false);
                        boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocolIn));
                        Integer devpId = 1;
                        if(staProtocolIn.getSiteId() > 2000){
                            devpId = 2;
                        }
                        boolean result = MessageQueue.offer(SlaveType.Devp, devpId, new Task(2, staProtocolIn));
                        if (!result) {
                            throw new CoolException("更新plc站点信息失败");
@@ -1149,11 +1159,28 @@
                    }
                }
            }
            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
                    && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0 && crnProtocol.getCrnNo() == 3) {
                News.warnNoLog(""+mark+" - 0"+" - 开始执行堆垛机入出库作业下发");
                if (crnProtocol.getLastIo().equals("O")) {
                    if (basCrnp.getInEnable().equals("Y")) {
                        this.locToCrnStn9996(crn, crnProtocol,mark); //  入库
                    }
                }
                // 如果最近一次是出库模式
                else if (crnProtocol.getLastIo().equals("I")) {
                    if (basCrnp.getOutEnable().equals("Y")) {
                        this.locToCrnStn9997(crn, crnProtocol,mark); //  出库
                    }
                }
            }
            // 库位移转
            //mark - 3 - ....
            this.locToLoc(crn, crnProtocol,mark);
            //预调度
            this.crnRebackHp(crn, crnProtocol, crnThread);
//            this.crnRebackHp(crn, crnProtocol, crnThread);
        }
//        News.infoNoLog(""+mark+" - 0"+" - 堆垛机入出库作业下发执行完成");
@@ -1171,11 +1198,12 @@
                    new EntityWrapper<BasCrnp>().eq("crn_no", crnProtocol.getCrnNo())
            );
            boolean result = true;
            if(crnProtocol.getCrnNo() != 5){
                return;
            }
            for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) {
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                if(crnStn.getStaNo() == 4001){
                    continue;
                }
                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo2());
                if (staProtocol == null) {
                    News.infoNoLog(" - 堆垛机入库站信息(staProtocol!=null继续执行):staProtocol="+staProtocol);
@@ -1190,8 +1218,8 @@
            int x=1;
            switch (crnProtocol.getCrnNo()){
                case 1: x =2; break;
                case 2: x =6; break;
                case 3: x =11; break;
                case 2: x =7; break;
                case 3: x =10; break;
                case 4: x =14; break;
                case 5: x =18; break;
            }
@@ -1203,10 +1231,6 @@
                    return;
                }
            }
            if(crnProtocol.getCrnNo() != 5){
                return;
            }
            // 已经存在吊车执行任务时,则过滤3,12
            if (wrkMastMapper.selectWorking(crnProtocol.getCrnNo()) != null) {
                return;
@@ -1464,214 +1488,15 @@
            // 获取工作状态为11(生成出库ID)的出库工作档
//            WrkMast wrkMast = wrkMastMapper.selectPakOutStep1(slave.getId(), crnStn.getStaNo());
            List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep11(slave.getId(), crnStn.getStaNo());
            WrkMast wrkMast9997 = wrkMastMapper.selectByWrkNo9997(9997);
            WrkMast wrkMast9996 = wrkMastMapper.selectByWrkNo9997(9996);
            if (slave.getId() == 3 && wrkMast9997 != null) {
                SiemensDevpThread devpThread1 = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                StaProtocol staProtocol2 = devpThread1.getStation().get(1015);
                if (staProtocol2 == null) {
                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol2);
                    break;
                } else {
                    staProtocol2 = staProtocol2.clone();
                }
                SiemensDevpThread devpThread2 = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 2);
                StaProtocol staProtocol4004 = devpThread2.getStation().get(4004);
                if (staProtocol4004 == null) {
                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol4004);
                    break;
                } else {
                    staProtocol4004 = staProtocol4004.clone();
                }
                StaProtocol staProtocol3 = devpThread2.getStation().get(2016);
                if (staProtocol3 == null) {
                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol2);
                    break;
                } else {
                    staProtocol3 = staProtocol3.clone();
                }
                BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
                if (staDetl == null) {
                    News.error(""+mark+" - 2"+" - 5"+" - 出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                    break;
//                    continue;
                }
                if(staProtocol2.isLoading() && staProtocol2.isAutoing() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")){
                    // 堆垛机控制过滤
                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
//                        continue;
                        break;
                    }
                    // 已经存在吊车执行任务时,则过滤
                    if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                        break;
//                        return;
                    }
                    if(staProtocol4004.isLoading()){
                        continue;
                    }
                    // 1.堆垛机开始移动
                    CrnCommand crnCommand = new CrnCommand();
                    crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                    crnCommand.setTaskNo((short) 9997); // 工作号
//                    crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                    crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                    crnCommand.setSourcePosX((short) 9);     // 源库位排
                    crnCommand.setSourcePosY((short) 52);     // 源库位列
                    crnCommand.setSourcePosZ((short) 1);     // 源库位层
                    crnCommand.setDestinationPosX((short) 11);     // 目标库位排
                    crnCommand.setDestinationPosY((short) 52);     // 目标库位列
                    crnCommand.setDestinationPosZ((short) 3);     // 目标库位层
//                crnCommand.setTraySize(sourceSta.getLocType1() == 2);     //库位类型
                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast9997.getCrnNo(), new Task(2, crnCommand))) {
                        News.error("" + mark + " - 2" + " - 13" + " - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast9997.getCrnNo(), JSON.toJSON(crnCommand));
                    } else {
                        // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                        Date now = new Date();
                        wrkMast9997.setWrkSts(12L);
                        wrkMast9997.setCrnStrTime(now);
                        wrkMast9997.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast9997) == 0) {
                            News.error("" + mark + " - 2" + " - 14" + " - 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast9997.getWrkNo());
                        }
                        break;
                    }
                }
                if(staProtocol3.isLoading() && staProtocol3.isAutoing()){
                    // 堆垛机控制过滤
                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
//                        continue;
                        break;
                    }
                    // 已经存在吊车执行任务时,则过滤
                    if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                        break;
//                        return;
                    }
                    if(staProtocol4004.isLoading()){
                        continue;
                    }
                    // 1.堆垛机开始移动
                    CrnCommand crnCommand = new CrnCommand();
                    crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                    crnCommand.setTaskNo((short) 9997); // 工作号
//                    crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                    crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                    crnCommand.setSourcePosX((short) 11);     // 源库位排
                    crnCommand.setSourcePosY((short) 52);     // 源库位列
                    crnCommand.setSourcePosZ((short) 2);     // 源库位层
                    crnCommand.setDestinationPosX((short) 11);     // 目标库位排
                    crnCommand.setDestinationPosY((short) 52);     // 目标库位列
                    crnCommand.setDestinationPosZ((short) 3);     // 目标库位层
//                crnCommand.setTraySize(sourceSta.getLocType1() == 2);     //库位类型
                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast9997.getCrnNo(), new Task(2, crnCommand))) {
                        News.error("" + mark + " - 2" + " - 13" + " - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast9997.getCrnNo(), JSON.toJSON(crnCommand));
                    } else {
                        // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                        Date now = new Date();
                        wrkMast9997.setWrkSts(12L);
                        wrkMast9997.setCrnStrTime(now);
                        wrkMast9997.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast9997) == 0) {
                            News.error("" + mark + " - 2" + " - 14" + " - 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast9997.getWrkNo());
                        }
                        break;
                    }
                }
            }
            if (slave.getId() == 3 && wrkMast9996 != null) {
                SiemensDevpThread devpThread1 = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                SiemensDevpThread devpThread2 = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 2);
                StaProtocol staProtocol4001 = devpThread2.getStation().get(4001);
                if (staProtocol4001 == null) {
                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol4001);
                    break;
                } else {
                    staProtocol4001 = staProtocol4001.clone();
                }
                StaProtocol staProtocol2013 = devpThread2.getStation().get(2013);
                if (staProtocol2013 == null) {
                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol2013);
                    break;
                } else {
                    staProtocol2013 = staProtocol2013.clone();
                }
                StaProtocol staProtocol1019 = devpThread1.getStation().get(1019);
                if (staProtocol1019 == null) {
                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol1019);
                    break;
                } else {
                    staProtocol1019 = staProtocol1019.clone();
                }
                BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
                if (staDetl == null) {
                    News.error(""+mark+" - 2"+" - 5"+" - 出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                    break;
//                    continue;
                }
                if(staProtocol4001.isLoading() && staProtocol4001.isAutoing() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")){
                    // 堆垛机控制过滤
                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
//                        continue;
                        break;
                    }
                    // 已经存在吊车执行任务时,则过滤
                    if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                        break;
//                        return;
                    }
                    if(staProtocol1019.isLoading() && wrkMast9996.getStaNo() < 2000){
                        continue;
                    }
                    if(staProtocol2013.isLoading() && wrkMast9996.getStaNo() > 2000){
                        continue;
                    }
                    // 1.堆垛机开始移动
                    CrnCommand crnCommand = new CrnCommand();
                    crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                    crnCommand.setTaskNo((short) 9996); // 工作号
//                    crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                    crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                    crnCommand.setSourcePosX((short) 9);     // 源库位排
                    crnCommand.setSourcePosY((short) 52);     // 源库位列
                    crnCommand.setSourcePosZ((short) 3);     // 源库位层
                    if(wrkMast9996.getStaNo()>2000){
                        crnCommand.setDestinationPosX((short) 9);     // 目标库位排
                        crnCommand.setDestinationPosY((short) 52);     // 目标库位列
                        crnCommand.setDestinationPosZ((short) 2);     // 目标库位层
                    }else{
                        crnCommand.setDestinationPosX((short) 11);     // 目标库位排
                        crnCommand.setDestinationPosY((short) 52);     // 目标库位列
                        crnCommand.setDestinationPosZ((short) 1);     // 目标库位层
                    }
//                crnCommand.setTraySize(sourceSta.getLocType1() == 2);     //库位类型
                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast9996.getCrnNo(), new Task(2, crnCommand))) {
                        News.error("" + mark + " - 2" + " - 13" + " - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast9996.getCrnNo(), JSON.toJSON(crnCommand));
                    } else {
                        // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                        Date now = new Date();
                        wrkMast9996.setWrkSts(12L);
                        wrkMast9996.setCrnStrTime(now);
                        wrkMast9996.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast9996) == 0) {
                            News.error("" + mark + " - 2" + " - 14" + " - 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast9996.getWrkNo());
                        }
                        break;
                    }
                }
            }
            for (WrkMast wrkMast : wrkMasts) {
                if (wrkMast == null) {
                    continue;
                }
                if (wrkMast.getIoType() == 107){
                    int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", wrkMast.getIoType()).eq("wrk_sts", 14));
                    if (count >= inventoryNumber) {
                        continue;
                    }
//                    if (count >= inventoryNumber) {
//                        continue;
//                    }
                }
                // 工作档状态判断
                if (wrkMast.getIoType() < 100 || wrkMast.getSourceStaNo() == null) {
@@ -1819,6 +1644,222 @@
        News.infoNoLog(""+mark+" - 2"+" - 0"+" - 堆垛机入出库作业下发 : 出库执行完毕");
    }
    public synchronized void locToCrnStn9996(CrnSlave slave, CrnProtocol crnProtocol,Integer mark) {
        News.warnNoLog(""+mark+" - 2"+" - 0"+" - 堆垛机入出库作业下发:执行出库");
        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
            // 获取工作状态为11(生成出库ID)的出库工作档
//            WrkMast wrkMast = wrkMastMapper.selectPakOutStep1(slave.getId(), crnStn.getStaNo());
            List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep11(slave.getId(), crnStn.getStaNo());
            WrkMast wrkMast9996 = wrkMastMapper.selectByWrkNo9997(9996);
            if (slave.getId() == 3 && wrkMast9996 != null) {
                SiemensDevpThread devpThread1 = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                SiemensDevpThread devpThread2 = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 2);
                StaProtocol staProtocol4001 = devpThread2.getStation().get(4001);
                if (staProtocol4001 == null) {
                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol4001);
                    break;
                } else {
                    staProtocol4001 = staProtocol4001.clone();
                }
                StaProtocol staProtocol2013 = devpThread2.getStation().get(2013);
                if (staProtocol2013 == null) {
                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol2013);
                    break;
                } else {
                    staProtocol2013 = staProtocol2013.clone();
                }
                StaProtocol staProtocol1019 = devpThread1.getStation().get(1019);
                if (staProtocol1019 == null) {
                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol1019);
                    break;
                } else {
                    staProtocol1019 = staProtocol1019.clone();
                }
                BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
                if (staDetl == null) {
                    News.error(""+mark+" - 2"+" - 5"+" - 出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                    break;
//                    continue;
                }
                if(staProtocol4001.isLoading() && staProtocol4001.isAutoing() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")){
                    // 堆垛机控制过滤
                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
//                        continue;
                        break;
                    }
                    // 已经存在吊车执行任务时,则过滤
                    if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                        break;
//                        return;
                    }
                    if(staProtocol1019.isLoading() && wrkMast9996.getStaNo() < 2000){
                        continue;
                    }
                    if(staProtocol2013.isLoading() && wrkMast9996.getStaNo() > 2000){
                        continue;
                    }
                    // 1.堆垛机开始移动
                    CrnCommand crnCommand = new CrnCommand();
                    crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                    crnCommand.setTaskNo((short) 9996); // 工作号
//                    crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                    crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                    crnCommand.setSourcePosX((short) 9);     // 源库位排
                    crnCommand.setSourcePosY((short) 52);     // 源库位列
                    crnCommand.setSourcePosZ((short) 3);     // 源库位层
                    if(wrkMast9996.getStaNo()>2000){
                        crnCommand.setDestinationPosX((short) 9);     // 目标库位排
                        crnCommand.setDestinationPosY((short) 52);     // 目标库位列
                        crnCommand.setDestinationPosZ((short) 2);     // 目标库位层
                    }else{
                        crnCommand.setDestinationPosX((short) 11);     // 目标库位排
                        crnCommand.setDestinationPosY((short) 52);     // 目标库位列
                        crnCommand.setDestinationPosZ((short) 1);     // 目标库位层
                    }
//                crnCommand.setTraySize(sourceSta.getLocType1() == 2);     //库位类型
                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast9996.getCrnNo(), new Task(2, crnCommand))) {
                        News.error("" + mark + " - 2" + " - 13" + " - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast9996.getCrnNo(), JSON.toJSON(crnCommand));
                    } else {
                        // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                        Date now = new Date();
                        wrkMast9996.setWrkSts(12L);
                        wrkMast9996.setCrnStrTime(now);
                        wrkMast9996.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast9996) == 0) {
                            News.error("" + mark + " - 2" + " - 14" + " - 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast9996.getWrkNo());
                        }
                        break;
                    }
                }
            }
        }
        News.infoNoLog(""+mark+" - 2"+" - 0"+" - 堆垛机入出库作业下发 : 出库执行完毕");
    }
    public synchronized void locToCrnStn9997(CrnSlave slave, CrnProtocol crnProtocol,Integer mark) {
        News.warnNoLog(""+mark+" - 2"+" - 0"+" - 堆垛机入出库作业下发:执行出库");
        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
            // 获取工作状态为11(生成出库ID)的出库工作档
//            WrkMast wrkMast = wrkMastMapper.selectPakOutStep1(slave.getId(), crnStn.getStaNo());
            List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep11(slave.getId(), crnStn.getStaNo());
            WrkMast wrkMast9997 = wrkMastMapper.selectByWrkNo9997(9997);
            if (slave.getId() == 3 && wrkMast9997 != null) {
                SiemensDevpThread devpThread1 = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                StaProtocol staProtocol2 = devpThread1.getStation().get(1015);
                if (staProtocol2 == null) {
                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol2);
                    break;
                } else {
                    staProtocol2 = staProtocol2.clone();
                }
                SiemensDevpThread devpThread2 = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 2);
                StaProtocol staProtocol4004 = devpThread2.getStation().get(4004);
                if (staProtocol4004 == null) {
                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol4004);
                    break;
                } else {
                    staProtocol4004 = staProtocol4004.clone();
                }
                StaProtocol staProtocol3 = devpThread2.getStation().get(2016);
                if (staProtocol3 == null) {
                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol2);
                    break;
                } else {
                    staProtocol3 = staProtocol3.clone();
                }
                BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
                if (staDetl == null) {
                    News.error("" + mark + " - 2" + " - 5" + " - 出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                    break;
//                    continue;
                }
                if (staProtocol2.isLoading() && staProtocol2.isAutoing() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")) {
                    // 堆垛机控制过滤
                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
//                        continue;
                        break;
                    }
                    // 已经存在吊车执行任务时,则过滤
                    if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                        break;
//                        return;
                    }
                    if (staProtocol4004.isLoading()) {
                        continue;
                    }
                    // 1.堆垛机开始移动
                    CrnCommand crnCommand = new CrnCommand();
                    crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                    crnCommand.setTaskNo((short) 9997); // 工作号
//                    crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                    crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                    crnCommand.setSourcePosX((short) 9);     // 源库位排
                    crnCommand.setSourcePosY((short) 52);     // 源库位列
                    crnCommand.setSourcePosZ((short) 1);     // 源库位层
                    crnCommand.setDestinationPosX((short) 11);     // 目标库位排
                    crnCommand.setDestinationPosY((short) 52);     // 目标库位列
                    crnCommand.setDestinationPosZ((short) 3);     // 目标库位层
//                crnCommand.setTraySize(sourceSta.getLocType1() == 2);     //库位类型
                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast9997.getCrnNo(), new Task(2, crnCommand))) {
                        News.error("" + mark + " - 2" + " - 13" + " - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast9997.getCrnNo(), JSON.toJSON(crnCommand));
                    } else {
                        // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                        Date now = new Date();
                        wrkMast9997.setWrkSts(12L);
                        wrkMast9997.setCrnStrTime(now);
                        wrkMast9997.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast9997) == 0) {
                            News.error("" + mark + " - 2" + " - 14" + " - 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast9997.getWrkNo());
                        }
                        break;
                    }
                }
                if (staProtocol3.isLoading() && staProtocol3.isAutoing()) {
                    // 堆垛机控制过滤
                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
//                        continue;
                        break;
                    }
                    // 已经存在吊车执行任务时,则过滤
                    if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                        break;
//                        return;
                    }
                    if (staProtocol4004.isLoading()) {
                        continue;
                    }
                    // 1.堆垛机开始移动
                    CrnCommand crnCommand = new CrnCommand();
                    crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                    crnCommand.setTaskNo((short) 9997); // 工作号
//                    crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                    crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                    crnCommand.setSourcePosX((short) 11);     // 源库位排
                    crnCommand.setSourcePosY((short) 52);     // 源库位列
                    crnCommand.setSourcePosZ((short) 2);     // 源库位层
                    crnCommand.setDestinationPosX((short) 11);     // 目标库位排
                    crnCommand.setDestinationPosY((short) 52);     // 目标库位列
                    crnCommand.setDestinationPosZ((short) 3);     // 目标库位层
//                crnCommand.setTraySize(sourceSta.getLocType1() == 2);     //库位类型
                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast9997.getCrnNo(), new Task(2, crnCommand))) {
                        News.error("" + mark + " - 2" + " - 13" + " - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast9997.getCrnNo(), JSON.toJSON(crnCommand));
                    } else {
                        // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                        Date now = new Date();
                        wrkMast9997.setWrkSts(12L);
                        wrkMast9997.setCrnStrTime(now);
                        wrkMast9997.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast9997) == 0) {
                            News.error("" + mark + " - 2" + " - 14" + " - 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast9997.getWrkNo());
                        }
                        break;
                    }
                }
            }
        }
        News.infoNoLog(""+mark+" - 2"+" - 0"+" - 堆垛机入出库作业下发 : 出库执行完毕");
    }
//    /**
//     * 出库  ===>>  库位到堆垛机站
//     */
@@ -2433,7 +2474,7 @@
                        } else {
                            total = locDetl.getAnfme();
                        }
                        if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 1) {
                        if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 1 ||wrkMast.getIoType() == 57 || wrkMast.getIoType() == 53) {
                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getBoxType3(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),wrkDetl.getAnfme(),total));
                        }
                        if (wrkMast.getIoType() == 103 && (null == wrkDetl.getInspect() || 0 == wrkDetl.getInspect())) {
@@ -2970,7 +3011,7 @@
            //如果站点可出禁用,则不生成空盘出库任务
            switch (site){
                case 1108:staProtocol = devpThread.getStation().get(site - 2);break;
                case 2031:staProtocol = devpThread2.getStation().get(site);break;
                case 2031:staProtocol = devpThread2.getStation().get(site + 1);break;
            }
            if (staProtocol == null) {
                return;
@@ -3721,7 +3762,29 @@
                rgvThread.setPakMk(false);  //小车双工位锁定
            }
        }
    }
    public synchronized void rgvIoExecuteScheduling() {
        for (RgvSlave rgv : slaveProperties.getRgv()) {
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol == null) {
                continue;
            }
            BasRgv basRgv = basRgvService.selectById(rgv.getId());
            if (basRgv == null) {
                log.error("{}号RGV尚未在数据库进行维护!4", rgv.getId());
                continue;
            }
            if(rgvProtocol.getStatusType1() == RgvStatusType.WORKING){
                rgvThread.setPaking(true);
            }
            if(rgvProtocol.isLoaded1ing() && rgvProtocol.isLoaded2ing()){
                basRgv.setPakAll("1");
                basRgvService.updateById(basRgv);
            }
            if(rgvProtocol.getStatusType1() == RgvStatusType.IDLE &&
                    rgvProtocol.getModeType() == RgvModeType.AUTO && rgvThread.isPakMk()
                    && rgvThread.isPaking() && basRgv.getPakAll().equals("1")){
@@ -3989,7 +4052,7 @@
            sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发
            if (sign){
                if(wrkMastSta.getMk() == 1){//若已执行
                if(wrkMastSta.getMk() != null && wrkMastSta.getMk() == 1){//若已执行
                    basRgv.setPakAll("1");
                    basRgvService.updateById(basRgv);
                }
@@ -4043,6 +4106,8 @@
            //遍历rgv入库取货站点
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, rgvStn.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(rgvStn.getStaNo2());
            StaProtocol staProtocol2 = devpThread.getStation().get(rgvStn.getStaNo());
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, (int) rgvProtocol.getRgvNo());
            BasRgv basRgv = basRgvService.selectById(slave.getId());
            if (basRgv == null) {
@@ -4052,7 +4117,9 @@
            if(staProtocol.getWorkNo() == 0){
                continue;
            }
            StaProtocol staProtocol2 = null;
            if(staProtocol2.getWorkNo() != 0 ){
                continue;
            }
            WrkMastSta wrkMastSta3 = null;
//            if(rgvStn.getStaNo2()!= null ){
@@ -4455,34 +4522,34 @@
            }
            //遍历rgv入库取货站点
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, rgvStn.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(rgvStn.getStaNo2()); //倒数第二个
            StaProtocol staProtocol = devpThread.getStation().get(rgvStn.getStaNo2()==1043?1044:1103); //倒数第二个
            StaProtocol staProtocol2 = null;  //连续取货任务站点
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, (int) rgvProtocol.getRgvNo());
            WrkMastSta wrkMastSta3 = null;//连取两个
            Integer staNo = null;  //与调度
            switch (rgvStn.getStaNo2()){
                case 1043: staNo = 1044;break;
                case 1104: staNo = 1103;break;
            }
            if(staNo != null ){
                staProtocol2 = devpThread.getStation().get(staNo);
                if (staProtocol2 == null) {
                    News.infoNoLog(" - Rgv入库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol);
                    continue;
                } else {
                    staProtocol2 = staProtocol2.clone();
                }
                BasDevp staDetl2 = basDevpService.selectById(rgvStn.getStaNo2());
                if (staDetl2 == null) {
                    News.error(" - 入库 ===>>Rgv站点在数据库不存在, 站点编号={}", rgvStn.getStaNo());
                    continue;
                }
                if((staProtocol.getWorkNo()>9999 && staProtocol2.getWorkNo()>9999) || (staProtocol.getWorkNo()<10000 && staProtocol2.getWorkNo()<10000)){
                    //当连续取货站点为相同类型时才能连续取
                    wrkMastSta3 = wrkMastStaMapper.selectByWrkNo(staProtocol2.getWorkNo());
                }
            }
//            WrkMastSta wrkMastSta3 = null;//连取两个
//            Integer staNo = null;  //与调度
//            switch (rgvStn.getStaNo2()){
//                case 1043: staNo = 1044;break;
//                case 1104: staNo = 1103;break;
//            }
//            if(staNo != null ){
//                staProtocol2 = devpThread.getStation().get(staNo);
//                if (staProtocol2 == null) {
//                    News.infoNoLog(" - Rgv入库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol);
//                    continue;
//                } else {
//                    staProtocol2 = staProtocol2.clone();
//                }
//                BasDevp staDetl2 = basDevpService.selectById(rgvStn.getStaNo2());
//                if (staDetl2 == null) {
//                    News.error(" - 入库 ===>>Rgv站点在数据库不存在, 站点编号={}", rgvStn.getStaNo());
//                    continue;
//                }
//                if((staProtocol.getWorkNo()>9999 && staProtocol2.getWorkNo()>9999) || (staProtocol.getWorkNo()<10000 && staProtocol2.getWorkNo()<10000)){
//                    //当连续取货站点为相同类型时才能连续取
//                    wrkMastSta3 = wrkMastStaMapper.selectByWrkNo(staProtocol2.getWorkNo());
//                }
//
//            }
            if(rgvProtocol.getTaskNo2() > 9999 && staProtocol.getWorkNo() < 10000){
                continue;
            }
@@ -4543,21 +4610,21 @@
            sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发
            if (sign){
                if(wrkMastSta3 != null ){
                    List<WrkMastSta> wrkMastStaPaking = wrkMastStaService.selectPakingWrk(wrkMastSta3.getStaStart());
                    if(wrkMastStaPaking.size() < 1 && !wrkMastSta3.getWrkNo().equals(wrkMastSta.getWrkNo())){//已有标记不再标记
                        wrkMastSta3.setMk(1);
                        basRgv.setPakAll("0");
                        basRgvService.updateById(basRgv);
                        try{
                            wrkMastStaMapper.updateById(wrkMastSta3);
                            log.error("锁定相隔站点任务");
                        }catch (Exception e){
                            log.error("锁定相隔站点任务失败");
                        }
                    }
                }
//                if(wrkMastSta3 != null ){
//                    List<WrkMastSta> wrkMastStaPaking = wrkMastStaService.selectPakingWrk(wrkMastSta3.getStaStart());
//                    if(wrkMastStaPaking.size() < 1 && !wrkMastSta3.getWrkNo().equals(wrkMastSta.getWrkNo())){//已有标记不再标记
//                        wrkMastSta3.setMk(1);
//                        basRgv.setPakAll("0");
//                        basRgvService.updateById(basRgv);
//
//                        try{
//                            wrkMastStaMapper.updateById(wrkMastSta3);
//                            log.error("锁定相隔站点任务");
//                        }catch (Exception e){
//                            log.error("锁定相隔站点任务失败");
//                        }
//                    }
//                }
                basRgv.setPakOut("0");//出库不允许
                basRgvService.updateById(basRgv);
                rgvThread.setPaking(false);//任务下发锁定
@@ -4600,6 +4667,21 @@
            if (targetPosition == 1038) {
                System.out.println("小车下发命令时间:" +
                        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(now));
            }
            EntityWrapper<BasRgvOpt> entityWrapper = new EntityWrapper<>();
            entityWrapper.eq("rgv_no", rgvId)
                    .orderBy("send_time");
            BasRgvOpt basRgvOpt = basRgvOptService.selectOne(entityWrapper);
            // 防止重复下发命令
            if (basRgvOpt != null) {
                // 获取最新记录的 mode 对应的任务类型
                RgvTaskStatusType latestTaskStatus = RgvTaskStatusType.valueOf(basRgvOpt.getMode());
                // 判断当前命令与最新记录是否相同
                if (latestTaskStatus == type && basRgvOpt.getPosSta().equals(wrkMastSta.getWorkSta())) {
                    // 如果最新记录的 mode 和 posSta 与当前命令相同,认为是重复命令
                    log.error("命令重复下发,当前命令与最新记录相同,任务不下发!");
                    return false;
                }
            }
            rgvCommand.setTaskNo(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位工作号
@@ -4749,20 +4831,26 @@
                    // 获取站点信息
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(armSta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    StaProtocol staProtocol = null;
                    String barcode = null;
                    // 可以轮询读取,确保条码稳定不变
                    for(int retry=0; retry<3; retry++){
                        staProtocol = devpThread.getStation().get(armSta.getStaNo());
                        barcode = staProtocol.getBarcode();
                        if (staProtocol == null) {
                            continue;
                        } else {
                            staProtocol = staProtocol.clone();
                        }
                        Thread.sleep(150); // 小延时等待PLC刷新
                    }
                    String barcode = staProtocol.getBarcode();
                    if(!Cools.isEmpty(barcode)) {
                        if("NG".endsWith(barcode) || "NoRead".equals(barcode) || "0".equals(barcode) || barcode.length()<5) {
                            armTaskAssignmentCallApiLogSave(staProtocol, "托盘条码为空", staProtocol.getSiteId()+"码垛位置,===》托盘条码为空", false);
                            armTaskAssignmentCallApiLogSave(staProtocol, "拆垛条码为空", staProtocol.getSiteId()+"码垛位置,===》托盘条码为空", false);
                            continue;
                        }
                    } else {
                        armTaskAssignmentCallApiLogSave(staProtocol, "托盘条码为空", staProtocol.getSiteId()+"码垛位置,===》托盘条码为空", false);
                        armTaskAssignmentCallApiLogSave(staProtocol, "拆垛条码为空", staProtocol.getSiteId()+"码垛位置,===》托盘条码为空", false);
                        continue;
                    }
                    String[] barcodeList = barcode.split(";");
@@ -4790,11 +4878,9 @@
                        continue;
                    }
                    List<BasArm> basArmList = basArmService.selectList(new EntityWrapper<BasArm>().eq("arm_no",armSta.getArmNo()));
                    boolean sign = true;
                    BasArmMast basArmMastFinal = null;
                    Integer num = 0;
                    for (BasArm basArm : basArmList){
                        if (basArm.getStaNo()==2){//NG
                            continue;
                        }
                        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", basArm.getStaNoSou()));
                        if (Cools.isEmpty(locMast) || !locMast.getLocSts().equals("D")){
                            continue;
@@ -4816,25 +4902,14 @@
                        basArmMast.setArmNo(basArm.getArmNo());
                        basArmMast.setStaNo(basArm.getStaNoSou());
                        basArmMast.setSortingLine(basArm.getSortingLineSou());
                        basArmMastService.insert(basArmMast);
                        sign = false;
                        break;
                    }
                    if (sign){
                        for (BasArm basArm : basArmList){
                            if (basArm.getStaNo()==2){//NG
                                LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", basArm.getStaNoSou()));
                                if (Cools.isEmpty(locMast) || !locMast.getLocSts().equals("D")){
                                    continue;
                                }
                                BasArmMast basArmMast = new BasArmMast(armBarcodeTwoParam);
                                basArmMast.setArmNo(basArm.getArmNo());
                                basArmMast.setStaNo(basArm.getStaNoSou());
                                basArmMast.setSortingLine(basArm.getSortingLineSou());
                                basArmMastService.insert(basArmMast);
                                break;
                            }
                        if(basArmMastList2.size() >= num){
                            basArmMastFinal = basArmMast;
                            num = basArmMastList2.size();
                        }
                    }
                    if(basArmMastFinal != null){
                        basArmMastService.insert(basArmMastFinal);
                        break;
                    }
                }
            }
@@ -5045,7 +5120,7 @@
                                        new EntityWrapper<BasArmMast>()
                                                .eq("status", 2)
                                                .eq("binding_tags", basArmMast.getBindingTags()));
                                if (binding_tags<2){
                                if (binding_tags==1){
                                    BasArmMast basArmMastOne = basArmMastService.selectOne(
                                            new EntityWrapper<BasArmMast>()
                                                    .eq("status", 2)
@@ -5056,6 +5131,25 @@
                                        continue;
                                    }
                                } else if (binding_tags == 0){
                                    boolean signBinding_tags_barcode = false;
                                    List<BasArmMast> binding_tags_barcodeList = basArmMastService.selectList(
                                            new EntityWrapper<BasArmMast>()
                                                    .eq("barcode", barcode));
                                    for (BasArmMast basArmMastBarcode : binding_tags_barcodeList){
                                        Integer selectCountAndBindingTags = basArmMastService.selectCountAndBindingTags(basArmMastBarcode.getArmNo(), basArmMastBarcode.getOrderNo(), basArmMastBarcode.getMatnr(),basArmMastBarcode.getBindingTags());
                                        Integer selectCountAndBindingTagsLog = basArmMastService.selectCountAndBindingTagsLog(basArmMastBarcode.getArmNo(),basArmMastBarcode.getOrderNo(), basArmMastBarcode.getMatnr(),basArmMastBarcode.getBindingTags());
                                        Double anfmeSignOne = basArmMastService.selectBasArmMastSignValue(basArmMastBarcode.getOrderNo(), basArmMastBarcode.getMatnr(),basArmMastBarcode.getBindingTags());
                                        if ((selectCountAndBindingTags + selectCountAndBindingTagsLog) != anfmeSignOne.intValue()) {
//                                            signBinding_tags_barcode = true; /////
                                            break;
                                        }
                                    }
                                    if (signBinding_tags_barcode){
                                        armTaskAssignmentCallApiLogSave(staProtocol, "数据异常!!!", staProtocol.getSiteId()+"码垛位置,上一个分拣组未全部完成!!!", false);
                                        continue;
                                    }
                                }
                            }
//                            OrderDetlValueResultUtil orderDetlValueResultUtil = basArmMastService.selectOrderDetlValue(basArmMast.getOrderNo(), basArmMast.getMatnr());
@@ -5123,11 +5217,11 @@
                    String barcode = locMastEnd.getBarcode();
                    if(!Cools.isEmpty(barcode)) {
                        if("NG".endsWith(barcode) || "NoRead".equals(barcode) || "0".equals(barcode)) {
                            armTaskAssignmentCallApiLogSave(locMastEnd, "托盘条码为空", basArm.getStaNoSou()+"码垛位置,===》托盘条码为空", false);
                            log.error( "取货条码为空", basArm.getStaNoSou());
                            continue;
                        }
                    } else {
                        armTaskAssignmentCallApiLogSave(locMastEnd, "托盘条码为空", basArm.getStaNoSou()+"码垛位置,===》托盘条码为空", false);
                        log.error( "取货条码为空", basArm.getStaNoSou());
                        continue;
                    }
@@ -5391,6 +5485,7 @@
                            SearchLocParam param = new SearchLocParam();
                            param.setBarcode(staProtocol.getWorkNo().toString());
                            param.setIoType(1);
                            param.setOutArea(wrkMast.getCtnKind());
                            param.setSourceStaNo(outStaAgv.getStaNo());
                            param.setLocType1(locTypeDto.getLocType1());
                            String response = new HttpHandler.Builder()
@@ -5449,6 +5544,7 @@
                        SearchLocParam param = new SearchLocParam();
                        param.setBarcode(wrkMast.getBarcode());
                        param.setIoType(1);
                        param.setOutArea(wrkMast.getCtnKind());
                        param.setSourceStaNo(outStaAgv.getStaNo());
                        param.setLocType1(locTypeDto.getLocType1());
                        String response = new HttpHandler.Builder()
@@ -5482,9 +5578,10 @@
                                LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no",dto.getLocNo()));
                                locMast.setBarcode(wrkMast.getBarcode());
                                locMastService.updateById(locMast);
                            }else{
                                agvBindCtnrAndBinParam.setCtnrTyp("1");
                                ReturnT<String> resultBind = new PostMesDataUtils().postMesDataAgv("AGV容器绑定", AgvConstant.AGV_URL, AgvConstant.AGV_CTNRANDBING, agvBindCtnrAndBinParam);
                            }
                            agvBindCtnrAndBinParam.setCtnrTyp("1");
                            ReturnT<String> resultBind = new PostMesDataUtils().postMesDataAgv("AGV容器绑定", AgvConstant.AGV_URL, AgvConstant.AGV_CTNRANDBING, agvBindCtnrAndBinParam);
                            wrkMast.setTakeNone("2");
                            wrkMastMapper.updateById(wrkMast);
                        } else {