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.Joiner; import com.google.common.collect.Lists; import com.yvan.entity.BasLocationVo; import com.yvan.logisticsModel.LogisticsRuntime; import lombok.extern.slf4j.Slf4j; 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 taskList = Lists.newArrayList(); public final RcsTaskBiz bizTask; public final String createBy; public String lastWayPointId; public Float lastRotationAngle = null; public String carryLpn; public BasLocationVo loadBasLocationVo; public BasLocationVo unloadBasLocationVo; public BasLocationVo executorVo; public int carryQty; 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.envId); 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 addChargerBackward(String chargerId) { RcsTaskPlan task = this.createTaskPlanEntity(PlanTaskType.CHARGE.toString()); task.setTargetId(chargerId); 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 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); return task; } // 添加放货动作 public RcsTaskPlan addUnload(String item, int bay, int level, int cell) { RcsTaskPlan task = this.createTaskPlanEntity(PlanTaskType.UNLOAD.toString()); task.setTargetId(item); task.setTargetBay(bay); task.setTargetLevel(level); task.setTargetCell(cell); return task; } // 添加完成动作 public RcsTaskPlan addFinish() { RcsTaskPlan task = this.createTaskPlanEntity(PlanTaskType.FINISH.toString()); 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 MOVE_BACKWARD: taskStr = "MOVE_BACKWARD " + task.getTargetId(); break; case CHARGE: taskStr = "CHARGE " + 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(); } @Override public String toString() { List list = Lists.newArrayList(); for (RcsTaskPlan task : taskList) { list.add(task.toString()); } return "PlanTaskSequence [biz=" + this.bizTask.toString() + "] taskList:" + Joiner.on("\n").join(list); } /** * 是不是所有的任务都完成了 */ 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; } public boolean isEmpty() { return this.taskList.isEmpty(); } public int taskTotalCount() { return this.taskList.size(); } public int completedCount() { int count = 0; for (RcsTaskPlan task : taskList) { if (PlanTaskStatus.FINISHED.toString().equals(task.getPlanTaskStatus())) { count++; } } return count; } }