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 05f3320..a4f350e 100644 --- a/servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java +++ b/servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java @@ -1,9 +1,7 @@ package com.galaxis.rcs.ptr; import com.galaxis.rcs.common.entity.RcsTaskPlan; -import com.galaxis.rcs.common.enums.LCCDirection; -import com.galaxis.rcs.common.enums.PlanTaskStatus; -import com.galaxis.rcs.common.enums.PlanTaskType; +import com.galaxis.rcs.common.enums.*; import com.galaxis.rcs.connector.cl2.Cl2DeviceConnector; import com.galaxis.rcs.plan.PlanTaskSequence; import com.galaxis.rcs.plan.path.PathUtils; @@ -13,6 +11,7 @@ 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.collect.Queues; +import com.yvan.entity.AgvStatusVo; import com.yvan.logisticsModel.ExecutorItem; import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.StaticItem; @@ -36,40 +35,40 @@ public abstract class PtrAgvItem extends ExecutorItem { private static final Redis redis = RedisAdmin.getRedis(); // ip - public String ip; + public volatile String ip; // agv名称 - public String agvName; + public volatile String agvName; // agv类型 - public String agvType; + public volatile String agvType; // agv型号 - public String agvModel; + public volatile String agvModel; // AMR功能型号 - public String agvFnModel; + public volatile String agvFnModel; // 电池信息 - public CurBatteryData battery; + public volatile CurBatteryData battery; // agv当前x坐标 - public double x; + public volatile double x; // agv当前y坐标 - public double y; + public volatile double y; // agv当前z坐标 - public double z; + public volatile double z; // 当前所在站点的逻辑X坐标 Int32 - public int logicX; + public volatile int logicX; // 当前所在站点的逻辑Y坐标 Int32 - public int logicY; + public volatile int logicY; // 当前方向 UInt8 0: X轴正向 1: Y轴正向 2: X轴负向 3: Y轴负向 15: 未知方向 - public short direction; + public volatile short direction; // agv当前转动角度值 - public double orientation; - public boolean isBlocked = false; + public volatile double orientation; + + private volatile boolean isPaused = false; + + private volatile PosDirection lastPausedPosition; // 任务模式 @Getter - private AmrTaskMode __taskMode; + private volatile AmrTaskMode __taskMode; - private volatile boolean isPaused = false; - private volatile PosDirection lastPausedPosition; - private volatile boolean isOnline = false; // 执行中的任务 public List runningDeviceTaskList = new ArrayList<>(); @@ -848,4 +847,39 @@ public abstract class PtrAgvItem extends ExecutorItem { return String.format("lcc:%s:%s:device:%s:%s", runtime.projectUuid, runtime.envId, this.getId(), type); } + + public AgvStatusVo getState() { + var ptr = this; + int taskCompleted = 0; + int taskTotalCount = 0; + if (ptr.planTaskSequence != null) { + taskCompleted = ptr.planTaskSequence.completedCount(); + taskTotalCount = ptr.planTaskSequence.taskTotalCount(); + } + return new AgvStatusVo( + ptr.id, + ptr.getT(), + ptr.isOnline, + ptr.isSystemManaged, + ptr.x, + ptr.y, + ptr.z, + ptr.logicX, + ptr.logicY, + PathUtils.getDirectionByArmDirection(ptr.direction), + ptr.orientation, + ptr.battery == null ? 0 : ptr.battery.SOC, + ptr.get__taskMode(), + ptr.getTaskStatus(), + ptr.isBlocked, + taskCompleted, + taskTotalCount, + ptr.planTaskSequence == null ? null : ptr.planTaskSequence.bizTask.getBizTaskId(), + ptr.planTaskSequence == null ? null : BizTaskType.fromString(ptr.planTaskSequence.bizTask.getBizType()), + ptr.planTaskSequence == null ? null : BizTaskStatus.fromString(ptr.planTaskSequence.bizTask.getBizTaskStatus()), + ptr.planTaskSequence == null ? null : ptr.planTaskSequence.bizTask.getTaskFrom(), + ptr.planTaskSequence == null ? null : ptr.planTaskSequence.bizTask.getTaskTo(), + ptr.planTaskSequence == null ? null : ptr.planTaskSequence.bizTask.getLpn() + ); + } } diff --git a/servo/src/main/java/com/yvan/entity/AgvStatusVo.java b/servo/src/main/java/com/yvan/entity/AgvStatusVo.java index dcfd921..07cd6c0 100644 --- a/servo/src/main/java/com/yvan/entity/AgvStatusVo.java +++ b/servo/src/main/java/com/yvan/entity/AgvStatusVo.java @@ -7,19 +7,21 @@ import com.galaxis.rcs.ptr.AmrTaskMode; public record AgvStatusVo(String id, String type, - double x, - double y, - double z, - int logicX, - int logicY, + Boolean isOnline, + Boolean isSystemManaged, + Double x, + Double y, + Double z, + Integer logicX, + Integer logicY, LCCDirection direction, - double orientation, - double soc, + Double orientation, + Double soc, AmrTaskMode mode, String taskStatus, - boolean isBlocked, - int taskCompleted, - int taskTotalCount, + Boolean isBlocked, + Integer taskCompleted, + Integer taskTotalCount, // 业务任务ID Long bizTaskId, BizTaskType bizTaskType, diff --git a/servo/src/main/java/com/yvan/logisticsModel/ExecutorItem.java b/servo/src/main/java/com/yvan/logisticsModel/ExecutorItem.java index 00a720f..f9e3914 100644 --- a/servo/src/main/java/com/yvan/logisticsModel/ExecutorItem.java +++ b/servo/src/main/java/com/yvan/logisticsModel/ExecutorItem.java @@ -1,6 +1,8 @@ package com.yvan.logisticsModel; import com.galaxis.rcs.plan.PlanTaskSequence; +import lombok.Getter; +import lombok.Setter; import java.util.Map; @@ -10,11 +12,31 @@ import java.util.Map; */ public abstract class ExecutorItem extends BaseItem { + /** + * 是否在线 + */ + @Getter + @Setter + public Boolean isOnline = true; + + /** + * 是否阻挡 + */ + @Setter + @Getter + public Boolean isBlocked = false; + + /** + * 是否系统托管 + */ + @Setter + @Getter + public boolean isSystemManaged = true; + public ExecutorItem(LogisticsRuntime logisticsRuntime, Map raw) { super(logisticsRuntime, raw); } - /** * 执行器是否空闲 */ diff --git a/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java b/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java index 019c4b4..78780ce 100644 --- a/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java +++ b/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java @@ -166,11 +166,25 @@ public class LogisticsRuntime { switch (type) { case ONLINE: // AGV上线 + sender.setIsOnline(true); this.frontendMessagePushService.pushDeviceAlive(sender.id, sender.getT(), true); break; case OFFLINE: // AGV下线 + sender.setIsOnline(false); + this.frontendMessagePushService.pushDeviceAlive(sender.id, sender.getT(), true); + break; + + case BLOCKED: + // AGV上线 + sender.setIsBlocked(true); + this.frontendMessagePushService.pushDeviceAlive(sender.id, sender.getT(), true); + break; + + case BLOCKED_RECOVER: + // AGV上线 + sender.setIsBlocked(false); this.frontendMessagePushService.pushDeviceAlive(sender.id, sender.getT(), true); break; @@ -182,8 +196,7 @@ public class LogisticsRuntime { case PLAN_TASK_SEQUENCE_CANCEL: case PLAN_TASK_SEQUENCE_PAUSE: case PLAN_TASK_SEQUENCE_RESUME: - case BLOCKED: - case BLOCKED_RECOVER: + case POS_CHANGED: case DIRECTION_CHANGED: case LOW_BATTERY: @@ -191,36 +204,7 @@ public class LogisticsRuntime { // 设备状态变化 if (sender instanceof PtrAgvItem) { var ptr = (PtrAgvItem) sender; - int taskCompleted = 0; - int taskTotalCount = 0; - if (ptr.planTaskSequence != null) { - taskCompleted = ptr.planTaskSequence.completedCount(); - taskTotalCount = ptr.planTaskSequence.taskTotalCount(); - } - var status = new AgvStatusVo( - sender.id, - sender.getT(), - ptr.x, - ptr.y, - ptr.z, - ptr.logicX, - ptr.logicY, - PathUtils.getDirectionByArmDirection(ptr.direction), - ptr.orientation, - ptr.battery.SOC, - ptr.get__taskMode(), - ptr.getTaskStatus(), - ptr.isBlocked, - taskCompleted, - taskTotalCount, - ptr.planTaskSequence == null ? null : ptr.planTaskSequence.bizTask.getBizTaskId(), - ptr.planTaskSequence == null ? null : BizTaskType.fromString(ptr.planTaskSequence.bizTask.getBizType()), - ptr.planTaskSequence == null ? null : BizTaskStatus.fromString(ptr.planTaskSequence.bizTask.getBizTaskStatus()), - ptr.planTaskSequence == null ? null : ptr.planTaskSequence.bizTask.getTaskFrom(), - ptr.planTaskSequence == null ? null : ptr.planTaskSequence.bizTask.getTaskTo(), - ptr.planTaskSequence == null ? null : ptr.planTaskSequence.bizTask.getLpn() - ); - this.frontendMessagePushService.pushDeviceStatus(sender.id, status); + this.frontendMessagePushService.pushDeviceStatus(sender.id, ptr.getState()); } else { log.error("AGV事件类型 {} 仅支持 PtrAgvItem 类型的执行器", type); diff --git a/servo/src/main/java/com/yvan/workbench/controller/LccController.java b/servo/src/main/java/com/yvan/workbench/controller/LccController.java index 9a9f8e8..78705e1 100644 --- a/servo/src/main/java/com/yvan/workbench/controller/LccController.java +++ b/servo/src/main/java/com/yvan/workbench/controller/LccController.java @@ -1,7 +1,11 @@ package com.yvan.workbench.controller; import com.galaxis.rcs.RCSService; +import com.galaxis.rcs.ptr.PtrAgvItem; import com.google.common.base.Strings; +import com.google.common.collect.Lists; +import com.yvan.entity.AgvStatusVo; +import com.yvan.logisticsModel.LogisticsRuntimeService; import com.yvan.workbench.SpringContext; import com.yvan.workbench.service.LccMapService; import org.clever.core.Conv; @@ -92,8 +96,8 @@ public class LccController { ) ) .innerJoin(lccBasContainer).on( - lccInvLpn.lpn.eq(lccInvLpn.lpn).and( - lccInvLpn.envId.eq(lccInvLpn.envId) + lccInvLpn.lpn.eq(lccBasContainer.lpn).and( + lccInvLpn.envId.eq(lccBasContainer.envId) ) ) .where(lccInvLpn.envId.eq(envId)); @@ -128,6 +132,32 @@ public class LccController { return R.success(list); } + public static R queryDeviceInfoList(@RequestBody Map params) { + String projectUuid = Conv.asString(params.get("projectUUID")); + Long envId = Conv.asLong(params.get("envId")); + + if (Strings.isNullOrEmpty(projectUuid)) { + return R.fail("projectUUID Must not be empty"); + } + if (envId == null || envId < 0) { + return R.fail("envId Must not be empty"); + } + + var runtime = LogisticsRuntimeService.INSTANCE.getByProjectEnv(projectUuid, envId); + if (runtime == null) { + return R.fail("Project environment is not running"); + } + + // 拿到所有的车 + List agvStatusList = Lists.newArrayList(); + for (var executor : runtime.executorItemMap.values()) { + if (executor instanceof PtrAgvItem) { + agvStatusList.add(((PtrAgvItem) executor).getState()); + } + } + return R.success(agvStatusList); + } + public static R saveAndSyncScripts(@RequestBody Map params) { String projectUuid = Conv.asString(params.get("projectUUID")); Long envId = Conv.asLong(params.get("envId"));