pjb
2025-07-17 7fb8a9add101ffff09fb9194d89ac7bd3747679c
src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -314,7 +314,7 @@
    /**
     * 罐装线要桶数量减少
     */
    private void decreaseWantBucketCount(int site, int decrease) {
    private void decreaseWantBucketCount(int site, int decrease) throws InterruptedException {
        int siteNew;
        switch (site) {
@@ -327,6 +327,11 @@
        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 2);
        StaProtocol staProtocol = devpThread.getStation().get(siteNew);
        if(staProtocol == null) {
            return;
        } else {
            staProtocol = staProtocol.clone();
        }
        int count = staProtocol.getWantBucketCount();
@@ -336,7 +341,7 @@
            return;
        }
        staProtocol.setWantBucketCount(remaining); // 设置剩余要桶数
        staProtocol.setWantBucketCount(remaining);
        boolean offer = MessageQueue.offer(SlaveType.Devp, inGzxSiteList.indexOf(site) + 4, new Task(6, staProtocol));
        if (offer) {
@@ -1178,7 +1183,7 @@
    /**
     * 堆垛机回原点
     */
    public synchronized void originGo() {
    public synchronized void originGo() throws InterruptedException {
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
@@ -1202,6 +1207,12 @@
                    continue;
                }
                // 有吊车入库或吊车出库任务
                int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("crn_no", crnProtocol.getCrnNo()).in("wrk_sts", 3, 12));
                if(count != 0) {
                    continue;
                }
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(crn.getId()); // 堆垛机编号
                crnCommand.setTaskNo((short) 9999); // 工作号
@@ -1219,6 +1230,7 @@
                    basCrnpService.updateById(basCrnp); // 设置更新时间,避免重复下发回原点
                    log.info("{}号堆垛机回原点任务下发成功:{}", crn.getId(), JSON.toJSON(crnCommand));
                }
                Thread.sleep(2000);
            }
        }
    }
@@ -1713,6 +1725,9 @@
                staProtocol = staProtocol.clone();
            }
            if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.isInEnable() || staProtocol.isOutEnable() && site == 1090) && staProtocol.getWorkNo() != 0 && staProtocol.getWorkNo() < 9000) {
                if (staProtocol.getWorkNo() == 1034 && !staProtocol.isHigh()) { // 1034空母拖回流任务需要高信号
                    return;
                }
                // 查询工作档
                WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo());
                if (wrkMast == null) {
@@ -1858,7 +1873,7 @@
            if (wrkMast == null) {
                log.error("异常口入库任务号无任务:{}", staProtocol.getWorkNo());
                return;
            } else if (wrkMast.getLocNo() != null) {
            } else if (wrkMast.getLocNo() != null && wrkMast.getLocNo().length() == 7) {
//                log.info("异常口入库库位已分配:{}", wrkMast.getLocNo());
                return;
            } else if(wrkMast.getStaNo() != 1090) {
@@ -1992,7 +2007,7 @@
    }
    public synchronized void autoOutEmptyBucket() {
        Config config = configService.selectOne(new EntityWrapper<Config>().eq("code","autoOutEmptyBucket").eq("status",1));
        Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "autoOutEmptyBucket").eq("status", 1));
        if (config == null || Cools.isEmpty(config.getValue())) {
            return;
        }
