From 314e894c0d6ce2739344dcd1c94ae7770868a0f1 Mon Sep 17 00:00:00 2001 From: Junjie <fallin.jie@qq.com> Date: 星期三, 28 五月 2025 14:51:16 +0800 Subject: [PATCH] # --- src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | 477 ++++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 326 insertions(+), 151 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 34a1ed2..9aabe1c 100644 --- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java +++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java @@ -74,6 +74,8 @@ private ForkLiftAction forkLiftAction; @Autowired private NotifyUtils notifyUtils; + @Autowired + private BasShuttleChargeService basShuttleChargeService; /** * 鍒濆鍖栧疄鏃跺湴鍥� @@ -115,9 +117,13 @@ List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() .in("wrk_sts" , WrkStsType.INBOUND_LIFT_RUN_COMPLETE.sts - )); + ) + .orderBy("io_pri", false) + .orderBy("appe_time", true) + ); for (WrkMast wrkMast : wrkMasts) { boolean step1 = this.shuttleInExecuteStep1(wrkMast);//灏忚溅鎼叆搴撲腑 + Thread.sleep(100); if (!step1) { continue; } @@ -132,7 +138,7 @@ * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue */ - public boolean shuttleInExecuteStep1(WrkMast wrkMast) { + public synchronized boolean shuttleInExecuteStep1(WrkMast wrkMast) { if (wrkMast.getWrkSts() == WrkStsType.INBOUND_LIFT_RUN_COMPLETE.sts) { //鑾峰彇鐩爣绔� ForkLiftStaProtocol liftSta = ForkLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo()); @@ -173,6 +179,15 @@ //灏忚溅涓嶅湪杈撻�佺珯鐐逛綅缃� shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), liftSta.getLocNo(), wrkMast.getShuttleNo());//璋冨害灏忚溅鍒拌揣鐗╂墍鍦ㄨ緭閫佺珯鐐硅繘琛屽彇璐� News.info("{}浠诲姟锛寋}灏忚溅锛屾湭鍒拌揪杈撻�佺珯鐐癸紝绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); + return false; + } + + //妫�娴嬮殰纰嶇墿杞� + boolean checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getLocNo(), new ArrayList<Integer>() {{ + add(shuttleProtocol.getShuttleNo()); + }}); + if (checkObstacle) { + News.info("{}浠诲姟锛岄伩闅滆寖鍥存湁灏忚溅锛岀瓑寰呴殰纰嶅皬杞﹁皟绂讳腑", wrkMast.getWrkNo()); return false; } @@ -228,9 +243,13 @@ List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() .in("wrk_sts" , WrkStsType.NEW_OUTBOUND.sts - )); + ) + .orderBy("io_pri", false) + .orderBy("appe_time", true) + ); for (WrkMast wrkMast : wrkMasts) { boolean step1 = this.shuttleOutExecuteStep1(wrkMast);//灏忚溅鎼嚭搴撲腑 + Thread.sleep(100); if (!step1) { continue; } @@ -245,7 +264,7 @@ * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue */ - public boolean shuttleOutExecuteStep1(WrkMast wrkMast) { + public synchronized boolean shuttleOutExecuteStep1(WrkMast wrkMast) { //101.鐢熸垚鍑哄簱浠诲姟 => 102.灏忚溅鎼繍涓� if (wrkMast.getWrkSts() == WrkStsType.NEW_OUTBOUND.sts) { Integer liftNo = wrkMast.getLiftNo(); @@ -256,20 +275,6 @@ News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭鎵惧埌鍖归厤鐨勬彁鍗囨満", wrkMast.getWrkNo()); return false; } - - //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟 - WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(liftNo); - if (liftWrkMast != null) { - if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//鎻愬崌鏈轰换鍔″拰褰撳墠浠诲姟涓嶇浉鍚� - News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), wrkMast.getLiftNo()); - return false; - } - } - - wrkMast.setLiftNo(liftNo); - wrkMast.setModiTime(new Date()); - wrkMastService.updateById(wrkMast); - return false; } ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo); @@ -301,6 +306,12 @@ if (liftSta.getHasTray()) { News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}绔欑偣鏈夋墭鐩橈紝绂佹娲惧彂", wrkMast.getWrkNo(), liftSta.getStaNo()); + return false; + } + + boolean checkLocPathIsAvailable = navigateUtils.checkLocPathIsAvailable(wrkMast.getSourceLocNo(), liftSta.getLocNo()); + if(!checkLocPathIsAvailable) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭璁$畻鍒板彲鎵ц璺緞锛岀瓑寰呬腑", wrkMast.getWrkNo()); return false; } @@ -345,6 +356,15 @@ //鍒ゆ柇灏忚溅鏄惁鍒拌揪璐х墿搴撲綅 if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) { + //妫�娴嬮殰纰嶇墿杞� + boolean checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getSourceLocNo(), new ArrayList<Integer>() {{ + add(shuttleProtocol.getShuttleNo()); + }}); + if (checkObstacle) { + News.info("{}浠诲姟锛岄伩闅滆寖鍥存湁灏忚溅锛岀瓑寰呴殰纰嶅皬杞﹁皟绂讳腑", wrkMast.getWrkNo()); + return false; + } + //灏忚溅涓嶅湪杈撻�佺珯鐐逛綅缃� shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getShuttleNo());//璋冨害灏忚溅鍒拌揣鐗╂墍鍦ㄥ簱浣嶈繘琛屽彇璐� News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛屾湭鍒拌揪杈撻�佺珯鐐癸紝绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); @@ -430,6 +450,9 @@ shuttleThread.setSyncTaskNo(0); } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_OUT_LIFT.sts) { //308.灏忚溅杩佸嚭鎻愬崌鏈轰腑 ==> 309.灏忚溅杩佸嚭鎻愬崌鏈哄畬鎴� + if (Utils.getLev(shuttleProtocol.getCurrentLocNo()) != Utils.getLev(wrkMast.getLocNo())) { + continue;//灏忚溅鏈埌杈剧洰鏍囧眰 + } wrkMast.setWrkSts(WrkStsType.MOVE_OUT_LIFT_COMPLETE.sts); shuttleThread.setSyncTaskNo(0); } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_SHUTTLE.sts) { @@ -486,7 +509,11 @@ public synchronized void shuttleLocMoveExecute() { try { //鏌ヨ绉诲簱浠诲姟 - List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts", WrkStsType.NEW_LOC_MOVE.sts)); + List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() + .in("wrk_sts", WrkStsType.NEW_LOC_MOVE.sts) + .orderBy("io_pri", false) + .orderBy("appe_time", true) + ); for (WrkMast wrkMast : wrkMasts) { boolean stepToTarget = this.shuttleLocMoveExecuteToTarget(wrkMast);//绉诲簱浠诲姟-灏忚溅鍘荤洰鏍囩偣 if (!stepToTarget) { @@ -510,6 +537,12 @@ //灏忚溅绉诲姩鑷崇珯鐐� 501.鐢熸垚绉诲簱浠诲姟 ==> 502.灏忚溅鎼繍涓� if (wrkMast.getWrkSts() == WrkStsType.NEW_LOC_MOVE.sts) { + boolean checkLocPathIsAvailable = navigateUtils.checkLocPathIsAvailable(wrkMast.getSourceLocNo(), wrkMast.getLocNo()); + if(!checkLocPathIsAvailable) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭璁$畻鍒板彲鎵ц璺緞锛岀瓑寰呬腑", wrkMast.getWrkNo()); + return false; + } + if (wrkMast.getShuttleNo() == null) {//娌℃湁缁戝畾灏忚溅锛岃繘琛岃皟搴� boolean result = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo());//璋冨害灏忚溅鍒拌揣鐗╃偣杩涜鍙栬揣 News.info("{}浠诲姟锛岃皟搴﹀皬杞}绯荤粺绛夊緟涓�", wrkMast.getWrkNo(), result ? "鎴愬姛" : "澶辫触"); @@ -528,6 +561,15 @@ if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) { News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屽皬杞︽湭鍒拌揪鍙栬揣浣嶇疆", wrkMast.getWrkNo(), wrkMast.getSourceLocNo()); + return false; + } + + //妫�娴嬮殰纰嶇墿杞� + boolean checkObstacle = shuttleOperaUtils.checkObstacle(wrkMast.getLocNo(), new ArrayList<Integer>() {{ + add(shuttleProtocol.getShuttleNo()); + }}); + if (checkObstacle) { + News.info("{}浠诲姟锛岄伩闅滆寖鍥存湁灏忚溅锛岀瓑寰呴殰纰嶅皬杞﹁皟绂讳腑", wrkMast.getWrkNo()); return false; } @@ -588,59 +630,6 @@ } for (WrkMast wrkMast : wrkMasts) { - Integer liftNo = wrkMast.getLiftNo(); - if (liftNo == null) { - //鏈垎閰嶆彁鍗囨満 - Integer staNo = wrkMast.getIoType() == WrkIoType.IN.id ? wrkMast.getSourceStaNo() : wrkMast.getStaNo(); - liftNo = ForkLiftUtils.getConveyorBindLiftNo(staNo); - if(liftNo == null) { - News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭鎵惧埌鍖归厤鐨勬彁鍗囨満", wrkMast.getWrkNo()); - continue; - } - - ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo); - if (forkLiftThread == null) { - continue; - } - ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus(); - if (forkLiftProtocol == null) { - continue; - } - - if (!forkLiftThread.isIdle()) { - News.info("{}鍙锋彁鍗囨満锛屽繖纰屼腑", liftNo); - continue; - } - - //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟 - WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(wrkMast.getLiftNo()); - if (liftWrkMast != null) { - if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//鎻愬崌鏈轰换鍔″拰褰撳墠浠诲姟涓嶇浉鍚� - News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), wrkMast.getLiftNo()); - continue;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇� - } - } - - wrkMast.setLiftNo(liftNo); - wrkMast.setModiTime(new Date()); - wrkMastService.updateById(wrkMast); - continue; - } - - ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo); - if (forkLiftThread == null) { - continue; - } - ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus(); - if (forkLiftProtocol == null) { - continue; - } - - if (!forkLiftThread.isIdle()) { - News.info("{}鍙锋彁鍗囨満锛屽繖纰屼腑", liftNo); - continue; - } - boolean stepIn = this.liftIoExecuteStepIn(wrkMast);//鎻愬崌鏈哄叆搴� if (!stepIn) { continue; @@ -683,7 +672,26 @@ return false; } - ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftSta.getLiftNo()); + Integer liftNo = wrkMast.getLiftNo(); + if (liftNo == null) { + //鏈垎閰嶆彁鍗囨満 + Integer staNo = wrkMast.getSourceStaNo(); + liftNo = ForkLiftUtils.getConveyorBindLiftNo(staNo); + if(liftNo == null) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭鎵惧埌鍖归厤鐨勬彁鍗囨満", wrkMast.getWrkNo()); + return false; + } + + //鐢宠鎻愬崌鏈鸿祫婧� + boolean applyForkLift = forkLiftAction.applyForkLift(liftNo, wrkMast.getWrkNo()); + if(!applyForkLift) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀敵璇锋彁鍗囨満璧勬簮澶辫触锛岀姝㈠叆搴�", wrkMast.getWrkNo()); + return false; + } + return false; + } + + ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo); if (forkLiftThread == null) { return false; } @@ -702,16 +710,7 @@ return false; } - //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟 - WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(wrkMast.getLiftNo()); - if (liftWrkMast != null) { - if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//鎻愬崌鏈轰换鍔″拰褰撳墠浠诲姟涓嶇浉鍚� - News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), wrkMast.getLiftNo()); - return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇� - } - } - - //妫�娴嬫ゼ灞傛槸鍚︽湁绌挎杞� + //妫�娴嬫ゼ灞傛槸鍚︽湁鍙敤绌挎杞� boolean checkLevHasShuttle = Utils.checkLevHasShuttle(liftSta.getLev()); if (!checkLevHasShuttle) { if (wrkMast.getShuttleNo() != null) { @@ -734,6 +733,13 @@ return false; } + //璇锋眰涓婄骇绯荤粺锛屾槸鍚﹀厑璁稿叆搴� + boolean inMission = ForkLiftUtils.queryInMission(wrkMast.getSourceStaNo(), liftSta.getLiftNo(), wrkMast.getWmsWrkNo()); + if (!inMission) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屼笂绾х郴缁熶笉鍏佽鍏ュ簱", wrkMast.getWrkNo()); + return false; + } + //鑾峰彇鎻愬崌鏈哄懡浠� List<ForkLiftCommand> liftCommands = forkLiftThread.getPickAndPutCommand(wrkMast.getWrkNo(), wrkMast.getSourceStaNo(), liftSta.getLev()); ArrayList<ForkLiftCommand> commands = new ArrayList<>(); @@ -742,7 +748,7 @@ //鎻愪氦鍒扮嚎绋嬪幓宸ヤ綔 LiftAssignCommand assignCommand = new LiftAssignCommand(); assignCommand.setCommands(commands); - assignCommand.setLiftNo(wrkMast.getLiftNo().shortValue()); + assignCommand.setLiftNo(liftNo.shortValue()); assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); assignCommand.setTaskMode(ForkLiftTaskModeType.PICK_PUT.id.shortValue()); @@ -767,15 +773,6 @@ //--------------------------------------鎻愬崌鏈哄嚭搴�-----------------------------------------// //103.灏忚溅鎼繍瀹屾垚 ==> 104.鎻愬崌鏈烘惉杩愪腑 if (wrkMast.getWrkSts() == WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts) { - ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo()); - if (shuttleThread == null) { - return false; - } - ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); - if(shuttleProtocol == null) { - return false; - } - //鑾峰彇婧愮珯 ForkLiftStaProtocol liftSta = ForkLiftUtils.getLiftStaByStaNo(wrkMast.getSourceStaNo()); if (liftSta == null) { @@ -783,20 +780,38 @@ return false;//鎵句笉鍒扮珯鐐� } - if (shuttleProtocol.getCurrentLocNo().equals(liftSta.getLocNo())) { - //灏忚溅杩樺湪杈撻�佺珯鐐� - //鑾峰彇灏忚溅寰呮満浣� - String standbyLocNo = Utils.getShuttleStandbyLocNo(liftSta.getLocNo()); - if(standbyLocNo == null) { - News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岃幏鍙栧皬杞﹀緟鏈轰綅澶辫触", wrkMast.getWrkNo()); + if(wrkMast.getShuttleNo() != null) { + ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo()); + if (shuttleThread == null) { return false; } - //璋冨害灏忚溅鍘诲緟鏈轰綅 - boolean dispatchShuttle = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), standbyLocNo, wrkMast.getShuttleNo()); - if (!dispatchShuttle) { - News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屽皬杞﹀湪杈撻�佺珯鐐硅皟搴﹀皬杞﹂伩璁╁け璐�", wrkMast.getWrkNo()); + ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); + if(shuttleProtocol == null) { return false; } + + if (shuttleProtocol.getCurrentLocNo().equals(liftSta.getLocNo())) { + //灏忚溅杩樺湪杈撻�佺珯鐐� + //鑾峰彇灏忚溅寰呮満浣� + String standbyLocNo = Utils.getShuttleStandbyLocNo(liftSta.getLocNo()); + if (standbyLocNo == null) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岃幏鍙栧皬杞﹀緟鏈轰綅澶辫触", wrkMast.getWrkNo()); + return false; + } + //璋冨害灏忚溅鍘诲緟鏈轰綅 + boolean dispatchShuttle = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), standbyLocNo, wrkMast.getShuttleNo()); + if (!dispatchShuttle) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屽皬杞﹀湪杈撻�佺珯鐐硅皟搴﹀皬杞﹂伩璁╁け璐�", wrkMast.getWrkNo()); + return false; + } + } else { + //灏忚溅宸蹭笉鍦ㄨ緭閫佺珯鐐逛綅缃紝閲婃斁灏忚溅 + wrkMast.setShuttleNo(null);//閲婃斁灏忚溅 + wrkMast.setModiTime(new Date()); + wrkMastService.updateById(wrkMast); + return false; + } + return false; } if (liftSta.getHasCar()) { @@ -809,7 +824,25 @@ return false; } - ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftSta.getLiftNo()); + Integer liftNo = wrkMast.getLiftNo(); + if (liftNo == null) { + //鏈垎閰嶆彁鍗囨満 + Integer staNo = wrkMast.getStaNo(); + liftNo = ForkLiftUtils.getConveyorBindLiftNo(staNo); + if(liftNo == null) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭鎵惧埌鍖归厤鐨勬彁鍗囨満", wrkMast.getWrkNo()); + return false; + } + //鐢宠鎻愬崌鏈鸿祫婧� + boolean applyForkLift = forkLiftAction.applyForkLift(liftSta.getLiftNo(), wrkMast.getWrkNo()); + if(!applyForkLift) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀敵璇锋彁鍗囨満璧勬簮澶辫触锛岀姝㈡墽琛屽嚭搴�", wrkMast.getWrkNo()); + return false; + } + return false; + } + + ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo); if (forkLiftThread == null) { return false; } @@ -828,15 +861,6 @@ return false; } - //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟 - WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(wrkMast.getLiftNo()); - if (liftWrkMast != null) { - if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//鎻愬崌鏈轰换鍔″拰褰撳墠浠诲姟涓嶇浉鍚� - News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), wrkMast.getLiftNo()); - return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇� - } - } - //璇锋眰涓婄骇绯荤粺锛屾槸鍚﹀厑璁稿嚭搴� boolean outMission = ForkLiftUtils.queryOutMission(wrkMast.getStaNo()); if (!outMission) { @@ -852,7 +876,7 @@ //鎻愪氦鍒扮嚎绋嬪幓宸ヤ綔 LiftAssignCommand assignCommand = new LiftAssignCommand(); assignCommand.setCommands(commands); - assignCommand.setLiftNo(wrkMast.getLiftNo().shortValue()); + assignCommand.setLiftNo(liftNo.shortValue()); assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); assignCommand.setTaskMode(ForkLiftTaskModeType.PICK_PUT.id.shortValue()); @@ -899,18 +923,27 @@ wrkMast.setWrkSts(WrkStsType.COMPLETE_OUTBOUND.sts); wrkMast.setLiftNo(null);//閲婃斁鎻愬崌鏈� forkLiftThread.setSyncTaskNo(0); + redisUtil.set(RedisKeyType.FORK_LIFT_PUT_COMPLETE.key + forkLiftProtocol.getLiftNo(), wrkMast.getWmsWrkNo(), 60 * 3); } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_LIFT_RUN.sts) { //306.鎻愬崌鏈烘惉杩愪腑 ==> 307.鎻愬崌鏈烘惉杩愬畬鎴� wrkMast.setWrkSts(WrkStsType.MOVE_LIFT_RUN_COMPLETE.sts); forkLiftThread.setSyncTaskNo(0); } - wrkMast.setModiTime(new Date()); if (wrkMastService.updateById(wrkMast)) { forkLiftThread.reset(); News.info("鎻愬崌鏈哄凡纭涓斾换鍔″畬鎴愮姸鎬併�傛彁鍗囨満鍙�={}", forkLiftProtocol.getLiftNo()); } else { News.error("鎻愬崌鏈哄凡纭涓斾换鍔″畬鎴愮姸鎬�,澶嶄綅澶辫触锛屼絾鏈壘鍒板伐浣滄。銆傛彁鍗囨満鍙�={}锛屽伐浣滃彿={}", forkLiftProtocol.getLiftNo(), forkLiftProtocol.getWrkNo()); + } + }else { + boolean checkPreviewDispatchForkLift = commonService.checkWorkNoContainMk(forkLiftProtocol.getWrkNo(), WrkIoType.FORKLIFT_MOVE.id); + if (checkPreviewDispatchForkLift) { + //灞炰簬鎻愬崌鏈洪璋冨害绉诲姩浠诲姟 + //鏃犲伐浣滄。鏀拺锛岀洿鎺ョ‘璁ゅ畬鎴� + forkLiftThread.setSyncTaskNo(0); + forkLiftThread.reset(); + News.info("宸茬‘璁ゆ彁鍗囨満棰勮皟搴︾Щ鍔ㄤ换鍔°�傛彁鍗囨満鍙�={}", forkLiftProtocol.getLiftNo()); } } } @@ -1082,6 +1115,12 @@ */ public synchronized void loopShuttleCharge() { try { + + List<BasShuttleCharge> charges = basShuttleChargeService.selectList(new EntityWrapper<BasShuttleCharge>().orderBy("charge_id", true)); + if (charges.isEmpty()) { + return;//鏃犲厖鐢垫々 + } + for (ShuttleSlave shuttle : slaveProperties.getShuttle()) { //鑾峰彇鍥涘悜绌挎杞︾嚎绋� ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId()); @@ -1102,17 +1141,21 @@ //灏忚溅鎵�鍦ㄦゼ灞� int lev = Utils.getLev(shuttleProtocol.getCurrentLocNo()); - ShuttleChargeType shuttleCharge = null; + BasShuttleCharge shuttleCharge = null; //鎼滅储灏忚溅鎵�鍦ㄦゼ灞傛湁娌℃湁鍏呯數妗� - for (ShuttleChargeType chargeType : ShuttleChargeType.values()) { - if (lev != Utils.getLev(chargeType.locNo)) { + for (BasShuttleCharge charge : charges) { + if (lev != Utils.getLev(charge.getLocNo())) { continue;//灏忚溅鍜屽厖鐢垫々涓嶅湪鍚屼竴灞� } + if (charge.getStatus() == 0) { + continue;//鍏呯數妗╄绂佺敤 + } + //灏忚溅鍜屽厖鐢垫々鍦ㄥ悓涓�灞� - if (wrkMastService.selectChargeWorkingByChargeSta(chargeType.id) == null) { - shuttleCharge = chargeType; + if (wrkMastService.selectChargeWorkingByChargeSta(charge.getChargeId()) == null) { + shuttleCharge = charge; break; } } @@ -1120,17 +1163,22 @@ if (shuttleCharge == null) { //鍚屾ゼ灞傛病鏈夋壘鍒板厖鐢垫々锛屾壘鍙敤鍏呯數妗� //灏忚溅鍚屾ゼ灞傛病鏈夊厖鐢垫々锛屽彧瑕佸厖鐢垫々鍙敤灏辩敓鎴愬厖鐢典换鍔� - for (ShuttleChargeType chargeType : ShuttleChargeType.values()) { - if (wrkMastService.selectChargeWorkingByChargeSta(chargeType.id) == null) { - //鍒ゆ柇褰撳墠鍏呯數妗╂ゼ灞傛槸鍚︽湁灏忚溅锛屽鏈夊皬杞︼紝涓嶅垎閰嶈鍏呯數妗� - int chargeLev = Utils.getLev(chargeType.locNo);//鍏呯數妗╂ゼ灞� - boolean checkLevHasShuttle = Utils.checkLevHasShuttle(chargeLev);//妫�娴嬫ゼ灞傛槸鍚︽湁绌挎杞� - if (checkLevHasShuttle) { - //褰撳墠鍏呯數妗╂ゼ灞傛湁绌挎杞︼紝涓嶅垎閰嶈鍏呯數妗� + for (BasShuttleCharge charge : charges) { + if (wrkMastService.selectChargeWorkingByChargeSta(charge.getChargeId()) == null) { + //鍒ゆ柇褰撳墠鍏呯數妗╂槸鍚︽湁灏忚溅锛屽鏈夊皬杞︼紝涓嶅垎閰嶈鍏呯數妗� + ArrayList<String> locs = new ArrayList<>(); + locs.add(charge.getLocNo()); + Integer checkHasShuttle = Utils.checkGroupLocHasShuttle(locs); + if(checkHasShuttle != null) { + //褰撳墠鍏呯數妗╂湁绌挎杞︼紝涓嶅垎閰嶈鍏呯數妗� continue; } - shuttleCharge = chargeType; + if (charge.getStatus() == 0) { + continue;//鍏呯數妗╄绂佺敤 + } + + shuttleCharge = charge; break; } } @@ -1140,9 +1188,9 @@ continue; } - String chargeLocNo = shuttleCharge.locNo; + String chargeLocNo = shuttleCharge.getLocNo(); wrkMast = new WrkMast(); - wrkMast.setMk(String.valueOf(shuttleCharge.id)); + wrkMast.setMk(String.valueOf(shuttleCharge.getChargeId())); wrkMast.setWrkNo(commonService.getWorkNo(WrkIoType.SHUTTLE_CHARGE.id)); wrkMast.setWrkSts(WrkStsType.NEW_CHARGE.sts); wrkMast.setIoType(WrkIoType.SHUTTLE_CHARGE.id);//300.鍏呯數 @@ -1261,7 +1309,7 @@ return false; } - if (!shuttleProtocol.getCurrentLocNo().equals(wrkMast.getLocNo())) { + if (!wrkMast.getLocNo().equals(shuttleProtocol.getCurrentLocNo())) { return false; } @@ -1357,13 +1405,22 @@ return false; } - ShuttleChargeType chargeType = ShuttleChargeType.get(Integer.parseInt(wrkMast.getMk())); - if(chargeType == null) { + BasShuttleCharge basShuttleCharge = basShuttleChargeService.selectOne(new EntityWrapper<BasShuttleCharge>().eq("charge_id", wrkMast.getMk())); + if(basShuttleCharge == null) { + return false; + } + + //妫�娴嬮殰纰嶇墿杞� + boolean checkObstacle = shuttleOperaUtils.checkObstacle(basShuttleCharge.getWaitLocNo(), new ArrayList<Integer>() {{ + add(shuttleProtocol.getShuttleNo()); + }}); + if (checkObstacle) { + News.info("{}浠诲姟锛岄伩闅滆寖鍥存湁灏忚溅锛岀瓑寰呴殰纰嶅皬杞﹁皟绂讳腑", wrkMast.getWrkNo()); return false; } //璋冨害灏忚溅鍘诲緟鏈轰綅 - boolean dispatched = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), chargeType.waitLocNo, wrkMast.getShuttleNo()); + boolean dispatched = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), basShuttleCharge.getWaitLocNo(), wrkMast.getShuttleNo()); if (!dispatched) { return false; } @@ -1456,11 +1513,40 @@ return false;//鎵句笉鍒扮珯鐐� } - //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟(璇ヤ换鍔¢渶瑕佹崲灞傚繀椤绘彁鍓嶇嫭鍗犳彁鍗囨満) - WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(liftSta.getLiftNo()); - if (liftWrkMast != null) { - News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), liftSta.getLiftNo()); - return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇� + if (liftSta.getHasTray()) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾簮绔欏瓨鍦ㄦ墭鐩�", wrkMast.getWrkNo()); + return false; + } + + if (liftSta.getHasCar()) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾簮绔欏瓨鍦ㄥ皬杞�", wrkMast.getWrkNo()); + return false; + } + + //鑾峰彇鐩爣杈撻�佺珯 + ForkLiftStaProtocol liftStaTarget = ForkLiftUtils.getLiftStaByStaNo(wrkMast.getStaNo()); + if (liftStaTarget == null) { + return false;//鎵句笉鍒扮珯鐐� + } + + if (liftStaTarget.getHasTray()) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀洰鏍囩珯瀛樺湪鎵樼洏", wrkMast.getWrkNo()); + return false; + } + + if (liftStaTarget.getHasCar()) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀洰鏍囩珯瀛樺湪灏忚溅", wrkMast.getWrkNo()); + return false; + } + + if (wrkMast.getLiftNo() == null) { + //鐢宠鎻愬崌鏈鸿祫婧�(璇ヤ换鍔¢渶瑕佹崲灞傚繀椤绘彁鍓嶇嫭鍗犳彁鍗囨満) + boolean applyForkLift = forkLiftAction.applyForkLift(liftSta.getLiftNo(), wrkMast.getWrkNo()); + if(!applyForkLift) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛岀敵璇锋彁鍗囨満璧勬簮澶辫触锛岀姝㈢Щ鍔ㄨ嚦绔欑偣", wrkMast.getWrkNo()); + return false; + } + return false; } //*************灏濊瘯閿佸畾鐩爣绔欒矾寰�*************** @@ -1501,9 +1587,7 @@ wrkMast.setWrkSts(WrkStsType.MOVE_SITE.sts);//灏忚溅绉诲姩鍒版彁鍗囨満涓� 301.鐢熸垚灏忚溅绉诲簱浠诲姟 ==> 302.灏忚溅绉诲姩鑷崇珯鐐� wrkMast.setModiTime(now); - wrkMast.setLiftNo(liftSta.getLiftNo());//鎻愬墠閿佸畾鎻愬崌鏈� wrkMast.setSystemMsg("");//娓呯┖娑堟伅 -// shuttleProtocol.setToken(wrkMast.getWrkNo());//鐙崰璇ュ皬杞︿护鐗� if (wrkMastService.updateById(wrkMast)) { //涓嬪彂浠诲姟 shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand); @@ -1538,14 +1622,6 @@ if (!forkLiftThread.isIdle()) { News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満蹇欑涓紝绂佹娲惧彂", wrkMast.getWrkNo(), wrkMast.getLiftNo()); return false; - } - //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟 - WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(wrkMast.getLiftNo()); - if (liftWrkMast != null) { - if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//鎻愬崌鏈轰换鍔″拰褰撳墠浠诲姟涓嶇浉鍚� - News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), wrkMast.getLiftNo()); - return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇� - } } //鑾峰彇婧愮珯 @@ -1687,6 +1763,10 @@ List<ShuttleCommand> commands = null; //璺ㄦゼ灞傜Щ鍔ㄤ换鍔� if (Utils.getLev(wrkMast.getSourceLocNo()) != Utils.getLev(wrkMast.getLocNo())) { + if (Utils.getLev(shuttleProtocol.getCurrentLocNo()) != Utils.getLev(wrkMast.getLocNo())) { + return false;//灏忚溅鏈埌杈剧洰鏍囧眰 + } + //闇�瑕佸皢鍓嶄袱涓妭鐐逛綔涓虹櫧鍚嶅崟鑺傜偣浼犲叆 List<NavigateNode> targetNodes = ForkLiftUtils.getLiftStaNodes(wrkMast.getStaNo()); if (targetNodes == null) { @@ -1737,9 +1817,19 @@ continue; } + List<Integer> liftAllStaNo = ForkLiftUtils.getLiftAllStaNo(liftNo); + if (liftAllStaNo.isEmpty()) { + continue; + } + + List<Integer> conveyorBindLiftAllStaNo = ForkLiftUtils.getConveyorBindLiftAllStaNo(liftNo); + if (conveyorBindLiftAllStaNo.isEmpty()) { + continue; + } + //鑾峰彇鍏ュ簱浠诲姟 List<WrkMast> inWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() - .eq("lift_no", liftNo) + .in("sta_no", liftAllStaNo) .in("wrk_sts" , WrkStsType.NEW_INBOUND.sts , WrkStsType.INBOUND_DEVICE_RUN.sts @@ -1751,7 +1841,7 @@ //鑾峰彇鍑哄簱浠诲姟 List<WrkMast> outWrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() - .eq("lift_no", liftNo) + .in("sta_no", conveyorBindLiftAllStaNo) .in("wrk_sts" , WrkStsType.NEW_OUTBOUND.sts , WrkStsType.OUTBOUND_SHUTTLE_RUN.sts @@ -1783,4 +1873,89 @@ } } + //鍑哄簱浠诲姟棰勮皟搴︽彁鍗囨満 + public void outTaskPreviewDispatchForkLift() { + List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() + .in("wrk_sts" + , WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts + )); + for (WrkMast wrkMast : wrkMasts) { + if(wrkMast.getShuttleNo() == null){ + continue; + } + + //鑾峰彇鍥涘悜绌挎杞︾嚎绋� + ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo()); + if (shuttleThread == null) { + continue; + } + + ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); + if (shuttleProtocol == null) { + continue; + } + + if(shuttleProtocol.getCurrentLocNo() == null){ + continue; + } + + //閫氳繃杈撻�佺嚎绔欏彿鑾峰彇鎻愬崌鏈哄彿 + Integer liftNo = ForkLiftUtils.getConveyorBindLiftNo(wrkMast.getStaNo()); + if (liftNo == null) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾湭鎵惧埌鍖归厤鐨勬彁鍗囨満", wrkMast.getWrkNo()); + continue; + } + + ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo); + if (forkLiftThread == null) { + continue; + } + + ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus(); + if (forkLiftProtocol == null) { + continue; + } + + //瀛樺湪璋冨害閿� + Object object = redisUtil.get(RedisKeyType.OUT_TASK_PREVIEW_DISPATCH_FORKLIFT.key + forkLiftProtocol.getLiftNo()); + if (object != null) { + continue; + } + + //鐢宠鎻愬崌鏈鸿祫婧� + boolean applyForkLift = forkLiftAction.applyForkLift(liftNo, null); + if(!applyForkLift) { + continue;//鎻愬崌鏈哄凡琚粦瀹氾紝涓嶅啀鎵ц棰勮皟搴︿换鍔� + } + + if (!forkLiftThread.isIdle()) { + continue; + } + + //鎻愬崌鏈轰笉鍦ㄥ嚭搴撳眰 + if (forkLiftProtocol.getLev().equals(Utils.getLev(wrkMast.getSourceLocNo()))) { + continue; + } + + //绉诲姩 + int workNo = commonService.getWorkNo(WrkIoType.FORKLIFT_MOVE.id);//鑾峰彇浠诲姟鍙� + + //鑾峰彇鎻愬崌鏈哄懡浠� + List<ForkLiftCommand> liftCommand = forkLiftThread.getMoveCommand(workNo, forkLiftProtocol.getLev(), Utils.getLev(wrkMast.getSourceLocNo())); + ArrayList<ForkLiftCommand> commands = new ArrayList<>(); + commands.addAll(liftCommand); + + //鎻愪氦鍒扮嚎绋嬪幓宸ヤ綔 + LiftAssignCommand assignCommand = new LiftAssignCommand(); + assignCommand.setCommands(commands); + assignCommand.setLiftNo(forkLiftProtocol.getLiftNo().shortValue()); + assignCommand.setTaskNo((short) workNo); + assignCommand.setTaskMode(ForkLiftTaskModeType.MOVE.id.shortValue()); + + forkLiftAction.assignWork(forkLiftProtocol.getLiftNo(), assignCommand); + + redisUtil.set(RedisKeyType.OUT_TASK_PREVIEW_DISPATCH_FORKLIFT.key + forkLiftProtocol.getLiftNo(), "lock", 30);//30绉掍笉鍐嶈皟搴� + } + } + } -- Gitblit v1.9.1