#
lsh
2024-06-21 e3239cbdfb12aa1d44128470f011714c30a98c76
#
5个文件已修改
2404 ■■■■ 已修改文件
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 2142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/JarSlave.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/JarThread.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -620,62 +620,6 @@
    }
    /**
     * 组托
     * 入库站,根据条码扫描通知桁架码垛
     */
    public synchronized void generateStoreWrkFileFull2LouM() {
        // 根据输送线plc遍历
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历码垛口
            for (DevpSlave.Sta driveSta : devp.getDriveSta()) {
                // 获取条码扫描仪信息
                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, driveSta.getBarcode());
                if (barcodeThread == null) {
                    continue;
                }
                String barcode = barcodeThread.getBarcode();
                if (!Cools.isEmpty(barcode) && !barcode.equals("") && !barcode.equals("      ")) {
                    if ("NG".endsWith(barcode) || "NoRead".equals(barcode)) {
                        continue;
                    }
                } else {
                    continue;
                }
                // 获取码垛口信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(driveSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
                        && staProtocol.isInEnable()
                        && staProtocol.isEmptyMk()
                        && (staProtocol.getWorkNo() == 0 || (staProtocol.getWorkNo()>9899 && staProtocol.getWorkNo()<10000) )
                ) {
                    try {
                        BasDevp basDevp = basDevpService.selectById(driveSta.getStaNo());
                        if (basDevp.getReportSign()>0){
                            continue;
                        }
                        basDevp.setBarcode(barcode);
                        basDevp.setReportSign(1);
                        basDevpService.updateById(basDevp);
                    } catch (Exception e) {
                        e.printStackTrace();
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    }
                }
            }
        }
    }
    /**
     * wms入库
     * 入库站,根据条码扫描生成入库工作档,工作状态 1 ==>> 2
     */
@@ -1029,164 +973,6 @@
        }
    }
    /**
     * 2楼212呼叫空板
     */
    public synchronized void stnToCrnStnPick3Auto(Integer sign) {
        try{
            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 2);
            StaProtocol staProtocol = devpThread.getStation().get(212);
            if (staProtocol == null) {
                return;
            } else {
                staProtocol = staProtocol.clone();
            }
            if (staProtocol.isAutoing() && !staProtocol.isLoading() && staProtocol.getWorkNo()==0 ){
                switch (sign){
                    //执行小车货物搬运任务
                    case 1:
                    case 4:
                        stnToCrnStnPick3();
                        return;
                    //执行小车空板搬运任务
                    case 2://放//拆盘
                    case 5://放//拆盘
                        stnToCrnStnPick4();
                        return;
                    default:
                        return;
                }
            } else if (staProtocol.isAutoing() && staProtocol.isLoading()){
                switch (sign){
                    case 3://满放
                    case 6://满放
                        stnToCrnStnPick5();
                        return;
                    default:
                        return;
                }
            }
        }catch (Exception e){
            log.error("2楼212呼叫空板"+e);
        }
    }
    /**
     * 2楼212呼叫空板
     */
    public synchronized void stnToCrnStnPick3() {
        WrkMast wrkMast = wrkMastMapper.selectWrkMastUnstackingOne212();
        if (Cools.isEmpty(wrkMast) || wrkMast.getWrkSts()!=61){//61、等待空板
            return;
        }
        for (DevpSlave devp : slaveProperties.getDevp()) {
            for (DevpSlave.Sta driveSta : devp.getDriveSta()) {
                if (driveSta.getStaNo()!=215){
                    continue;
                }
                // 获取拣料入库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(driveSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo()==0
                        || (staProtocol.getWorkNo()>9899 && staProtocol.getWorkNo()<10000)) ){
                    boolean result1 = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol));
                    staProtocol.setWorkNo(wrkMast.getWrkNo()-1);
                    staProtocol.setStaNo(driveSta.getStaNo()==215? 217:221);
                    boolean result2 = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                    if (!result2) {
                        log.error("发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId());
                    }
                    wrkMast.setWrkSts(62L);
                    wrkMastMapper.updateById(wrkMast);
                    boolean result3 = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(4, staProtocol));
                    return;
                }
            }
        }
    }
    /**
     * 2楼212呼叫空板
     */
    public synchronized void stnToCrnStnPick4() {
        WrkMast wrkMast = wrkMastMapper.selectWrkMastUnstackingOne212();
        if (Cools.isEmpty(wrkMast) || wrkMast.getWrkSts()!=62){//62、等待小车搬运
            return;
        }
        for (DevpSlave devp : slaveProperties.getDevp()) {
            for (DevpSlave.Sta driveSta : devp.getInSta()) {
                if (driveSta.getStaNo()!=217){
                    continue;
                }
                // 获取拣料入库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(driveSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                StaProtocol staProtocol212 = devpThread.getStation().get(212);
                if (staProtocol212 == null) {
                    continue;
                } else {
                    staProtocol212 = staProtocol212.clone();
                }
                if (staProtocol212.isAutoing() && !staProtocol212.isLoading() && staProtocol212.getWorkNo()==0){
                    if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo()==0
                            || (staProtocol.getWorkNo()>9899 && staProtocol.getWorkNo()<10000) || staProtocol.getWorkNo()==wrkMast.getWrkNo()-1) ){
//                        boolean result1 = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol));
                        staProtocol.setWorkNo(wrkMast.getWrkNo());
                        staProtocol.setStaNo(212);
                        boolean result2 = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        if (!result2) {
                            log.error("发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId());
                        }
                        wrkMast.setWrkSts(63L);
                        wrkMastMapper.updateById(wrkMast);
//                        boolean result3 = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(4, staProtocol));
                        return;
                    }
                }
            }
        }
    }
    /**
     * 2楼212呼叫空板
     */
    public synchronized void stnToCrnStnPick5() {
        WrkMast wrkMast = wrkMastMapper.selectWrkMastUnstackingOne212();
        if (Cools.isEmpty(wrkMast) || wrkMast.getWrkSts()!=63){//63、等待完成
            return;
        }
        // 获取拣料入库站信息
        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 2);
        StaProtocol staProtocol = devpThread.getStation().get(212);
        if (staProtocol == null) {
            return;
        } else {
            staProtocol = staProtocol.clone();
        }
        if (staProtocol.isAutoing() && staProtocol.isLoading()){
//            boolean result1 = MessageQueue.offer(SlaveType.Devp, 2, new Task(3, staProtocol));
            wrkMast.setWrkSts(64L);
            wrkMastMapper.updateById(wrkMast);
//            boolean result3 = MessageQueue.offer(SlaveType.Devp, 2, new Task(4, staProtocol));
            return;
        }
    }
    /**
     * 拣料、并板、盘点再入库  拆垛位置
     */
@@ -1776,126 +1562,6 @@
        }
    }
    /**
     * 搜索RGV车。通过目标站搜索哪台车可用
     */
    public synchronized Integer searchRgvNo(Integer staNo) {
        try{
            BasDevp basDevp = basDevpService.selectById(staNo);
            if (basDevp == null) {
                return null;//目标站不存在
            }
            //路径值
            int path = basDevp.getLocType3().intValue();
            ArrayList<RgvThread> list = new ArrayList<>();
            for (RgvSlave rgv : slaveProperties.getRgv()) {
                // 获取RGV信息
                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尚未在数据库进行维护!", rgv.getId());
                    continue;
                }
                list.add(rgvThread);
            }
            if (list.size() > 1) {
                //超过两台车,按照配置的规则进行分配
                for (RgvThread rgvThread : list) {
                    //获取车辆配置的路径规则
                    BasRgvPath basRgvPath = basRgvPathService.selectByRgvNo(rgvThread.getSlave().getId());
                    if (basRgvPath == null) {
                        continue;
                    }
                    //目标站是否包含当前路径中
                    List<Integer> rgvPath = JSON.parseArray(basRgvPath.getPath(), Integer.class);
                    if (rgvPath.contains(path)) {
                        //当前路径中包含目标站,则选定这台车
                        return rgvThread.getSlave().getId();
                    }
                }
            }else {
                //小于或等于1台车,分配全路径
                BasRgvPath basRgvPath = basRgvPathService.selectByRgvNo(0);//获取默认路径
                if (basRgvPath == null) {
                    return null;
                }
                List<Integer> rgvPath = JSON.parseArray(basRgvPath.getPath(), Integer.class);
                if (rgvPath.contains(path)) {
                    //当前路径中包含目标站,则选定这台车
                    return list.get(0).getSlave().getId();
                }
            }
            return null;
        }catch (Exception e){
            log.error("搜索RGV车。通过目标站搜索哪台车可用"+e);
            return null;
        }
    }
    /**
     * 回原点,堆垛机没有执行中任务,设备存在入库任务时叫回原点
     */
    public synchronized void crnRebackHp(CrnProtocol crnProtocol, CrnThread crnThread) {
//        for (CrnSlave crn : slaveProperties.getCrn()) {
//            // 获取堆垛机信息
//            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
//            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
//            if (crnProtocol == null) {
//                continue;
//            }
//            BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
//            if (basCrnp == null) {
//                log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId());
//                continue;
//            }
        if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
            if (crnProtocol.getBay() == 1 && crnProtocol.getLevel() == 1) {
                return;
            }
            // 已经存在吊车执行任务时,则过滤3,12
            if (wrkMastMapper.selectWorking(crnProtocol.getCrnNo()) != null) {
                return;
            }
            //堆垛机有执行中任务,过滤3,4,11,12
            if (wrkMastMapper.selectCrnWorking(crnProtocol.getCrnNo()) != null) {
                return;
            }
            //输送线没有入库任务,过滤2
            if (wrkMastMapper.selectDevWorking(crnProtocol.getCrnNo()) == null) {
                return;
            }
            log.info("堆垛机召回原点==>>" + crnProtocol.getCrnNo() + "号堆垛机有入库任务,召回原点");
            // 命令下发区 --------------------------------------------------------------------------
            CrnCommand crnCommand = new CrnCommand();
            crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号
            crnCommand.setTaskNo((short) 63333); // 工作号
            crnCommand.setAckFinish((short) 0);  // 任务完成确认位
            crnCommand.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式:  回原点
            crnCommand.setSourcePosX((short) 0);     // 源库位排
            crnCommand.setSourcePosY((short) 0);     // 源库位列
            crnCommand.setSourcePosZ((short) 0);     // 源库位层
            crnCommand.setDestinationPosX((short) 0);     // 目标库位排
            crnCommand.setDestinationPosY((short) 0);     // 目标库位列
            crnCommand.setDestinationPosZ((short) 0);     // 目标库位层
            if (!MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, crnCommand))) {
                log.error("堆垛机回原点命令下发失败,堆垛机号={},任务数据={}", crnProtocol.getCrnNo(), JSON.toJSON(crnCommand));
            }
            crnThread.setBackHpFlag(true);
        }
