野心家
2023-02-28 c68c709547e52fecaa71543ad46f8d3c0bb7fe97
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -122,13 +122,12 @@
                if (!Cools.isEmpty(barcode) && (staProtocol.getWorkNo() != 9998 || staProtocol.getWorkNo() != 9996)) {
                    log.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
                    if ("NG".endsWith(barcode) || "NoRead".equals(barcode)) {
                        String errorMsg = "15站扫码失败,已退回14站";
                        staProtocol.setWorkNo((short) 9998);
                        staProtocol.setStaNo((short) 14);
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        // led 异常显示
                        if (ledThread != null) {
                            String errorMsg = "扫码失败,请重试";
                            News.error(methodName +  ":扫码失败,请重试");
                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
                        }
@@ -137,16 +136,6 @@
                } else {
                    continue;
                }
                // 获取入库站信息
//                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                // 入出库模式判断
//                if ( inSta.getStaNo()==203 && devpThread.ioModeOf2F != IoModeType.PAKIN_MODE) { continue; }
//                if (inSta.getStaNo() == 203 && devpThread.ioModeOf2F == IoModeType.PAKOUT_MODE) {
//                    continue;
//                }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing()
@@ -173,6 +162,10 @@
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode);
                    if (wrkMast != null) {
                        News.error(methodName + ":工作档中已存在该站状态为( 2.设备上走 )的数据,工作号={}", wrkMast.getWrkNo());
                        if (ledThread != null) {
                            News.error(methodName +  ":扫码失败,请重试");
                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, "工作档中已存在该站状态为( 2.设备上走 )的数据,工作号={"+ wrkMast.getWrkNo() + "}, 请手动取消已存在工作档"));
                        }
                        continue;
                    }
@@ -212,13 +205,14 @@
                                throw new CoolException("更新plc站点信息失败");
                            }
                            String successMsg = "入库工作档--工作号:" + dto.getWorkNo() + " 目标库位:" + dto.getLocNo();
                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, successMsg));
                        } else {
                            staProtocol.setWorkNo((short) 9998);
                            staProtocol.setStaNo((short) 14);
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            if (ledThread != null) {
                                String errorMsg = jsonObject.getString("msg");
                                if (!Cools.isEmpty(errorMsg)) {
@@ -1494,109 +1488,144 @@
     * 出库  ===>> 工作档信息写入led显示器
     */
    public synchronized void ledExecute() {
        String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();
//        String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();
        for (LedSlave led : slaveProperties.getLed()) {
            // 获取输送线plc线程
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId());
            // 命令集合
            List<LedCommand> commands = new ArrayList<>();
            // 工作档集合
            List<WrkMast> wrkMasts = new ArrayList<>();
//            // 命令集合
//            List<LedCommand> commands = new ArrayList<>();
//            // 工作档集合
//            List<WrkMast> wrkMasts = new ArrayList<>();
            for (Integer staNo : led.getStaArr()) {
                // 获取叉车站点
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
                if (null == staProtocol || null == staProtocol.getWorkNo() || 0 == staProtocol.getWorkNo() || !staProtocol.isLoading()) {
                    MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, ""));
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 获取工作档数据
                WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo());
//                if (null == wrkMast || wrkMast.getWrkSts() < 14 || wrkMast.getIoType() < 100) { continue; }
                if (null == wrkMast) {
                    MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, ""));
                    continue;
                }
                wrkMasts.add(wrkMast);
                // 组装命令
                ArrayList<MatDto> matDtos = new ArrayList<>();
                Wrapper<WrkDetl> detlWrapper = new EntityWrapper<WrkDetl>()
                        .eq("wrk_no", wrkMast.getWrkNo());
                LedCommand ledCommand = new LedCommand();
                ledCommand.setWorkNo(wrkMast.getWrkNo());
                ledCommand.setStaNo(wrkMast.getStaNo());
                ledCommand.setSourceStaNo(wrkMast.getSourceStaNo());
                ledCommand.setLocNo(wrkMast.getLocNo());
                ledCommand.setSourceLocNo(wrkMast.getSourceLocNo());
                ledCommand.setIoType(wrkMast.getIoType());
                // 出库模式
                switch (wrkMast.getIoType()) {
                    case -1:
                        ledCommand.setTitle("全板入库");
                        break;
                ledCommand.setTitle(wrkMast.getIoType$());
                switch (wrkMast.getIoType()){
                    case 10:
                        ledCommand.setTitle("空板入库");
                        break;
                    case 10-1:
                        ledCommand.setTitle("全板出库");
                        break;
                    case 103:
                        ledCommand.setTitle("拣料出库");
                        break;
                    case 104:
                        ledCommand.setTitle("并板出库");
                        break;
                    case 107:
                        ledCommand.setTitle("盘点出库");
                        break;
                    case 110:
                        ledCommand.setTitle("空板出库");
                        ledCommand.setEmptyMk(true);
                        break;
                    default:
                        News.error(methodName + ":任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType());
                        ledCommand.setBarcode(wrkMast.getBarcode());
                        List<WrkDetl> wrkDetls = wrkDetlService.selectList(detlWrapper);
                        for (WrkDetl wrkDetl : wrkDetls) {
                            MatDto matDto = new MatDto();
                            matDto.setMaknx(wrkDetl.getMaktx());
                            matDto.setMatNo(wrkDetl.getMatnr());
                            matDto.setCount(wrkDetl.getAnfme());
                            matDtos.add(matDto);
                        }
                        break;
                }
                ledCommand.setSourceLocNo(wrkMast.getSourceLocNo());
                ledCommand.setLocNo(wrkMast.getLocNo());
                ledCommand.setStaNo(wrkMast.getStaNo());
//                ledCommand.setSourceStaNo(wrkMast.getSourceStaNo());
                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())));
                }
                commands.add(ledCommand);
            }
            Set<Integer> workNos = wrkMasts.stream().map(WrkMast::getWrkNo).collect(Collectors.toSet());
            // 获取LED线程
            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId());
            // 相同工作号集合则过滤
