Compare commits

...

39 Commits

Author SHA1 Message Date
修宁 7d5c91ed42 库存的添加、删除 5 months ago
修宁 dbff3a3fdb 就地取货逻辑,当前车所在的位置,就是能取货的位置,就不要再跑去别的地方取货了 5 months ago
lizw-2015 d82c7ef7ac feat(inventory): 添加库存删除功能 5 months ago
lizw-2015 af74103021 build(yvan-lcc): 开启源码映射 5 months ago
lizw-2015 c32b95b334 feat(inventory): 增加环境筛选功能 5 months ago
修宁 c5118c2437 AGV ID 问题 5 months ago
修宁 9a3ef4fdfa 线程终端问题 5 months ago
修宁 d97b98f795 线程终端问题 5 months ago
修宁 d01b022d7d 台湾展会问题 5 months ago
修宁 6226a626fd noInv 取消记账 5 months ago
修宁 c97acb5e74 LoadHeight 5 months ago
修宁 3eceff1012 direction 5 months ago
yuliang d38cf730b8 Merge remote-tracking branch 'origin/jx-test' into jx-test 5 months ago
yuliang cb3a49aa14 嘉兴测试 5 months ago
修宁 1b68804430 PlanTaskSequence.option, loadHeight / unloadHeight 5 months ago
修宁 c17dca99fe PlanTaskSequence.option, loadHeight / unloadHeight 5 months ago
修宁 bb1430c419 PlanTaskSequence.option, loadHeight / unloadHeight 5 months ago
yuliang f3d30e5a0b Merge remote-tracking branch 'origin/jx-test' into jx-test 5 months ago
yuliang ccebcba935 嘉兴测试 5 months ago
修宁 ddc777795a FM600 5 months ago
修宁 b94f3eff1e getAgv 5 months ago
修宁 a5cdbdacd3 fm600 动画 5 months ago
修宁 06f89c5825 bracket 钢架 5 months ago
修宁 d57421a054 Merge remote-tracking branch 'origin/jx-test' into jx-test 5 months ago
修宁 106ee50ac6 10.10.9.58 5 months ago
yuliang 2539b03c71 嘉兴测试 5 months ago
lizw-2015 fb71586ebc fix(lcc): 修改 lcc location 路径 5 months ago
lizw-2015 3dbfca5814 build: 更新日志路径和应用工作目录 5 months ago
lizw-2015 767de465d0 feat: 添加日志配置 5 months ago
lizw-2015 58b9dc3e72 build: 更新环境配置 5 months ago
lizw-2015 e1843483f1 Merge remote-tracking branch 'origin/jx-test' into jx-test 5 months ago
lizw-2015 c63c78cc15 feat: 添加生产环境配置文件 5 months ago
yuliang 0331ed3de1 嘉兴测试 5 months ago
yuliang 7f8f7e7001 结构调整 5 months ago
修宁 88da2b2feb 嘉兴F1 测试楼层 5 months ago
yuliang 9e6f6b8273 嘉兴测试 5 months ago
修宁 16db63036a update MQTT configuration and increase connection timeouts 5 months ago
修宁 d575c47821 嘉兴测试环境 5 months ago
修宁 c8d7b28c96 jx_test 5 months ago
  1. 2
      .lingma/rules/project_rule.md
  2. 26
      servo/src/main/java/com/galaxis/rcs/RCSService.java
  3. 150
      servo/src/main/java/com/galaxis/rcs/amr/AmrAgvItem.java
  4. 43
      servo/src/main/java/com/galaxis/rcs/amr/AmrConnectorThread.java
  5. 10
      servo/src/main/java/com/galaxis/rcs/amr/AmrDeviceTask.java
  6. 2
      servo/src/main/java/com/galaxis/rcs/amr/AmrMessage.java
  7. 32
      servo/src/main/java/com/galaxis/rcs/amr/AmrMessageHandler.java
  8. 2
      servo/src/main/java/com/galaxis/rcs/amr/AmrTaskMode.java
  9. 2
      servo/src/main/java/com/galaxis/rcs/amr/ArmMessageType.java
  10. 2
      servo/src/main/java/com/galaxis/rcs/amr/ControlMode.java
  11. 18
      servo/src/main/java/com/galaxis/rcs/amr/FM600AgvItem.java
  12. 2
      servo/src/main/java/com/galaxis/rcs/amr/JacksonUtils.java
  13. 2
      servo/src/main/java/com/galaxis/rcs/amr/PosDirection.java
  14. 38
      servo/src/main/java/com/galaxis/rcs/amr/PtrAgvItem.java
  15. 6
      servo/src/main/java/com/galaxis/rcs/amr/PtrMqttClient.java
  16. 2
      servo/src/main/java/com/galaxis/rcs/amr/RcsMessageType.java
  17. 4
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrAckMessage.java
  18. 4
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrAppStartMessage.java
  19. 4
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrBootMessage.java
  20. 4
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrExceptionMessage.java
  21. 4
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrHeartbeatMessage.java
  22. 4
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrLandmarkMessage.java
  23. 4
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrModuleTaskStatusMessage.java
  24. 4
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrOfflineMessage.java
  25. 4
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrOnlineMessage.java
  26. 4
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrShutdownMessage.java
  27. 8
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrStatusMessage.java
  28. 8
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrTaskCompletedMessage.java
  29. 4
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrTaskStatusMessage.java
  30. 2
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/AmrCommonMessage.java
  31. 2
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/CurBatteryData.java
  32. 2
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/GoodsData.java
  33. 2
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/LocationData.java
  34. 2
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/OffsetPosition.java
  35. 2
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/SummaryData.java
  36. 2
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/TaskCompletedData.java
  37. 2
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/TaskModeChangeData.java
  38. 2
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/TaskStatusChangeData.java
  39. 2
      servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/TaskTypeChangeData.java
  40. 2
      servo/src/main/java/com/galaxis/rcs/amr/sendEntity/BaseMessage.java
  41. 2
      servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsAckMessage.java
  42. 2
      servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsCancelTaskMessage.java
  43. 4
      servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsConfigMessage.java
  44. 4
      servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsControlDoorMessage.java
  45. 2
      servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsHeartBeatMessage.java
  46. 4
      servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsQueryStatusMessage.java
  47. 4
      servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsRotateBodyMessage.java
  48. 4
      servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsRotateRackMessage.java
  49. 4
      servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsSRMessage.java
  50. 4
      servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsSetLocationMessage.java
  51. 4
      servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsTaskMessage.java
  52. 4
      servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsWaitMessage.java
  53. 20
      servo/src/main/java/com/galaxis/rcs/connector/amr/AmrDeviceConnector.java
  54. 22
      servo/src/main/java/com/galaxis/rcs/connector/amr/PtrDeviceConnector.java
  55. 19
      servo/src/main/java/com/galaxis/rcs/connector/amr/cl2/Cl2DeviceConnector.java
  56. 18
      servo/src/main/java/com/galaxis/rcs/connector/amr/cl2/Cl2Item.java
  57. 4
      servo/src/main/java/com/galaxis/rcs/connector/amr/cl2/Cl2TaskManger.java
  58. 2
      servo/src/main/java/com/galaxis/rcs/connector/amr/cl2/VirtualCl2Connector.java
  59. 4
      servo/src/main/java/com/galaxis/rcs/connector/amr/clx/ClxConnector.java
  60. 4
      servo/src/main/java/com/galaxis/rcs/connector/amr/clx/ClxConnectorImp.java
  61. 2
      servo/src/main/java/com/galaxis/rcs/connector/amr/clx/VirtualClxConnector.java
  62. 20
      servo/src/main/java/com/galaxis/rcs/connector/amr/fm600/Fm600DeviceConnector.java
  63. 57
      servo/src/main/java/com/galaxis/rcs/connector/amr/fm600/Fm600Item.java
  64. 4
      servo/src/main/java/com/galaxis/rcs/connector/amr/fm600/Fm600TaskManger.java
  65. 8
      servo/src/main/java/com/galaxis/rcs/connector/amr/fm600/VirtualFm600Connector.java
  66. 4
      servo/src/main/java/com/galaxis/rcs/connector/cl2/Cl2TaskManger.java
  67. 4
      servo/src/main/java/com/galaxis/rcs/connector/clx/ClxConnector.java
  68. 4
      servo/src/main/java/com/galaxis/rcs/connector/clx/ClxConnectorImp.java
  69. 20
      servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java
  70. 33
      servo/src/main/java/com/galaxis/rcs/plan/RcsTaskOption.java
  71. 7
      servo/src/main/java/com/galaxis/rcs/plan/path/PathUtils.java
  72. 32
      servo/src/main/java/com/galaxis/rcs/plan/path/PtrPathPlanner.java
  73. 5
      servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvConnector.java
  74. 2
      servo/src/main/java/com/yvan/entity/AgvStatusVo.java
  75. 10
      servo/src/main/java/com/yvan/event/AgvEventManager.java
  76. 4
      servo/src/main/java/com/yvan/event/AgvEventType.java
  77. 29
      servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java
  78. 8
      servo/src/main/java/com/yvan/pusher/FrontendMessagePushService.java
  79. 88
      servo/src/main/java/com/yvan/workbench/controller/ApiController.java
  80. 38
      servo/src/main/java/com/yvan/workbench/controller/DeviceManager.java
  81. 78
      servo/src/main/java/com/yvan/workbench/controller/LccController.java
  82. 2
      servo/src/main/java/com/yvan/workbench/controller/LccModelManager.java
  83. 142
      servo/src/main/java/com/yvan/workbench/controller/RcsController.java
  84. 16
      servo/src/main/java/com/yvan/workbench/model/request/DelInvLpnReq.java
  85. 1
      servo/src/main/java/com/yvan/workbench/model/request/QueryInvLpnReq.java
  86. 25
      servo/src/main/resources/application-dev.yml
  87. 92
      servo/src/main/resources/application-jx.yml
  88. 94
      servo/src/main/resources/application-prod.yml
  89. 2
      servo/src/main/resources/logback-spring.xml

2
.lingma/rules/project_rule.md

@ -0,0 +1,2 @@
**添加规则文件可帮助模型精准理解你的编码偏好,如框架、代码风格等**
**规则文件只对当前工程生效,单文件限制10000字符。如果无需将该文件提交到远程 Git 仓库,请将其添加到 .gitignore**

26
servo/src/main/java/com/galaxis/rcs/RCSService.java