//        }
    }
    /**
     * 入库  ===>>  堆垛机站到库位
@@ -3170,148 +2836,6 @@
            }
        }
    }
    /**
     * 查找工作状态为2(设备上走),且RGV入库接驳站符合的的入库工作档,提取出最多2笔
     * @param slave
     * @return
     */
    public synchronized List<WrkMast> getRgvInTask(RgvSlave slave){
        List<WrkMast> wrkMastTask = new ArrayList<>();
        List<Integer> staNos = new ArrayList<>();
        for (RgvSlave.RgvStn rgvStn : slave.getRgvInSStn()) {
            staNos.add(rgvStn.getStaNo());
        }
        if(staNos.size() < 1){
            return null;
        }
        List<WrkMast> wrkMasts = wrkMastMapper.selectRgvInStep1(slave.getId(), staNos);
        for(WrkMast wrkMast : wrkMasts){
            Integer plcId = 0;
            for (RgvSlave.RgvStn rgvStn : slave.getRgvInSStn()) {
                if(rgvStn.getStaNo() == wrkMast.getRgvSstaNo()){
                    plcId = rgvStn.getDevpPlcId();
                    break;
                }
            }
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, plcId);
            //判断RGV入库源站点,自动、有物,有任务号,可出
            boolean flag1 = false;
            StaProtocol staProtocol1 = devpThread.getStation().get(wrkMast.getRgvSstaNo());
            if (staProtocol1 == null) {
                continue;
            } else {
                staProtocol1 = staProtocol1.clone();
            }
            // 查询站点详细信息
            BasDevp staDetl1 = basDevpService.selectById(wrkMast.getRgvSstaNo());
            if (staDetl1 == null) {
                log.error("RGV入库 ===>> 输送机源站点在数据库不存在, 站点编号={}", wrkMast.getRgvSstaNo());
                continue;
            }
            if (staProtocol1.isAutoing() && staProtocol1.isLoading() && staProtocol1.getWorkNo().intValue() == wrkMast.getWrkNo()
                    && staProtocol1.isOutEnable() && staDetl1.getOutEnable() != null && staDetl1.getOutEnable().equals("Y")) {
                flag1 = true;
            }
            //判断RGV入库目标站点,自动、无物,没有任务号,可入
            boolean flag2 = false;
            StaProtocol staProtocol2 = devpThread.getStation().get(wrkMast.getRgvDstaNo());
            if (staProtocol2 == null) {
                continue;
            } else {
                staProtocol2 = staProtocol2.clone();
            }
            // 查询站点详细信息
            BasDevp staDetl2 = basDevpService.selectById(wrkMast.getRgvSstaNo());
            if (staDetl2 == null) {
                log.error("RGV入库 ===>> 输送机源站点在数据库不存在, 站点编号={}", wrkMast.getRgvSstaNo());
                continue;
            }
            if (staProtocol2.isAutoing() && staProtocol2.isLoading() && staProtocol2.getWorkNo().intValue() == wrkMast.getWrkNo()
                    && staProtocol2.isInEnable() && staDetl2.getCanining() != null && staDetl2.getCanining().equals("Y")) {
                flag2 = true;
            }
            if(flag1 && flag2){
                wrkMastTask.add(wrkMast);
                if(wrkMastTask.size() >= 2) break;
            }
        }
        return wrkMastTask;
    }
    /**
     * 查找工作状态为14(出库完成),且RGV出库接驳站符合的的出库工作档,提取出最多2笔
     * @param slave
     * @return
     */
    public synchronized List<WrkMast> getRgvOutTask(RgvSlave slave){
        List<WrkMast> wrkMastTask = new ArrayList<>();
        List<Integer> staNos = new ArrayList<>();
        for (RgvSlave.RgvStn rgvStn : slave.getRgvOutSStn()) {
            staNos.add(rgvStn.getStaNo());
        }
        if(staNos.size() < 1){
            return null;
        }
        List<WrkMast> wrkMasts = wrkMastMapper.selectRgvOutStep1(slave.getId(), staNos);
        for(WrkMast wrkMast : wrkMasts){
            Integer plcId = 0;
            for (RgvSlave.RgvStn rgvStn : slave.getRgvOutSStn()) {
                if(rgvStn.getStaNo() == wrkMast.getRgvSstaNo()){
                    plcId = rgvStn.getDevpPlcId();
                    break;
                }
            }
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, plcId);
            //判断RGV出库源站点,自动、有物,有任务号,可出
            boolean flag1 = false;
            StaProtocol staProtocol1 = devpThread.getStation().get(wrkMast.getRgvSstaNo());
            if (staProtocol1 == null) {
                continue;
            } else {
                staProtocol1 = staProtocol1.clone();
            }
            // 查询站点详细信息
            BasDevp staDetl1 = basDevpService.selectById(wrkMast.getRgvSstaNo());
            if (staDetl1 == null) {
                log.error("RGV出库 ===>> 输送机源站点在数据库不存在, 站点编号={}", wrkMast.getRgvSstaNo());
                continue;
            }
            if (staProtocol1.isAutoing() && staProtocol1.isLoading() && staProtocol1.getWorkNo().intValue() == wrkMast.getWrkNo()
                    && staProtocol1.isOutEnable() && staDetl1.getOutEnable() != null && staDetl1.getOutEnable().equals("Y")) {
                flag1 = true;
            }
            //判断RGV出库目标站点,自动、无物,没有任务号,可入
            boolean flag2 = false;
            StaProtocol staProtocol2 = devpThread.getStation().get(wrkMast.getRgvDstaNo());
            if (staProtocol2 == null) {
                continue;
            } else {
                staProtocol2 = staProtocol2.clone();
            }
            // 查询站点详细信息
            BasDevp staDetl2 = basDevpService.selectById(wrkMast.getRgvSstaNo());
            if (staDetl2 == null) {
                log.error("RGV出库 ===>> 输送机源站点在数据库不存在, 站点编号={}", wrkMast.getRgvSstaNo());
                continue;
            }
            if (staProtocol2.isAutoing() && staProtocol2.isLoading() && staProtocol2.getWorkNo().intValue() == wrkMast.getWrkNo()
                    && staProtocol2.isInEnable() && staDetl2.getCanining() != null && staDetl2.getCanining().equals("Y")) {
                flag2 = true;
            }
            if(flag1 && flag2){
                wrkMastTask.add(wrkMast);
                if(wrkMastTask.size() >= 2) break;
            }
        }
        return wrkMastTask;
    }
    /**
@@ -4612,27 +4136,6 @@
        }
    }
//    /**
//     * 初始化RGV地图
//     */
//    public synchronized void initRgvMap() {
//        Object data = redisUtil.get("rgv_map");
//        if (data == null) {
//            //重新获取全路径地图
//            BasRgvPath basRgvPath = basRgvPathService.selectByRgvNo(0);//获取默认路径
//            if (basRgvPath != null) {
//                ArrayList<RgvNode> rgvNodes = new ArrayList<>();
//                List<Integer> rgvPath = JSON.parseArray(basRgvPath.getPath(), Integer.class);
//                for (Integer integer : rgvPath) {
//                    RgvNode rgvNode = new RgvNode(integer);
//                    rgvNodes.add(rgvNode);
//                }
//                //将数据库地图数据存入redis
//                redisUtil.set("rgv_map", JSON.toJSONString(rgvNodes));
//            }
//        }
//    }
    /**
     * 堆垛机演示  ===>> 库位移转
     */
