From cdb9d471ad03d089f0209a07d6807bd618975c86 Mon Sep 17 00:00:00 2001 From: luoyifan Date: Fri, 27 Jun 2025 15:55:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=8E=20updatePosition=20=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=AE=8C=E6=88=90=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/galaxis/rcs/ptr/AmrMessageHandler.java | 1 + .../com/yvan/logisticsModel/PtrAgvDeviceTask.java | 2 + .../java/com/yvan/logisticsModel/PtrAgvItem.java | 87 ++++++++++++++-------- 3 files changed, 58 insertions(+), 32 deletions(-) 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 2777562..19ba758 100644 --- a/servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java +++ b/servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java @@ -426,6 +426,7 @@ public class AmrMessageHandler { // 这是源逻辑,CurLogicX / CurLogicY / CurDirection 需要到 PtrAgvItem 中更新, 因为要触发事件 agvItem.x = message.X; agvItem.y = message.Y; + agvItem.orientation = message.CurOrientation; agvItem.updatePosition(message.CurLogicX, message.CurLogicY, message.CurDirection); } diff --git a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvDeviceTask.java b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvDeviceTask.java index 0eb806f..79a93ac 100644 --- a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvDeviceTask.java +++ b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvDeviceTask.java @@ -38,4 +38,6 @@ public class PtrAgvDeviceTask { // 是否最后任务 public boolean isLastTask = false; + public int checkLogicX; + public int checkLogicY; } diff --git a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java index 76b8d84..883e3af 100644 --- a/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java +++ b/servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java @@ -261,6 +261,47 @@ public abstract class PtrAgvItem extends ExecutorItem { fireEvent(AgvEventType.DIRECTION_CHANGED, this, oldDirection, direction); } + + // 从 runningDeviceTaskList 里面,找到完成到什么阶段 + // 比如 (1,2) -> (2,2) -> (3,2) , 如果 updatePosition=3,2 ,那么前2个任务都要完成 + int finishTargetIndex = -1; + for (int i = 0; i < runningDeviceTaskList.size(); i++) { + PtrAgvDeviceTask task = runningDeviceTaskList.get(i); + if (task.checkLogicX == logicX && task.checkLogicY == logicY) { + finishTargetIndex = i; + break; + } + } + + boolean needCompute = false; + + if (finishTargetIndex > 0) { + needCompute = true; + // 标记前面的任务都完成了 + for (int i = 0; i < finishTargetIndex; i++) { + PtrAgvDeviceTask task = runningDeviceTaskList.get(i); + + task.taskStatus = 4; // 标记为完成 + task.taskGroupStatus = 4; // 标记为任务组完成 + fireEvent(AgvEventType.DEVICE_TASK_COMPLETE, this, task); + + // 更新计划任务 + RcsTaskPlan planTask = planTaskSequence.getByPlanTaskId(task.planTaskId); + if (planTask != null) { + planTask.setPlanTaskStatus(PlanTaskStatus.FINISHED.toString()); + planTaskSequence.savePlanTask(planTask); + } + } + + if (planTaskSequence.isAllCompleted()) { + fireEvent(AgvEventType.PLAN_COMPLETE, this); + planTaskSequence = null; + } + } + + if (needCompute) { + LockSupport.unpark(connectorThread); + } } /** @@ -277,38 +318,7 @@ public abstract class PtrAgvItem extends ExecutorItem { return; } - boolean needCompute = true; - for (PtrAgvDeviceTask task : runningDeviceTaskList) { - if (task.seqNo == seqNo) { - task.taskGroupStatus = messageStatus; - if (task.x == x && task.y == y) { - // 标记任务已完成, 4=完成 - task.taskStatus = 4; - } - - if (messageStatus == 4) { - fireEvent(AgvEventType.DEVICE_TASK_COMPLETE, this, task); - RcsTaskPlan planTask = planTaskSequence.getByPlanTaskId(task.planTaskId); - planTask.setPlanTaskStatus(PlanTaskStatus.FINISHED.toString()); - planTaskSequence.savePlanTask(planTask); - if (planTaskSequence.isAllCompleted()) { - fireEvent(AgvEventType.PLAN_COMPLETE, this); - planTaskSequence = null; - } - - } else { - log.error("messageStatus unkown messageStatus={}", messageStatus); - } - - } - // TODO: 3是什么? - if (task.taskGroupStatus < 3 /*|| task.taskStatus < 4*/) { - needCompute = false; - } - } - if (needCompute) { - LockSupport.unpark(connectorThread); - } + // 任务完成逻辑,在地标检查里 } @@ -458,6 +468,9 @@ public abstract class PtrAgvItem extends ExecutorItem { deviceTask.endPoint = pointItem; deviceTask.bizTaskId = plan.getBizTaskId(); deviceTask.planTaskId = plan.getPlanTaskId(); + // 行走任务完成后,检查用的字段 + deviceTask.checkLogicX = pointItem.logicX; + deviceTask.checkLogicY = pointItem.logicY; deviceTaskList.add(deviceTask); // 设置新的起点 startPoint = pointItem; @@ -633,6 +646,16 @@ public abstract class PtrAgvItem extends ExecutorItem { }; } + public short getAmrDirection(LCCDirection lccDirection) { + return switch (lccDirection) { + case RIGHT -> 0; + case DOWN -> 1; + case LEFT -> 2; + case UP -> 3; + default -> -1; // 未知方向 + }; + } + private String getRedisKey(String type) { return String.format("lcc:%s:%s:rcs:%s_%s", runtime.projectUUID, runtime.envId, type, this.getId());