From a5fd6b72f8342f0228321849b04c822feba2d2a0 Mon Sep 17 00:00:00 2001 From: taisheng <taisheng@qq.com> Date: 星期三, 02 七月 2025 09:42:42 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/shuttle_rcs' into shuttle_rcs --- src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java | 3 src/main/java/com/zy/asrs/controller/ConsoleController.java | 63 +++++++ src/main/java/com/zy/core/enums/WrkStsType.java | 4 src/main/java/com/zy/asrs/service/WrkMastService.java | 6 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | 239 +++++++++++++++++------------ src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java | 10 src/main/webapp/views/console.html | 25 +++ src/main/java/com/zy/common/utils/NavigateUtils.java | 49 ++++++ src/main/java/com/zy/asrs/mapper/WrkMastMapper.java | 6 src/main/java/com/zy/core/action/ForkLiftAction.java | 32 ++++ src/main/resources/mapper/WrkMastMapper.xml | 8 11 files changed, 323 insertions(+), 122 deletions(-) diff --git a/src/main/java/com/zy/asrs/controller/ConsoleController.java b/src/main/java/com/zy/asrs/controller/ConsoleController.java index a7beef5..821fb46 100644 --- a/src/main/java/com/zy/asrs/controller/ConsoleController.java +++ b/src/main/java/com/zy/asrs/controller/ConsoleController.java @@ -7,17 +7,26 @@ import com.core.common.R; import com.zy.asrs.domain.param.SystemSwitchParam; import com.zy.asrs.entity.BasMap; +import com.zy.asrs.entity.WrkMast; import com.zy.asrs.service.BasMapService; +import com.zy.asrs.service.WrkMastService; import com.zy.common.model.MapNode; import com.zy.common.model.enums.NavigationMapType; import com.zy.common.utils.NavigateMapData; import com.zy.common.utils.RedisUtil; +import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.RedisKeyType; +import com.zy.core.enums.SlaveType; +import com.zy.core.model.ForkLiftSlave; +import com.zy.core.model.ShuttleSlave; +import com.zy.core.model.protocol.ForkLiftProtocol; +import com.zy.core.model.protocol.ShuttleProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.properties.SystemProperties; +import com.zy.core.thread.ForkLiftThread; +import com.zy.core.thread.ShuttleThread; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @@ -33,15 +42,15 @@ public class ConsoleController { @Autowired - private SlaveProperties slaveProperties; - @Autowired private BasMapService basMapService; @Autowired private RedisUtil redisUtil; - @Value("${super.pwd}") - private String superPwd; @Autowired private NavigateMapData navigateMapData; + @Autowired + private WrkMastService wrkMastService; + @Autowired + private SlaveProperties slaveProperties; @PostMapping("/system/running/status") @ManagerAuth(memo = "绯荤粺杩愯鐘舵��") @@ -122,4 +131,48 @@ return R.ok(); } + /** + * 浠诲姟妫�娴� + */ + @GetMapping("/checkTask") + @ManagerAuth(memo = "浠诲姟妫�娴�") + public R checkTask() { + List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<>()); + if (!wrkMasts.isEmpty()) { + return R.error("瀛樺湪鏈粨鏉熶换鍔�"); + } + + for (ShuttleSlave slave : slaveProperties.getShuttle()) { + ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, slave.getId()); + if (shuttleThread == null) { + continue; + } + ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); + if (shuttleProtocol == null) { + continue; + } + + if (shuttleProtocol.getTaskNo() > 0) { + return R.error(slave.getId() + "鍙峰皬杞﹀瓨鍦ㄥ伐浣滃彿"); + } + } + + for (ForkLiftSlave slave : slaveProperties.getForkLift()) { + ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, slave.getId()); + if (forkLiftThread == null) { + continue; + } + ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus(); + if (forkLiftProtocol == null) { + continue; + } + + if (forkLiftProtocol.getTaskNo() > 0) { + return R.error(slave.getId() + "鍙疯揣鍙夋彁鍗囨満瀛樺湪宸ヤ綔鍙�"); + } + } + + return R.ok(); + } + } diff --git a/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java b/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java index 9dd9c7e..983cb84 100644 --- a/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java +++ b/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java @@ -28,14 +28,14 @@ List<WrkMast> selectBy2125(); - //鏌ヨ鎸囧畾妤煎眰寰呭垎閰嶈溅杈嗙殑浠诲姟 - List<WrkMast> selectNoShuttleWrkByLev(String lev); + //鏌ヨ鎸囧畾妤煎眰浠诲姟 + List<WrkMast> selectWrkByLev(String lev); List<WrkMast> selectShuttleWrkByLev(String lev); List<WrkMast> selectShuttleOutWrkByLev(String lev); - WrkMast selectLiftWrkMast(Integer liftNo); + List<WrkMast> selectLiftWrkMast(Integer liftNo); List<WrkMast> selectLocToLocWrkMast();//鏌ヨ搴撲綅绉昏浆宸ヤ綔妗� diff --git a/src/main/java/com/zy/asrs/service/WrkMastService.java b/src/main/java/com/zy/asrs/service/WrkMastService.java index f9f57f2..9f0081a 100644 --- a/src/main/java/com/zy/asrs/service/WrkMastService.java +++ b/src/main/java/com/zy/asrs/service/WrkMastService.java @@ -11,8 +11,8 @@ Boolean judgeInbound(WrkMast wrkMast); - //鏌ヨ鎸囧畾妤煎眰寰呭垎閰嶈溅杈嗙殑浠诲姟 - List<WrkMast> selectNoShuttleWrkByLev(Integer lev); + //鏌ヨ鎸囧畾妤煎眰浠诲姟 + List<WrkMast> selectWrkByLev(Integer lev); //鏌ヨ鎸囧畾妤煎眰宸插垎閰嶈溅杈嗙殑浠诲姟 List<WrkMast> selectShuttleWrkByLev(Integer lev); @@ -32,6 +32,6 @@ List<WrkMast> selectShuttleMoveWrk(); - WrkMast selectLiftWrkMast(Integer liftNo); + List<WrkMast> selectLiftWrkMast(Integer liftNo); } 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 c21959d..e6ccc5e 100644 --- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java +++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java @@ -444,9 +444,13 @@ //102.灏忚溅鎼繍涓� ==> 103.灏忚溅鎼繍瀹屾垚 wrkMast.setWrkSts(WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts); shuttleThread.setSyncTaskNo(0); - } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_SITE.sts) { - //302.灏忚溅绉诲姩鑷崇珯鐐� ==> 303.灏忚溅绉诲姩鑷崇珯鐐瑰畬鎴� - wrkMast.setWrkSts(WrkStsType.MOVE_SITE_COMPLETE.sts); + } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_NEARBY.sts) { + //302.灏忚溅绉诲姩鑷宠繎鐐逛腑 ==> 303.灏忚溅绉诲姩鑷宠繎鐐瑰畬鎴� + wrkMast.setWrkSts(WrkStsType.MOVE_NEARBY_COMPLETE.sts); + shuttleThread.setSyncTaskNo(0); + } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_IN_LIFT.sts) { + //304.灏忚溅杩佸叆鎻愬崌鏈轰腑 ==> 305.灏忚溅杩佸叆鎻愬崌鏈哄畬鎴� + wrkMast.setWrkSts(WrkStsType.MOVE_IN_LIFT_COMPLETE.sts); shuttleThread.setSyncTaskNo(0); } else if (wrkMast.getWrkSts() == WrkStsType.MOVE_OUT_LIFT.sts) { //308.灏忚溅杩佸嚭鎻愬崌鏈轰腑 ==> 309.灏忚溅杩佸嚭鎻愬崌鏈哄畬鎴� @@ -681,6 +685,14 @@ 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); @@ -700,15 +712,6 @@ if (!forkLiftProtocol.getIOModeType().equals(ForkLiftIoModeType.IN)) { News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾彁鍗囨満涓嶅浜庡叆搴撴ā寮忥紝绂佹鍏ュ簱", wrkMast.getWrkNo()); 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;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇� - } } //妫�娴嬫ゼ灞傛槸鍚︽湁鍙敤绌挎杞� @@ -754,7 +757,6 @@ assignCommand.setTaskMode(ForkLiftTaskModeType.PICK_PUT.id.shortValue()); wrkMast.setWrkSts(WrkStsType.INBOUND_LIFT_RUN.sts);//鎻愬崌鏈烘惉杩愪腑 1.鐢熸垚鍏ュ簱浠诲姟 ==> 3.鎻愬崌鏈烘惉杩愪腑 - wrkMast.setLiftNo(liftNo); wrkMast.setSystemMsg("");//娓呯┖娑堟伅 wrkMast.setModiTime(now); if (wrkMastService.updateById(wrkMast)) { @@ -835,6 +837,13 @@ 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); @@ -854,15 +863,6 @@ if (!forkLiftProtocol.getIOModeType().equals(ForkLiftIoModeType.OUT)) { News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屾彁鍗囨満涓嶅浜庡嚭搴撴ā寮忥紝绂佹鍑哄簱", wrkMast.getWrkNo()); 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;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇� - } } //璇锋眰涓婄骇绯荤粺锛屾槸鍚﹀厑璁稿嚭搴� @@ -885,7 +885,6 @@ assignCommand.setTaskMode(ForkLiftTaskModeType.PICK_PUT.id.shortValue()); wrkMast.setWrkSts(WrkStsType.OUTBOUND_LIFT_RUN.sts);//鎻愬崌鏈烘惉杩愪腑 103.鐢熸垚鍏ュ簱浠诲姟 ==> 104.鎻愬崌鏈烘惉杩愪腑 - wrkMast.setLiftNo(liftNo); wrkMast.setShuttleNo(null);//閲婃斁灏忚溅 wrkMast.setSystemMsg("");//娓呯┖娑堟伅 wrkMast.setModiTime(new Date()); @@ -1448,8 +1447,13 @@ //鏌ヨ灏忚溅绉诲簱浠诲姟 List<WrkMast> wrkMasts = wrkMastService.selectShuttleMoveWrk(); for (WrkMast wrkMast : wrkMasts) { - boolean stepMoveSta = this.shuttleMoveExecuteStepMoveSta(wrkMast);//灏忚溅绉诲姩鍒扮珯鐐� - if (!stepMoveSta) { + boolean stepMoveNearby = this.shuttleMoveExecuteStepMoveNearby(wrkMast);//灏忚溅绉诲姩鍒拌繎鐐� + if (!stepMoveNearby) { + continue; + } + + boolean stepMoveInLift = this.shuttleMoveExecuteStepMoveInLift(wrkMast);//灏忚溅杩佸叆鎻愬崌鏈轰腑 + if (!stepMoveInLift) { continue; } @@ -1475,15 +1479,15 @@ } /** - * 灏忚溅杩佺Щ-灏忚溅绉诲姩鍒扮珯鐐� + * 灏忚溅杩佺Щ-灏忚溅绉诲姩鍒拌繎鐐逛腑 * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue */ - private boolean shuttleMoveExecuteStepMoveSta(WrkMast wrkMast) { - //--------------------------------------灏忚溅绉诲姩鑷崇珯鐐�-----------------------------------------// + private boolean shuttleMoveExecuteStepMoveNearby(WrkMast wrkMast) { + //--------------------------------------灏忚溅绉诲姩鍒拌繎鐐逛腑-----------------------------------------// Date now = new Date(); - //灏忚溅绉诲姩鑷崇珯鐐� 301.鐢熸垚灏忚溅绉诲簱浠诲姟 ==> 302.灏忚溅绉诲姩鑷崇珯鐐逛腑 + //灏忚溅绉诲姩鍒拌繎鐐� 301.鐢熸垚灏忚溅绉诲簱浠诲姟 ==> 302.灏忚溅绉诲姩鑷崇珯鐐逛腑 if (wrkMast.getWrkSts() == WrkStsType.NEW_MOVE.sts) { //鑾峰彇鍥涘悜绌挎杞︾嚎绋� ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, wrkMast.getShuttleNo()); @@ -1544,38 +1548,111 @@ return false; } - if (wrkMast.getLiftNo() == null) { - //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟(璇ヤ换鍔¢渶瑕佹崲灞傚繀椤绘彁鍓嶇嫭鍗犳彁鍗囨満) - WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(liftSta.getLiftNo()); - if (liftWrkMast != null) { - News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}鍙锋彁鍗囨満锛屾彁鍗囨満瀛樺湪鏈畬鎴愪换鍔★紝绂佹娲惧彂", wrkMast.getWrkNo(), liftSta.getLiftNo()); - return false;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇� - } + ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); + assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙� + assignCommand.setTaskMode(ShuttleTaskModeType.MOVE_LOC_NO.id);//灏忚溅绉诲簱浠诲姟 + assignCommand.setTaskNo(wrkMast.getWrkNo());//浠诲姟鍙� + assignCommand.setAuto(true);//鑷姩妯″紡 - wrkMast.setModiTime(now); - wrkMast.setLiftNo(liftSta.getLiftNo());//鎻愬墠閿佸畾鎻愬崌鏈� - wrkMast.setSystemMsg("");//娓呯┖娑堟伅 - wrkMastService.updateById(wrkMast); + //璁$畻杩戠偣浣嶇疆 + String endLocation = navigateUtils.calcEndLocation(shuttleProtocol.getCurrentLocNo(), liftSta.getLocNo(), NavigationMapType.NORMAL.id, null, null, 1); + if (endLocation == null) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛屽皬杞﹁繎鐐逛綅缃绠楀け璐�", wrkMast.getWrkNo()); return false; } - //*************灏濊瘯閿佸畾鐩爣绔欒矾寰�*************** - List<NavigateNode> targetNodes = ForkLiftUtils.getLiftStaNodes(wrkMast.getStaNo()); - if (targetNodes == null) { - return false;//鏈幏鍙栧埌鑺傜偣 + //鑾峰彇灏忚溅鍒拌繎鐐硅璧板懡浠� + List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), endLocation, NavigationMapType.NORMAL.id, assignCommand, shuttleThread); + if (commands == null) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛岃矾寰勮绠楀け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); + return false;//璺緞瑙i攣澶辫触 } - boolean checkPathIsAvailable = navigateUtils.checkPathIsAvailable(targetNodes, shuttleProtocol.getShuttleNo(), Utils.getLev(wrkMast.getLocNo())); - if (!checkPathIsAvailable) { - News.info("{}浠诲姟锛寋}灏忚溅锛岀洰鏍囩珯鐐硅矾寰勮鍗犵敤锛岀姝㈡淳鍙�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); - return false;//妫�娴嬬洰鏍囩珯鐐硅矾寰勬槸鍚︽湭琚崰鐢� + + assignCommand.setCommands(commands); + + wrkMast.setWrkSts(WrkStsType.MOVE_NEARBY.sts);//灏忚溅绉诲姩鍒版彁鍗囨満涓� 301.鐢熸垚灏忚溅绉诲簱浠诲姟 ==> 302.灏忚溅绉诲姩鑷宠繎鐐逛腑 + wrkMast.setModiTime(now); + wrkMast.setSystemMsg("");//娓呯┖娑堟伅 + if (wrkMastService.updateById(wrkMast)) { + //涓嬪彂浠诲姟 + shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand); + notifyUtils.notify(String.valueOf(SlaveType.Shuttle), shuttleProtocol.getShuttleNo(), String.valueOf(wrkMast.getWrkNo()), wrkMast.getWmsWrkNo(), NotifyMsgType.SHUTTLE_MOVING); + //瑙﹀彂閫氱煡 + return false; } - //灏濊瘯閿佸畾鐩爣绔欒矾寰� - boolean result2 = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(wrkMast.getLocNo()), shuttleProtocol.getShuttleNo(), targetNodes, true);//鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢� - if (!result2) { - News.info("{}浠诲姟锛寋}灏忚溅锛岃矾寰勯攣瀹氬け璐ワ紝绂佹娲惧彂", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); - return false;//璺緞閿佸畾澶辫触 + return false; + } + return true; + } + + /** + * 灏忚溅杩佺Щ-灏忚溅杩佸叆鎻愬崌鏈轰腑 + * 濡傞渶涓绘柟娉曟墽琛宑ontinue锛岃杩斿洖false + * ps:杩斿洖鍊紅rue骞朵笉浠h〃璇ユ柟娉曟墽琛屾垚鍔燂紝杩斿洖鍊间粎鍋氭爣璁扮敤浜庝富鏂规硶鏄惁鎵цcontinue + */ + private boolean shuttleMoveExecuteStepMoveInLift(WrkMast wrkMast) { + //--------------------------------------灏忚溅杩佸叆鎻愬崌鏈轰腑-----------------------------------------// + Date now = new Date(); + + //灏忚溅杩佸叆鎻愬崌鏈� 303.灏忚溅绉诲姩鑷宠繎鐐瑰畬鎴� ==> 304.灏忚溅杩佸叆鎻愬崌鏈轰腑 + if (wrkMast.getWrkSts() == WrkStsType.MOVE_NEARBY_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; + } + + //灏忚溅澶勪簬绌洪棽鐘舵�� + if (!shuttleThread.isIdle()) { + News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛屽皬杞﹀繖纰屼腑", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); + return false; + } + + //鑾峰彇婧愯緭閫佺珯 + ForkLiftStaProtocol liftSta = ForkLiftUtils.getLiftStaByStaNo(wrkMast.getSourceStaNo()); + if (liftSta == null) { + 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; + } ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); assignCommand.setShuttleNo(shuttleProtocol.getShuttleNo()); // 鍥涘悜绌挎杞︾紪鍙� @@ -1583,19 +1660,16 @@ assignCommand.setTaskNo(wrkMast.getWrkNo());//浠诲姟鍙� assignCommand.setAuto(true);//鑷姩妯″紡 - //鑾峰彇灏忚溅鍒拌緭閫佺珯鐐硅璧板懡浠� + //鑾峰彇灏忚溅鍒版彁鍗囨満琛岃蛋鍛戒护 List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), liftSta.getLocNo(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread); if (commands == null) { News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛岃矾寰勮绠楀け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); - - //鎵�浣跨敤鐨勮矾寰勮繘琛岄攣瀹氱鐢� - navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(wrkMast.getLocNo()), shuttleProtocol.getShuttleNo(), targetNodes, false); return false;//璺緞瑙i攣澶辫触 } assignCommand.setCommands(commands); - wrkMast.setWrkSts(WrkStsType.MOVE_SITE.sts);//灏忚溅绉诲姩鍒版彁鍗囨満涓� 301.鐢熸垚灏忚溅绉诲簱浠诲姟 ==> 302.灏忚溅绉诲姩鑷崇珯鐐� + wrkMast.setWrkSts(WrkStsType.MOVE_IN_LIFT.sts);//303.灏忚溅绉诲姩鑷宠繎鐐瑰畬鎴� ==> 304.灏忚溅杩佸叆鎻愬崌鏈轰腑 wrkMast.setModiTime(now); wrkMast.setSystemMsg("");//娓呯┖娑堟伅 if (wrkMastService.updateById(wrkMast)) { @@ -1619,8 +1693,8 @@ //--------------------------------------鎻愬崌鏈烘惉杩愪腑-----------------------------------------// Date now = new Date(); - //鎻愬崌鏈烘惉杩愪腑 303.灏忚溅绉诲姩鑷崇珯鐐瑰畬鎴� ==> 306.鎻愬崌鏈烘惉杩愪腑 - if (wrkMast.getWrkSts() == WrkStsType.MOVE_SITE_COMPLETE.sts) { + //鎻愬崌鏈烘惉杩愪腑 305.灏忚溅杩佸叆鎻愬崌鏈哄畬鎴� ==> 306.鎻愬崌鏈烘惉杩愪腑 + if (wrkMast.getWrkSts() == WrkStsType.MOVE_IN_LIFT_COMPLETE.sts) { ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, wrkMast.getLiftNo()); if (forkLiftThread == null) { return false; @@ -1632,14 +1706,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;//褰撳墠鎻愬崌鏈哄瓨鍦ㄦ湭瀹屾垚浠诲姟锛岀瓑寰呬笅涓�娆¤疆璇� - } } //鑾峰彇婧愮珯 @@ -1668,7 +1734,7 @@ assignCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); assignCommand.setTaskMode(ForkLiftTaskModeType.SHUTTLE_SWITCH.id.shortValue()); - wrkMast.setWrkSts(WrkStsType.MOVE_LIFT_RUN.sts);//鎻愬崌鏈烘惉杩愪腑 303.灏忚溅绉诲姩鑷崇珯鐐瑰畬鎴� ==> 306.鎻愬崌鏈烘惉杩愪腑 + wrkMast.setWrkSts(WrkStsType.MOVE_LIFT_RUN.sts);//鎻愬崌鏈烘惉杩愪腑 305.灏忚溅杩佸叆鎻愬崌鏈哄畬鎴� ==> 306.鎻愬崌鏈烘惉杩愪腑 wrkMast.setSystemMsg("");//娓呯┖娑堟伅 wrkMast.setModiTime(now); if (wrkMastService.updateById(wrkMast)) { @@ -1778,30 +1844,8 @@ assignCommand.setSourceLocNo(shuttleProtocol.getCurrentLocNo());//婧愬簱浣� assignCommand.setLocNo(wrkMast.getLocNo());//鐩爣搴撲綅 - 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) { - return false;//鏈幏鍙栧埌鑺傜偣 - } - - //璁剧疆璁$畻鑺傜偣鐨勭櫧鍚嶅崟 - ArrayList<int[]> whiteList = new ArrayList<>();//璁剧疆璁$畻鑺傜偣鐨勭櫧鍚嶅崟 - for (NavigateNode node : targetNodes) { - whiteList.add(new int[]{node.getX(), node.getY()}); - } - commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.NORMAL.id, whiteList, assignCommand, shuttleThread); - }else { - //鑾峰彇灏忚溅鍒扮洰鏍囧簱浣嶅懡浠� - commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread); - } - + //鑾峰彇灏忚溅鍒扮洰鏍囧簱浣嶅懡浠� + List<ShuttleCommand> commands = shuttleOperaUtils.getStartToTargetCommands(shuttleProtocol.getCurrentLocNo(), wrkMast.getLocNo(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread); if (commands == null) { News.taskInfo(wrkMast.getWrkNo(), "{}浠诲姟锛寋}灏忚溅锛岃矾寰勮绠楀け璐�", wrkMast.getWrkNo(), shuttleProtocol.getShuttleNo()); return false;//璺緞璁$畻澶辫触 @@ -1813,7 +1857,6 @@ wrkMast.setLiftNo(null);//閲婃斁鎻愬崌鏈� wrkMast.setSystemMsg("");//娓呯┖娑堟伅 wrkMast.setModiTime(now); - if (wrkMastService.updateById(wrkMast)) { //涓嬪彂浠诲姟 shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand); @@ -1940,9 +1983,9 @@ continue; } - //鍒ゆ柇鎻愬崌鏈烘槸鍚︽湁鍏朵粬浠诲姟 - WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(wrkMast.getLiftNo()); - if (liftWrkMast != null) { + //鐢宠鎻愬崌鏈鸿祫婧� + boolean applyForkLift = forkLiftAction.applyForkLift(liftNo, null); + if(!applyForkLift) { continue;//鎻愬崌鏈哄凡琚粦瀹氾紝涓嶅啀鎵ц棰勮皟搴︿换鍔� } diff --git a/src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java index bed7f63..6280cd9 100644 --- a/src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java +++ b/src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java @@ -44,8 +44,8 @@ } @Override - public List<WrkMast> selectNoShuttleWrkByLev(Integer lev) { - return this.baseMapper.selectNoShuttleWrkByLev("%" + lev); + public List<WrkMast> selectWrkByLev(Integer lev) { + return this.baseMapper.selectWrkByLev("%" + lev); } @Override @@ -85,8 +85,8 @@ , WrkStsType.OUTBOUND_LIFT_RUN_COMPLETE.sts , WrkStsType.NEW_MOVE.sts - , WrkStsType.MOVE_SITE.sts - , WrkStsType.MOVE_SITE_COMPLETE.sts + , WrkStsType.MOVE_NEARBY.sts + , WrkStsType.MOVE_NEARBY_COMPLETE.sts , WrkStsType.MOVE_IN_LIFT.sts , WrkStsType.MOVE_IN_LIFT_COMPLETE.sts , WrkStsType.MOVE_LIFT_RUN.sts @@ -122,7 +122,7 @@ } @Override - public WrkMast selectLiftWrkMast(Integer liftNo) { + public List<WrkMast> selectLiftWrkMast(Integer liftNo) { return this.baseMapper.selectLiftWrkMast(liftNo); } } diff --git a/src/main/java/com/zy/common/utils/NavigateUtils.java b/src/main/java/com/zy/common/utils/NavigateUtils.java index bf19aa9..4074614 100644 --- a/src/main/java/com/zy/common/utils/NavigateUtils.java +++ b/src/main/java/com/zy/common/utils/NavigateUtils.java @@ -3,6 +3,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.core.common.SpringUtils; +import com.core.exception.CoolException; import com.zy.asrs.utils.Utils; import com.zy.common.model.MapNode; import com.zy.common.model.NavigateNode; @@ -187,6 +188,54 @@ return list; } + //璁$畻甯︽湯绔钀借矾寰� + public ArrayList<ArrayList<NavigateNode>> calcEndPath(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints, List<int[]> whites, int lastPathPart) { + //璁$畻璺緞 + List<NavigateNode> navigateNodes = calc(startPoint, endPoint, mapType, shuttlePoints, whites); + if (navigateNodes == null) { + News.error("{} dash {} can't find navigate path!", startPoint, endPoint); + return null; + } + + //鑾峰彇鍒嗘璺緞 + ArrayList<ArrayList<NavigateNode>> partList = this.getSectionPath(navigateNodes); + //鏍规嵁浼犲叆鐨勬湯绔钀借矾寰勶紝鎵惧埌鏈鐐逛綅 + int partResult = partList.size() - lastPathPart; + if (partResult == 0) {//璺緞鏁伴噺鐩稿悓鏃犻渶鍒嗗壊 + return partList; + } else if (partResult < 0) { + throw new CoolException("鍒嗘璺緞涓庢湯绔矾寰勬暟閲忚绠楀紓甯�"); + } + int pathIdx = partResult - 1; + ArrayList<ArrayList<NavigateNode>> filterList = new ArrayList<>(); + for (int i = 0; i <= pathIdx; i++) { + filterList.add(partList.get(i)); + } + return filterList; + } + + //璁$畻鏈娈佃惤鍦板潃 + public String calcEndLocation(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints, List<int[]> whites, int lastPathPart) { + ArrayList<ArrayList<NavigateNode>> endPath = calcEndPath(startPoint, endPoint, mapType, shuttlePoints, whites, lastPathPart); + if (endPath == null) { + return null; + } + + return findTargetLocation(endPath); + } + + public String findTargetLocation(List<NavigateNode> nodeList) { + ArrayList<ArrayList<NavigateNode>> sectionPath = this.getSectionPath(nodeList); + return findTargetLocation(sectionPath); + } + + public String findTargetLocation(ArrayList<ArrayList<NavigateNode>> partList) { + ArrayList<NavigateNode> nodes = partList.get(partList.size() - 1); + NavigateNode targetNode = nodes.get(nodes.size() - 1); + String locNo = NavigatePositionConvert.nodeToLocNo(targetNode); + return locNo; + } + //鍒ゆ柇褰撳墠鑺傜偣鍒颁笅涓�涓妭鐐规槸鍚︿负鎷愮偣 public HashMap<String,Object> searchInflectionPoint(NavigateNode currentNode, NavigateNode fatherNode, NavigateNode nextNode) { HashMap<String, Object> map = new HashMap<>(); diff --git a/src/main/java/com/zy/core/action/ForkLiftAction.java b/src/main/java/com/zy/core/action/ForkLiftAction.java index e7c6a4b..9d7a7b3 100644 --- a/src/main/java/com/zy/core/action/ForkLiftAction.java +++ b/src/main/java/com/zy/core/action/ForkLiftAction.java @@ -154,4 +154,36 @@ return response; } + //鐢宠鎻愬崌鏈鸿祫婧� + public synchronized boolean applyForkLift(Integer liftNo, Integer waitBindTaskNo) { + ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, liftNo); + if (forkLiftThread == null) { + return false; + } + ForkLiftProtocol forkLiftProtocol = forkLiftThread.getStatus(); + if (forkLiftProtocol == null) { + return false; + } + if (!forkLiftThread.isIdle()) { + return false; + } + + List<WrkMast> wrkMasts = wrkMastService.selectLiftWrkMast(liftNo); + if (!wrkMasts.isEmpty()) { + return false; + } + + if (waitBindTaskNo != null) { + WrkMast wrkMast = wrkMastService.selectByWorkNo(waitBindTaskNo); + if (wrkMast == null) { + return false; + } + + wrkMast.setLiftNo(liftNo); + wrkMast.setModiTime(new Date()); + wrkMastService.updateById(wrkMast); + } + return true; + } + } diff --git a/src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java b/src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java index 2600041..5e0d93c 100644 --- a/src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java +++ b/src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java @@ -168,7 +168,8 @@ //褰撳墠绌挎杞﹀簱浣嶅彿 String currentLocNo = shuttleProtocol.getCurrentLocNo(); int currentLev = Utils.getLev(currentLocNo); - List<WrkMast> wrkMasts1 = wrkMastService.selectNoShuttleWrkByLev(currentLev);//鍒ゆ柇褰撳墠绌挎杞︽ゼ灞傛槸鍚︽湁寰呭垎閰嶈溅杈嗙殑浠诲姟锛屽鏋滄湁鍒欎笉鍒嗛厤杩欒締杞� + //鍒ゆ柇褰撳墠妤煎眰鏄惁鏈変换鍔★紝濡傛灉鏈夊垯涓嶅垎閰嶈繖杈嗚溅 + List<WrkMast> wrkMasts1 = wrkMastService.selectWrkByLev(currentLev); int shuttleCount = this.getShuttleCountByLev(currentLev);//鑾峰彇绌挎杞︽ゼ灞傝溅杈嗘暟閲� if (!wrkMasts1.isEmpty() && shuttleCount <= 1) { //瀛樺湪鍏朵粬浠诲姟涓斿彲鐢ㄥ皬杞︽暟閲忓皬浜庣瓑浜�1锛岃烦杩囪繖杈嗚溅 diff --git a/src/main/java/com/zy/core/enums/WrkStsType.java b/src/main/java/com/zy/core/enums/WrkStsType.java index 79b53ae..5b45eda 100644 --- a/src/main/java/com/zy/core/enums/WrkStsType.java +++ b/src/main/java/com/zy/core/enums/WrkStsType.java @@ -29,8 +29,8 @@ COMPLETE_CHARGE(210, "鍏呯數浠诲姟瀹屾垚"), NEW_MOVE(301, "鐢熸垚杩佺Щ浠诲姟"), - MOVE_SITE(302, "灏忚溅绉诲姩鑷崇珯鐐�"), - MOVE_SITE_COMPLETE(303, "灏忚溅绉诲姩鑷崇珯鐐瑰畬鎴�"), + MOVE_NEARBY(302, "灏忚溅绉诲姩鑷宠繎鐐逛腑"), + MOVE_NEARBY_COMPLETE(303, "灏忚溅绉诲姩鑷宠繎鐐瑰畬鎴�"), MOVE_IN_LIFT(304, "灏忚溅杩佸叆鎻愬崌鏈轰腑"), MOVE_IN_LIFT_COMPLETE(305, "灏忚溅杩佸叆鎻愬崌鏈哄畬鎴�"), MOVE_LIFT_RUN(306, "鎻愬崌鏈烘惉杩愪腑"), diff --git a/src/main/resources/mapper/WrkMastMapper.xml b/src/main/resources/mapper/WrkMastMapper.xml index 727c376..424ef07 100644 --- a/src/main/resources/mapper/WrkMastMapper.xml +++ b/src/main/resources/mapper/WrkMastMapper.xml @@ -73,10 +73,10 @@ order by io_pri desc,wrk_sts desc </select> - <select id="selectNoShuttleWrkByLev" resultMap="BaseResultMap"> + <select id="selectWrkByLev" resultMap="BaseResultMap"> select * from asr_wrk_mast - where shuttle_no is null - and ((wrk_sts = 2 and loc_no like #{lev}) or (wrk_sts = 101 and source_loc_no like #{lev})) + where 1=1 + and ((loc_no like #{lev}) or (source_loc_no like #{lev})) order by io_pri desc,wrk_sts desc </select> @@ -97,8 +97,6 @@ <select id="selectLiftWrkMast" resultMap="BaseResultMap"> select * from asr_wrk_mast where lift_no = #{liftNo} - and wrk_sts not in (9,10,109,110,210,311,410) - limit 0,1 </select> <select id="selectLocToLocWrkMast" resultMap="BaseResultMap"> diff --git a/src/main/webapp/views/console.html b/src/main/webapp/views/console.html index 1da3dbe..8e4316f 100644 --- a/src/main/webapp/views/console.html +++ b/src/main/webapp/views/console.html @@ -78,6 +78,7 @@ <div> <!-- <el-button @click="testMove()">娴嬭瘯绉诲姩杞�</el-button>--> <el-button @click="resetMap()">閲嶇疆鍦板浘</el-button> + <el-button @click="checkTask()">浠诲姟妫�娴�</el-button> <!-- <el-button @click="initLoc()">鍒濆鍖栧簱浣�</el-button>--> </div> </div> @@ -664,6 +665,30 @@ } }) }, + checkTask() { + let that = this + $.ajax({ + url:baseUrl+"/console/checkTask", + headers:{ + 'token': localStorage.getItem('token') + }, + data:{}, + method:'get', + success:function (res) { + if (res.code === 200) { + that.$message({ + message: res.msg, + type: 'success' + }); + } else { + that.$message({ + message: res.msg, + type: 'error' + }); + } + } + }) + }, initLev(){ let that = this $.ajax({ -- Gitblit v1.9.1