Browse Source

pallet 无法出现的问题

master
修宁 6 months ago
parent
commit
d6020b87bd
  1. 76
      servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java
  2. 22
      servo/src/main/java/com/yvan/entity/AgvStatusVo.java
  3. 24
      servo/src/main/java/com/yvan/logisticsModel/ExecutorItem.java
  4. 48
      servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java
  5. 34
      servo/src/main/java/com/yvan/workbench/controller/LccController.java

76
servo/src/main/java/com/galaxis/rcs/ptr/PtrAgvItem.java

@ -1,9 +1,7 @@
package com.galaxis.rcs.ptr; package com.galaxis.rcs.ptr;
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.*;
import com.galaxis.rcs.common.enums.PlanTaskStatus;
import com.galaxis.rcs.common.enums.PlanTaskType;
import com.galaxis.rcs.connector.cl2.Cl2DeviceConnector; import com.galaxis.rcs.connector.cl2.Cl2DeviceConnector;
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;
@ -13,6 +11,7 @@ import com.galaxis.rcs.ptr.sendEntity.RcsConfigMessage;
import com.galaxis.rcs.ptr.sendEntity.RcsSRMessage; import com.galaxis.rcs.ptr.sendEntity.RcsSRMessage;
import com.galaxis.rcs.ptr.sendEntity.RcsSetLocationMessage; import com.galaxis.rcs.ptr.sendEntity.RcsSetLocationMessage;
import com.google.common.collect.Queues; import com.google.common.collect.Queues;
import com.yvan.entity.AgvStatusVo;
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;
@ -36,40 +35,40 @@ public abstract class PtrAgvItem extends ExecutorItem {
private static final Redis redis = RedisAdmin.getRedis(); private static final Redis redis = RedisAdmin.getRedis();
// ip // ip
public String ip; public volatile String ip;
// agv名称 // agv名称
public String agvName; public volatile String agvName;
// agv类型 // agv类型
public String agvType; public volatile String agvType;
// agv型号 // agv型号
public String agvModel; public volatile String agvModel;
// AMR功能型号 // AMR功能型号
public String agvFnModel; public volatile String agvFnModel;
// 电池信息 // 电池信息
public CurBatteryData battery; public volatile CurBatteryData battery;
// agv当前x坐标 // agv当前x坐标
public double x; public volatile double x;
// agv当前y坐标 // agv当前y坐标
public double y; public volatile double y;
// agv当前z坐标 // agv当前z坐标
public double z; public volatile double z;
// 当前所在站点的逻辑X坐标 Int32 // 当前所在站点的逻辑X坐标 Int32
public int logicX; public volatile int logicX;
// 当前所在站点的逻辑Y坐标 Int32 // 当前所在站点的逻辑Y坐标 Int32
public int logicY; public volatile int logicY;
// 当前方向 UInt8 0: X轴正向 1: Y轴正向 2: X轴负向 3: Y轴负向 15: 未知方向 // 当前方向 UInt8 0: X轴正向 1: Y轴正向 2: X轴负向 3: Y轴负向 15: 未知方向
public short direction; public volatile short direction;
// agv当前转动角度值 // agv当前转动角度值
public double orientation; public volatile double orientation;
public boolean isBlocked = false;
private volatile boolean isPaused = false;
private volatile PosDirection lastPausedPosition;
// 任务模式 // 任务模式
@Getter @Getter
private AmrTaskMode __taskMode; private volatile AmrTaskMode __taskMode;
private volatile boolean isPaused = false;
private volatile PosDirection lastPausedPosition;
private volatile boolean isOnline = false;
// 执行中的任务 // 执行中的任务
public List<PtrAgvDeviceTask> runningDeviceTaskList = new ArrayList<>(); public List<PtrAgvDeviceTask> runningDeviceTaskList = new ArrayList<>();
@ -848,4 +847,39 @@ public abstract class PtrAgvItem extends ExecutorItem {
return String.format("lcc:%s:%s:device:%s:%s", return String.format("lcc:%s:%s:device:%s:%s",
runtime.projectUuid, runtime.envId, this.getId(), type); 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()
);
}
} }

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

