From 411c7bcfb64581060c459d6a124b58cafadd983a Mon Sep 17 00:00:00 2001
From: Junjie <xjj@123>
Date: 星期四, 11 四月 2024 20:35:37 +0800
Subject: [PATCH] #
---
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/action/ShuttleAction.java | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 167 insertions(+), 6 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 0314e53..f3e2a32 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
@@ -2,15 +2,22 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.asrs.wcs.common.ExecuteSupport;
import com.zy.asrs.wcs.core.entity.BasShuttle;
+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.ShuttleCommandModeType;
+import com.zy.asrs.wcs.core.model.enums.ShuttleTaskModeType;
import com.zy.asrs.wcs.core.service.BasShuttleService;
+import com.zy.asrs.wcs.core.service.LocService;
import com.zy.asrs.wcs.core.utils.NavigateMapUtils;
import com.zy.asrs.wcs.core.utils.RedisUtil;
+import com.zy.asrs.wcs.core.utils.ShuttleDispatcher;
import com.zy.asrs.wcs.core.utils.Utils;
import com.zy.asrs.wcs.rcs.News;
import com.zy.asrs.wcs.rcs.cache.SlaveConnection;
@@ -23,6 +30,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+import java.util.ArrayList;
import java.util.List;
@Component
@@ -34,6 +42,10 @@
private NavigateMapUtils navigateMapUtils;
@Autowired
private BasShuttleService basShuttleService;
+ @Autowired
+ private LocService locService;
+ @Autowired
+ private ShuttleDispatcher shuttleDispatcher;
public synchronized boolean assignWork(Device device, ShuttleAssignCommand assignCommand) {
ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue());
@@ -54,12 +66,17 @@
redisCommand.setAssignCommand(assignCommand);//鍛戒护
//浠诲姟鏁版嵁淇濆瓨鍒皉edis
if (redisUtil.set(DeviceRedisConstant.SHUTTLE_WORK_FLAG + assignCommand.getTaskNo(), JSON.toJSONString(redisCommand))) {
- //涓嬪彂琛岄┒璺緞
- boolean result = shuttleThread.movePath(assignCommand.getNodes(), assignCommand.getTaskNo().intValue());
- if (!result) {
- return false;
+ if (assignCommand.getTaskMode() == ShuttleTaskModeType.PAK_IN.id
+ || assignCommand.getTaskMode() == ShuttleTaskModeType.PAK_OUT.id
+ || assignCommand.getTaskMode() == ShuttleTaskModeType.MOVE_LOC_NO.id
+ || assignCommand.getTaskMode() == ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO.id) {
+ //涓嬪彂琛岄┒璺緞
+ boolean result = shuttleThread.movePath(assignCommand.getNodes(), assignCommand.getTaskNo());
+ if (!result) {
+ return false;
+ }
}
- shuttleProtocol.setTaskNo(assignCommand.getTaskNo().intValue());
+ shuttleProtocol.setTaskNo(assignCommand.getTaskNo());
return true;
}
return false;
@@ -86,7 +103,9 @@
}
//鍒ゆ柇璁惧鏄惁绌洪棽
- if (!shuttleThread.isIdle()) {
+ if (!shuttleThread.isIdle(() -> {
+ return shuttleProtocol.getTaskNo().equals(taskNo);
+ })) {
return false;
}
@@ -195,6 +214,148 @@
return true;
}
+ //璺戝簱绋嬪簭
+ public synchronized void moveLoc(Device device) {
+ ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue());
+ if (shuttleThread == null) {
+ return;
+ }
+
+ ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+ if (shuttleProtocol == null) {
+ return;
+ }
+
+ //灏忚溅寮�鍚窇搴撴ā寮�
+ if (!shuttleProtocol.getMoveLoc()) {
+ return;
+ }
+
+ //灏忚溅绌洪棽
+ if (!shuttleThread.isIdle()) {
+ return;
+ }
+
+ int lev = Utils.getLev(shuttleProtocol.getCurrentLocNo());//灏忚溅褰撳墠妤煎眰
+ if (shuttleProtocol.getYCurrent() > shuttleProtocol.getYTarget()) {
+ //璺戝簱缁撴潫
+ shuttleProtocol.setMoveLoc(false);
+ shuttleProtocol.setMoveType(0);
+ shuttleProtocol.setXStart(0);
+ shuttleProtocol.setXTarget(0);
+ shuttleProtocol.setXCurrent(0);
+ shuttleProtocol.setYStart(0);
+ shuttleProtocol.setYTarget(0);
+ shuttleProtocol.setYCurrent(0);
+ return;
+ }
+
+ 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());
+ shuttleProtocol.setYCurrent(shuttleProtocol.getYCurrent() + 1);
+ return;
+ }
+
+ Integer yCurrent = shuttleProtocol.getYCurrent();
+ String locNo = Utils.getLocNo(xCurrent, yCurrent, lev);
+ Loc target = locService.getOne(new LambdaQueryWrapper<Loc>()
+ .eq(Loc::getLocNo, locNo)
+ .eq(Loc::getHostId, device.getHostId()));
+ if (target == null) {
+ shuttleProtocol.setXCurrent(shuttleProtocol.getXCurrent() + 1);
+ return;
+ }
+
+// if (!target.getLocSts().equals("O")) {
+// shuttleProtocol.setXCurrent(shuttleProtocol.getXCurrent() + 1);
+// return;
+// }
+
+ //璋冨害鍘荤洰鏍囦綅缃�
+ if (shuttleProtocol.getCurrentLocNo().equals(target.getLocNo())) {
+ shuttleProtocol.setXCurrent(shuttleProtocol.getXCurrent() + 1);//灏忚溅鍜岀洰鏍囦綅缃竴鑷达紝璺宠繃
+ } else {
+ shuttleDispatcher.generateMoveTask(device, target.getLocNo());
+ shuttleProtocol.setXCurrent(shuttleProtocol.getXCurrent() + 1);
+ }
+ } else if (shuttleProtocol.getMoveType() == 2) {//姣嶈建閬撳惊鐜窇
+ Integer xCurrent = shuttleProtocol.getXCurrent();
+ Integer yCurrent = shuttleProtocol.getYCurrent();
+
+ String locNo = Utils.getLocNo(xCurrent, yCurrent, lev);
+ //璋冨害鍘荤洰鏍囦綅缃�
+ if (shuttleProtocol.getCurrentLocNo().equals(locNo)) {
+ if (yCurrent.equals(shuttleProtocol.getYStart())) {
+ shuttleProtocol.setYCurrent(shuttleProtocol.getYTarget());//灏忚溅鍜岀洰鏍囦綅缃竴鑷达紝鍒囨崲搴撲綅
+ } else {
+ shuttleProtocol.setYCurrent(shuttleProtocol.getYStart());//灏忚溅鍜岀洰鏍囦綅缃竴鑷达紝鍒囨崲搴撲綅
+ }
+ } else {
+ Task result = shuttleDispatcher.generateMoveTask(device, locNo);
+ if (result != null) {//璋冨害鎴愬姛
+ if (yCurrent.equals(shuttleProtocol.getYStart())) {
+ shuttleProtocol.setYCurrent(shuttleProtocol.getYTarget());//鍒囨崲搴撲綅
+ } else {
+ shuttleProtocol.setYCurrent(shuttleProtocol.getYStart());//鍒囨崲搴撲綅
+ }
+ }
+ }
+ } else if (shuttleProtocol.getMoveType() == 3) {//瀛愯建閬撳惊鐜窇
+ Integer xCurrent = shuttleProtocol.getXCurrent();
+ Integer yCurrent = shuttleProtocol.getYCurrent();
+
+ String locNo = Utils.getLocNo(xCurrent, yCurrent, lev);
+ //璋冨害鍘荤洰鏍囦綅缃�
+ if (shuttleProtocol.getCurrentLocNo().equals(locNo)) {
+ if (xCurrent.equals(shuttleProtocol.getXStart())) {
+ shuttleProtocol.setXCurrent(shuttleProtocol.getXTarget());//灏忚溅鍜岀洰鏍囦綅缃竴鑷达紝鍒囨崲搴撲綅
+ } else {
+ shuttleProtocol.setXCurrent(shuttleProtocol.getXStart());//灏忚溅鍜岀洰鏍囦綅缃竴鑷达紝鍒囨崲搴撲綅
+ }
+ } else {
+ Task result = shuttleDispatcher.generateMoveTask(device, locNo);
+ if (result != null) {//璋冨害鎴愬姛
+ if (xCurrent.equals(shuttleProtocol.getXStart())) {
+ shuttleProtocol.setXCurrent(shuttleProtocol.getXTarget());//鍒囨崲搴撲綅
+ } else {
+ shuttleProtocol.setXCurrent(shuttleProtocol.getXStart());//鍒囨崲搴撲綅
+ }
+ }
+ }
+ }
+ }
+
private synchronized boolean write(ShuttleCommand command, Device device) {
if (null == command) {
News.error("鍥涘悜绌挎杞﹀啓鍏ュ懡浠や负绌�");
--
Gitblit v1.9.1