Junjie
2023-12-08 ffe256867f19115a442d96abadd270d2c17835a9
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -205,12 +205,12 @@
//                        devpThread.setPakMk(staProtocol.getSiteId(), false);
//                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        // led 异常显示
                        LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
                        if (ledThread != null) {
                            String errorMsg = "扫码失败,请重试";
                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
                        }
//                        // led 异常显示
//                        LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
//                        if (ledThread != null) {
//                            String errorMsg = "扫码失败,请重试";
//                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
//                        }
                        continue;
                    }
@@ -272,6 +272,7 @@
                                String errorMsg = jsonObject.getString("msg");
                                if (!Cools.isEmpty(errorMsg)) {
                                    MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
                                    ledThread.setLedMk(false);
                                }
                            }
                            News.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
@@ -285,6 +286,7 @@
                            if (ledThread != null) {
                                String errorMsg = barcode + "托盘识别异常,请先进行组托!";
                                MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
                                ledThread.setLedMk(false);
                            }
                        }
                    } catch (Exception e) {
@@ -396,13 +398,16 @@
    }
    /**
     * 拣料、并板、盘点再入库
     * 拣料、并板再入库
     */
    @Transactional
    public synchronized void stnToCrnStnPick(){
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历拣料入库口
            for (DevpSlave.Sta pickSta : devp.getPickInSta()) {
                if (pickSta.getStaNo() == 325 || pickSta.getStaNo() == 331 || pickSta.getStaNo() == 333 || pickSta.getStaNo() == 339) {
                    continue;
                }
                // 获取拣料入库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
@@ -414,8 +419,8 @@
                }
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
//                        && (staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() < 9999)
//                        && staProtocol.getStaNo().equals(staProtocol.getSiteId().shortValue())
                        && staProtocol.isInEnable()
//                        && (staProtocol.getWorkNo() > 0)
                        && staProtocol.isPakMk()){
                    // 获取条码扫描仪信息
@@ -424,58 +429,49 @@
                        continue;
                    }
                    String barcode = barcodeThread.getBarcode();
                    WrkMast wrkMast = null;
                    wrkMast = wrkMastMapper.selectPickStepByBarcode(barcode);
                    if (wrkMast == null) {
                    if(Cools.isEmpty(barcode)) {
                        continue;
                    }
//                    if (staProtocol.getWorkNo() == 9996) {
//                        String barcode = barcodeThread.getBarcode();
//                        if(!Cools.isEmpty(barcode)) {
//                            News.info("{}号条码扫描器检测条码信息:{}", pickSta.getBarcode(), barcode);
//                            if("NG".endsWith(barcode) || "NoRead".equals(barcode) || "empty".equals(barcode)) {
//                                staProtocol.setWorkNo((short) 32002);
//                                staProtocol.setStaNo(pickSta.getBackSta().shortValue());
//                                devpThread.setPakMk(staProtocol.getSiteId(), false);
//                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//
//                                // led 异常显示
//                                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed());
//                                if (ledThread != null) {
//                                    String errorMsg = "扫码失败,请重试";
//                                    MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(3, errorMsg));
//                                }
//                                continue;
//                            }
//                        } else {
//                            staProtocol.setWorkNo((short) 32002);
//                            staProtocol.setStaNo(pickSta.getBackSta().shortValue());
//                            devpThread.setPakMk(staProtocol.getSiteId(), false);
//                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//
//                            // led 异常显示
//                            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed());
//                            if (ledThread != null) {
//                                String errorMsg = "扫码失败,请重试";
//                                MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(3, errorMsg));
//                            }
//                            continue;
//                        }
//                        wrkMast = wrkMastMapper.selectPickStepByBarcode(barcode);
//                        if (null == wrkMast) {
//                            News.error("{}条码错误,暂无拣料任务!", barcode);
//                        }
//                    }
                    if ((wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 107)
                        || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo()) ) {
                    if("NG".endsWith(barcode) || "NoRead".equals(barcode) || "empty".equals(barcode)) {
                        continue;
                    }
                    WrkMast wrkMast = wrkMastMapper.selectPickStepByBarcode(barcode);
                    if (wrkMast == null) {//找不到工作档
                        continue;
                    }
                    if ((wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104)
                            || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo()) ) {
                        continue;
                    }
                    //*********************同库位组校验*********************
                    boolean flag = false;
                    String th = "";
                    List<String> innerLoc = Utils.getGroupInnerLoc(wrkMast.getSourceLocNo());
                    for (String loc : innerLoc) {
                        LocMast locMast = locMastService.selectById(loc);
                        if (locMast == null) {
                            continue;
                        }
                        if (!locMast.getLocSts().equals("F")) {
                            flag = true;
                            th = loc + "库位存在未回库任务";
                            break;
                        }
                    }
                    if (flag) {
                        News.info(th);
                        continue;
                    }
                    //*********************同库位组校验*********************
                    // 保存工作主档历史档
                    if (wrkMastMapper.saveWrkMastLog(wrkMast.getWrkNo()) == 0) {
                        throw new CoolException(wrkMast.getWrkNo() + "保存工作主档历史档失败");
                        News.info(wrkMast.getWrkNo() + "保存工作主档历史档失败");
                        continue;
                    }
                    String sourceLocNo = wrkMast.getSourceLocNo().trim();
