From a4996f162b0ca63113f573e315e3ce4f5dce7ad3 Mon Sep 17 00:00:00 2001 From: Junjie <540245094@qq.com> Date: 星期三, 05 六月 2024 15:39:37 +0800 Subject: [PATCH] #算法优化 --- zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/action/ShuttleAction.java | 150 ++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 108 insertions(+), 42 deletions(-) diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/action/ShuttleAction.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/action/ShuttleAction.java index 8ce012d..1f1c557 100644 --- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/action/ShuttleAction.java +++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/action/ShuttleAction.java @@ -4,12 +4,15 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.zy.asrs.wcs.common.ExecuteSupport; import com.zy.asrs.wcs.core.entity.Loc; import com.zy.asrs.wcs.core.entity.Task; import com.zy.asrs.wcs.core.model.NavigateNode; import com.zy.asrs.wcs.core.model.command.ShuttleAssignCommand; import com.zy.asrs.wcs.core.model.command.ShuttleCommand; import com.zy.asrs.wcs.core.model.command.ShuttleRedisCommand; +import com.zy.asrs.wcs.core.model.enums.LocStsType; +import com.zy.asrs.wcs.core.model.enums.MotionCtgType; import com.zy.asrs.wcs.core.model.enums.ShuttleCommandModeType; import com.zy.asrs.wcs.core.model.enums.ShuttleTaskModeType; import com.zy.asrs.wcs.core.service.BasShuttleService; @@ -26,12 +29,12 @@ import com.zy.asrs.wcs.rcs.model.enums.SlaveType; import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol; import com.zy.asrs.wcs.rcs.thread.ShuttleThread; -import org.aspectj.apache.bcel.generic.RET; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; +import java.util.Objects; @Component public class ShuttleAction { @@ -110,16 +113,6 @@ if (shuttleProtocol == null) { return false; } - - //鍒ゆ柇璁惧鏄惁绌洪棽 - if (!shuttleThread.isDeviceIdle()) { - return false; - } -// if (!shuttleThread.isIdle(() -> { -// return shuttleProtocol.getTaskNo().equals(taskNo); -// })) { -// return false; -// } //鍒ゆ柇宸ヤ綔鍙锋槸鍚︾浉鍚� if (!shuttleProtocol.getTaskNo().equals(taskNo)) { @@ -223,6 +216,20 @@ //鍙栧嚭鍛戒护 ShuttleCommand command = commands.get(commandStep); + Integer mode = command.getMode(); + //鍒ゆ柇璁惧鏄惁绌洪棽 + if (!shuttleThread.isDeviceIdle(new ExecuteSupport() { + @Override + public Boolean judgement() { + if (ShuttleCommandModeType.CHARGE_CLOSE.id.equals(mode)) {//鍏抽棴鍏呯數motion + return false;//涓嶉渶瑕佸垽鏂姸鎬� + } + return true;//闇�瑕佸垽鏂姸鎬� + } + })) { + return false; + } + // 涓嬪彂鍛戒护 if (!write(command, device)) { News.error("鍥涘悜绌挎杞﹀懡浠や笅鍙戝け璐ワ紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command)); @@ -244,8 +251,7 @@ if (shuttleThread == null) { return; } - - ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); + ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(false); if (shuttleProtocol == null) { return; } @@ -275,35 +281,6 @@ } if (shuttleProtocol.getMoveType() == 0) {//璺戣建閬� - ArrayList<String> locs = new ArrayList<>(); - for (int i = shuttleProtocol.getXCurrent(); i <= shuttleProtocol.getXTarget(); i++) { - String locNo = Utils.getLocNo(i, shuttleProtocol.getYCurrent(), lev); - locs.add(locNo); - } - - List<Loc> locList = locService.list(new LambdaQueryWrapper<Loc>() - .in(Loc::getLocNo, locs)); - if (locList.isEmpty()) { - //绌哄簱浣� - shuttleProtocol.setYCurrent(shuttleProtocol.getYCurrent() + 1); - return; - } - - Loc start = locList.get(0); - Loc target = locList.get(locList.size() - 1); - //鍒ゆ柇灏忚溅鏄惁鍦ㄨ捣鐐逛綅缃� - if (!shuttleProtocol.getCurrentLocNo().equals(start.getLocNo())) {//涓嶅湪璧风偣浣嶇疆锛岃皟搴﹀幓璧风偣浣嶇疆 - shuttleDispatcher.generateMoveTask(device, start.getLocNo()); - }else { - //鍦ㄨ捣鐐逛綅缃紝璋冨害鍘荤洰鏍囦綅缃� - if (shuttleProtocol.getCurrentLocNo().equals(target.getLocNo())) { - shuttleProtocol.setYCurrent(shuttleProtocol.getYCurrent() + 1);//灏忚溅鍜岀洰鏍囦綅缃竴鑷达紝璺宠繃 - }else { - shuttleDispatcher.generateMoveTask(device, start.getLocNo()); - shuttleProtocol.setYCurrent(shuttleProtocol.getYCurrent() + 1); - } - } - } else if (shuttleProtocol.getMoveType() == 1) {//璺戝簱浣� Integer xCurrent = shuttleProtocol.getXCurrent(); if (xCurrent > shuttleProtocol.getXTarget()) {//褰揦鍊煎ぇ浜嶺鐩爣鍊硷紝杩涜褰掗浂涓擸鏂瑰悜+1 shuttleProtocol.setXCurrent(shuttleProtocol.getXStart()); @@ -332,6 +309,35 @@ } else { shuttleDispatcher.generateMoveTask(device, target.getLocNo()); shuttleProtocol.setXCurrent(shuttleProtocol.getXCurrent() + 1); + } + } else if (shuttleProtocol.getMoveType() == 1) {//璺戝簱浣� + ArrayList<String> locs = new ArrayList<>(); + for (int i = shuttleProtocol.getXCurrent(); i <= shuttleProtocol.getXTarget(); i++) { + String locNo = Utils.getLocNo(i, shuttleProtocol.getYCurrent(), lev); + locs.add(locNo); + } + + List<Loc> locList = locService.list(new LambdaQueryWrapper<Loc>() + .in(Loc::getLocNo, locs)); + if (locList.isEmpty()) { + //绌哄簱浣� + shuttleProtocol.setYCurrent(shuttleProtocol.getYCurrent() + 1); + return; + } + + Loc start = locList.get(0); + Loc target = locList.get(locList.size() - 1); + //鍒ゆ柇灏忚溅鏄惁鍦ㄨ捣鐐逛綅缃� + if (!shuttleProtocol.getCurrentLocNo().equals(start.getLocNo())) {//涓嶅湪璧风偣浣嶇疆锛岃皟搴﹀幓璧风偣浣嶇疆 + shuttleDispatcher.generateMoveTask(device, start.getLocNo()); + }else { + //鍦ㄨ捣鐐逛綅缃紝璋冨害鍘荤洰鏍囦綅缃� + if (shuttleProtocol.getCurrentLocNo().equals(target.getLocNo())) { + shuttleProtocol.setYCurrent(shuttleProtocol.getYCurrent() + 1);//灏忚溅鍜岀洰鏍囦綅缃竴鑷达紝璺宠繃 + }else { + shuttleDispatcher.generateMoveTask(device, start.getLocNo()); + shuttleProtocol.setYCurrent(shuttleProtocol.getYCurrent() + 1); + } } } else if (shuttleProtocol.getMoveType() == 2) {//姣嶈建閬撳惊鐜窇 Integer xCurrent = shuttleProtocol.getXCurrent(); @@ -377,6 +383,66 @@ } } } + } else if (shuttleProtocol.getMoveType() == 4) {//鍙栨斁璐� + Integer xCurrent = shuttleProtocol.getXCurrent(); + if (xCurrent > shuttleProtocol.getXTarget()) {//褰揦鍊煎ぇ浜嶺鐩爣鍊� + shuttleProtocol.setXCurrent(shuttleProtocol.getXStart()); + shuttleProtocol.setYCurrent(shuttleProtocol.getYStart()); + return; + } + + //鍒ゆ柇x杞磋揣浣嶆槸鍚︽斁婊� + boolean flag = true; + for (Loc loc : locService.list(new LambdaQueryWrapper<Loc>() + .eq(Loc::getHostId, device.getHostId()) + .eq(Loc::getRow, xCurrent) + .ge(Loc::getBay, shuttleProtocol.getYStart()) + .le(Loc::getBay, shuttleProtocol.getYTarget()))) { + if (loc.getLocSts() != LocStsType.F.val()) { + flag = false;//鏈弧 + break; + } + } + if (flag) { + shuttleProtocol.setXCurrent(shuttleProtocol.getXCurrent() + 1); + return; + } + + //鎼滅储鏈夎揣搴撲綅 + List<Loc> list = locService.list(new LambdaQueryWrapper<Loc>() + .eq(Loc::getLocSts, LocStsType.F.val()) + .eq(Loc::getHostId, device.getHostId()) + .notIn(Loc::getRow, xCurrent) + .eq(Loc::getStatus, 1)); + if (list.isEmpty()) { + return; + } + + Loc start = list.get(0); + + List<Loc> locList = locService.list(new LambdaQueryWrapper<Loc>() + .eq(Loc::getHostId, device.getHostId()) + .eq(Loc::getStatus, 1) + .eq(Loc::getLocSts, LocStsType.O.val()) + .eq(Loc::getRow, xCurrent) + .orderByDesc(Loc::getBay) + .orderByAsc(Loc::getRow)); + if (locList.isEmpty()) { + return; + } + + Loc target = locList.get(0); + if (target == null) { + return; + } + + //璋冨害鍘荤洰鏍囦綅缃� + if (!shuttleProtocol.getCurrentLocNo().equals(target.getLocNo())) { + Task task = shuttleDispatcher.generateManuaTakeMoveTask(device, start.getLocNo(), target.getLocNo()); +// if(task != null) {//璋冨害鎴愬姛 +// shuttleProtocol.setXCurrent(shuttleProtocol.getXCurrent() + 1); +// } + } } } -- Gitblit v1.9.1