| | |
| | | import java.text.MessageFormat; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | ); |
| | | opt.setSend(1);//已下发 |
| | | opt.setResponse(JSON.toJSONString(result));//请求响应 |
| | | opt.setDeviceWrk(command.getWrkNo().toString());//设备工作号 |
| | | shuttleOptService.insert(opt); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | WrkMastMapper wrkMastMapper = SpringUtils.getBean(WrkMastMapper.class); |
| | | WrkMast wrkMast = wrkMastMapper.selectByWorkNo(wrkNo.intValue()); |
| | | |
| | | Object o = redisUtil.get("shuttle_wrk_no_" + wrkNo); |
| | | if (o == null) { |
| | |
| | | return false; |
| | | } |
| | | |
| | | checkIOSta(commands, commandStep);//检测小车是否进出提升机输送站 |
| | | |
| | | NavigateMapData navigateMapData = new NavigateMapData(Utils.getLev(shuttleProtocol.getCurrentLocNo())); |
| | | |
| | | boolean isLock = false;//是否解锁路径 |
| | | //取出命令 |
| | | NyShuttleHttpCommand command = null; |
| | | if (commandStep < commands.size()) { |
| | |
| | | if (shuttleProtocol.getPoint().equals(target)) { |
| | | //上一条指令的目标位置和当前小车位置相同,则认定上一条任务完成 |
| | | lastCommand.setComplete(true); |
| | | //解锁锁定路径,上一条路径和当前路径 |
| | | //解锁锁定路径,上一条路径 |
| | | List<NavigateNode> nodes = lastCommand.getNodes(); |
| | | if (command != null && command.getNodes() != null) { |
| | | nodes.addAll(command.getNodes()); |
| | | } |
| | | // //解锁当前路径 |
| | | // if (command != null && command.getNodes() != null) { |
| | | // nodes.addAll(command.getNodes()); |
| | | // } |
| | | if (nodes != null) { |
| | | navigateMapData.writeNavigateNodeToRedisMap(nodes, false);//解锁路径 |
| | | isLock = true;//解锁过路径 |
| | | } |
| | | } |
| | | }else { |
| | |
| | | } |
| | | |
| | | if (shuttleProtocol.getFree() == ShuttleStatusType.BUSY.id) { |
| | | //停止充电 |
| | | if(!(command.getRequest().getBody().get("requestType").equals("stopCharge") && shuttleProtocol.getChargState() == 1)){ |
| | | String requestType = command.getRequest().getBody().get("requestType").toString(); |
| | | //停止充电 管制命令 |
| | | if(!(requestType.equals("stopCharge") && shuttleProtocol.getChargState() == 1) && !requestType.equals("resume")){ |
| | | return false;//小车状态忙,禁止执行命令 |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | if (command.getRequest().getBody().get("requestType").equals("move")) { |
| | | //检测路径是否可行走 |
| | | if (!checkPath(command.getNodes(), nextNodes, redisCommand)) { |
| | | return false; |
| | | ArrayList<int[]> whiteList = new ArrayList<>();//设置节点的白名单 |
| | | if (wrkMast != null && ((wrkMast.getIoType() > 100 && wrkMast.getIoType() < 200) || wrkMast.getIoType() == 11)) { |
| | | //出库任务,不检测首节点 |
| | | int[] startArr = NavigatePositionConvert.positionToXY(wrkMast.getSourceLocNo());//开始节点 |
| | | whiteList.add(startArr); |
| | | } |
| | | |
| | | //解锁过路径,只检测下一段路径是否可走(当前路径已经被锁定无需再检测) |
| | | if (isLock) { |
| | | //只检测下一段路径是否可走(当前路径已经被锁定无需再检测) |
| | | //检测路径是否可行走 |
| | | if (!checkPath(nextNodes == null ? command.getNodes() : nextNodes, null, whiteList)) { |
| | | return false; |
| | | } |
| | | }else { |
| | | //检测当前路径和下一段路径 |
| | | //检测路径是否可行走 |
| | | if (!checkPath(command.getNodes(), nextNodes, whiteList)) { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | //锁定路径,锁定当前路径和下一步路径 |
| | |
| | | nodes.addAll(nextNodes); |
| | | } |
| | | if (nodes != null) { |
| | | navigateMapData.writeNavigateNodeToRedisMap(nodes, true);//所使用的路径进行锁定禁用 |
| | | boolean result = navigateMapData.writeNavigateNodeToRedisMap(nodes, true);//所使用的路径进行锁定禁用 |
| | | if (!result) { |
| | | return false;//路径锁定失败 |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | * 检测路径是否可行走 |
| | | * 如果路径为目标库位,但不可行走,系统将尝试重新计算路径 |
| | | */ |
| | | private boolean checkPath(List<NavigateNode> currentNodes, List<NavigateNode> nextNodes, ShuttleRedisCommand redisCommand) { |
| | | private boolean checkPath(List<NavigateNode> currentNodes, List<NavigateNode> nextNodes, List<int[]> whitePoints) { |
| | | //检测路径是否可行走(检查路径锁定状态,检测路径是否有其他小车) |
| | | //检测当前行走路径,和下一步路径 |
| | | boolean checkPathIsAvailable = NavigateUtils.checkPathIsAvailable(currentNodes, shuttleProtocol.getShuttleNo().intValue(), Utils.getLev(shuttleProtocol.getCurrentLocNo())); |
| | | boolean checkPathIsAvailable = NavigateUtils.checkPathIsAvailable(currentNodes, shuttleProtocol.getShuttleNo().intValue(), Utils.getLev(shuttleProtocol.getCurrentLocNo()), whitePoints); |
| | | if (nextNodes == null) { |
| | | if (checkPathIsAvailable) { |
| | | return true;//可行走 |
| | | } |
| | | return false; |
| | | }else { |
| | | boolean checkPathIsAvailable2 = NavigateUtils.checkPathIsAvailable(nextNodes, shuttleProtocol.getShuttleNo().intValue(), Utils.getLev(shuttleProtocol.getCurrentLocNo())); |
| | | boolean checkPathIsAvailable2 = NavigateUtils.checkPathIsAvailable(nextNodes, shuttleProtocol.getShuttleNo().intValue(), Utils.getLev(shuttleProtocol.getCurrentLocNo()), whitePoints); |
| | | if (checkPathIsAvailable && checkPathIsAvailable2) { |
| | | return true;//可行走 |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | //检测小车是否进出提升机输送站 |
| | | public void checkIOSta(List<NyShuttleHttpCommand> commands, int commandStep) { |
| | | if (commandStep != 0) { |
| | | NyShuttleHttpCommand lastCommand = commands.get(commandStep - 1);//上一步命令 |
| | | if (lastCommand.getRequest().getBody().get("requestType").equals("move")) { |
| | | //检测起点是否为提升机输送站点 |
| | | NyShuttleProtocol.NyShuttlePointClass start = JSON.parseObject(lastCommand.getRequest().getBody().get("start").toString(), NyShuttleProtocol.NyShuttlePointClass.class); |
| | | int[] startPoint = NavigatePositionConvert.NyXyzToWCSXyz(start.getX(), start.getY(), start.getZ()); |
| | | if (startPoint[0] == 13 && (startPoint[1] == 22 || startPoint[1] == 38 || startPoint[1] == 57)) { |
| | | //输送站点位置 |
| | | |
| | | int liftNo; |
| | | if (startPoint[1] == 22) { |
| | | liftNo = 1; |
| | | } else if (startPoint[1] == 38) { |
| | | liftNo = 2; |
| | | } else { |
| | | liftNo = 3; |
| | | } |
| | | |
| | | HashMap<String, Object> data = new HashMap<>(); |
| | | data.put("lev", startPoint[2]); |
| | | data.put("status", false);//出输送站 |
| | | |
| | | //下发任务 |
| | | MessageQueue.offer(SlaveType.Lift, liftNo, new Task(4, data)); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (commands.size() == commandStep) { |
| | | return; |
| | | } |
| | | NyShuttleHttpCommand command = commands.get(commandStep);//当前命令 |
| | | if (command.getRequest().getBody().get("requestType").equals("move")) { |
| | | NyShuttleProtocol.NyShuttlePointClass target = JSON.parseObject(command.getRequest().getBody().get("target").toString(), NyShuttleProtocol.NyShuttlePointClass.class); |
| | | int[] targetPoint = NavigatePositionConvert.NyXyzToWCSXyz(target.getX(), target.getY(), target.getZ()); |
| | | //检测目标位置是否为提升机输送站点 |
| | | if (targetPoint[0] == 13 && (targetPoint[1] == 22 || targetPoint[1] == 38 || targetPoint[1] == 57)) { |
| | | //输送站点位置 |
| | | |
| | | int liftNo; |
| | | if (targetPoint[1] == 22) { |
| | | liftNo = 1; |
| | | } else if (targetPoint[1] == 38) { |
| | | liftNo = 2; |
| | | } else { |
| | | liftNo = 3; |
| | | } |
| | | |
| | | HashMap<String, Object> data = new HashMap<>(); |
| | | data.put("lev", targetPoint[2]); |
| | | data.put("status", true);//进输送站 |
| | | |
| | | //下发任务 |
| | | MessageQueue.offer(SlaveType.Lift, liftNo, new Task(4, data)); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |