From 7fb8a9add101ffff09fb9194d89ac7bd3747679c Mon Sep 17 00:00:00 2001
From: pjb <pjb123456>
Date: 星期四, 17 七月 2025 15:44:07 +0800
Subject: [PATCH] 自动出空桶优化

---
 src/main/java/com/zy/service/impl/MainServiceImpl.java |  215 +++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 198 insertions(+), 17 deletions(-)

diff --git a/src/main/java/com/zy/service/impl/MainServiceImpl.java b/src/main/java/com/zy/service/impl/MainServiceImpl.java
index a69b78a..4f37a5a 100644
--- a/src/main/java/com/zy/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -265,6 +265,9 @@
                             barcodeThread.setBarcode("");
                             staProtocol.setWorkNo(dto.getWorkNo());
                             staProtocol.setStaNo(dto.getStaNo().shortValue());
+                            if (dto.getStaNo() == 1071 || dto.getStaNo() == 1064 || dto.getStaNo() == 1078) {
+                                decreaseWantBucketCount(dto.getStaNo(),1);
+                            }
                             devpThread.setPakMk(staProtocol.getSiteId(), false);
                             boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                             log.info("杈撻�佺嚎涓嬪彂2锛�"+dto.getWorkNo()+","+dto.getStaNo());
@@ -302,10 +305,52 @@
         StaProtocol staProtocol1084 = devpThread.getStation().get(1084);
         StaProtocol staProtocol1087 = devpThread.getStation().get(1087);
         List<SearchLocParam.WantBucket> wantBucketList = new ArrayList<>();
-        wantBucketList.add(new SearchLocParam.WantBucket(1064,staProtocol1084.getWantBucketFlag()));
-        wantBucketList.add(new SearchLocParam.WantBucket(1071,staProtocol1081.getWantBucketFlag()));
-        wantBucketList.add(new SearchLocParam.WantBucket(1078,staProtocol1087.getWantBucketFlag()));
+        wantBucketList.add(new SearchLocParam.WantBucket(1064,staProtocol1084.getWantBucketFlag(),staProtocol1084.getWantBucketCount()));
+        wantBucketList.add(new SearchLocParam.WantBucket(1071,staProtocol1081.getWantBucketFlag(),staProtocol1081.getWantBucketCount()));
+        wantBucketList.add(new SearchLocParam.WantBucket(1078,staProtocol1087.getWantBucketFlag(),staProtocol1087.getWantBucketCount()));
         return wantBucketList;
+    }
+
+    /**
+     * 缃愯绾胯妗舵暟閲忓噺灏�
+     */
+    private void decreaseWantBucketCount(int site, int decrease) throws InterruptedException {
+
+        int siteNew;
+        switch (site) {
+            case 1071: siteNew = 1081;break;
+            case 1064: siteNew = 1084;break;
+            case 1078: siteNew = 1087;break;
+            default:
+                return;
+        }
+
+        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();
+
+        int remaining = count - decrease;
+        if ( remaining < 0) {
+            log.error("鑷姩鍑虹┖妗跺噺灏戠綈瑁呯嚎瑕佹《鏁板紓甯革紝绔欑偣锛歿}锛屽噺灏戝墠锛歿}锛屽噺灏戞暟锛歿}锛屽墿浣欒妗舵暟锛歿}", site, count, decrease, remaining);
+            return;
+        }
+
+        staProtocol.setWantBucketCount(remaining);
+
+        boolean offer = MessageQueue.offer(SlaveType.Devp, inGzxSiteList.indexOf(site) + 4, new Task(6, staProtocol));
+        if (offer) {
+            log.info("鑷姩鍑虹┖妗跺噺灏戠綈瑁呯嚎瑕佹《鏁板懡浠ゆ帹閫侀槦鍒楁垚鍔燂細绔欑偣锛歿}锛屽墿浣欒妗舵暟锛歿}" ,site, remaining);
+        } else {
+            log.error("鑷姩鍑虹┖妗跺噺灏戠綈瑁呯嚎瑕佹《鏁板懡浠ゆ帹閫侀槦鍒楀け璐ワ細绔欑偣锛歿}锛屽墿浣欒妗舵暟锛歿}" ,site, remaining);
+        }
+
+        log.info("鑷姩鍑虹┖妗跺噺灏戠綈瑁呯嚎瑕佹《鏁版垚鍔燂紝绔欑偣锛歿}锛屽噺灏戝墠锛歿}锛屽噺灏戞暟锛歿}锛屽墿浣欒妗舵暟锛歿}", site, count, decrease, remaining);
     }
 
     /**
@@ -1138,15 +1183,12 @@
     /**
      * 鍫嗗灈鏈哄洖鍘熺偣
      */
-    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) {
                 // 鍒ゆ柇鏄笉鏄凡鍦ㄥ師鐐�
@@ -1165,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); // 宸ヤ綔鍙�
@@ -1178,8 +1226,11 @@
                 if (!MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, crnCommand))) {
                     News.error("鍥炲師鐐逛换鍔′笅鍙戝け璐�", crn.getId(), JSON.toJSON(crnCommand));
                 } else {
+                    basCrnp.setModiTime(new Date());
+                    basCrnpService.updateById(basCrnp); // 璁剧疆鏇存柊鏃堕棿锛岄伩鍏嶉噸澶嶄笅鍙戝洖鍘熺偣
                     log.info("{}鍙峰爢鍨涙満鍥炲師鐐逛换鍔′笅鍙戞垚鍔燂細{}", crn.getId(), JSON.toJSON(crnCommand));
                 }
