You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
6.8 KiB
200 lines
6.8 KiB
package com.galaxis.rcs.plan;
|
|
|
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
|
import com.galaxis.rcs.common.entity.RcsTaskBiz;
|
|
import com.galaxis.rcs.common.entity.RcsTaskPlan;
|
|
import com.galaxis.rcs.common.enums.PlanTaskStatus;
|
|
import com.galaxis.rcs.common.enums.PlanTaskType;
|
|
import com.google.common.base.Splitter;
|
|
import com.google.common.collect.Lists;
|
|
import com.yvan.logisticsModel.LogisticsRuntime;
|
|
import lombok.SneakyThrows;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.clever.core.BannerUtils;
|
|
import org.clever.core.id.SnowFlake;
|
|
import org.clever.core.json.JsonWrapper;
|
|
|
|
import java.math.BigDecimal;
|
|
import java.util.Date;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
@Slf4j
|
|
public class PlanTaskSequence {
|
|
@JsonIgnore
|
|
public static final SnowFlake snowFlake = new SnowFlake();
|
|
public final String executorId;
|
|
@JsonIgnore
|
|
public final LogisticsRuntime logisticsRuntime;
|
|
public final List<RcsTaskPlan> taskList = Lists.newArrayList();
|
|
public final RcsTaskBiz bizTask;
|
|
public final String createBy;
|
|
|
|
public String lastWayPointId;
|
|
public Float lastRotationAngle = null;
|
|
public String lastLoadLpn = "";
|
|
|
|
public PlanTaskSequence(String executorId, LogisticsRuntime logisticsRuntime, RcsTaskBiz bizTask, String createBy) {
|
|
this.executorId = executorId;
|
|
this.logisticsRuntime = logisticsRuntime;
|
|
this.bizTask = bizTask;
|
|
this.createBy = createBy;
|
|
}
|
|
|
|
private RcsTaskPlan createTaskPlanEntity(String planType) {
|
|
RcsTaskPlan planTask = new RcsTaskPlan();
|
|
planTask.setPlanTaskId(snowFlake.nextId());
|
|
planTask.setBizTaskId(this.bizTask.getBizTaskId());
|
|
planTask.setEnvId(logisticsRuntime.logisticsEnv.getEnvId());
|
|
planTask.setPlanType(planType);
|
|
planTask.setExecutorId(this.executorId);
|
|
planTask.setSeq(taskList.size());
|
|
planTask.setPlanTaskStatus(PlanTaskStatus.PENDING.toString());
|
|
planTask.setPlanTaskErrorInfo("N/A");
|
|
planTask.setPlanTaskDescription("N/A");
|
|
planTask.setCreateBy(createBy);
|
|
planTask.setCreateAt(new Date());
|
|
|
|
taskList.add(planTask);
|
|
return planTask;
|
|
}
|
|
|
|
// 添加移动到指定路标点的动作
|
|
public RcsTaskPlan addMoveTo(String waypointId) {
|
|
RcsTaskPlan task = this.createTaskPlanEntity(PlanTaskType.MOVE.toString());
|
|
task.setTargetId(waypointId);
|
|
this.lastWayPointId = waypointId;
|
|
return task;
|
|
}
|
|
|
|
public RcsTaskPlan addMoveBackward(String wayPointId) {
|
|
RcsTaskPlan task = this.createTaskPlanEntity(PlanTaskType.MOVE_BACKWARD.toString());
|
|
task.setTargetId(wayPointId);
|
|
this.lastWayPointId = wayPointId;
|
|
return task;
|
|
}
|
|
|
|
// 添加旋转动作
|
|
public RcsTaskPlan addRotationTo(float rotationAngle) {
|
|
RcsTaskPlan task = this.createTaskPlanEntity(PlanTaskType.ROTATION.toString());
|
|
task.setTargetRotation(new BigDecimal(rotationAngle));
|
|
this.lastRotationAngle = rotationAngle;
|
|
return task;
|
|
}
|
|
|
|
// 添加取货动作
|
|
public RcsTaskPlan addLoad(String lpn, String rackId, int bay, int level, int cell) {
|
|
RcsTaskPlan task = this.createTaskPlanEntity(PlanTaskType.LOAD.toString());
|
|
task.setTargetId(rackId);
|
|
task.setTargetBay(bay);
|
|
task.setTargetLevel(level);
|
|
task.setTargetCell(cell);
|
|
this.lastLoadLpn = lpn;
|
|
return task;
|
|
}
|
|
|
|
// 添加放货动作
|
|
public RcsTaskPlan addUnload(String item, int level, int bay, int cell) {
|
|
RcsTaskPlan task = this.createTaskPlanEntity(PlanTaskType.UNLOAD.toString());
|
|
task.setTargetId(item);
|
|
task.setTargetBay(bay);
|
|
task.setTargetLevel(level);
|
|
task.setTargetCell(cell);
|
|
this.lastLoadLpn = "";
|
|
return task;
|
|
}
|
|
|
|
// 添加完成动作
|
|
public RcsTaskPlan addFinish() {
|
|
RcsTaskPlan task = this.createTaskPlanEntity(PlanTaskType.FINISH.toString());
|
|
return task;
|
|
}
|
|
|
|
/**
|
|
* 输出方便阅读的 Json 格式
|
|
*
|
|
* @return
|
|
*/
|
|
public Map<String, ?> toPrettyMap() {
|
|
JsonWrapper jw = new JsonWrapper();
|
|
jw.set("executorId", executorId);
|
|
jw.set("bizTask", bizTask);
|
|
List<String> list = Lists.newArrayList();
|
|
for (RcsTaskPlan task : taskList) {
|
|
String taskStr = "UNKNOWN:" + task.getPlanType();
|
|
switch (PlanTaskType.valueOf(task.getPlanType())) {
|
|
case MOVE:
|
|
taskStr = "MOVE " + task.getTargetId();
|
|
break;
|
|
case MOVE_BACKWARD:
|
|
taskStr = "MOVE_BACKWARD " + task.getTargetId();
|
|
break;
|
|
case LOAD:
|
|
taskStr = "LOAD " + task.getTargetId() + "_" + task.getTargetBay() + "_" + task.getTargetLevel() + "_" + task.getTargetCell();
|
|
break;
|
|
case UNLOAD:
|
|
taskStr = "UNLOAD " + task.getTargetId() + "_" + task.getTargetBay() + "_" + task.getTargetLevel() + "_" + task.getTargetCell();
|
|
break;
|
|
case ROTATION:
|
|
taskStr = "Rotation " + task.getTargetRotation();
|
|
break;
|
|
case FINISH:
|
|
taskStr = "FINISH";
|
|
break;
|
|
}
|
|
taskStr = taskStr + " STATE:" + task.getPlanTaskStatus();
|
|
|
|
list.add(taskStr);
|
|
}
|
|
jw.set("items", list);
|
|
return jw.getInnerMap();
|
|
}
|
|
|
|
/**
|
|
* 是不是所有的任务都完成了
|
|
*/
|
|
public boolean isAllCompleted() {
|
|
boolean isAllComplete = true;
|
|
for (RcsTaskPlan task : taskList) {
|
|
if (PlanTaskType.valueOf(task.getPlanType()) != PlanTaskType.FINISH) {
|
|
if (!PlanTaskStatus.FINISHED.toString().equals(task.getPlanTaskStatus())) {
|
|
isAllComplete = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return isAllComplete;
|
|
}
|
|
|
|
public RcsTaskPlan getByPlanTaskId(Long planTaskId) {
|
|
for (RcsTaskPlan task : taskList) {
|
|
if (task.getPlanTaskId().equals(planTaskId)) {
|
|
return task;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@SneakyThrows
|
|
public void savePlanTask(RcsTaskPlan planTask) {
|
|
//TODO: 保存数据库
|
|
var jw = new JsonWrapper(planTask);
|
|
jw.set("isAllCompleted", this.isAllCompleted());
|
|
|
|
var list = Splitter.on("\n").splitToList(jw.toString());
|
|
String[] ar = new String[list.size()];
|
|
list.toArray(ar);
|
|
|
|
|
|
// log.info("3-Received message: " + json);
|
|
BannerUtils.printConfig(log, "保存业务任务 planTask", ar);
|
|
}
|
|
|
|
public boolean isEmpty() {
|
|
return this.taskList.isEmpty();
|
|
}
|
|
|
|
public int size() {
|
|
return this.taskList.size();
|
|
}
|
|
}
|
|
|