pang.jiabao
2025-07-20 b716cf2e3678ea3b9df6bfaea877c40b447a1192
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) {
@@ -726,7 +731,7 @@
                        continue;
                    }
                } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
                } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("M")|| shallowLoc.getLocSts().equals("Z")) {
                    News.warnNoLog(""+mark+" - 1"+" - 12"+" - // F、D  库位状态={}",shallowLoc.getLocSts());
                    // 此标记避免多次执行移库任务
                    if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) {
@@ -814,6 +819,11 @@
     */
    public synchronized void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol,Integer mark) {
        News.warnNoLog(""+mark+" - 2"+" - 0"+" - 堆垛机入出库作业下发:执行出库");
        boolean crnAvailableOut = false;
        Config config = configService.selectOne(new EntityWrapper<Config>().eq("code","removeCrnAvailableOut"));
        if (config != null && config.getStatus() == 1) {
            crnAvailableOut = true;
        }
        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
            // 获取工作状态为11(生成出库ID)的出库工作档
            List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep11(slave.getId(), crnStn.getStaNo());
@@ -850,9 +860,8 @@
                }
                // 判断堆垛机出库站状态
                if ((staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")
                        && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable())
                        || (staProtocol.getSiteId() == 1056 && staProtocol.isAutoing() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y"))) {
                if (staProtocol.isAutoing() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") &&
                        (crnAvailableOut || !staProtocol.isLoading() && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable())) {
                    // 堆垛机控制过滤
                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
                        break;
@@ -1178,12 +1187,15 @@
    /**
     * 堆垛机回原点
     */
    public synchronized void originGo() {
    public synchronized void originGo() throws InterruptedException {
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if(crnProtocol == null) {
                continue;
            }
            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
                    && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) {
                // 判断是不是已在原点
@@ -1198,7 +1210,18 @@
                Date now = new Date();
                Date modiTime = basCrnp.getModiTime();
                long diffInMillis = now.getTime()-modiTime.getTime();
                if(diffInMillis < 3 * 60 * 1000) {
                if(diffInMillis < 10 * 1000) { // 空闲小于10秒则跳过
                    continue;
                } else {  // 有入库任务或大于2分钟,回原点
                    int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 1).eq("crn_no", crn.getId()).in("wrk_sts", 2, 9, 10));
                    if(count == 0 && diffInMillis < 2 * 60 * 1000) {
                        continue;
                    }
                }
                // 有吊车入库或吊车出库任务
                int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("crn_no", crnProtocol.getCrnNo()).in("wrk_sts", 3, 12));
                if(count != 0) {
                    continue;
                }
@@ -1219,6 +1242,7 @@
                    basCrnpService.updateById(basCrnp); // 设置更新时间,避免重复下发回原点
                    log.info("{}号堆垛机回原点任务下发成功:{}", crn.getId(), JSON.toJSON(crnCommand));
                }
                Thread.sleep(2000);
            }
        }
    }
@@ -1532,7 +1556,7 @@
                        if (null != loc) {//对应深库位非在库状态,不能移库
                            String deepLoc = Utils.getDeepLoc(slaveProperties, loc.getLocNo());
                            LocMast deepLoc1 = locMastService.selectById(deepLoc);
                            if (!deepLoc1.getLocSts().equals("F") && !deepLoc1.getLocSts().equals("D")) {
                            if (!deepLoc1.getLocSts().equals("F") && !deepLoc1.getLocSts().equals("M")&& !deepLoc1.getLocSts().equals("Z")) {
                                loc = null;
                            }
                        }
@@ -1564,7 +1588,7 @@
                wrkMast.setFullPlt(shallowLoc.getLocSts().equals("F") ? "Y" : "N"); // 满板
                wrkMast.setPicking("N"); // 拣料
                wrkMast.setExitMk("N"); // 退出
                wrkMast.setEmptyMk(shallowLoc.getLocSts().equals("D") ? "Y" : "N"); // 空板
                wrkMast.setEmptyMk(shallowLoc.getLocSts().equals("M") ? "M" : shallowLoc.getLocSts().equals("Z") ? "Z" : "N"); // 空板
                wrkMast.setBarcode(shallowLoc.getBarcode()); // 托盘码
                wrkMast.setLinkMis("N");
                wrkMast.setAppeTime(new Date());
@@ -1592,7 +1616,7 @@
                    }
                }
                // 修改源库位状态
                if (shallowLoc.getLocSts().equals("D") || shallowLoc.getLocSts().equals("F")) {
                if (shallowLoc.getLocSts().equals("D") || shallowLoc.getLocSts().equals("M") || shallowLoc.getLocSts().equals("Z")) {
                    shallowLoc.setLocSts("R"); // R.出库预约
                    shallowLoc.setModiTime(new Date());
                    if (!locMastService.updateById(shallowLoc)) {
@@ -1713,6 +1737,9 @@
                staProtocol = staProtocol.clone();
            }
            if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.isInEnable() || staProtocol.isOutEnable() && site == 1090) && staProtocol.getWorkNo() != 0 && staProtocol.getWorkNo() < 9000) {
                if (staProtocol.getSiteId() == 1034 && !staProtocol.isHigh()) { // 1034空母拖回流任务需要高信号
                    continue;
                }
                // 查询工作档
                WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo());
                if (wrkMast == null) {
@@ -1858,7 +1885,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 +2019,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 +2028,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 +2189,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 +2202,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();
                        }
                    }
                }
            }
        }