#
lty
2025-09-22 9784ec36b190d0f0103b42059585d04ea0b10745
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -8,11 +8,18 @@
import com.core.common.DateUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.ArmOrderAssignmentParam;
import com.zy.asrs.entity.param.ArmTaskAssignmentParam;
import com.zy.asrs.entity.param.CombParam;
import com.zy.asrs.entity.result.OrderDetlValueResultUtil;
import com.zy.asrs.mapper.*;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.PostMesDataUtils;
import com.zy.asrs.utils.RouteUtils;
import com.zy.asrs.utils.Utils;
import com.zy.asrs.utils.VersionUtils;
import com.zy.asrs.utils.core.ReturnT;
import com.zy.common.constant.ArmConstant;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.MatDto;
import com.zy.common.model.SearchLocParam;
@@ -93,9 +100,16 @@
    private WrkMastService wrkMastService;
    @Autowired
    private BasRgvMapService basRgvMapService;
    @Autowired
    private BasArmService basArmService;
    @Autowired
    private BasArmMastService basArmMastService;
    @Value("${wms.url}")
    private String wmsUrl;
    @Value("${wms.comb}")
    private String wmsComb;
    @Value("${inventory.number}")
    private Integer inventoryNumber;
@@ -750,6 +764,7 @@
                    if ((wrkMast.getIoType() != 12 && wrkMast.getIoType() < 100) || wrkMast.getStaNo() == null || wrkMast.getSourceStaNo() == null) {
                        continue;
                    }
                    // 判断吊车是否实际已完成,且电脑状态在move中,以备电脑进行更新工作档
                    CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkMast.getCrnNo());
                    CrnProtocol crnProtocol = crnThread.getCrnProtocol();