@@ -487,7 +483,7 @@
                    // 更新工作档数据状态
                    wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57
                    wrkMast.setWrkSts(2L); // 工作状态: 2.设备上走
                    wrkMast.setSourceStaNo(pickSta.getStaNo()); // 源站
                    wrkMast.setSourceStaNo(pickSta.getBackSta()); // 源站
//                            wrkMast.setStaNo(dto.getStaNo()); // 目标站
//                            wrkMast.setCrnNo(dto.getCrnNo());
                    wrkMast.setStaNo(liftStaProtocol.getStaNo());//目标站
@@ -496,10 +492,8 @@
                    wrkMast.setLiftNo(null);// 提升机清空
                    wrkMast.setModiTime(new Date());
                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                        throw new CoolException(wrkMast.getWrkNo() + "更新工作档数据状态失败");
                    }
                    if (wrkMastMapper.setSteEmpty(wrkMast.getWrkNo()) == 0) {
                        throw new CoolException(wrkMast.getWrkNo() + "更新工作档数据状态失败");
                        News.info(wrkMast.getWrkNo() + "更新工作档数据状态失败");
                        continue;
                    }
                    // 修改库位状态 Q.拣料/盘点/并板再入库
@@ -507,127 +501,472 @@
                    locMast.setLocSts("Q");
                    locMast.setModiTime(new Date());
                    if (!locMastService.updateById(locMast)) {
                        throw new CoolException("修改库位状态失败");
                        News.info("修改库位状态失败");
                        continue;
                    }
                    barcodeThread.setBarcode("");//清理条码
