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/utils/Utils.java                  |  205 ++++++++++++++++++++----
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java |  267 +++++++++++++++++++++++++++------
 src/main/java/com/zy/asrs/mapper/WrkMastMapper.java         |    2 
 src/main/resources/mapper/WrkMastMapper.xml                 |    4 
 4 files changed, 388 insertions(+), 90 deletions(-)

diff --git a/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java b/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
index 5b399ce..3a8460f 100644
--- a/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -56,6 +56,8 @@
 //    @Select("select top 1 * from dbo.asr_wrk_mast where wrk_sts=11 and (io_type=11 or io_type=110) and crn_no=#{crnNo} order by io_time,wrk_no")
     WrkMast selectLocMove(@Param("crnNo")Integer crnNo);
 
+    WrkMast selectLocMove111(@Param("crnNo")Integer crnNo);
+
     WrkMast selectLocMoving(@Param("crnNo")Integer crnNo);
 
     WrkMast selectWorking(@Param("crnNo")Integer crnNo);
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()); // 婧愬簱浣�
diff --git a/src/main/java/com/zy/asrs/utils/Utils.java b/src/main/java/com/zy/asrs/utils/Utils.java
index 3430b72..08060e9 100644
--- a/src/main/java/com/zy/asrs/utils/Utils.java
+++ b/src/main/java/com/zy/asrs/utils/Utils.java
@@ -6,6 +6,7 @@
 
 import java.text.DecimalFormat;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -224,56 +225,180 @@
     /**
      * 鑾峰彇 娣卞簱浣嶅搴旂殑娴呭簱浣嶇粍
      */
-    public static String[] getShallowLocs(String deepLoc){
-        String[] locsArr = null;
-        String locs="";
-        int row = getRow(deepLoc);
+    public static List<String> getShallowLocs(String locNo){
+        int row = getRow(locNo);
         switch (row){
             case 1:
-                locs += zerofill(String.valueOf(row+2),2) + deepLoc.substring(2);
-                locs += "," + zerofill(String.valueOf(row+1),2) + deepLoc.substring(2);
-                break;
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(2), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(3), 2) + locNo.substring(2));
+                }};
             case 2:
-                locs += zerofill(String.valueOf(row+1),2) + deepLoc.substring(2);
-                break;
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(3), 2) + locNo.substring(2));
+                }};
+            case 3:
+            case 4:
+                return null;
             case 5:
-            case 20:
-                locs += zerofill(String.valueOf(row-1),2) + deepLoc.substring(2);
-                break;
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(4), 2) + locNo.substring(2));
+                }};
             case 6:
-            case 14:
-            case 21:
-                locs += zerofill(String.valueOf(row-2),2) + deepLoc.substring(2);
-                locs += "," + zerofill(String.valueOf(row-1),2) + deepLoc.substring(2);
-                break;
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(5), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(4), 2) + locNo.substring(2));
+                }};
             case 7:
-                locs += zerofill(String.valueOf(row-3),2) + deepLoc.substring(2);
-                locs += "," + zerofill(String.valueOf(row-2),2) + deepLoc.substring(2);
-                locs += "," + zerofill(String.valueOf(row-1),2) + deepLoc.substring(2);
-                break;
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(6), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(5), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(4), 2) + locNo.substring(2));
+                }};
             case 8:
-            case 15:
-                locs += zerofill(String.valueOf(row+3),2) + deepLoc.substring(2);
-                locs += "," + zerofill(String.valueOf(row+2),2) + deepLoc.substring(2);
-                locs += "," + zerofill(String.valueOf(row+1),2) + deepLoc.substring(2);
-                break;
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(9), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(10), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(11), 2) + locNo.substring(2));
+                }};
             case 9:
-            case 16:
-                locs += zerofill(String.valueOf(row+2),2) + deepLoc.substring(2);
-                locs += "," + zerofill(String.valueOf(row+1),2) + deepLoc.substring(2);
-                break;
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(10), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(11), 2) + locNo.substring(2));
+                }};
             case 10:
-            case 17:
-                locs += zerofill(String.valueOf(row+1),2) + deepLoc.substring(2);
-                break;
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(11), 2) + locNo.substring(2));
+                }};
+            case 11:
+            case 12:
+                return null;
             case 13:
-                locs += zerofill(String.valueOf(row-1),2) + deepLoc.substring(2);
-                break;
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(12), 2) + locNo.substring(2));
+                }};
+            case 14:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(13), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(12), 2) + locNo.substring(2));
+                }};
+            case 15:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(16), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(17), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(18), 2) + locNo.substring(2));
+                }};
+            case 16:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(17), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(18), 2) + locNo.substring(2));
+                }};
+            case 17:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(18), 2) + locNo.substring(2));
+                }};
+            case 18:
+            case 19:
+                return null;
+            case 20:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(19), 2) + locNo.substring(2));
+                }};
+            case 21:
+                return new ArrayList<String>() {{
+                    add(zerofill(String.valueOf(20), 2) + locNo.substring(2));
+                    add(zerofill(String.valueOf(19), 2) + locNo.substring(2));
+                }};
+            default:
+                throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
         }
