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.collect.Lists; import com.yvan.logisticsModel.LogisticsRuntime; 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; public class PlanTaskSequence { @JsonIgnore public static final SnowFlake snowFlake = new SnowFlake(); public final String executorId; @JsonIgnore public final LogisticsRuntime logisticsRuntime; public final List taskList = Lists.newArrayList(); public final RcsTaskBiz bizTask; public final String createBy; public String lastWayPointId; public Float lastRotationAngle = null; public boolean isFinished = false; 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 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()); this.isFinished = true; return task; } /** * 输出方便阅读的 Json 格式 * * @return */ public Map toPrettyMap() { JsonWrapper jw = new JsonWrapper(); jw.set("executorId", executorId); jw.set("bizTask", bizTask); List 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 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; } list.add(taskStr); } jw.set("items", list); return jw.getInnerMap(); } }