@@ -4731,1552 +4234,6 @@
            log.error("堆垛机演示  ===>> 库位移转失败", e);
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    /**
     * 堆垛机命令下发后,异步修改工作档状态
     */
    public synchronized void crnIoWrkMast() {
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) {
                continue;
            }
            Date now = new Date();
            // 堆垛机正在运行
            if (crnProtocol.getStatusType() != CrnStatusType.IDLE && crnProtocol.getTaskNo() != 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
                // 获取工作档
                WrkMast wrkMast = wrkMastMapper.selectById(crnProtocol.getTaskNo());
                if (wrkMast == null) {
                    continue;
                }
                // 入库
                if (wrkMast.getWrkSts() == 1 || wrkMast.getWrkSts() == 2) {
                    log.warn("堆垛机非空闲情况下,开始修改工作档状态。[id:{},时间:{}] >>>>> 堆垛机当前状态为:{}。任务号:{}", crn.getId(), DateUtils.convert(now, DateUtils.yyyyMMddHHmmsssss_F), crnProtocol.getStatusType().desc, crnProtocol.getTaskNo());
                    // 修改工作档状态 2.设备上走 => 3.吊车入库中
                    wrkMast.setWrkSts(3L);
                    wrkMast.setCrnStrTime(now);
                    wrkMast.setModiTime(now);
                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                        log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo());
                    }
                    log.warn("修改工作档状态成功。[时间:{}] >>>>> 任务号:{}", DateUtils.convert(now, DateUtils.yyyyMMddHHmmsssss_F), wrkMast.getWrkNo());
                }
                // 出库、移库
                if (wrkMast.getWrkSts() == 11) {
                    log.warn("堆垛机非空闲情况下,开始修改工作档状态。[id:{},时间:{}] >>>>> 堆垛机当前状态为:{}。任务号:{}", crn.getId(), DateUtils.convert(now, DateUtils.yyyyMMddHHmmsssss_F), crnProtocol.getStatusType().desc, crnProtocol.getTaskNo());
                    // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                    wrkMast.setWrkSts(12L);
                    wrkMast.setCrnStrTime(now);
                    wrkMast.setModiTime(now);
                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                        log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo());
                    }
                    log.warn("修改工作档状态成功。[时间:{}] >>>>> 任务号:{}", DateUtils.convert(now, DateUtils.yyyyMMddHHmmsssss_F), wrkMast.getWrkNo());
                }
            }
        }
    }
    /**
     * 入出库模式切换函数
     */
    public synchronized void ioConvert() {
        try {
            // 根据输送线plc遍历
            for (DevpSlave devp : slaveProperties.getDevp()) {
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                for (DevpSlave.Sta inSta : devp.getInSta()) {
                    if (inSta.getStaNo() == 2) {
                        continue;
                    }
                    WrkMast pakout = wrkMastMapper.selectWorkingPakout(inSta.getStaNo());
                    switch (inSta.getStaNo()) {
                        case 203://1F
                            if (pakout != null) {
                                if (devpThread.ioModeOf2F != IoModeType.PAKOUT_MODE) {
                                    // 出库切换中
                                    devpThread.ioModeOf2F = IoModeType.PAKOUT_BOOTING;
                                    WrkMast pakin = wrkMastMapper.selectWorkingPakin(inSta.getStaNo());
                                    if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading()
                                            && !devpThread.getStation().get(inSta.getStaNo() + 1).isLoading()
                                            && devpThread.getStation().get(inSta.getStaNo() + 1).getWorkNo() == 0) {
                                        // 出库模式
                                        devpThread.ioModeOf2F = IoModeType.PAKOUT_MODE;
                                    }
                                }
                            } else {
                                // 入库模式
                                devpThread.ioModeOf2F = IoModeType.PAKIN_MODE;
                            }
                            break;
                        case 401://1F
                            if (pakout != null) {
                                if (devpThread.ioModeOf4F != IoModeType.PAKOUT_MODE) {
                                    // 出库切换中
                                    devpThread.ioModeOf4F = IoModeType.PAKOUT_BOOTING;
                                    WrkMast pakin = wrkMastMapper.selectWorkingPakin(inSta.getStaNo());
                                    if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading()
                                            && !devpThread.getStation().get(inSta.getStaNo() + 1).isLoading()
                                            && devpThread.getStation().get(inSta.getStaNo() + 1).getWorkNo() == 0) {
                                        // 出库模式
                                        devpThread.ioModeOf4F = IoModeType.PAKOUT_MODE;
                                    }
                                }
                            } else {
                                // 入库模式
                                devpThread.ioModeOf4F = IoModeType.PAKIN_MODE;
                            }
                            break;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
//    /**
//     * 其他  ===>> 码垛位自动补充空板:驱动拆盘机输出托盘
//     */
//    public synchronized void dischargingMachineOutputTray() {
//        try {
//            List<WrkMast> wrkMasts = wrkMastMapper.selectDischargingMachineOutputTray();
//            if (Cools.isEmpty(wrkMasts) || wrkMasts.size()>3){
//                return;
//            }
//
//            // 获取入库站信息
//            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
//            StaProtocol staProtocol = devpThread.getStation().get(213);
//            if (staProtocol == null) {
//                log.error("码垛位自动补充空板:驱动拆盘机输出托盘,任务下发失败,站点查询失败");
//                return;
//            } else {
//                staProtocol = staProtocol.clone();
//            }
//
//            if (!staProtocol.isLoading()){
//                log.info("码垛位自动补充空板:驱动拆盘机输出托盘,任务下发失败,站点无物,正在自动调出空板!");
//                int i = wrkMastMapper.selectConfigCount10468N();
//                if (i==1){
//                    wrkMastMapper.updateConfig10468Y();
//                }
//                return;
//            }else {
//                int i = wrkMastMapper.selectConfigCount10468N();
//                if (i==0){
//                    return;
//                }
//            }
//            StaProtocol staProtocol214 = devpThread.getStation().get(214);
//            // 判断是否满足入库条件
//            if (staProtocol.isAutoing() && staProtocol.getWorkNo() == 0 && staProtocol.isPakMk() && staProtocol214.getWorkNo()==0) {
//                staProtocol.setWorkNo((short)9999);
//                staProtocol.setStaNo((short)214);
//                devpThread.setPakMk(staProtocol.getSiteId(), false);
//                boolean result = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol));
//                if (!result) {
//                    throw new CoolException("更新plc站点信息失败==>码垛位自动补充空板:驱动拆盘机输出托盘!");
//                }
//                log.info("码垛位自动补充空板:驱动拆盘机输出托盘,任务下发成功:工作号9999、目标站214!");
//            }else {
//                log.error("码垛位自动补充空板:驱动拆盘机输出托盘,任务下发失败,站点状态不符合!");
//            }
//        }catch (Exception e){
//            e.printStackTrace();
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//        }
//    }
//    /**
//     * 其他  ===>> 拆盘机处空板扫码,驱动托盘向码垛位,不入库
//     */
//    public synchronized void scanBarcodeEmptyBoard() {
//        try {
//
//        }catch (Exception e){
//            e.printStackTrace();
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//        }
//    }
    /**
     * 其他  ===>> 码垛完成驱动托盘进入下一步(入库前扫码)
     */
    public synchronized void stackingCompletionDriveTray() {
        try {
            int[] staNos=new int[]{215,219};//(2楼两个入库码垛站)
            for (int staNo : staNos){
                BasDevp basDevp = basDevpService.selectById(staNo);
                if ((basDevp.getWrkNo()!=0 && (basDevp.getWrkNo()<9900 || basDevp.getWrkNo()>9999)) || Cools.isEmpty(basDevp.getBarcode())){
                    continue;
                }
                Integer zpallet = waitPakinMapper.selectCount(new EntityWrapper<WaitPakin>().eq("zpallet", basDevp.getBarcode()).eq("status","N"));
                if (zpallet<=0){
                    continue;
                }
                // 获取入库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 入出库模式判断
//                if ( inSta.getStaNo()==203 && devpThread.ioModeOf2F != IoModeType.PAKIN_MODE) { continue; }
//                if (inSta.getStaNo() == 203 && devpThread.ioModeOf2F == IoModeType.PAKOUT_MODE) {
//                    continue;
//                }
                if (!staProtocol.isLoading()){
                    log.info("{}站点无物,正在自动调出空板!",staNo);
                    continue;
                }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
                        && staProtocol.isInEnable()
                        && !staProtocol.isEmptyMk()
                        && (basDevp.getWrkNo()==0 || (basDevp.getWrkNo()>=9900 && basDevp.getWrkNo()<=9999))
                ) {//&& staProtocol.isPakMk() && !Cools.isEmpty(barcode)) {
                    int workNo = commonService.getWorkNo(5);
                    staProtocol.setWorkNo(workNo);
                    staProtocol.setStaNo(staNo + 2);
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol));
                    if (!result) {
                        throw new CoolException("更新plc站点信息失败==>驱动码垛位托盘前进失败!");
                    }
                }
            }
        }catch (Exception e){
//            e.printStackTrace();
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            log.error("其他  ===>> 码垛完成驱动托盘进入下一步(入库前扫码)"+e);
        }
    }
    /**
     * 其他  ===>> 码垛完成驱动托盘进入下一步
     */
    public synchronized void stackingCompletionDriveTray2() {
        try {
            int[] staNos=new int[]{131,135};//(2个入库站点,1楼2个出库码垛站,根据现场修改)
            for (int staNo : staNos){
                BasDevp basDevp = basDevpService.selectById(staNo);
                if (Cools.isEmpty(basDevp) || basDevp.getReportSign()!=1){
                    continue;
                }
                if (basDevp.getWrkNo()!=0 && (basDevp.getWrkNo()<9900 || basDevp.getWrkNo()>9999)){
                    continue;
                }
                WrkMast wrkMast = wrkMastMapper.selectWrkMastUnstackingOne202(staNo);
                if (Cools.isEmpty(wrkMast)){
                    continue;
                }
                // 获取站点信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 入出库模式判断
//                if ( inSta.getStaNo()==203 && devpThread.ioModeOf2F != IoModeType.PAKIN_MODE) { continue; }
//                if (inSta.getStaNo() == 203 && devpThread.ioModeOf2F == IoModeType.PAKOUT_MODE) {
//                    continue;
//                }
                if (!staProtocol.isLoading()){
                    log.info("{}站点无物,异常!",staNo);
                    continue;
                }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
                        && staProtocol.isInEnable()
                        && (staProtocol.getWorkNo() == 0 || (staProtocol.getWorkNo()>9899 && staProtocol.getWorkNo()<10000))
                ) {//&& staProtocol.isPakMk() && !Cools.isEmpty(barcode)) {
                    //任务完成
                    boolean result1 = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(3, staProtocol));
                    Thread.sleep(100);
                    staProtocol.setWorkNo(wrkMast.getWrkNo());
                    staProtocol.setStaNo(144);
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol));
                    if (!result) {
                        throw new CoolException("更新plc站点信息失败==>驱动码垛位托盘前进失败!");
                    }
                    wrkMast.setWrkSts(52L);
                    wrkMastMapper.updateById(wrkMast);
                    Thread.sleep(100);
                    //任务完成
                    boolean result2 = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(4, staProtocol));
                }
            }
        }catch (Exception e){
//            e.printStackTrace();
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            log.error("其他  ===>> 码垛完成驱动托盘进入下一步"+e);
        }
    }
    /**
     * 其他  ===>> 码垛完成驱动托盘进入下一步
     */
    public synchronized void stackingCompletionDriveTrayOk2() {
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历拣料入库口
            for (DevpSlave.Sta pickSta : devp.getPickSta2()) {
                // 获取拣料入库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isPakMk()  && staProtocol.getWorkNo()!=0 && staProtocol.isOutEnable()) {//
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep3(staProtocol.getWorkNo());
                    if (wrkMast == null) {
                        log.error("站点号"+staProtocol.getSiteId()+"未查询到工作档案!");
                        // 无拣料数据
                        continue;
                    }
                    if (Cools.isEmpty(wrkMast.getSheetNo()) || !wrkMast.getSheetNo().equals("2") || wrkMast.getIoType()<100 || wrkMast.getWrkSts()!=14){
                        continue;
                    }
                    if (wrkMast.getIoType()==101){
                        //任务完成
                        boolean result1 = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(3, staProtocol));
                        wrkMast.setSheetNo("3");
                        wrkMastMapper.updateById(wrkMast);
                    }else {
                        if ((wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 107)
                                || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo())) {
                            continue;
                        }
                        //任务完成
                        boolean result1 = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(3, staProtocol));
                        wrkMast.setSheetNo("3");
                        wrkMastMapper.updateById(wrkMast);
                        try{
                            Thread.sleep(100);
                        }catch (Exception e){
                        }
                        boolean result2 = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(4, staProtocol));
                    }
                }
            }
        }
    }
    /**
     * 其他  ===>> 贴标完成驱动托盘进入下一步
     */
    public synchronized void stackingCompletionDriveTray3() {
        try {
            int[] staNos=new int[]{144};//(1楼1个贴标位,根据现场修改)
            for (int staNo : staNos){
                BasDevp basDevp = basDevpService.selectById(staNo);
                if ((basDevp.getWrkNo()<9900 || basDevp.getWrkNo()>9999) && basDevp.getWrkNo()!=32222){
                    continue;
                }
                WrkMast wrkMast = wrkMastMapper.selectWrkMastUnstackingOne202(staNo);
                if (Cools.isEmpty(wrkMast)){
                    continue;
                }
                // 获取站点信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 入出库模式判断
//                if ( inSta.getStaNo()==203 && devpThread.ioModeOf2F != IoModeType.PAKIN_MODE) { continue; }
//                if (inSta.getStaNo() == 203 && devpThread.ioModeOf2F == IoModeType.PAKOUT_MODE) {
//                    continue;
//                }
                if (!staProtocol.isLoading()){
                    log.info("{}站点无物,异常!",staNo);
                    continue;
                }
                if (!staProtocol.getWorkNo().equals(wrkMast.getWrkNo())){
                    log.info("站点工作号={} 与贴标工作号={} 不一致,异常!",staProtocol.getWorkNo(),wrkMast.getWrkNo().shortValue());
                }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
                ) {//&& staProtocol.isPakMk() && !Cools.isEmpty(barcode)) {
                    staProtocol.setWorkNo(wrkMast.getWrkNo());
                    staProtocol.setStaNo(wrkMast.getStaNo());
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol));
                    if (!result) {
                        throw new CoolException("更新plc站点信息失败==>驱动码垛位托盘前进失败!");
                    }
                    wrkMast.setWrkSts(55L);
                    wrkMastMapper.updateById(wrkMast);
                }
            }
        }catch (Exception e){
//            e.printStackTrace();
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            log.error("其他  ===>> 贴标完成驱动托盘进入下一步"+e);
        }
    }
    /**
     * 其他  ===>> 退货码垛完成托盘继续下一步
     */
    public synchronized void stackingCompletionDriveTrayOk3() {
        try {
            int[] staNos=new int[]{118};
            for (int staNo : staNos){
                BasDevp basDevp = basDevpService.selectById(staNo);
                if (Cools.isEmpty(basDevp) || basDevp.getWrkNo()!=0 || basDevp.getReportSign()!=3){
                    continue;
                }
                WrkMast wrkMast = wrkMastMapper.selectWrkMastUnstackingOne145(145);
                if (Cools.isEmpty(wrkMast)){
                    continue;
                }
                // 获取站点信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                StaProtocol staProtocol147 = devpThread.getStation().get(147);
                if (staProtocol147 == null) {
                    continue;
                } else {
                    staProtocol147 = staProtocol147.clone();
                }
                if (!staProtocol.isLoading()){
                    log.info("{}站点无物,异常!",staNo);
                    continue;
                }
                if (staProtocol147.isLoading()){
                    log.info("{}站点有物!",staProtocol147.getSiteId());
                    continue;
                }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
                        && !staProtocol.isEmptyMk()
                ) {
                    boolean result3 = MessageQueue.offer(SlaveType.Devp, 1, new Task(3, staProtocol147));
                    staProtocol.setWorkNo(wrkMast.getWrkNo());
                    staProtocol.setStaNo(wrkMast.getStaNo());
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol));
                    if (!result) {
                        throw new CoolException("更新plc站点信息失败==>驱动码垛位托盘前进失败!");
                    }
                    wrkMast.setSheetNo("5");
                    wrkMastMapper.updateById(wrkMast);
                    boolean result4 = MessageQueue.offer(SlaveType.Devp, 1, new Task(3, staProtocol147));
                }
            }
        }catch (Exception e){
//            e.printStackTrace();
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            log.error("其他  ===>> 退货码垛完成托盘继续下一步"+e);
        }
    }
    /**
     * 其他  ===>> 拆垛完成继续下一步  运行途中自动避让空板
     */
    public synchronized void stackingCompletionDriveTray4() {
        try {
            int[] staNos=new int[]{134};//(134有任务,135空闲,则避让)
            for (int staNo : staNos){
                BasDevp basDevp = basDevpService.selectById(staNo);
                BasDevp basDevp135 = basDevpService.selectById(135);
                if (basDevp.getWrkNo()==0 || (basDevp.getWrkNo()<10000 && basDevp.getWrkNo()>9899) ){
                    continue;
                }
                if (basDevp135.getReportSign()!=0){
                    continue;
                }
                WrkMast wrkMast131 = wrkMastMapper.selectWrkMastUnstackingOne202Two(131);
                if (Cools.isEmpty(wrkMast131)){
                    continue;
                }
                // 获取站点信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                StaProtocol staProtocol135 = devpThread.getStation().get(135);
                if (staProtocol135 == null) {
                    continue;
                } else {
                    staProtocol135 = staProtocol135.clone();
                }
                if (staProtocol135.getWorkNo()<9900 || staProtocol135.getWorkNo()>9999 || staProtocol135.getWorkNo()==0
                        || !staProtocol135.isLoading() || !staProtocol135.isAutoing()){
                    continue;
                }
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (!staProtocol.isLoading()){
                    continue;
                }
//                if (!staProtocol.getWorkNo().equals(wrkMast131.getWrkNo())){
//                    log.info("站点工作号={} 与贴标工作号={} 不一致,异常!",staProtocol.getWorkNo(),wrkMast131.getWrkNo().shortValue());
//                }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
                        && basDevp.getReportSign()==0
                ) {//&& staProtocol.isPakMk() && !Cools.isEmpty(barcode)) {
//                    if (true){
//                        return;
//                    }
                    //任务完成
                    boolean result1 = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(3, staProtocol135));
                    try{
                        Thread.sleep(100);
                    }catch (Exception e){ }
                    basDevp135.setReportSign(2);
                    basDevpService.updateById(basDevp135);
                    int workNo = commonService.getWorkNo(5);
                    staProtocol135.setWorkNo(workNo);
                    staProtocol135.setStaNo(144);
                    devpThread.setPakMk(staProtocol135.getSiteId(), false);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol135));
                    if (!result) {
                        throw new CoolException("更新plc站点信息失败==>驱动码垛位托盘前进失败!");
                    }
                    boolean result2 = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(4, staProtocol135));
                }
            }
        }catch (Exception e){
//            e.printStackTrace();
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            log.error("其他  ===>> 贴标完成驱动托盘进入下一步"+e);
        }
    }
    /**
     *  完成小车任务
     */
    public synchronized void rgvCompleteWrkMastSta() {
        try{
            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    continue;
                }
                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
                if (basRgv == null) {
                    log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId());
                    continue;
                }
                // 只有当RGV等待WCS确认、自动
                if (rgvProtocol.getStatusType() == RgvStatusType.WORKING
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && ((rgvProtocol.getStatusType1()==RgvStatusType.WAITING || rgvProtocol.getStatusType2()==RgvStatusType.WAITING ) ||
                        (rgvProtocol.getStatusType1()==RgvStatusType.FETCHWAITING || rgvProtocol.getStatusType2()==RgvStatusType.FETCHWAITING ))
                ) {
                    log.info("{}号小车等待wcs确认,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol);
                    if (rgvProtocol.getTaskNo1()!=0 && (rgvProtocol.getStatusType1()==RgvStatusType.WAITING || rgvProtocol.getStatusType1()==RgvStatusType.FETCHWAITING)){
                        if (rgvProtocol.getTaskNo1()==(short)32222){
                            boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
                            if (!rgvComplete){
                                log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                            }
                            BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                            basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
                            rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
                            break;
                        }
                        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo1().longValue());
                        if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getType()!=1 || wrkMastSta.getWrkSts()!=1){
                            log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta);
                            continue;
                        }
                        WrkMast wrkMast = wrkMastMapper.selectPakInStep3(wrkMastSta.getWrkNo().intValue());
                        if (!Cools.isEmpty(wrkMast) && wrkMastSta.getWrkType()!=5){
                            Thread.sleep(200);
                            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                            StaProtocol staProtocol = devpThread.getStation().get(wrkMastSta.getStaEnd());
                            if (staProtocol == null) {
                                continue;
                            } else {
                                staProtocol = staProtocol.clone();
                            }
                            if (!staProtocol.isAutoing() || !staProtocol.isLoading()){
                                continue;
                            }
                            // 下发站点信息
                            staProtocol.setWorkNo(wrkMast.getWrkNo());
                            staProtocol.setStaNo(wrkMast.getStaNo());
                            if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol))) {
                                continue;
                            }
                            log.error("小车任务完成下发输送线任务:"+staProtocol);
