*
L
2025-07-13 507397970e1186f9b7c10c8252168ebc7fb7b38b
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -2356,7 +2356,10 @@
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                        //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && ((rgvProtocol.getTaskNo1()==0 && rgvProtocol.getLoaded1()==0)
                        || (rgvProtocol.getTaskNo1()>0 && rgvProtocol.getLoaded1()==1))
                        && rgvProtocol.getTaskNo2()==0
//                        &&  (rgvProtocol.getLoaded2()==2  || rgvProtocol.getLoaded2()==3 ) ////0 无物;1 一层无物二层有物  ;2一层有物二层无物 (只能满放);3  1、2层都有物  4:()只允许拆盘
                        &&  rgvProtocol.getLoaded2()==3 ////0 无物;1 一层无物二层有物  ;2一层有物二层无物 (只能满放);3  1、2层都有物  4:()只允许拆盘
                ) {
@@ -3555,8 +3558,32 @@
                            break;
                        }
                        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo1().longValue());
                        if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getType()!=1 || wrkMastSta.getWrkSts()!=1){
                        if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getType()!=1){
                            log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta);
                            continue;
                        }
                        if (wrkMastSta.getWrkSts()!=1){
                            if (wrkMastSta.getWrkType()==3 && wrkMastSta.getWrkSts()==2 && rgvProtocol.getLoaded1()==1){
//                                boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo(),rgvProtocol.getTaskNo1());
//                                if (!rgvComplete){
//                                    log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
//                                    break;
//                                }
                                rgvAvoidanceXYWrkMast(rgvProtocol.getRgvNo());
                                continue;
                            }
                            if (wrkMastSta.getWrkType()==6){
                                boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
                                wrkMastSta.setWrkSts(3);
                                wrkMastStaMapper.updateById(wrkMastSta);
                                continue;
                            }
                            continue;
                        }
                        if (wrkMastSta.getWrkType()==5){
                            boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo(),rgvProtocol.getTaskNo1());
                            wrkMastSta.setWrkSts(3);
                            wrkMastStaMapper.updateById(wrkMastSta);
                            continue;
                        }
                       /* WrkMast wrkMast = wrkMastMapper.selectPakInStep3(wrkMastSta.getWrkNo().intValue());
@@ -3608,7 +3635,7 @@
                        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());
                            boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo(),rgvProtocol.getTaskNo1());
                            if (!rgvComplete){
                                log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                            }
@@ -3654,7 +3681,7 @@
//
//                            }
                        }*/
                        boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
                        boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo(),rgvProtocol.getTaskNo1());
                        if (!rgvComplete){
                            log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                            break;
@@ -3696,22 +3723,33 @@
                // 只有当RGV空闲、自动,工位一无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                        && (rgvProtocol.getStatusType2() == RgvStatusType.IDLE || (rgvProtocol.getStatusType2() == RgvStatusType.SOS100 && rgvProtocol.getTaskNo2()==0))
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded1()==0
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                        //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && ((rgvProtocol.getTaskNo1()==0 && rgvProtocol.getLoaded1()==0)
                        || (rgvProtocol.getTaskNo1()>0 && rgvProtocol.getLoaded1()==1))
                        && rgvProtocol.getTaskNo2()==0
                ) {
                    switch (sign){
                        //执行小车货物搬运任务
                        case 1:
                            signWork = rgvRunWrkMastFullSta(rgvSlave);
                            if (!signWork){
                                signWork = rgvRunWrkMastFullStaPutOrTake(rgvSlave);
                            }
                            break;
                        //执行小车空板搬运任务
                        case 2://放//拆盘
                            signWork = rgvRunWrkMastEmptyStaPut(rgvSlave);
                            if (!signWork){
                                signWork = rgvRunWrkMastFullStaPut(rgvSlave);
                            }
                            break;
                        case 3://满放
                            signWork = rgvRunWrkMastEmptyStaPutFull(rgvSlave);
                            if (!signWork){
                                signWork = rgvRunWrkMastFullStaTake(rgvSlave);
                            }
                            break;
                        case 4://取叠盘
                            signWork = rgvRunWrkMastEmptyStaTake(rgvSlave);
@@ -3721,6 +3759,7 @@
                            break;
                        case 6:////提升
//                            signWork = qwe();
                            signWork = rgvRunWrkMastMove(rgvSlave);
                            break;
                        default:
                            break;
@@ -3729,12 +3768,21 @@
                        switch (signCount){
                            case 1://执行小车货物搬运任务
                                signWork = rgvRunWrkMastFullSta(rgvSlave);
                                if (!signWork){
                                    signWork = rgvRunWrkMastFullStaPutOrTake(rgvSlave);
                                }
                                break;
                            case 2://放//拆盘
                                signWork = rgvRunWrkMastEmptyStaPut(rgvSlave);
                                if (!signWork){
                                    signWork = rgvRunWrkMastFullStaPut(rgvSlave);
                                }
                                break;
                            case 3://满放
                                signWork = rgvRunWrkMastEmptyStaPutFull(rgvSlave);
                                if (!signWork){
                                    signWork = rgvRunWrkMastFullStaTake(rgvSlave);
                                }
                                break;
                            case 4://取叠盘
                                signWork = rgvRunWrkMastEmptyStaTake(rgvSlave);
@@ -3786,7 +3834,8 @@
                // 只有当RGV空闲、自动,工位一无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                        && (rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                        || (rgvProtocol.getStatusType2() == RgvStatusType.SOS100 && rgvProtocol.getTaskNo2()==0))
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded1()==0
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
@@ -3882,6 +3931,172 @@
        return false;
    }
    /**
     * 执行小车搬运任务
     */
    public synchronized boolean rgvRunWrkMastFullStaPutOrTake(RgvSlave rgvSlave) {
        try{
            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.getStatusType2() == RgvStatusType.SOS100 && rgvProtocol.getTaskNo2()==0))
                    && 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")){
                        continue;
                    }
                    if (basDevp.getDevNo()>117 && basDevp.getDevNo()<124){
                        if (basDevp.getEmptyMk().equals("Y")){
                            continue;
                        }
                        if (basDevp.getLoading().equals("Y") && basDevp.getWrkNo()!=0){
                            Date date = new Date();
                            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, rgvSlave.getDevpPlcId());
                            StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo());
                            if (staProtocol == null) {
                                log.info(date+"取放任务下发:未查询到站点信息:"+wrkMastSta);
                                continue;
                            }
                            if (!staProtocol.isAutoing()){
                                continue;
                            }
                            if (staProtocol.isLoading() && staProtocol.getWorkNo() != 0){
                                WrkMast wrkMast = wrkMastMapper.selectPakInStep3(staProtocol.getWorkNo());
                                if (Cools.isEmpty(wrkMast) || wrkMast.getIoType()!=101 || Cools.isEmpty(wrkMast.getSheetNo()) || wrkMast.getSheetNo().equals("0")){
                                    continue;
                                }
                                BasDevp basDevpS = basDevpService.selectById(wrkMastSta.getStaStart());
                                if (!basDevpS.getAutoing().equals("Y") || !basDevpS.getLoading().equals("Y") || basDevpS.getWrkNo()!=wrkMastSta.getWrkNo().intValue()){
                                    continue;
                                }
                                StaProtocol staProtocols = devpThread.getStation().get(basDevpS.getDevNo());
                                if (staProtocols == null) {
                                    log.info(date+"取放任务下发:未查询到站点信息:"+wrkMastSta);
                                    continue;
                                }
                                if (!staProtocols.isAutoing() || !staProtocols.isLoading() || staProtocols.getWorkNo() != wrkMastSta.getWrkNo().intValue()){
                                    continue;
                                }
                                log.info(date+"取货任务下发:小车工作档:"+wrkMastSta);
                                log.info(date+"取货任务下发:目标站状态:"+basDevp);
                                boolean sign = rgvTakeFull(basRgvMap.getRgvNo(), wrkMastSta);
                                if (sign){
                                    boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd());
                                    if (signMap){
                                        wrkMastSta.setWrkSts(2);
                                        try{
                                            wrkMastStaMapper.updateById(wrkMastSta);
                                        }catch (Exception e){
                                            log.error("更新小车任务失败");
                                        }
                                        return true;
                                    }else {
                                        log.error("3978行,货物搬运单取任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                                    }
                                }else {
                                    log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
                                }
                                break;
                            }
                        }
                    }
                }
            } else if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                    && (rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                    || (rgvProtocol.getStatusType2() == RgvStatusType.SOS100 && rgvProtocol.getTaskNo2()==0))
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded1()==1
                        && rgvProtocol.getTaskNo1()!=0 && rgvProtocol.getTaskNo2()==0
            ) {// 只有当RGV空闲、自动,工位一有物  有工作号//rgv可用
                BasRgvMap basRgvMap = basRgvMapMapper.selectById(basRgv.getRgvNo());
                if (basRgvMap == null) {
                    log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo());
                    return false;
                }
                basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo1().longValue());
                if (Cools.isEmpty(wrkMastSta)){
                    return false;
                }
                if (wrkMastSta.getType()!=1 || wrkMastSta.getWrkType()!=3){//1:满版   3:取放
                    return false;
                }
                BasDevp basDevp = basDevpService.selectById(wrkMastSta.getStaEnd());
                if (!basDevp.getAutoing().equals("Y")){
                    return false;
                }
                if (!basDevp.getLoading().equals("Y") && basDevp.getWrkNo()==0){
                    Date date = new Date();
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, rgvSlave.getDevpPlcId());
                    StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo());
                    if (staProtocol == null) {
                        log.info(date+"取放任务下发:未查询到站点信息:"+wrkMastSta);
                        return false;
                    }
                    if (!staProtocol.isAutoing()){
                        return false;
                    }
                    if (!staProtocol.isLoading() && staProtocol.getWorkNo() == 0){
                        log.info(date+"取货任务下发:小车工作档:"+wrkMastSta);
                        log.info(date+"取货任务下发:目标站状态:"+basDevp);
                        boolean sign = rgvPutFull(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("3978行,货物搬运单取任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                            }
                        }else {
                            log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
                        }
                        return true;
                    }
                }
            }
//            }
        }catch (Exception e){
            log.error("3978行执行小车搬运任务下发失败");
            log.error("3978行"+e);
        }
        return false;
    }
    /**
     * 执行小车搬运任务//拆盘
     */
    public synchronized boolean rgvRunWrkMastEmptyStaPut(RgvSlave rgvSlave) {//拆盘
@@ -3903,7 +4118,10 @@
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                        //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && ((rgvProtocol.getTaskNo1()==0 && rgvProtocol.getLoaded1()==0)
                        || (rgvProtocol.getTaskNo1()>0 && rgvProtocol.getLoaded1()==1))
                        && 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());
@@ -3988,6 +4206,116 @@
        }
        return false;
    }
    /**
     * 执行小车搬运任务//拆盘
     */
    public synchronized boolean rgvRunWrkMastFullStaPut(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.getStatusType2() == RgvStatusType.SOS100 && rgvProtocol.getTaskNo2()==0))
                    && rgvProtocol.getModeType() == RgvModeType.AUTO
                    && rgvProtocol.getLoaded1()==1
                    && rgvProtocol.getTaskNo1()!=0 && rgvProtocol.getTaskNo2()==0
            ) {
                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()!=1 || wrkMastSta.getWrkType()!=6){// 1:满板  || 工作类型  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") || basDevp.getWrkNo()!=0){
                            continue;
                        }
                        if (basDevp.getDevNo()>117 && basDevp.getDevNo()<124){
                            if (basDevp.getLoadingSuper().equals("Y")){
                                continue;
                            }
                        }
                        if (basDevp.getDevNo()>=118 && basDevp.getDevNo()<=123){
                            if (!basDevp.getEmptyMk().equals("Y")){
                                continue;
                            }
                        }
                        Date date = new Date();
                        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, rgvSlave.getDevpPlcId());
                        StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo());
                        if (staProtocol == null) {
                            log.info(date+"拆盘任务下发:未查询到站点信息:"+wrkMastSta);
                            continue;
                        }
                        if (!staProtocol.isAutoing() || staProtocol.isLoading() || staProtocol.getWorkNo() != 0){
                            continue;
                        }
                        if (basDevp.getDevNo()>117 && basDevp.getDevNo()<124){
                            if (staProtocol.isLoadingSuper()){
                                continue;
                            }
                        }
                        if (basDevp.getDevNo()>=118 && basDevp.getDevNo()<=123){
                            if (!staProtocol.isEmptyMk()){
                                continue;
                            }
                        }
                        log.info(date+"拆盘任务下发:小车工作档:"+wrkMastSta);
                        log.info(date+"拆盘任务下发:目标站状态:"+basDevp);