+                Thread.sleep(2000);
             }
         }
     }
@@ -1674,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) {
@@ -1819,7 +1873,7 @@
             if (wrkMast == null) {
                 log.error("寮傚父鍙e叆搴撲换鍔″彿鏃犱换鍔�:{}", staProtocol.getWorkNo());
                 return;
-            } else if (wrkMast.getLocNo() != null) {
+            } else if (wrkMast.getLocNo() != null && wrkMast.getLocNo().length() == 7) {
 //                log.info("寮傚父鍙e叆搴撳簱浣嶅凡鍒嗛厤:{}", wrkMast.getLocNo());
                 return;
             } else if(wrkMast.getStaNo() != 1090) {
@@ -1953,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;
         }
@@ -1962,21 +2016,106 @@
         String[] split = config.getValue().split("=");
 
         for (SearchLocParam.WantBucket wantBucket : getWantBucketFlag()) {
-            if (wantBucket.getBucketType() != 0) { // 缃愯绾挎湁瑕佹《淇″彿
+            if (wantBucket.getBucketType() != 0 && wantBucket.getWantBucketCount() > 0) { // 缃愯绾挎湁瑕佹《淇″彿+瑕佹墭鏁颁笉涓�0
                 boolean flag = true; // 鏄惁闇�瑕佽嚜鍔ㄨˉ锛宼rue涓嶉渶瑕侊紝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("{}鑷姩琛ョ┖妗讹紝缃愯绾胯妗跺瀷淇℃伅锛歿},姝e湪鎵ц浠诲姟鏁帮細{}",wantBucket.getSite(), wantBucket.getBucketType(),count);
+
+                if (wantBucket.getWantBucketCount() == 1) { // 鏈�鍚庡墿涓�鎷栫殑鏃跺��
+                    log.info("{}鑷姩琛ョ┖妗跺墿鏈�鍚庝竴鎵橈紝缃愯绾胯妗跺瀷淇℃伅锛歿},姝e湪鎵ц浠诲姟鏁帮細{}", 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("鏈�鍚庝竴涓嚜鍔ㄧ┖妗跺嚭搴�" + ":璇锋眰鎺ュ彛澶辫触锛侊紒锛乽rl锛歿}锛況equest锛歿}锛況esponse锛歿}", 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("{}鑷姩琛ョ┖妗讹紝缃愯绾胯妗跺瀷淇℃伅锛歿},姝e湪鎵ц浠诲姟鏁帮細{}", wantBucket.getSite(), wantBucket.getBucketType(), count);
                     // 鍒ゆ柇搴撻噷鏈夋棤绌烘《缁�
                     List<LocDetl> locDetlList = locDetlService.selectListByMatnr(wantBucket.getBucketType());
                     for (int i = 0; i < locDetlList.size(); i++) {
@@ -2038,10 +2177,11 @@
                                     log.info("鑷姩鍑虹┖妗惰姹倃ms鍘熷杩斿洖锛�" + response);
                                     JSONObject jsonObject = JSON.parseObject(response);
                                     if (jsonObject.getInteger("code").equals(200)) {
-                                        log.info("鑷姩鍑虹┖妗舵垚鍔�:{}",wantBucket.getSite());
+                                        decreaseWantBucketCount(wantBucket.getSite(), 2);
+                                        log.info("鑷姩鍑虹┖妗舵垚鍔�:{}", wantBucket.getSite());
                                         return;
                                     } else {
-                                        News.error("鑷姩绌烘《鍑哄簱" + ":璇锋眰鎺ュ彛澶辫触锛侊紒锛乽rl锛歿}锛況equest锛歿}锛況esponse锛歿}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
+                                        News.error("鑷姩绌烘《鍑哄簱" + ":璇锋眰鎺ュ彛澶辫触锛侊紒锛乽rl锛歿}锛況equest锛歿}锛況esponse锛歿}", wmsUrl + "/rpc/autoOutEmptyBucket", JSON.toJSONString(param), response);
                                     }
                                 } catch (Exception e) {
                                     e.printStackTrace();
@@ -2050,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("鑷姩鍑虹┖妗惰姹倃ms鍘熷杩斿洖锛�" + response);
+                            JSONObject jsonObject = JSON.parseObject(response);
+                            if (jsonObject.getInteger("code").equals(200)) {
+                                decreaseWantBucketCount(wantBucket.getSite(), 1);
+                                log.info("鑷姩鍑虹┖妗舵垚鍔�:{}", wantBucket.getSite());
+                                return;
+                            } else {
+                                News.error("鑷姩绌烘《鍑哄簱" + ":璇锋眰鎺ュ彛澶辫触锛侊紒锛乽rl锛歿}锛況equest锛歿}锛況esponse锛歿}", wmsUrl + "/rpc/autoOutEmptyBucket", JSON.toJSONString(param), response);
+                            }
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                        }
+                    }
                 }
             }
         }

--
Gitblit v1.9.1