#
zwl
2025-09-12 ac0d8b029f0b51615be54b28d66519594949c3d9
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -68,7 +68,7 @@
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private WaitPakinMapper waitPakinMapper;
    private WaitPakinService waitPakinService;
    @Autowired
    private LocMastService locMastService;
    @Autowired
@@ -86,6 +86,8 @@
    @Value("${wms.url}")
    private String wmsUrl;
    @Autowired
    private WrkMastServiceImpl wrkMastService;
    /**
     * 组托
@@ -172,6 +174,7 @@
                            String errorMsg = errMsg;
                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(5, errorMsg));
                        }
                        log.error("输送线异常组托退回={}",errMsg);
                        staProtocol.setWorkNo((short) 9999);
                        staProtocol.setStaNo((short)(inSta.getStaNo()-1));
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
@@ -404,7 +407,7 @@
//                staProtocol.setPakMk(true);
//                // 入出库模式判断
//                if (devpThread.ioMode != IoModeType.PAKIN_MODE) { continue; }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()){
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()&&staProtocol.getWorkNo()>=9990){
                   WrkMast wrkMast = wrkMastMapper.selectPakInStep3(staProtocol.getWorkNo().intValue());
//                     WrkMast  wrkMast = wrkMastMapper.selectPickStep(barcode);
                    if(wrkMast == null){
@@ -770,7 +773,7 @@
            crnCommand.setDestinationPosX(locMast.getRow1().shortValue());     // 目标库位排
            crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列
            crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层
            crnCommand.setCommand((short) 1);
            crnCommand.setCommand((short) 0);
            if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
            } else {
@@ -865,6 +868,26 @@
                        break;
                    }
                    //有AGV搬运入库时,禁止派发堆垛机出库任务
                    String staNo = "";
                    if(crnProtocol.getCrnNo()==1){
                        staNo = "105";
                    }else if(crnProtocol.getCrnNo()==2){
                        staNo = "103";
                    }else if(crnProtocol.getCrnNo()==3){
                        staNo = "101";
                    }
                    WaitPakin sku = waitPakinService.selectOne(new EntityWrapper<WaitPakin>().eq("sku", staNo));
                    if (!Cools.isEmpty(sku)) {
                        return;
                    }
                    //有拣料回库AGV搬运任务时,禁止派发堆垛机出库任务
                    List<WrkMast> wrkMasts1 = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("inv_wh", 0, 1, 2, 3).eq("sta_no", staNo));
                    if (!Cools.isEmpty(wrkMasts1)) {
                        return;
                    }
                    // 双深库位且浅库位有货,则需先对浅库位进行库位移转
                    if (Utils.isDeepLoc(slaveProperties, wrkMast.getSourceLocNo())) {
                        String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getSourceLocNo());
@@ -927,7 +950,7 @@
                    crnCommand.setDestinationPosX(crnStn.getRow().shortValue());     // 目标库位排
                    crnCommand.setDestinationPosY(crnStn.getBay().shortValue());     // 目标库位列
                    crnCommand.setDestinationPosZ(crnStn.getLev().shortValue());     // 目标库位层
                    crnCommand.setCommand((short) 1);
                    crnCommand.setCommand((short) 0);
                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                        log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
                    } else {
@@ -2065,5 +2088,174 @@
        }
    }
    /**
     * agv完成入库任务,给输送线下发入库任务
     * agv状态
     * be_batch
     * 0:无需调用AGV
     * 1:等待调用AGV
     * 2:AGV任务下发成功
     * 3:AGV任务完成
     * 4:给输送线下发入库指令完成
     */
    public synchronized void overAGVTaskIn() {
        int[] inStaNos= {101,103,105};
        for (int inStaNo : inStaNos) {
            // 获取入库站信息
            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
            StaProtocol staProtocol = devpThread.getStation().get(inStaNo);
            if (staProtocol == null) {
                continue;
            } else {
                staProtocol = staProtocol.clone();
            }
            // 判断是否满足入库条件
            if (staProtocol.isAutoing() && staProtocol.isLoading()
                    && !staProtocol.isEmptyMk() && staProtocol.getWorkNo() == 0){// && !Cools.isEmpty(barcode)) {
                //获取AGV搬运完成的入库通知档
                WaitPakin waitPakin = waitPakinService.selectOne(new EntityWrapper<WaitPakin>()
                        .eq("sku", staProtocol.getSiteId()+"")
                        .eq("be_batch", 3));
                if(Cools.isEmpty(waitPakin)){
                    continue;
                }
                short staNo = 0;
                if(staProtocol.getSiteId()==101){
                    staNo=102;
                }else if(staProtocol.getSiteId()==103){
                    staNo=104;
                }else if(staProtocol.getSiteId()==105){
                    staNo=106;
                }
                staProtocol.setWorkNo((short) 9991);
                staProtocol.setStaNo(staNo);
                devpThread.setPakMk(staProtocol.getSiteId(), false);
                boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
                if (!result) {
                    throw new CoolException("更新plc站点信息失败");
                }else {
                    waitPakin.setBeBatch(4);//4:给输送线下发入库指令完成
                    waitPakin.setModiTime(new  Date());
                    waitPakinService.update(waitPakin,new EntityWrapper<WaitPakin>().eq("supp_code",waitPakin.getSuppCode()));
                }
            }
        }
    }
    /**
     * agv出库搬离,清除站点工作号
     * wrk_sts
     * 30.等待给AGV下发出库任务
     * 31.AGV出库任务下发成功
     * 32.AGV已搬离
     * 33.等待下架
     */
    public synchronized void outStaNo() {
        int[] inStaNos= {101,103,105};
        for (int inStaNo : inStaNos) {
            // 获取入库站信息
            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
            StaProtocol staProtocol = devpThread.getStation().get(inStaNo);
            if (staProtocol == null) {
                continue;
            } else {
                staProtocol = staProtocol.clone();
            }
            // 判断是否满足agv搬运出库任务,搬离状态
            if (staProtocol.isAutoing() && !staProtocol.isLoading()
                    && !staProtocol.isEmptyMk() && staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() < 9990){// && !Cools.isEmpty(barcode)) {
                //获取AGV搬离的任务
                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                        .eq("wrk_no", staProtocol.getWorkNo())
                        .eq("wrk_sts",32L));
                if(Cools.isEmpty(wrkMast)){
                    continue;
                }
                staProtocol.setWorkNo((short) 0);
                staProtocol.setStaNo((short)0);
                devpThread.setPakMk(staProtocol.getSiteId(), false);
                boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
                if (!result) {
                    throw new CoolException("更新plc站点信息失败");
                }else {
                    wrkMast.setWrkSts(33L);
                    wrkMast.setModiTime(new Date());
                    wrkMastService.updateById(wrkMast);
                }
            }
        }
    }
    /**
     * agv完成入库任务,给输送线下发入库任务
     * agv状态
     * be_batch
     * 0:无需调用AGV
     * 1:等待调用AGV
     * 2:AGV任务下发成功
     * 3:AGV任务完成
     * 4:给输送线下发入库指令完成
     */
    public synchronized void overAGVTaskInReturn() {
        int[] inStaNos= {101,103,105};
        for (int inStaNo : inStaNos) {
            // 获取入库站信息
            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
            StaProtocol staProtocol = devpThread.getStation().get(inStaNo);
            if (staProtocol == null) {
                continue;
            } else {
                staProtocol = staProtocol.clone();
            }
            // 判断是否满足入库条件
            if (staProtocol.isAutoing() && staProtocol.isLoading()
                    && !staProtocol.isEmptyMk() && staProtocol.getWorkNo() == 0){// && !Cools.isEmpty(barcode)) {
                //获取AGV搬运完成的入库通知档
                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                        .eq("sta_no", staProtocol.getSiteId())
                        .eq("inv_wh", "1"));
                if(Cools.isEmpty(wrkMast)){
                    continue;
                }
                short staNo = 0;
                if(staProtocol.getSiteId()==101){
                    staNo=102;
                }else if(staProtocol.getSiteId()==103){
                    staNo=104;
                }else if(staProtocol.getSiteId()==105){
                    staNo=106;
                }
                staProtocol.setWorkNo((short) 9991);
                staProtocol.setStaNo(staNo);
                devpThread.setPakMk(staProtocol.getSiteId(), false);
                boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
                if (!result) {
                    throw new CoolException("更新plc站点信息失败");
                }else {
                    /**
                     * inv_wh
                     * 拣料回库输送线出发
                     * 0等待agv放货完成
                     * 1等待输送线入库
                     * 2输送线入库任务下发成功
                     */
                    wrkMast.setInvWh("2");//2输送线入库任务下发成功
                    wrkMast.setModiTime(new  Date());
                    wrkMastService.updateById(wrkMast);
                }
            }
        }
    }
}