#
1
4 天以前 8201281992c1fe2968e6a9f7c87c5184c8c1c804
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -50,6 +50,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@@ -82,6 +83,8 @@
    private BasCrnpService basCrnpService;
    @Autowired
    private BasDevpService basDevpService;
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
    @Autowired
    private LocDetlService locDetlService;
    @Autowired
@@ -146,8 +149,11 @@
                if(!staProtocol.isLoading()){
                    continue;
                }
                if (barcodeThread == null) {
                    continue;
                }
                if(!staProtocol.isAutoing()){
                    continue;
                }
@@ -186,9 +192,6 @@
                    log.error("物料码扫码失败");
                    back = true;
                }
                if(barcode.equals("0")){
                    continue;
                }
                // 退回
                if (back) {
                    News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg);
@@ -198,6 +201,9 @@
                        continue;
                    }
                    if (!staProtocol.isPakMk()) {
                        continue;
                    }
                    if(!staProtocol.isAutoing()){
                        continue;
                    }
                    // led 异常显示
@@ -224,26 +230,29 @@
                        && !staProtocol.isEmptyMk()
                        && staProtocol.isPakMk()
                        && staProtocol.getWorkNo() == 0
                        && !barcode.equals("0")
                        && !Cools.isEmpty(barcode)
                ) {
                    if(Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode)) {
//                        News.error(JSON.toJSONString(staProtocol));
                        News.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
                        // led 异常显示
                        if (ledThread != null) {
                            String errorMsg = "扫码失败,请重试";
                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
                        }
                        staProtocol.setWorkNo(wrkNo);
                        staProtocol.setErrCode(errMsg);
                        News.info("条码判断{}入库回退:{},任务号:{}", inSta.getStaNo(), errMsg,wrkNo);
                        wrkNo++;
                        staProtocol.setStaNo(inSta.getBackSta().shortValue());
                        staProtocol.setBarcode(barcode);
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        log.error("输送线下发1:"+wrkNo+","+inSta.getBackSta());
                        continue;
                    }
//                    if(Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode)) {
////                        News.error(JSON.toJSONString(staProtocol));
//                        News.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
//                        // led 异常显示
//                        if (ledThread != null) {
//                            String errorMsg = "扫码失败,请重试";
//                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
//                        }
//                        staProtocol.setWorkNo(wrkNo);
//                        staProtocol.setErrCode(errMsg);
//                        News.info("条码判断{}入库回退:{},任务号:{}", inSta.getStaNo(), errMsg,wrkNo);
//                        wrkNo++;
//                        staProtocol.setStaNo(inSta.getBackSta().shortValue());
//                        staProtocol.setBarcode(barcode);
//                        devpThread.setPakMk(staProtocol.getSiteId(), false);
//                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                        log.error("输送线下发1:"+wrkNo+","+inSta.getBackSta());
//                        continue;
//                    }
//                    if (staProtocol.getSiteId()!= 159){
//                        if( Cools.isEmpty(barcodeMat) || "NG".endsWith(barcodeMat) || "NoRead".equals(barcodeMat) || "00000000".equals(barcodeMat)) {
//                            News.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcodeMat(), barcodeMat);
@@ -325,15 +334,6 @@
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            log.error("输送线下发2:"+dto.getWorkNo()+","+dto.getStaNo());
                            if(staProtocol.getSiteId() == 1036){ //1036
                                BasAgvMast basAgvMast = basAgvMastService.selectOne(new EntityWrapper<BasAgvMast>().eq("sta_no", 1037));
                                AgvBindCtnrAndBinParam agvBindCtnrAndBinParam = new AgvBindCtnrAndBinParam(basAgvMast);
                                agvBindCtnrAndBinParam.setCtnrCode(barcode);
                                ReturnT<String> resultBind = new PostMesDataUtils().postMesDataAgv("AGV容器绑定解绑", AgvConstant.AGV_URL, AgvConstant.AGV_CTNRANDBING, agvBindCtnrAndBinParam);
                                if (resultBind.getCode()!=200){
                                    agvTaskAssignmentCallApiLogSave(basAgvMast, "AGV容器绑定解绑", "任务号:"+basAgvMast.getTaskNo()+"任务信息下发失败!!!", false);
                                }
                            }
                            ledThread.errorReset();
                            log.error("组托请求后LED错误清除");
@@ -458,23 +458,74 @@
                    continue;
                }
                String barcode = barcodeThread.getBarcode();
                if(!Cools.isEmpty(barcode)) {
//                    News.info(""+mark+" - 1"+" - {}号条码扫描器检测条码信息:{}", pickSta.getBarcode(), barcode);
                    if("NG".endsWith(barcode) || "NoRead".equals(barcode)) {
                        continue;
                    }
                } else {
                    continue;
                }
                // 获取拣料入库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo());
                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 尺寸检测异常
                boolean back = false;
                String errMsg = "";
                if (staProtocol.isFrontErr()) {
                    errMsg = "前超限";
                    back = true;
                }
                if (!back && staProtocol.isBackErr()) {
                    errMsg = "后超限";
                    back = true;
                }
                if (!back && staProtocol.isHighErr()) {
                    errMsg = "高超限";
                    back = true;
                }
                if (!back && staProtocol.isLeftErr()) {
                    errMsg = "左超限";
                    back = true;
                }
                if (!back && staProtocol.isRightErr()) {
                    errMsg = "右超限";
                    back = true;
                }
                if (!back && staProtocol.isWeightErr()) {
                    errMsg = "超重";
                    back = true;
                }
                if (!back && staProtocol.isBarcodeErr()) {
                    errMsg = "扫码失败";
                    log.error("物料码扫码失败");
                    back = true;
                }
                // 退回
                if (back) {
                    News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", pickSta.getStaNo(), errMsg);
                    MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(3, errMsg));
                    if (!staProtocol.isLoading()){
                        continue;
                    }
                    if (!staProtocol.isPakMk()) {
                        continue;
                    }
                    // led 异常显示
                    if (ledThread != null) {
                        MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(3, errMsg));
                    }
                    staProtocol.setWorkNo(wrkNo);
                    staProtocol.setErrCode(errMsg);
                    News.info("异常判断{}入库回退:{},任务号:{}", pickSta.getStaNo(), errMsg,wrkNo);
                    wrkNo++;
                    staProtocol.setStaNo(pickSta.getBackSta().shortValue());
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    staProtocol.setBarcode(barcode);
                    staProtocol.setPakMk(false);
                    MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                    System.out.println(staProtocol);
                    log.error("输送线下发1:"+wrkNo+","+pickSta.getBackSta());
                }
//                // 入出库模式判断
//                if (devpThread.ioMode != IoModeType.PAKIN_MODE) { continue; }
@@ -514,7 +565,7 @@
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        //LED
                        LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed());
