//package com.zy.asrs.wcs.rcs.kernel.command; // //import com.zy.asrs.common.wms.mapper.WrkMastMapper; //import com.zy.asrs.common.wms.service.LocMastService; //import com.zy.asrs.wcs.core.utils.NavigateMapUtils; //import com.zy.asrs.wcs.core.utils.RedisUtil; //import lombok.extern.slf4j.Slf4j; //import org.springframework.beans.factory.annotation.Autowired; //import org.springframework.stereotype.Service; // //import java.util.ArrayList; //import java.util.Objects; //import java.util.Optional; // ///** // * Created by vincent on 2023/10/23 // */ //@Slf4j //@Service //public class ShuttleCommandService { // // public static final Integer SHUTTLE_ADDITION_COMMAND_SPEED = 500; // // @Autowired // private RedisUtil redisUtil; // @Autowired // private MotionService motionService; // @Autowired // private WrkMastMapper wrkMastMapper; // @Autowired // private BasShuttleService basShuttleService; // @Autowired // private LocMastService locMastService; // @Autowired // private NavigateMapUtils navigateMapUtils; // // // 计算 // public Boolean accept(Motion motion) { // Integer deviceNo = Integer.parseInt(motion.getDevice()); // ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, deviceNo); // ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); // if (null == shuttleProtocol) { // return false; // } // if (shuttleProtocol.getBusyStatus().intValue() == ShuttleStatusType.BUSY.id // || !shuttleProtocol.isIdle()) { // return false; // } // if (!shuttleProtocol.getPakMk()) { // return false; // } // if (motionService.selectCount(new EntityWrapper() // .eq("device_ctg", DeviceCtgType.SHUTTLE.val()) // .eq("device", motion.getDevice()) // .eq("motion_sts", MotionStsType.EXECUTING.val())) > 0) { // return false; // } // // ShuttleAssignCommand assignCommand = new ShuttleAssignCommand(); // assignCommand.setShuttleNo(deviceNo.shortValue()); // assignCommand.setTaskNo(motion.getWrkNo().shortValue()); // assignCommand.setSourceLocNo(motion.getOrigin()); // assignCommand.setLocNo(motion.getTarget()); // // List shuttleCommands = new ArrayList<>(); // ShuttleTaskModeType shuttleTaskModeType = null; // // SiemensLiftThread liftThread = null; // LiftProtocol liftProtocol = null; // // //判断小车状态 // if (shuttleProtocol.getBusyStatusType().equals(ShuttleStatusType.IDLE) // && shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.IDLE) // && shuttleProtocol.getTaskNo().intValue() != 0 // ) { // return false; // } // // switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl()))){ // case SHUTTLE_MOVE: // // 如果已经在当前条码则过滤 // if (String.valueOf(shuttleProtocol.getCurrentCode()).equals(locMastService.selectById(motion.getTarget()).getQrCodeValue())) { // return true; // } // shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread); // shuttleTaskModeType = ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO; // break; // case SHUTTLE_MOVE_LIFT_PALLET://穿梭车顶升并移动 // shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.DFX.id, assignCommand, shuttleThread); // shuttleTaskModeType = ShuttleTaskModeType.PAK_IN; // shuttleCommands.add(0, shuttleThread.getPalletCommand((short) 1)); // break; // case SHUTTLE_MOVE_DOWN_PALLET://穿梭车移动并托盘下降 // shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.DFX.id, assignCommand, shuttleThread); // shuttleTaskModeType = ShuttleTaskModeType.PAK_IN; // shuttleCommands.add(shuttleCommands.size(), shuttleThread.getPalletCommand((short) 2)); // break; // case SHUTTLE_MOVE_FROM_LIFT://出提升机 // // 判断提升机状态 // liftThread = (SiemensLiftThread) SlaveConnection.get(SlaveType.Lift, Integer.parseInt(motion.getTemp())); // if (liftThread == null) { // return false; // } // liftProtocol = liftThread.getLiftProtocol(); // // 判断提升机是否自动、空闲、准备就绪、链条没有转动、没有未就绪报错 // if (!liftProtocol.getMode() // || liftProtocol.getRunning() // || !liftProtocol.getReady() // || liftProtocol.getForwardRotationFeedback() // || liftProtocol.getReverseFeedback() // || liftProtocol.getNotReady().intValue() != 0 // ) { // return false; // } // // if (liftProtocol.getLev().intValue() != Utils.getLev(motion.getTarget())) {//判断提升机是否达到目标层 // return false; // } // // //判断提升机是否被锁定 // if (!liftProtocol.getLiftLock()) { // //锁定提升机 // LiftCommand lockCommand = liftThread.getLockCommand(true);//获取提升机锁定命令 // lockCommand.setLiftNo(liftProtocol.getLiftNo()); // lockCommand.setTaskNo(motion.getWrkNo().shortValue());//获取任务号 // liftThread.assignWork(lockCommand); // return false;//等待下一次轮询 // } // // //判断提升机工作号是否和当前任务相同 // if (liftProtocol.getTaskNo().intValue() != motion.getWrkNo()) { // return false; // } // // shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread); // shuttleTaskModeType = ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO; // break; // case SHUTTLE_MOVE_TO_LIFT://进提升机 // // 判断提升机状态 // liftThread = (SiemensLiftThread) SlaveConnection.get(SlaveType.Lift, Integer.parseInt(motion.getTemp())); // if (liftThread == null) { // return false; // } // liftProtocol = liftThread.getLiftProtocol(); // // 判断提升机是否自动、空闲、准备就绪、链条没有转动、没有未就绪报错 // if (!liftProtocol.getMode() // || liftProtocol.getRunning() // || !liftProtocol.getReady() // || liftProtocol.getForwardRotationFeedback() // || liftProtocol.getReverseFeedback() // || liftProtocol.getNotReady().intValue() != 0 // ) { // return false; // } // // if (liftProtocol.getLev().intValue() != Utils.getLev(motion.getTarget())) {//判断提升机是否达到目标层 // return false; // } // // //判断提升机是否被锁定 // if (!liftProtocol.getLiftLock()) { // //锁定提升机 // LiftCommand lockCommand = liftThread.getLockCommand(true);//获取提升机锁定命令 // lockCommand.setLiftNo(liftProtocol.getLiftNo()); // lockCommand.setTaskNo(motion.getWrkNo().shortValue());//获取任务号 // liftThread.assignWork(lockCommand); // return false;//等待下一次轮询 // } // // //判断提升机工作号是否和当前任务相同 // if (liftProtocol.getTaskNo().intValue() != motion.getWrkNo()) { // return false; // } // // shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread); // shuttleTaskModeType = ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO; // break; // case SHUTTLE_MOVE_FROM_CONVEYOR: // shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread); // shuttleTaskModeType = ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO; // break; // case SHUTTLE_MOVE_TO_CONVEYOR: // shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread); // shuttleTaskModeType = ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO; // break; // case SHUTTLE_MOVE_FROM_LIFT_TO_CONVEYOR://穿梭车出提升机去输送线 // // 判断提升机状态 // liftThread = (SiemensLiftThread) SlaveConnection.get(SlaveType.Lift, Integer.parseInt(motion.getTemp())); // if (liftThread == null) { // return false; // } // liftProtocol = liftThread.getLiftProtocol(); // // 判断提升机是否自动、空闲、准备就绪、链条没有转动、没有未就绪报错 // if (!liftProtocol.getMode() // || liftProtocol.getRunning() // || !liftProtocol.getReady() // || liftProtocol.getForwardRotationFeedback() // || liftProtocol.getReverseFeedback() // || liftProtocol.getNotReady().intValue() != 0 // ) { // return false; // } // // if (liftProtocol.getLev().intValue() != Utils.getLev(motion.getTarget())) {//判断提升机是否达到目标层 // return false; // } // // //判断提升机是否被锁定 // if (!liftProtocol.getLiftLock()) { // //锁定提升机 // LiftCommand lockCommand = liftThread.getLockCommand(true);//获取提升机锁定命令 // lockCommand.setLiftNo(liftProtocol.getLiftNo()); // lockCommand.setTaskNo(motion.getWrkNo().shortValue());//获取任务号 // liftThread.assignWork(lockCommand); // return false;//等待下一次轮询 // } // // //判断提升机工作号是否和当前任务相同 // if (liftProtocol.getTaskNo().intValue() != motion.getWrkNo()) { // return false; // } // // shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.NORMAL.id, assignCommand, shuttleThread); // shuttleTaskModeType = ShuttleTaskModeType.SHUTTLE_MOVE_LOC_NO; // break; // case SHUTTLE_TRANSPORT: // shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.DFX.id, assignCommand, shuttleThread); // shuttleTaskModeType = ShuttleTaskModeType.PAK_IN; // // shuttleCommands.add(0, shuttleThread.getPalletCommand((short) 1)); // shuttleCommands.add(shuttleCommands.size(), shuttleThread.getPalletCommand((short) 2)); // break; // case SHUTTLE_TRANSPORT_FROM_LIFT://穿梭车载货出提升机 // // 判断提升机状态 // liftThread = (SiemensLiftThread) SlaveConnection.get(SlaveType.Lift, Integer.parseInt(motion.getTemp())); // if (liftThread == null) { // return false; // } // liftProtocol = liftThread.getLiftProtocol(); // // 判断提升机是否自动、空闲、准备就绪、链条没有转动、没有未就绪报错 // if (!liftProtocol.getMode() // || liftProtocol.getRunning() // || !liftProtocol.getReady() // || liftProtocol.getForwardRotationFeedback() // || liftProtocol.getReverseFeedback() // || liftProtocol.getNotReady().intValue() != 0 // ) { // return false; // } // // if (liftProtocol.getLev().intValue() != Utils.getLev(motion.getTarget())) {//判断提升机是否达到目标层 // return false; // } // // //判断提升机是否被锁定 // if (!liftProtocol.getLiftLock()) { // //锁定提升机 // LiftCommand lockCommand = liftThread.getLockCommand(true);//获取提升机锁定命令 // lockCommand.setLiftNo(liftProtocol.getLiftNo()); // lockCommand.setTaskNo(motion.getWrkNo().shortValue());//获取任务号 // liftThread.assignWork(lockCommand); // return false;//等待下一次轮询 // } // // //判断提升机工作号是否和当前任务相同 // if (liftProtocol.getTaskNo().intValue() != motion.getWrkNo()) { // return false; // } // // shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.DFX.id, assignCommand, shuttleThread); // shuttleTaskModeType = ShuttleTaskModeType.PAK_IN; // shuttleCommands.add(0, shuttleThread.getPalletCommand((short) 1)); //// shuttleCommands.add(shuttleCommands.size(), shuttleThread.getPalletCommand((short) 2)); // break; // case SHUTTLE_TRANSPORT_TO_LIFT://穿梭车载货进提升机 // // 判断提升机状态 // liftThread = (SiemensLiftThread) SlaveConnection.get(SlaveType.Lift, Integer.parseInt(motion.getTemp())); // if (liftThread == null) { // return false; // } // liftProtocol = liftThread.getLiftProtocol(); // // 判断提升机是否自动、空闲、准备就绪、链条没有转动、没有未就绪报错 // if (!liftProtocol.getMode() // || liftProtocol.getRunning() // || !liftProtocol.getReady() // || liftProtocol.getForwardRotationFeedback() // || liftProtocol.getReverseFeedback() // || liftProtocol.getNotReady().intValue() != 0 // ) { // return false; // } // // if (liftProtocol.getLev().intValue() != Utils.getLev(motion.getTarget())) {//判断提升机是否达到目标层 // return false; // } // // //判断提升机是否被锁定 // if (!liftProtocol.getLiftLock()) { // //锁定提升机 // LiftCommand lockCommand = liftThread.getLockCommand(true);//获取提升机锁定命令 // lockCommand.setLiftNo(liftProtocol.getLiftNo()); // lockCommand.setTaskNo(motion.getWrkNo().shortValue());//获取任务号 // liftThread.assignWork(lockCommand); // return false;//等待下一次轮询 // } // // //判断提升机工作号是否和当前任务相同 // if (liftProtocol.getTaskNo().intValue() != motion.getWrkNo()) { // return false; // } // // shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.DFX.id, assignCommand, shuttleThread); // shuttleTaskModeType = ShuttleTaskModeType.PAK_IN; //// shuttleCommands.add(0, shuttleThread.getPalletCommand((short) 1)); // shuttleCommands.add(shuttleCommands.size(), shuttleThread.getPalletCommand((short) 2)); // break; // case SHUTTLE_TRANSPORT_FROM_CONVEYOR: // shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.DFX.id, assignCommand, shuttleThread); // shuttleTaskModeType = ShuttleTaskModeType.PAK_IN; // // shuttleCommands.add(0, shuttleThread.getPalletCommand((short) 1)); // shuttleCommands.add(shuttleCommands.size(), shuttleThread.getPalletCommand((short) 2)); // break; // case SHUTTLE_TRANSPORT_TO_CONVEYOR: // shuttleCommands = this.shuttleAssignCommand(motion.getOrigin(), motion.getTarget(), NavigationMapType.DFX.id, assignCommand, shuttleThread); // shuttleTaskModeType = ShuttleTaskModeType.PAK_IN; // // shuttleCommands.add(0, shuttleThread.getPalletCommand((short) 1)); // shuttleCommands.add(shuttleCommands.size(), shuttleThread.getPalletCommand((short) 2)); // break; // case SHUTTLE_CHARGE_ON: // shuttleTaskModeType = ShuttleTaskModeType.CHARGE; // shuttleCommands.add(shuttleThread.getChargeSwitchCommand((short) 1)); // assignCommand.setCharge(Boolean.TRUE); // break; // default: // throw new CoolException(motion.getMotionCtgEl() + "没有指定任务作业流程!!!"); // } // // if (Cools.isEmpty(shuttleCommands)) { // return false; // } // // assert null != shuttleTaskModeType; // assignCommand.setTaskMode(shuttleTaskModeType.id.shortValue());//入出库模式 // assignCommand.setCommands(shuttleCommands); // // if (motion.getOrigin() != null && motion.getTarget() != null) { // //所使用的路径进行锁定禁用 // boolean lockResult = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(motion.getTarget()), shuttleProtocol.getShuttleNo().intValue(), assignCommand.getNodes(), true);//所使用的路径进行锁定禁用 // if (!lockResult) { // return false;//锁定失败 // } // shuttleThread.assignWork(assignCommand); // }else { // shuttleThread.assignWork(assignCommand); // } // // return Boolean.TRUE; // } // // public Boolean finish(Motion motion) { // Integer deviceNo = Integer.parseInt(motion.getDevice()); // ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, deviceNo); // ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); // if (null == shuttleProtocol) { // return false; // } // // if (shuttleProtocol.getTaskNo() != 0 && shuttleProtocol.getTaskNo().intValue() != motion.getWrkNo()) { // return false; // } // // //充电任务 // if (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl())).equals(MotionCtgType.SHUTTLE_CHARGE_ON)) { // // 复位穿梭车 // shuttleProtocol.setTaskNo((short) 0); // shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE); // shuttleProtocol.setPakMk(true); // return true; // } // // if (!shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.WAITING) // && !shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.CHARGING_WAITING) // ) { // return false; // } // // if (shuttleProtocol.getBusyStatusType().equals(ShuttleStatusType.BUSY)) { // return false; // } // // SiemensLiftThread liftThread = null; // LiftProtocol liftProtocol = null; // // switch (Objects.requireNonNull(MotionCtgType.get(motion.getMotionCtgEl()))){ // case SHUTTLE_MOVE: // case SHUTTLE_MOVE_LIFT_PALLET: // case SHUTTLE_MOVE_DOWN_PALLET: // case SHUTTLE_MOVE_TO_CONVEYOR: // case SHUTTLE_MOVE_FROM_CONVEYOR: // if (!shuttleProtocol.getCurrentLocNo().equals(motion.getTarget())) { // return false; // } // break; // case SHUTTLE_MOVE_TO_LIFT: // case SHUTTLE_MOVE_FROM_LIFT: // case SHUTTLE_TRANSPORT_FROM_LIFT: // case SHUTTLE_TRANSPORT_TO_LIFT: // case SHUTTLE_MOVE_FROM_LIFT_TO_CONVEYOR: // liftThread = (SiemensLiftThread) SlaveConnection.get(SlaveType.Lift, Integer.parseInt(motion.getTemp())); // if (liftThread == null) { // return false; // } // liftProtocol = liftThread.getLiftProtocol(); // // if (!shuttleProtocol.getCurrentLocNo().equals(motion.getTarget())) { // return false; // } // // //判断提升机是否被锁定 // if (liftProtocol.getLiftLock()) { // //解锁提升机 // LiftCommand lockCommand = liftThread.getLockCommand(false);//获取提升机解锁命令 // lockCommand.setLiftNo(liftProtocol.getLiftNo()); // lockCommand.setTaskNo(motion.getWrkNo().shortValue());//获取任务号 // liftThread.assignWork(lockCommand); // return false; // } // // //判断提升机工作号是否和当前任务相同 // if (liftProtocol.getTaskNo().intValue() != motion.getWrkNo()) { // return false; // } // // if (liftProtocol.getTaskNo().intValue() != 0) { // //清空提升机号 // liftThread.setTaskNo(0); // } // // break; // default: // break; // } // // // 复位穿梭车 // shuttleProtocol.setTaskNo((short) 0); // shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE); // shuttleProtocol.setPakMk(true); // // return true; // } // // public synchronized List shuttleAssignCommand(String startLocNo, String endLocNo, Integer mapType, ShuttleAssignCommand assignCommand, ShuttleThread shuttleThread) { // //获取小车移动速度 // Integer runSpeed = Optional.ofNullable(basShuttleService.selectById(assignCommand.getShuttleNo()).getRunSpeed()).orElse(1000); // // List nodeList = NavigateUtils.calc(startLocNo, endLocNo, mapType, Utils.getShuttlePoints(shuttleThread.getSlave().getId(), Utils.getLev(startLocNo))); // if (nodeList == null) { // News.error("{} dash {} can't find navigate path!", startLocNo, endLocNo); // return null; // } // List allNode = new ArrayList<>(nodeList); // // List commands = new ArrayList<>(); // //获取分段路径 // ArrayList> data = NavigateUtils.getSectionPath(nodeList); // //将每一段路径分成command指令 // for (ArrayList nodes : data) { // //开始路径 // NavigateNode startPath = nodes.get(0); // // //中间路径 // NavigateNode middlePath = null; // //通过xy坐标小车二维码 // Short middleCodeNum = null; // Integer middleToDistDistance = null;//计算中间点到目标点行走距离 // if (nodes.size() > 10) {//中段码传倒数第三个 // //中间路径 // middlePath = nodes.get(nodes.size() - 3); // //通过xy坐标小车二维码 // middleCodeNum = NavigatePositionConvert.xyToPosition(middlePath.getX(), middlePath.getY(), middlePath.getZ()); // middleToDistDistance = NavigateUtils.getMiddleToDistDistance(nodes, middlePath);//计算中间点到目标点行走距离 // } else if (nodes.size() > 5) {//中段码传倒数第二个 // //中间路径 // middlePath = nodes.get(nodes.size() - 2); // //通过xy坐标小车二维码 // middleCodeNum = NavigatePositionConvert.xyToPosition(middlePath.getX(), middlePath.getY(), middlePath.getZ()); // middleToDistDistance = NavigateUtils.getMiddleToDistDistance(nodes, middlePath);//计算中间点到目标点行走距离 // } // // //目标路径 // NavigateNode endPath = nodes.get(nodes.size() - 1); // Integer allDistance = NavigateUtils.getCurrentPathAllDistance(nodes);//计算当前路径行走总距离 // //通过xy坐标小车二维码 // Short startCodeNum = NavigatePositionConvert.xyToPosition(startPath.getX(), startPath.getY(), startPath.getZ()); // //通过xy坐标小车二维码 // Short distCodeNum = NavigatePositionConvert.xyToPosition(endPath.getX(), endPath.getY(), endPath.getZ()); // //获取移动命令 // ShuttleCommand command = shuttleThread.getMoveCommand(startCodeNum, distCodeNum, allDistance, ShuttleRunDirection.get(startPath.getDirection()).id, middleCodeNum, middleToDistDistance, runSpeed); // command.setNodes(nodes);//将行走节点添加到每一步命令中 // commands.add(command); // } // // assignCommand.setNodes(allNode);//当前任务所占用的节点list // // return commands; // } // // //}