台湾展会用
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

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