//                            try{
//                                Thread.sleep(1000);
//                                DevpThread devpThreadEnd = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1);
//                                StaProtocol staProtocolEnd = devpThreadEnd.getStation().get(wrkMastSta.getStaEnd());
//                                log.error("小车任务完成读取输送线任务:"+staProtocolEnd);
//                                if (staProtocolEnd.getWorkNo()==0 ){ //|| !staProtocolEnd.getWorkNo().equals(wrkMast.getWrkNo())
//                                    staProtocolEnd.setWorkNo(wrkMast.getWrkNo());
//                                    staProtocolEnd.setStaNo(wrkMast.getStaNo());
//                                    if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocolEnd))) {
//                                        continue;
//                                    }
//                                    log.error("小车任务完成下发输送线任务第二次:"+staProtocolEnd);
//                                }
//                            }catch (Exception e){
//
//                            }
                        }
                        boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
                        if (!rgvComplete){
                            log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                            break;
                        }
                        wrkMastSta.setWrkSts(3);
                        wrkMastStaMapper.updateById(wrkMastSta);
                        BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                        basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
                        rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
                    }else if (rgvProtocol.getTaskNo2()!=0 && (rgvProtocol.getStatusType2()==RgvStatusType.WAITING || rgvProtocol.getStatusType2()==RgvStatusType.FETCHWAITING)){
                        if (rgvProtocol.getTaskNo2()==(short)32222){
                            boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
                            if (!rgvComplete){
                                log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                            }
                            BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                            basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
                            rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
                            break;
                        }
                        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo2().longValue());
                        if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getType()!=2){
                            log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta);
                            continue;
                        }
                        WrkMast wrkMast = wrkMastMapper.selectPakInStep3(wrkMastSta.getWrkNo().intValue());
                        if (!Cools.isEmpty(wrkMast)  && wrkMastSta.getWrkType()!=5){
                            Thread.sleep(200);
                            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                            StaProtocol staProtocol = devpThread.getStation().get(wrkMastSta.getStaEnd());
                            if (!staProtocol.isAutoing() || !staProtocol.isLoading()){
                                continue;
                            }
                            // 下发站点信息
                            staProtocol.setWorkNo(wrkMast.getWrkNo());
                            staProtocol.setStaNo(wrkMast.getStaNo());
                            if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol))) {
                                continue;
                            }
                            log.error("小车任务完成下发输送线任务:"+staProtocol);
