zhou zhou
2025-12-23 5b38cd8435ccd19887b0ab1ece82408366de532d
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 {
@@ -1435,6 +1458,7 @@
     * 出库  ===>> 工作档信息写入led显示器
     */
    public synchronized void ledExecute() {
        for (LedSlave led : slaveProperties.getLed()) {
            // 获取输送线plc线程
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId());
@@ -1453,7 +1477,10 @@
                // 获取工作档数据
                WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo());
//                if (null == wrkMast || wrkMast.getWrkSts() < 14 || wrkMast.getIoType() < 100) { continue; }
                if (null == wrkMast) { continue; }
                if (null == wrkMast) {
                    continue;
                }
                log.info("开始执行:出库  ===>> 工作档信息写入led显示器");
                wrkMasts.add(wrkMast);
                // 组装命令
                LedCommand ledCommand = new LedCommand();
@@ -1483,17 +1510,40 @@
                        ledCommand.setTitle("空板出库");
                        ledCommand.setEmptyMk(true);
                        break;
                    case 53:
                        ledCommand.setTitle("拣料入库");
                        break;
                    case 57:
                        ledCommand.setTitle("盘点入库");
                        break;
                    case 54:
                        ledCommand.setTitle("并板入库");
                        break;
                    default:
                        log.error("任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType());
                        log.error("电视机显示任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType());
                        break;
                }
                ledCommand.setSourceLocNo(wrkMast.getSourceLocNo());
                ledCommand.setLocNo(wrkMast.getLocNo());
                ledCommand.setStaNo(wrkMast.getStaNo());
//                ledCommand.setSourceStaNo(wrkMast.getSourceStaNo());
                if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10 ) {
                if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) {
                    List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkMast.getWrkNo());
                    wrkDetls.forEach(wrkDetl -> ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getAnfme(),wrkDetl.getSpecs(),wrkDetl.getModel())));
                    try{
                        if (wrkMast.getIoType()>100){
                            for (WrkDetl wrkDetl : wrkDetls){
                                LocDetl locDetl = locDetlService.selectMatnrSpecs(wrkDetl.getMatnr(), wrkDetl.getSpecs(), wrkMast.getSourceLocNo());
                                wrkDetl.setWeight(locDetl.getAnfme());
                            }
                        }else {
                            for (WrkDetl wrkDetl : wrkDetls){
                                wrkDetl.setWeight(wrkDetl.getAnfme());
                            }
                        }
                    }catch (Exception e){
                        log.error("工作档案明细输入电视机失败1:异常信息==》"+e);
                    }
                    wrkDetls.forEach(wrkDetl -> ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getAnfme(),wrkDetl.getWeight(),wrkDetl.getSpecs(),wrkDetl.getSku())));
                }
                commands.add(ledCommand);
            }
@@ -1504,24 +1554,33 @@
            if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) {
                continue;
            }
//             命令下发 -------------------------------------------------------------------------------
//            if (!commands.isEmpty()) {
//                if (led.getId() < 7) {
//                    if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) {
//                        News.error(""+mark+" - 2"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
//                        continue;
//                    } else {
//                        ledThread.setLedMk(false);
//                    }
//                } else {
//                    if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(1, commands))) {
//                        News.error(""+mark+" - 3"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
//                        continue;
//                    } else {
//                        ledThread.setLedMk(false);
//                    }
//                }
//
//            }
            // 命令下发 -------------------------------------------------------------------------------
            if (!commands.isEmpty()) {
                if (led.getId()>4){
                    if (!MessageQueue.offer(SlaveType.Led, led.getId()-4, new Task(3, commands))) {
                        log.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                        continue;
                    } else {
                        ledThread.setLedMk(false);
                    }
                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) {
                    log.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                    continue;
                }else {
                    if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) {
                        log.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                        continue;
                    } else {
                        ledThread.setLedMk(false);
                    }
                    ledThread.setLedMk(false);
                }
            }
            try {
@@ -1530,6 +1589,7 @@
                    wrkMast.setOveMk("Y");
                    wrkMast.setModiTime(new Date());
                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                        log.error("电视机标记做到工作档中 - 更新工作档失败");
                        throw new CoolException("更新工作档失败");
                    }
                }
@@ -1543,6 +1603,7 @@
            }
        }
        log.info(" - 出库  ===>> 工作档信息写入led显示器执行完成");
    }
    /**
@@ -1743,7 +1804,7 @@
                wrkMast.setCrnNo(crn.getId());
                wrkMast.setSourceLocNo(shallowLoc.getLocNo()); // 源库位
                wrkMast.setLocNo(loc.getLocNo()); // 目标库位
                wrkMast.setFullPlt(shallowLoc.getFullPlt()); // 满板
                wrkMast.setFullPlt(shallowLoc.getLocSts().equals("F") ? "Y" : "N"); // 满板:Y
                wrkMast.setPicking("N"); // 拣料
                wrkMast.setExitMk("N"); // 退出
                wrkMast.setEmptyMk(shallowLoc.getLocSts().equals("D") ? "Y" : "N"); // 空板
@@ -2065,5 +2126,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);
                }
            }
        }
    }
}