//            if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) {
//                continue;
                ledCommand.setMatDtos(matDtos);
                MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, ledCommand.toString()));
//                wrkMasts.add(wrkMast);
//                // 组装命令
//                LedCommand ledCommand = new LedCommand();
//                ledCommand.setWorkNo(wrkMast.getWrkNo());
//                ledCommand.setIoType(wrkMast.getIoType());
//                // 出库模式
//                switch (wrkMast.getIoType()) {
//                    case -1:
//                        ledCommand.setTitle("全板入库");
//                        break;
//                    case 10:
//                        ledCommand.setTitle("空板入库");
//                        break;
//                    case 10-1:
//                        ledCommand.setTitle("全板出库");
//                        break;
//                    case 103:
//                        ledCommand.setTitle("拣料出库");
//                        break;
//                    case 104:
//                        ledCommand.setTitle("并板出库");
//                        break;
//                    case 107:
//                        ledCommand.setTitle("盘点出库");
//                        break;
//                    case 110:
//                        ledCommand.setTitle("空板出库");
//                        ledCommand.setEmptyMk(true);
//                        break;
//                    default:
//                        News.error(methodName + ":任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", 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) {
//                    List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkMast.getWrkNo());
//                    wrkDetls.forEach(wrkDetl -> ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getAnfme())));
//                }
//                commands.add(ledCommand);
//            }
            // 命令下发 -------------------------------------------------------------------------------
            if (!commands.isEmpty()) {
                String errMsg = "";
                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) {
                    News.error(methodName + ":{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                    continue;
                } else {
                    ledThread.setLedMk(false);
                }
//            Set<Integer> workNos = wrkMasts.stream().map(WrkMast::getWrkNo).collect(Collectors.toSet());
//            // 获取LED线程
//            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId());
//            // 相同工作号集合则过滤
////            if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) {
////                continue;
////            }
//            // 命令下发 -------------------------------------------------------------------------------
//            if (!commands.isEmpty()) {
//                String errMsg = "";
//                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) {
//                    News.error(methodName + ":{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
//                    continue;
//                } else {
//                    ledThread.setLedMk(false);
//                }
//
//
            }
            try {
                // 修改主档led标记
                for (WrkMast wrkMast : wrkMasts) {
                    wrkMast.setOveMk("Y");
                    wrkMast.setModiTime(new Date());
                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                        throw new CoolException("更新工作档失败");
                    }
                }
                // 更新线程当前工作号集合
                ledThread.setWorkNos(workNos);
            } catch (Exception e) {
                e.printStackTrace();
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            }
//
//            try {
//                // 修改主档led标记
//                for (WrkMast wrkMast : wrkMasts) {
//                    wrkMast.setOveMk("Y");
//                    wrkMast.setModiTime(new Date());
//                    if (wrkMastMapper.updateById(wrkMast) == 0) {
//                        throw new CoolException("更新工作档失败");
//                    }
//                }
//
//                // 更新线程当前工作号集合
//                ledThread.setWorkNos(workNos);
//
//            } catch (Exception e) {
//                e.printStackTrace();
//                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//            }
        }
    }