//                    try {
//                        // 访问 WMS 获取入库库位
//                        LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
//                        SearchLocParam param = new SearchLocParam();
//                        param.setWrkNo(wrkMast.getWrkNo());
//                        param.setIoType(wrkMast.getIoType());
//                        param.setSourceStaNo(pickSta.getStaNo());
////                        param.setLocType1(locTypeDto.getLocType1());
//                        String response = new HttpHandler.Builder()
//                                .setUri(wmsUrl)
//                                .setPath("/rpc/pakin/loc/v1")
//                                .setJson(JSON.toJSONString(param))
//                                .build()
//                                .doPost();
//                        JSONObject jsonObject = JSON.parseObject(response);
//                        LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed());
//                        Integer code = jsonObject.getInteger("code");
//                        if (code.equals(200)) {
//                            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
//
////                            // 获取目标站
////                            Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
////                                    .eq("type_no", wrkMast.getIoType() - 50)
////                                    .eq("stn_no", pickSta.getStaNo()) // 作业站点 = 拣料出库的目标站
////                                    .eq("crn_no", dto.getCrnNo()); // 堆垛机号
////                            StaDesc staDesc = staDescService.selectOne(wrapper);
////                            if (Cools.isEmpty(staDesc)) {
////                                News.error("入库路径不存在!type_no={},stn_no={},crn_no={}", wrkMast.getIoType(), pickSta.getStaNo(), wrkMast.getCrnNo());
////                                continue;
////                            }
////                            // 堆垛机站点(目标站)
////                            Integer staNo = staDesc.getCrnStn();
//
//                            // 保存工作明细档历史档
////                        if (wrkMastMapper.saveWrkDetlLog(wrkMast.getWrkNo()) == 0) {
////                            throw new CoolException("保存工作明细档历史档失败");
////                        }
//                            // 保存工作主档历史档
//                            if (wrkMastMapper.saveWrkMastLog(wrkMast.getWrkNo()) == 0) {
//                                throw new CoolException(wrkMast.getWrkNo() + "保存工作主档历史档失败");
//                            }
//
//                            String sourceLocNo = wrkMast.getSourceLocNo().trim();
//                            LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(pickSta.getLiftNo(), Utils.getLev(sourceLocNo));//获取回库提升机目标站
//                            if (liftStaProtocol == null) {
//                                continue;
//                            }
//
//                            // 更新工作档数据状态
//                            wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57
//                            wrkMast.setWrkSts(2L); // 工作状态: 2.设备上走
//                            wrkMast.setSourceStaNo(pickSta.getStaNo()); // 源站
////                            wrkMast.setStaNo(dto.getStaNo()); // 目标站
////                            wrkMast.setCrnNo(dto.getCrnNo());
//                            wrkMast.setStaNo(liftStaProtocol.getStaNo());//目标站
//                            wrkMast.setLocNo(sourceLocNo); // 目标库位 = 出库时的源库位
//                            wrkMast.setShuttleNo(null); // 穿梭车清空
//                            wrkMast.setLiftNo(null);// 提升机清空
//                            wrkMast.setModiTime(new Date());
//                            if (wrkMastMapper.updateById(wrkMast) == 0) {
//                                throw new CoolException(wrkMast.getWrkNo() + "更新工作档数据状态失败");
//                            }
//                            if (wrkMastMapper.setSteEmpty(wrkMast.getWrkNo()) == 0) {
//                                throw new CoolException(wrkMast.getWrkNo() + "更新工作档数据状态失败");
//                            }
//
//                            // 修改库位状态 Q.拣料/盘点/并板再入库
//                            LocMast locMast = locMastService.selectById(sourceLocNo);
//                            locMast.setLocSts("Q");
//                            locMast.setModiTime(new Date());
//                            if (!locMastService.updateById(locMast)) {
//                                throw new CoolException("修改库位状态失败");
//                            }
//
////                            // 更新站点信息 且 下发plc命令
////                            staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());
////                            staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
////                            devpThread.setPakMk(staProtocol.getSiteId(), false);
////                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
////                            if (!result) {
////                                News.error("发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId());
////                            }
//
//                            barcodeThread.setBarcode("");//清理条码
//
//                        } else if (code == 500){
//                            if (ledThread != null) {
//                                String errorMsg = jsonObject.getString("msg");
//                                if (!Cools.isEmpty(errorMsg)) {
//                                    MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(3, errorMsg));
//                                }
//                            }
//                            News.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
//                        } else {
////                            staProtocol.setWorkNo((short) 32002);
////                            staProtocol.setStaNo(pickSta.getBackSta().shortValue());
////                            devpThread.setPakMk(staProtocol.getSiteId(), false);
////                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//
//                            // led 异常显示
//                            if (ledThread != null) {
//                                String errorMsg = jsonObject.getString("msg");
////                                String errorMsg = barcode + "托盘识别异常,请先进行组托!";
//                                MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(3, errorMsg));
//                            }
//                        }
//
//                    } catch (Exception e) {
//                        e.printStackTrace();
//                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//                    }
                }
            }
        }
    }
    /**
     * 拣料、并板再入库(325、331、333、339)
     */
    @Transactional
    public synchronized void stnToCrnStnPick2(){
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历拣料入库口
            for (DevpSlave.Sta pickSta : devp.getPickInSta()) {
                if (!(pickSta.getStaNo() == 325 || pickSta.getStaNo() == 331 || pickSta.getStaNo() == 333 || pickSta.getStaNo() == 339)) {
                    continue;
                }
                // 获取拣料入库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
                        && staProtocol.isInEnable()
                        && (staProtocol.getWorkNo() > 0)
                        && staProtocol.isPakMk()){
                    WrkMast wrkMast = wrkMastMapper.selectByWorkNo(staProtocol.getWorkNo().intValue());
                    if (wrkMast == null) {//找不到工作档
                        continue;
                    }
                    if ((wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104)
                            || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo()) ) {
                        continue;
                    }
                    //*********************同库位组校验*********************
                    boolean flag = false;
                    String th = "";
                    List<String> innerLoc = Utils.getGroupInnerLoc(wrkMast.getSourceLocNo());
                    for (String loc : innerLoc) {
                        LocMast locMast = locMastService.selectById(loc);
                        if (locMast == null) {
                            continue;
                        }
                        if (!locMast.getLocSts().equals("F")) {
                            flag = true;
                            th = loc + "库位存在未回库任务";
                            break;
                        }
                    }
                    if (flag) {
                        News.info(th);
                        continue;
                    }
                    //*********************同库位组校验*********************
                    // 保存工作主档历史档
                    if (wrkMastMapper.saveWrkMastLog(wrkMast.getWrkNo()) == 0) {
                        News.info(wrkMast.getWrkNo() + "保存工作主档历史档失败");
                        continue;
                    }
                    String sourceLocNo = wrkMast.getSourceLocNo().trim();
                    LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(pickSta.getLiftNo(), Utils.getLev(sourceLocNo));//获取回库提升机目标站
                    if (liftStaProtocol == null) {
                        continue;
                    }
                    // 更新工作档数据状态
                    wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57
                    wrkMast.setWrkSts(2L); // 工作状态: 2.设备上走
                    wrkMast.setSourceStaNo(pickSta.getBackSta()); // 源站
//                            wrkMast.setStaNo(dto.getStaNo()); // 目标站
//                            wrkMast.setCrnNo(dto.getCrnNo());
                    wrkMast.setStaNo(liftStaProtocol.getStaNo());//目标站
                    wrkMast.setLocNo(sourceLocNo); // 目标库位 = 出库时的源库位
                    wrkMast.setShuttleNo(null); // 穿梭车清空
                    wrkMast.setLiftNo(null);// 提升机清空
                    wrkMast.setModiTime(new Date());
                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                        News.info(wrkMast.getWrkNo() + "更新工作档数据状态失败");
                        continue;
                    }
                    // 修改库位状态 Q.拣料/盘点/并板再入库
                    LocMast locMast = locMastService.selectById(sourceLocNo);
                    locMast.setLocSts("Q");
                    locMast.setModiTime(new Date());
                    if (!locMastService.updateById(locMast)) {
                        News.info("修改库位状态失败");
                        continue;
                    }
                    staProtocol.setStaNo(pickSta.getBackSta().shortValue());//写入目标站
                    MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                }
            }
        }
    }
    /**
     * 盘点再入库
     */
    @Transactional
    public synchronized void stnToCrnStnPlate(){
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历拣料入库口
            for (DevpSlave.Sta pickSta : devp.getPickInSta()) {
//                if (pickSta.getStaNo() == 325 || pickSta.getStaNo() == 331 || pickSta.getStaNo() == 333 || pickSta.getStaNo() == 339) {
//                    continue;
//                }
                // 获取拣料入库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
                        && staProtocol.isInEnable()
                        && (staProtocol.getWorkNo() > 0)
                        && staProtocol.isPakMk()){
                    WrkMast wrkMast = wrkMastMapper.selectByWorkNo(staProtocol.getWorkNo().intValue());
                    if (wrkMast == null) {//找不到工作档
                        continue;
                    }
                    if ((wrkMast.getIoType() != 107)
                            || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo()) ) {
                        continue;
                    }
                    //*********************同库位组校验*********************
                    boolean flag = false;
                    String th = "";
                    List<String> innerLoc = Utils.getGroupInnerLoc(wrkMast.getSourceLocNo());
                    for (String loc : innerLoc) {
                        LocMast locMast = locMastService.selectById(loc);
                        if (locMast == null) {
                            continue;
                        }
                        if (!locMast.getLocSts().equals("F")) {
                            flag = true;
                            th = loc + "库位存在未回库任务";
                            break;
                        }
                    }
                    if (flag) {
                        News.info(th);
                        continue;
                    }
                    //*********************同库位组校验*********************
                    // 保存工作主档历史档
                    if (wrkMastMapper.saveWrkMastLog(wrkMast.getWrkNo()) == 0) {
                        News.info(wrkMast.getWrkNo() + "保存工作主档历史档失败");
                        continue;
                    }
                    //盘点找新库位
                    try {
                        LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());//源库位
                        SearchLocParam param = new SearchLocParam();
                        param.setWrkNo(wrkMast.getWrkNo());
                        param.setBarcode(wrkMast.getBarcode());
                        param.setIoType(107);//盘点
                        param.setSourceStaNo(wrkMast.getStaNo());
                        param.setLocType1(locMast.getLocType1());
                        String response = new HttpHandler.Builder()
                                .setUri(wmsUrl)
                                .setPath("/rpc/pakin/loc/v1")
                                .setJson(JSON.toJSONString(param))
                                .build()
                                .doPost();
                        JSONObject jsonObject = JSON.parseObject(response);
                        Integer code = jsonObject.getInteger("code");
                        if (code.equals(200)) {
                            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
                            //获取回库提升机目标站
                            LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(pickSta.getLiftNo(), Utils.getLev(dto.getLocNo()));
                            if (liftStaProtocol == null) {
                                News.info(wrkMast.getWrkNo() + "获取回库提升机目标站失败");
                                continue;
                            }
                            // 更新工作档数据状态
                            wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 107->57
                            wrkMast.setWrkSts(2L); // 工作状态: 2.设备上走
                            wrkMast.setSourceStaNo(dto.getSourceStaNo()); // 源站
                            wrkMast.setStaNo(liftStaProtocol.getStaNo());//目标站
                            wrkMast.setLocNo(dto.getLocNo()); // 目标库位
                            wrkMast.setShuttleNo(null); // 穿梭车清空
                            wrkMast.setLiftNo(null);// 提升机清空
                            wrkMast.setModiTime(new Date());
                            if (wrkMastMapper.updateById(wrkMast) == 0) {
                                News.info(wrkMast.getWrkNo() + "更新工作档数据状态失败");
                                continue;
                            }
                            staProtocol.setStaNo(dto.getSourceStaNo().shortValue());//写入目标站
                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        } else if (code == 500){
                            News.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    }
                }
            }
        }
    }
