| | |
| | | package com.zy.acs.manager.core.service; |
| | | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.zy.acs.framework.common.Cools; |
| | | import com.zy.acs.common.enums.AgvDirectionType; |
| | | import com.zy.acs.framework.common.Cools; |
| | | import com.zy.acs.manager.common.utils.MapDataUtils; |
| | | import com.zy.acs.manager.core.service.astart.*; |
| | | import com.zy.acs.manager.core.service.astart.domain.DynamicNode; |
| | |
| | | import com.zy.acs.manager.manager.entity.Code; |
| | | import com.zy.acs.manager.manager.entity.Loc; |
| | | import com.zy.acs.manager.manager.service.ActionService; |
| | | import com.zy.acs.manager.manager.service.CodeGapService; |
| | | import com.zy.acs.manager.manager.service.CodeService; |
| | | import com.zy.acs.manager.manager.service.RouteService; |
| | | import com.zy.acs.manager.system.service.ConfigService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang.time.StopWatch; |
| | |
| | | @Autowired |
| | | private CodeService codeService; |
| | | @Autowired |
| | | private CodeGapService codeGapService; |
| | | @Autowired |
| | | private RouteService routeService; |
| | | @Autowired |
| | | private FloydNavigateService floydNavigateService; |
| | | @Autowired |
| | | private MapDataDispatcher mapDataDispatcher; |
| | |
| | | private ActionService actionService; |
| | | |
| | | public List<String> checkoutPath(String agvNo, Code startCode, Code endCode, Boolean lock) { |
| | | return this.checkoutPath(agvNo, startCode, endCode, lock, null, null); |
| | | return this.checkoutPath(agvNo, startCode, endCode, lock, null); |
| | | } |
| | | |
| | | /** |
| | | * 寻址 ===>> A* |
| | | * 寻址 ===>> A Star |
| | | */ |
| | | public synchronized List<String> checkoutPath(String agvNo, Code startCode, Code endCode |
| | | , Boolean lock, List<String> whiteList, List<String> blackList) { |
| | | , Boolean lock, List<String> blackList) { |
| | | |
| | | int[] startMapIdx = mapDataDispatcher.getCodeMatrixIdx(null, startCode.getData()); |
| | | int[] endMapIdx = mapDataDispatcher.getCodeMatrixIdx(null, endCode.getData()); |
| | |
| | | NavigateNode startNode = new NavigateNode(startMapIdx[0], startMapIdx[1], startCode.getData()); |
| | | NavigateNode endNode = new NavigateNode(endMapIdx[0], endMapIdx[1], endCode.getData()); |
| | | |
| | | NavigateNode finishNode = aStarNavigateService.execute(agvNo, startNode, endNode, lock, whiteList, blackList); |
| | | NavigateNode finishNode = aStarNavigateService.execute(agvNo, startNode, endNode, lock, blackList); |
| | | |
| | | if (null == finishNode) { |
| | | log.warn("{} 号AGV检索[{}] ===>> [{}]路径失败......", agvNo, startCode.getData(), endCode.getData()); |
| | |
| | | ArrayList<NavigateNode> navigateNodes = new ArrayList<>(); |
| | | |
| | | // 渲染 |
| | | NavigateNode parentNode = null;//当前循环上一节点,用于拐点计算 |
| | | NavigateNode parentNode = null; // 当前循环上一节点,用于拐点计算 |
| | | while (finishNode != null) { |
| | | navigateNodes.add(finishNode); |
| | | |
| | |
| | | |
| | | Collections.reverse(navigateNodes); |
| | | |
| | | //将每个节点里面的fatherNode至为null(方便后续计算时父节点过多导致显示的节点太多) |
| | | for (NavigateNode navigateNode : navigateNodes) { |
| | | //父节点设置为null,不影响计算结果,不影响后续操作。 |
| | | //此操作仅为后续排查处理提供视觉方便。 |
| | | navigateNode.setParent(null); |
| | | } |
| | | // for (NavigateNode navigateNode : navigateNodes) { |
| | | // navigateNode.setParent(null); |
| | | // } |
| | | |
| | | return navigateNodes.stream().map(NavigateNode::getCodeData).collect(Collectors.toList()); |
| | | } |
| | |
| | | |
| | | public void lockPath(Integer lev, List<String> pathList, String agvNo) { |
| | | mapDataDispatcher.modifyDynamicMatrix(lev, pathList, agvNo); |
| | | } |
| | | |
| | | public synchronized void unlockPath(String agvNo, List<String> nodeList) { |
| | | try { |
| | | StopWatch stopWatch = new StopWatch(); |
| | | stopWatch.start(); |
| | | |
| | | if (Cools.isEmpty(agvNo, nodeList)) { |
| | | return; |
| | | } |
| | | |
| | | List<String> pathList = actionService.getPathListByAgv(agvNo).stream().distinct().collect(Collectors.toList()); |
| | | |
| | | List<String> inTrace = new ArrayList<>(); |
| | | |
| | | Set<String> outsideTrace = new HashSet<>(); |
| | | |
| | | if (Cools.isEmpty(pathList)) { |
| | | outsideTrace.addAll(nodeList); |
| | | } else { |
| | | |
| | | int size = nodeList.size(); |
| | | for (String code : pathList) { |
| | | |
| | | |
| | | Iterator<String> iterator = nodeList.iterator(); |
| | | while (iterator.hasNext()) { |
| | | |
| | | String next = iterator.next(); |
| | | |
| | | if (next.equals(code)) { |
| | | if (!inTrace.contains(next)) { |
| | | inTrace.add(next); |
| | | } |
| | | |
| | | iterator.remove(); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | assert inTrace.size() + nodeList.size() <= size; |
| | | |
| | | if (!Cools.isEmpty(nodeList)) { |
| | | outsideTrace.addAll(nodeList); |
| | | } |
| | | |
| | | if (!Cools.isEmpty(inTrace)) { |
| | | |
| | | String last = inTrace.get(inTrace.size() - 1); |
| | | |
| | | int idx = pathList.indexOf(last); |
| | | inTrace = pathList.subList(0, idx + 1); |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | List<String> resetCodeList = new ArrayList<>(); |
| | | |
| | | Integer lev = null; |
| | | |
| | | DynamicNode[][] dynamicMatrix = mapDataDispatcher.getDynamicMatrix(lev); |
| | | |
| | | for (String code : inTrace) { |
| | | int[] node = mapDataDispatcher.getCodeMatrixIdx(lev, code); |
| | | DynamicNode dynamicNode = dynamicMatrix[node[0]][node[1]]; |
| | | |
| | | if (dynamicNode.getVehicle().equals(agvNo)) { |
| | | resetCodeList.add(code); |
| | | } |
| | | } |
| | | |
| | | for (String code : outsideTrace) { |
| | | int[] node = mapDataDispatcher.getCodeMatrixIdx(lev, code); |
| | | DynamicNode dynamicNode = dynamicMatrix[node[0]][node[1]]; |
| | | |
| | | if (dynamicNode.getVehicle().equals(agvNo)) { |
| | | resetCodeList.add(code); |
| | | } |
| | | } |
| | | |
| | | if (!Cools.isEmpty(resetCodeList)) { |
| | | |
| | | mapDataDispatcher.clearDynamicMatrixByCodeList(lev, resetCodeList); |
| | | } |
| | | |
| | | stopWatch.stop(); |
| | | if (stopWatch.getTime() > 50) { |
| | | log.info("解锁路径函数花费时间为:{}毫秒......", stopWatch.getTime()); |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | | log.error("TrafficService.unlockPath", e); |
| | | } |
| | | |
| | | } |
| | | |
| | | public synchronized void unlockPath(String agvNo, String codeData) { |