//                        sign = rgvPutEmpty(rgvProtocol.getRgvNo(),wrkMastSta);//拆盘
                        sign = rgvPutFull(basRgvMap.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;
    }
    /**
     * 执行小车搬运任务
@@ -4011,7 +4339,10 @@
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                        //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && ((rgvProtocol.getTaskNo1()==0 && rgvProtocol.getLoaded1()==0)
                        || (rgvProtocol.getTaskNo1()>0 && rgvProtocol.getLoaded1()==1))
                        && rgvProtocol.getTaskNo2()==0
                        &&  (rgvProtocol.getLoaded2()==2  || rgvProtocol.getLoaded2()==3 ) ////0 无物;1 一层无物二层有物  ;2一层有物二层无物 (只能满放);3  1、2层都有物  4:()只允许拆盘
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
@@ -4116,7 +4447,10 @@
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                        //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && ((rgvProtocol.getTaskNo1()==0 && rgvProtocol.getLoaded1()==0)
                        || (rgvProtocol.getTaskNo1()>0 && rgvProtocol.getLoaded1()==1))
                        && rgvProtocol.getTaskNo2()==0
                        &&  (rgvProtocol.getLoaded2()==0  || rgvProtocol.getLoaded2()==1 ) //现场修改:叠盘机,////0 无物;1 一层无物二层有物(只能拆叠)   ;2一层有物二层无物 (只能满放);3  1、2层都有物  4:()只允许拆盘
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
@@ -4192,6 +4526,93 @@
        return false;
    }
    public synchronized boolean rgvRunWrkMastFullStaTake(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.getStatusType2() == RgvStatusType.SOS100 && rgvProtocol.getTaskNo2()==0))
                    && rgvProtocol.getModeType() == RgvModeType.AUTO
                    && rgvProtocol.getLoaded1() == 0
                    && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
            ) {
                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()!=1 || wrkMastSta.getWrkType()!=5){// 1:满板  || 工作类型  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;
                        }
                        Date date = new Date();
                        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, rgvSlave.getDevpPlcId());
                        StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo());
                        if (staProtocol == null) {
                            log.info(date+"叠盘任务下发:未查询到站点信息:"+wrkMastSta);
                            continue;
                        }
                        if (!staProtocol.isAutoing() || !staProtocol.isLoading()){
                            continue;
                        }
                        log.info(date+"叠盘任务下发:小车工作档:"+wrkMastSta);
                        log.info(date+"叠盘任务下发:目标站状态:"+basDevp);
//                        sign = rgvTakeEmpty(rgvProtocol.getRgvNo(),wrkMastSta);//叠盘
                        sign = rgvTakeFull(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()) {
@@ -4211,7 +4632,10 @@
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                        //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && ((rgvProtocol.getTaskNo1()==0 && rgvProtocol.getLoaded1()==0)
                        || (rgvProtocol.getTaskNo1()>0 && rgvProtocol.getLoaded1()==1))
                        && rgvProtocol.getTaskNo2()==0
                        &&  rgvProtocol.getLoaded2()==0  //现场修改:叠盘机,////0 无物;1 一层无物二层有物(只能拆叠)   ;2一层有物二层无物 (只能满放);3  1、2层都有物  4:()只允许拆盘
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
@@ -4247,7 +4671,7 @@
                                log.info(date+"满取任务下发:未查询到站点信息:"+wrkMastSta);
                                continue;
                            }
                            if (!staProtocol.isAutoing() || staProtocol.isLoading()){
                            if (!staProtocol.isAutoing() || !staProtocol.isLoading()){
                                continue;
                            }
@@ -4269,6 +4693,75 @@
                                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 rgvRunWrkMastMove(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.getStatusType2() == RgvStatusType.SOS100 && rgvProtocol.getTaskNo2()==0))
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && ((rgvProtocol.getTaskNo1()==0 && rgvProtocol.getLoaded1()==0)
                        || (rgvProtocol.getTaskNo1()>0 && rgvProtocol.getLoaded1()==1))
                        && rgvProtocol.getTaskNo2()==0
                ) {
                    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.getWrkType()!=4){// 2:空板  || 工作类型  1:取(叠盘)  2:拆盘  5:满取  6:满放  4 移动
                            continue;
                        }
                        boolean sign = false;
                        if ( wrkMastSta.getStaEnd()!=0){//放
                            sign = rgvAvoidanceXY(rgvProtocol.getRgvNo(),wrkMastSta);//拆盘
                        }else {
                            continue;
                        }
                        if (sign){
                            boolean signMap = rgvMapUpdate(basRgvMap, basRgvMap.getStartRoute(), wrkMastSta.getStaEnd());
                            if (signMap){
                                wrkMastSta.setWrkSts(3);
                                try{
                                    wrkMastStaMapper.updateById(wrkMastSta);
                                }catch (Exception e){
                                    log.error("更新小车任务失败");
                                }
                                return true;
                            }else {
                                log.error("3857行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                            }
                        }else {
                            log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
@@ -4315,8 +4808,9 @@
                // 只有当RGV空闲、自动,工位一无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded1()==0  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && rgvProtocol.getTaskNo1()==0
                        //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && ((rgvProtocol.getTaskNo1()==0 && rgvProtocol.getLoaded1()==0)
                        || (rgvProtocol.getTaskNo1()>0 && rgvProtocol.getLoaded1()==1))
                        && rgvProtocol.getTaskNo2()==0
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
@@ -4426,8 +4920,9 @@
                // 只有当RGV空闲、自动,工位一无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded1()==0  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && rgvProtocol.getTaskNo1()==0
                          //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && ((rgvProtocol.getTaskNo1()==0 && rgvProtocol.getLoaded1()==0)
                        || (rgvProtocol.getTaskNo1()>0 && rgvProtocol.getLoaded1()==1))
                        && rgvProtocol.getTaskNo2()==0
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvSlave.getId());
@@ -4493,6 +4988,119 @@
        }
    }
    /*
     * 小车XY移动  避让
     * */
    public synchronized boolean rgvAvoidanceXYWrkMast(Integer rgvId){
        if (rgvId==2){
            try{
                BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvId);
                //  命令下发区 --------------------------------------------------------------------------
                RgvCommand rgvCommand = new RgvCommand();
                rgvCommand.setRgvNo(rgvId); // RGV编号
                rgvCommand.setTaskNo1((short) 0); // 工作号
                rgvCommand.setAckFinish1((short) 1);  // 任务完成确认位
                rgvCommand.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
                rgvCommand.setSourceStaNo1((short)0);     // 源站
                rgvCommand.setDestinationStaNo1((short)0);     // 目标站
                rgvCommand.setAckFinish2((short) 0);  // 工位2任务完成确认位
                rgvCommand.setTaskNo2((short)32222); // 工位2工作号
                rgvCommand.setTaskMode2(RgvTaskModeType.X_MOVE); // 工位2任务模式:  回原点
                rgvCommand.setSourceStaNo2((short)121);
                rgvCommand.setCommand((short) 2);   //工位2任务确认
                if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(10, 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.setTaskNo1((short) 0); // 工作号
                rgvCommand.setAckFinish1((short) 1);  // 任务完成确认位
                rgvCommand.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
                rgvCommand.setSourceStaNo1((short)0);     // 源站
                rgvCommand.setDestinationStaNo1((short)0);     // 目标站
                rgvCommand.setAckFinish2((short) 0);  // 工位2任务完成确认位
                rgvCommand.setTaskNo2((short)32222); // 工位2工作号
                rgvCommand.setTaskMode2(RgvTaskModeType.X_MOVE); // 工位2任务模式:  回原点
                rgvCommand.setSourceStaNo2((short)118);
                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;
            }
        }
    }
    /*
     * 小车XY移动  避让
     * */
    public synchronized boolean rgvAvoidanceXY(Integer rgvId,WrkMastSta wrkMastSta){
        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( wrkMastSta.getStaEnd().shortValue());
                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( wrkMastSta.getStaEnd().shortValue());
                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;
            }
        }
    }
    /*
    * 小车取货至工位任务
@@ -4505,6 +5113,60 @@
            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 rgvTakeFullPut(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.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 rgvTakeFullTake(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.setSourceStaNo1(wrkMastSta.getStaStart().shortValue());   //工位1起点
            rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue());   //工位1目标站点
            rgvCommand.setCommand((short) 1);   //工位1任务确认
@@ -4691,6 +5353,28 @@
    }
    /*
     * 小车复位
     * */
    public synchronized boolean rgvComplete(Integer rgvId,Short taskNo1){
        try{
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setTaskNo1(taskNo1);
            //  命令下发区 --------------------------------------------------------------------------
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(8, 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){