-        if(!Cools.isEmpty(locs)){
-            locsArr = locs.split(",");
+//        String[] locsArr = null;
+//        String locs="";
+//        int row = getRow(deepLoc);
+//        switch (row){
+//            case 1:
+//                locs += zerofill(String.valueOf(row+2),2) + deepLoc.substring(2);
+//                locs += "," + zerofill(String.valueOf(row+1),2) + deepLoc.substring(2);
+//                break;
+//            case 2:
+//                locs += zerofill(String.valueOf(row+1),2) + deepLoc.substring(2);
+//                break;
+//            case 5:
+//            case 20:
+//                locs += zerofill(String.valueOf(row-1),2) + deepLoc.substring(2);
+//                break;
+//            case 6:
+//            case 14:
+//            case 21:
+//                locs += zerofill(String.valueOf(row-2),2) + deepLoc.substring(2);
+//                locs += "," + zerofill(String.valueOf(row-1),2) + deepLoc.substring(2);
+//                break;
+//            case 7:
+//                locs += zerofill(String.valueOf(row-3),2) + deepLoc.substring(2);
+//                locs += "," + zerofill(String.valueOf(row-2),2) + deepLoc.substring(2);
+//                locs += "," + zerofill(String.valueOf(row-1),2) + deepLoc.substring(2);
+//                break;
+//            case 8:
+//            case 15:
+//                locs += zerofill(String.valueOf(row+3),2) + deepLoc.substring(2);
+//                locs += "," + zerofill(String.valueOf(row+2),2) + deepLoc.substring(2);
+//                locs += "," + zerofill(String.valueOf(row+1),2) + deepLoc.substring(2);
+//                break;
+//            case 9:
+//            case 16:
+//                locs += zerofill(String.valueOf(row+2),2) + deepLoc.substring(2);
+//                locs += "," + zerofill(String.valueOf(row+1),2) + deepLoc.substring(2);
+//                break;
+//            case 10:
+//            case 17:
+//                locs += zerofill(String.valueOf(row+1),2) + deepLoc.substring(2);
+//                break;
+//            case 13:
+//                locs += zerofill(String.valueOf(row-1),2) + deepLoc.substring(2);
+//                break;
+//        }
+//        if(!Cools.isEmpty(locs)){
+//            locsArr = locs.split(",");
+//        }
+//        return locsArr;
+    }
+
+    /**
+     * 鑾峰彇褰撳墠搴撲綅宸烽亾鏈�澶栦晶搴撲綅鍙�
+     */
+    public static String getGroupOutermostLoc(String locNo) {
+        int row = getRow(locNo);
+        switch (row) {
+            case 1:
+            case 2:
+            case 3:
+                return zerofill(String.valueOf(3), 2) + locNo.substring(2);
+            case 4:
+            case 5:
+            case 6:
+            case 7:
+                return zerofill(String.valueOf(4), 2) + locNo.substring(2);
+            case 8:
+            case 9:
+            case 10:
+            case 11:
+                return zerofill(String.valueOf(11), 2) + locNo.substring(2);
+            case 12:
+            case 13:
+            case 14:
+                return zerofill(String.valueOf(12), 2) + locNo.substring(2);
+            case 15:
+            case 16:
+            case 17:
+            case 18:
+                return zerofill(String.valueOf(18), 2) + locNo.substring(2);
+            case 19:
+            case 20:
+            case 21:
+                return zerofill(String.valueOf(19), 2) + locNo.substring(2);
+            default:
+                throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
         }
-        return locsArr;
     }
 
     /**
@@ -351,8 +476,10 @@
 //        String deepLocs = getDeepLocs("2100203");
 //        System.out.println("shallowLocs ==>> " + shallowLocs);
 //        System.out.println("deepLocs ==>> " + deepLocs);
-        String[] shallowArr = getShallowLocs("1700203");;
+//        String[] shallowArr = getShallowLocs("0300504");
+        List<String> shallowLocs = getShallowLocs("2100404");
         String[] deepArr = getDeepLocs("1700203");
+        String outermostLoc = getGroupOutermostLoc("0701703");
 //        if (shallowLocs.indexOf(',') >= 0) {
 //            shallowArr = shallowLocs.split(",");
 //        }
diff --git a/src/main/resources/mapper/WrkMastMapper.xml b/src/main/resources/mapper/WrkMastMapper.xml
index c2d3fd8..a99ae2b 100644
--- a/src/main/resources/mapper/WrkMastMapper.xml
+++ b/src/main/resources/mapper/WrkMastMapper.xml
@@ -128,6 +128,10 @@
         select top 1 * from dbo.asr_wrk_mast where wrk_sts in (3,6,11,12,15) and io_type=11 and crn_no=#{crnNo} order by io_pri desc,io_time,wrk_no
     </select>
 
+    <select id="selectLocMove111" resultMap="BaseResultMap">
+        select top 1 * from dbo.asr_wrk_mast where wrk_sts in (3,6,11,12,15) and io_type=111 and crn_no=#{crnNo} order by io_pri desc,io_time,wrk_no
+    </select>
+
     <select id="selectLocMoving" resultMap="BaseResultMap">
         select top 1 * from dbo.asr_wrk_mast where wrk_sts=12 and io_type=11 and crn_no=#{crnNo} order by io_time,wrk_no
     </select>

--
Gitblit v1.9.1