From 87033a4eec31b330cb7a6ef8ad3d656f88111117 Mon Sep 17 00:00:00 2001 From: luoyifan Date: Fri, 4 Jul 2025 16:15:04 +0800 Subject: [PATCH 1/2] =?UTF-8?q?Agv=20Event=20=E4=BD=93=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/galaxis/rcs/ptr/PtrAgvItem.java | 26 +++++++++------------- .../com/yvan/logisticsModel/LogisticsRuntime.java | 16 +++++++++++++ 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java b/servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java index 6c4fc80..9c41441 100644 --- a/servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java +++ b/servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java @@ -12,16 +12,12 @@ import com.galaxis.rcs.ptr.receiveEntity.base.CurBatteryData; import com.galaxis.rcs.ptr.sendEntity.RcsConfigMessage; import com.galaxis.rcs.ptr.sendEntity.RcsSRMessage; import com.galaxis.rcs.ptr.sendEntity.RcsSetLocationMessage; -import com.google.common.base.Joiner; import com.google.common.collect.Queues; -import com.yvan.LccUtils; -import com.yvan.event.AgvEventType; import com.yvan.logisticsModel.ExecutorItem; import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.StaticItem; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import org.clever.core.BannerUtils; import org.clever.data.redis.Redis; import org.clever.data.redis.RedisAdmin; @@ -86,7 +82,7 @@ public abstract class PtrAgvItem extends ExecutorItem { final Cl2DeviceConnector cl2DeviceConnector = new Cl2DeviceConnector(this.runtime); - final AmrMessageHandler amrMessageHandler; + public final AmrMessageHandler amrMessageHandler; /** * 连接器线程 @@ -338,16 +334,16 @@ public abstract class PtrAgvItem extends ExecutorItem { } } - BannerUtils.printConfig(log, "updatePosition", new String[]{ - "logicX: " + logicX, - "logicY: " + logicY, - "direction: " + direction, - "finishTargetIndex: " + finishTargetIndex, - "runningDeviceSize:" + (this.runningDeviceTaskList == null ? "null" : this.runningDeviceTaskList.size()), - "planTask:" + (this.planTaskSequence == null ? "null" : - ("\n" + Joiner.on("\n").join((List) this.planTaskSequence.toPrettyMap().get("items"))) - ) - }); + // BannerUtils.printConfig(log, "updatePosition", new String[]{ + // "logicX: " + logicX, + // "logicY: " + logicY, + // "direction: " + direction, + // "finishTargetIndex: " + finishTargetIndex, + // "runningDeviceSize:" + (this.runningDeviceTaskList == null ? "null" : this.runningDeviceTaskList.size()), + // "planTask:" + (this.planTaskSequence == null ? "null" : + // ("\n" + Joiner.on("\n").join((List) this.planTaskSequence.toPrettyMap().get("items"))) + // ) + // }); if (needCompute && this.runningDeviceTaskList.size() > 0) { int index = this.runningDeviceTaskList.size() - 1; diff --git a/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java b/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java index 432f76e..069c961 100644 --- a/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java +++ b/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java @@ -11,6 +11,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.yvan.event.AgvEventManager; +import com.yvan.event.AgvEventType; import com.yvan.mqtt.FrontendMessagePushService; import com.yvan.redis.LccRedisService; import com.yvan.workbench.model.entity.LccProject; @@ -121,6 +122,21 @@ public class LogisticsRuntime { this.envId = env.getEnvId(); this.isVirtual = env.getIsVirtual(); this.serverId = serverId; + + this.setupEventHandle(); + } + + private void setupEventHandle() { + eventManager.subscribe((AgvEventType type, Object... args) -> { + ExecutorItem sender = (ExecutorItem) args[0]; + + String[] eventArgs = new String[args.length - 1]; + for (int i = 1; i < args.length; i++) { + eventArgs[i - 1] = Conv.asString(args[i]); + } + + BannerUtils.printConfig(log, this.projectUuid + "(" + this.envId + ") " + type + " AGV:" + sender.getId(), eventArgs); + }); } /** From 0cbe63d635dc8a8575a4e22df813ae1be7aa9ea3 Mon Sep 17 00:00:00 2001 From: luoyifan Date: Fri, 4 Jul 2025 18:22:27 +0800 Subject: [PATCH 2/2] =?UTF-8?q?Agv=20Event=20=E4=BD=93=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/galaxis/rcs/common/entity/RcsTaskBiz.java | 75 ++++++++++--- .../com/galaxis/rcs/common/entity/RcsTaskPlan.java | 118 +++++++++++++++++---- .../com/galaxis/rcs/plan/PlanTaskSequence.java | 25 ++--- .../com/galaxis/rcs/ptr/AmrMessageHandler.java | 4 +- .../main/java/com/galaxis/rcs/ptr/PtrAgvItem.java | 14 +-- 5 files changed, 175 insertions(+), 61 deletions(-) diff --git a/servo/src/main/java/com/galaxis/rcs/common/entity/RcsTaskBiz.java b/servo/src/main/java/com/galaxis/rcs/common/entity/RcsTaskBiz.java index 1e19de5..59c0296 100644 --- a/servo/src/main/java/com/galaxis/rcs/common/entity/RcsTaskBiz.java +++ b/servo/src/main/java/com/galaxis/rcs/common/entity/RcsTaskBiz.java @@ -1,44 +1,85 @@ package com.galaxis.rcs.common.entity; import lombok.Data; +import lombok.Getter; +import lombok.Setter; + import java.io.Serializable; import java.util.Date; /** * (rcs_task_biz) */ -@Data +@Getter +@Setter public class RcsTaskBiz implements Serializable { - /** */ + /** + * + */ private Long bizTaskId; - /** 环境ID */ + /** + * 环境ID + */ private Long envId; - /** 任务类型 */ + /** + * 任务类型 + */ private String bizType; - /** 托盘ID */ + /** + * 托盘ID + */ private String lpn; - /** 任务优先级 */ + /** + * 任务优先级 + */ private Integer priority; - /** 任务起始点 */ + /** + * 任务起始点 + */ private String taskFrom; - /** 任务目标点 */ + /** + * 任务目标点 + */ private String taskTo; - /** 系统分配的执行器ID */ + /** + * 系统分配的执行器ID + */ private String allocatedExecutorId; - /** 任务负载信息 */ + /** + * 任务负载信息 + */ private String bizTaskPayload; - /** 异常提示信息 */ + /** + * 异常提示信息 + */ private String bizTaskErrorInfo; - /** 任务描述 */ + /** + * 任务描述 + */ private String bizTaskDescription; - /** 任务状态 */ + /** + * 任务状态 + */ private String bizTaskStatus; - /** 创建时间 */ + /** + * 创建时间 + */ private Date createAt; - /** 创建人 */ + /** + * 创建人 + */ private String createBy; - /** 更新时间 */ + /** + * 更新时间 + */ private Date updateAt; - /** 更新人 */ + /** + * 更新人 + */ private String updateBy; + + @Override + public String toString() { + return "RcsTaskBiz(" + bizTaskId + ", executor='" + allocatedExecutorId + ", status='" + bizTaskStatus + ")"; + } } diff --git a/servo/src/main/java/com/galaxis/rcs/common/entity/RcsTaskPlan.java b/servo/src/main/java/com/galaxis/rcs/common/entity/RcsTaskPlan.java index 6b9189c..1fbac7b 100644 --- a/servo/src/main/java/com/galaxis/rcs/common/entity/RcsTaskPlan.java +++ b/servo/src/main/java/com/galaxis/rcs/common/entity/RcsTaskPlan.java @@ -1,6 +1,10 @@ package com.galaxis.rcs.common.entity; +import com.galaxis.rcs.common.enums.PlanTaskType; import lombok.Data; +import lombok.Getter; +import lombok.Setter; + import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; @@ -8,46 +12,118 @@ import java.util.Date; /** * (rcs_task_plan) */ -@Data +@Getter +@Setter public class RcsTaskPlan implements Serializable { - /** 规划ID */ + /** + * 规划ID + */ private Long planTaskId; - /** 业务任务ID */ + /** + * 业务任务ID + */ private Long bizTaskId; - /** 环境ID */ + /** + * 环境ID + */ private Long envId; - /** 规划类型 */ + /** + * 规划类型 + */ private String planType; - /** 执行器ID */ + /** + * 执行器ID + */ private String executorId; - /** 规划序号 */ + /** + * 规划序号 + */ private Integer seq; - /** 目标点ID */ + /** + * 目标点ID + */ private String targetId; - /** 目标点货架列 */ + /** + * 目标点货架列 + */ private Integer targetBay; - /** 目标点货架层 */ + /** + * 目标点货架层 + */ private Integer targetLevel; - /** 目标点货架格 */ + /** + * 目标点货架格 + */ private Integer targetCell; - /** 目标点旋转角度 */ + /** + * 目标点旋转角度 + */ private BigDecimal targetRotation; - /** 背负托盘ID */ + /** + * 背负托盘ID + */ private String loadLpn; - /** 任务负载信息 */ + /** + * 任务负载信息 + */ private String planTaskPayload; - /** 规划执行状态 */ + /** + * 规划执行状态 + */ private String planTaskStatus; - /** 异常提示信息 */ + /** + * 异常提示信息 + */ private String planTaskErrorInfo; - /** 任务描述 */ + /** + * 任务描述 + */ private String planTaskDescription; - /** 创建时间 */ + /** + * 创建时间 + */ private Date createAt; - /** 创建人 */ + /** + * 创建人 + */ private String createBy; - /** 更新时间 */ + /** + * 更新时间 + */ private Date updateAt; - /** 更新人 */ + /** + * 更新人 + */ private String updateBy; + + @Override + public String toString() { + var task = this; + String taskStr = "UNKNOWN:" + task.getPlanType(); + switch (PlanTaskType.valueOf(task.getPlanType())) { + case MOVE: + taskStr = "MOVE " + task.getTargetId(); + break; + case MOVE_BACKWARD: + taskStr = "MOVE_BACKWARD " + task.getTargetId(); + break; + case CHARGE: + taskStr = "CHARGE " + task.getTargetId(); + break; + case LOAD: + taskStr = "LOAD " + task.getTargetId() + "_" + task.getTargetBay() + "_" + task.getTargetLevel() + "_" + task.getTargetCell(); + break; + case UNLOAD: + taskStr = "UNLOAD " + task.getTargetId() + "_" + task.getTargetBay() + "_" + task.getTargetLevel() + "_" + task.getTargetCell(); + break; + case ROTATION: + taskStr = "Rotation " + task.getTargetRotation(); + break; + case FINISH: + taskStr = "FINISH"; + break; + } + taskStr = taskStr + " STATE:" + task.getPlanTaskStatus(); + return taskStr; + } } diff --git a/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java b/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java index f3b68f2..b73e4d6 100644 --- a/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java +++ b/servo/src/main/java/com/galaxis/rcs/plan/PlanTaskSequence.java @@ -5,6 +5,7 @@ import com.galaxis.rcs.common.entity.RcsTaskBiz; import com.galaxis.rcs.common.entity.RcsTaskPlan; import com.galaxis.rcs.common.enums.PlanTaskStatus; import com.galaxis.rcs.common.enums.PlanTaskType; +import com.google.common.base.Joiner; import com.google.common.base.Splitter; import com.google.common.collect.Lists; import com.yvan.logisticsModel.LogisticsRuntime; @@ -159,6 +160,15 @@ public class PlanTaskSequence { return jw.getInnerMap(); } + @Override + public String toString() { + List list = Lists.newArrayList(); + for (RcsTaskPlan task : taskList) { + list.add(task.toString()); + } + return "PlanTaskSequence [biz=" + this.bizTask.toString() + "] taskList:" + Joiner.on("\n").join(list); + } + /** * 是不是所有的任务都完成了 */ @@ -184,21 +194,6 @@ public class PlanTaskSequence { return null; } - @SneakyThrows - public void savePlanTask(RcsTaskPlan planTask) { - //TODO: 保存数据库 - var jw = new JsonWrapper(planTask); - jw.set("isAllCompleted", this.isAllCompleted()); - - var list = Splitter.on("\n").splitToList(jw.toString()); - String[] ar = new String[list.size()]; - list.toArray(ar); - - - // log.info("3-Received message: " + json); - BannerUtils.printConfig(log, "保存业务任务 planTask", ar); - } - public boolean isEmpty() { return this.taskList.isEmpty(); } diff --git a/servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java b/servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java index 00d88a2..49e482b 100644 --- a/servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java +++ b/servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java @@ -136,7 +136,7 @@ public class AmrMessageHandler { String[] ar = new String[list.size()]; list.toArray(ar); // log.info("3-Received message: " + json); - BannerUtils.printConfig(log, "MQTT 收到报文 [" + id + "] ArmMessageType." + ArmMessageType.fromValue(id) + " - " + ArmMessageType.fromValue(id).description, ar); + // BannerUtils.printConfig(log, "MQTT 收到报文 [" + id + "] ArmMessageType." + ArmMessageType.fromValue(id) + " - " + ArmMessageType.fromValue(id).description, ar); } AmrMessage amrMessage = null; @@ -210,7 +210,7 @@ public class AmrMessageHandler { var list = Splitter.on("\n").splitToList(new JsonWrapper(payload).toString()); String[] ar = new String[list.size()]; list.toArray(ar); - BannerUtils.printConfig(log, "MQTT 发送报文 [" + id + "] RcsMessageType." + RcsMessageType.fromValue(id) + " - " + RcsMessageType.fromValue(id).description, ar); + // BannerUtils.printConfig(log, "MQTT 发送报文 [" + id + "] RcsMessageType." + RcsMessageType.fromValue(id) + " - " + RcsMessageType.fromValue(id).description, ar); } log.debug("发送消息: {}", payload); ptrMqttClient.publish(topic, payload); diff --git a/servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java b/servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java index 9c41441..15dea96 100644 --- a/servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java +++ b/servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java @@ -18,6 +18,7 @@ import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.StaticItem; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.clever.core.Conv; import org.clever.data.redis.Redis; import org.clever.data.redis.RedisAdmin; @@ -243,9 +244,10 @@ public abstract class PtrAgvItem extends ExecutorItem { for (PtrAgvDeviceTask task : runningDeviceTaskList) { task.taskGroupStatus = taskStatus; if (taskStatus == 4) { - - this.runtime.eventManager.fireDeviceTaskCompleteEvent(this, task); - task.taskStatus = 4; + if (task.taskStatus != 4) { + this.runtime.eventManager.fireDeviceTaskCompleteEvent(this, task); + task.taskStatus = 4; + } // 更新计划任务 List planTaskList = planTaskSequence.taskList.stream().filter(pt -> task.movePlanTaskId.equals(pt.getPlanTaskId()) || task.planTaskIdSet.contains(pt.getPlanTaskId())).toList(); @@ -253,9 +255,9 @@ public abstract class PtrAgvItem extends ExecutorItem { if (PlanTaskStatus.FINISHED.toString().equals(planTask.getPlanTaskStatus())) { continue; } - this.runtime.eventManager.firePlanTaskCompleteEvent(this, planTaskSequence, planTask); + planTask.setPlanTaskStatus(PlanTaskStatus.FINISHED.toString()); - planTaskSequence.savePlanTask(planTask); + this.runtime.eventManager.firePlanTaskCompleteEvent(this, planTaskSequence, planTask); } } } @@ -393,7 +395,7 @@ public abstract class PtrAgvItem extends ExecutorItem { statusMap.put("direction", String.valueOf(direction)); statusMap.put("orientation", String.valueOf(orientation)); statusMap.put("soc", this.battery == null ? "-1" : String.valueOf(this.battery.SOC)); - statusMap.put("mode", this.__taskMode.toString()); + statusMap.put("mode", Conv.asString(this.__taskMode)); statusMap.put("taskStatus", getTaskStatus()); redis.hPutAll(statusKey, statusMap);