//                            try{
//                                Thread.sleep(1000);
//                                DevpThread devpThreadEnd = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1);
//                                StaProtocol staProtocolEnd = devpThreadEnd.getStation().get(wrkMastSta.getStaEnd());
//                                log.error("小车任务完成读取输送线任务:"+staProtocolEnd);
//                                if (staProtocolEnd.getWorkNo()==0 ){ //|| !staProtocolEnd.getWorkNo().equals(wrkMast.getWrkNo())
//                                    staProtocolEnd.setWorkNo(wrkMast.getWrkNo());
//                                    staProtocolEnd.setStaNo(wrkMast.getStaNo());
//                                    if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocolEnd))) {
//                                        continue;
//                                    }
//                                    log.error("小车任务完成下发输送线任务第二次:"+staProtocolEnd);
//                                }
//                            }catch (Exception e){
//
//                            }
                        }
                        boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
                        if (!rgvComplete){
                            log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                            break;
                        }
                        wrkMastSta.setWrkSts(3);
                        wrkMastStaMapper.updateById(wrkMastSta);
                        BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                        basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
                        rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
                    }else {
                        log.error("小车复位失败,小车号{},等待wcs确认但是没有工作号!",rgvProtocol.getRgvNo());
                    }
                }
            }
        }catch (Exception e){
            log.error("小车复位线程报错!"+e);
        }
    }
    /**
     * 入出库  ===>>  小车作业下发
     */
    public synchronized boolean rgvIoExecute(Integer sign) {
        boolean rgvIoExecuteSign = false;
        try{
            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
                // 获取小车信息
                boolean signWork = false;
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    continue;
                }
                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
                if (basRgv == null) {
                    log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId());
                    continue;
                }
                // 只有当RGV空闲、自动,工位一无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded1()==0
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                ) {
                    switch (sign){
                        //执行小车货物搬运任务
                        case 1:
                            signWork = rgvRunWrkMastFullSta(rgvSlave);
                            break;
                        //执行小车空板搬运任务
                        case 2://放//拆盘
                            signWork = rgvRunWrkMastEmptyStaPut(rgvSlave);
                            break;
                        case 3://满放
                            signWork = rgvRunWrkMastEmptyStaPutFull(rgvSlave);
                            break;
                        case 4://取叠盘
                            signWork = rgvRunWrkMastEmptyStaTake(rgvSlave);
                            break;
                        case 5:////满取
                            signWork = rgvRunWrkMastEmptyStaTakeFull(rgvSlave);
                            break;
                        case 6:////提升
//                            signWork = qwe();
                            break;
                        case 7:////位移
                            break;
                        default:
                            break;
                    }
                    for (int signCount = 1;!signWork && signCount<7;signCount++){
                        switch (signCount){
                            case 1://执行小车货物搬运任务
                                signWork = rgvRunWrkMastFullSta(rgvSlave);
                                break;
                            case 2://放//拆盘
                                signWork = rgvRunWrkMastEmptyStaPut(rgvSlave);
                                break;
                            case 3://满放
                                signWork = rgvRunWrkMastEmptyStaPutFull(rgvSlave);
                                break;
                            case 4://取叠盘
                                signWork = rgvRunWrkMastEmptyStaTake(rgvSlave);
                                break;
                            case 5:////满取
                                signWork = rgvRunWrkMastEmptyStaTakeFull(rgvSlave);
                                break;
                            case 6:////提升
//                            signWork = rgvRunWrkMastEmptyStaPut();
                                break;
                            case 7:////位移
                                break;
                            default:
                                break;
                        }
                    }
                }else {
                    continue;
                }
                if (!rgvIoExecuteSign){
                    rgvIoExecuteSign = signWork;
                }
            }
//            if (!rgvIoExecuteSign){
//                if (sign>6){
//
//                }
//            }
        }catch (Exception e){
            log.error("RGV小车任务下发报错"+e);
        }
        return rgvIoExecuteSign;
    }
    /**
     * 执行小车搬运任务
     */
    public synchronized boolean rgvRunWrkMastFullSta(RgvSlave rgvSlave) {
        try{
//            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    return false;
                }
                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
                if (basRgv == null) {
                    log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId());
                    return false;
                }
                // 只有当RGV空闲、自动,工位一无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded1()==0
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(basRgv.getRgvNo());
                    if (basRgvMap == null) {
                        log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo());
                        return false;
                    }
                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                    List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);
                    for (WrkMastSta wrkMastSta : wrkMastStaList){
                        if (wrkMastSta.getType()!=1 || wrkMastSta.getWrkType()!=3){//1:满版   3:取放
                            continue;
                        }
                        BasDevp basDevp = basDevpService.selectById(wrkMastSta.getStaEnd());
                        if (!basDevp.getAutoing().equals("Y") || basDevp.getLoading().equals("Y")){
                            continue;
                        }
                        boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta);
                        if (sign){
                            boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd());
                            if (signMap){
                                wrkMastSta.setWrkSts(1);
                                try{
                                    wrkMastStaMapper.updateById(wrkMastSta);
                                }catch (Exception e){
                                    log.error("更新小车任务失败");
                                }
                                return true;
                            }else {
                                log.error("3864行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                            }
                        }else {
                            log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
                        }
                        break;
                    }
                }