@@ -2001,21 +2016,106 @@
        String[] split = config.getValue().split("=");
        for (SearchLocParam.WantBucket wantBucket : getWantBucketFlag()) {
            if (wantBucket.getBucketType() != 0 && wantBucket.getWantBucketCount() >= 2) { // 罐装线有要桶信号
            if (wantBucket.getBucketType() != 0 && wantBucket.getWantBucketCount() > 0) { // 罐装线有要桶信号+要托数不为0
                boolean flag = true; // 是否需要自动补,true不需要,false需要
                for(String item: split) {
                    if(String.valueOf(wantBucket.getSite()).equals(item)) {
                for (String item : split) {
                    if (String.valueOf(wantBucket.getSite()).equals(item)) {
                        flag = false;
                        break;
                    }
                }
                if(flag) {
                if (flag) {
                    return;
                }
                // <4 < 2 < 4
                int count = wrkMastMapper.selectInGzxCount(wantBucket.getSite());
                if (wantBucket.getSite() == 1071 && count <= 2 || wantBucket.getSite() == 1064 && count == 0 || wantBucket.getSite() == 1078 && count <= 2) {
                    log.info("{}自动补空桶,罐装线要桶型信息:{},正在执行任务数:{}",wantBucket.getSite(), wantBucket.getBucketType(),count);
                if (wantBucket.getWantBucketCount() == 1) { // 最后剩一拖的时候
                    log.info("{}自动补空桶剩最后一托,罐装线要桶型信息:{},正在执行任务数:{}", wantBucket.getSite(), wantBucket.getBucketType(), count);
                    if (wantBucket.getSite() == 1071 && count <= 3 || wantBucket.getSite() == 1064 && count <= 1 || wantBucket.getSite() == 1078 && count <= 3) { // 可以出一个
                        List<LocDetl> locDetlList = locDetlService.selectListByMatnr(wantBucket.getBucketType());
                        if (locDetlList.size() == 0) {
                            log.warn("自动出空桶最后一个,库存无数据");
                            break;
                        }
                        Map<String, LocDetl> locDetlMap = locDetlList.stream().collect(Collectors.toMap(LocDetl::getLocNo, locDetl -> locDetl));
                        LocDetl locDetlSta = null;
                        for (LocDetl locDetl : locDetlList) {
                            String loc1 = locDetl.getLocNo(); // 当前库位
                            String row = loc1.substring(0, 2);
                            String rowNew = ""; // 对应库位
                            switch (row) {
                                case "09":
                                    rowNew = "10";
                                    break;
                                case "10":
                                    rowNew = "09";
                                    break;
                                case "11":
                                    rowNew = "12";
                                    break;
                                case "12":
                                    rowNew = "11";
                                    break;
                                default:
                            }
                            String locNoNew = rowNew + loc1.substring(2);
                            LocDetl locDetl1 = locDetlMap.get(locNoNew);
                            if (locDetl1 == null) {
                                locDetlSta = locDetl;
                                break;
                            }
                        }
                        // 没有单的,深浅库位都有,先取浅库位
                        if (locDetlSta == null) {
                            Optional<LocDetl> first = locDetlList.stream().filter(locDetl -> locDetl.getLocNo().startsWith("10") || locDetl.getLocNo().startsWith("11")).findFirst();
                            if (first.isPresent()) {
                                locDetlSta = first.get();
                            }
                        }
                        if (locDetlSta != null) {
                            try {
                                StockOutParam param = new StockOutParam();
                                param.setOutSite(wantBucket.getSite());
                                List<StockOutParam.LocDetl> locDetls = new ArrayList<>();
                                StockOutParam.LocDetl locDetl2 = new StockOutParam.LocDetl();
                                locDetl2.setLocNo(locDetlSta.getLocNo());
                                locDetl2.setMatnr(locDetlSta.getMatnr());
                                locDetl2.setBatch(locDetlSta.getBatch());
                                locDetl2.setBrand(locDetlSta.getBrand());
                                locDetl2.setCount(locDetlSta.getAnfme());
                                locDetl2.setBoxType1(locDetlSta.getBoxType1());
                                locDetl2.setBoxType2(locDetlSta.getBoxType2());
                                locDetl2.setBoxType3(locDetlSta.getBoxType3());
                                locDetl2.setStandby1(locDetlSta.getStandby1());
                                locDetl2.setStandby2(locDetlSta.getStandby2());
                                locDetl2.setStandby3(locDetlSta.getStandby3());
                                locDetls.add(locDetl2);
                                param.setLocDetls(locDetls);
                                String response = new HttpHandler.Builder()
                                        .setUri(wmsUrl)
                                        .setPath("/rpc/autoOutEmptyBucket")
                                        .setJson(JSON.toJSONString(param))
                                        .build()
                                        .doPost();
                                log.info("最后一个自动出空桶请求wms原始返回:" + response);
                                JSONObject jsonObject = JSON.parseObject(response);
                                if (jsonObject.getInteger("code").equals(200)) {
                                    decreaseWantBucketCount(wantBucket.getSite(), 1);
                                    log.info("最后一个自动出空桶成功:{}", wantBucket.getSite());
                                    return;
                                } else {
                                    News.error("最后一个自动空桶出库" + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/autoOutEmptyBucket", JSON.toJSONString(param), response);
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            }
                        }
                    }
                } else if (wantBucket.getSite() == 1071 && count <= 2 || wantBucket.getSite() == 1064 && count == 0 || wantBucket.getSite() == 1078 && count <= 2) { // 可以出两个
                    log.info("{}自动补空桶,罐装线要桶型信息:{},正在执行任务数:{}", wantBucket.getSite(), wantBucket.getBucketType(), count);
                    // 判断库里有无空桶组
                    List<LocDetl> locDetlList = locDetlService.selectListByMatnr(wantBucket.getBucketType());
                    for (int i = 0; i < locDetlList.size(); i++) {
@@ -2077,8 +2177,8 @@
                                    log.info("自动出空桶请求wms原始返回:" + response);
                                    JSONObject jsonObject = JSON.parseObject(response);
                                    if (jsonObject.getInteger("code").equals(200)) {
                                        decreaseWantBucketCount(wantBucket.getSite(),2);
                                        log.info("自动出空桶成功:{}",wantBucket.getSite());
                                        decreaseWantBucketCount(wantBucket.getSite(), 2);
                                        log.info("自动出空桶成功:{}", wantBucket.getSite());
                                        return;
                                    } else {
                                        News.error("自动空桶出库" + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/autoOutEmptyBucket", JSON.toJSONString(param), response);
@@ -2090,6 +2190,47 @@
                            }
                        }
                    }
                    if (locDetlList.size() > 0) {
                        log.info("没有成对的空桶组,只能一个一个出");
                        try {
                            LocDetl locDetl = locDetlList.get(0);
                            StockOutParam param = new StockOutParam();
                            param.setOutSite(wantBucket.getSite());
                            List<StockOutParam.LocDetl> locDetls = new ArrayList<>();
                            StockOutParam.LocDetl locDetl2 = new StockOutParam.LocDetl();
                            locDetl2.setLocNo(locDetl.getLocNo());
                            locDetl2.setMatnr(locDetl.getMatnr());
                            locDetl2.setBatch(locDetl.getBatch());
                            locDetl2.setBrand(locDetl.getBrand());
                            locDetl2.setCount(locDetl.getAnfme());
                            locDetl2.setBoxType1(locDetl.getBoxType1());
                            locDetl2.setBoxType2(locDetl.getBoxType2());
                            locDetl2.setBoxType3(locDetl.getBoxType3());
                            locDetl2.setStandby1(locDetl.getStandby1());
                            locDetl2.setStandby2(locDetl.getStandby2());
                            locDetl2.setStandby3(locDetl.getStandby3());
                            locDetls.add(locDetl2);
                            param.setLocDetls(locDetls);
                            String response = new HttpHandler.Builder()
                                    .setUri(wmsUrl)
                                    .setPath("/rpc/autoOutEmptyBucket")
                                    .setJson(JSON.toJSONString(param))
                                    .build()
                                    .doPost();
                            log.info("自动出空桶请求wms原始返回:" + response);
                            JSONObject jsonObject = JSON.parseObject(response);
                            if (jsonObject.getInteger("code").equals(200)) {
                                decreaseWantBucketCount(wantBucket.getSite(), 1);
                                log.info("自动出空桶成功:{}", wantBucket.getSite());
                                return;
                            } else {
                                News.error("自动空桶出库" + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/autoOutEmptyBucket", JSON.toJSONString(param), response);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        }
                    }
                }
            }
        }