@@ -812,51 +827,63 @@
            } else {
                staProtocolIn = staProtocolIn.clone();
            }
            StaProtocol staProtocolOut = devpThread.getStation().get(1015);
            if (staProtocolOut == null) {
                continue;
            } else {
                staProtocolOut = staProtocolOut.clone();
            }
            if(staProtocolOut.getWorkNo() != null &&staProtocolOut.getStaNo() == 4006){
                WrkMast wrkMastOut = wrkMastMapper.selectByWrkNo(staProtocolOut.getWorkNo());
                WrkMast wrkMast = wrkMastMapper.selectByWrkNo(9997);
                if(wrkMast == null){
            int[] outStaNos = {1015, 2016};
            for (int outStaNo : outStaNos) {
                StaProtocol staProtocolOut = devpThread.getStation().get(outStaNo);// 盘点出库衔接站点(可能是 1015,也可能是 2016)
                if (staProtocolOut == null) {
                    continue;
                } else {
                    staProtocolOut = staProtocolOut.clone();
                }
                try {
                    TransplantWork param = new TransplantWork();
                    param.setWorkNo(wrkMastOut.getWrkNo());
                    param.setBarcode(wrkMastOut.getBarcode());
                    param.setSourceStaNo(1015);
                    param.setStaNo(wrkMastOut.getStaNo());
                    String response = new HttpHandler.Builder()
                            .setUri(wmsUrl)
                            .setPath("/rpc/auto/TransplantingIn/v1")
                            .setJson(JSON.toJSONString(param))
                            .build()
                            .doPost();
                    JSONObject jsonObject = JSON.parseObject(response);
                    if (jsonObject.getInteger("code").equals(200)) {
                        staProtocolOut.setWorkNo(9997);
                        devpThread.setPakMk(staProtocolOut.getSiteId(), false);
                        boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocolOut));
                        if (!result) {
                            throw new CoolException("更新plc站点信息失败");
                        }
                if (staProtocolOut.getWorkNo() != null && staProtocolOut.getStaNo() == 4006) {
                    WrkMast wrkMastOut = wrkMastMapper.selectByWrkNo(staProtocolOut.getWorkNo());
                    WrkMast wrkMast = wrkMastMapper.selectByWrkNo(9997);
                    if (wrkMastOut == null) {
                        continue;
                    }
                    if (wrkMast != null) {
                        News.info("已存在斜街任务,等待任务完成");
                        continue;
                    }
                    try {
                        TransplantWork param = new TransplantWork();
                        param.setWorkNo(wrkMastOut.getWrkNo());
                        param.setBarcode(wrkMastOut.getBarcode());
                        param.setSourceStaNo(outStaNo);
                        param.setStaNo(wrkMastOut.getStaNo());
                } catch (Exception e) {
                    e.printStackTrace();
                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        String response = new HttpHandler.Builder()
                                .setUri(wmsUrl)
                                .setPath("/rpc/auto/TransplantingOut/v1")
                                .setJson(JSON.toJSONString(param))
                                .build()
                                .doPost();
                        JSONObject jsonObject = JSON.parseObject(response);
                        if (jsonObject.getInteger("code").equals(200)) {
                            staProtocolOut.setWorkNo(9997);
                            devpThread.setPakMk(staProtocolOut.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocolOut));
                            if (!result) {
                                throw new CoolException("更新plc站点信息失败");
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    }
                }
            }
            if(staProtocolIn.getWorkNo() != null &&staProtocolIn.getStaNo() != 4001){
                WrkMast wrkMastIn = wrkMastMapper.selectByWrkNo(staProtocolIn.getWorkNo());
                WrkMast wrkMast = wrkMastMapper.selectByWrkNo(9996);
                if(wrkMast == null){
                if(wrkMastIn == null){
                    continue;
                }
                if(wrkMast != null){
                    News.info("已存在斜街任务,等待任务完成");
                    continue;
                }
                try {
@@ -867,7 +894,7 @@
                    param.setStaNo(wrkMastIn.getStaNo());
                    String response = new HttpHandler.Builder()
                            .setUri(wmsUrl)
                            .setPath("/rpc/auto/TransplantingOut/v1")
                            .setPath("/rpc/auto/TransplantingIn/v1")
                            .setJson(JSON.toJSONString(param))
                            .build()
                            .doPost();
@@ -2699,7 +2726,9 @@
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE &&
                    rgvProtocol.getModeType() == RgvModeType.AUTO
                    && !rgvProtocol.isLoaded1ing()  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                    && (rgvProtocol.getTaskNo1()==0)
                    && rgvProtocol.getTaskNo1()==0
                        && !rgvProtocol.isLoaded2ing()
                        && rgvProtocol.getTaskNo2()==0
                        &&rgvThread.isPakMk()
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
@@ -2715,7 +2744,9 @@
                    if (rgvProtocolOther.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocolOther.getModeType() == RgvModeType.AUTO
                        && !rgvProtocolOther.isLoaded1ing()
                        && (rgvProtocolOther.getTaskNo1()==0)
                        && rgvProtocolOther.getTaskNo1()==0
                        && !rgvProtocolOther.isLoaded2ing()
                        && rgvProtocolOther.getTaskNo2()==0
                        &&rgvThreadOther.isPakMk()
                    ){
                        //对工作档进行判断
@@ -2786,6 +2817,7 @@
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && (rgvProtocol.getStatusType() == RgvStatusType.WORKING1)
                ){
                    log.info("{}号小车等待wcs确认,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol);
                    if(rgvProtocol.getTaskNo1() == 9999){ // 预调度任务确认
                        BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
@@ -2818,6 +2850,23 @@
                    if (rgvProtocol.getTaskNo1()!=0 && rgvProtocol.getTaskNo1()!=9999){
                        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo1());
                        if(wrkMastSta.getWrkSts() == 1){//取货确认
                            wrkMastSta.setWrkSts(4);  //行走状态
                            try{
                                wrkMastStaMapper.updateById(wrkMastSta);
                                log.error("更新小车任务成功");
                            }catch (Exception e){
                                log.error("更新小车任务失败");
                            }
                            boolean rgvComplete = false;
                            rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),7);
                            if (!rgvComplete){
                                log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                                break;
                            }
                            break;
                        }
                        if(wrkMastSta.getWrkSts() == 4){//行走确认
                            wrkMastSta.setWrkSts(2);
                            try{
                                wrkMastStaMapper.updateById(wrkMastSta);
@@ -2894,7 +2943,24 @@
                    log.info("{}号小车等待wcs确认,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol);
                    if (rgvProtocol.getTaskNo2() !=0 ){
                        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo1());
                        if(wrkMastSta.getWrkSts() == 1){//缺货确认
                        if(wrkMastSta.getWrkSts() == 1){//取货确认
                            wrkMastSta.setWrkSts(4);  //行走状态
                            try{
                                wrkMastStaMapper.updateById(wrkMastSta);
                                log.error("更新小车任务成功");
                            }catch (Exception e){
                                log.error("更新小车任务失败");
                            }
                            boolean rgvComplete = false;
                            rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),7);
                            if (!rgvComplete){
                                log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                                break;
                            }
                            break;
                        }
                        if(wrkMastSta.getWrkSts() == 4){//行走后确认
                            wrkMastSta.setWrkSts(2);
                            try{
                                wrkMastStaMapper.updateById(wrkMastSta);
@@ -3152,16 +3218,18 @@
            // 只有当RGV空闲 并且 无任务时才继续执行
            if ((rgvProtocol.getStatusType1() == RgvStatusType.IDLE || rgvProtocol.getStatusType2() == RgvStatusType.IDLE)
                    && rgvProtocol.getModeType() == RgvModeType.AUTO
//                    && rgvProtocol.getModeType() == RgvModeType.AUTO
                    && rgvThread.isPakMk()) {
                News.warnNoLog(""+mark+" - 0"+" - 开始执行RGV入出库作业下发");
                // 如果最近一次是入库模式
//                rgvRunWrkMastInTest();
                if (rgvProtocol.getLastIo().equals("I")) {
                    if (basRgv.getInEnable().equals("Y") && rgvThread.isPakIn()) {
                    if (basRgv.getInEnable().equals("1") && rgvThread.isPakIn()) {
                        //mark - 1 - ....
                        this.rgvRunWrkMastIn(rgv, rgvProtocol,mark); //  入库
                        rgvProtocol.setLastIo("O");
                    } else if (basRgv.getOutEnable().equals("Y") && rgvThread.isPakOut()) {
                    } else if (basRgv.getOutEnable().equals("1") && rgvThread.isPakOut()) {
                        //mark - 2 - ....
                        this.rgvRunWrkMastOut(rgv, rgvProtocol,mark); //  出库
                        rgvProtocol.setLastIo("I");
@@ -3169,10 +3237,10 @@
                }
                // 如果最近一次是出库模式
                else if (rgvProtocol.getLastIo().equals("O")) {
                    if (basRgv.getOutEnable().equals("Y") && rgvThread.isPakOut()) {
                    if (basRgv.getOutEnable().equals("1") && rgvThread.isPakOut()) {
                        this.rgvRunWrkMastOut(rgv, rgvProtocol,mark); //  出库
                        rgvProtocol.setLastIo("I");
                    } else if (basRgv.getInEnable().equals("Y") && rgvThread.isPakIn()) {
                    } else if (basRgv.getInEnable().equals("1") && rgvThread.isPakIn()) {
                        this.rgvRunWrkMastIn(rgv, rgvProtocol,mark); //  入库
                        rgvProtocol.setLastIo("O");
                    }
@@ -3193,6 +3261,44 @@
                rgvOutExecute();
            }
        }
    }
    public synchronized void rgvRunWrkMastInTest(){
        BasRgvMap basRgvMap = basRgvMapMapper.selectById(1);
        List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
        basRgvMap.setNowRoute(1031); //更新小车当前位置站点号
        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(342);//根据站点工作号和小车工作范围检索任务档
//        WrkMastSta wrkMastSta2 = wrkMastStaMapper.selectByWorkSta(2, 1);
        boolean result = false;
//        if(wrkMastSta2 != null && rgvProtocol.getRgvNo() == 1){ //距离计算   2楼单入库口不需要计算
//            result = rgvCalcDistance((int) rgvProtocol.getRgvNo(),wrkMastSta2.getStaEnd(),wrkMastSta.getStaStart());//工位2放货站点,工位1取货站点
//        }
//        if(result){//若小车距离放货点距离近于取货点则跳过取货 true跳过取货/false优先取货
//            rgvThread.setPakRgv(false);
//            continue;
//        }
        wrkMastSta.setWorkSta(1);
        wrkMastSta.setRgvNo(1);
        wrkMastSta.setStaStart(1031);
        Short direction = 2;//双工位最终抵达位置
        boolean sign = false;
        sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,direction); //命令下发
        if (sign){
            wrkMastSta.setWrkSts(1);
            try{
                wrkMastStaMapper.updateById(wrkMastSta);
                log.error("更新小车任务成功");
            }catch (Exception e){
                log.error("更新小车任务失败");
            }
//            rgvThread.setPakOut(false);//出库不允许
            boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd(),"2526");
            if (!signMap){
                log.error("货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
            }
        } else {
            log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
        }
    }
    /**
@@ -3271,7 +3377,7 @@
            Short direction = 2;//双工位最终抵达位置
            boolean sign = false;
            //若取货为工位2且取货口前一站点有物,给双工位同时下发指令
            if(wrkMastSta.getWorkSta() == 2 && staProtocol2 != null && staProtocol2.isLoading() && staProtocol2.getWorkNo() > 0){
            if(wrkMastSta.getWorkSta() == 2 && staProtocol2 != null && staProtocol2.isLoading() && staProtocol2.getWorkNo() > 0 && sign){
                WrkMastSta wrkMastSta3 = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol2.getWorkNo()));//根据站点工作号和小车工作范围检索任务档
                wrkMastSta3.setWorkSta(1);
                wrkMastSta3.setRgvNo((int) rgvProtocol.getRgvNo());
@@ -3371,7 +3477,7 @@
            boolean sign = false;
            Short direction = 1;//工位1方向
            //若取货为工位2且取货口前一站点有物,给双工位同时下发指令
            if(wrkMastSta.getWorkSta() == 1 && staProtocol2 != null && staProtocol2.isLoading() && staProtocol2.getWorkNo() > 0){
            if(wrkMastSta.getWorkSta() == 1 && staProtocol2 != null && staProtocol2.isLoading() && staProtocol2.getWorkNo() > 0 && sign){
                WrkMastSta wrkMastSta3 = wrkMastStaMapper.selectNoInterfere(route, route, Long.valueOf(staProtocol2.getWorkNo()));//根据站点工作号和小车工作范围检索任务档
                wrkMastSta3.setWorkSta(2);
                wrkMastSta3.setRgvNo((int) rgvProtocol.getRgvNo());
@@ -3492,7 +3598,7 @@
//                        if (staNos.contains(wrkMastSta.getStaStart())) {//非入库口(出库口)限制
//                            continue;
//                        }
//                        boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发
//                        boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,null); //命令下发
//                        wrkEnable = true;
//                        if (sign){
//                            wrkMastSta.setWrkSts(1);
@@ -3847,14 +3953,54 @@
            boolean pakIn1 = true;
            boolean pakIn2 = true;
            rgvCommand.setRgvNo(rgvId); // RGV编号
            if(wrkMastSta.getWrkSts() == 0){//取货
            if(wrkMastSta.getWrkSts() == 0 || wrkMastSta.getWrkSts() == 4){//初始后行走
                if(wrkMastSta.getWorkSta() == 2){//出库RGV取货行走
                    rgvCommand.setAckFinish2(false);  // 工位2任务完成确认位
                    rgvCommand.setTaskNo2(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位2工作号
                    rgvCommand.setTaskStatus2(RgvTaskStatusType.X_MOVE); // 工位2任务模式:  取放货
                    rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd());   //工位2 放货后要去的位置
                    rgvCommand.setTargetPosition1(wrkMastSta.getStaStart());   //工位2目标站点
//                    rgvCommand.setDirection1((short) 2);
//                    rgvCommand.setWrkTaskMove2(direction);
                    rgvCommand.setCommand(true);   //工位1任务确认
                    pakIn1 = false;
                }else{  //入库RGV取货行走
                    rgvCommand.setAckFinish1(false);  // 工位1任务完成确认位
                    rgvCommand.setTaskNo1(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位1工作号
                    rgvCommand.setTaskStatus1(RgvTaskStatusType.X_MOVE); // 工位1任务模式:  取放货
                    rgvCommand.setEndStaNo1(wrkMastSta.getWrkEnd());   //工位1 放货后要去的位置
                    rgvCommand.setTargetPosition1(wrkMastSta.getStaStart());   //工位1目标站点
//                    rgvCommand.setDirection1((short) 1);
//                    rgvCommand.setDirection1(direction);
                    rgvCommand.setCommand(true);   //工位1任务确认
                }
                if(!pakIn1){
                    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;
                    }
                }else{
                    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;
                    }
                }
            }
            if(wrkMastSta.getWrkSts() == 1){//取货
                if(wrkMastSta.getWorkSta() == 2){//出库RGV取货
                    rgvCommand.setAckFinish2(false);  // 工位2任务完成确认位
                    rgvCommand.setTaskNo2(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位2工作号
                    rgvCommand.setTaskStatus2(RgvTaskStatusType.FETCH); // 工位2任务模式:  取放货
                    rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd());   //工位2 放货后要去的位置
                    rgvCommand.setTargetPosition2(wrkMastSta.getStaStart());   //工位2目标站点
                    rgvCommand.setDirection2(direction);
                    rgvCommand.setTargetPosition1(wrkMastSta.getStaStart());   //工位2目标站点
                    rgvCommand.setDirection1((short)2);
                    rgvCommand.setWrkTaskMove2(direction);
                    rgvCommand.setCommand(true);   //工位1任务确认
                    pakIn1 = false;
                }else{  //入库RGV取货
@@ -3863,7 +4009,8 @@
                    rgvCommand.setTaskStatus1(RgvTaskStatusType.FETCH); // 工位1任务模式:  取放货
                    rgvCommand.setEndStaNo1(wrkMastSta.getWrkEnd());   //工位1 放货后要去的位置
                    rgvCommand.setTargetPosition1(wrkMastSta.getStaStart());   //工位1目标站点
                    rgvCommand.setDirection1(direction);
                    rgvCommand.setDirection1((short)1);
                    rgvCommand.setWrkTaskMove1(direction);
                    rgvCommand.setCommand(true);   //工位1任务确认
                }
                if(!pakIn1){
@@ -3890,7 +4037,8 @@
                    rgvCommand.setTaskNo2(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位2工作号
                    rgvCommand.setTaskStatus2(RgvTaskStatusType.PUT); // 工位2任务模式:  放货
                    rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd());   //工位2 放货后要去的位置
                    rgvCommand.setTargetPosition2(wrkMastSta.getStaEnd());   //工位2目标站点
                    rgvCommand.setTargetPosition1(wrkMastSta.getStaEnd());   //工位2目标站点
                    rgvCommand.setDirection1((short)2);
                    rgvCommand.setCommand(true);   //工位1任务确认
                    pakIn2 = false;
                }else{  //工位1任务放货
@@ -3899,6 +4047,7 @@
                    rgvCommand.setTaskStatus1(RgvTaskStatusType.PUT); // 工位1任务模式:  放货
                    rgvCommand.setEndStaNo1(wrkMastSta.getWrkEnd());   //工位1 放货后要去的位置
                    rgvCommand.setTargetPosition1(wrkMastSta.getStaEnd());   //工位1目标站点
                    rgvCommand.setDirection1((short)1);
                    rgvCommand.setCommand(true);   //工位1任务确认
                }
                if(!pakIn2){
@@ -4166,4 +4315,198 @@
        }
    }
    /*
     * arm任务完成自动组托
     * */
    public synchronized void armMissionAccomplished() {
        try{
            for (DevpSlave devp : slaveProperties.getDevp()) {
                // 遍历拣料入库口
                for (DevpSlave.Sta armSta : devp.getArmSta()) {
                    // 获取条码扫描仪信息
                    BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, armSta.getBarcode());
                    if (barcodeThread == null) {
                        continue;
                    }
                    String barcode = barcodeThread.getBarcode();
                    if(!Cools.isEmpty(barcode)) {
                        if("NG".endsWith(barcode) || "NoRead".equals(barcode)) {
                            continue;
                        }
                    } else {
                        continue;
                    }
                    List<BasArm> basArmList = basArmService.selectList(new EntityWrapper<BasArm>()
                            .eq("arm_no", armSta.getArmNo())
                            .eq("sta_no", armSta.getStaNo())
                            .eq("status", 1));
                    for (BasArm basArm : basArmList) {
                        if (basArm.getStatus()!=1){
                            continue;
                        }
                        try{
                            List<BasArmMast> basArmMastList = basArmMastService.selectList(
                                    new EntityWrapper<BasArmMast>()
                                            .eq("arm_no", basArm.getArmNo())
                                            .eq("sorting_line", basArm.getSortingLine())
                                            .eq("status", 3)
                            );
                            if (basArmMastList.isEmpty()){
                                continue;
                            }
                            CombParam combParam = new CombParam(basArmMastList);
                            combParam.setBarcode(barcode);
                            //设置工作空间就绪
                            ReturnT<String> result = new PostMesDataUtils().postMesData("arm任务完成自动组托",wmsUrl, wmsComb, combParam);
                            if (result.getCode()==200){
                                basArmMastService.updateArmMastStatus(basArm.getArmNo(),basArm.getSortingLine(),3,4);
                            } else {
                                log.error("机械臂抓取任务完成:"+JSON.toJSON(basArmMastList)+"===》自动组托失败,等待重试");
                            }
                        }  catch (Exception e){
                            log.error("arm编号:"+basArm.getArmNo()+"====》机械臂抓取任务完成"+e.getMessage());
                        }
                        break;
                    }
                }
            }
        } catch (Exception e){
            log.error("机械臂抓取任务完成组托失败"+e.getMessage());
        }
    }
    public synchronized void armMissionAccomplishedScanToCheckIn() {
        try{
            for (DevpSlave devp : slaveProperties.getDevp()) {
                // 遍历拣料入库口
                for (DevpSlave.Sta armSta : devp.getArmSta()) {
                    List<BasArmMast> basArmMastList = basArmMastService.selectList(
                            new EntityWrapper<BasArmMast>()
                                    .eq("arm_no", armSta.getArmNo())
                                    .eq("sta_no", armSta.getStaNo())
                                    .eq("status", 4)
                    );
                    if (basArmMastList.isEmpty()){
                        continue;
                    }
                    // 获取站点信息
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(armSta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()) {
                        int workNo = commonService.getWorkNo(6);//待完善
                        // 更新站点信息 且 下发plc命令
                        staProtocol.setWorkNo(workNo);
                        staProtocol.setStaNo(armSta.getStaNoEnd().shortValue());
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        log.error("输送线下发5:"+workNo+","+armSta.getStaNoEnd());
                        if (!result) {
                            News.error(""+" - 3"+" - 发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId());
                        }
                        basArmMastService.updateArmMastStatus(basArmMastList.get(0).getArmNo(),basArmMastList.get(0).getSortingLine(),4,5);
                    }
                }
            }
        } catch (Exception e){
            log.error("组托完成驱动托盘扫码入库失败"+e.getMessage());
        }
    }
    /*
     * arm任务下发
     * */
    public synchronized void armTaskAssignment() {
        try{
            List<BasArm> basArmList = basArmService.selectList(new EntityWrapper<>());
            for (BasArm basArm : basArmList) {
                if (basArm.getStatus()!=1){
                    continue;
                }
                try{
                    List<BasArmMast> basArmMastListRuning = basArmMastService.selectList(
                            new EntityWrapper<BasArmMast>()
                                    .eq("arm_no", basArm.getArmNo())
                                    .eq("sorting_line", basArm.getSortingLine())
                                    .eq("status", 1)
                    );
                    List<BasArmMast> basArmMastListRuning3 = basArmMastService.selectList(
                            new EntityWrapper<BasArmMast>()
                                    .eq("arm_no", basArm.getArmNo())
                                    .eq("sorting_line", basArm.getSortingLine())
                                    .eq("status", 3)
                    );
                    if (basArmMastListRuning.isEmpty() && basArmMastListRuning3.isEmpty()){
                        List<BasArmMast> basArmMastList = basArmMastService.selectList(
                                new EntityWrapper<BasArmMast>()
                                        .eq("arm_no", basArm.getArmNo())
                                        .eq("sorting_line", basArm.getSortingLine())
                                        .eq("status", 0)
                        );
                        if (basArmMastList.isEmpty()){
                            continue;
                        }
                        if (basArmMastList.size()>1){
                            log.error("arm编号:"+basArm.getArmNo()+"====》拆码垛任务异常禁止下发!!!任务待执行数量大于1!!!");
                            continue;
                        }
                        BasArmMast basArmMast = basArmMastList.get(0);
                        List<BasArmMast> basArmMastListOrder = basArmMastService.selectList(
                                new EntityWrapper<BasArmMast>()
                                        .eq("arm_no", basArm.getArmNo())
                                        .eq("sorting_line", basArm.getSortingLine())
                                        .eq("sku", basArmMast.getSku())
                                        .eq("order_no", basArmMast.getOrderNo())
                        );
                        if (basArmMastListOrder.size()==1){
                            OrderDetlValueResultUtil orderDetlValueResultUtil = basArmMastService.selectOrderDetlValue(basArmMast.getOrderNo(), basArmMast.getSku());
                            if (Cools.isEmpty(orderDetlValueResultUtil)){
                                continue;
                            }
                            //订单下发
                            try{
                                ArmOrderAssignmentParam armOrderAssignmentParam = new ArmOrderAssignmentParam(basArmMast,orderDetlValueResultUtil);
//                                订单下发(SKU+订单)
                                ReturnT<String> result = new PostMesDataUtils().postMesData("机械臂抓取订单(SKU)下发:",ArmConstant.getArmUrl(basArmMast.getArmNo()), ArmConstant.ARM_ADAPTOR, armOrderAssignmentParam);
                                if (result.getCode()==200){
                                    basArmMast.setStatus(1);
                                    basArmMastService.updateById(basArmMast);
                                } else {
                                    log.error("机械臂抓取订单(SKU)下发:"+JSON.toJSON(basArmMast)+"===》订单信息下发失败");
                                }
                            } catch (Exception e){
                                log.error("机械臂抓取订单(SKU)下发:"+JSON.toJSON(basArmMast)+"===》订单下发订单信息下发失败");
                                continue;
                            }
                        }
                        ArmTaskAssignmentParam armTaskAssignmentParam = new ArmTaskAssignmentParam(basArmMast.getSortingLine());
                        //设置工作空间就绪
                        ReturnT<String> result = new PostMesDataUtils().postMesData("机械臂抓取任务下发:通知工作空间已就绪",ArmConstant.getArmUrl(basArmMast.getArmNo()), ArmConstant.ARM_WORKSPACE, armTaskAssignmentParam);
                        if (result.getCode()==200){
                            basArmMast.setStatus(1);
                            basArmMastService.updateById(basArmMast);
                        } else {
                            log.error("机械臂抓取任务:"+JSON.toJSON(basArmMast)+"===》任务信息下发失败");
                        }
                    }
                }  catch (Exception e){
                    log.error("arm编号:"+basArm.getArmNo()+"====》拆码垛任务下发失败"+e.getMessage());
                }
            }
        }catch (Exception e){
            log.error("arm任务下发失败"+e.getMessage());
        }
    }
}