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.galaxis.rcs.ptr.ArmMessageType; import com.google.common.base.Splitter; import com.google.common.collect.Lists; import com.yvan.logisticsModel.LogisticsRuntime; import com.yvan.logisticsModel.PtrAgvDeviceTask; 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 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 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 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(); } /** * 是不是所有的任务都完成了 */ public boolean isAllCompleted() { boolean isAllComplete = true; for (RcsTaskPlan task : taskList) { 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); 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); } }