@ -7,19 +7,21 @@ import com.galaxis.rcs.ptr.AmrTaskMode;
public record AgvStatusVo(String id, public record AgvStatusVo(String id,
String type, String type,
double x, Boolean isOnline,
double y, Boolean isSystemManaged,
double z, Double x,
int logicX, Double y,
int logicY, Double z,
Integer logicX,
Integer logicY,
LCCDirection direction, LCCDirection direction,
double orientation, Double orientation,
double soc, Double soc,
AmrTaskMode mode, AmrTaskMode mode,
String taskStatus, String taskStatus,
boolean isBlocked, Boolean isBlocked,
int taskCompleted, Integer taskCompleted,
int taskTotalCount, Integer taskTotalCount,
// 业务任务ID // 业务任务ID
Long bizTaskId, Long bizTaskId,
BizTaskType bizTaskType, BizTaskType bizTaskType,

24
servo/src/main/java/com/yvan/logisticsModel/ExecutorItem.java

@ -1,6 +1,8 @@
package com.yvan.logisticsModel; package com.yvan.logisticsModel;
import com.galaxis.rcs.plan.PlanTaskSequence; import com.galaxis.rcs.plan.PlanTaskSequence;
import lombok.Getter;
import lombok.Setter;
import java.util.Map; import java.util.Map;
@ -10,11 +12,31 @@ import java.util.Map;
*/ */
public abstract class ExecutorItem extends BaseItem { 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<String, Object> raw) { public ExecutorItem(LogisticsRuntime logisticsRuntime, Map<String, Object> raw) {
super(logisticsRuntime, raw); super(logisticsRuntime, raw);
} }
/** /**
* 执行器是否空闲 * 执行器是否空闲
*/ */

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

@ -166,11 +166,25 @@ public class LogisticsRuntime {
switch (type) { switch (type) {
case ONLINE: case ONLINE:
// AGV上线 // AGV上线
sender.setIsOnline(true);
this.frontendMessagePushService.pushDeviceAlive(sender.id, sender.getT(), true); this.frontendMessagePushService.pushDeviceAlive(sender.id, sender.getT(), true);
break; break;
case OFFLINE: case OFFLINE:
// AGV下线 // 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); this.frontendMessagePushService.pushDeviceAlive(sender.id, sender.getT(), true);
break; break;
@ -182,8 +196,7 @@ public class LogisticsRuntime {
case PLAN_TASK_SEQUENCE_CANCEL: case PLAN_TASK_SEQUENCE_CANCEL:
case PLAN_TASK_SEQUENCE_PAUSE: case PLAN_TASK_SEQUENCE_PAUSE:
case PLAN_TASK_SEQUENCE_RESUME: case PLAN_TASK_SEQUENCE_RESUME:
case BLOCKED:
case BLOCKED_RECOVER:
case POS_CHANGED: case POS_CHANGED:
case DIRECTION_CHANGED: case DIRECTION_CHANGED:
case LOW_BATTERY: case LOW_BATTERY:
@ -191,36 +204,7 @@ public class LogisticsRuntime {
// 设备状态变化 // 设备状态变化
if (sender instanceof PtrAgvItem) { if (sender instanceof PtrAgvItem) {
var ptr = (PtrAgvItem) sender; var ptr = (PtrAgvItem) sender;
int taskCompleted = 0; this.frontendMessagePushService.pushDeviceStatus(sender.id, ptr.getState());
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);
} else { } else {
log.error("AGV事件类型 {} 仅支持 PtrAgvItem 类型的执行器", type); log.error("AGV事件类型 {} 仅支持 PtrAgvItem 类型的执行器", type);

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

@ -1,7 +1,11 @@
package com.yvan.workbench.controller; package com.yvan.workbench.controller;
import com.galaxis.rcs.RCSService; import com.galaxis.rcs.RCSService;
import com.galaxis.rcs.ptr.PtrAgvItem;
import com.google.common.base.Strings; 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.SpringContext;
import com.yvan.workbench.service.LccMapService; import com.yvan.workbench.service.LccMapService;
import org.clever.core.Conv; import org.clever.core.Conv;
@ -92,8 +96,8 @@ public class LccController {
) )
) )
.innerJoin(lccBasContainer).on( .innerJoin(lccBasContainer).on(
lccInvLpn.lpn.eq(lccInvLpn.lpn).and( lccInvLpn.lpn.eq(lccBasContainer.lpn).and(
lccInvLpn.envId.eq(lccInvLpn.envId) lccInvLpn.envId.eq(lccBasContainer.envId)
) )
) )
.where(lccInvLpn.envId.eq(envId)); .where(lccInvLpn.envId.eq(envId));
@ -128,6 +132,32 @@ public class LccController {
return R.success(list); return R.success(list);
} }
public static R<?> queryDeviceInfoList(@RequestBody Map<String, Object> 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<AgvStatusVo> 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<String, Object> params) { public static R<?> saveAndSyncScripts(@RequestBody Map<String, Object> params) {
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"));

Loading…
Cancel
Save