#
lty
2025-09-15 11f6eb0bcda5e562d26ebc2c5ccd0672d66da76d
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -8,11 +8,16 @@
import com.core.common.DateUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.ArmTaskAssignmentParam;
import com.zy.asrs.entity.param.CombParam;
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 +98,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;
@@ -2803,6 +2815,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());
@@ -2835,6 +2848,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);
@@ -2911,7 +2941,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);
@@ -3288,7 +3335,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());
@@ -3388,7 +3435,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());
@@ -3864,13 +3911,50 @@
            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.setDirection2(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(direction);
                    rgvCommand.setCommand(true);   //工位1任务确认
                }
                if(!pakIn1){
                    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;
                    }
                }else{
                    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;
                    }
                }
            }
            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.setTargetPosition1(wrkMastSta.getStaStart());   //工位2目标站点
                    rgvCommand.setDirection2(direction);
                    rgvCommand.setCommand(true);   //工位1任务确认
                    pakIn1 = false;
@@ -3907,7 +3991,7 @@
                    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.setCommand(true);   //工位1任务确认
                    pakIn2 = false;
                }else{  //工位1任务放货
@@ -4183,4 +4267,170 @@
        }
    }
    /*
     * 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;
                        }
                        for (BasArmMast basArmMast:basArmMastList) {
                            ArmTaskAssignmentParam armTaskAssignmentParam = new ArmTaskAssignmentParam(basArmMast.getSortingLine());
                            //设置工作空间就绪
                            ReturnT<String> result = new PostMesDataUtils().postMesData("机械臂抓取任务下发:通知工作空间已就绪",ArmConstant.ARM_URL, 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());
        }
    }
}