Browse Source

从 updatePosition 检查任务完成情况

master
修宁 6 months ago
parent
commit
cdb9d471ad
  1. 1
      servo/src/main/java/com/galaxis/rcs/ptr/AmrMessageHandler.java
  2. 2
      servo/src/main/java/com/yvan/logisticsModel/PtrAgvDeviceTask.java
  3. 85
      servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java

1
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);
}

2
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;
}

85
servo/src/main/java/com/yvan/logisticsModel/PtrAgvItem.java

@ -261,56 +261,66 @@ public abstract class PtrAgvItem extends ExecutorItem {
fireEvent(AgvEventType.DIRECTION_CHANGED, this,
oldDirection, direction);
}
}
/**
* 更新设备任务状态 暂时没有处理任务取消相关的状态
*
* @param seqNo
* @param x
* @param y
* @param messageStatus
*/
public void updateDeviceTaskStatus(int seqNo, int x, int y, int messageStatus) {
// 更新任务状态逻辑
if (messageStatus < 2) {
return;
// 从 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 = 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) {
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;
}
} else {
log.error("messageStatus unkown messageStatus={}", messageStatus);
}
}
// TODO: 3是什么?
if (task.taskGroupStatus < 3 /*|| task.taskStatus < 4*/) {
needCompute = false;
}
}
if (needCompute) {
LockSupport.unpark(connectorThread);
}
}
/**
* 更新设备任务状态 暂时没有处理任务取消相关的状态
*
* @param seqNo
* @param x
* @param y
* @param messageStatus
*/
public void updateDeviceTaskStatus(int seqNo, int x, int y, int messageStatus) {
// 更新任务状态逻辑
if (messageStatus < 2) {
return;
}
// 任务完成逻辑,在地标检查里
}
public void updateRedisStatus() {
String statusKey = getRedisKey("status");
@ -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());

Loading…
Cancel
Save