From 8c97f18015743c7f913b9c512bdc768d144c575e Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 31 五月 2023 08:08:05 +0800
Subject: [PATCH] 高频入出库模式

---
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java |  267 +++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 216 insertions(+), 51 deletions(-)

diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index 1795d06..1875faa 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -789,7 +789,7 @@
                 continue;
             }
             // 鍙湁褰撳爢鍨涙満绌洪棽 骞朵笖 鏃犱换鍔℃椂鎵嶇户缁墽琛�
-            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
+            if (true || crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
                 // 濡傛灉鏈�杩戜竴娆℃槸鍏ュ簱妯″紡
                 if (crnProtocol.getLastIo().equals("I")) {
                     if (basCrnp.getInEnable().equals("Y")) {
@@ -820,6 +820,8 @@
                 }
                 // 搴撲綅绉昏浆
                 this.locToLoc1(crn, crnProtocol);
+                // 搴撲綅绉昏浆(楂橀绉诲簱锛宨o_type=111)
+                this.locToLoc111(crn, crnProtocol);
                 // 搴撲綅绉昏浆锛屽洖鍘熷簱浣�
                 this.locToLoc17(crn, crnProtocol);
                 // 婕旂ず浠诲姟
@@ -866,6 +868,67 @@
             if(!Cools.isEmpty(one)){
                 News.error("鍏ュ簱 ===>> 瀛樺湪绉诲簱鏈畬鎴愪换鍔★紝涓嶈兘鍏ュ簱銆傜Щ搴撲换鍔″彿={},鍫嗗灈鏈哄彿={}", one.getWrkNo(), slave.getId());
 //                continue;
+            }
+
+            //鍏ュ簱搴撲綅涓嶆槸鏈�澶栧眰搴撲綅锛屽垽鏂渶澶栧眰搴撲綅鏄惁涓虹┖搴撲綅锛屽涓嶆槸鍒欒繘琛岀Щ搴撲换鍔�
+            if(!locMastService.isOutMost(wrkMast.getLocNo())) {
+                WrkMast wrkMastMove = wrkMastMapper.selectLocMoveWorking(slave.getId());
+                if (wrkMastMove != null && wrkMast.getWrkNo() == 111) {
+                    continue;
+                }
+
+                WrkMast two = wrkMastMapper.selectWorking1(slave.getId(), wrkMast.getWrkNo());
+                if (two != null) {//2鍙锋満鏈夊湪鎵ц浠诲姟鏃讹紝绂佹鐢熸垚绉诲簱宸ヤ綔妗�
+                    continue;
+                } else {
+                    List<String> shallowLocs = Utils.getShallowLocs(wrkMast.getLocNo());
+                    if (!Cools.isEmpty(shallowLocs)) {
+                        for (String shallowLocNo : shallowLocs) {
+                            LocMast shallowLoc = locMastService.selectById(shallowLocNo);
+                            WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
+                            if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
+                                if (null == waitWrkMast) {
+                                    // 鐢熸垚涓�绗旂Щ搴撲换鍔″伐浣滄。銆佹敼鍙樻祬搴撲綅鐨勬簮搴�/鐩爣搴� 搴撲綅鐘舵��
+                                    // 娌℃湁浣滀笟涓殑鍏ュ簱浠诲姟鏃讹紝鎵嶈兘鐢熸垚绉诲簱浠诲姟
+                                    WrkMast one2 = wrkMastService.selectOne(new EntityWrapper<WrkMast>()
+                                            .eq("crn_no", slave.getId())
+                                            .last(" and wrk_sts in (3,4,5,6,7,8)"));
+                                    if (one2 == null) {
+                                        moveLocForDeepLoc(slave, shallowLoc);
+                                        // 缃《浠诲姟
+                                        wrkMast.setIoPri((double) 9999);
+                                        wrkMastMapper.updateById(wrkMast);
+                                    } else {
+                                        News.error("娴呭簱浣嶉樆濉炴椂锛屼笖娴呭簱浣嶅瓨鍦ㄤ綔涓氫腑鍑哄簱浠诲姟锛佸伐浣滃彿={}", one2.getWrkNo());
+                                    }
+                                    flag = true;
+                                    break;
+                                } else {
+                                    if (waitWrkMast.getWrkSts() != 18) {
+                                        News.error("搴撲綅鍑哄簱鍒板爢鍨涙満绔� ===>> 搴撲綅鐘舵�佸湪搴擄紝浣嗘槸娴呭簱浣嶅凡瀛樺湪宸ヤ綔妗d换鍔★紒鍑哄簱搴撲綅={},娴呭簱浣嶅彿={}", shallowLoc.getLocNo());
+                                        flag = true;
+                                        break;
+                                    }
+
+                                }
+                            } else if (shallowLoc.getLocSts().equals("Q") || shallowLoc.getLocSts().equals("S")) {
+                                News.error("搴撲綅鍑哄簱鍒板爢鍨涙満绔� ===>> 娴呭簱浣嶅簱浣嶇姸鎬佷负鍏ュ簱棰勭害锛佸嚭搴撳簱浣�={},娴呭簱浣嶅彿={}", shallowLoc.getLocNo());
+                                flag = true;
+                                break;
+                            }
+
+                            //20230307 ADD锛屽啀鍔犱竴娆″垽鏂紝褰撴祬搴撲綅鐘舵�佷笉涓篛鏃讹紝涓嶆墽琛屽綋鍓嶅嚭搴撲换鍔�
+                            if (shallowLoc != null && !shallowLoc.getLocSts().equals("O")) {
+                                News.error("鍋氫簡娴呭簱浣嶉樆濉炲鐞嗗悗鍙嶅鍒ゆ柇锛屾祬搴撲綅鐘舵�佷笉涓篛 ===>> 娴呭簱浣嶅簱浣嶇姸鎬佷负鍏ュ簱棰勭害锛佸嚭搴撳簱浣�={},娴呭簱浣嶅彿={}", wrkMast.getSourceLocNo(), shallowLoc.getLocNo());
+                                flag = true;
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+            if(flag){
+                return false;
             }
 
             // 鍒ゆ柇鏄惁宸插瓨鍦ㄥ皬杞︾粦瀹氫换鍔�
@@ -1148,11 +1211,11 @@
                 }
             }
 
-            //鍑哄簱搴撲綅涓嶆槸鏈�澶栧眰搴撲綅锛屽垽鏂祬搴撲綅缁勬槸鍚﹂兘涓虹┖锛屾垨瀛樺湪搴撲綅绉昏浆浠诲姟
+            //鍑哄簱搴撲綅涓嶆槸鏈�澶栧眰搴撲綅锛屽垽鏂渶澶栧眰搴撲綅鏄惁涓虹┖搴撲綅锛屽涓嶆槸鍒欒繘琛岀Щ搴撲换鍔�
             boolean flag = false;
             if(!locMastService.isOutMost(wrkMast.getSourceLocNo())) {
                 WrkMast wrkMastMove = wrkMastMapper.selectLocMoveWorking(slave.getId());
-                if (wrkMastMove != null && wrkMast.getWrkNo() == 11) {
+                if (wrkMastMove != null && wrkMast.getWrkNo() == 111) {
                     continue;
                 }
 
@@ -1160,29 +1223,12 @@
                 if (two != null) {//2鍙锋満鏈夊湪鎵ц浠诲姟鏃讹紝绂佹鐢熸垚绉诲簱宸ヤ綔妗�
                     continue;
                 } else {
-                    String[] shallowlocs = Utils.getShallowLocs(wrkMast.getSourceLocNo());
-                    if (!Cools.isEmpty(shallowlocs)) {
-                        for (String shallowLocNo : shallowlocs) {
+                    List<String> shallowLocs = Utils.getShallowLocs(wrkMast.getSourceLocNo());
+                    if (!Cools.isEmpty(shallowLocs)) {
+                        for (String shallowLocNo : shallowLocs) {
                             LocMast shallowLoc = locMastService.selectById(shallowLocNo);
                             WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
-                            if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) {
-                                if (null == waitWrkMast) {
-                                    News.error("{}搴撲綅寮傚父锛屾湭妫�绱㈠埌鐩稿簲宸ヤ綔妗o紒", shallowLocNo);
-                                } else {
-                                    //iotype=11锛寃rksts=17锛岃鏄庤揣鐗╁凡缁忕Щ搴撳埌鏆傚瓨搴撲綅锛岀瓑寰呭洖鍘熷簱浣�,姝ゆ椂鍏佽缁х画鍑哄簱
-                                    if (waitWrkMast.getIoType() != 11 || waitWrkMast.getWrkSts() != 17) {
-                                        waitWrkMast.setIoPri((double) 9999);
-                                        waitWrkMast.setModiTime(new Date());
-                                        if (wrkMastMapper.updateById(waitWrkMast) == 0) {
-                                            News.error("璋冩暣宸ヤ綔妗d紭鍏堢骇澶辫触锛佸伐浣滃彿={}", waitWrkMast.getWrkNo());
-                                        }
-                                        if (waitWrkMast.getWrkSts() != 17) {
-                                            flag = true;
-                                        }
-                                        break;
-                                    }
-                                }
-                            } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
+                            if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
                                 if (null == waitWrkMast) {
                                     // 鐢熸垚涓�绗旂Щ搴撲换鍔″伐浣滄。銆佹敼鍙樻祬搴撲綅鐨勬簮搴�/鐩爣搴� 搴撲綅鐘舵��
                                     // 娌℃湁浣滀笟涓殑鍑哄簱浠诲姟鏃讹紝鎵嶈兘鐢熸垚绉诲簱浠诲姟
@@ -1612,6 +1658,102 @@
                 if (wrkMast.getWrkSts() == 12L) {
                     this.carMoveIn(wrkMast, wrkMast.getSteNo(), crnProtocol);
                 }
+            }
+        }
+    }
+
+    /**
+     * 搴撲綅绉昏浆(楂橀绉诲簱锛宨o_type=111)
+     */
+    public synchronized void locToLoc111(CrnSlave slave, CrnProtocol crnProtocol){
+        // 鑾峰彇宸ヤ綔妗d俊鎭�
+        WrkMast wrkMast = wrkMastMapper.selectLocMove111(slave.getId());
+        if (null == wrkMast) {
+            return;
+        }
+        // 杩囨护
+        if (null != wrkMastMapper.selectPakin(slave.getId(), null)) {
+            News.error("{}鍑哄簱浠诲姟鏃犳硶浣滀笟锛屽洜瀛樺湪鍏ュ簱涓换鍔�!", wrkMast.getWrkNo());
+            return;
+        }
+
+        // 鍒ゆ柇鏄惁宸插瓨鍦ㄥ皬杞︾粦瀹氫换鍔�
+        BasSte basSte = basSteService.findByCrnNo(wrkMast.getCrnNo());
+        if(basSte == null) return;
+        WrkMast one = wrkMastService.selectOne(new EntityWrapper<WrkMast>()
+                .eq("ste_no",basSte.getSteNo())
+                .last(" and io_type != 111 and wrk_sts < 10"));
+        if(one != null){
+            News.error("{}绉诲簱浠诲姟鏃犳硶浣滀笟锛屽洜鍏ュ簱浠诲姟宸茬粦瀹氬皬杞�!", wrkMast.getWrkNo());
+            return;
+        }
+
+        // 鑾峰彇婧愬簱浣嶄俊鎭�
+        LocMast sourceLoc = locMastService.selectById(wrkMast.getSourceLocNo());
+        if (null == sourceLoc) {
+            News.error("宸ヤ綔妗e簱浣嶇Щ杞け璐ワ紝鍘熷洜锛氭绱㈡簮搴撲綅澶辫触锛佸伐浣滃彿={}锛屾簮搴撲綅={}", wrkMast.getWrkNo(), wrkMast.getSourceLocNo());
+            return;
+        }
+        // 婧愬簱浣�  搴撲綅鐘舵�佸垽鏂�
+        if (!sourceLoc.getLocSts().equals("R")) {
+            return;
+        }
+        // 鑾峰彇鐩爣搴撲綅淇℃伅
+        LocMast loc = locMastService.selectById(wrkMast.getLocNo());
+        if (null == loc || !loc.getLocSts().equals("S")) {
+            News.error("宸ヤ綔妗e簱浣嶇Щ杞け璐ワ紝鍘熷洜锛氭绱㈢洰鏍囧簱浣嶅け璐ワ紒宸ヤ綔鍙�={}锛屾簮搴撲綅={}", wrkMast.getWrkNo(), wrkMast.getLocNo());
+            return;
+        }
+        // 鑾峰彇鍫嗗灈鏈轰俊鎭� 骞� 鍒ゆ柇鏄惁鍙叆鍑�
+        BasCrnp basCrnp = basCrnpService.selectById(slave.getId());
+        if (!basCrnp.getInEnable().equals("Y") && !basCrnp.getOutEnable().equals("Y")) {
+            return;
+        }
+
+//        // 鍫嗗灈鏈烘帶鍒惰繃婊�
+//        if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
+//            return;
+//        }
+
+        // 宸茬粡瀛樺湪鍚婅溅鎵ц浠诲姟鏃讹紝鍒欒繃婊�
+        if (wrkMastMapper.selectWorking(slave.getId()) != null) {
+            return;
+        }
+
+        // 缃《浠诲姟
+        wrkMast.setIoPri((double) 9999);
+        wrkMastMapper.updateById(wrkMast);
+
+        // 婧愬簱浣� ===>> 鏈�澶栧眰搴撲綅
+        if (locMastService.isOutMost(wrkMast.getSourceLocNo())) {
+            // 鐩爣搴撲綅 ===>> 鏈�澶栧眰搴撲綅
+            if (locMastService.isOutMost(wrkMast.getLocNo())) {
+                // 鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
+                CrnCommand crnCommand = new CrnCommand();
+                crnCommand.setCrnNo(slave.getId()); // 鍫嗗灈鏈虹紪鍙�
+                crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 宸ヤ綔鍙�
+                crnCommand.setAckFinish((short) 0);  // 浠诲姟瀹屾垚纭浣�
+                crnCommand.setCommand((short) 0);
+                crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 浠诲姟妯″紡:  搴撲綅绉昏浆
+                crnCommand.setSourcePosX(sourceLoc.getRow1().shortValue());     // 婧愬簱浣嶆帓
+                crnCommand.setSourcePosY(sourceLoc.getBay1().shortValue());     // 婧愬簱浣嶅垪
+                crnCommand.setSourcePosZ(sourceLoc.getLev1().shortValue());     // 婧愬簱浣嶅眰
+                crnCommand.setDestinationPosX(loc.getRow1().shortValue());     // 鐩爣搴撲綅鎺�
+                crnCommand.setDestinationPosY(loc.getBay1().shortValue());     // 鐩爣搴撲綅鍒�
+                crnCommand.setDestinationPosZ(loc.getLev1().shortValue());     // 鐩爣搴撲綅灞�
+                if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
+                    News.error("鍫嗗灈鏈哄懡浠や笅鍙戝け璐ワ紝鍫嗗灈鏈哄彿={}锛屼换鍔℃暟鎹�={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
+                } else {
+                    // 淇敼宸ヤ綔妗g姸鎬� 11.鐢熸垚鍑哄簱ID => 7.鍚婅溅鍏ュ簱涓�
+                    Date now = new Date();
+                    wrkMast.setWrkSts(7L);
+                    wrkMast.setCrnStrTime(now);
+                    wrkMast.setModiTime(now);
+                    if (wrkMastMapper.updateById(wrkMast) == 0) {
+                        News.error("銆愬簱浣嶇Щ杞�� 淇敼宸ヤ綔妗g姸鎬� 11.鐢熸垚鍑哄簱ID => 7.鍚婅溅鍏ュ簱涓� 澶辫触锛侊紒锛屽伐浣滃彿={}", wrkMast.getWrkNo());
+                    }
+                }
+
             }
         }
     }
@@ -2638,7 +2780,7 @@
 
                 }
                 if (wrkMast == null) { continue; }
-                if (wrkMast.getIoType() != 11) {
+                if (wrkMast.getIoType() != 11 && wrkMast.getIoType() != 111) {
                     // 鍏ュ簱 ==>> 璐х墿鎼叆搴�
                     if (wrkMast.getWrkSts() == 7){
                         // 鍒ゆ柇鏄惁闇�瑕佸皬杞﹀叆搴�
@@ -2782,8 +2924,52 @@
                         }
                         // 绉诲簱 ===>> 鍫嗗灈鏈烘惉鑷崇洰鏍囧簱浣嶇粍 瀹屾垚
                     }
+                // 搴撲綅绉昏浆(楂橀io_type111)
+                } else if(wrkMast.getIoType() == 111) {
+                    Date now = new Date();
+                    // 鍏ュ簱 ==>> 璐х墿鎼叆搴�
+                    if (wrkMast.getWrkSts() == 7){
+                        if (locMastService.isOutMost(wrkMast.getLocNo()) && locMastService.isOutMost(wrkMast.getSourceLocNo())) {
+                            // ==> 9.鍏ュ簱瀹屾垚
+                            wrkMast.setWrkSts(9L);
+                            wrkMast.setCrnEndTime(now);
+                            wrkMast.setModiTime(now);
+                            // 淇敼鎴愬姛鍚庡浣嶅爢鍨涙満
+                            if (wrkMastMapper.updateById(wrkMast) > 0) {
+
+//                                if (!locDetlService.updateLocNo(wrkMast.getLocNo(), wrkMast.getSourceLocNo())) {
+//                                    News.error("搴撲綅绉昏浆 ===>> 杞Щ搴撳瓨鏄庣粏鏁版嵁澶辫触锛沎婧愬簱浣�={}],[鐩爣搴撲綅={}]", wrkMast.getSourceLocNo(), wrkMast.getLocNo());
+//                                    continue;
+//                                }
+
+//                                // 淇敼婧愬簱浣嶇姸鎬� ==> O
+//                                LocMast sourceLoc = locMastService.selectById(wrkMast.getSourceLocNo());
+//                                if (null != sourceLoc) {
+//                                    sourceLoc.setLocSts("O");
+//                                    sourceLoc.setModiTime(now);
+//                                    if (!locMastService.updateById(sourceLoc)) {
+//                                        News.error("搴撲綅绉昏浆 ===>> 淇敼婧愬簱浣嶇姸鎬佸け璐ワ紱[workNo={}],[sourceLoc={}]", wrkMast.getWrkNo(), wrkMast.getSourceLocNo());
+//                                    }
+//                                }
+//                                // 淇敼鐩爣搴撲綅鐘舵�� ==> F
+//                                LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
+//                                if (locMast != null) {
+//                                    locMast.setLocSts("F");
+//                                    locMast.setModiTime(now);
+//                                    if (!locMastService.updateById(locMast)) {
+//                                        News.error("搴撲綅绉昏浆 ===>> 淇敼鐩爣搴撲綅鐘舵�佸け璐ワ紱[workNo={}],[locNo={}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
+//                                    }
+//                                }
+
+                                // 鍫嗗灈鏈哄浣�
+                                crnThread.setResetFlag(true);
+                            } else {
+                                News.error("淇敼宸ヤ綔妗g姸鎬� 7.鍚婅溅鍏ュ簱涓� => 9.鍏ュ簱瀹屾垚 澶辫触锛侊紒锛屽伐浣滃彿={}", wrkMast.getWrkNo());
+                            }
+                        }
+                    }
                 // 搴撲綅绉昏浆
-                } else {
+                }else {
                     // 鍏ュ簱 ==>> 璐х墿鎼叆搴�
                     if (wrkMast.getWrkSts() == 7){
                         // 鍒ゆ柇鏄惁闇�瑕佸皬杞﹀叆搴�
@@ -4057,6 +4243,7 @@
             LocMast loc = null;
             List<LocMast> locs = locMastService.selectList(new EntityWrapper<LocMast>().eq("crn_no",crn.getId())
                                                 .eq("loc_type1",shallowLoc.getLocType1())
+                                                .eq("loc_type2",shallowLoc.getLocType2())
                                                 .eq("loc_sts","O")
                                                 .last(" and row1 in (" + rows + ") order by bay1,lev1"));
             for (LocMast one : locs){
@@ -4064,30 +4251,8 @@
                     || Utils.getBay(one.getLocNo()) != Utils.getBay(shallowLoc.getLocNo())
                     || Utils.getLev(one.getLocNo()) != Utils.getLev(shallowLoc.getLocNo())){
 
-                    boolean success = true;
-                    List<String> insideLoc = Utils.getGroupInsideLoc(one.getLocNo());
-                    for (String inside : insideLoc) {
-                        LocMast locMast = locMastService.selectById(inside);
-                        if(Cools.isEmpty(locMast)){
-                            continue;
-                        }
-                        if (locMast.getLocSts().equals("P")
-                                || locMastService.selectById(inside).getLocSts().equals("R")
-                                || locMastService.selectById(inside).getLocSts().equals("S")
-                                || locMastService.selectById(inside).getLocSts().equals("Q")) {
-                            success = false; break;
-                        }
-                    }
-
-                    Integer steNo = this.hasCar(one.getLocNo());
-                    if (steNo != null) {
-                        continue;
-                    }
-
-                    if (success) {
-                        loc = one;
-                        break;
-                    }
+                    loc = one;
+                    break;
                 }
             }
 
@@ -4104,7 +4269,7 @@
             wrkMast.setWrkNo(workNo);
             wrkMast.setIoTime(now);
             wrkMast.setWrkSts(11L); // 宸ヤ綔鐘舵�侊細11.鐢熸垚鍑哄簱ID
-            wrkMast.setIoType(11); // 鍏ュ嚭搴撶姸鎬侊細 11.搴撴牸绉昏浇
+            wrkMast.setIoType(111); // 鍏ュ嚭搴撶姸鎬侊細 111.搴撴牸绉昏浇(楂橀)
             wrkMast.setIoPri((double) 9999);
             wrkMast.setCrnNo(crn.getId());
             wrkMast.setSourceLocNo(shallowLoc.getLocNo()); // 婧愬簱浣�

--
Gitblit v1.9.1