| | |
| | | |
| | | /** |
| | | * 处理所有CTU的剩余路径,构建时空占用表 |
| | | * 🔧 修复:同时处理有剩余路径的AGV和静止AGV的当前位置占用 |
| | | * |
| | | * @param agvStatusList CTU状态列表 |
| | | * @return 时空占用表,key为"x,y,timeSlot",value为CTU编号 |
| | |
| | | |
| | | for (AGVStatus agv : agvStatusList) { |
| | | if (agv.hasRemainingPath()) { |
| | | // 处理有剩余路径的AGV |
| | | processRemainingPathOccupancy(agv, occupancyMap); |
| | | } else if (agv.getPosition() != null && !agv.getPosition().isEmpty()) { |
| | | // 处理静止AGV的当前位置占用 |
| | | processStaticAgvOccupancy(agv, occupancyMap); |
| | | } |
| | | } |
| | | |
| | | return occupancyMap; |
| | | } |
| | | |
| | | /** |
| | | * 处理静止AGV的位置占用 |
| | | * |
| | | * @param agv CTU状态 |
| | | * @param occupancyMap 时空占用表 |
| | | */ |
| | | private void processStaticAgvOccupancy(AGVStatus agv, Map<String, String> occupancyMap) { |
| | | String position = agv.getPosition(); |
| | | if (position == null || position.isEmpty()) { |
| | | return; |
| | | } |
| | | |
| | | // 获取位置坐标 |
| | | int[] coord = JsonUtils.getCoordinate(position, pathMapping); |
| | | if (coord == null) { |
| | | return; |
| | | } |
| | | |
| | | CTUPhysicalConfig config = agv.getPhysicalConfig(); |
| | | long currentTime = System.currentTimeMillis() / 1000; // 转换为秒 |
| | | |
| | | // 静止AGV占用当前位置的长时间段(假设300秒) |
| | | long occupancyDuration = 300; // 300秒的占用时间 |
| | | |
| | | for (long timeSlot = currentTime; timeSlot < currentTime + occupancyDuration; timeSlot++) { |
| | | String spaceTimeKey = coord[0] + "," + coord[1] + "," + timeSlot; |
| | | occupancyMap.put(spaceTimeKey, agv.getAgvId()); |
| | | |
| | | occupyAdjacentSpaces(coord, timeSlot, agv.getAgvId(), occupancyMap, config); |
| | | } |
| | | |
| | | System.out.println(" 静止AGV " + agv.getAgvId() + " 占用位置 " + position + |
| | | " (坐标: " + coord[0] + "," + coord[1] + ") " ); |
| | | } |
| | | |
| | | /** |
| | | * 处理单个CTU的剩余路径时空占用 |