//                        LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed());
                        // led 异常显示
                        if (ledThread != null) {
                            String errorMsg = "此为拣料、并板、盘点再入库.请放在"+pickSta.getBackSta().shortValue()+"站点";
@@ -933,16 +984,23 @@
     */
    public synchronized void connectWrk(Integer mark) {
        for (DevpSlave devp : slaveProperties.getDevp()) {
            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
            StaProtocol staProtocolIn = devpThread.getStation().get(4001);
            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
            SiemensDevpThread devpThread2 = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 2);
            StaProtocol staProtocolIn = devpThread2.getStation().get(4001);
            if (staProtocolIn == null) {
                continue;
            } else {
                staProtocolIn = staProtocolIn.clone();
            }
            int[] outStaNos = {1015, 2016}; //衔接入库点
            int[] outStaNos = {1015,2016}; //衔接入库点
            for (int outStaNo : outStaNos) {
                StaProtocol staProtocolOut = devpThread.getStation().get(outStaNo);// 盘点出库衔接站点(可能是 1015,也可能是 2016)
                StaProtocol staProtocolOut =null;
                if(outStaNo == 2016){
                    staProtocolOut = devpThread2.getStation().get(outStaNo);
                }else{
                    staProtocolOut = devpThread.getStation().get(outStaNo);
                }
                if (staProtocolOut == null) {
                    continue;
                } else {
@@ -1095,7 +1153,7 @@
            //mark - 3 - ....
            this.locToLoc(crn, crnProtocol,mark);
            //预调度
//            this.crnRebackHp(crnProtocol, crnThread);
            this.crnRebackHp(crn, crnProtocol, crnThread);
        }
//        News.infoNoLog(""+mark+" - 0"+" - 堆垛机入出库作业下发执行完成");
@@ -1104,10 +1162,30 @@
    /**
     * 回原点,堆垛机没有执行中任务,设备存在入库任务时叫回原点
     */
    public synchronized void crnRebackHp(CrnProtocol crnProtocol, CrnThread crnThread) {
    public synchronized void crnRebackHp(CrnSlave slave, CrnProtocol crnProtocol, CrnThread crnThread) {
        if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
            if (crnProtocol.getBay() == 1) {
            if (crnProtocol.getBay() == 52) {
                return;
            }
            BasCrnp basCrnp = basCrnpService.selectOne(
                    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());
                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo2());
                if (staProtocol == null) {
                    News.infoNoLog(" - 堆垛机入库站信息(staProtocol!=null继续执行):staProtocol="+staProtocol);
                    return;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if(staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 ){
                    result =false;
                }
            }
            int x=1;
            switch (crnProtocol.getCrnNo()){
@@ -1117,10 +1195,18 @@
                case 4: x =14; break;
                case 5: x =18; break;
            }
            Date modiTime = basCrnp.getModiTime();
            Date now = new Date();
            // 当前时间 - 修改时间 > 1分钟(60000毫秒)
            if(result){
                if (now.getTime() - modiTime.getTime() < 60 * 1000) {
                    return;
                }
            }
            if(crnProtocol.getCrnNo() != 5){
                return;
            }
            // 已经存在吊车执行任务时,则过滤3,12
            if (wrkMastMapper.selectWorking(crnProtocol.getCrnNo()) != null) {
                return;
@@ -1153,8 +1239,6 @@
            }
            crnThread.setBackHpFlag(true);
        }
//        }
    }
    /**
@@ -1947,9 +2031,6 @@
                //  状态:等待确认 并且  任务完成位 = 1
                if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) {
                    News.warnNoLog("" + mark + " - 0" + " - 开始执行对工作档的完成操作,任务号:" + crnProtocol.getTaskNo());
                    // 堆垛机复位
                    News.warnNoLog("" + mark + " - 2" + " - 修改成功后复位堆垛机 : 堆垛机号={}", crnThread.getCrnProtocol().getCrnNo());
                    crnThread.setResetFlag(true);
@@ -2300,6 +2381,9 @@
                    case 57:
                        ledCommand.setTitle("盘点再入库");
                        break;
                    case 53:
                        ledCommand.setTitle("拣料再入库");
                        break;
                    case 101:
                        ledCommand.setTitle("全板出库");
                        break;
@@ -2334,7 +2418,7 @@
                        } else {
                            total = locDetl.getAnfme();
                        }
                        ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total));
                        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() != 110 && wrkMast.getIoType() != 10) {
@@ -2350,13 +2434,13 @@
                            total = locDetl.getAnfme();
                        }
                        if (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 1) {
                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total));
                            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())) {
                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total));
                            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() == 107) {
                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getSupp(), wrkDetl.getSku(),wrkDetl.getAnfme(),total));
                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getOrderNo(), wrkDetl.getBoxType3(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),wrkDetl.getAnfme(),total));
                        }
                    });
                }
@@ -2871,6 +2955,8 @@
    public synchronized void autoEmptyOut() {
        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
        SiemensDevpThread devpThread2 = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 2);
        List<Integer> list = new ArrayList<>();
        list.add(1108);list.add(2031);
        for (Integer site:list){
@@ -2878,13 +2964,13 @@
            StaProtocol staProtocol = null;
            if(emptyCount >= 2 && site == 1108){
                continue;
            }else if(emptyCount == 1 && site == 2031){
            }else if(emptyCount > 1 && site == 2031){
                continue;
            }
            //如果站点可出禁用,则不生成空盘出库任务
            switch (site){
                case 1108:staProtocol = devpThread.getStation().get(site - 2);break;
                case 2031:staProtocol = devpThread.getStation().get(site);break;
                case 2031:staProtocol = devpThread2.getStation().get(site);break;
            }
            if (staProtocol == null) {
                return;
@@ -2923,8 +3009,12 @@
    }
    public synchronized void autoEmptyIn() {
         SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
        List<Integer> list = new ArrayList<>();
        List<WrkMast> wrkMast = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("source_sta_no",1038));
        if(wrkMast.size() >3){
            return;
        }
        list.add(1038);
        for (Integer site:list){
            StaProtocol staProtocol = devpThread.getStation().get(site);
@@ -2961,6 +3051,11 @@
                        staProtocol.setStaNo(site.shortValue());
                        devpThread.setPakMk(site,false);
                        MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
                        Date now = new Date();
                        System.out.println("小车下发命令时间:" +
                                    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(now));
                    } else {
                        News.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyIn/v1", JSON.toJSONString(locTypeDto), response);
                    }
@@ -3627,11 +3722,38 @@
            }
//            if(rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getTaskNo1() == 0 && rgvThread.isPakIn() && rgvThread.isPakRgv()){
//                rgvPreScheduling();//若暂无下发任务预调度提前到取货点
//            }
            if(rgvProtocol.getStatusType1() == RgvStatusType.IDLE &&
                    rgvProtocol.getModeType() == RgvModeType.AUTO && rgvThread.isPakMk()
                    && rgvThread.isPaking() && basRgv.getPakAll().equals("1")){
                if(basRgv.getPakOut().equals("1") && basRgv.getPakIn().equals("1")){
                    rgvPreSchedulingIn(rgv, rgvProtocol);//若暂无下发任务预调度提前到取货点
                    if (rgvProtocol.getLastIo().equals("I")) {
                        if (basRgv.getInEnable().equals("1") && basRgv.getPakIn().equals("1")) {
                            //mark - 1 - ....
                            if (rgvProtocol.getTaskNo1()==0){
                                rgvPreSchedulingIn(rgv, rgvProtocol);//若暂无下发任务预调度提前到取货点
                            }
                        } else if (basRgv.getOutEnable().equals("1") && basRgv.getPakOut().equals("1")) {
                            //mark - 2 - ....
                            if (rgvProtocol.getTaskNo2()==0){
                                this.rgvPreSchedulingOut(rgv, rgvProtocol); //  出库
                            }
                        }
                    }
                    // 如果最近一次是出库模式
                    else if (rgvProtocol.getLastIo().equals("O")) {
                        if (basRgv.getOutEnable().equals("1")  && basRgv.getPakOut().equals("1")) {
                            if (rgvProtocol.getTaskNo2()==0){
                                this.rgvPreSchedulingOut(rgv, rgvProtocol); //  出库
                            }
                        } else if (basRgv.getInEnable().equals("1") && basRgv.getPakIn().equals("1")) {
                            if (rgvProtocol.getTaskNo1()==0){
                                rgvPreSchedulingIn(rgv, rgvProtocol);//若暂无下发任务预调度提前到取货点
                            }
                        }
                    }
                }
            }
        }
    }
    /**
@@ -3752,7 +3874,7 @@
                try{
                    wrkMastSta.setWrkSts(1);
                    wrkMastStaMapper.updateById(wrkMastSta);
                    log.error("更新小车任务成功");
                    log.error("更新小车任务成功{}",wrkMastSta);
                }catch (Exception e){
                    log.error("更新小车任务失败");
                }
@@ -3849,7 +3971,7 @@
                continue;
            }
            if(wrkMastSta != null &&LEFT_POSITION.contains(wrkMastSta.getStaEnd())){
            if( LEFT_POSITION.contains(wrkMastSta.getStaEnd())){
                StaProtocol staProtocolSta = devpThread.getStation().get(wrkMastSta.getStaEnd());
                if (staProtocolSta == null) {
                    News.infoNoLog("" + mark + " - 1" + " - 1" + " - Rgv入库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol);
@@ -3901,7 +4023,149 @@
                try{
                    wrkMastSta.setWrkSts(1);
                    wrkMastStaMapper.updateById(wrkMastSta);
                    log.error("更新小车任务成功");
                    log.error("更新小车任务成功{}",wrkMastSta);
                }catch (Exception e){
                    log.error("更新小车任务失败");
                }
            } else {
                log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
            }
        }
    }
    /**
     * 小车出库任务取货下发
     */
    public synchronized void rgvPreSchedulingOut(RgvSlave slave, RgvProtocol rgvProtocol){
        for (RgvSlave.RgvStn rgvStn : slave.getRgvOutTStn()) {//rgv出库取货站点
            boolean flag = false;
            //遍历rgv入库取货站点
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, rgvStn.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(rgvStn.getStaNo2());
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, (int) rgvProtocol.getRgvNo());
            BasRgv basRgv = basRgvService.selectById(slave.getId());
            if (basRgv == null) {
                log.error("{}号RGV尚未在数据库进行维护!4", slave.getId());
                continue;
            }
            if(staProtocol.getWorkNo() == 0){
                continue;
            }
            StaProtocol staProtocol2 = null;
            WrkMastSta wrkMastSta3 = null;
//            if(rgvStn.getStaNo2()!= null ){
//                staProtocol2 = devpThread.getStation().get(rgvStn.getStaNo2());
//                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;
//                }
//                wrkMastSta3 = wrkMastStaMapper.selectByWrkNo(staProtocol2.getWorkNo());
//
//            }
            if (staProtocol == null) {
                News.infoNoLog(" - Rgv出库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol);
                continue;
            } else {
                staProtocol = staProtocol.clone();
            }
            // 查询站点详细信息
            BasDevp staDetl = basDevpService.selectById(rgvStn.getStaNo());
            if (staDetl == null) {
                News.error(" - 出库 ===>>Rgv站点在数据库不存在, 站点编号={}", rgvStn.getStaNo());
                continue;
            }
            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0
                    && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")) {
                flag = true;
            }
            if (!flag) {
                News.errorNoLog(" - Rgv出库取货站信息(以下需要全true):"
                        + "自动信号" + staProtocol.isAutoing() + "有物信号" + staProtocol.isLoading()
                        + "工作号>0" + staProtocol.getWorkNo() + "可入信号" + staProtocol.isOutEnable()
                        + "能入信号(wms设置).equals(\"Y\")" + staDetl.getCanouting());
                continue;
            }
            BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
            List<Integer> route = new ArrayList<>();
            switch (rgvProtocol.getRgvNo()){
                case 1: route = RouteUtils.getRouteOne();break;
                case 2: route = RouteUtils.getRouteTwo();break;
            }
            basRgvMap.setNowRoute(rgvProtocol.getRgvNo() == 1?rgvProtocol.getRgvPosI1():rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号
            basRgvMapService.updateById(basRgvMap);
            WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档
            WrkMastSta wrkMastSta1 = wrkMastStaMapper.selectByWrkNo( rgvProtocol.getTaskNo1());
            if(basRgv.getPakToCrn().equals("0")){
                wrkMastSta = wrkMastStaMapper.selectNoInterfereCrn(route, route, Long.valueOf(staProtocol2.getWorkNo()));//处理接驳任务时,连续只取接驳任务
            }
            if( null == wrkMastSta ) {
                News.infoNoLog(" - 查询无待出库数据--wrk_sts0, 工作号={}", staProtocol2.getWorkNo());
                continue;
            }
            boolean result = false;
            if( LEFT_POSITION.contains(wrkMastSta.getStaEnd())){
                StaProtocol staProtocolSta = devpThread.getStation().get(wrkMastSta.getStaEnd());
                if (staProtocolSta == null) {
                    News.infoNoLog(" - Rgv出库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol);
                    continue;
                } else {
                    staProtocolSta = staProtocolSta.clone();
                }
                if(staProtocolSta.isLoading()){
                    continue;
                }
            }
            wrkMastSta.setWorkSta(1);//若1号工位有任务给2号工位
            wrkMastSta.setRgvNo((int) rgvProtocol.getRgvNo());
            boolean sign = false;
            sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发
            if (sign){
                if(wrkMastSta.getMk() == 1){//若已执行
                    basRgv.setPakAll("1");
                    basRgvService.updateById(basRgv);
                }
                if(LEFT_POSITION.contains(wrkMastSta.getStaEnd())){
                    basRgv.setPakToCrn("0");
                    basRgvService.updateById(basRgv);
                    if(wrkMastSta3 != null){
                        if(!LEFT_POSITION.contains(wrkMastSta3.getStaEnd())){
                            wrkMastSta3 = null;//若接驳第二位不接驳时取消连续取货
                        }
                    }
                }
                if(wrkMastSta3 != null ){
                    List<WrkMastSta> wrkMastStaPaking = wrkMastStaService.selectPakingWrk(wrkMastSta3.getStaStart());
                    if(wrkMastStaPaking.size() < 1){
                        wrkMastSta3.setMk(1);
                        basRgv.setPakAll("0");
                        basRgvService.updateById(basRgv);
                        try{
                            wrkMastStaMapper.updateById(wrkMastSta3);
                            log.error("锁定相隔站点任务");
                        }catch (Exception e){
                            log.error("锁定相隔站点任务失败");
                        }
                    }
                }
                basRgv.setPakIn("0");
                basRgvService.updateById(basRgv);
                rgvThread.setPaking(false);
                try{
                    wrkMastSta.setWrkSts(1);
                    wrkMastStaMapper.updateById(wrkMastSta);
                    log.error("更新小车任务成功{}",wrkMastSta);
                }catch (Exception e){
                    log.error("更新小车任务失败");
                }
@@ -4178,77 +4442,140 @@
    /**
     * 小车预调度
     */
//    public synchronized  void rgvPreScheduling(){
//        try{
//            List<BasRgvMap> basRgvMaps = basRgvMapService.selectList(new EntityWrapper<>());
//            for (BasRgvMap rgvSlave:basRgvMaps) {
//                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getRgvNo());
//                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
//                if (rgvProtocol == null) {
//                    continue;
//                }else {
//                    rgvProtocol = rgvProtocol.clone();
//                }
//                BasRgv basRgv = basRgvService.selectById(rgvSlave.getRgvNo());
//                if (basRgv == null) {
//                    log.error("{}号RGV尚未在数据库进行维护!4", rgvSlave.getRgvNo());
//                    continue;
//                }
//
//                // 只有当RGV空闲、自动,工位一无物//rgv可用  才进行预调度
//                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
//                        && rgvProtocol.getModeType() == RgvModeType.AUTO
//                        && !rgvProtocol.isLoaded1ing()
//                        && rgvProtocol.getTaskNo1() == 0
//                        && !rgvProtocol.isLoaded2ing()
//                        && rgvProtocol.getTaskNo2() == 0
//                        && rgvThread.isPakMk()
//                ) {
//                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
//                    if (basRgvMap == null) {
//                        log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo());
//                        continue;
//                    }
//                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
//                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
//                    // 根据输送线plc遍历
//                    for (DevpSlave devp : slaveProperties.getDevp()) {
//                        // 遍历入库口  入库预调度
//                        List<Integer> staNos = Arrays.asList( 1043, 1104, 1029, 1022, 1019, 1008, 1005);
//                        for (Integer staNo : staNos) {
//                            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
//                            StaProtocol staProtocol = devpThread.getStation().get(staNo);
//                            if(staProtocol.isLoading()){
//                                RgvCommand rgvCommand = new RgvCommand();
//                                rgvCommand.setRgvNo((int) rgvProtocol.getRgvNo()); // RGV编号
//                                rgvCommand.setAckFinish1(false);  // 工位1任务完成确认位
//                                rgvCommand.setTaskNo(9999); // 工位1工作号
//                                rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式:  移动
//                                switch (staNo){
//                                    case 1043: rgvCommand.setTargetPosition1(1042);break;  //工位1目标站点
//                                    case 1104: rgvCommand.setTargetPosition1(1105);break;
//                                    case 1037: rgvCommand.setTargetPosition1(1036);break;
//
//                                }
//                                if(Objects.equals(basRgvMap.getNowRoute(), staNo)){
//                                    continue;
//                                }
//                                rgvCommand.setCommand(true);   //工位1任务确认
//                                if (!MessageQueue.offer(SlaveType.Rgv, (int) rgvProtocol.getRgvNo(), new Task(4, rgvCommand))) {
//                                    //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
//                                    log.error("RGV命令下发失败,RGV号={},任务数据={}", (int) rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
//                                }
//                            }
//                        }
//
//                    }
//
//                }
//            }
//        }catch (Exception e){
//            log.error("执行小车移动下发失败");
//        }
//    }
    public synchronized  void rgvPreSchedulingIn(RgvSlave slave, RgvProtocol rgvProtocol){
        for (RgvSlave.RgvStn rgvStn : slave.getRgvInTStn()) {//rgv入库取货站点
            boolean flag = false;
            BasRgv basRgv = basRgvService.selectById(slave.getId());
            if (basRgv == null) {
                log.error("{}号RGV尚未在数据库进行维护!4", slave.getId());
                continue;
            }
            if(rgvStn.getStaNo2() == null){
                continue;
            }
            //遍历rgv入库取货站点
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, rgvStn.getDevpPlcId());
            StaProtocol staProtocol = devpThread.getStation().get(rgvStn.getStaNo2()); //倒数第二个
            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());
                }
            }
            if(rgvProtocol.getTaskNo2() > 9999 && staProtocol.getWorkNo() < 10000){
                continue;
            }
            if (staProtocol == null) {
                News.infoNoLog( " - Rgv入库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol);
                continue;
            } else {
                staProtocol = staProtocol.clone();
            }
            // 查询站点详细信息
            BasDevp staDetl = basDevpService.selectById(rgvStn.getStaNo());
            if (staDetl == null) {
                News.error(" - 入库 ===>>Rgv站点在数据库不存在, 站点编号={}", rgvStn.getStaNo());
                continue;
            }
            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() != 0
                    && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) {
                flag = true;
            }
            if (!flag) {
                News.errorNoLog(" - 3" + " - Rgv入库取货站信息(以下需要全true):"
                        + "自动信号" + staProtocol.isAutoing() + "有物信号" + staProtocol.isLoading()
                        + "工作号>0" + staProtocol.getWorkNo() + "能入信号(wms设置).equals(\"Y\")" + staDetl.getCanining());
                continue;
            }
            BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
            List<Integer> route = new ArrayList<>();
            switch (rgvProtocol.getRgvNo()){
                case 1: route = RouteUtils.getRouteOne();break;
                case 2: route = RouteUtils.getRouteTwo();break;
            }
            basRgvMap.setNowRoute(rgvProtocol.getRgvNo() == 1?rgvProtocol.getRgvPosI1():rgvProtocol.getRgvPosI2()); //更新小车当前位置站点号
            basRgvMapService.updateById(basRgvMap);
            WrkMastSta wrkMastSta = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol.getWorkNo()));//根据站点工作号和小车工作范围检索任务档
            if( null == wrkMastSta ) {
                News.infoNoLog(" - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo());
                continue;
            }
            WrkMastSta wrkMastSta2 = null;
            if(rgvProtocol.getTaskNo2() != null){
                wrkMastSta2 = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo2());
            }
            boolean result = false;
            if(wrkMastSta2 != null && rgvProtocol.getRgvNo() == 1){ //距离计算   2楼单入库口不需要计算
                result = rgvCalcDistance((int) rgvProtocol.getRgvNo(),wrkMastSta2.getStaEnd(),wrkMastSta.getStaStart());//工位2放货站点,工位1取货站点
            }
            if(result){//若小车距离放货点距离近于取货点则跳过取货 true跳过取货/false优先取货
                basRgv.setPakRgv("0");
                basRgvService.updateById(basRgv);
//                rgvThread.setPakRgv(false);
                continue;
            }
            wrkMastSta.setWorkSta(wrkMastSta2 !=null ? 1 : 2);
            wrkMastSta.setRgvNo((int) rgvProtocol.getRgvNo());
            boolean sign = false;
            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("锁定相隔站点任务失败");
                        }
                    }
                }
                basRgv.setPakOut("0");//出库不允许
                basRgvService.updateById(basRgv);
                rgvThread.setPaking(false);//任务下发锁定
                try{
                    wrkMastSta.setWrkSts(1);
                    wrkMastStaMapper.updateById(wrkMastSta);
                    log.error("更新小车任务成功{}",wrkMastSta);
                }catch (Exception e){
                    log.error("更新小车任务失败");
                }
            } else {
                log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
            }
        }
    }