@ -3,7 +3,8 @@ package com.galaxis.rcs;
import com.galaxis.rcs.common.entity.AddTaskRequest; import com.galaxis.rcs.common.entity.AddTaskRequest;
import com.galaxis.rcs.common.entity.AddTaskResult; import com.galaxis.rcs.common.entity.AddTaskResult;
import com.galaxis.rcs.common.enums.LCCDirection; import com.galaxis.rcs.common.enums.LCCDirection;
import com.galaxis.rcs.connector.cl2.Cl2Item; import com.galaxis.rcs.connector.amr.cl2.Cl2Item;
import com.galaxis.rcs.connector.amr.fm600.Fm600Item;
import com.galaxis.rcs.plan.path.PathUtils; import com.galaxis.rcs.plan.path.PathUtils;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.LogisticsRuntime;
@ -157,6 +158,9 @@ public class RCSService {
switch (jwPayload.asStr("t")) { switch (jwPayload.asStr("t")) {
case "cl2": case "cl2":
case "clx": case "clx":
case "cs1":
case "cc5":
case "cl3": {
// 处理 CL2 或 CLX 类型的执行器 // 处理 CL2 或 CLX 类型的执行器
// 车所在的标记位置,及方向 11_4:RIGHT // 车所在的标记位置,及方向 11_4:RIGHT
var eitem = new Cl2Item(runtime, (Map<String, Object>) jwPayload.getInnerMap()); var eitem = new Cl2Item(runtime, (Map<String, Object>) jwPayload.getInnerMap());
@ -173,6 +177,26 @@ public class RCSService {
} }
runtime.executorItemMap.put(eitem.getId(), eitem); runtime.executorItemMap.put(eitem.getId(), eitem);
break; break;
}
case "fm600": {
// 处理 CL2 或 CLX 类型的执行器
// 车所在的标记位置,及方向 11_4:RIGHT
var fm600Itemitem = new Fm600Item(runtime, (Map<String, Object>) jwPayload.getInnerMap());
// 找到地标位置
StaticItem staticItem = runtime.getStaticItemById(wayPointId);
if (staticItem != null) {
fm600Itemitem.logicX = staticItem.logicX;
fm600Itemitem.logicY = staticItem.logicY;
fm600Itemitem.direction = PathUtils.convertDirectionToPtrDiretion(LCCDirection.fromString(direction));
} else {
log.warn("Static item not found for wayPointId: {}", wayPointId);
}
runtime.executorItemMap.put(fm600Itemitem.getId(), fm600Itemitem);
break;
}
default: default:
log.warn("Unknown executor type: {}", jwPayload.asStr("t")); log.warn("Unknown executor type: {}", jwPayload.asStr("t"));

150
servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java → servo/src/main/java/com/galaxis/rcs/amr/AmrAgvItem.java

@ -1,25 +1,23 @@
package com.galaxis.rcs.ptr; package com.galaxis.rcs.amr;
import com.galaxis.rcs.common.entity.RcsTaskPlan; import com.galaxis.rcs.common.entity.RcsTaskPlan;
import com.galaxis.rcs.common.enums.*; import com.galaxis.rcs.common.enums.*;
import com.galaxis.rcs.connector.cl2.Cl2DeviceConnector; import com.galaxis.rcs.connector.amr.AmrDeviceConnector;
import com.galaxis.rcs.plan.PlanTaskSequence; import com.galaxis.rcs.plan.PlanTaskSequence;
import com.galaxis.rcs.plan.path.PathUtils; import com.galaxis.rcs.plan.path.PathUtils;
import com.galaxis.rcs.ptr.receiveEntity.AmrHeartbeatMessage; import com.galaxis.rcs.amr.receiveEntity.AmrHeartbeatMessage;
import com.galaxis.rcs.ptr.receiveEntity.base.CurBatteryData; import com.galaxis.rcs.amr.receiveEntity.base.CurBatteryData;
import com.galaxis.rcs.ptr.sendEntity.RcsConfigMessage; import com.galaxis.rcs.amr.sendEntity.RcsConfigMessage;
import com.galaxis.rcs.ptr.sendEntity.RcsSRMessage; import com.galaxis.rcs.amr.sendEntity.RcsSRMessage;
import com.galaxis.rcs.ptr.sendEntity.RcsSetLocationMessage; import com.galaxis.rcs.amr.sendEntity.RcsSetLocationMessage;
import com.google.common.collect.Queues; import com.google.common.collect.Queues;
import com.yvan.entity.AgvStatusVo; import com.yvan.entity.AgvStatusVo;
import com.yvan.entity.BasLocationVo;
import com.yvan.logisticsModel.ExecutorItem; import com.yvan.logisticsModel.ExecutorItem;
import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.LogisticsRuntime;
import com.yvan.logisticsModel.StaticItem; import com.yvan.logisticsModel.StaticItem;
import lombok.Getter; import lombok.Getter;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.clever.core.Conv;
import org.clever.core.json.JsonWrapper; import org.clever.core.json.JsonWrapper;
import org.clever.data.redis.Redis; import org.clever.data.redis.Redis;
import org.clever.data.redis.RedisAdmin; import org.clever.data.redis.RedisAdmin;
@ -28,11 +26,8 @@ import java.util.*;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.locks.LockSupport; import java.util.concurrent.locks.LockSupport;
/**
* 侧叉式AGV执行器
*/
@Slf4j @Slf4j
public abstract class PtrAgvItem extends ExecutorItem { public abstract class AmrAgvItem extends ExecutorItem {
private static final int BLOCKING_QUEUE_CAPACITY = 100; private static final int BLOCKING_QUEUE_CAPACITY = 100;
private static final Redis redis = RedisAdmin.getRedis(); private static final Redis redis = RedisAdmin.getRedis();
@ -73,7 +68,7 @@ public abstract class PtrAgvItem extends ExecutorItem {
// 执行中的任务 // 执行中的任务
public List<PtrAgvDeviceTask> runningDeviceTaskList = new ArrayList<>(); public List<AmrDeviceTask> runningDeviceTaskList = new ArrayList<>();
/** /**
* 当前执行的任务规划列表 * 当前执行的任务规划列表
@ -83,20 +78,20 @@ public abstract class PtrAgvItem extends ExecutorItem {
/** /**
* 当前执行的设备任务列表 * 当前执行的设备任务列表
*/ */
final BlockingQueue<PtrAgvDeviceTask> deviceTaskQueue = Queues.newArrayBlockingQueue(BLOCKING_QUEUE_CAPACITY); public final BlockingQueue<AmrDeviceTask> deviceTaskQueue = Queues.newArrayBlockingQueue(BLOCKING_QUEUE_CAPACITY);
final Cl2DeviceConnector cl2DeviceConnector = new Cl2DeviceConnector(this.runtime); final AmrDeviceConnector amrDeviceConnector = new AmrDeviceConnector(this.runtime);
public final AmrMessageHandler amrMessageHandler; public final AmrMessageHandler amrMessageHandler;
/** /**
* 连接器线程 * 连接器线程
*/ */
private final PtrAgvConnectorThread connectorThread; public AmrConnectorThread connectorThread;
public PtrAgvItem(LogisticsRuntime logisticsRuntime, Map<String, Object> raw) { public AmrAgvItem(LogisticsRuntime logisticsRuntime, Map<String, Object> raw) {
super(logisticsRuntime, raw); super(logisticsRuntime, raw);
this.connectorThread = new PtrAgvConnectorThread(this, this.cl2DeviceConnector, logisticsRuntime); this.connectorThread = new AmrConnectorThread(this, this.amrDeviceConnector, logisticsRuntime);
this.amrMessageHandler = logisticsRuntime.amrMessageHandler; this.amrMessageHandler = logisticsRuntime.amrMessageHandler;
} }
@ -261,7 +256,7 @@ public abstract class PtrAgvItem extends ExecutorItem {
updatePosition(logicX, logicY, direction); updatePosition(logicX, logicY, direction);
// 查找当前分组任务 // 查找当前分组任务
for (PtrAgvDeviceTask task : runningDeviceTaskList) { for (AmrDeviceTask task : runningDeviceTaskList) {
task.taskGroupStatus = taskStatus; task.taskGroupStatus = taskStatus;
if (taskStatus == 4) { if (taskStatus == 4) {
if (task.taskStatus != 4) { if (task.taskStatus != 4) {
@ -325,7 +320,7 @@ public abstract class PtrAgvItem extends ExecutorItem {
this.planTaskSequence != null && !this.planTaskSequence.isEmpty()) { this.planTaskSequence != null && !this.planTaskSequence.isEmpty()) {
for (int i = 0; i < runningDeviceTaskList.size(); i++) { for (int i = 0; i < runningDeviceTaskList.size(); i++) {
PtrAgvDeviceTask task = runningDeviceTaskList.get(i); AmrDeviceTask task = runningDeviceTaskList.get(i);
if (task.checkLogicX == logicX && task.checkLogicY == logicY && task.direction == this.direction) { if (task.checkLogicX == logicX && task.checkLogicY == logicY && task.direction == this.direction) {
if (task.taskStatus < 4) { if (task.taskStatus < 4) {
finishTargetIndex = i; finishTargetIndex = i;
@ -338,7 +333,7 @@ public abstract class PtrAgvItem extends ExecutorItem {
needCompute = true; needCompute = true;
// 标记前面的任务都完成了 // 标记前面的任务都完成了
for (int i = 0; i <= finishTargetIndex; i++) { for (int i = 0; i <= finishTargetIndex; i++) {
PtrAgvDeviceTask task = runningDeviceTaskList.get(i); AmrDeviceTask task = runningDeviceTaskList.get(i);
task.taskStatus = 4; // 标记为完成 task.taskStatus = 4; // 标记为完成
this.runtime.eventManager.fireDeviceTaskCompleteEvent(this, task); this.runtime.eventManager.fireDeviceTaskCompleteEvent(this, task);
@ -371,7 +366,7 @@ public abstract class PtrAgvItem extends ExecutorItem {
if (needCompute && this.runningDeviceTaskList.size() > 0) { if (needCompute && this.runningDeviceTaskList.size() > 0) {
int index = this.runningDeviceTaskList.size() - 1; int index = this.runningDeviceTaskList.size() - 1;
PtrAgvDeviceTask task = this.runningDeviceTaskList.get(index); AmrDeviceTask task = this.runningDeviceTaskList.get(index);
if (task.groupEndPoint != task.endPoint) { if (task.groupEndPoint != task.endPoint) {
LockSupport.unpark(connectorThread); LockSupport.unpark(connectorThread);
} }
@ -466,7 +461,7 @@ public abstract class PtrAgvItem extends ExecutorItem {
* 停止连接器线程 * 停止连接器线程
*/ */
public void stopConnector() { public void stopConnector() {
connectorThread.stop(); connectorThread.interrupt();
} }
private static final int speed = 1000; private static final int speed = 1000;
@ -490,7 +485,7 @@ public abstract class PtrAgvItem extends ExecutorItem {
Set<Long> rotationPlanTaskIdSet = new HashSet<>(); Set<Long> rotationPlanTaskIdSet = new HashSet<>();
// 生成移动报文 // 生成移动报文
List<PtrAgvDeviceTask> deviceTaskList = new ArrayList<>(); List<AmrDeviceTask> deviceTaskList = new ArrayList<>();
List<Map<String, Object>> linkStore = null; List<Map<String, Object>> linkStore = null;
// 检查 planList 是不是全都是我的任务 // 检查 planList 是不是全都是我的任务
for (int i = 0; i < sequence.taskList.size(); i++) { for (int i = 0; i < sequence.taskList.size(); i++) {
@ -503,14 +498,14 @@ public abstract class PtrAgvItem extends ExecutorItem {
linkStore = (List<Map<String, Object>>) pointItem.dt.get("linkStore"); linkStore = (List<Map<String, Object>>) pointItem.dt.get("linkStore");
int d = -1; int d = -1;
if (startPoint.logicX == pointItem.logicX && startPoint.logicY != pointItem.logicY) { if (startPoint.logicX == pointItem.logicX && startPoint.logicY != pointItem.logicY) {
d = pointItem.logicY >= startPoint.logicY ? CDirection.db : CDirection.dt; d = pointItem.logicY >= startPoint.logicY ? AmrAgvItem.CDirection.db : AmrAgvItem.CDirection.dt;
if ((d > direction && d - CDirection.dl != direction) || (d < direction && d + CDirection.dl != direction)) { if ((d > direction && d - AmrAgvItem.CDirection.dl != direction) || (d < direction && d + AmrAgvItem.CDirection.dl != direction)) {
throw new RuntimeException("方向错误"); throw new RuntimeException("方向错误");
} }
} else if (startPoint.logicY == pointItem.logicY && startPoint.logicX != pointItem.logicX) { } else if (startPoint.logicY == pointItem.logicY && startPoint.logicX != pointItem.logicX) {
d = pointItem.logicX >= startPoint.logicX ? CDirection.dr : CDirection.dl; d = pointItem.logicX >= startPoint.logicX ? AmrAgvItem.CDirection.dr : AmrAgvItem.CDirection.dl;
if ((d > direction && d - CDirection.dl != direction) || (d < direction && d + CDirection.dl != direction)) { if ((d > direction && d - AmrAgvItem.CDirection.dl != direction) || (d < direction && d + AmrAgvItem.CDirection.dl != direction)) {
throw new RuntimeException("方向错误"); throw new RuntimeException("方向错误");
} }
// distance += Math.abs(pointItem.getTransformationX() - startPoint.getTransformationX()); // distance += Math.abs(pointItem.getTransformationX() - startPoint.getTransformationX());
@ -522,7 +517,7 @@ public abstract class PtrAgvItem extends ExecutorItem {
} else { } else {
throw new RuntimeException("无法识别的点位关系"); throw new RuntimeException("无法识别的点位关系");
} }
PtrAgvDeviceTask deviceTask = new PtrAgvDeviceTask(); AmrDeviceTask deviceTask = new AmrDeviceTask();
deviceTask.x = pointItem.logicX; deviceTask.x = pointItem.logicX;
deviceTask.y = pointItem.logicY; deviceTask.y = pointItem.logicY;
deviceTask.speed = d == direction ? (speed) : (-speed); deviceTask.speed = d == direction ? (speed) : (-speed);
@ -552,23 +547,23 @@ public abstract class PtrAgvItem extends ExecutorItem {
} }
if (r >= 315 || r < 45) { if (r >= 315 || r < 45) {
direction = CDirection.dr; direction = AmrAgvItem.CDirection.dr;
} else if (r >= 45 && r < 135) { } else if (r >= 45 && r < 135) {
direction = CDirection.dt; direction = AmrAgvItem.CDirection.dt;
} else if (r >= 135 && r < 225) { } else if (r >= 135 && r < 225) {
direction = CDirection.dl; direction = AmrAgvItem.CDirection.dl;
} else if (r >= 225 && r < 315) { } else if (r >= 225 && r < 315) {
direction = CDirection.db; direction = AmrAgvItem.CDirection.db;
} }
rotationPlanTaskIdSet.add(plan.getPlanTaskId()); rotationPlanTaskIdSet.add(plan.getPlanTaskId());
} else if (plan.getPlanType().equals(PlanTaskType.LOAD.toString())) { } else if (plan.getPlanType().equals(PlanTaskType.LOAD.toString())) {
if (deviceTaskList.isEmpty()) { if (deviceTaskList.isEmpty()) {
PtrAgvDeviceTask deviceTask = new PtrAgvDeviceTask(); AmrDeviceTask deviceTask = new AmrDeviceTask();
deviceTask.x = startPoint.logicX; deviceTask.x = startPoint.logicX;
deviceTask.y = startPoint.logicY; deviceTask.y = startPoint.logicY;
deviceTask.speed = speed; deviceTask.speed = speed;
@ -586,9 +581,9 @@ public abstract class PtrAgvItem extends ExecutorItem {
deviceTaskList.add(deviceTask); deviceTaskList.add(deviceTask);
linkStore = (List<Map<String, Object>>) startPoint.dt.get("linkStore"); linkStore = (List<Map<String, Object>>) startPoint.dt.get("linkStore");
} }
PtrAgvDeviceTask deviceTask = deviceTaskList.get(deviceTaskList.size() - 1); AmrDeviceTask deviceTask = deviceTaskList.get(deviceTaskList.size() - 1);
deviceTask.operationType = COperationType.transplantLoadAndUnload; deviceTask.operationType = AmrAgvItem.COperationType.transplantLoadAndUnload;
deviceTask.pickMode = CPickMode.load; deviceTask.pickMode = AmrAgvItem.CPickMode.load;
deviceTask.planTaskIdSet.add(plan.getPlanTaskId()); deviceTask.planTaskIdSet.add(plan.getPlanTaskId());
//处理取货高度 //处理取货高度
StaticItem storeItem = runtime.getStaticItemById(endPointId); StaticItem storeItem = runtime.getStaticItemById(endPointId);
@ -601,6 +596,10 @@ public abstract class PtrAgvItem extends ExecutorItem {
} else { } else {
deviceTask.goodsSlotHeight = 1; deviceTask.goodsSlotHeight = 1;
} }
if (sequence.getLoadHeight() > 0d) {
deviceTask.goodsSlotHeight = (int) Math.round(sequence.getLoadHeight() * 1000);
log.info("option.loadHeight = {}", deviceTask.goodsSlotHeight);
}
if (linkStore != null) { if (linkStore != null) {
for (Map<String, Object> store : linkStore) { for (Map<String, Object> store : linkStore) {
if (store.get("item").equals(plan.getTargetId()) && store.get("level").equals(plan.getTargetLevel()) && store.get("bay").equals(plan.getTargetBay()) && store.get("cell").equals(plan.getTargetCell())) { if (store.get("item").equals(plan.getTargetId()) && store.get("level").equals(plan.getTargetLevel()) && store.get("bay").equals(plan.getTargetBay()) && store.get("cell").equals(plan.getTargetCell())) {
@ -632,7 +631,7 @@ public abstract class PtrAgvItem extends ExecutorItem {
} else if (plan.getPlanType().equals(PlanTaskType.UNLOAD.toString())) { } else if (plan.getPlanType().equals(PlanTaskType.UNLOAD.toString())) {
if (deviceTaskList.isEmpty()) { if (deviceTaskList.isEmpty()) {
PtrAgvDeviceTask deviceTask = new PtrAgvDeviceTask(); AmrDeviceTask deviceTask = new AmrDeviceTask();
deviceTask.x = startPoint.logicX; deviceTask.x = startPoint.logicX;
deviceTask.y = startPoint.logicY; deviceTask.y = startPoint.logicY;
deviceTask.speed = speed; deviceTask.speed = speed;
@ -650,9 +649,9 @@ public abstract class PtrAgvItem extends ExecutorItem {
deviceTaskList.add(deviceTask); deviceTaskList.add(deviceTask);
linkStore = (List<Map<String, Object>>) startPoint.dt.get("linkStore"); linkStore = (List<Map<String, Object>>) startPoint.dt.get("linkStore");
} }
PtrAgvDeviceTask deviceTask = deviceTaskList.get(deviceTaskList.size() - 1); AmrDeviceTask deviceTask = deviceTaskList.get(deviceTaskList.size() - 1);
deviceTask.operationType = COperationType.transplantLoadAndUnload; deviceTask.operationType = AmrAgvItem.COperationType.transplantLoadAndUnload;
deviceTask.pickMode = CPickMode.unload; deviceTask.pickMode = AmrAgvItem.CPickMode.unload;
deviceTask.planTaskIdSet.add(plan.getPlanTaskId()); deviceTask.planTaskIdSet.add(plan.getPlanTaskId());
// 处理卸货高度 // 处理卸货高度
StaticItem storeItem = runtime.getStaticItemById(endPointId); StaticItem storeItem = runtime.getStaticItemById(endPointId);
@ -665,22 +664,26 @@ public abstract class PtrAgvItem extends ExecutorItem {
} else { } else {
deviceTask.goodsSlotHeight = 1; deviceTask.goodsSlotHeight = 1;
} }
if (sequence.getUnloadHeight() > 0d) {
deviceTask.goodsSlotHeight = (int) Math.round(sequence.getUnloadHeight() * 1000);
log.info("option.unloadHeight = {}", deviceTask.goodsSlotHeight);
}
if (linkStore != null) { if (linkStore != null) {
for (Map<String, Object> store : linkStore) { for (Map<String, Object> store : linkStore) {
if (store.get("item").equals(plan.getTargetId()) && store.get("level").equals(plan.getTargetLevel()) && store.get("bay").equals(plan.getTargetBay()) && store.get("cell").equals(plan.getTargetCell())) { if (store.get("item").equals(plan.getTargetId()) && store.get("level").equals(plan.getTargetLevel()) && store.get("bay").equals(plan.getTargetBay()) && store.get("cell").equals(plan.getTargetCell())) {
short d = 0; short d = 0;
switch (store.get("direction").toString()) { switch (store.get("direction").toString()) {
case "up": case "up":
d = 3; d = 1;
break; break;
case "right": case "right":
d = 0; d = 2;
break; break;
case "down": case "down":
d = 1; d = 3;
break; break;
case "left": case "left":
d = 2; d = 0;
break; break;
} }
deviceTask.goodsSlotDirection = d; deviceTask.goodsSlotDirection = d;
@ -695,7 +698,7 @@ public abstract class PtrAgvItem extends ExecutorItem {
} else if (plan.getPlanType().equals(PlanTaskType.CHARGE.toString())) { } else if (plan.getPlanType().equals(PlanTaskType.CHARGE.toString())) {
if (deviceTaskList.isEmpty()) { if (deviceTaskList.isEmpty()) {
PtrAgvDeviceTask deviceTask = new PtrAgvDeviceTask(); AmrDeviceTask deviceTask = new AmrDeviceTask();
deviceTask.x = startPoint.logicX; deviceTask.x = startPoint.logicX;
deviceTask.y = startPoint.logicY; deviceTask.y = startPoint.logicY;
deviceTask.speed = speed; deviceTask.speed = speed;
@ -712,8 +715,8 @@ public abstract class PtrAgvItem extends ExecutorItem {
deviceTask.checkLogicY = startPoint.logicY; deviceTask.checkLogicY = startPoint.logicY;
deviceTaskList.add(deviceTask); deviceTaskList.add(deviceTask);
} }
PtrAgvDeviceTask deviceTask = deviceTaskList.get(deviceTaskList.size() - 1); AmrDeviceTask deviceTask = deviceTaskList.get(deviceTaskList.size() - 1);
deviceTask.operationType = COperationType.charge; deviceTask.operationType = AmrAgvItem.COperationType.charge;
deviceTask.planTaskIdSet.add(plan.getPlanTaskId()); deviceTask.planTaskIdSet.add(plan.getPlanTaskId());
// 处理充电距离(车的充电口到充电器被压下后的距离、一般被压下20mm) // 处理充电距离(车的充电口到充电器被压下后的距离、一般被压下20mm)
deviceTask.chargeDirection = 2; deviceTask.chargeDirection = 2;
@ -732,7 +735,7 @@ public abstract class PtrAgvItem extends ExecutorItem {
} }
if (deviceTaskList.isEmpty()) { if (deviceTaskList.isEmpty()) {
PtrAgvDeviceTask deviceTask = new PtrAgvDeviceTask(); AmrDeviceTask deviceTask = new AmrDeviceTask();
deviceTask.x = startPoint.logicX; deviceTask.x = startPoint.logicX;
deviceTask.y = startPoint.logicY; deviceTask.y = startPoint.logicY;
deviceTask.speed = speed; deviceTask.speed = speed;
@ -747,14 +750,16 @@ public abstract class PtrAgvItem extends ExecutorItem {
} }
// 标记任务分组结束 // 标记任务分组结束
PtrAgvDeviceTask deviceTask = deviceTaskList.get(deviceTaskList.size() - 1); AmrDeviceTask deviceTask = deviceTaskList.get(deviceTaskList.size() - 1);
deviceTask.groupEndPoint = deviceTask.endPoint; deviceTask.groupEndPoint = deviceTask.endPoint;
deviceTask.groupStartPoint = groupStartPoint; deviceTask.groupStartPoint = groupStartPoint;
deviceTask.isGroupEnd = true; deviceTask.isGroupEnd = true;
// 最后一个规划任务为旋转时需要添加一个endDirection // 最后一个规划任务为旋转时需要添加一个endDirection
if (rotationPlanTaskIdSet.size() > 0) { if (rotationPlanTaskIdSet.size() > 0) {
deviceTask.operationType = COperationType.move; if (deviceTask.operationType <= AmrAgvItem.COperationType.move) {
deviceTask.pickMode = CPickMode.normal; deviceTask.operationType = AmrAgvItem.COperationType.move;
deviceTask.pickMode = AmrAgvItem.CPickMode.normal;
}
deviceTask.endDirection = direction; deviceTask.endDirection = direction;
deviceTask.planTaskIdSet.addAll(rotationPlanTaskIdSet); deviceTask.planTaskIdSet.addAll(rotationPlanTaskIdSet);
if (deviceTask.movePlanTaskId == null) { if (deviceTask.movePlanTaskId == null) {
@ -765,9 +770,19 @@ public abstract class PtrAgvItem extends ExecutorItem {
// 反向标记任务组 // 反向标记任务组
int lastIndex = deviceTaskList.size() - 1; int lastIndex = deviceTaskList.size() - 1;
for (int i = deviceTaskList.size() - 1; i >= 0; i--) {
AmrDeviceTask d = deviceTaskList.get(i);
if (d.operationType > 0) {
lastIndex = i;
break;
}
}
for (int i = deviceTaskList.size() - 1; i >= 0; i--) { for (int i = deviceTaskList.size() - 1; i >= 0; i--) {
PtrAgvDeviceTask d = deviceTaskList.get(i); AmrDeviceTask d = deviceTaskList.get(i);
if (d.isGroupEnd) { if (d.isGroupEnd && d.operationType > AmrAgvItem.COperationType.move) {
lastIndex = i; lastIndex = i;
} else { } else {
d.operationType = deviceTaskList.get(lastIndex).operationType; d.operationType = deviceTaskList.get(lastIndex).operationType;
@ -780,12 +795,11 @@ public abstract class PtrAgvItem extends ExecutorItem {
d.chargeLocation = deviceTaskList.get(lastIndex).chargeLocation; d.chargeLocation = deviceTaskList.get(lastIndex).chargeLocation;
} }
} }
handelDeviceTask(deviceTaskList);
deviceTaskQueue.addAll(deviceTaskList);
String json = JsonWrapper.toJson(deviceTaskList);
log.info("deviceTaskList: {}", json);
} }
abstract public void handelDeviceTask(List<AmrDeviceTask> deviceTaskList);
public boolean isSamePosition(PosDirection startPos) { public boolean isSamePosition(PosDirection startPos) {
return this.logicX == startPos.logicX() && this.logicY == startPos.logicY() && return this.logicX == startPos.logicX() && this.logicY == startPos.logicY() &&
PathUtils.getDirectionByArmDirection(this.direction) == startPos.direction(); PathUtils.getDirectionByArmDirection(this.direction) == startPos.direction();
@ -799,21 +813,33 @@ public abstract class PtrAgvItem extends ExecutorItem {
} }
private static class COperationType { public static class COperationType {
// 移动
public static final short move = 0; public static final short move = 0;
// 载货
public static final short load = 1; public static final short load = 1;
public static final short unpick = 2; // 卸货
public static final short unload = 2;
// 充电
public static final short charge = 3; public static final short charge = 3;
// 移载取放货
public static final short transplantLoadAndUnload = 4; public static final short transplantLoadAndUnload = 4;
// 滚轮取放货
public static final short rollerLoadAndUnload = 5; public static final short rollerLoadAndUnload = 5;
} }
private static class CPickMode { public static class CPickMode {
// 无动作
public static final short normal = 0; public static final short normal = 0;
// 载货
public static final short load = 1; public static final short load = 1;
// 卸货
public static final short unload = 2; public static final short unload = 2;
// 调高
public static final short adjustHeight = 3; public static final short adjustHeight = 3;
// 调高准备取货
public static final short adjustHeightToLoad = 5; public static final short adjustHeightToLoad = 5;
// 调高准备卸货
public static final short adjustHeightToUnload = 6; public static final short adjustHeightToUnload = 6;
} }

43
servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvConnectorThread.java → servo/src/main/java/com/galaxis/rcs/amr/AmrConnectorThread.java

@ -1,8 +1,9 @@
package com.galaxis.rcs.ptr; package com.galaxis.rcs.amr;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.galaxis.rcs.connector.cl2.Cl2DeviceConnector; import com.galaxis.rcs.amr.sendEntity.RcsTaskMessage;
import com.galaxis.rcs.ptr.sendEntity.RcsTaskMessage; import com.galaxis.rcs.connector.amr.AmrDeviceConnector;
import com.querydsl.core.util.StringUtils;
import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.LogisticsRuntime;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.mqttv5.common.MqttException; import org.eclipse.paho.mqttv5.common.MqttException;
@ -13,21 +14,21 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.LockSupport; import java.util.concurrent.locks.LockSupport;
@Slf4j @Slf4j
public class PtrAgvConnectorThread extends Thread { public class AmrConnectorThread extends Thread {
private final AtomicBoolean running = new AtomicBoolean(false); private final AtomicBoolean running = new AtomicBoolean(false);
private final AtomicBoolean paused = new AtomicBoolean(false); private final AtomicBoolean paused = new AtomicBoolean(false);
private final Object pauseLock = new Object(); private final Object pauseLock = new Object();
private final Cl2DeviceConnector cl2DeviceConnector; public final AmrDeviceConnector amrDeviceConnector;
private final PtrAgvItem ptrAgvItem; private final AmrAgvItem ptrAgvItem;
private final LogisticsRuntime logisticsRuntime; private final LogisticsRuntime logisticsRuntime;
private volatile int __currentTaskSeqNo = 0; private volatile int __currentTaskSeqNo = 0;
volatile PtrAgvDeviceTask __currentTask; volatile AmrDeviceTask __currentTask;
public PtrAgvConnectorThread(PtrAgvItem ptrAgvItem, Cl2DeviceConnector cl2DeviceConnector, LogisticsRuntime logisticsRuntime) { public AmrConnectorThread(AmrAgvItem amrAgvItem, AmrDeviceConnector amrDeviceConnector, LogisticsRuntime logisticsRuntime) {
super("ExecutorConnector-" + ptrAgvItem.getId()); super("ExecutorConnector-" + amrAgvItem.getId());
this.cl2DeviceConnector = cl2DeviceConnector; this.amrDeviceConnector = amrDeviceConnector;
this.ptrAgvItem = ptrAgvItem; this.ptrAgvItem = amrAgvItem;
this.logisticsRuntime = logisticsRuntime; this.logisticsRuntime = logisticsRuntime;
} }
@ -40,12 +41,13 @@ public class PtrAgvConnectorThread extends Thread {
float distance = 0; float distance = 0;
int taskCount = 0; int taskCount = 0;
PtrAgvDeviceTask startTask = null; AmrDeviceTask startTask = null;
RcsTaskMessage taskMessage = null; RcsTaskMessage taskMessage = null;
// 计算中的任务 // 计算中的任务
List<PtrAgvDeviceTask> computingTaskList = new ArrayList<>(); List<AmrDeviceTask> computingTaskList = new ArrayList<>();
while (running.get()) { while (running.get()) {
Thread.sleep(1);
if (paused.get()) { if (paused.get()) {
synchronized (pauseLock) { synchronized (pauseLock) {
while (paused.get()) { while (paused.get()) {
@ -54,7 +56,7 @@ public class PtrAgvConnectorThread extends Thread {
} }
} }
PtrAgvDeviceTask currentTask = this.ptrAgvItem.deviceTaskQueue.take(); AmrDeviceTask currentTask = this.ptrAgvItem.deviceTaskQueue.take();
if (startTask == null) { if (startTask == null) {
startTask = currentTask; startTask = currentTask;
taskMessage = new RcsTaskMessage(this.logisticsRuntime); taskMessage = new RcsTaskMessage(this.logisticsRuntime);
@ -73,7 +75,7 @@ public class PtrAgvConnectorThread extends Thread {
computingTaskList.add(currentTask); computingTaskList.add(currentTask);
PtrAgvDeviceTask nextTask = this.ptrAgvItem.deviceTaskQueue.peek(); AmrDeviceTask nextTask = this.ptrAgvItem.deviceTaskQueue.peek();
if (currentTask.isGroupEnd if (currentTask.isGroupEnd
|| (taskMessage.Link.size() > 0 && nextTask != null && ((startTask.speed > 0) != (nextTask.speed > 0) || startTask.direction != nextTask.direction)) // 下一个任务和开始任务方向不一致 || (taskMessage.Link.size() > 0 && nextTask != null && ((startTask.speed > 0) != (nextTask.speed > 0) || startTask.direction != nextTask.direction)) // 下一个任务和开始任务方向不一致
// 单向移动距离大于2m时并且点位数量大于1 如果碰到当前点位与任务结束点位相同且当前任务还有后续,则继续添加步骤(link)错开,避免任务发生歧义 // 单向移动距离大于2m时并且点位数量大于1 如果碰到当前点位与任务结束点位相同且当前任务还有后续,则继续添加步骤(link)错开,避免任务发生歧义
@ -88,13 +90,14 @@ public class PtrAgvConnectorThread extends Thread {
taskMessage.ChargeDirection = currentTask.chargeDirection; taskMessage.ChargeDirection = currentTask.chargeDirection;
taskMessage.ChargeLocation = currentTask.chargeLocation; taskMessage.ChargeLocation = currentTask.chargeLocation;
taskMessage.EndDirection = currentTask.endDirection; taskMessage.EndDirection = currentTask.endDirection;
taskMessage.StorageRacksNo = currentTask.storageRacksNo;
try { try {
// 发送任务 // 发送任务
this.__currentTaskSeqNo = taskMessage.SeqNo; this.__currentTaskSeqNo = taskMessage.SeqNo;
this.__currentTask = currentTask; this.__currentTask = currentTask;
cl2DeviceConnector.sendTask(ptrAgvItem.getId(), taskMessage); amrDeviceConnector.sendTask(ptrAgvItem.getId(), taskMessage);
this.ptrAgvItem.runningDeviceTaskList.addAll(computingTaskList); this.ptrAgvItem.runningDeviceTaskList.addAll(computingTaskList);
for (PtrAgvDeviceTask task : computingTaskList) { for (AmrDeviceTask task : computingTaskList) {
task.taskStatus = 1; task.taskStatus = 1;
task.taskGroupStatus = 1; task.taskGroupStatus = 1;
} }
@ -111,7 +114,7 @@ public class PtrAgvConnectorThread extends Thread {
// 当一组任务结束时,阻塞当前线程,等当前任务执组行完毕后在外部线程中唤醒 // 当一组任务结束时,阻塞当前线程,等当前任务执组行完毕后在外部线程中唤醒
LockSupport.park(); // 阻塞当前线程 LockSupport.park(); // 阻塞当前线程
} else { } else {
for (PtrAgvDeviceTask task : this.ptrAgvItem.runningDeviceTaskList) { for (AmrDeviceTask task : this.ptrAgvItem.runningDeviceTaskList) {
if (task.taskGroupStatus < 4) { if (task.taskGroupStatus < 4) {
LockSupport.park(); // 阻塞当前线程 LockSupport.park(); // 阻塞当前线程
break; break;
@ -122,9 +125,9 @@ public class PtrAgvConnectorThread extends Thread {
} }
} catch (InterruptedException e) { } catch (InterruptedException e) {
System.out.println("Connector thread interrupted for executor: " + this.ptrAgvItem.getId()); log.error("Connector thread interrupted for executor: " + this.ptrAgvItem.getId(), e);
} finally { } finally {
System.out.println("Connector thread stopped for executor: " + this.ptrAgvItem.getId()); log.info("Connector thread stopped for executor: " + this.ptrAgvItem.getId());
} }
} }

10
servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvDeviceTask.java → servo/src/main/java/com/galaxis/rcs/amr/AmrDeviceTask.java

@ -1,11 +1,11 @@
package com.galaxis.rcs.ptr; package com.galaxis.rcs.amr;
import com.yvan.logisticsModel.StaticItem; import com.yvan.logisticsModel.StaticItem;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
public class PtrAgvDeviceTask { public class AmrDeviceTask {
//该段目标点X坐标 UInt16 逻辑单位,乘以一定系数才是物理距离 //该段目标点X坐标 UInt16 逻辑单位,乘以一定系数才是物理距离
public int x; public int x;
//该段目标点Y坐标 UInt16 逻辑单位,乘以一定系数才是物理距离 //该段目标点Y坐标 UInt16 逻辑单位,乘以一定系数才是物理距离
@ -25,13 +25,13 @@ public class PtrAgvDeviceTask {
// 作业类型 UInt8 0:运输 1:接货 2:卸货 3:充电 4:提升移栽取货或卸货 5:滚筒取货或卸货(双向作业) // 作业类型 UInt8 0:运输 1:接货 2:卸货 3:充电 4:提升移栽取货或卸货 5:滚筒取货或卸货(双向作业)
public short operationType; public short operationType;
// 提升移栽货物拣货模式 UInt8 0:不控制(无动作) 1:从货架上取货 2:将货物放到货架上 3:仅调整托盘高度(不进行取放货操作) 4:调整车身货物(仅供调试,RCS勿发送此命令) 5:仅调整载货台到取货高度,但是不动作 6:仅调整载货台到放货高度,但是不动作 // 提升移栽货物拣货模式 UInt8 0:不控制(无动作) 1:从货架上取货 2:将货物放到货架上 3:仅调整托盘高度(不进行取放货操作) 4:调整车身货物(仅供调试,RCS勿发送此命令) 5:仅调整载货台到取货高度,但是不动作 6:仅调整载货台到放货高度,但是不动作
public short pickMode; public Short pickMode;
// 目标货位朝向 // 目标货位朝向
public short goodsSlotDirection; public Short goodsSlotDirection;
// 目标货位相对于地面的绝对高度 // 目标货位相对于地面的绝对高度
public int goodsSlotHeight; public Integer goodsSlotHeight;
//充电桩朝向UseBriefLocation UInt8 0: X轴正向 1: Y轴正向 2: X轴负向 3: Y轴负向 15: 未知方向 //充电桩朝向UseBriefLocation UInt8 0: X轴正向 1: Y轴正向 2: X轴负向 3: Y轴负向 15: 未知方向
public Short chargeDirection; public Short chargeDirection;

2
servo/src/main/java/com/galaxis/rcs/ptr/AmrMessage.java → servo/src/main/java/com/galaxis/rcs/amr/AmrMessage.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr; package com.galaxis.rcs.amr;
import lombok.Data; import lombok.Data;

32
servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java → servo/src/main/java/com/galaxis/rcs/amr/AmrMessageHandler.java

@ -1,12 +1,12 @@
package com.galaxis.rcs.ptr; package com.galaxis.rcs.amr;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.galaxis.rcs.plan.path.PathUtils; import com.galaxis.rcs.plan.path.PathUtils;
import com.galaxis.rcs.ptr.receiveEntity.*; import com.galaxis.rcs.amr.receiveEntity.*;
import com.galaxis.rcs.ptr.receiveEntity.base.*; import com.galaxis.rcs.amr.receiveEntity.base.*;
import com.galaxis.rcs.ptr.sendEntity.*; import com.galaxis.rcs.amr.sendEntity.*;
import com.google.common.base.Splitter; import com.google.common.base.Splitter;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
@ -102,7 +102,7 @@ public class AmrMessageHandler {
int id = jw.asInt("id"); int id = jw.asInt("id");
String agvId = jw.asInt("content", "VehicleId") + ""; String agvId = jw.asInt("content", "VehicleId") + "";
int seqNo = jw.asInt("content", "SeqNo"); int seqNo = jw.asInt("content", "SeqNo");
PtrAgvItem agvItem = getPtrAgvItem(agvId); AmrAgvItem agvItem = getPtrAgvItem(agvId);
if (agvItem == null) { if (agvItem == null) {
return; return;
} }
@ -199,9 +199,9 @@ public class AmrMessageHandler {
} }
} }
public PtrAgvItem getPtrAgvItem(String vehicleId) { public AmrAgvItem getPtrAgvItem(String vehicleId) {
var executorItem = runtime.executorItemMap.get(vehicleId); var executorItem = runtime.executorItemMap.get(vehicleId);
return (PtrAgvItem) executorItem; return (AmrAgvItem) executorItem;
} }
@SneakyThrows @SneakyThrows
@ -416,7 +416,7 @@ public class AmrMessageHandler {
private final Map<String, Long> lastMessageTimeMap = Maps.newConcurrentMap(); private final Map<String, Long> lastMessageTimeMap = Maps.newConcurrentMap();
private final ScheduledExecutorService delayCalculator = Executors.newScheduledThreadPool(4); private final ScheduledExecutorService delayCalculator = Executors.newScheduledThreadPool(4);
private void handleHeartbeatMessage(PtrAgvItem agvItem, AmrHeartbeatMessage message) { private void handleHeartbeatMessage(AmrAgvItem agvItem, AmrHeartbeatMessage message) {
agvItem.handleHeartbeat(message); agvItem.handleHeartbeat(message);
// 计算延迟 // 计算延迟
@ -425,19 +425,19 @@ public class AmrMessageHandler {
updateRedisNetDelay(agvItem.getId(), netDelay); updateRedisNetDelay(agvItem.getId(), netDelay);
} }
private void handleAmrOnlineMessage(PtrAgvItem agvItem, AmrOnlineMessage message) { private void handleAmrOnlineMessage(AmrAgvItem agvItem, AmrOnlineMessage message) {
agvItem.handleOnlineEvent(); agvItem.handleOnlineEvent();
} }
private void handleAmrOfflineMessage(PtrAgvItem agvItem, AmrOfflineMessage message) { private void handleAmrOfflineMessage(AmrAgvItem agvItem, AmrOfflineMessage message) {
agvItem.handleOfflineEvent(); agvItem.handleOfflineEvent();
} }
private void handleTaskCompletedMessage(PtrAgvItem agvItem, AmrTaskCompletedMessage message) { private void handleTaskCompletedMessage(AmrAgvItem agvItem, AmrTaskCompletedMessage message) {
agvItem.taskCompleted(message.CurX, message.CurY, message.CurDirection, 4); agvItem.taskCompleted(message.CurX, message.CurY, message.CurDirection, 4);
} }
private void handleLandmarkMessage(PtrAgvItem agvItem, AmrLandmarkMessage message) { private void handleLandmarkMessage(AmrAgvItem agvItem, AmrLandmarkMessage message) {
// 这是源逻辑,CurLogicX / CurLogicY / CurDirection 需要到 PtrAgvItem 中更新, 因为要触发事件 // 这是源逻辑,CurLogicX / CurLogicY / CurDirection 需要到 PtrAgvItem 中更新, 因为要触发事件
agvItem.x = message.X; agvItem.x = message.X;
agvItem.y = message.Y; agvItem.y = message.Y;
@ -446,7 +446,7 @@ public class AmrMessageHandler {
agvItem.updatePosition(message.CurLogicX, message.CurLogicY, message.CurDirection); agvItem.updatePosition(message.CurLogicX, message.CurLogicY, message.CurDirection);
} }
private void handleStatusMessage(PtrAgvItem agvItem, AmrStatusMessage message) { private void handleStatusMessage(AmrAgvItem agvItem, AmrStatusMessage message) {
// 更新位置. TODO 貌似不包含 direction 信息 // 更新位置. TODO 貌似不包含 direction 信息
agvItem.updatePosition(message.CurLogicX, message.CurLogicY, agvItem.direction); agvItem.updatePosition(message.CurLogicX, message.CurLogicY, agvItem.direction);
@ -463,7 +463,7 @@ public class AmrMessageHandler {
agvItem.updateRedisStatus(); agvItem.updateRedisStatus();
} }
private void handleTaskStatusMessage(PtrAgvItem agvItem, JsonWrapper jw, String json) throws MqttException, JsonProcessingException { private void handleTaskStatusMessage(AmrAgvItem agvItem, JsonWrapper jw, String json) throws MqttException, JsonProcessingException {
int EventId = jw.asInt("content", "EventId"); int EventId = jw.asInt("content", "EventId");
// log.info("1-Received message: " + json); // log.info("1-Received message: " + json);
@ -517,14 +517,14 @@ public class AmrMessageHandler {
/** /**
* 注册心跳单元 * 注册心跳单元
*/ */
public void registeHeartBeatSet(PtrAgvItem ptrAgvItem) { public void registeHeartBeatSet(AmrAgvItem ptrAgvItem) {
this.heartBeatSet.add(ptrAgvItem.getId()); this.heartBeatSet.add(ptrAgvItem.getId());
} }
/** /**
* 注销心跳单元 * 注销心跳单元
*/ */
public void unregisteHeartBeatSet(PtrAgvItem ptrAgvItem) { public void unregisteHeartBeatSet(AmrAgvItem ptrAgvItem) {
this.heartBeatSet.remove(ptrAgvItem.getId()); this.heartBeatSet.remove(ptrAgvItem.getId());
} }

2
servo/src/main/java/com/galaxis/rcs/ptr/AmrTaskMode.java → servo/src/main/java/com/galaxis/rcs/amr/AmrTaskMode.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr; package com.galaxis.rcs.amr;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;

2
servo/src/main/java/com/galaxis/rcs/ptr/ArmMessageType.java → servo/src/main/java/com/galaxis/rcs/amr/ArmMessageType.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr; package com.galaxis.rcs.amr;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;

2
servo/src/main/java/com/galaxis/rcs/ptr/ControlMode.java → servo/src/main/java/com/galaxis/rcs/amr/ControlMode.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr; package com.galaxis.rcs.amr;
public enum ControlMode { public enum ControlMode {
FULL_AUTO, FULL_AUTO,

18
servo/src/main/java/com/galaxis/rcs/amr/FM600AgvItem.java

@ -0,0 +1,18 @@
package com.galaxis.rcs.amr;
import com.yvan.logisticsModel.LogisticsRuntime;
import lombok.extern.slf4j.Slf4j;
import java.util.*;
/**
* 侧叉式AGV执行器
*/
@Slf4j
public abstract class FM600AgvItem extends AmrAgvItem {
public FM600AgvItem(LogisticsRuntime logisticsRuntime, Map<String, Object> raw) {
super(logisticsRuntime, raw);
}
}

2
servo/src/main/java/com/galaxis/rcs/ptr/JacksonUtils.java → servo/src/main/java/com/galaxis/rcs/amr/JacksonUtils.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr; package com.galaxis.rcs.amr;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;

2
servo/src/main/java/com/galaxis/rcs/ptr/PosDirection.java → servo/src/main/java/com/galaxis/rcs/amr/PosDirection.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr; package com.galaxis.rcs.amr;
import com.galaxis.rcs.common.enums.LCCDirection; import com.galaxis.rcs.common.enums.LCCDirection;

38
servo/src/main/java/com/galaxis/rcs/amr/PtrAgvItem.java

@ -0,0 +1,38 @@
package com.galaxis.rcs.amr;
import com.galaxis.rcs.amr.sendEntity.RcsConfigMessage;
import com.yvan.logisticsModel.LogisticsRuntime;
import lombok.extern.slf4j.Slf4j;
import org.clever.core.json.JsonWrapper;
import java.util.*;
/**
* 侧叉式AGV执行器
*/
@Slf4j
public abstract class PtrAgvItem extends AmrAgvItem {
public PtrAgvItem(LogisticsRuntime logisticsRuntime, Map<String, Object> raw) {
super(logisticsRuntime, raw);
}
@Override
public RcsConfigMessage getConfig() {
var content = new RcsConfigMessage(this.runtime);
content.SeqNo = this.amrMessageHandler.getNewSeqNo();
content.XLength = 1000;
content.YLength = 1000;
content.Gap = 1000;
content.HeartBeat = 60;
content.MqRetryTime = 3;
return content;
}
@Override
public void handelDeviceTask(List<AmrDeviceTask> deviceTaskList) {
deviceTaskQueue.addAll(deviceTaskList);
String json = JsonWrapper.toJson(deviceTaskList);
log.info("ptr-deviceTaskList: {}", json);
}
}

6
servo/src/main/java/com/galaxis/rcs/ptr/PtrMqttClient.java → servo/src/main/java/com/galaxis/rcs/amr/PtrMqttClient.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr; package com.galaxis.rcs.amr;
import com.yvan.logisticsEnv.EnvConfig; import com.yvan.logisticsEnv.EnvConfig;
import lombok.SneakyThrows; import lombok.SneakyThrows;
@ -39,9 +39,9 @@ public class PtrMqttClient implements MqttCallback {
options.setAutomaticReconnect(true); options.setAutomaticReconnect(true);
options.setUserName(username); options.setUserName(username);
options.setPassword(password.getBytes()); options.setPassword(password.getBytes());
options.setConnectionTimeout(1); options.setConnectionTimeout(5000);
options.setKeepAliveInterval(20); options.setKeepAliveInterval(20);
options.setExecutorServiceTimeout(1); options.setExecutorServiceTimeout(5000);
client.setCallback(this); client.setCallback(this);
client.connect(options); client.connect(options);

2
servo/src/main/java/com/galaxis/rcs/ptr/RcsMessageType.java → servo/src/main/java/com/galaxis/rcs/amr/RcsMessageType.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr; package com.galaxis.rcs.amr;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;

4
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/AmrAckMessage.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrAckMessage.java

@ -1,7 +1,7 @@
package com.galaxis.rcs.ptr.receiveEntity; package com.galaxis.rcs.amr.receiveEntity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.galaxis.rcs.ptr.receiveEntity.base.AmrCommonMessage; import com.galaxis.rcs.amr.receiveEntity.base.AmrCommonMessage;
// 消息应答 20050 // 消息应答 20050
//@Data //@Data

4
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/AmrAppStartMessage.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrAppStartMessage.java

@ -1,7 +1,7 @@
package com.galaxis.rcs.ptr.receiveEntity; package com.galaxis.rcs.amr.receiveEntity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.galaxis.rcs.ptr.receiveEntity.base.AmrCommonMessage; import com.galaxis.rcs.amr.receiveEntity.base.AmrCommonMessage;
// 小车主程序启动 20149 // 小车主程序启动 20149
//@Data //@Data

4
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/AmrBootMessage.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrBootMessage.java

@ -1,7 +1,7 @@
package com.galaxis.rcs.ptr.receiveEntity; package com.galaxis.rcs.amr.receiveEntity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.galaxis.rcs.ptr.receiveEntity.base.AmrCommonMessage; import com.galaxis.rcs.amr.receiveEntity.base.AmrCommonMessage;
// 开机上报 20147 在开机后上报一次,此后AMR程序重启不会重新上报(与ID#20149的差异),除非人为清除内部记录已上报的标志。 // 开机上报 20147 在开机后上报一次,此后AMR程序重启不会重新上报(与ID#20149的差异),除非人为清除内部记录已上报的标志。
//@Data //@Data

4
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/AmrExceptionMessage.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrExceptionMessage.java

@ -1,7 +1,7 @@
package com.galaxis.rcs.ptr.receiveEntity; package com.galaxis.rcs.amr.receiveEntity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.galaxis.rcs.ptr.receiveEntity.base.AmrCommonMessage; import com.galaxis.rcs.amr.receiveEntity.base.AmrCommonMessage;
import java.util.Map; import java.util.Map;

4
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/AmrHeartbeatMessage.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrHeartbeatMessage.java

@ -1,7 +1,7 @@
package com.galaxis.rcs.ptr.receiveEntity; package com.galaxis.rcs.amr.receiveEntity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.galaxis.rcs.ptr.receiveEntity.base.AmrCommonMessage; import com.galaxis.rcs.amr.receiveEntity.base.AmrCommonMessage;
//心跳 20100 //心跳 20100
//@Data //@Data

4
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/AmrLandmarkMessage.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrLandmarkMessage.java

@ -1,7 +1,7 @@
package com.galaxis.rcs.ptr.receiveEntity; package com.galaxis.rcs.amr.receiveEntity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.galaxis.rcs.ptr.receiveEntity.base.AmrCommonMessage; import com.galaxis.rcs.amr.receiveEntity.base.AmrCommonMessage;
// 地标报告 20020 // 地标报告 20020
//@Data //@Data

4
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/AmrModuleTaskStatusMessage.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrModuleTaskStatusMessage.java

@ -1,7 +1,7 @@
package com.galaxis.rcs.ptr.receiveEntity; package com.galaxis.rcs.amr.receiveEntity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.galaxis.rcs.ptr.receiveEntity.base.AmrCommonMessage; import com.galaxis.rcs.amr.receiveEntity.base.AmrCommonMessage;
// 小车子模块任务状态 20012 // 小车子模块任务状态 20012
//@Data //@Data

4
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/AmrOfflineMessage.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrOfflineMessage.java

@ -1,7 +1,7 @@
package com.galaxis.rcs.ptr.receiveEntity; package com.galaxis.rcs.amr.receiveEntity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.galaxis.rcs.ptr.receiveEntity.base.AmrCommonMessage; import com.galaxis.rcs.amr.receiveEntity.base.AmrCommonMessage;
// 小车离线 20200 注意:目前未实现此报文 // 小车离线 20200 注意:目前未实现此报文
//@Data //@Data

4
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/AmrOnlineMessage.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrOnlineMessage.java

@ -1,7 +1,7 @@
package com.galaxis.rcs.ptr.receiveEntity; package com.galaxis.rcs.amr.receiveEntity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.galaxis.rcs.ptr.receiveEntity.base.AmrCommonMessage; import com.galaxis.rcs.amr.receiveEntity.base.AmrCommonMessage;
// 小车上线 20150 代表车已经完成初始化,可以接收任务了。 // 小车上线 20150 代表车已经完成初始化,可以接收任务了。
//@Data //@Data

4
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/AmrShutdownMessage.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrShutdownMessage.java

@ -1,7 +1,7 @@
package com.galaxis.rcs.ptr.receiveEntity; package com.galaxis.rcs.amr.receiveEntity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.galaxis.rcs.ptr.receiveEntity.base.AmrCommonMessage; import com.galaxis.rcs.amr.receiveEntity.base.AmrCommonMessage;
// 关机上报 20148 在收到关机信号后上报此消息。 // 关机上报 20148 在收到关机信号后上报此消息。
//@Data //@Data

8
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/AmrStatusMessage.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrStatusMessage.java

@ -1,9 +1,9 @@
package com.galaxis.rcs.ptr.receiveEntity; package com.galaxis.rcs.amr.receiveEntity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.galaxis.rcs.ptr.receiveEntity.base.AmrCommonMessage; import com.galaxis.rcs.amr.receiveEntity.base.AmrCommonMessage;
import com.galaxis.rcs.ptr.receiveEntity.base.CurBatteryData; import com.galaxis.rcs.amr.receiveEntity.base.CurBatteryData;
import com.galaxis.rcs.ptr.receiveEntity.base.LocationData; import com.galaxis.rcs.amr.receiveEntity.base.LocationData;
// 状态上报 20060 // 状态上报 20060
//@Data //@Data

8
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/AmrTaskCompletedMessage.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrTaskCompletedMessage.java

@ -1,9 +1,9 @@
package com.galaxis.rcs.ptr.receiveEntity; package com.galaxis.rcs.amr.receiveEntity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.galaxis.rcs.ptr.receiveEntity.base.AmrCommonMessage; import com.galaxis.rcs.amr.receiveEntity.base.AmrCommonMessage;
import com.galaxis.rcs.ptr.receiveEntity.base.LocationData; import com.galaxis.rcs.amr.receiveEntity.base.LocationData;
import com.galaxis.rcs.ptr.receiveEntity.base.SummaryData; import com.galaxis.rcs.amr.receiveEntity.base.SummaryData;
// 小车作业完成 20010 // 小车作业完成 20010
//@Data //@Data

4
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/AmrTaskStatusMessage.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/AmrTaskStatusMessage.java

@ -1,7 +1,7 @@
package com.galaxis.rcs.ptr.receiveEntity; package com.galaxis.rcs.amr.receiveEntity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.galaxis.rcs.ptr.receiveEntity.base.AmrCommonMessage; import com.galaxis.rcs.amr.receiveEntity.base.AmrCommonMessage;
//@Data //@Data
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)

2
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/base/AmrCommonMessage.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/AmrCommonMessage.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr.receiveEntity.base; package com.galaxis.rcs.amr.receiveEntity.base;
import lombok.Data; import lombok.Data;

2
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/base/CurBatteryData.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/CurBatteryData.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr.receiveEntity.base; package com.galaxis.rcs.amr.receiveEntity.base;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data; import lombok.Data;

2
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/base/GoodsData.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/GoodsData.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr.receiveEntity.base; package com.galaxis.rcs.amr.receiveEntity.base;
import lombok.Data; import lombok.Data;

2
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/base/LocationData.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/LocationData.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr.receiveEntity.base; package com.galaxis.rcs.amr.receiveEntity.base;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data; import lombok.Data;

2
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/base/OffsetPosition.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/OffsetPosition.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr.receiveEntity.base; package com.galaxis.rcs.amr.receiveEntity.base;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data; import lombok.Data;

2
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/base/SummaryData.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/SummaryData.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr.receiveEntity.base; package com.galaxis.rcs.amr.receiveEntity.base;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

2
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/base/TaskCompletedData.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/TaskCompletedData.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr.receiveEntity.base; package com.galaxis.rcs.amr.receiveEntity.base;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data; import lombok.Data;

2
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/base/TaskModeChangeData.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/TaskModeChangeData.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr.receiveEntity.base; package com.galaxis.rcs.amr.receiveEntity.base;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data; import lombok.Data;

2
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/base/TaskStatusChangeData.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/TaskStatusChangeData.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr.receiveEntity.base; package com.galaxis.rcs.amr.receiveEntity.base;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data; import lombok.Data;

2
servo/src/main/java/com/galaxis/rcs/ptr/receiveEntity/base/TaskTypeChangeData.java → servo/src/main/java/com/galaxis/rcs/amr/receiveEntity/base/TaskTypeChangeData.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr.receiveEntity.base; package com.galaxis.rcs.amr.receiveEntity.base;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data; import lombok.Data;

2
servo/src/main/java/com/galaxis/rcs/ptr/sendEntity/BaseMessage.java → servo/src/main/java/com/galaxis/rcs/amr/sendEntity/BaseMessage.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr.sendEntity; package com.galaxis.rcs.amr.sendEntity;
public class BaseMessage { public class BaseMessage {
public int id; public int id;

2
servo/src/main/java/com/galaxis/rcs/ptr/sendEntity/RcsAckMessage.java → servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsAckMessage.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr.sendEntity; package com.galaxis.rcs.amr.sendEntity;
// 电文应答 10050 // 电文应答 10050
public class RcsAckMessage { public class RcsAckMessage {

2
servo/src/main/java/com/galaxis/rcs/ptr/sendEntity/RcsCancelTaskMessage.java → servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsCancelTaskMessage.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr.sendEntity; package com.galaxis.rcs.amr.sendEntity;
// 取消已下发小车任务 10120 // 取消已下发小车任务 10120
public class RcsCancelTaskMessage { public class RcsCancelTaskMessage {

4
servo/src/main/java/com/galaxis/rcs/ptr/sendEntity/RcsConfigMessage.java → servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsConfigMessage.java

@ -1,6 +1,6 @@
package com.galaxis.rcs.ptr.sendEntity; package com.galaxis.rcs.amr.sendEntity;
import com.galaxis.rcs.ptr.AmrMessageHandler; import com.galaxis.rcs.amr.AmrMessageHandler;
import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.LogisticsRuntime;
//配置信息 10060 //配置信息 10060

4
servo/src/main/java/com/galaxis/rcs/ptr/sendEntity/RcsControlDoorMessage.java → servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsControlDoorMessage.java

@ -1,6 +1,6 @@
package com.galaxis.rcs.ptr.sendEntity; package com.galaxis.rcs.amr.sendEntity;
import com.galaxis.rcs.ptr.AmrMessageHandler; import com.galaxis.rcs.amr.AmrMessageHandler;
import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.LogisticsRuntime;
// 控制卷帘门 10082 // 控制卷帘门 10082

2
servo/src/main/java/com/galaxis/rcs/ptr/sendEntity/RcsHeartBeatMessage.java → servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsHeartBeatMessage.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.ptr.sendEntity; package com.galaxis.rcs.amr.sendEntity;
// 心跳 10100 // 心跳 10100
public class RcsHeartBeatMessage { public class RcsHeartBeatMessage {

4
servo/src/main/java/com/galaxis/rcs/ptr/sendEntity/RcsQueryStatusMessage.java → servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsQueryStatusMessage.java

@ -1,6 +1,6 @@
package com.galaxis.rcs.ptr.sendEntity; package com.galaxis.rcs.amr.sendEntity;
import com.galaxis.rcs.ptr.AmrMessageHandler; import com.galaxis.rcs.amr.AmrMessageHandler;
import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.LogisticsRuntime;
//状态查询 10110 //状态查询 10110

4
servo/src/main/java/com/galaxis/rcs/ptr/sendEntity/RcsRotateBodyMessage.java → servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsRotateBodyMessage.java

@ -1,6 +1,6 @@
package com.galaxis.rcs.ptr.sendEntity; package com.galaxis.rcs.amr.sendEntity;
import com.galaxis.rcs.ptr.AmrMessageHandler; import com.galaxis.rcs.amr.AmrMessageHandler;
import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.LogisticsRuntime;
//旋转车身 10081 //旋转车身 10081

4
servo/src/main/java/com/galaxis/rcs/ptr/sendEntity/RcsRotateRackMessage.java → servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsRotateRackMessage.java

@ -1,6 +1,6 @@
package com.galaxis.rcs.ptr.sendEntity; package com.galaxis.rcs.amr.sendEntity;
import com.galaxis.rcs.ptr.AmrMessageHandler; import com.galaxis.rcs.amr.AmrMessageHandler;
import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.LogisticsRuntime;
//旋转货架 10080 //旋转货架 10080

4
servo/src/main/java/com/galaxis/rcs/ptr/sendEntity/RcsSRMessage.java → servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsSRMessage.java

@ -1,6 +1,6 @@
package com.galaxis.rcs.ptr.sendEntity; package com.galaxis.rcs.amr.sendEntity;
import com.galaxis.rcs.ptr.AmrMessageHandler; import com.galaxis.rcs.amr.AmrMessageHandler;
import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.LogisticsRuntime;
// 停止/解除 10040 // 停止/解除 10040

4
servo/src/main/java/com/galaxis/rcs/ptr/sendEntity/RcsSetLocationMessage.java → servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsSetLocationMessage.java

@ -1,6 +1,6 @@
package com.galaxis.rcs.ptr.sendEntity; package com.galaxis.rcs.amr.sendEntity;
import com.galaxis.rcs.ptr.AmrMessageHandler; import com.galaxis.rcs.amr.AmrMessageHandler;
// 设置小车坐标 10200 // 设置小车坐标 10200
public class RcsSetLocationMessage { public class RcsSetLocationMessage {

4
servo/src/main/java/com/galaxis/rcs/ptr/sendEntity/RcsTaskMessage.java → servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsTaskMessage.java

@ -1,6 +1,6 @@
package com.galaxis.rcs.ptr.sendEntity; package com.galaxis.rcs.amr.sendEntity;
import com.galaxis.rcs.ptr.AmrMessageHandler; import com.galaxis.rcs.amr.AmrMessageHandler;
import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.LogisticsRuntime;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;

4
servo/src/main/java/com/galaxis/rcs/ptr/sendEntity/RcsWaitMessage.java → servo/src/main/java/com/galaxis/rcs/amr/sendEntity/RcsWaitMessage.java

@ -1,6 +1,6 @@
package com.galaxis.rcs.ptr.sendEntity; package com.galaxis.rcs.amr.sendEntity;
import com.galaxis.rcs.ptr.AmrMessageHandler; import com.galaxis.rcs.amr.AmrMessageHandler;
import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.LogisticsRuntime;
public class RcsWaitMessage { public class RcsWaitMessage {

20
servo/src/main/java/com/galaxis/rcs/connector/cl2/Cl2DeviceConnector.java → servo/src/main/java/com/galaxis/rcs/connector/amr/AmrDeviceConnector.java

@ -1,29 +1,23 @@
package com.galaxis.rcs.connector.cl2; package com.galaxis.rcs.connector.amr;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.galaxis.rcs.ptr.sendEntity.RcsTaskMessage; import com.galaxis.rcs.amr.AmrMessageHandler;
import com.galaxis.rcs.ptr.AmrMessageHandler; import com.galaxis.rcs.amr.sendEntity.RcsTaskMessage;
import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.LogisticsRuntime;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.mqttv5.common.MqttException; import org.eclipse.paho.mqttv5.common.MqttException;
/**
* CL2 车型报文推送
*/
@Slf4j @Slf4j
public class Cl2DeviceConnector { public class AmrDeviceConnector {
private final AmrMessageHandler amrMessageHandler; public final AmrMessageHandler amrMessageHandler;
public AmrDeviceConnector(LogisticsRuntime runtime) {
public Cl2DeviceConnector(LogisticsRuntime runtime) {
this.amrMessageHandler = runtime.amrMessageHandler; this.amrMessageHandler = runtime.amrMessageHandler;
} }
public void sendTask(String vehicleId, RcsTaskMessage rcsTaskMessage) throws MqttException, JsonProcessingException { public void sendTask(String vehicleId, RcsTaskMessage rcsTaskMessage) throws MqttException, JsonProcessingException {
// var list = Splitter.on("\n").splitToList(JsonWrapper.toJsonPretty(rcsTaskMessage)); // var list = Splitter.on("\n").splitToList(JsonWrapper.toJsonPretty(rcsTaskMessage));
// String[] ar = new String[list.size()]; // String[] ar = new String[list.size()];
// list.toArray(ar); // list.toArray(ar);
// BannerUtils.printConfig(log, "CL2 发送报文", ar); // BannerUtils.printConfig(log, "Amr 发送报文", ar);
amrMessageHandler.sendCmdTask(vehicleId, rcsTaskMessage); amrMessageHandler.sendCmdTask(vehicleId, rcsTaskMessage);
} }
} }

22
servo/src/main/java/com/galaxis/rcs/connector/amr/PtrDeviceConnector.java

@ -0,0 +1,22 @@
package com.galaxis.rcs.connector.amr;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.galaxis.rcs.amr.AmrMessageHandler;
import com.galaxis.rcs.amr.sendEntity.RcsTaskMessage;
import com.yvan.logisticsModel.LogisticsRuntime;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.mqttv5.common.MqttException;
@Slf4j
public class PtrDeviceConnector extends AmrDeviceConnector {
public PtrDeviceConnector(LogisticsRuntime runtime) {
super(runtime);
}
public void sendTask(String vehicleId, RcsTaskMessage rcsTaskMessage) throws MqttException, JsonProcessingException {
// var list = Splitter.on("\n").splitToList(JsonWrapper.toJsonPretty(rcsTaskMessage));
// String[] ar = new String[list.size()];
// list.toArray(ar);
// BannerUtils.printConfig(log, "Amr 发送报文", ar);
amrMessageHandler.sendCmdTask(vehicleId, rcsTaskMessage);
}
}

19
servo/src/main/java/com/galaxis/rcs/connector/amr/cl2/Cl2DeviceConnector.java

@ -0,0 +1,19 @@
package com.galaxis.rcs.connector.amr.cl2;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.galaxis.rcs.amr.sendEntity.RcsTaskMessage;
import com.galaxis.rcs.amr.AmrMessageHandler;
import com.galaxis.rcs.connector.amr.AmrDeviceConnector;
import com.yvan.logisticsModel.LogisticsRuntime;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.mqttv5.common.MqttException;
/**
* CL2 车型报文推送
*/
@Slf4j
public class Cl2DeviceConnector extends AmrDeviceConnector {
public Cl2DeviceConnector(LogisticsRuntime runtime) {
super(runtime);
}
}

18
servo/src/main/java/com/galaxis/rcs/connector/cl2/Cl2Item.java → servo/src/main/java/com/galaxis/rcs/connector/amr/cl2/Cl2Item.java

@ -1,11 +1,16 @@
package com.galaxis.rcs.connector.cl2; package com.galaxis.rcs.connector.amr.cl2;
import com.galaxis.rcs.ptr.sendEntity.RcsConfigMessage; import com.galaxis.rcs.amr.AmrDeviceTask;
import com.galaxis.rcs.amr.sendEntity.RcsConfigMessage;
import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.LogisticsRuntime;
import com.galaxis.rcs.ptr.PtrAgvItem; import com.galaxis.rcs.amr.PtrAgvItem;
import lombok.extern.slf4j.Slf4j;
import org.clever.core.json.JsonWrapper;
import java.util.List;
import java.util.Map; import java.util.Map;
@Slf4j
public class Cl2Item extends PtrAgvItem { public class Cl2Item extends PtrAgvItem {
public Cl2Item(LogisticsRuntime logisticsRuntime, Map<String, Object> raw) { public Cl2Item(LogisticsRuntime logisticsRuntime, Map<String, Object> raw) {
@ -23,4 +28,11 @@ public class Cl2Item extends PtrAgvItem {
content.MqRetryTime = 3; content.MqRetryTime = 3;
return content; return content;
} }
@Override
public void handelDeviceTask(List<AmrDeviceTask> deviceTaskList) {
deviceTaskQueue.addAll(deviceTaskList);
String json = JsonWrapper.toJson(deviceTaskList);
log.info("cl-deviceTaskList: {}", json);
}
} }

4
servo/src/main/java/com/galaxis/rcs/connector/amr/cl2/Cl2TaskManger.java

@ -0,0 +1,4 @@
package com.galaxis.rcs.connector.amr.cl2;
public class Cl2TaskManger {
}

2
servo/src/main/java/com/galaxis/rcs/connector/cl2/VirtualCl2Connector.java → servo/src/main/java/com/galaxis/rcs/connector/amr/cl2/VirtualCl2Connector.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.connector.cl2; package com.galaxis.rcs.connector.amr.cl2;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

4
servo/src/main/java/com/galaxis/rcs/connector/amr/clx/ClxConnector.java

@ -0,0 +1,4 @@
package com.galaxis.rcs.connector.amr.clx;
public interface ClxConnector {
}

4
servo/src/main/java/com/galaxis/rcs/connector/amr/clx/ClxConnectorImp.java

@ -0,0 +1,4 @@
package com.galaxis.rcs.connector.amr.clx;
public class ClxConnectorImp {
}

2
servo/src/main/java/com/galaxis/rcs/connector/clx/VirtualClxConnector.java → servo/src/main/java/com/galaxis/rcs/connector/amr/clx/VirtualClxConnector.java

@ -1,4 +1,4 @@
package com.galaxis.rcs.connector.clx; package com.galaxis.rcs.connector.amr.clx;
/** /**
* @author cwj * @author cwj

20
servo/src/main/java/com/galaxis/rcs/connector/amr/fm600/Fm600DeviceConnector.java

@ -0,0 +1,20 @@
package com.galaxis.rcs.connector.amr.fm600;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.galaxis.rcs.amr.sendEntity.RcsTaskMessage;
import com.galaxis.rcs.amr.AmrMessageHandler;
import com.galaxis.rcs.connector.amr.AmrDeviceConnector;
import com.yvan.logisticsModel.LogisticsRuntime;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.mqttv5.common.MqttException;
/**
* CL2 车型报文推送
*/
@Slf4j
public class Fm600DeviceConnector extends AmrDeviceConnector {
public Fm600DeviceConnector(LogisticsRuntime runtime) {
super(runtime);
}
}

57
servo/src/main/java/com/galaxis/rcs/connector/amr/fm600/Fm600Item.java

@ -0,0 +1,57 @@
package com.galaxis.rcs.connector.amr.fm600;
import com.galaxis.rcs.amr.AmrAgvItem;
import com.galaxis.rcs.amr.AmrDeviceTask;
import com.galaxis.rcs.amr.sendEntity.RcsConfigMessage;
import com.yvan.logisticsModel.LogisticsRuntime;
import com.galaxis.rcs.amr.PtrAgvItem;
import lombok.extern.slf4j.Slf4j;
import org.clever.core.json.JsonWrapper;
import java.util.List;
import java.util.Map;
@Slf4j
public class Fm600Item extends AmrAgvItem {
public Fm600Item(LogisticsRuntime logisticsRuntime, Map<String, Object> raw) {
super(logisticsRuntime, raw);
}
@Override
public RcsConfigMessage getConfig() {
var content = new RcsConfigMessage(this.runtime);
content.SeqNo = this.amrMessageHandler.getNewSeqNo();
content.XLength = 1000;
content.YLength = 1000;
content.Gap = 1000;
content.HeartBeat = 60;
content.MqRetryTime = 3;
return content;
}
@Override
public void handelDeviceTask(List<AmrDeviceTask> deviceTaskList) {
// 将移载任务转换为装载任务
for (int i = deviceTaskList.size() - 1; i >= 0; i--) {
AmrDeviceTask d = deviceTaskList.get(i);
if (d.operationType == COperationType.transplantLoadAndUnload) {
if (d.pickMode == CPickMode.load) {
d.operationType = COperationType.load;
} else if (d.pickMode == CPickMode.unload) {
d.operationType = COperationType.unload;
}
d.goodsSlotDirection = null;
d.pickMode = null;
d.goodsSlotHeight = null;
// 临时处理方案
d.storageRacksNo = "any";
}
}
deviceTaskQueue.addAll(deviceTaskList);
String json = JsonWrapper.toJson(deviceTaskList);
log.info("fm600-deviceTaskList: {}", json);
}
}

4
servo/src/main/java/com/galaxis/rcs/connector/amr/fm600/Fm600TaskManger.java

@ -0,0 +1,4 @@
package com.galaxis.rcs.connector.amr.fm600;
public class Fm600TaskManger {
}

8
servo/src/main/java/com/galaxis/rcs/connector/amr/fm600/VirtualFm600Connector.java

@ -0,0 +1,8 @@
package com.galaxis.rcs.connector.amr.fm600;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class VirtualFm600Connector {
}

4
servo/src/main/java/com/galaxis/rcs/connector/cl2/Cl2TaskManger.java

@ -1,4 +0,0 @@
package com.galaxis.rcs.connector.cl2;
public class Cl2TaskManger {
}

4
servo/src/main/java/com/galaxis/rcs/connector/clx/ClxConnector.java

@ -1,4 +0,0 @@
package com.galaxis.rcs.connector.clx;
public interface ClxConnector {
}

4
servo/src/main/java/com/galaxis/rcs/connector/clx/ClxConnectorImp.java

@ -1,4 +0,0 @@
package com.galaxis.rcs.connector.clx;
public class ClxConnectorImp {
}

20
servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java

@ -8,8 +8,11 @@ import com.galaxis.rcs.common.enums.PlanTaskType;
import com.google.common.base.Joiner; import com.google.common.base.Joiner;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.yvan.entity.BasLocationVo; import com.yvan.entity.BasLocationVo;
import com.yvan.logisticsModel.ExecutorItem;
import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.LogisticsRuntime;
import com.yvan.logisticsModel.LogisticsRuntimeService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.clever.core.Conv;
import org.clever.core.id.SnowFlake; import org.clever.core.id.SnowFlake;
import org.clever.core.json.JsonWrapper; import org.clever.core.json.JsonWrapper;
@ -37,6 +40,7 @@ public class PlanTaskSequence {
public BasLocationVo unloadBasLocationVo; public BasLocationVo unloadBasLocationVo;
public BasLocationVo executorVo; public BasLocationVo executorVo;
public int carryQty; public int carryQty;
public RcsTaskOption option;
public PlanTaskSequence(String executorId, LogisticsRuntime logisticsRuntime, RcsTaskBiz bizTask, String createBy) { public PlanTaskSequence(String executorId, LogisticsRuntime logisticsRuntime, RcsTaskBiz bizTask, String createBy) {
this.executorId = executorId; this.executorId = executorId;
@ -63,6 +67,10 @@ public class PlanTaskSequence {
return planTask; return planTask;
} }
public ExecutorItem getAgv() {
return this.logisticsRuntime.executorItemMap.get(this.executorId);
}
// 添加移动到指定路标点的动作 // 添加移动到指定路标点的动作
public RcsTaskPlan addMoveTo(String waypointId) { public RcsTaskPlan addMoveTo(String waypointId) {
RcsTaskPlan task = this.createTaskPlanEntity(PlanTaskType.MOVE.toString()); RcsTaskPlan task = this.createTaskPlanEntity(PlanTaskType.MOVE.toString());
@ -203,6 +211,18 @@ public class PlanTaskSequence {
return this.taskList.size(); return this.taskList.size();
} }
public double getLoadHeight() {
return this.option.loadHeight;
}
public double getUnloadHeight() {
return this.option.unloadHeight;
}
public boolean noInv() {
return this.option.noInv;
}
public int completedCount() { public int completedCount() {
int count = 0; int count = 0;
for (RcsTaskPlan task : taskList) { for (RcsTaskPlan task : taskList) {

33
servo/src/main/java/com/galaxis/rcs/plan/RcsTaskOption.java

@ -0,0 +1,33 @@
package com.galaxis.rcs.plan;
public class RcsTaskOption {
/**
* 任务优先级
*/
public int priority = 1;
/**
* 强制开始路径点
*/
public String forceStartWayPointId;
/**
* 强制开始方向必须使用 LCCDirection.fromString 可以转换
*/
public String forceStartDirection;
/**
* 搬运高度
*/
public double loadHeight = 0d;
/**
* 卸货高度
*/
public double unloadHeight = 0d;
/**
* 禁止记录库存
*/
public boolean noInv = false;
}

7
servo/src/main/java/com/galaxis/rcs/plan/path/PathUtils.java

@ -1,6 +1,7 @@
package com.galaxis.rcs.plan.path; package com.galaxis.rcs.plan.path;
import com.galaxis.rcs.common.enums.LCCDirection; import com.galaxis.rcs.common.enums.LCCDirection;
import com.galaxis.rcs.plan.PlanTaskSequence;
import java.util.*; import java.util.*;
@ -150,8 +151,12 @@ public class PathUtils {
/** /**
* 转换货位方向到AGV所需方向 * 转换货位方向到AGV所需方向
*/ */
public static LCCDirection convertStoreDirection(LCCDirection storeDirection) { public static LCCDirection convertStoreDirection(PlanTaskSequence plan, LCCDirection storeDirection) {
// 转换规则: 货位在路径点的方位 -> AGV所需方向 // 转换规则: 货位在路径点的方位 -> AGV所需方向
if (plan.getAgv().t.toLowerCase().startsWith("fm") || plan.getAgv().t.toLowerCase().startsWith("fit")) {
// if qianfu AGV
return storeDirection;
}
return switch (storeDirection) { return switch (storeDirection) {
case UP -> LCCDirection.RIGHT; // 货位在上方 → 车头向右 case UP -> LCCDirection.RIGHT; // 货位在上方 → 车头向右
case DOWN -> LCCDirection.LEFT; // 货位在下方 → 车头向左 case DOWN -> LCCDirection.LEFT; // 货位在下方 → 车头向左

32
servo/src/main/java/com/galaxis/rcs/plan/path/PtrPathPlanner.java

@ -9,6 +9,7 @@ import com.yvan.logisticsModel.StaticItem;
import org.clever.core.Conv; import org.clever.core.Conv;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import static com.galaxis.rcs.plan.path.PathUtils.convertStoreDirection; import static com.galaxis.rcs.plan.path.PathUtils.convertStoreDirection;
@ -77,7 +78,7 @@ public class PtrPathPlanner {
// 取货点 // 取货点
String loadRackId = task.from().rackId(); String loadRackId = task.from().rackId();
int pickupBay = task.from().bay(); int pickupBay = task.from().bay();
List<NodeDirection> loadNodeDirectionList = findNodeForStore(loadRackId, pickupBay); List<NodeDirection> loadNodeDirectionList = findNodeForStore(plan, loadRackId, pickupBay, startNodeId, startDirection);
if (loadNodeDirectionList.isEmpty()) { if (loadNodeDirectionList.isEmpty()) {
throw new RuntimeException("Pickup node not found for rackId=" + loadRackId + ", bay=" + pickupBay); throw new RuntimeException("Pickup node not found for rackId=" + loadRackId + ", bay=" + pickupBay);
} }
@ -85,7 +86,7 @@ public class PtrPathPlanner {
// 放货点 // 放货点
String unloadRackId = task.to().rackId(); String unloadRackId = task.to().rackId();
int unloadBay = task.to().bay(); int unloadBay = task.to().bay();
List<NodeDirection> unloadNodeDirectionList = findNodeForStore(unloadRackId, unloadBay); List<NodeDirection> unloadNodeDirectionList = findNodeForStore(plan, unloadRackId, unloadBay, null, null);
if (unloadNodeDirectionList.isEmpty()) { if (unloadNodeDirectionList.isEmpty()) {
throw new RuntimeException("Drop node not found for rackId=" + unloadRackId + ", bay=" + unloadBay); throw new RuntimeException("Drop node not found for rackId=" + unloadRackId + ", bay=" + unloadBay);
} }
@ -143,7 +144,7 @@ public class PtrPathPlanner {
// 放货点 // 放货点
String unloadRackId = task.to().rackId(); String unloadRackId = task.to().rackId();
int unloadBay = task.to().bay(); int unloadBay = task.to().bay();
var unloadNodeDirectionList = findNodeForStore(unloadRackId, unloadBay); var unloadNodeDirectionList = findNodeForStore(plan, unloadRackId, unloadBay, startNodeId, startDirection);
if (unloadNodeDirectionList.isEmpty()) { if (unloadNodeDirectionList.isEmpty()) {
throw new RuntimeException("Drop node not found for rackId=" + unloadRackId + ", bay=" + unloadBay); throw new RuntimeException("Drop node not found for rackId=" + unloadRackId + ", bay=" + unloadBay);
} }
@ -190,7 +191,7 @@ public class PtrPathPlanner {
// 放货点 // 放货点
String loadRackId = task.to().rackId(); String loadRackId = task.to().rackId();
int unloadBay = task.to().bay(); int unloadBay = task.to().bay();
var loadNodeDirectionList = findNodeForStore(loadRackId, unloadBay); var loadNodeDirectionList = findNodeForStore(plan, loadRackId, unloadBay, startNodeId, startDirection);
if (loadNodeDirectionList.isEmpty()) { if (loadNodeDirectionList.isEmpty()) {
throw new RuntimeException("Drop node not found for rackId=" + loadRackId + ", bay=" + unloadBay); throw new RuntimeException("Drop node not found for rackId=" + loadRackId + ", bay=" + unloadBay);
} }
@ -230,17 +231,36 @@ public class PtrPathPlanner {
plan.addFinish(); plan.addFinish();
} }
private List<NodeDirection> findNodeForStore(String storeId, int bay) { private List<NodeDirection> findNodeForStore(PlanTaskSequence plan, String storeId, int bay, String startNodeId, LCCDirection startDirection) {
List<Node> nodes = this.graph.getNodesForStore(storeId); List<Node> nodes = this.graph.getNodesForStore(storeId);
List<NodeDirection> results = Lists.newArrayList(); List<NodeDirection> results = Lists.newArrayList();
for (Node node : nodes) { for (Node node : nodes) {
for (StoreLink link : node.storeLinks()) { for (StoreLink link : node.storeLinks()) {
if (link.storeId().equals(storeId) && link.bay() == bay) { if (link.storeId().equals(storeId) && link.bay() == bay) {
LCCDirection agvDirection = convertStoreDirection(link.direction()); LCCDirection agvDirection = convertStoreDirection(plan, link.direction());
results.add(new NodeDirection(node, agvDirection)); results.add(new NodeDirection(node, agvDirection));
} }
} }
} }
// 就地取货逻辑,当前车所在的位置,就是能取货的位置,就不要再跑去别的地方取货了;
// 如果 startNodeId 和 startDirection 有值,并且 results 结果中包含 startNodeId/startDirection ,那么只保留 startNodeId/startDirection 的结果
if (startNodeId != null && startDirection != null) {
boolean matchSelfOnly = false;
for (NodeDirection nd : results) {
if (nd.node().id().equals(startNodeId) && nd.direction() == startDirection) {
matchSelfOnly = true;
break;
}
}
if (matchSelfOnly) {
return results.stream().filter(nd -> nd.node().id().equals(startNodeId) && nd.direction() == startDirection)
.collect(Collectors.toList());
}
}
return results; return results;
} }

5
servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvConnector.java

@ -1,5 +0,0 @@
package com.galaxis.rcs.ptr;
public abstract class PtrAgvConnector {
}

2
servo/src/main/java/com/yvan/entity/AgvStatusVo.java

@ -3,7 +3,7 @@ package com.yvan.entity;
import com.galaxis.rcs.common.enums.BizTaskStatus; import com.galaxis.rcs.common.enums.BizTaskStatus;
import com.galaxis.rcs.common.enums.BizTaskType; import com.galaxis.rcs.common.enums.BizTaskType;
import com.galaxis.rcs.common.enums.LCCDirection; import com.galaxis.rcs.common.enums.LCCDirection;
import com.galaxis.rcs.ptr.AmrTaskMode; import com.galaxis.rcs.amr.AmrTaskMode;
import lombok.Data; import lombok.Data;
@Data @Data

10
servo/src/main/java/com/yvan/event/AgvEventManager.java

@ -3,9 +3,9 @@ package com.yvan.event;
import com.galaxis.rcs.common.entity.RcsTaskPlan; import com.galaxis.rcs.common.entity.RcsTaskPlan;
import com.galaxis.rcs.common.enums.LCCDirection; import com.galaxis.rcs.common.enums.LCCDirection;
import com.galaxis.rcs.plan.PlanTaskSequence; import com.galaxis.rcs.plan.PlanTaskSequence;
import com.galaxis.rcs.ptr.AmrTaskMode; import com.galaxis.rcs.amr.AmrTaskMode;
import com.galaxis.rcs.ptr.PosDirection; import com.galaxis.rcs.amr.PosDirection;
import com.galaxis.rcs.ptr.PtrAgvDeviceTask; import com.galaxis.rcs.amr.AmrDeviceTask;
import com.yvan.logisticsModel.ExecutorItem; import com.yvan.logisticsModel.ExecutorItem;
import java.util.Set; import java.util.Set;
@ -78,11 +78,11 @@ public class AgvEventManager {
fireEvent(AgvEventType.PLAN_TASK_SEQUENCE_RESUME, sender, taskSequence); fireEvent(AgvEventType.PLAN_TASK_SEQUENCE_RESUME, sender, taskSequence);
} }
public void fireDeviceTaskCompleteEvent(ExecutorItem sender, PtrAgvDeviceTask deviceTask) { public void fireDeviceTaskCompleteEvent(ExecutorItem sender, AmrDeviceTask deviceTask) {
fireEvent(AgvEventType.DEVICE_TASK_COMPLETE, sender, deviceTask); fireEvent(AgvEventType.DEVICE_TASK_COMPLETE, sender, deviceTask);
} }
public void fireDeviceTaskExceptionEvent(ExecutorItem sender, PtrAgvDeviceTask deviceTask, Object exception) { public void fireDeviceTaskExceptionEvent(ExecutorItem sender, AmrDeviceTask deviceTask, Object exception) {
fireEvent(AgvEventType.DEVICE_TASK_EXCEPTION, sender, deviceTask, exception); fireEvent(AgvEventType.DEVICE_TASK_EXCEPTION, sender, deviceTask, exception);
} }

4
servo/src/main/java/com/yvan/event/AgvEventType.java

@ -63,12 +63,12 @@ public enum AgvEventType {
PLAN_TASK_SEQUENCE_RESUME, PLAN_TASK_SEQUENCE_RESUME,
/** /**
* 设备任务已完成 * 设备任务已完成
* (ExecutorItem sender, PtrAgvDeviceTask deviceTask) * (ExecutorItem sender, AmrDeviceTask deviceTask)
*/ */
DEVICE_TASK_COMPLETE, DEVICE_TASK_COMPLETE,
/** /**
* 设备任务异常 * 设备任务异常
* (ExecutorItem sender, PtrAgvDeviceTask deviceTask, Object exception) * (ExecutorItem sender, AmrDeviceTask deviceTask, Object exception)
*/ */
DEVICE_TASK_EXCEPTION, DEVICE_TASK_EXCEPTION,
/** /**

29
servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java

@ -1,14 +1,16 @@
package com.yvan.logisticsModel; package com.yvan.logisticsModel;
import com.galaxis.rcs.amr.AmrAgvItem;
import com.galaxis.rcs.common.entity.RcsTaskPlan; import com.galaxis.rcs.common.entity.RcsTaskPlan;
import com.galaxis.rcs.common.enums.PlanTaskType; import com.galaxis.rcs.common.enums.PlanTaskType;
import com.galaxis.rcs.connector.cl2.Cl2Item; import com.galaxis.rcs.connector.amr.cl2.Cl2Item;
import com.galaxis.rcs.connector.amr.fm600.Fm600Item;
import com.galaxis.rcs.inv.InvManager; import com.galaxis.rcs.inv.InvManager;
import com.galaxis.rcs.plan.PlanTaskSequence; import com.galaxis.rcs.plan.PlanTaskSequence;
import com.galaxis.rcs.plan.path.NavigationGraph; import com.galaxis.rcs.plan.path.NavigationGraph;
import com.galaxis.rcs.plan.path.PtrPathPlanner; import com.galaxis.rcs.plan.path.PtrPathPlanner;
import com.galaxis.rcs.ptr.AmrMessageHandler; import com.galaxis.rcs.amr.AmrMessageHandler;
import com.galaxis.rcs.ptr.PtrAgvItem; import com.galaxis.rcs.amr.PtrAgvItem;
import com.galaxis.rcs.task.TaskDispatchFactory; import com.galaxis.rcs.task.TaskDispatchFactory;
import com.galaxis.rcs.task.TaskService; import com.galaxis.rcs.task.TaskService;
import com.google.common.base.Joiner; import com.google.common.base.Joiner;
@ -26,7 +28,6 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateFormatUtils;
import org.clever.core.BannerUtils; import org.clever.core.BannerUtils;
import org.clever.core.Conv; import org.clever.core.Conv;
import org.clever.core.DateUtils;
import org.clever.data.jdbc.DaoFactory; import org.clever.data.jdbc.DaoFactory;
import org.clever.data.jdbc.QueryDSL; import org.clever.data.jdbc.QueryDSL;
import org.clever.data.redis.Redis; import org.clever.data.redis.Redis;
@ -201,12 +202,12 @@ public class LogisticsRuntime {
FrontendMessagePushService.INSTANCE.pushDeviceAlive(this, sender.id, sender.getT(), true); FrontendMessagePushService.INSTANCE.pushDeviceAlive(this, sender.id, sender.getT(), true);
} }
// 设备状态变化 // 设备状态变化
if (sender instanceof PtrAgvItem) { if (sender instanceof AmrAgvItem) {
var ptr = (PtrAgvItem) sender; var ptr = (AmrAgvItem) sender;
FrontendMessagePushService.INSTANCE.pushDeviceStatus(this, sender.id, ptr.getState()); FrontendMessagePushService.INSTANCE.pushDeviceStatus(this, sender.id, ptr.getState());
} else { } else {
log.error("AGV事件类型 {} 仅支持 PtrAgvItem 类型的执行器", type); log.error("AGV事件类型 {} 仅支持 AmrAgvItem 类型的执行器", type);
} }
break; break;
} }
@ -229,6 +230,9 @@ public class LogisticsRuntime {
* 库存转移 AGV->货架 * 库存转移 AGV->货架
*/ */
private void changeInvOfUnload(PlanTaskSequence taskSequence, RcsTaskPlan taskPlan) { private void changeInvOfUnload(PlanTaskSequence taskSequence, RcsTaskPlan taskPlan) {
if (taskSequence.option.noInv) {
return;
}
String lpn = taskSequence.carryLpn; String lpn = taskSequence.carryLpn;
queryDSL.beginTX(status -> { queryDSL.beginTX(status -> {
InvManager.invSave(this.envId, taskSequence.bizTask.getBizTaskId(), lpn, taskSequence.executorVo.getLocCode(), -taskSequence.carryQty); InvManager.invSave(this.envId, taskSequence.bizTask.getBizTaskId(), lpn, taskSequence.executorVo.getLocCode(), -taskSequence.carryQty);
@ -241,6 +245,9 @@ public class LogisticsRuntime {
* 库存转移 货架->AGV * 库存转移 货架->AGV
*/ */
private void changeInvOfLoad(PlanTaskSequence taskSequence, RcsTaskPlan taskPlan) { private void changeInvOfLoad(PlanTaskSequence taskSequence, RcsTaskPlan taskPlan) {
if (taskSequence.option.noInv) {
return;
}
String lpn = taskSequence.carryLpn; String lpn = taskSequence.carryLpn;
queryDSL.beginTX(status -> { queryDSL.beginTX(status -> {
InvManager.invSave(this.envId, taskSequence.bizTask.getBizTaskId(), lpn, taskSequence.loadBasLocationVo.getLocCode(), -taskSequence.carryQty); InvManager.invSave(this.envId, taskSequence.bizTask.getBizTaskId(), lpn, taskSequence.loadBasLocationVo.getLocCode(), -taskSequence.carryQty);
@ -328,10 +335,18 @@ public class LogisticsRuntime {
break; break;
case "cl2": case "cl2":
case "cl3":
case "clx": case "clx":
case "cc5":
case "cs1":
item = new Cl2Item(this, itemObject); item = new Cl2Item(this, itemObject);
this.executorItemMap.put(item.getId(), (ExecutorItem) item); this.executorItemMap.put(item.getId(), (ExecutorItem) item);
break; break;
case "fm600":
item = new Fm600Item(this, itemObject);
this.executorItemMap.put(item.getId(), (ExecutorItem) item);
break;
} }
} }

8
servo/src/main/java/com/yvan/pusher/FrontendMessagePushService.java

@ -76,9 +76,9 @@ public class FrontendMessagePushService implements MqttCallback {
options.setUserName(mqttConfig.getUsername()); options.setUserName(mqttConfig.getUsername());
options.setPassword(mqttConfig.getPassword().getBytes()); options.setPassword(mqttConfig.getPassword().getBytes());
options.setAutomaticReconnect(true); options.setAutomaticReconnect(true);
options.setConnectionTimeout(10); options.setConnectionTimeout(5000);
options.setKeepAliveInterval(60); options.setKeepAliveInterval(60);
options.setExecutorServiceTimeout(1); options.setExecutorServiceTimeout(5000);
// 尝试连接 // 尝试连接
int attempts = 0; int attempts = 0;
@ -276,7 +276,7 @@ public class FrontendMessagePushService implements MqttCallback {
*/ */
private void publishJson(String topic, Object data) { private void publishJson(String topic, Object data) {
String json = JacksonMapper.getInstance().toJson(data); String json = JacksonMapper.getInstance().toJson(data);
log.info("Publishing to topic: {}, data: {}", topic, json); // log.info("Publishing to topic: {}, data: {}", topic, json);
publish(topic, json); publish(topic, json);
} }
@ -296,7 +296,7 @@ public class FrontendMessagePushService implements MqttCallback {
mqttClient.publish(topic, message); mqttClient.publish(topic, message);
log.debug("Published to {}: {}", topic, payload); log.info("Published to [{}] {}", topic, payload);
} catch (MqttException e) { } catch (MqttException e) {
log.error("Failed to publish to topic: " + topic, e); log.error("Failed to publish to topic: " + topic, e);
} }

88
servo/src/main/java/com/yvan/workbench/controller/ApiController.java

@ -3,6 +3,7 @@ package com.yvan.workbench.controller;
import com.galaxis.rcs.common.entity.ApiTask; import com.galaxis.rcs.common.entity.ApiTask;
import com.galaxis.rcs.common.entity.LccBasLocation; import com.galaxis.rcs.common.entity.LccBasLocation;
import com.galaxis.rcs.inv.InvManager; import com.galaxis.rcs.inv.InvManager;
import com.google.common.collect.Sets;
import com.querydsl.core.util.StringUtils; import com.querydsl.core.util.StringUtils;
import com.yvan.entity.BasLocationVo; import com.yvan.entity.BasLocationVo;
import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.LogisticsRuntime;
@ -42,13 +43,25 @@ public class ApiController {
private final static String projectUUID = "tw_zh"; private final static String projectUUID = "tw_zh";
private final static long envId = 13; private final static long envId = 13;
private final static String inPos = "504_506_0_0_0"; private final static String inPos = "150_0_0_0";
private final static String outPos = "504_503_0_0_0"; private final static String outPos = "148_0_0_0";
// 礼品托盘 // 礼品托盘
private final static String giftLpn = "GLPN"; private final static String giftLpn = "GLPN";
// 礼品托盘位 // 礼品托盘位
private final static String gifPos = "500_500_0_0_0"; private final static String gifPos = "82_0_0_0";
private final static String cl2_gstore = "146_0_0_0";
private final static String cl2_agvId = "2";
private final static String cl2_agvLocCode = "AGV_2";
private final static Set<String> cl2_demoLocSet = Sets.newHashSet(
"155_0_1_0", "157_0_1_0", "159_0_1_0");
private final static String clx_gstore = "84_0_0_0";
private final static String clx_agvId = "3";
private final static String clx_agvLocCode = "AGV_3";
private final static Set<String> clx_demoLocSet = Sets.newHashSet(
"89_0_2_0", "162_0_2_0", "91_0_2_0", "93_0_2_0");
static final QueryDSL queryDSL = DaoFactory.getQueryDSL(); static final QueryDSL queryDSL = DaoFactory.getQueryDSL();
@ -59,20 +72,17 @@ public class ApiController {
private static void createCl2DemoTask() { private static void createCl2DemoTask() {
if (cl2DemoTask != null) { if (cl2DemoTask != null) {
if (cl2DemoTask.isAlive()) { if (cl2DemoTask.isAlive()) {
log.error("cl2 error 1");
return; return;
} }
} }
cl2DemoTask = new Thread(() -> { cl2DemoTask = new Thread(() -> {
String gstore = "504_501_0_0_0"; String gstore = cl2_gstore;
String agvId = "1"; String agvId = cl2_agvId;
String agvLocCode = "AGV_1"; String agvLocCode = cl2_agvLocCode;
Set<String> demoLocSet = new HashSet<>(); Set<String> demoLocSet = cl2_demoLocSet;
demoLocSet.add("rack1_0_1_0"); long loopCnt = 0;
demoLocSet.add("rack1_1_1_0");
demoLocSet.add("rack1_2_1_0");
demoLocSet.add("rack1_3_1_0");
while (true) { while (true) {
// 查询是否有出库任务 // 查询是否有出库任务
@ -88,6 +98,7 @@ public class ApiController {
.fetchFirst(); .fetchFirst();
if (!(cl2Running.get() || outTask != null || inTask != null)) { if (!(cl2Running.get() || outTask != null || inTask != null)) {
log.error("cl2 error 2");
return; return;
} }
@ -110,6 +121,11 @@ public class ApiController {
.where(lccInvLpn.qty.gt(0).and(lccInvLpn.envId.eq(envId)) .where(lccInvLpn.qty.gt(0).and(lccInvLpn.envId.eq(envId))
))).distinct().fetch(); ))).distinct().fetch();
if(emptyLocList.size() <= 0){
log.error("cl2 error 99, no empty pallet");
return;
}
Set<String> emptyLocSet = new HashSet<>(emptyLocList); Set<String> emptyLocSet = new HashSet<>(emptyLocList);
// if (gInvCount <= 0) { // if (gInvCount <= 0) {
@ -135,6 +151,7 @@ public class ApiController {
params.put("targetStoreLoc", locCodeToLoc(locCode)); params.put("targetStoreLoc", locCodeToLoc(locCode));
R re = RcsController.agvUnload(params); R re = RcsController.agvUnload(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("cl2 error 3");
return; return;
} }
if (outTask != null) { if (outTask != null) {
@ -147,6 +164,7 @@ public class ApiController {
re = RcsController.waitTaskFinish(params); re = RcsController.waitTaskFinish(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("cl2 error 4");
return; return;
} }
if (outTask != null) { if (outTask != null) {
@ -169,6 +187,7 @@ public class ApiController {
R re = RcsController.agvCarry(params); R re = RcsController.agvCarry(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("cl2 error 5");
return; return;
} }
if (inTask != null) { if (inTask != null) {
@ -179,6 +198,7 @@ public class ApiController {
re = RcsController.waitTaskFinish(params); re = RcsController.waitTaskFinish(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("cl2 error 6");
return; return;
} }
if (inTask != null) { if (inTask != null) {
@ -200,6 +220,7 @@ public class ApiController {
params.put("targetStoreLoc", locCodeToLoc(outPos)); params.put("targetStoreLoc", locCodeToLoc(outPos));
R re = RcsController.agvCarry(params); R re = RcsController.agvCarry(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("cl2 error 7");
return; return;
} }
queryDSL.update(apiTask) queryDSL.update(apiTask)
@ -210,6 +231,7 @@ public class ApiController {
outTask.setLpn(lpn); outTask.setLpn(lpn);
re = RcsController.waitTaskFinish(params); re = RcsController.waitTaskFinish(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("cl2 error 8");
return; return;
} }
completeTask(outTask); completeTask(outTask);
@ -223,10 +245,12 @@ public class ApiController {
R re = RcsController.agvCarry(params); R re = RcsController.agvCarry(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("cl2 error 9");
return; return;
} }
re = RcsController.waitTaskFinish(params); re = RcsController.waitTaskFinish(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("cl2 error 10");
return; return;
} }
} else { } else {
@ -238,10 +262,12 @@ public class ApiController {
params.put("targetStoreLoc", locCodeToLoc(gstore)); params.put("targetStoreLoc", locCodeToLoc(gstore));
R re = RcsController.agvCarry(params); R re = RcsController.agvCarry(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("cl2 error 11");
return; return;
} }
re = RcsController.waitTaskFinish(params); re = RcsController.waitTaskFinish(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("cl2 error 12");
return; return;
} }
@ -249,6 +275,9 @@ public class ApiController {
} }
Thread.sleep(1000); Thread.sleep(1000);
loopCnt++;
log.info("cl2 loop cnt: {}", loopCnt);
} catch (InterruptedException e) { } catch (InterruptedException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@ -264,19 +293,18 @@ public class ApiController {
private static void createClxDemoTask() { private static void createClxDemoTask() {
if (clxDemoTask != null) { if (clxDemoTask != null) {
if (clxDemoTask.isAlive()) { if (clxDemoTask.isAlive()) {
log.error("clx error 0");
return; return;
} }
} }
clxDemoTask = new Thread(() -> { clxDemoTask = new Thread(() -> {
String gstore = "502_500_0_0_0"; String gstore = clx_gstore;
String agvId = "2"; String agvId = clx_agvId;
String agvLocCode = "AGV_2"; String agvLocCode = clx_agvLocCode;
Set<String> demoLocSet = new HashSet<>(); Set<String> demoLocSet = clx_demoLocSet;
demoLocSet.add("rack1_0_2_0"); long loopCnt = 0;
demoLocSet.add("rack1_1_2_0");
demoLocSet.add("rack1_2_2_0");
demoLocSet.add("rack1_3_2_0");
while (true) { while (true) {
// 查询是否有礼品出库任务 // 查询是否有礼品出库任务
ApiTask outTask = queryDSL.select(apiTask).from(apiTask) ApiTask outTask = queryDSL.select(apiTask).from(apiTask)
@ -290,6 +318,7 @@ public class ApiController {
.and(apiTask.taskType.eq(3)).and(apiTask.taskStatus.in(0, 1))) .and(apiTask.taskType.eq(3)).and(apiTask.taskStatus.in(0, 1)))
.fetchFirst(); .fetchFirst();
if (!(clxRunning.get() || outTask != null || inTask != null)) { if (!(clxRunning.get() || outTask != null || inTask != null)) {
log.info("clx not running");
return; return;
} }
@ -341,6 +370,7 @@ public class ApiController {
params.put("targetStoreLoc", locCodeToLoc(locCode)); params.put("targetStoreLoc", locCodeToLoc(locCode));
R re = RcsController.agvUnload(params); R re = RcsController.agvUnload(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("clx error 3");
return; return;
} }
if (outTask != null && aInvLpn.equals(giftLpn)) { if (outTask != null && aInvLpn.equals(giftLpn)) {
@ -351,6 +381,7 @@ public class ApiController {
re = RcsController.waitTaskFinish(params); re = RcsController.waitTaskFinish(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("clx error 1");
return; return;
} }
if (outTask != null && aInvLpn.equals(giftLpn)) { if (outTask != null && aInvLpn.equals(giftLpn)) {
@ -373,6 +404,7 @@ public class ApiController {
R re = RcsController.agvCarry(params); R re = RcsController.agvCarry(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("clx error 2");
return; return;
} }
queryDSL.update(apiTask) queryDSL.update(apiTask)
@ -381,6 +413,7 @@ public class ApiController {
re = RcsController.waitTaskFinish(params); re = RcsController.waitTaskFinish(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("clx error 4");
return; return;
} }
completeTask(inTask); completeTask(inTask);
@ -397,6 +430,7 @@ public class ApiController {
params.put("targetStoreLoc", locCodeToLoc(gifPos)); params.put("targetStoreLoc", locCodeToLoc(gifPos));
R re = RcsController.agvCarry(params); R re = RcsController.agvCarry(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("clx error 5");
return; return;
} }
queryDSL.update(apiTask) queryDSL.update(apiTask)
@ -405,6 +439,7 @@ public class ApiController {
re = RcsController.waitTaskFinish(params); re = RcsController.waitTaskFinish(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("clx error 6");
return; return;
} }
completeTask(outTask); completeTask(outTask);
@ -418,10 +453,12 @@ public class ApiController {
R re = RcsController.agvCarry(params); R re = RcsController.agvCarry(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("clx error 10");
return; return;
} }
re = RcsController.waitTaskFinish(params); re = RcsController.waitTaskFinish(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("clx error 9");
return; return;
} }
} else { } else {
@ -434,10 +471,12 @@ public class ApiController {
params.put("targetStoreLoc", locCodeToLoc(gstore)); params.put("targetStoreLoc", locCodeToLoc(gstore));
R re = RcsController.agvCarry(params); R re = RcsController.agvCarry(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("clx error 8");
return; return;
} }
re = RcsController.waitTaskFinish(params); re = RcsController.waitTaskFinish(params);
if (!re.isSuccess()) { if (!re.isSuccess()) {
log.error("clx error 7");
return; return;
} }
@ -445,6 +484,9 @@ public class ApiController {
} }
Thread.sleep(1000); Thread.sleep(1000);
loopCnt++;
log.info("clx loop cnt: {}", loopCnt);
} catch (InterruptedException e) { } catch (InterruptedException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@ -457,11 +499,7 @@ public class ApiController {
public static String locCodeToLoc(String locCode) { public static String locCodeToLoc(String locCode) {
if (locCode.startsWith("rack")) { return locCode;
return locCode.replaceAll("_", "/");
} else {
return locCode.replaceAll("_0_0_0", "");
}
} }
public static RR<?> in_bound(@RequestBody Map<String, Object> params) { public static RR<?> in_bound(@RequestBody Map<String, Object> params) {

38
servo/src/main/java/com/yvan/workbench/controller/DeviceManager.java

@ -4,13 +4,11 @@ import com.galaxis.rcs.common.entity.LccBasExecutor;
import com.galaxis.rcs.common.entity.LccBasLocation; import com.galaxis.rcs.common.entity.LccBasLocation;
import com.galaxis.rcs.common.entity.LccInvLedger; import com.galaxis.rcs.common.entity.LccInvLedger;
import com.querydsl.sql.SQLQuery; import com.querydsl.sql.SQLQuery;
import com.yvan.workbench.model.request.QueryExecutorReq; import com.yvan.workbench.model.request.*;
import com.yvan.workbench.model.request.QueryInvLedgerReq;
import com.yvan.workbench.model.request.QueryInvLpnReq;
import com.yvan.workbench.model.request.QueryLocationReq;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.clever.core.model.request.QueryByPage; import org.clever.core.model.request.QueryByPage;
import org.clever.core.model.request.page.Page; import org.clever.core.model.request.page.Page;
import org.clever.core.model.response.R;
import org.clever.data.jdbc.DaoFactory; import org.clever.data.jdbc.DaoFactory;
import org.clever.data.jdbc.QueryDSL; import org.clever.data.jdbc.QueryDSL;
import org.clever.data.jdbc.querydsl.utils.QueryDslUtils; import org.clever.data.jdbc.querydsl.utils.QueryDslUtils;
@ -52,23 +50,26 @@ public class DeviceManager {
public static Page<LinkedHashMap<String, Object>> queryInvLpn(QueryInvLpnReq req) { public static Page<LinkedHashMap<String, Object>> queryInvLpn(QueryInvLpnReq req) {
SQLQuery<LinkedHashMap<String, Object>> query = QUERY_DSL.select(QueryDslUtils.linkedMap(lccInvLpn, lccBasLocation, lccBasContainer)) SQLQuery<LinkedHashMap<String, Object>> query = QUERY_DSL.select(QueryDslUtils.linkedMap(lccInvLpn, lccBasLocation, lccBasContainer))
.from(lccInvLpn) .from(lccInvLpn)
.innerJoin(lccBasLocation).on( .innerJoin(lccBasLocation).on(
lccInvLpn.locCode.eq(lccBasLocation.locCode).and( lccInvLpn.locCode.eq(lccBasLocation.locCode).and(
lccBasLocation.envId.eq(lccBasLocation.envId) lccInvLpn.envId.eq(lccBasLocation.envId)
)
) )
.innerJoin(lccBasContainer).on( )
lccInvLpn.lpn.eq(lccInvLpn.lpn).and( .innerJoin(lccBasContainer).on(
lccBasContainer.envId.eq(lccInvLpn.envId) lccBasContainer.lpn.eq(lccInvLpn.lpn).and(
) lccBasContainer.envId.eq(lccInvLpn.envId)
).orderBy(lccInvLpn.lpn.asc()); )
).orderBy(lccInvLpn.lpn.asc());
if (StringUtils.isNotBlank(req.getLpn())) { if (StringUtils.isNotBlank(req.getLpn())) {
query.where(lccInvLpn.lpn.eq(req.getLpn().trim())); query.where(lccInvLpn.lpn.eq(req.getLpn().trim()));
} }
if (StringUtils.isNotBlank(req.getLocCode())) { if (StringUtils.isNotBlank(req.getLocCode())) {
query.where(lccInvLpn.locCode.eq(req.getLocCode().trim())); query.where(lccInvLpn.locCode.eq(req.getLocCode().trim()));
} }
if (req.getEnvId() != null) {
query.where(lccInvLpn.envId.eq(req.getEnvId()));
}
return QueryDslUtils.queryByPage(query, QueryByPage.getCurrent()); return QueryDslUtils.queryByPage(query, QueryByPage.getCurrent());
} }
@ -79,4 +80,13 @@ public class DeviceManager {
} }
return QueryDslUtils.queryByPage(query, QueryByPage.getCurrent()); return QueryDslUtils.queryByPage(query, QueryByPage.getCurrent());
} }
public static R<?> delInvLpn(DelInvLpnReq req) {
long count = QUERY_DSL.delete(lccInvLpn)
.where(lccInvLpn.envId.eq(req.getEnvId()))
.where(lccInvLpn.locCode.eq(req.getLocCode()))
.where(lccInvLpn.lpn.eq(req.getLpn()))
.execute();
return R.success(count);
}
} }

78
servo/src/main/java/com/yvan/workbench/controller/LccController.java

@ -1,21 +1,27 @@
package com.yvan.workbench.controller; package com.yvan.workbench.controller;
import com.galaxis.rcs.amr.AmrAgvItem;
import com.galaxis.rcs.amr.JacksonUtils;
import com.galaxis.rcs.common.entity.LccInvLpn;
import com.galaxis.rcs.common.enums.LCCDirection; import com.galaxis.rcs.common.enums.LCCDirection;
import com.galaxis.rcs.ptr.PtrAgvItem; import com.galaxis.rcs.amr.PtrAgvItem;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.yvan.entity.AgvStatusVo; import com.yvan.entity.AgvStatusVo;
import com.yvan.logisticsModel.LogisticsRuntimeService; import com.yvan.logisticsModel.LogisticsRuntimeService;
import com.yvan.workbench.SpringContext; import com.yvan.workbench.SpringContext;
import com.yvan.workbench.service.LccMapService; import com.yvan.workbench.service.LccMapService;
import org.clever.core.Conv; import org.clever.core.Conv;
import org.clever.core.json.JsonWrapper; import org.clever.core.json.JsonWrapper;
import org.clever.core.mapper.JacksonMapper;
import org.clever.core.model.response.R; import org.clever.core.model.response.R;
import org.clever.data.jdbc.DaoFactory; import org.clever.data.jdbc.DaoFactory;
import org.clever.data.jdbc.QueryDSL; import org.clever.data.jdbc.QueryDSL;
import org.clever.data.jdbc.querydsl.utils.QueryDslUtils; import org.clever.data.jdbc.querydsl.utils.QueryDslUtils;
import org.clever.web.mvc.annotation.RequestBody; import org.clever.web.mvc.annotation.RequestBody;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -84,7 +90,7 @@ public class LccController {
for (var executor : runtime.executorItemMap.values()) { for (var executor : runtime.executorItemMap.values()) {
for (var agv : agvStatusList) { for (var agv : agvStatusList) {
if (agv.getId().equals(executor.getId())) { if (agv.getId().equals(executor.getId())) {
agv.copyFromExceptVirtual(((PtrAgvItem) executor).getState()); agv.copyFromExceptVirtual(((AmrAgvItem) executor).getState());
break; break;
} }
} }
@ -123,4 +129,72 @@ public class LccController {
return R.success(list); return R.success(list);
} }
public static R<Boolean> addInvCommit(@RequestBody Map<String, Object> params) {
LccInvLpn inv = JacksonMapper.getInstance().getMapper().convertValue(params, LccInvLpn.class);
if (inv.getQty() <= 0L) {
return R.fail("Qty must be greater than 0");
}
if (inv.getQty() > 1L) {
return R.fail("Qty must be 1");
}
if (Strings.isNullOrEmpty(inv.getLocCode())) {
return R.fail("LocCode Must not be empty");
}
if (Strings.isNullOrEmpty(inv.getLpn())) {
return R.fail("Lpn Must not be empty");
}
if (inv.getEnvId() == null || inv.getEnvId() <= 0) {
return R.fail("EnvId Must not be empty");
}
inv.setQtyIn(0);
inv.setQtyOut(0);
inv.setCreateAt(new Date());
inv.setUpdateAt(new Date());
inv.setCreateBy("system");
inv.setUpdateBy("system");
QueryDSL queryDsl = DaoFactory.getQueryDSL();
var rowEffect = queryDsl.insert(lccInvLpn)
.populate(inv)
.execute();
return R.success(true);
}
public static R<Object> getLpnLocations(@RequestBody Map<String, Object> params) {
Long envId = Conv.asLong(params.get("envId"));
if (envId == null || envId <= 0) {
return R.fail("envId Must not be empty");
}
var queryDsl = DaoFactory.getQueryDSL();
var lpnList = queryDsl.select(QueryDslUtils.linkedMap(
lccBasContainer.lpn
))
.from(lccBasContainer)
.where(lccBasContainer.envId.eq(envId))
.where(lccBasContainer.isActive.eq(true))
.fetch();
var locationList = queryDsl.select(QueryDslUtils.linkedMap(
lccBasLocation.locCode,
lccBasLocation.rack,
lccBasLocation.bay,
lccBasLocation.level,
lccBasLocation.cell
))
.from(lccBasLocation)
.where(lccBasLocation.envId.eq(envId))
.fetch();
Map<String, Object> result = Maps.newHashMap();
result.put("lpnList", lpnList);
result.put("locationList", locationList);
return R.success(result);
}
} }

2
servo/src/main/java/com/yvan/workbench/controller/LccModelManager.java

@ -2,7 +2,7 @@ package com.yvan.workbench.controller;
import com.galaxis.rcs.common.entity.LccBasLocation; import com.galaxis.rcs.common.entity.LccBasLocation;
import com.galaxis.rcs.common.entity.StoreLocation; import com.galaxis.rcs.common.entity.StoreLocation;
import com.galaxis.rcs.ptr.JacksonUtils; import com.galaxis.rcs.amr.JacksonUtils;
import com.yvan.workbench.SpringContext; import com.yvan.workbench.SpringContext;
import com.yvan.entity.LccProject; import com.yvan.entity.LccProject;
import com.yvan.workbench.service.LccMapService; import com.yvan.workbench.service.LccMapService;

142
servo/src/main/java/com/yvan/workbench/controller/RcsController.java

@ -1,5 +1,6 @@
package com.yvan.workbench.controller; package com.yvan.workbench.controller;
import com.galaxis.rcs.amr.AmrAgvItem;
import com.galaxis.rcs.common.entity.LccBasLocation; import com.galaxis.rcs.common.entity.LccBasLocation;
import com.galaxis.rcs.common.entity.RcsTaskBiz; import com.galaxis.rcs.common.entity.RcsTaskBiz;
import com.galaxis.rcs.common.entity.StoreLocation; import com.galaxis.rcs.common.entity.StoreLocation;
@ -7,8 +8,8 @@ import com.galaxis.rcs.common.enums.BizTaskStatus;
import com.galaxis.rcs.common.enums.BizTaskType; import com.galaxis.rcs.common.enums.BizTaskType;
import com.galaxis.rcs.common.enums.LCCDirection; import com.galaxis.rcs.common.enums.LCCDirection;
import com.galaxis.rcs.plan.PlanTaskSequence; import com.galaxis.rcs.plan.PlanTaskSequence;
import com.galaxis.rcs.plan.RcsTaskOption;
import com.galaxis.rcs.plan.task.*; import com.galaxis.rcs.plan.task.*;
import com.galaxis.rcs.ptr.PtrAgvItem;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.yvan.entity.BasLocationVo; import com.yvan.entity.BasLocationVo;
@ -18,6 +19,8 @@ import com.yvan.logisticsModel.LogisticsRuntimeService;
import com.yvan.logisticsModel.StaticItem; import com.yvan.logisticsModel.StaticItem;
import org.clever.core.Conv; import org.clever.core.Conv;
import org.clever.core.id.SnowFlake; import org.clever.core.id.SnowFlake;
import org.clever.core.json.JsonWrapper;
import org.clever.core.mapper.JacksonMapper;
import org.clever.core.model.response.R; import org.clever.core.model.response.R;
import org.clever.web.mvc.annotation.RequestBody; import org.clever.web.mvc.annotation.RequestBody;
@ -139,8 +142,8 @@ public class RcsController {
if (executorItem == null) { if (executorItem == null) {
return R.fail("executor not found: " + agvId); return R.fail("executor not found: " + agvId);
} }
if (!(executorItem instanceof PtrAgvItem)) { if (!(executorItem instanceof AmrAgvItem)) {
return R.fail("executor is not a PtrAgvItem id=" + agvId); return R.fail("executor is not a AmrAgvItem id=" + agvId);
} }
return R.success(executorItem); return R.success(executorItem);
@ -160,59 +163,55 @@ public class RcsController {
if (Strings.isNullOrEmpty(fromStoreLoc)) { if (Strings.isNullOrEmpty(fromStoreLoc)) {
return R.fail("fromStoreLoc Must not be empty"); return R.fail("fromStoreLoc Must not be empty");
} }
StoreLocation sourceLocation = StoreLocation.of(fromStoreLoc, "/");
StaticItem sourceItem = ps.runtime.getStaticItemById(sourceLocation.rackId());
if (sourceItem == null) {
return R.fail("fromStoreLoc storePoint not found!");
}
// 查找货位基础资料 // 查找货位基础资料
LccBasLocation loadBasLocation = ps.runtime.queryDSL.selectFrom( LccBasLocation loadBasLocation = ps.runtime.queryDSL.selectFrom(
lccBasLocation lccBasLocation
) )
.where(lccBasLocation.envId.eq(ps.envId)) .where(lccBasLocation.envId.eq(ps.envId))
.where(lccBasLocation.rack.eq(sourceLocation.rackId())) .where(lccBasLocation.locCode.eq(fromStoreLoc))
.where(lccBasLocation.bay.eq(sourceLocation.bay()))
.where(lccBasLocation.level.eq(sourceLocation.level()))
.where(lccBasLocation.cell.eq(sourceLocation.cell()))
.fetchFirst(); .fetchFirst();
if (loadBasLocation == null) { if (loadBasLocation == null) {
return R.fail("fromStoreLoc location not found!"); return R.fail("fromStoreLoc location not found!");
} }
StoreLocation sourceLocation = new StoreLocation(loadBasLocation.getRack(), loadBasLocation.getBay(), loadBasLocation.getLevel(), loadBasLocation.getCell());
StaticItem sourceItem = ps.runtime.getStaticItemById(loadBasLocation.getRack());
if (sourceItem == null) {
return R.fail("fromStoreLoc storePoint not found!");
}
// ==================== 查找卸货货位 ==================== // ==================== 查找卸货货位 ====================
String targetStoreLoc = Conv.asString(params.get("targetStoreLoc")); String targetStoreLoc = Conv.asString(params.get("targetStoreLoc"));
if (Strings.isNullOrEmpty(targetStoreLoc)) { if (Strings.isNullOrEmpty(targetStoreLoc)) {
return R.fail("targetStoreLoc Must not be empty"); return R.fail("targetStoreLoc Must not be empty");
} }
StoreLocation targetLocation = StoreLocation.of(targetStoreLoc, "/");
StaticItem targetItem = ps.runtime.getStaticItemById(targetLocation.rackId());
if (targetItem == null) {
return R.fail("targetStoreLoc storePoint not found!");
}
// 查找货位基础资料 // 查找货位基础资料
LccBasLocation unloadBasLocation = ps.runtime.queryDSL.selectFrom( LccBasLocation unloadBasLocation = ps.runtime.queryDSL.selectFrom(
lccBasLocation lccBasLocation
) )
.where(lccBasLocation.envId.eq(ps.envId)) .where(lccBasLocation.envId.eq(ps.envId))
.where(lccBasLocation.rack.eq(targetLocation.rackId())) .where(lccBasLocation.locCode.eq(targetStoreLoc))
.where(lccBasLocation.bay.eq(targetLocation.bay()))
.where(lccBasLocation.level.eq(targetLocation.level()))
.where(lccBasLocation.cell.eq(targetLocation.cell()))
.fetchFirst(); .fetchFirst();
if (unloadBasLocation == null) { if (unloadBasLocation == null) {
return R.fail("targetStoreLoc location not found!"); return R.fail("targetStoreLoc location not found!");
} }
StoreLocation targetLocation = new StoreLocation(unloadBasLocation.getRack(), unloadBasLocation.getBay(), unloadBasLocation.getLevel(), unloadBasLocation.getCell());
StaticItem targetItem = ps.runtime.getStaticItemById(unloadBasLocation.getRack());
if (targetItem == null) {
return R.fail("targetStoreLoc storePoint not found!");
}
// ==================== 找到托盘号 ==================== // ==================== 找到托盘号 ====================
String lpn = ps.runtime.queryDSL String lpn = "N/A";
.select(lccInvLpn.lpn) if (!ps.option.noInv) {
.from(lccInvLpn) lpn = ps.runtime.queryDSL
.where(lccInvLpn.envId.eq(ps.envId)) .select(lccInvLpn.lpn)
.where(lccInvLpn.locCode.eq(loadBasLocation.getLocCode())) .from(lccInvLpn)
.fetchFirst(); .where(lccInvLpn.envId.eq(ps.envId))
if (Strings.isNullOrEmpty(lpn)) { .where(lccInvLpn.locCode.eq(loadBasLocation.getLocCode()))
return R.fail("LPN not found at fromStoreLoc: " + fromStoreLoc); .fetchFirst();
if (Strings.isNullOrEmpty(lpn)) {
return R.fail("LPN not found at fromStoreLoc: " + fromStoreLoc);
}
} }
// ==================== 布置任务 ==================== // ==================== 布置任务 ====================
@ -257,31 +256,31 @@ public class RcsController {
if (Strings.isNullOrEmpty(targetStoreLoc)) { if (Strings.isNullOrEmpty(targetStoreLoc)) {
return R.fail("targetStoreLoc Must not be empty"); return R.fail("targetStoreLoc Must not be empty");
} }
StoreLocation targetLocation = StoreLocation.of(targetStoreLoc, "/");
// 查找货位基础资料 // 查找货位基础资料
LccBasLocation unloadBasLocation = ps.runtime.queryDSL.selectFrom( LccBasLocation unloadBasLocation = ps.runtime.queryDSL.selectFrom(
lccBasLocation lccBasLocation
) )
.where(lccBasLocation.envId.eq(ps.envId)) .where(lccBasLocation.envId.eq(ps.envId))
.where(lccBasLocation.rack.eq(targetLocation.rackId())) .where(lccBasLocation.locCode.eq(targetStoreLoc))
.where(lccBasLocation.bay.eq(targetLocation.bay()))
.where(lccBasLocation.level.eq(targetLocation.level()))
.where(lccBasLocation.cell.eq(targetLocation.cell()))
.fetchFirst(); .fetchFirst();
if (unloadBasLocation == null) { if (unloadBasLocation == null) {
return R.fail("targetStoreLoc location not found!"); return R.fail("targetStoreLoc location not found!");
} }
StoreLocation targetLocation = new StoreLocation(unloadBasLocation.getRack(), unloadBasLocation.getBay(), unloadBasLocation.getLevel(), unloadBasLocation.getCell());
// ==================== 找到托盘号 ==================== // ==================== 找到托盘号 ====================
BasLocationVo executorVo = new BasLocationVo(ps.agv); BasLocationVo executorVo = new BasLocationVo(ps.agv);
String lpn = ps.runtime.queryDSL String lpn = "N/A";
.select(lccInvLpn.lpn) if (!ps.option.noInv) {
.from(lccInvLpn) lpn = ps.runtime.queryDSL
.where(lccInvLpn.envId.eq(ps.envId)) .select(lccInvLpn.lpn)
.where(lccInvLpn.locCode.eq(executorVo.getLocCode())) .from(lccInvLpn)
.fetchFirst(); .where(lccInvLpn.envId.eq(ps.envId))
if (Strings.isNullOrEmpty(lpn)) { .where(lccInvLpn.locCode.eq(executorVo.getLocCode()))
return R.fail("LPN not found at StoreLoc: " + executorVo.getLocCode()); .fetchFirst();
if (Strings.isNullOrEmpty(lpn)) {
return R.fail("LPN not found at StoreLoc: " + executorVo.getLocCode());
}
} }
// ==================== 布置任务 ==================== // ==================== 布置任务 ====================
@ -325,30 +324,30 @@ public class RcsController {
if (Strings.isNullOrEmpty(targetStoreLoc)) { if (Strings.isNullOrEmpty(targetStoreLoc)) {
return R.fail("targetStoreLoc Must not be empty"); return R.fail("targetStoreLoc Must not be empty");
} }
StoreLocation targetLocation = StoreLocation.of(targetStoreLoc, "/");
// 查找货位基础资料 // 查找货位基础资料
LccBasLocation loadBasLocation = ps.runtime.queryDSL.selectFrom( LccBasLocation loadBasLocation = ps.runtime.queryDSL.selectFrom(
lccBasLocation lccBasLocation
) )
.where(lccBasLocation.envId.eq(ps.envId)) .where(lccBasLocation.envId.eq(ps.envId))
.where(lccBasLocation.rack.eq(targetLocation.rackId())) .where(lccBasLocation.locCode.eq(targetStoreLoc))
.where(lccBasLocation.bay.eq(targetLocation.bay()))
.where(lccBasLocation.level.eq(targetLocation.level()))
.where(lccBasLocation.cell.eq(targetLocation.cell()))
.fetchFirst(); .fetchFirst();
if (loadBasLocation == null) { if (loadBasLocation == null) {
return R.fail("targetStoreLoc location not found!"); return R.fail("targetStoreLoc location not found!");
} }
StoreLocation targetLocation = new StoreLocation(loadBasLocation.getRack(), loadBasLocation.getBay(), loadBasLocation.getLevel(), loadBasLocation.getCell());
// ==================== 找到托盘号 ==================== // ==================== 找到托盘号 ====================
String lpn = ps.runtime.queryDSL String lpn = "N/A";
.select(lccInvLpn.lpn) if (!ps.option.noInv) {
.from(lccInvLpn) lpn = ps.runtime.queryDSL
.where(lccInvLpn.envId.eq(ps.envId)) .select(lccInvLpn.lpn)
.where(lccInvLpn.locCode.eq(loadBasLocation.getLocCode())) .from(lccInvLpn)
.fetchFirst(); .where(lccInvLpn.envId.eq(ps.envId))
if (Strings.isNullOrEmpty(lpn)) { .where(lccInvLpn.locCode.eq(loadBasLocation.getLocCode()))
return R.fail("LPN not found at targetStoreLoc: " + loadBasLocation.getLocCode()); .fetchFirst();
if (Strings.isNullOrEmpty(lpn)) {
return R.fail("LPN not found at targetStoreLoc: " + loadBasLocation.getLocCode());
}
} }
// ==================== 布置任务 ==================== // ==================== 布置任务 ====================
@ -422,7 +421,10 @@ public class RcsController {
String projectUUID = Conv.asString(params.get("projectUUID")); String projectUUID = Conv.asString(params.get("projectUUID"));
Long envId = Conv.asLong(params.get("envId")); Long envId = Conv.asLong(params.get("envId"));
String agvId = Conv.asString(params.get("agvId")); String agvId = Conv.asString(params.get("agvId"));
Map<String, Object> option = (Map<String, Object>) params.get("option"); RcsTaskOption option = new JsonWrapper((Map) params.get("option")).asObject(RcsTaskOption.class);
if (option == null) {
option = new RcsTaskOption();
}
if (Strings.isNullOrEmpty(projectUUID)) { if (Strings.isNullOrEmpty(projectUUID)) {
return R.fail("projectUUID Must not be empty"); return R.fail("projectUUID Must not be empty");
@ -433,9 +435,6 @@ public class RcsController {
if (Strings.isNullOrEmpty(agvId)) { if (Strings.isNullOrEmpty(agvId)) {
return R.fail("agvId Must not be empty"); return R.fail("agvId Must not be empty");
} }
if (option == null) {
option = Maps.newHashMap();
}
LogisticsRuntime runtime = LogisticsRuntimeService.INSTANCE.getByProjectEnv(projectUUID, envId); LogisticsRuntime runtime = LogisticsRuntimeService.INSTANCE.getByProjectEnv(projectUUID, envId);
if (runtime == null) { if (runtime == null) {
@ -446,16 +445,16 @@ public class RcsController {
if (executorItem == null) { if (executorItem == null) {
return R.fail("executor not found: " + agvId); return R.fail("executor not found: " + agvId);
} }
if (!(executorItem instanceof PtrAgvItem agv)) { if (!(executorItem instanceof AmrAgvItem agv)) {
return R.fail("executor is not a PtrAgvItem id=" + agvId); return R.fail("executor is not a AmrAgvItem id=" + agvId);
} }
// 获取机器人当前所在位置, 也可以前端强制指定 // 获取机器人当前所在位置, 也可以前端强制指定
// forceStartWayPointId: '6_2', forceStartDirectior: 'right' // forceStartWayPointId: '6_2', forceStartDirectior: 'right'
StaticItem fromItem = null; StaticItem fromItem = null;
LCCDirection fromDirection = null; LCCDirection fromDirection = null;
if (option.get("forceStartWayPointId") != null) { if (option.forceStartWayPointId != null) {
fromItem = runtime.getStaticItemById(Conv.asString(option.get("forceStartWayPointId"))); fromItem = runtime.getStaticItemById(option.forceStartWayPointId);
} else { } else {
fromItem = runtime.getStaticItemByLogicXY(agv.logicX, agv.logicY); fromItem = runtime.getStaticItemByLogicXY(agv.logicX, agv.logicY);
if (agv.logicX == 0 && agv.logicY == 0) { if (agv.logicX == 0 && agv.logicY == 0) {
@ -463,17 +462,17 @@ public class RcsController {
return R.fail("AGV position init failed"); return R.fail("AGV position init failed");
} }
} }
if (option.get("forceStartDirection") != null) { if (option.forceStartDirection != null) {
fromDirection = LCCDirection.fromString(Conv.asString(option.get("forceStartDirection"))); fromDirection = LCCDirection.fromString(option.forceStartDirection);
} else { } else {
fromDirection = agv.getLCCDirection(); fromDirection = agv.getLCCDirection();
} }
if (fromItem == null) { if (fromItem == null) {
return R.fail("PtrAgvItem not found at current location: " + agv.logicX + "_" + agv.logicY + ", id=" + agvId); return R.fail("AmrAgvItem not found at current location: " + agv.logicX + "_" + agv.logicY + ", id=" + agvId);
} }
if (fromDirection == null) { if (fromDirection == null) {
return R.fail("PtrAgvItem unkown direction id=" + agvId); return R.fail("AmrAgvItem unkown direction id=" + agvId);
} }
RcsTaskBiz bizTask = new RcsTaskBiz(); RcsTaskBiz bizTask = new RcsTaskBiz();
@ -481,7 +480,7 @@ public class RcsController {
bizTask.setEnvId(envId); bizTask.setEnvId(envId);
bizTask.setBizType(BizTaskType.MOVE.toString()); bizTask.setBizType(BizTaskType.MOVE.toString());
bizTask.setLpn("N/A"); bizTask.setLpn("N/A");
bizTask.setPriority(Conv.asInteger(option.get("priority"), 1)); bizTask.setPriority(option.priority);
bizTask.setTaskFrom(fromItem.getId()); bizTask.setTaskFrom(fromItem.getId());
bizTask.setAllocatedExecutorId(agvId); bizTask.setAllocatedExecutorId(agvId);
bizTask.setBizTaskPayload("N/A"); bizTask.setBizTaskPayload("N/A");
@ -490,6 +489,7 @@ public class RcsController {
bizTask.setBizTaskStatus(BizTaskStatus.WAITING_FOR_DISPATCH.toString()); bizTask.setBizTaskStatus(BizTaskStatus.WAITING_FOR_DISPATCH.toString());
PlanTaskSequence planSequence = new PlanTaskSequence(agvId, runtime, bizTask, "RcsScript"); PlanTaskSequence planSequence = new PlanTaskSequence(agvId, runtime, bizTask, "RcsScript");
planSequence.option = option;
return new RcsCommonParam(projectUUID, envId, agvId, option, bizTask, runtime, agv, planSequence, fromItem, fromDirection); return new RcsCommonParam(projectUUID, envId, agvId, option, bizTask, runtime, agv, planSequence, fromItem, fromDirection);
} }
@ -497,10 +497,10 @@ public class RcsController {
String projectUUID, String projectUUID,
Long envId, Long envId,
String agvId, String agvId,
Map<String, Object> option, RcsTaskOption option,
RcsTaskBiz bizTask, RcsTaskBiz bizTask,
LogisticsRuntime runtime, LogisticsRuntime runtime,
PtrAgvItem agv, AmrAgvItem agv,
PlanTaskSequence planSequence, PlanTaskSequence planSequence,
StaticItem fromItem, StaticItem fromItem,
LCCDirection fromDirection) { LCCDirection fromDirection) {

16
servo/src/main/java/com/yvan/workbench/model/request/DelInvLpnReq.java

@ -0,0 +1,16 @@
package com.yvan.workbench.model.request;
import lombok.Data;
/**
* 作者lizw <br/>
* 创建时间2025/07/30 10:20 <br/>
*/
@Data
public class DelInvLpnReq {
/** 托盘条码 */
private String lpn;
/** 库存位置 */
private String locCode;
private Long envId;
}

1
servo/src/main/java/com/yvan/workbench/model/request/QueryInvLpnReq.java

@ -12,4 +12,5 @@ public class QueryInvLpnReq {
private String lpn; private String lpn;
/** 库存位置 */ /** 库存位置 */
private String locCode; private String locCode;
private Long envId;
} }

25
servo/src/main/resources/application-dev.yml

@ -10,10 +10,14 @@ lcc:
# - projectUuid: tw_test # - projectUuid: tw_test
# envId: 1 # envId: 1
frontend-mqtt: frontend-mqtt:
brokerUrl: tcp://127.0.0.1:1883 # brokerUrl: tcp://127.0.0.1:1883
username: user # username: user
password: user # password: user
websocket: mqtt://127.0.0.1:7883 # websocket: mqtt://127.0.0.1:7883
brokerUrl: tcp://10.10.9.58:1885
username: admin
password: admin
websocket: mqtt://10.10.9.58:7885
mybatis: mybatis:
enable: true enable: true
@ -32,9 +36,13 @@ jdbc:
default-name: 'default' default-name: 'default'
data-source: data-source:
default: default:
jdbc-url: jdbc:p6spy:mysql://127.0.0.1:3306/rcs2_tw_zhanghui # jdbc-url: jdbc:p6spy:mysql://127.0.0.1:3306/rcs2_tw_zhanghui
username: rcs2_tw_zhanghui # jdbc-url: jdbc:p6spy:mysql://180.100.199.56:8306/rcs2_tw_zhanghui
password: Rcs2_tw_zhanghui # username: rcs2_tw_zhanghui
# password: Rcs2_tw_zhanghui
jdbc-url: jdbc:p6spy:mysql://10.10.9.58:3306/rcs2_tw_zhanghui
username: admin
password: admin123456
minimum-idle: 2 minimum-idle: 2
maximum-pool-size: 100 maximum-pool-size: 100
connection-test-query: 'select 1 from dual' connection-test-query: 'select 1 from dual'
@ -46,8 +54,9 @@ redis:
default: default:
mode: standalone mode: standalone
standalone: standalone:
host: '127.0.0.1' host: '10.10.9.58'
port: 6379 port: 6379
password: 'admin123456'
database: 0 database: 0
web: web:

92
servo/src/main/resources/application-jx.yml

@ -0,0 +1,92 @@
server:
port: 7779
app:
root-path: './'
lcc:
location: './lcc-map'
autoStart:
# - projectUuid: tw_test
# envId: 1
frontend-mqtt:
# brokerUrl: tcp://127.0.0.1:1883
# username: user
# password: user
# websocket: mqtt://127.0.0.1:7883
brokerUrl: tcp://180.100.199.56:7097
username: galaxis
password: Admin1234_
websocket: mqtt://180.100.199.56:9097
mybatis:
enable: true
watcher: true
interval: 1s
locations:
- fileType: filesystem
location: './servo/src/main/java'
filter: '**/*.xml'
#- fileType: jar
# location: 'classpath*:com/yvan/workbench/**/*.xml'
# filter: ''
jdbc:
enable: true
default-name: 'default'
data-source:
default:
# jdbc-url: jdbc:p6spy:mysql://127.0.0.1:3306/rcs2_tw_zhanghui
jdbc-url: jdbc:p6spy:mysql://180.100.199.56:8306/rcs2_tw_zhanghui
username: rcs2_tw_zhanghui
password: Rcs2_tw_zhanghui
minimum-idle: 2
maximum-pool-size: 100
connection-test-query: 'select 1 from dual'
redis:
enable: true
default-name: 'default'
data-source:
default:
mode: standalone
standalone:
host: '127.0.0.1'
port: 6379
database: 0
web:
resources:
enable: true
mappings:
- hosted-path: '/'
location: './servo/src/main/resources/static'
mvc:
path: '/api/'
http-method: [ 'POST', 'GET' ]
package-mapping:
- path-prefix: '/workbench'
package-prefix: 'com.yvan.workbench.controller'
allow-packages:
- 'com.yvan.workbench.controller.'
transactional-def-datasource: [ ]
def-transactional:
datasource: [ ]
timeout: -1
read-only: false
hot-reload:
enable: false
# watchFile: './build/.hotReload'
interval: 1s
exclude-packages: [ ]
exclude-classes: [ ]
locations:
- './servo/out/production/classes'
#- './servo/build/classes/java/main'
security:
enable: true
data-source:
jdbc-name: "default"
enable-redis: true
redis-name: "default"
redis-namespace: "yvan-lcc-bench"

94
servo/src/main/resources/application-prod.yml

@ -0,0 +1,94 @@
logging:
config: classpath:logback-spring.xml
file:
name: '${spring.application.name:server}'
path: '/home/galaxis/logs/${logging.file.name}'
server:
port: 7779
app:
root-path: '/home/galaxis/.jenkins/workspace/yvan-lcc-bench'
lcc:
location: '/home/galaxis/.jenkins/workspace/yvan-lcc-bench/lcc-map'
autoStart:
# - projectUuid: tw_test
# envId: 1
frontend-mqtt:
brokerUrl: tcp://10.10.9.58:1885
username: admin
password: admin
websocket: mqtt://10.10.9.58:7885
mybatis:
enable: true
watcher: true
interval: 1s
locations:
- fileType: filesystem
location: './servo/src/main/java'
filter: '**/*.xml'
#- fileType: jar
# location: 'classpath*:com/yvan/workbench/**/*.xml'
# filter: ''
jdbc:
enable: true
default-name: 'default'
data-source:
default:
jdbc-url: jdbc:p6spy:mysql://10.10.9.58:3306/rcs2_tw_zhanghui
username: admin
password: admin123456
minimum-idle: 2
maximum-pool-size: 100
connection-test-query: 'select 1 from dual'
redis:
enable: true
default-name: 'default'
data-source:
default:
mode: standalone
standalone:
host: '10.10.9.58'
port: 6379
password: 'admin123456'
database: 0
web:
resources:
enable: true
mappings:
- hosted-path: '/'
location: './servo/src/main/resources/static'
mvc:
path: '/api/'
http-method: [ 'POST', 'GET' ]
package-mapping:
- path-prefix: '/workbench'
package-prefix: 'com.yvan.workbench.controller'
allow-packages:
- 'com.yvan.workbench.controller.'
transactional-def-datasource: [ ]
def-transactional:
datasource: [ ]
timeout: -1
read-only: false
hot-reload:
enable: false
# watchFile: './build/.hotReload'
interval: 1s
exclude-packages: [ ]
exclude-classes: [ ]
locations:
- './servo/out/production/classes'
#- './servo/build/classes/java/main'
security:
enable: true
data-source:
jdbc-name: "default"
enable-redis: true
redis-name: "default"
redis-namespace: "yvan-lcc-bench"

2
servo/src/main/resources/logback-spring.xml

@ -93,7 +93,7 @@
</logger> </logger>
<!-- AMR 报文日志 --> <!-- AMR 报文日志 -->
<logger name="com.galaxis.rcs.ptr.AmrMessageHandler" level="DEBUG" additivity="false"> <logger name="com.galaxis.rcs.amr.AmrMessageHandler" level="DEBUG" additivity="false">
<appender-ref ref="AMR_FILE"/> <appender-ref ref="AMR_FILE"/>
<appender-ref ref="STDOUT1"/> <appender-ref ref="STDOUT1"/>
</logger> </logger>

Loading…
Cancel
Save