//            }
        }catch (Exception e){
            log.error("3875行执行小车搬运任务下发失败");
            log.error("3875行"+e);
        }
        return false;
    }
    /**
     * 执行小车搬运任务//拆盘
     */
    public synchronized boolean rgvRunWrkMastEmptyStaPut(RgvSlave rgvSlave) {//拆盘
        try{
//            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    return false;
                }
                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
                if (basRgv == null) {
                    log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId());
                    return false;
                }
                // 只有当RGV空闲、自动,工位二有物//rgv可用//拆盘
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                        && (rgvProtocol.getLoaded2()==3  || rgvProtocol.getLoaded2()==1 || rgvProtocol.getLoaded2()==4)////0 无物;1 一层无物二层有物 (只能拆叠) ;2一层有物二层无物() ;3  1、2层都有物  4:()只允许拆盘
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (basRgvMap == null) {
                        log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo());
                        return false;
                    }
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());//获取活动范围
                    List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);//查询可执行任务
                    for (WrkMastSta wrkMastSta : wrkMastStaList){
                        if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=2){// 2:空板  || 工作类型  1:取(叠盘)  2:拆盘  5:满取  6:满放
                            continue;
                        }
                        boolean sign = false;
                        if ( wrkMastSta.getStaEnd()!=0){//放
                            BasDevp basDevp = basDevpService.selectById(wrkMastSta.getStaEnd());
                            if (!basDevp.getAutoing().equals("Y") || basDevp.getLoading().equals("Y")){
                                continue;
                            }
                            sign = rgvPutEmpty(rgvProtocol.getRgvNo(),wrkMastSta);//拆盘
                        }else {
                            continue;
                        }
                        if (sign){
                            boolean signMap = rgvMapUpdate(basRgvMap, basRgvMap.getStartRoute(), wrkMastSta.getStaEnd());
                            if (signMap){
                                wrkMastSta.setWrkSts(2);
                                try{
                                    wrkMastStaMapper.updateById(wrkMastSta);
                                }catch (Exception e){
                                    log.error("更新小车任务失败");
                                }
                                return true;
                            }else {
                                log.error("3857行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                            }
                        }else {
                            log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
                        }
                        break;
                    }
                }
//            }
        }catch (Exception e){
            log.error("3933行执行小车放空板任务下发失败");
            log.error("3933行"+e);
        }
        return false;
    }
    /**
     * 执行小车搬运任务
     */
    public synchronized boolean rgvRunWrkMastEmptyStaPutFull(RgvSlave rgvSlave) {//满放
        try{
//            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    return false;
                }
                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
                if (basRgv == null) {
                    log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId());
                    return false;
                }
                // 只有当RGV空闲、自动,工位二有物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                        &&  (rgvProtocol.getLoaded2()==2  || rgvProtocol.getLoaded2()==3 ) ////0 无物;1 一层无物二层有物  ;2一层有物二层无物 (只能满放);3  1、2层都有物  4:()只允许拆盘
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (basRgvMap == null) {
                        log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo());
                        return false;
                    }
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());//获取活动范围
                    List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);//查询可执行任务
                    for (WrkMastSta wrkMastSta : wrkMastStaList){
                        if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=6){// 2:空板  || 工作类型  1:取(叠盘)  2:拆盘  5:满取  6:满放  7:提升
                            continue;
                        }
                        boolean sign = false;
                        if ( wrkMastSta.getStaEnd()!=0){//满放
                            BasDevp basDevp = basDevpService.selectById(wrkMastSta.getStaEnd());
                            if (!basDevp.getAutoing().equals("Y") || basDevp.getLoading().equals("Y")){
                                continue;
                            }
                            sign = rgvPutEmptyFull(rgvProtocol.getRgvNo(),wrkMastSta);
                        }else {
                            continue;
                        }
                        if (sign){
                            boolean signMap = rgvMapUpdate(basRgvMap, basRgvMap.getStartRoute(), wrkMastSta.getStaEnd());
                            if (signMap){
                                wrkMastSta.setWrkSts(2);
                                try{
                                    wrkMastStaMapper.updateById(wrkMastSta);
                                }catch (Exception e){
                                    log.error("更新小车任务失败");
                                }
                                return true;
                            }else {
                                log.error("3857行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                            }
                        }else {
                            log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
                        }
                        break;
                    }
                }
//            }
        }catch (Exception e){
            log.error("3933行执行小车放空板任务下发失败");
            log.error("3933行"+e);
        }
        return false;
    }
    public synchronized boolean rgvRunWrkMastEmptyStaTake(RgvSlave rgvSlave) {//叠盘
        try{
//            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    return false;
                }
                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
                if (basRgv == null) {
                    log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId());
                    return false;
                }
                // 只有当RGV空闲、自动,工位二无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                        &&  (rgvProtocol.getLoaded2()==0  || rgvProtocol.getLoaded2()==1 ) //现场修改:叠盘机,////0 无物;1 一层无物二层有物(只能拆叠)   ;2一层有物二层无物 (只能满放);3  1、2层都有物  4:()只允许拆盘
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (basRgvMap == null) {
                        log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo());
                        return false;
                    }
                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                    List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);
                    for (WrkMastSta wrkMastSta : wrkMastStaList){
                        if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=1){// 2:空板  || 工作类型  1:取(叠盘)  2:拆盘  5:满取  6:满放
                            continue;
                        }
                        boolean sign = false;
                        if ( wrkMastSta.getStaStart()!=0){//取
                            BasDevp basDevp = basDevpService.selectById(wrkMastSta.getStaStart());
                            if (!basDevp.getAutoing().equals("Y") || !basDevp.getLoading().equals("Y")){
                                continue;
                            }
                            sign = rgvTakeEmpty(rgvProtocol.getRgvNo(),wrkMastSta);//叠盘
                        }else {
                            continue;
                        }
                        if (sign){
                            boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), basRgvMap.getStartRoute());
                            if (signMap){
                                wrkMastSta.setWrkSts(1);
                                try{
                                    wrkMastStaMapper.updateById(wrkMastSta);
                                }catch (Exception e){
                                    log.error("更新小车任务失败");
                                }
                                return true;
                            }else {
                                log.error("3879行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                            }
                        }else {
                            log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
                        }
                        break;
                    }
                }
//            }
        }catch (Exception e){
            log.error("3989行执行小车取空板任务下发失败");
            log.error("3989行"+e);
        }
        return false;
    }
    public synchronized boolean rgvRunWrkMastEmptyStaTakeFull(RgvSlave rgvSlave) {//满取
        try{
//            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    return false;
                }
                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
                if (basRgv == null) {
                    log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId());
                    return false;
                }
                // 只有当RGV空闲、自动,工位二无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                        &&  rgvProtocol.getLoaded2()==0  //现场修改:叠盘机,////0 无物;1 一层无物二层有物(只能拆叠)   ;2一层有物二层无物 (只能满放);3  1、2层都有物  4:()只允许拆盘
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (basRgvMap == null) {
                        log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo());
                        return false;
                    }
                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                    List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);
                    for (WrkMastSta wrkMastSta : wrkMastStaList){
                        if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=5){// 2:空板  || 工作类型  1:取(叠盘)  2:拆盘  5:满取  6:满放
                            continue;
                        }
                        boolean sign = false;
                        if (wrkMastSta.getStaStart()!=0){//满取
                            BasDevp basDevp = basDevpService.selectById(wrkMastSta.getStaStart());
                            if (!basDevp.getAutoing().equals("Y") || !basDevp.getLoading().equals("Y")){
                                continue;
                            }
                            sign = rgvTakeEmptyFull(rgvProtocol.getRgvNo(),wrkMastSta);
                        }else {
                            continue;
                        }
                        if (sign){
                            boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), basRgvMap.getStartRoute());
                            if (signMap){
                                wrkMastSta.setWrkSts(1);
                                try{
                                    wrkMastStaMapper.updateById(wrkMastSta);
                                }catch (Exception e){
                                    log.error("更新小车任务失败");
                                }
                                return true;
                            }else {
                                log.error("3879行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                            }
                        }else {
                            log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
                        }
                        break;
                    }
                }