@@ -4269,6 +4596,12 @@
                type = RgvTaskStatusType.PUT; //放货
                targetPosition = wrkMastSta.getStaEnd();
            }
            Date now = new Date();
            if (targetPosition == 1038) {
                System.out.println("小车下发命令时间:" +
                        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(now));
            }
            rgvCommand.setTaskNo(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位工作号
            rgvCommand.setTaskStatus(type); // 工位任务模式:  取货
            rgvCommand.setTargetPosition(targetPosition);   //工位目标站点
@@ -4404,6 +4737,158 @@
            log.error("机械臂抓取任务完成组托失败"+e.getMessage());
        }
    }
    /*
     * arm任务完成自动组托
     * */
    public synchronized void  armMissionAccomplished1() {
        try{
            for (DevpSlave devp : slaveProperties.getDevp()) {
                // 遍历拣料入库口
                for (DevpSlave.Sta armSta : devp.getArmStaTwo()) {
                    // 获取站点信息
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(armSta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    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);
                            continue;
                        }
                    } else {
                        armTaskAssignmentCallApiLogSave(staProtocol, "托盘条码为空", staProtocol.getSiteId()+"码垛位置,===》托盘条码为空", false);
                        continue;
                    }
                    String[] barcodeList = barcode.split(";");
                    String[][] barcodeArr = new String[barcodeList.length / 2][2];
                    int i = 0;
                    for (String[] barcodes : barcodeArr){
                        barcodes[0]=barcodeList[i];
                        i++;
                        barcodes[1]=barcodeList[i];
                        i++;
                    }
                    ArmBarcodeTwoParam armBarcodeTwoParam = new ArmBarcodeTwoParam(barcodeArr);
                    if (!armBarcodeTwoParam.allBool()){
                        continue;
                    }
                    List<BasArmMast> basArmMastList = basArmMastService.selectList(
                            new EntityWrapper<BasArmMast>()
                                    .eq("arm_no", armSta.getArmNo())
                                    .lt("status", 2)
                    );
                    if (!basArmMastList.isEmpty()){
                        armTaskAssignmentCallApiLogSave(staProtocol, armSta.getArmNo()+"号机械臂存在未完成任务", staProtocol.getSiteId()+"机械臂,===》存在未完成任务", false);
                        continue;
                    }
                    List<BasArm> basArmList = basArmService.selectList(new EntityWrapper<BasArm>().eq("arm_no",armSta.getArmNo()));
                    boolean sign = true;
                    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;
                        }
                        List<BasArmMast> basArmMastList2 = basArmMastService.selectList(
                                new EntityWrapper<BasArmMast>()
                                        .eq("arm_no", basArm.getArmNo())
                                        .eq("sorting_line", basArm.getSortingLineSou())
                                        .eq("sta_no", basArm.getStaNoSou())
                                        .eq("status", 2)
                        );
                        if (!basArmMastList2.isEmpty()){
                            BasArmMast basArmMast2 = basArmMastList2.get(0);
                            if (!armBarcodeTwoParam.allBool(basArmMast2)){
                                continue;
                            }
                        }
                        BasArmMast basArmMast = new BasArmMast(armBarcodeTwoParam);
                        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;
                            }
                        }
                    }
                }
            }
        } catch (Exception e){
            log.error("机械臂抓取任务完成组托失败"+e.getMessage());
        }
    }
    /*
     * arm任务完成自动组托
     * */
    public synchronized void  armMissionAccomplished2() {
        try{
            List<BasArm> basArmList = basArmService.selectList(new EntityWrapper<BasArm>().gt("arm_no",4));
            for (BasArm basArm : basArmList) {
                if (basArm.getStatus()!=1){
                    continue;
                }
                LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", basArm.getStaNoSou()));
                if (Cools.isEmpty(locMast)){
                    continue;
                }
                try{
                    List<BasArmMast> basArmMastList = basArmMastService.selectList(
                            new EntityWrapper<BasArmMast>()
                                    .eq("arm_no", basArm.getArmNo())
                                    .eq("sorting_line", basArm.getSortingLineSou())
                                    .eq("sta_no", basArm.getStaNoSou())
                                    .eq("status", 3)
                    );
                    if (basArmMastList.isEmpty()){
                        continue;
                    }
                    CombParam combParam = new CombParam(basArmMastList);
                    //arm任务完成自动组托
                    ReturnT<String> result = new PostMesDataUtils().postMesData("arm任务完成自动组托",wmsUrl, wmsComb, combParam);
                    if (result.getCode()==200){
                        basArmMastService.updateArmMastStatus(basArm.getArmNo(),basArm.getSortingLineSou(),3,5);
                        locMast.setLocSts("R");
                        locMastService.updateById(locMast);
                    } else {
                        armTaskAssignmentCallApiLogSave(locMast, "自动组托失败", basArm.getStaNoSou()+"码垛位置,===》自动组托失败,等待重试", false);
//                                log.error("机械臂抓取任务完成:"+JSON.toJSON(basArmMastList)+"===》自动组托失败,等待重试");
                    }
                }  catch (Exception e){
                    armTaskAssignmentCallApiLogSave(locMast, "自动组托失败", basArm.getStaNoSou()+"码垛位置,===》自动组托失败,等待重试", false);
//                            log.error("arm编号:"+basArm.getArmNo()+"====》机械臂抓取任务完成"+e.getMessage());
                }
                break;
            }
        } catch (Exception e){
            log.error("机械臂抓取任务完成组托失败"+e.getMessage());
        }
    }
    public synchronized void armMissionAccomplishedScanToCheckIn() {
        try{
            for (DevpSlave devp : slaveProperties.getDevp()) {
@@ -4468,6 +4953,9 @@
                        staProtocol = staProtocol.clone();
                    }
                    if(!staProtocol.isLoading()){
                        continue;
                    }
                    String barcode = staProtocol.getBarcode();
                    if(!Cools.isEmpty(barcode)) {
                        if("NG".endsWith(barcode) || "NoRead".equals(barcode)) {
@@ -4570,16 +5058,21 @@
                                }
                            }
                            OrderDetlValueResultUtil orderDetlValueResultUtil = basArmMastService.selectOrderDetlValue(basArmMast.getOrderNo(), basArmMast.getMatnr());
                            if (Cools.isEmpty(orderDetlValueResultUtil)){
                                continue;
                            }
//                            OrderDetlValueResultUtil orderDetlValueResultUtil = basArmMastService.selectOrderDetlValue(basArmMast.getOrderNo(), basArmMast.getMatnr());
//                            if (Cools.isEmpty(orderDetlValueResultUtil)){
//                                continue;
//                            }
                            OrderDetlValueResultUtil orderDetlValueResultUtil = new OrderDetlValueResultUtil();
                            Mat mat = matService.selectOne(new EntityWrapper<Mat>().eq("matnr", basArmMast.getMatnr()));
                            orderDetlValueResultUtil.setHeight(mat.getHeight());
                            orderDetlValueResultUtil.setWeight(mat.getWeight());
                            orderDetlValueResultUtil.setLength(mat.getManLength());
                            orderDetlValueResultUtil.setWidth(mat.getWidth());
                            Double anfmeSign = basArmMastService.selectBasArmMastSignValue(basArmMast.getOrderNo(), basArmMast.getMatnr(),basArmMast.getBindingTags());
                            orderDetlValueResultUtil.setAnfme(anfmeSign);
                            //订单下发
                            try{
                                ArmOrderAssignmentParam armOrderAssignmentParam = new ArmOrderAssignmentParam(basArmMast,orderDetlValueResultUtil);
                                ArmOrderAssignmentParam armOrderAssignmentParam = new ArmOrderAssignmentParam(basArm,basArmMast,orderDetlValueResultUtil);
//                                订单下发(SKU+订单)
                                ReturnT<String> result = new PostMesDataUtils().postMesData("机械臂抓取订单(SKU)下发:",ArmConstant.getArmUrl(basArmMast.getArmNo()), ArmConstant.ARM_ADAPTOR, armOrderAssignmentParam);
                                if (result.getCode()!=200){
@@ -4690,7 +5183,7 @@
                                        .eq("sta_no", basArm.getStaNoSou())
                                        .eq("status", 0)
                        );
                        if (basArmMastList.isEmpty()){
                         if (basArmMastList.isEmpty()){
                            continue;
                        }
                        if (basArmMastList.size()>1){
@@ -4723,7 +5216,7 @@
                        orderDetlValueResultUtil.setWidth(mat.getWidth());
                        //订单下发
                        try{
                            ArmOrderAssignmentParam armOrderAssignmentParam = new ArmOrderAssignmentParam(basArmMast,orderDetlValueResultUtil);
                            ArmOrderAssignmentParam armOrderAssignmentParam = new ArmOrderAssignmentParam(basArm,basArmMast,orderDetlValueResultUtil);
//                                订单下发(SKU+订单)
                            ReturnT<String> result = new PostMesDataUtils().postMesData("机械臂抓取订单(SKU)下发:",ArmConstant.getArmUrl(basArmMast.getArmNo()), ArmConstant.ARM_ADAPTOR, armOrderAssignmentParam);
                            if (result.getCode()!=200){
@@ -4831,7 +5324,108 @@
                    continue;
                }
                if (staProtocol.isAutoing() ) {
                    //staProtocol.getWorkNo()>10000
                    if(staProtocol.getWorkNo()>10000){
                        BasAgvMast basAgvMast = new BasAgvMast();
                        List<BasAgvMast> basAgvMastList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("task_no", staProtocol.getWorkNo()));
                        if(!basAgvMastList.isEmpty()){
                            continue;
                        }
                        try {
                            LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
                            SearchLocParam param = new SearchLocParam();
                            param.setBarcode(staProtocol.getWorkNo().toString());
                            param.setIoType(1);
                            param.setSourceStaNo(outStaAgv.getStaNo());
                            param.setLocType1(locTypeDto.getLocType1());
                            String response = new HttpHandler.Builder()
                                    .setUri(wmsUrl)
                                    .setPath("/rpc/pakin/agv/loc/v1")
                                    .setJson(JSON.toJSONString(param))
                                    .build()
                                    .doPost();
                            JSONObject jsonObject = JSON.parseObject(response);
                            if (jsonObject.getInteger("code").equals(200)) {
                                StartupDto dto = jsonObject.getObject("data", StartupDto.class);
                                basAgvMast.setFloorNo(1);
                                basAgvMast.setTaskNo(staProtocol.getWorkNo());
                                basAgvMast.setSourceStaNo(outStaAgv.getStaNo());
                                basAgvMast.setLocNo(dto.getLocNo());
                                basAgvMast.setBarcode("1");
                                basAgvMast.setSourceLocNo("1041");
                                basAgvMast.setDevpId(devp.getId());
                                basAgvMast.setIoType(2);
                                basAgvMastService.insert(basAgvMast);
                                LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no",dto.getLocNo()));
                                locMast.setLocSts("S");
                                locMastService.updateById(locMast);
                                AgvBindCtnrAndBinParam agvBindCtnrAndBinParam = new AgvBindCtnrAndBinParam(basAgvMast);
                                agvBindCtnrAndBinParam.setCtnrCode(basAgvMast.getTimestamp().toString());
                                agvBindCtnrAndBinParam.setCtnrTyp("1");
                                ReturnT<String> resultBind = new PostMesDataUtils().postMesDataAgv("AGV出库容器解绑", AgvConstant.AGV_URL, AgvConstant.AGV_CTNRANDBING, agvBindCtnrAndBinParam);
                                break;
                            }
                        }catch (Exception e){
                            News.error(JSON.toJSONString(e.getMessage()));
                        }
                    }
                    WrkMast wrkMast = wrkMastService.selectByWrkNo(staProtocol.getWorkNo());
                    if(Cools.isEmpty(wrkMast)){
                        continue;
                    }
                    if(wrkMast.getIoType() == 110 ){
                        BasAgvMast basAgvMast = new BasAgvMast();
                        List<BasAgvMast> basAgvMastList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("task_no", staProtocol.getWorkNo()));
                        if(!basAgvMastList.isEmpty()){
                            continue;
                        }
                        try {
                            LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
                            SearchLocParam param = new SearchLocParam();
                            param.setBarcode(staProtocol.getWorkNo().toString());
                            param.setIoType(1);
                            param.setSourceStaNo(outStaAgv.getStaNo());
                            param.setLocType1(locTypeDto.getLocType1());
                            String response = new HttpHandler.Builder()
                                    .setUri(wmsUrl)
                                    .setPath("/rpc/pakin/agv/loc/v1")
                                    .setJson(JSON.toJSONString(param))
                                    .build()
                                    .doPost();
                            JSONObject jsonObject = JSON.parseObject(response);
                            if (jsonObject.getInteger("code").equals(200)) {
                                StartupDto dto = jsonObject.getObject("data", StartupDto.class);
                                basAgvMast.setFloorNo(1);
                                basAgvMast.setTaskNo(staProtocol.getWorkNo());
                                basAgvMast.setSourceStaNo(outStaAgv.getStaNo());
                                basAgvMast.setLocNo(dto.getLocNo());
                                basAgvMast.setBarcode("1");
                                basAgvMast.setSourceLocNo("1041");
                                basAgvMast.setDevpId(devp.getId());
                                basAgvMast.setIoType(2);
                                basAgvMastService.insert(basAgvMast);
                                LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no",dto.getLocNo()));
                                locMast.setLocSts("S");
                                locMastService.updateById(locMast);
                                AgvBindCtnrAndBinParam agvBindCtnrAndBinParam = new AgvBindCtnrAndBinParam(basAgvMast);
                                agvBindCtnrAndBinParam.setCtnrCode(basAgvMast.getTimestamp().toString());
                                agvBindCtnrAndBinParam.setCtnrTyp("1");
                                ReturnT<String> resultBind = new PostMesDataUtils().postMesDataAgv("AGV出库容器解绑", AgvConstant.AGV_URL, AgvConstant.AGV_CTNRANDBING, agvBindCtnrAndBinParam);
                            }
                        }catch (Exception e){
                            News.error(JSON.toJSONString(e.getMessage()));
                        }
                    }
                    if (Cools.isEmpty(wrkMast) || Cools.isEmpty(wrkMast.getTakeNone()) || !wrkMast.getTakeNone().equals("1")){
                        continue;
                    }
@@ -4876,14 +5470,21 @@
                            basAgvMast.setTaskNo(wrkMast.getWrkNo());
                            basAgvMast.setSourceStaNo(outStaAgv.getStaNo());
                            basAgvMast.setLocNo(dto.getLocNo());
                            basAgvMast.setBarcode(wrkMast.getBarcode());
                            basAgvMast.setSourceLocNo(wrkMast.getSourceLocNo());
                            basAgvMast.setDevpId(devp.getId());
                            basAgvMast.setIoType(2);
                            basAgvMastService.insert(basAgvMast);
                            AgvBindCtnrAndBinParam agvBindCtnrAndBinParam = new AgvBindCtnrAndBinParam(basAgvMast);
                            agvBindCtnrAndBinParam.setCtnrCode(basAgvMast.getBarcode());
                            if(basAgvMast.getFloorNo() == 3){
                                LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no",dto.getLocNo()));
                                locMast.setBarcode(wrkMast.getBarcode());
                                locMastService.updateById(locMast);
                            }
                            agvBindCtnrAndBinParam.setCtnrTyp("1");
                            ReturnT<String> resultBind = new PostMesDataUtils().postMesDataAgv("AGV容器绑定", AgvConstant.AGV_URL, AgvConstant.AGV_CTNRANDBING, agvBindCtnrAndBinParam);
                            wrkMast.setTakeNone("2");
                            wrkMastMapper.updateById(wrkMast);
                        } else {
@@ -4908,6 +5509,8 @@
                // 获取入库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(outStaAgv.getStaNo());
                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, 6);
                if (staProtocol == null) {
                    continue;
                } else {
@@ -4919,7 +5522,7 @@
                    continue;
                }
                String barcode = staProtocol.getBarcode();
                String barcode = barcodeThread.getBarcode();//2033
                if(!Cools.isEmpty(barcode)) {
                    if("NG".endsWith(barcode) || "NoRead".equals(barcode) || "0".equals(barcode)) {
//                        News.info("{}号站点扫描器检测条码信息:{}", outStaAgv.getStaNo(), barcode);
@@ -4932,7 +5535,7 @@
                if (staProtocol.isAutoing()) {
                    // 判断重复工作档
                    List<BasAgvMast> basAgvMastList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("source_sta_no", outStaAgv.getStaNo()));
                    List<BasAgvMast> basAgvMastList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("source_sta_no", outStaAgv.getStaNo()).eq("barcode",barcode));
                    if (!basAgvMastList.isEmpty()) {
//                        News.info("{}号站点存在任务执行中,请等待任务执行完毕:{}", outStaAgv.getStaNo(), barcode);
                        continue;
@@ -4940,9 +5543,17 @@
                    if(barcode.equals("0")){
                        continue;
                    }
                    List<LocMast> locMastListFull = locMastService.selectList(new EntityWrapper<LocMast>()
                            .eq("loc_sts", "O")
                            .ge("row1", 28)
                            .le("row1", 31)
                    );
                    if(locMastListFull.isEmpty()){
                        continue;
                    }
                    List<LocMast> locMastList = locMastService.selectList(new EntityWrapper<LocMast>().eq("barcode", barcode));
                    if (!locMastList.isEmpty()) {
                        News.info("{}号站点条码信息重复:{}", outStaAgv.getStaNo(), barcode);
//                        News.info("{}号站点条码信息重复:{}", outStaAgv.getStaNo(), barcode);
                        continue;
                    }
                    // 任务生成区 --------------------------------------------------------------------------
@@ -4967,10 +5578,33 @@
                        JSONObject jsonObject = JSON.parseObject(response);
                        if (jsonObject.getInteger("code").equals(200)) {
                            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
                            basAgvMast.setTaskNo(outStaAgv.getStaNo());
                            List<BasAgvMast> list = basAgvMastService.selectList(
                                    new EntityWrapper<BasAgvMast>()
                                            .eq("source_sta_no", outStaAgv.getStaNo())
                                            .in("task_no", 2033, 2031)
                            );
                            boolean has2033 = false;
                            boolean has2034 = false;
                            for (BasAgvMast mast : list) {
                                if (mast.getTaskNo() == 2033) {
                                    has2033 = true;
                                }
                                if (mast.getTaskNo() == 2031) {
                                    has2034 = true;
                                }
                            }
                            if (has2033 && has2034) {
                                return;
                            } else if (has2033) {
                                basAgvMast.setTaskNo(2031);
                            } else {
                                basAgvMast.setTaskNo(2033);
                            }
                            basAgvMast.setSourceStaNo(outStaAgv.getStaNo());
                            basAgvMast.setLocNo(dto.getLocNo());
                            basAgvMast.setDevpId(devp.getId());
                            basAgvMast.setBarcode(barcode);
                            basAgvMast.setIoType(2);
                            basAgvMast.setFloorNo(2);
@@ -4979,8 +5613,10 @@
                            News.error(JSON.toJSONString(staProtocol));
                        }
                    } catch (Exception e) {
                        News.error(JSON.toJSONString(e.getMessage()));
                        News.error("AGV任务生成异常", e);
                        throw new CoolException("AGV任务生成异常");
                    }
                }
            }
        }
@@ -5013,7 +5649,7 @@
                    // 判断重复工作档
                    List<BasAgvMast> basAgvMastList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("sta_no", inStaAgv.getStaNo()));
                    if (!basAgvMastList.isEmpty()) {
                        News.info("{}号站点存在任务执行中,等待任务执行完毕!!!", inStaAgv.getStaNo());
//                        News.info("{}号站点存在任务执行中,等待任务执行完毕!!!", inStaAgv.getStaNo());
                        continue;
                    }
                    // 任务生成区 --------------------------------------------------------------------------
@@ -5051,6 +5687,7 @@
                            basAgvMast.setStaNo(inStaAgv.getStaNo());
                            basAgvMast.setDevpId(devp.getId());
                            basAgvMast.setFloorNo(floorNo);
                            basAgvMast.setBarcode(locMast.getBarcode());
                            basAgvMast.setIoType(0);//AGV库位==》输送线站点  0
                            basAgvMastService.insert(basAgvMast);
                            break;
@@ -5132,12 +5769,7 @@
                    }
                    if (staProtocol.isAutoing()){
                        AgvBindCtnrAndBinParam agvBindCtnrAndBinParam = new AgvBindCtnrAndBinParam(basAgvMast);
                        agvBindCtnrAndBinParam.setCtnrCode(basAgvMast.getTimestamp().toString());
                        ReturnT<String> resultBind = new PostMesDataUtils().postMesDataAgv("AGV容器绑定", AgvConstant.AGV_URL, AgvConstant.AGV_CTNRANDBING, agvBindCtnrAndBinParam);
                        if (resultBind.getCode()!=200){
                            agvTaskAssignmentCallApiLogSave(basAgvMast, "AGV容器绑定", "任务号:"+basAgvMast.getTaskNo()+"任务信息下发失败!!!", false);
                        }
//
                        AgvTaskAssignmentParam agvTaskAssignmentParam = new AgvTaskAssignmentParam(basAgvMast);
                        //任务下发
@@ -5211,30 +5843,51 @@
                        staProtocol = staProtocol.clone();
                    }
                    if ((!Cools.isEmpty(staProtocol.getWorkNo()) && staProtocol.getWorkNo().equals(basAgvMast.getTaskNo()))
                            ||
                            (basAgvMast.getSourceStaNo().equals(2033))){
                    if ((!Cools.isEmpty(staProtocol.getWorkNo()) && staProtocol.getWorkNo().equals(basAgvMast.getTaskNo())) || basAgvMast.getSourceStaNo().equals(2033)){
                        AgvTaskAssignmentParam agvTaskAssignmentParam = new AgvTaskAssignmentParam(basAgvMast);
                        if(basAgvMast.getFloorNo()==1 || basAgvMast.getStaNo().equals(2034)) {
                            WrkMast wrkMast = wrkMastService.selectByWrkNo(staProtocol.getWorkNo());
                            AgvBindCtnrAndBinParam agvBindCtnrAndBinParam = new AgvBindCtnrAndBinParam(basAgvMast);
                            agvBindCtnrAndBinParam.setCtnrCode(wrkMast.getBarcode());
                            agvBindCtnrAndBinParam.setCtnrTyp("1");
                            ReturnT<String> resultBind = new PostMesDataUtils().postMesDataAgv("AGV容器绑定解绑", AgvConstant.AGV_URL, AgvConstant.AGV_CTNRANDBING, agvBindCtnrAndBinParam);
                            if (resultBind.getCode()==200){
                                //任务下发
                                ReturnT<String> result = new PostMesDataUtils().postMesDataAgv("AGV任务下发", AgvConstant.AGV_URL, AgvConstant.AGV_ADAPTOR, agvTaskAssignmentParam);
                                if (result.getCode()==200){
                                    basAgvMast.setStatus(1);
                                    basAgvMastService.updateById(basAgvMast);
                                } else {
                                    agvTaskAssignmentCallApiLogSave(basAgvMast, "AGV任务下发失败", "任务号:"+basAgvMast.getTaskNo()+"任务信息下发失败!!!", false);
                                }
                        if(basAgvMast.getFloorNo()==1) {
//                            WrkMast wrkMast = wrkMastService.selectByWrkNo(staProtocol.getWorkNo());
//                            AgvBindCtnrAndBinParam agvBindCtnrAndBinParam = new AgvBindCtnrAndBinParam(basAgvMast);
//                            agvBindCtnrAndBinParam.setCtnrCode(basAgvMast.getTimestamp().toString());
//                            agvBindCtnrAndBinParam.setCtnrTyp("1");
//                            ReturnT<String> resultBind = new PostMesDataUtils().postMesDataAgv("AGV容器绑定解绑", AgvConstant.AGV_URL, AgvConstant.AGV_CTNRANDBING, agvBindCtnrAndBinParam);
//                            if (resultBind.getCode()==200){
//                                //任务下发
//                                ReturnT<String> result = new PostMesDataUtils().postMesDataAgv("AGV任务下发", AgvConstant.AGV_URL, AgvConstant.AGV_ADAPTOR, agvTaskAssignmentParam);
//                                if (result.getCode()==200){
//                                    basAgvMast.setStatus(1);
//                                    basAgvMastService.updateById(basAgvMast);
//                                } else {
//                                    agvTaskAssignmentCallApiLogSave(basAgvMast, "AGV任务下发失败", "任务号:"+basAgvMast.getTaskNo()+"任务信息下发失败!!!", false);
//                                }
//                            } else {
//                                agvTaskAssignmentCallApiLogSave(basAgvMast, "AGV容器绑定解绑", "任务号:"+basAgvMast.getTaskNo()+"任务信息下发失败!!!", false);
//                            }
                            //任务下发
                            ReturnT<String> result = new PostMesDataUtils().postMesDataAgv("AGV任务下发", AgvConstant.AGV_URL, AgvConstant.AGV_ADAPTOR, agvTaskAssignmentParam);
                            if (result.getCode()==200){
                                basAgvMast.setStatus(1);
                                basAgvMastService.updateById(basAgvMast);
                            } else {
                                agvTaskAssignmentCallApiLogSave(basAgvMast, "AGV容器绑定解绑", "任务号:"+basAgvMast.getTaskNo()+"任务信息下发失败!!!", false);
                                agvTaskAssignmentCallApiLogSave(basAgvMast, "AGV任务下发失败", "任务号:"+basAgvMast.getTaskNo()+"任务信息下发失败!!!", false);
                            }
                        }else{
                            if (!Cools.isEmpty(basAgvMast.getSourceStaNo())){
                                if (basAgvMast.getSourceStaNo().equals(4006)){
                                    AgvBindCtnrAndBinTwoParam agvBindCtnrAndBinTwoParam = new AgvBindCtnrAndBinTwoParam();
                                    agvBindCtnrAndBinTwoParam.setReqCode(String.valueOf(snowflakeIdWorker.nextId()));
                                    agvBindCtnrAndBinTwoParam.setPodcode(basAgvMast.getBarcode());
                                    agvBindCtnrAndBinTwoParam.setPositionCode(basAgvMast.getSourceStaNo().toString());
                                    agvBindCtnrAndBinTwoParam.setIndBind("1");;
                                    ReturnT<String> resultBind = new PostMesDataUtils().postMesDataArmGrating("AGV容器绑定解绑",
                                            AgvConstant.AGV_URL+"/"+AgvConstant.AGV_hikRpcService,AgvConstant.getAGVADAPTOR(2), agvBindCtnrAndBinTwoParam);
                                    if (resultBind.getCode()!=200){
                                        basAgvMast.setStatus(4);
                                        basAgvMastService.updateById(basAgvMast);
                                    }
                                }
                            }
                            //任务下发
                            ReturnT<String> result = new PostMesDataUtils().postMesDataAgv("AGV任务下发", AgvConstant.AGV_URL, AgvConstant.AGV_ADAPTOR, agvTaskAssignmentParam);
                            if (result.getCode()==200){