//    /**
//     * 拣料、并板、盘点再入库
//     */
//    @Transactional
//    public synchronized void stnToCrnStnPick(){
//        for (DevpSlave devp : slaveProperties.getDevp()) {
//            // 遍历拣料入库口
//            for (DevpSlave.Sta pickSta : devp.getPickInSta()) {
//
//                // 获取拣料入库站信息
//                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
//                StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo());
//                if (staProtocol == null) {
//                    continue;
//                } else {
//                    staProtocol = staProtocol.clone();
//                }
//                if (staProtocol.isAutoing()
//                        && staProtocol.isLoading()
////                        && (staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() < 9999)
////                        && staProtocol.getStaNo().equals(staProtocol.getSiteId().shortValue())
//                        && staProtocol.isPakMk()){
//
//                    // 获取条码扫描仪信息
//                    BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, pickSta.getBarcode());
//                    if (barcodeThread == null) {
//                        continue;
//                    }
//                    String barcode = barcodeThread.getBarcode();
//
//                    WrkMast wrkMast = null;
//                    wrkMast = wrkMastMapper.selectPickStepByBarcode(barcode);
//                    if (wrkMast == null) {
//                        continue;
//                    }
////                    if (staProtocol.getWorkNo() == 9996) {
////                        String barcode = barcodeThread.getBarcode();
////                        if(!Cools.isEmpty(barcode)) {
////                            News.info("{}号条码扫描器检测条码信息:{}", pickSta.getBarcode(), barcode);
////                            if("NG".endsWith(barcode) || "NoRead".equals(barcode) || "empty".equals(barcode)) {
////                                staProtocol.setWorkNo((short) 32002);
////                                staProtocol.setStaNo(pickSta.getBackSta().shortValue());
////                                devpThread.setPakMk(staProtocol.getSiteId(), false);
////                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
////
////                                // led 异常显示
////                                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed());
////                                if (ledThread != null) {
////                                    String errorMsg = "扫码失败,请重试";
////                                    MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(3, errorMsg));
////                                }
////                                continue;
////                            }
////                        } else {
////                            staProtocol.setWorkNo((short) 32002);
////                            staProtocol.setStaNo(pickSta.getBackSta().shortValue());
////                            devpThread.setPakMk(staProtocol.getSiteId(), false);
////                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
////
////                            // led 异常显示
////                            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed());
////                            if (ledThread != null) {
////                                String errorMsg = "扫码失败,请重试";
////                                MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(3, errorMsg));
////                            }
////                            continue;
////                        }
////                        wrkMast = wrkMastMapper.selectPickStepByBarcode(barcode);
////                        if (null == wrkMast) {
////                            News.error("{}条码错误,暂无拣料任务!", barcode);
////                        }
////                    }
//
//                    if ((wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 107)
//                        || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo()) ) {
//                        continue;
//                    }
//
//                    // 保存工作主档历史档
//                    if (wrkMastMapper.saveWrkMastLog(wrkMast.getWrkNo()) == 0) {
//                        throw new CoolException(wrkMast.getWrkNo() + "保存工作主档历史档失败");
//                    }
//
//                    String sourceLocNo = wrkMast.getSourceLocNo().trim();
//                    LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(pickSta.getLiftNo(), Utils.getLev(sourceLocNo));//获取回库提升机目标站
//                    if (liftStaProtocol == null) {
//                        continue;
//                    }
//
//                    // 更新工作档数据状态
//                    wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57
//                    wrkMast.setWrkSts(2L); // 工作状态: 2.设备上走
//                    wrkMast.setSourceStaNo(pickSta.getStaNo()); // 源站
////                            wrkMast.setStaNo(dto.getStaNo()); // 目标站
////                            wrkMast.setCrnNo(dto.getCrnNo());
//                    wrkMast.setStaNo(liftStaProtocol.getStaNo());//目标站
//                    wrkMast.setLocNo(sourceLocNo); // 目标库位 = 出库时的源库位
//                    wrkMast.setShuttleNo(null); // 穿梭车清空
//                    wrkMast.setLiftNo(null);// 提升机清空
//                    wrkMast.setModiTime(new Date());
//                    if (wrkMastMapper.updateById(wrkMast) == 0) {
//                        throw new CoolException(wrkMast.getWrkNo() + "更新工作档数据状态失败");
//                    }
//                    if (wrkMastMapper.setSteEmpty(wrkMast.getWrkNo()) == 0) {
//                        throw new CoolException(wrkMast.getWrkNo() + "更新工作档数据状态失败");
//                    }
//
//                    // 修改库位状态 Q.拣料/盘点/并板再入库
//                    LocMast locMast = locMastService.selectById(sourceLocNo);
//                    locMast.setLocSts("Q");
//                    locMast.setModiTime(new Date());
//                    if (!locMastService.updateById(locMast)) {
//                        throw new CoolException("修改库位状态失败");
//                    }
//                    barcodeThread.setBarcode("");//清理条码
//
////                    try {
////                        // 访问 WMS 获取入库库位
////                        LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
////                        SearchLocParam param = new SearchLocParam();
////                        param.setWrkNo(wrkMast.getWrkNo());
////                        param.setIoType(wrkMast.getIoType());
////                        param.setSourceStaNo(pickSta.getStaNo());
//////                        param.setLocType1(locTypeDto.getLocType1());
////                        String response = new HttpHandler.Builder()
////                                .setUri(wmsUrl)
////                                .setPath("/rpc/pakin/loc/v1")
////                                .setJson(JSON.toJSONString(param))
////                                .build()
////                                .doPost();
////                        JSONObject jsonObject = JSON.parseObject(response);
////                        LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, pickSta.getLed());
////                        Integer code = jsonObject.getInteger("code");
////                        if (code.equals(200)) {
////                            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
////
//////                            // 获取目标站
//////                            Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
//////                                    .eq("type_no", wrkMast.getIoType() - 50)
//////                                    .eq("stn_no", pickSta.getStaNo()) // 作业站点 = 拣料出库的目标站
//////                                    .eq("crn_no", dto.getCrnNo()); // 堆垛机号
//////                            StaDesc staDesc = staDescService.selectOne(wrapper);
//////                            if (Cools.isEmpty(staDesc)) {
//////                                News.error("入库路径不存在!type_no={},stn_no={},crn_no={}", wrkMast.getIoType(), pickSta.getStaNo(), wrkMast.getCrnNo());
//////                                continue;
//////                            }
//////                            // 堆垛机站点(目标站)
//////                            Integer staNo = staDesc.getCrnStn();
////
////                            // 保存工作明细档历史档
//////                        if (wrkMastMapper.saveWrkDetlLog(wrkMast.getWrkNo()) == 0) {
//////                            throw new CoolException("保存工作明细档历史档失败");
//////                        }
////                            // 保存工作主档历史档
////                            if (wrkMastMapper.saveWrkMastLog(wrkMast.getWrkNo()) == 0) {
////                                throw new CoolException(wrkMast.getWrkNo() + "保存工作主档历史档失败");
////                            }
////
////                            String sourceLocNo = wrkMast.getSourceLocNo().trim();
////                            LiftStaProtocol liftStaProtocol = NyLiftUtils.getLiftStaByLev(pickSta.getLiftNo(), Utils.getLev(sourceLocNo));//获取回库提升机目标站
////                            if (liftStaProtocol == null) {
////                                continue;
////                            }
////
////                            // 更新工作档数据状态
////                            wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57
////                            wrkMast.setWrkSts(2L); // 工作状态: 2.设备上走
////                            wrkMast.setSourceStaNo(pickSta.getStaNo()); // 源站
//////                            wrkMast.setStaNo(dto.getStaNo()); // 目标站
//////                            wrkMast.setCrnNo(dto.getCrnNo());
////                            wrkMast.setStaNo(liftStaProtocol.getStaNo());//目标站
////                            wrkMast.setLocNo(sourceLocNo); // 目标库位 = 出库时的源库位
////                            wrkMast.setShuttleNo(null); // 穿梭车清空
////                            wrkMast.setLiftNo(null);// 提升机清空
////                            wrkMast.setModiTime(new Date());
////                            if (wrkMastMapper.updateById(wrkMast) == 0) {
////                                throw new CoolException(wrkMast.getWrkNo() + "更新工作档数据状态失败");
////                            }
////                            if (wrkMastMapper.setSteEmpty(wrkMast.getWrkNo()) == 0) {
////                                throw new CoolException(wrkMast.getWrkNo() + "更新工作档数据状态失败");
////                            }
////
////                            // 修改库位状态 Q.拣料/盘点/并板再入库
////                            LocMast locMast = locMastService.selectById(sourceLocNo);
////                            locMast.setLocSts("Q");
////                            locMast.setModiTime(new Date());
////                            if (!locMastService.updateById(locMast)) {
////                                throw new CoolException("修改库位状态失败");
////                            }
////
//////                            // 更新站点信息 且 下发plc命令
//////                            staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue());
//////                            staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
//////                            devpThread.setPakMk(staProtocol.getSiteId(), false);
//////                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//////                            if (!result) {
//////                                News.error("发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId());
//////                            }
////
////                            barcodeThread.setBarcode("");//清理条码
////
////                        } else if (code == 500){
////                            if (ledThread != null) {
////                                String errorMsg = jsonObject.getString("msg");
////                                if (!Cools.isEmpty(errorMsg)) {
////                                    MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(3, errorMsg));
////                                }
////                            }
////                            News.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
////                        } else {
//////                            staProtocol.setWorkNo((short) 32002);
//////                            staProtocol.setStaNo(pickSta.getBackSta().shortValue());
//////                            devpThread.setPakMk(staProtocol.getSiteId(), false);
//////                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
////
////                            // led 异常显示
////                            if (ledThread != null) {
////                                String errorMsg = jsonObject.getString("msg");
//////                                String errorMsg = barcode + "托盘识别异常,请先进行组托!";
////                                MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(3, errorMsg));
////                            }
////                        }
////
////                    } catch (Exception e) {
////                        e.printStackTrace();
////                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
////                    }
//
//                }
//            }
//
//        }
//    }
    /**
     * 初始化实时地图
@@ -938,6 +1277,25 @@
            }
            if (wrkMast.getShuttleNo() == null) {//没有绑定小车,进行调度
                //强制预留一台小车给入库任务
                int lev = Utils.getLev(wrkMast.getSourceLocNo());
                //获取当前楼层有几台空闲可用小车
                int shuttleCount = shuttleDispatchUtils.getShuttleCountByLev(lev);
                if (shuttleCount >= 2) {//只有可用小车数量大于2,才进行入库任务预留小车
                    int shuttleWrkInObligateCount = 1;//预留小车数量
                    Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "shuttleWrkInObligateCount").eq("status", 1));
                    if (config != null) {
                        shuttleWrkInObligateCount = Integer.parseInt(config.getValue());
                    }
                    //可用出库小车数量(给入库任务预留一台车)
                    int useShuttleCount = shuttleCount - shuttleWrkInObligateCount;
                    //查询楼层已分配车辆的出库任务数量
                    List<WrkMast> wrkMasts = wrkMastService.selectShuttleOutWrkByLev(lev);
                    if (wrkMasts.size() >= useShuttleCount) {
                        News.info("{}任务,当前楼层可用小车{}台,出库任务已分配{}台,系统等待中。", wrkMast.getWrkNo(), useShuttleCount, wrkMasts.size());
                        return false;
                    }
                }
                boolean result = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo());//调度小车到货物所在库位进行取货
                News.info("{}任务,调度小车{}系统等待中。", wrkMast.getWrkNo(), result ? "成功" : "失败");
                return false;
@@ -1178,6 +1536,30 @@
            if (!sourceBasDevp.getInEnable().equals("Y")) {
                News.info("{}任务,{}源站,没有可入信号", wrkMast.getWrkNo(), sourceBasDevp.getDevNo());
                return false;//站点不可入
            }
            Integer barcodeId = Utils.getBarcodeIdByStaNo(wrkMast.getSourceStaNo());
            if (barcodeId == null) {
                News.info("{}任务,{}源站,找不到可用条码器ID", wrkMast.getWrkNo(), sourceBasDevp.getDevNo());
                return false;//站点不可入
            }
            BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId);
            if (barcodeThread == null) {
                News.info("{}任务,{}源站,条码器{}线程为空", wrkMast.getWrkNo(), sourceBasDevp.getDevNo(), barcodeId);
                return false;//站点不可入
            }
            String barcode = barcodeThread.getBarcode();
            if(!Cools.isEmpty(barcode)) {
                if(!("NG".endsWith(barcode) || "NoRead".equals(barcode) || "empty".equals(barcode))) {
                    //存在条码值,判断是否和当前工作档一致
                    if (!barcode.equals(wrkMast.getBarcode())) {
                        News.info("{}任务,{}站点,条码器{}值{}与工作档条码值{}不一致,系统跳过执行", wrkMast.getWrkNo(), sourceBasDevp.getDevNo(), barcodeId, barcode,wrkMast.getBarcode());
                        return false;//站点不可入
                    }
                }
            }else {
                return false;
            }
            //判断提升机整个三楼是否都处于入库模式
@@ -1477,11 +1859,11 @@
     */
    public synchronized void locToLocExecute() {
        //获取出入库工作档
        List<WrkMast> wrkMasts = wrkMastMapper.selectInOutWrkMast();
        if (wrkMasts.size() > 0) {
            //有出入库任务,必须等待任务执行完毕再执行库位移转
            return;
        }
//        List<WrkMast> wrkMasts = wrkMastMapper.selectInOutWrkMast();
//        if (wrkMasts.size() > 0) {
//            //有出入库任务,必须等待任务执行完毕再执行库位移转
//            return;
//        }
        //查询库位移转工作档
        List<WrkMast> wrkMasts1 = wrkMastMapper.selectLocToLocWrkMast();
@@ -2241,7 +2623,9 @@
                        RobotUtils.sendTask(staProtocol303.getWorkNo().toString(), wrkDetls.size(), "303");
                    }
                }
            }else if (staProtocol317.isAutoing() && staProtocol317.isLoading() && staProtocol317.getWorkNo() != 0) {
            }
            if (staProtocol317.isAutoing() && staProtocol317.isLoading() && staProtocol317.getWorkNo() != 0) {
                //调度机械臂
                //查询是否有工作档
                WrkMast wrkMast = wrkMastMapper.selectByWorkNo(staProtocol317.getWorkNo().intValue());
@@ -2319,7 +2703,7 @@
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            log.info("悬挂线,wms返回结果:" + jsonObject);
            News.info("悬挂线,WMS返回结果:" + jsonObject);
            Integer code = jsonObject.getInteger("code");
            if (code.equals(200)) {//呼叫AGV
                return true;
@@ -2461,7 +2845,7 @@
                ledCommand.setSourceLocNo(wrkMast.getSourceLocNo());
                ledCommand.setLocNo(wrkMast.getLocNo());
                ledCommand.setStaNo(wrkMast.getStaNo());
                if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) {
                if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10 && wrkMast.getIoType() != 107) {
                    //for (WrkDetl wrkDetl : wrkDetls) {
                    //    LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("zpallet", wrkDetl.getZpallet()).eq("matnr", wrkDetl.getMatnr()));
                    //
@@ -2501,11 +2885,11 @@
                    //}
                    List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", wrkMast.getSourceLocNo()));
                    locDetls.forEach(locDetl -> {
                        Wrapper<WrkDetl> wrapper = new EntityWrapper<WrkDetl>().eq("matnr", locDetl.getMatnr()).eq("wrk_no",wrkMast.getWrkNo());
                        Utils.wapperSetCondition(wrapper,"batch",locDetl.getBatch());
                        Utils.wapperSetCondition(wrapper,"three_code",locDetl.getThreeCode());
                        Utils.wapperSetCondition(wrapper,"dead_time",locDetl.getDeadTime());
                        Utils.wapperSetCondition(wrapper,"supp_code",locDetl.getSuppCode());//料箱码
                        Wrapper<WrkDetl> wrapper = new EntityWrapper<WrkDetl>().eq("matnr", locDetl.getMatnr()).eq("wrk_no", wrkMast.getWrkNo());
                        Utils.wapperSetCondition(wrapper, "batch", locDetl.getBatch());
                        Utils.wapperSetCondition(wrapper, "three_code", locDetl.getThreeCode());
                        Utils.wapperSetCondition(wrapper, "dead_time", locDetl.getDeadTime());
                        Utils.wapperSetCondition(wrapper, "supp_code", locDetl.getSuppCode());//料箱码
                        WrkDetl detl = wrkDetlService.selectOne(wrapper);
                        if (Cools.isEmpty(detl)) {
                            String suppCode = "";
@@ -2522,6 +2906,14 @@
                        }
                    });
                }
                if (wrkMast.getIoType() == 107) {
                    List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    wrkDetls.forEach(wrkDetl -> {
                        ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getAnfme(), wrkDetl.getAnfme(), wrkDetl.getSpecs(), wrkDetl.getSuppCode()));
                    });
                }
                commands.add(ledCommand);
            }
            Set<Integer> workNos = wrkMasts.stream().map(WrkMast::getWrkNo).collect(Collectors.toSet());