//            }
        }catch (Exception e){
            log.error("3989行执行小车取空板任务下发失败");
            log.error("3989行"+e);
        }
        return false;
    }
    /*
    * 有任务但未执行  此时需要调整小车位置
    * */
    public synchronized void rgvRunWrkMastEmptyStaAvoidance() {
        try{
            Integer integer = wrkMastStaMapper.selectAllWrkStsCount(null,0);//查询状态为0的任务
            if (integer==0){
                return;
            }
            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    continue;
                }
                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
                if (basRgv == null) {
                    log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId());
                    continue;
                }
                // 只有当RGV空闲、自动,工位一无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded1()==0  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && rgvProtocol.getTaskNo1()==0
                        && rgvProtocol.getTaskNo2()==0
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (rgvProtocol.getRgvPosI().equals(basRgvMap.getStartRoute())){
                        continue;
                    }
                    if (rgvProtocol.getRgvNo()==1 && (rgvProtocol.getRgvPosI().equals(101) || rgvProtocol.getRgvPosI().equals(102) )){
                        continue;
                    } else if (rgvProtocol.getRgvNo()==2 && (rgvProtocol.getRgvPosI().equals(116) || rgvProtocol.getRgvPosI().equals(117) ) ){
                        continue;
                    }
                    rgvAvoidanceXY(rgvProtocol.getRgvNo());
                    rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
                }
            }
        }catch (Exception e){
            log.error("4109行执行小车初始化任务下发失败");
            log.error("4109行"+e);
        }
    }
    /*
     * 刷新地图数据
     * */
    public synchronized void refreshRgvMap() {
        try{
            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    continue;
                }
                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
                if (basRgv == null) {
                    log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId());
                    continue;
                }
                // 只有当RGV空闲、自动,工位一无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded1()==0  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && rgvProtocol.getTaskNo1()==0
                        && rgvProtocol.getTaskNo2()==0
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvSlave.getId());
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
                    rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
                }
            }
        }catch (Exception e){
            log.error("4109行执行小车初始化任务下发失败");
            log.error("4109行"+e);
        }
    }
    /*
     * 小车XY移动  避让
     * */
    public synchronized boolean rgvAvoidanceXY(Integer rgvId){
        if (rgvId==1){
            try{
                BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvId);
                //  命令下发区 --------------------------------------------------------------------------
                RgvCommand rgvCommand = new RgvCommand();
                rgvCommand.setRgvNo(rgvId); // RGV编号
                rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
                rgvCommand.setTaskNo1((short)32222); // 工位1工作号
                rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式:  回原点
                //basRgvMap.getLockStartRoute().shortValue()
                rgvCommand.setSourceStaNo1( (short)101);
                rgvCommand.setCommand((short) 1);   //工位1任务确认
                if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                    //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务   step=9,回原点 9999任务号
                    log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                    return false;
                } else {
                    return true;
                }
            }catch (Exception e){
                return false;
            }
        }else {
            try{
                BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvId);
                //  命令下发区 --------------------------------------------------------------------------
                RgvCommand rgvCommand = new RgvCommand();
                rgvCommand.setRgvNo(rgvId); // RGV编号
                rgvCommand.setAckFinish2((short) 0);  // 工位2任务完成确认位
                rgvCommand.setTaskNo2((short)32222); // 工位2工作号
                rgvCommand.setTaskMode2(RgvTaskModeType.X_MOVE); // 工位2任务模式:  回原点
                rgvCommand.setSourceStaNo2((short)117);
                rgvCommand.setCommand((short) 2);   //工位2任务确认
                if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                    //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务   step=9,回原点 9999任务号
                    log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                    return false;
                } else {
                    return true;
                }
            }catch (Exception e){
                return false;
            }
        }
    }
    /*
    * 小车取货至工位任务
    * */
    public synchronized boolean rgvTakeFullAll(Integer rgvId,WrkMastSta wrkMastSta){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setRgvNo(rgvId); // RGV编号
            rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
            rgvCommand.setTaskNo1(wrkMastSta.getWrkNo().shortValue()); // 工位1工作号
            rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式:  取放货
            rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue());   //工位1起点
            rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue());   //工位1目标站点
            rgvCommand.setCommand((short) 1);   //工位1任务确认
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
            } else {
                return true;
            }
        }catch (Exception e){
            return false;
        }
    }
    /*
     * 小车取货至工位任务
     * */
    public synchronized boolean rgvTakeFull(Integer rgvId,WrkMastSta wrkMastSta){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setRgvNo(rgvId); // RGV编号
            rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
            rgvCommand.setTaskNo1(wrkMastSta.getWrkNo().shortValue()); // 工位1工作号
            rgvCommand.setTaskMode1(RgvTaskModeType.FETCH); // 工位1任务模式:  取货
            rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue());   //工位1起点
            rgvCommand.setCommand((short) 1);   //工位1任务确认
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
            } else {
                return true;
            }
        }catch (Exception e){
            return false;
        }
    }
    /*
    * 小车放货至输送线任务
    * */
    public synchronized boolean rgvPutFull(Integer rgvId,WrkMastSta wrkMastSta){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setRgvNo(rgvId); // RGV编号
            rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
            rgvCommand.setTaskNo1(wrkMastSta.getWrkNo().shortValue()); // 工位1工作号
            rgvCommand.setTaskMode1(RgvTaskModeType.PUT); // 工位1任务模式:  放货
            rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue());   //工位1目标站点
            rgvCommand.setCommand((short) 1);   //工位1任务确认
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
            } else {
                return true;
            }
        }catch (Exception e){
            return false;
        }
    }
    /*
     * 小车取空板至工位任务  叠盘
     * */
    public synchronized boolean rgvTakeEmpty(Integer rgvId,WrkMastSta wrkMastSta){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setRgvNo(rgvId); // RGV编号
            rgvCommand.setAckFinish2((short) 0);  // 工位2任务完成确认位
            rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 工位2工作号
            rgvCommand.setTaskMode2(RgvTaskModeType.FETCH); // 工位2任务模式:  取货
            rgvCommand.setSourceStaNo2(wrkMastSta.getStaStart().shortValue());   //工位2起点
            rgvCommand.setCommand((short) 2);   //工位2任务确认
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
            } else {
                return true;
            }
        }catch (Exception e){
            return false;
        }
    }
    /*
     * 小车放空板至输送线任务   //拆盘
     * */
    public synchronized boolean rgvPutEmpty(Integer rgvId,WrkMastSta wrkMastSta){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setRgvNo(rgvId); // RGV编号
            rgvCommand.setAckFinish2((short) 0);  // 工位2任务完成确认位
            rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 工位2工作号
            rgvCommand.setTaskMode2(RgvTaskModeType.PUT); // 工位2任务模式:  放货
            rgvCommand.setDestinationStaNo2(wrkMastSta.getStaEnd().shortValue());   //工位2目标站点
            rgvCommand.setCommand((short) 2);   //工位2任务确认
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
            } else {
                return true;
            }
        }catch (Exception e){
            return false;
        }
    }
    /*
     * 小车取空板至工位任务  满取
     * */
    public synchronized boolean rgvTakeEmptyFull(Integer rgvId,WrkMastSta wrkMastSta){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setRgvNo(rgvId); // RGV编号
            rgvCommand.setAckFinish2((short) 0);  // 工位2任务完成确认位
            rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 工位2工作号
            rgvCommand.setTaskMode2(RgvTaskModeType.FETCH_5); // 工位2任务模式:  满取
            rgvCommand.setSourceStaNo2(wrkMastSta.getStaStart().shortValue());   //工位2起点
            rgvCommand.setCommand((short) 2);   //工位2任务确认
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
            } else {
                return true;
            }
        }catch (Exception e){
            return false;
        }
    }
    /*
     * 小车放空板至输送线任务   //满放
     * */
    public synchronized boolean rgvPutEmptyFull(Integer rgvId,WrkMastSta wrkMastSta){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setRgvNo(rgvId); // RGV编号
            rgvCommand.setAckFinish2((short) 0);  // 工位2任务完成确认位
            rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 工位2工作号
            rgvCommand.setTaskMode2(RgvTaskModeType.PUT_6); // 工位2任务模式:  满放
            rgvCommand.setDestinationStaNo2(wrkMastSta.getStaEnd().shortValue());   //工位2目标站点
            rgvCommand.setCommand((short) 2);   //工位2任务确认
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
            } else {
                return true;
            }
        }catch (Exception e){
            return false;
        }
    }
    /*
     * 小车复位
     * */
    public synchronized boolean rgvComplete(Integer rgvId){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(3, new RgvCommand()))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={}",rgvId);
                return false;
            } else {
                log.info("RGV命令下发成功,RGV号={}",rgvId);
                return true;
            }
        }catch (Exception e){
            log.error("RGV命令下发失败,RGV号={}。异常:"+e,rgvId);
            return false;
        }
    }
    /*
     * 小车地图更新  更新锁
     * */
    public synchronized boolean rgvMapUpdate(BasRgvMap basRgvMapCurrent,Integer staStart,Integer staEnd){
        if (true){
            basRgvMapMapper.updateById(basRgvMapCurrent);
            return true;
        }
//        List<Integer> integers = RouteUtils.RouteMapCurrentFar(basRgvMapCurrent.getNowRoute(),staStart,staEnd, basRgvMapCurrent.getLockStartRoute());
        //更新当前小车锁
        try{
            Integer farCurrentStaNo = RouteUtils.RouteIndexFarMas(basRgvMapCurrent.getNowRoute(), staStart, staEnd, basRgvMapCurrent.getLockStartRoute());//获取最远站点
            Integer fallMerge = RouteUtils.RouteIndexFarMas(basRgvMapCurrent.getRgvNo(), farCurrentStaNo); //获取合并干涉项
            basRgvMapCurrent.setLockEndRoute(fallMerge);
            basRgvMapMapper.updateById(basRgvMapCurrent);
            //更新另一台小车地图
            Integer rgvNoOther = basRgvMapCurrent.getRgvNoOther();
            BasRgvMap basRgvMapOther = basRgvMapMapper.selectById(rgvNoOther);
            List<Integer> integers = RouteUtils.RouteMapCurrentFar(fallMerge, basRgvMapCurrent.getLockStartRoute());
            Integer lockEndRoute = RouteUtils.RouteMapOtherFarStnNo(integers, basRgvMapCurrent.getLockStartRoute());//另一台小车可活动最远位置
            basRgvMapOther.setEndRoute(lockEndRoute);
            basRgvMapMapper.updateById(basRgvMapOther);
            return true;
        }catch (Exception e){
            log.error("小车地图更新出错!");
            return false;
        }
    }
