zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MapDataWsScheduler.java
@@ -31,6 +31,8 @@ @Component public class MapDataWsScheduler { public static final int WEBSOCKET_BROADCAST_INTERVAL = 500; private ExecutorService singleThreadExecutor; @Autowired @@ -54,7 +56,7 @@ MapWsVo mapWsVo = new MapWsVo(); mapWsVo.setAgvVos(syncAgv()); MapWebSocket.broadcast(GsonUtils.toJson(mapWsVo)); try { Thread.sleep(500); } catch (InterruptedException ignore) {} try { Thread.sleep(WEBSOCKET_BROADCAST_INTERVAL); } catch (InterruptedException ignore) {} } }); } zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MockService.java
File was deleted zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java
@@ -1,6 +1,7 @@ package com.zy.acs.manager.core.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.acs.common.utils.GsonUtils; import com.zy.acs.common.utils.RedisSupport; import com.zy.acs.framework.common.Cools; import com.zy.acs.framework.common.SnowflakeIdWorker; @@ -98,6 +99,8 @@ } } } // dead lane if (jamService.count(new LambdaQueryWrapper<Jam>() .eq(Jam::getJamAgv, agv.getId()) .eq(Jam::getJamSeg, segment.getId()) @@ -196,14 +199,17 @@ String agvNo = agv.getUuid(); Date now = new Date(); Jam jam = jamService.getJam(agv.getId(), startCode.getId(), segment.getId()); // judge avoid of jam List<Jam> unfinishedOriginJamByCurrAgv = jamService.hasUnfinishedOriginJamByAvo(agv.getId(), startCode.getId(), segment.getId()); List<String> blackPath = this.getBlackPathList(unfinishedOriginJamByCurrAgv); // 结果集 List<String> pathList = new ArrayList<>(); // 无障碍解 List<String> unlockPathList = mapService.checkoutPath(agvNo, startCode, endCode, false); List<String> unlockPathList = mapService.checkoutPath(agvNo, startCode, endCode, false, blackPath); // 避让解 List<String> lockPathList = mapService.checkoutPath(agvNo, startCode, endCode, true); List<String> lockPathList = mapService.checkoutPath(agvNo, startCode, endCode, true, blackPath); if (!Cools.isEmpty(lockPathList) && // 存在避让解 Math.abs(lockPathList.size() - unlockPathList.size()) <= Arrays.stream(mapDataDispatcher.getCodeMatrix(lev)).mapToInt(row -> row.length).sum() / 10 @@ -246,7 +252,8 @@ Integer maxJamTimeoutFactor = null; // persist jam data jam = this.createOrUpdateJam(agv, startCode, segment, jam); ArrayList<String> jamPath = new ArrayList<>(unlockPathList); jam = this.createOrUpdateJam(agv, startCode, segment, jam, jamPath); // ? has unAvoidable block vehicles if (blockVehicleList.stream().anyMatch(blockVehicleDto -> !blockVehicleDto.isAvoidable())) { @@ -290,7 +297,7 @@ } // notify block vehicle to avoid if (this.notifyVehicleAvoid(blockAgvNo, blockAgvCode, unlockPathList, agvNo, jam)) { if (this.notifyVehicleAvoid(blockAgvNo, blockAgvCode, jamPath, agvNo, jam)) { if (jam.getCycleAvo() == 1) { jam.setCycleCode(endCode.getId()); } @@ -465,13 +472,14 @@ return true; } private Jam createOrUpdateJam(Agv agv, Code startCode, Segment segment, Jam jam) { private Jam createOrUpdateJam(Agv agv, Code startCode, Segment segment, Jam jam, List<String> jamPath) { if (jam == null) { jam = new Jam(); jam.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); jam.setJamAgv(agv.getId()); jam.setJamCode(startCode.getId()); jam.setJamSeg(segment.getId()); jam.setJamPath(GsonUtils.toJson(jamPath)); jam.setStartTime(new Date()); jam.setState(JamStateType.RUNNING.toString()); if (!jamService.save(jam)) { @@ -487,4 +495,17 @@ return jam; } private List<String> getBlackPathList(List<Jam> unfinishedOriginJamByCurrAgv) { List<String> blackPathList = new ArrayList<>(); if (!Cools.isEmpty(unfinishedOriginJamByCurrAgv)) { for (Jam jam : unfinishedOriginJamByCurrAgv) { if (!Cools.isEmpty(jam.getJamPath())) { List<String> list = GsonUtils.fromJsonToList(jam.getJamPath(), String.class); blackPathList.addAll(list); } } } return blackPathList.stream().distinct().collect(Collectors.toList()); } } zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/astart/AStarNavigateService.java
@@ -83,6 +83,10 @@ // } // } if (!Cools.isEmpty(blackList) && blackList.contains(node.getCodeData())) { continue; } // 节点被占用 DynamicNode dynamicNode = dynamicMatrix[node.getX()][node.getY()]; String vehicle = dynamicNode.getVehicle(); @@ -90,9 +94,6 @@ if (!vehicle.equals(DynamicNodeType.ACCESS.val)) { if (!vehicle.equals(agvNo)) { if (!Cools.isEmpty(blackList) && blackList.contains(vehicle)) { continue; } if (lock) { continue; } @@ -107,9 +108,6 @@ List<String> otherWaveList = MapDataUtils.hasOtherWave(waveNodeList, agvNo); if (!Cools.isEmpty(otherWaveList)) { if (!Cools.isEmpty(blackList) && 0 < Cools.getIntersection(otherWaveList, blackList).size()) { continue; } if (lock) { continue; zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java
@@ -5,6 +5,7 @@ import com.zy.acs.common.domain.protocol.AGV_11_UP; import com.zy.acs.common.enums.AgvCompleteType; import com.zy.acs.common.utils.RedisSupport; import com.zy.acs.manager.core.scheduler.MapDataWsScheduler; import com.zy.acs.manager.core.service.MapService; import com.zy.acs.manager.manager.entity.Action; import com.zy.acs.manager.manager.entity.Agv; @@ -26,8 +27,6 @@ */ @Slf4j public class AgvSimulatorTask implements Runnable { public static final int ACTION_DURING_TIME = 500; private final Agv agv; private final AgvDetailService agvDetailService; @@ -116,7 +115,7 @@ // 模拟电量消耗 // agvDetail.setVol(agvDetail.getVol() - 0.1 * distanceToMove); // 根据距离消耗电量 Thread.sleep(ACTION_DURING_TIME); Thread.sleep(MapDataWsScheduler.WEBSOCKET_BROADCAST_INTERVAL); agvDetailService.updateById(agvDetail); @@ -140,7 +139,7 @@ // 模拟电量消耗? // agvDetail.setVol(agvDetail.getVol() - 0.05 * (angleToRotate / 15.0)); // 根据角度消耗电量 Thread.sleep(ACTION_DURING_TIME); Thread.sleep(MapDataWsScheduler.WEBSOCKET_BROADCAST_INTERVAL); agvDetailService.updateById(agvDetail); action.setActionSts(ActionStsType.FINISH.val()); actionService.updateById(action); zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/MockController.java
File was deleted zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Jam.java
@@ -58,6 +58,12 @@ private Long jamSeg; /** * 阻塞路径 */ @ApiModelProperty(value= "阻塞路径") private String jamPath; /** * 避让车辆 */ @ApiModelProperty(value= "避让车辆") zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/JamMapper.java
@@ -2,7 +2,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zy.acs.manager.manager.entity.Jam; import org.apache.ibatis.annotations.Param; import java.util.List; public interface JamMapper extends BaseMapper<Jam> { List<Jam> selectUnfinishedJamByAvo(@Param("avoAgv")Long avoAgv, @Param("currCode")Long currCode, @Param("currSeg")Long currSeg); } zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/JamService.java
@@ -10,6 +10,8 @@ Jam getJam(Long agvId, Long jamCode, Long jamSeg); List<Jam> hasUnfinishedOriginJamByAvo(Long avoAgv, Long currCode, Long currSeg); Jam getCycleJam(Long jamAgv, Long jamSeg, String avoAgvNo); List<Jam> queryByAvoid(Long avoAgv, JamStateType jamState); zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/JamServiceImpl.java
@@ -40,6 +40,15 @@ return null; } /** * 因为你而阻塞的车,现在你已经在避让点了 * 你的下一个segment是不是又会导致阻塞 */ @Override public List<Jam> hasUnfinishedOriginJamByAvo(Long avoAgv, Long currCode, Long currSeg) { return this.baseMapper.selectUnfinishedJamByAvo(avoAgv, null, null); } @Override public Jam getCycleJam(Long jamAgv, Long jamSeg, String avoAgvNo) { List<Jam> jams = this.list(new LambdaQueryWrapper<Jam>() zy-acs-manager/src/main/resources/mapper/manager/JamMapper.xml
@@ -23,4 +23,22 @@ </where> </sql> <select id="selectUnfinishedJamByAvo" resultType="com.zy.acs.manager.manager.entity.Jam"> SELECT mj.* FROM man_jam mj LEFT JOIN man_segment jam_seg ON mj.jam_seg = jam_seg.id LEFT JOIN man_segment avo_seg ON mj.avo_seg = avo_seg.id WHERE 1=1 AND jam_seg.state in ('INIT', 'WAITING') AND avo_seg.state not in ('INIT', 'WAITING') AND mj.avo_agv = #{avoAgv} <if test="currSeg != null"> AND mj.avo_seg = #{currSeg} </if> <if test="currCode != null"> AND mj.avo_code = #{currCode} </if> </select> </mapper>