@@ -2604,8 +2996,10 @@
            for (Integer staNo : led.getStaArr()) {
                // 获取叉车站点
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
                if (staProtocol == null) { continue; }
                if (staProtocol.getWorkNo() != 0) {
                if (staProtocol == null) {
                    continue;
                }
                if (staProtocol.isLoading()) {
                    reset = false;
                    break;
                }
@@ -2614,13 +3008,9 @@
            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId());
            // led显示默认内容
            if (reset && !ledThread.isLedMk()) {
                ledThread.setLedMk(false);
                ledThread.setLedMk(true);
                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(2, new ArrayList<>()))) {
                    News.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                }else {
//                    News.error("{}号LED命令下发成功!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                    MessageQueue.offer(SlaveType.Led, led.getId(), new Task(4, new ArrayList<>()));
                    ledThread.setLedMk(false);
                    log.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                }
            }
        }
@@ -2771,6 +3161,19 @@
                    continue;
                }
                //***************判断是否满充校准***************
                EntityWrapper<Config> wrapper1 = new EntityWrapper<>();
                wrapper.eq("code", "shuttleMaxPowerVerify");
                Config config1 = configService.selectOne(wrapper1);
                if (config1 != null) {
                    if (config1.getValue().equals("true")) {
                        if (shuttleProtocol.getVoltage() < 5630) {
                            continue;//电压不够继续充电
                        }
                    }
                }
                //***************判断是否满充校准***************
                //小车满电,结束充电任务
                NyShuttleHttpCommand chargeCommand = NyHttpUtils.getChargeCommand(shuttle.getId(), wrkCharge.getWrkNo(), false);
                ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();