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;
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<PtrAgvDeviceTask> 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()
);
}
}

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,
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,

24
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<String, Object> raw) {
super(logisticsRuntime, raw);
}
/**
* 执行器是否空闲
*/

48
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);

34
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<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) {
String projectUuid = Conv.asString(params.get("projectUUID"));
Long envId = Conv.asLong(params.get("envId"));

Loading…
Cancel
Save