@@ -6448,4 +4405,103 @@
        }
    }
    /**
     *  Jar任务创建
     */
    public synchronized void jarGenerateWrkMastSta() {
        try{
        }catch (Exception e){
            log.error("小车复位线程报错!"+e);
        }
    }
    /**
     *  Jar任务执行
     */
    public synchronized void jarExecuteWrkMastSta() {
        try{
        }catch (Exception e){
            log.error("小车复位线程报错!"+e);
        }
    }
    /**
     *  Jar完成
     */
    public synchronized void jarCompleteWrkMastSta() {
        try{
        }catch (Exception e){
            log.error("小车复位线程报错!"+e);
        }
    }
    /*
     * 小车取空板至工位任务  满取
     * */
    public synchronized boolean jarRgvTake1(Integer rgvId,WrkMastSta wrkMastSta){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setRgvNo(rgvId); // RGV编号
            rgvCommand.setAckFinish2((short) 0);  // 工位2任务完成确认位
            rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 工位2工作号
            rgvCommand.setTaskMode2(RgvTaskModeType.FETCH_5); // 工位2任务模式:  满取
            rgvCommand.setSourceStaNo2(wrkMastSta.getStaStart().shortValue());   //工位2起点
            rgvCommand.setCommand((short) 2);   //工位2任务确认
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
            } else {
                return true;
            }
        } catch (Exception e){
            return false;
        }
    }
    /*
     * Rgv  移动
     * */
    public synchronized boolean jarRgvTake2(Integer rgvId,BasJarMast basJarMast){
        return false;
    }
    /*
     * 小车取空板至工位任务  满取
     * */
    public synchronized boolean jarRgvTake3(Integer rgvId,BasJarMast basJarMast){
        return false;
    }
    /*
     * 小车取空板至工位任务  满取
     * */
    public synchronized boolean jarRgvTake4(Integer rgvId,BasJarMast basJarMast){
        return false;
    }
    /*
     * 小车取空板至工位任务  满取
     * */
    public synchronized boolean jarRgvTake5(Integer rgvId,BasJarMast basJarMast){
        return false;
    }
    /*
     * 小车取空板至工位任务  满取
     * */
    public synchronized boolean jarRgvTake6(Integer rgvId,BasJarMast basJarMast){
        return false;
    }
    /*
     * 小车取空板至工位任务  满取
     * */
    public synchronized boolean jarRgvTake7(Integer rgvId,BasJarMast basJarMast){
        return false;
    }
    /*
     * 小车取空板至工位任务  满取
     * */
    public synchronized boolean jarRgvTake8(Integer rgvId,BasJarMast basJarMast){
        return false;
    }
}
src/main/java/com/zy/core/MainProcess.java
@@ -76,35 +76,6 @@
                        mainService.storeFinishedTwo();
                    }
                    /************************************RGV调度************************************/
                    i++;
                    k++;
                    if (i<5) {
//                        // RGV  ===>>  小车任务作业下发
//                        if (i == 7) {
//                            try{
//                                boolean rgvIoExecuteSign = mainService.rgvIoExecute(i);  //7煜星特供,左右移动
//                                if (rgvIoExecuteSign){
//                                    k = 0;
//                                } else if (k>8){
//                                    k = 0;
//                                    mainService.rgvRunWrkMastEmptyStaAvoidance();//避让
//                                }
//                            }catch (Exception e){
//                                log.error("RGV  ===>>  小车任务作业下发异常"+e);
//                            }
//                        }else {
//                            //穿梭板
////                            boolean rgvIoExecuteSign = mainService.rgvIoExecute(i);  //7煜星特供,左右移动
//
//                        }
                    }else {
                        i = 0;
                    }
//                    //完成小车任务
                    mainService.rgvCompleteWrkMastSta();
                    /************************************RGV调度************************************/
//                    // 异常信息记录
//                    mainService.recErr();
                    // 入库  ===>> 空栈板初始化入库
@@ -118,6 +89,15 @@
                    // 其他  ===>> LED显示器复位,显示默认信息
                    mainService.ledReset();
                    /************************************JAR调度************************************/
                    mainService.jarGenerateWrkMastSta();
                    /************************************JAR调度************************************/
                } catch (Exception e) {
                    e.printStackTrace();
                }
src/main/java/com/zy/core/model/JarSlave.java
@@ -20,14 +20,26 @@
    private Boolean demo;
    // 穿梭车入库站点
    private List<CrnStn> steInStn = new ArrayList<>();
    // 硫化罐入库站点
    private List<StaStn> jarInSta = new ArrayList<>();
    // 穿梭车出库站点
    private List<CrnStn> steOutStn = new ArrayList<>();
    // 硫化罐出库站点
    private List<StaStn> jarOutSta = new ArrayList<>();
    // 硫化罐入库RGV
    private List<RgvStn> jarInRgv = new ArrayList<>();
    // 硫化罐出库RGV
    private List<RgvStn> jarOutRgv = new ArrayList<>();
    // 硫化罐入库穿梭板
    private List<SteStn> jarInSte = new ArrayList<>();
    // 硫化罐出库穿梭板
    private List<SteStn> jarOutSte = new ArrayList<>();
    @Data
    public static class CrnStn {
    public static class StaStn {
        // 输送线plc编号
        private Integer devpPlcId;
@@ -46,4 +58,48 @@
    }
    @Data
    public static class RgvStn {
        // 输送线plc编号
        private Integer devpPlcId;
        // 输送线plc编号
        private Integer rgvId;
        // 穿梭车站点编号
        private Integer rgvNo;
        // 排
        private Integer row;
        // 列
        private Integer bay;
        // 层
        private Integer lev;
    }
    @Data
    public static class SteStn {
        // 输送线plc编号
        private Integer devpPlcId;
        // 穿梭板plc编号
        private Integer steId;
        // 穿梭车站点编号
        private Integer steNo;
        // 排
        private Integer row;
        // 列
        private Integer bay;
        // 层
        private Integer lev;
    }
}
src/main/java/com/zy/core/thread/JarThread.java
@@ -117,7 +117,15 @@
                    jarProtocol.setJarNo(slave.getId());
                }
                jarProtocol.setMode(siemensS7Net.getByteTransform().TransInt32(result.Content, 2));
                jarProtocol.setStatus(siemensS7Net.getByteTransform().TransInt16(result.Content, 4));
                jarProtocol.setLeftDoor(siemensS7Net.getByteTransform().TransBool(result.Content, 4));//左门状态
                jarProtocol.setRightDoor(siemensS7Net.getByteTransform().TransBool(result.Content, 4));//右门状态
                jarProtocol.setLeftInEnable(siemensS7Net.getByteTransform().TransBool(result.Content, 4));//左门可开
                jarProtocol.setLeftOutEnable(siemensS7Net.getByteTransform().TransBool(result.Content, 4));//左门可关
                jarProtocol.setRightInEnable(siemensS7Net.getByteTransform().TransBool(result.Content, 4));//右门可开
                jarProtocol.setRightOutEnable(siemensS7Net.getByteTransform().TransBool(result.Content, 4));//右门可关
                jarProtocol.setAutoing(siemensS7Net.getByteTransform().TransBool(result.Content, 4));//自
                jarProtocol.setJarErr(siemensS7Net.getByteTransform().TransInt32(result.Content, 4));//异常码
                // 根据实时信息更新数据库
                BasJarService service = SpringUtils.getBean(BasJarService.class);
src/main/resources/application.yml
@@ -343,23 +343,163 @@
  # JAR1
  jar[0]:
    id: 1
    ip: 10.10.10.100
    ip: 10.10.10.190
    port: 120
    # 硫化罐入库站点
    jarInSta[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 101
      row: 1
    # 硫化罐入库站点
    jarInSta[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 102
      row: 1
    # 硫化罐出库站点
    jarOutSta[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 102
      row: 1
    # 硫化罐入库RGV
    jarInRgv[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      rgvNo: 173
      row: 1
    # 硫化罐出库RGV
    jarOutRgv[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      rgvNo: 173
      row: 2
    # 硫化罐入库穿梭板
    jarInSte[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      steNo: 173
      row: 1
    # 硫化罐出库穿梭板
    jarOutSte[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      steNo: 173
      row: 2
  # JAR2
  jar[1]:
    id: 2
    ip: 10.10.10.100
    ip: 10.10.10.191
    port: 120
    # 硫化罐入库站点
    jarInSta[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 101
      row: 1
    # 硫化罐入库站点
    jarInSta[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 102
      row: 1
    # 硫化罐出库站点
    jarOutSta[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 202
      row: 1
    # 硫化罐入库RGV
    jarInRgv[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      rgvNo: 173
      row: 1
    # 硫化罐出库RGV
    jarOutRgv[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      rgvNo: 173
      row: 2
    # 硫化罐入库穿梭板
    jarInSte[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      steNo: 173
      row: 1
    # 硫化罐出库穿梭板
    jarOutSte[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      steNo: 173
      row: 2
  # JAR3
  jar[2]:
    id: 3
    ip: 10.10.10.100
    ip: 10.10.10.192
    port: 120
    # 硫化罐入库站点
    jarInSta[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 101
      row: 1
    # 硫化罐入库站点
    jarInSta[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 102
      row: 1
    # 硫化罐出库站点
    jarOutSta[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 102
      row: 1
    # 硫化罐入库RGV
    jarInRgv[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      rgvNo: 173
      row: 1
    # 硫化罐出库RGV
    jarOutRgv[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      rgvNo: 173
      row: 2
    # 硫化罐入库穿梭板
    jarInSte[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      steNo: 173
      row: 1
    # 硫化罐出库穿梭板
    jarOutSte[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      steNo: 173
      row: 2
  # JAR4
  jar[3]:
    id: 4
    ip: 10.10.10.100
    ip: 10.10.10.193
    port: 120
    # 硫化罐入库站点
    jarInSta[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 101
      row: 1
    # 硫化罐入库站点
    jarInSta[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 102
      row: 1
    # 硫化罐出库站点
    jarOutSta[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 102
      row: 1
    # 硫化罐入库RGV
    jarInRgv[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      rgvNo: 173
      row: 1
    # 硫化罐出库RGV
    jarOutRgv[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      rgvNo: 173
      row: 2
    # 硫化罐入库穿梭板
    jarInSte[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      steNo: 173
      row: 1
    # 硫化罐出库穿梭板
    jarOutSte[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      steNo: 173
      row: 2
  # ste1
  ste[0]:
    id: 1