src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/utils/Utils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/common/utils/NavigateMapData.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/common/utils/NavigateMapUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/common/utils/ShuttleDispatchUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/model/protocol/NyShuttleProtocol.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/core/thread/NyShuttleThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -108,6 +108,8 @@ private BasLiftOptService basLiftOptService; @Autowired private ConfigService configService; @Autowired private NavigateMapUtils navigateMapUtils; /** @@ -2701,9 +2703,8 @@ if (!checkPathIsAvailable) { return false;//检测目标站点路径是否未被占用 } NavigateMapData navigateMapData = new NavigateMapData(Utils.getLev(wrkMast.getLocNo())); //尝试锁定目标站路径 boolean result2 = navigateMapData.writeNavigateNodeToRedisMap(targetNodes, true);//所使用的路径进行锁定禁用 boolean result2 = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(wrkMast.getLocNo()), targetNodes, true);//所使用的路径进行锁定禁用 if (!result2) { return false;//路径锁定失败 } @@ -3078,13 +3079,12 @@ } //*************尝试解锁目标站路径*************** NavigateMapData navigateMapData = new NavigateMapData(Utils.getLev(wrkMast.getLocNo())); List<NavigateNode> targetNodes = NyLiftUtils.getLiftStaNodes(liftSta.getStaNo()); if (targetNodes == null) { return false;//未获取到节点 } //尝试解锁目标站路径 boolean result = navigateMapData.writeNavigateNodeToRedisMap(targetNodes, false);//所使用的路径进行解锁 boolean result = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(wrkMast.getLocNo()), targetNodes, false);//所使用的路径进行解锁 if (!result) { return false;//路径解锁失败 } src/main/java/com/zy/asrs/utils/Utils.java
@@ -506,4 +506,45 @@ return false;//指定楼层没有穿梭车 } //检测库位组是否存在小车,存在返回小车号。 public static Integer checkGroupLocHasShuttle(List<String> groupLoc) { if (groupLoc == null) { return null; } if (groupLoc.isEmpty()) { return null; } SlaveProperties slaveProperties = SpringUtils.getBean(SlaveProperties.class); if (slaveProperties == null) { return null; } for (String loc : groupLoc) { for (ShuttleSlave slave : slaveProperties.getShuttle()) { NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, slave.getId()); if (shuttleThread == null) { continue; } NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); if (shuttleProtocol == null) { continue; } if (shuttleProtocol.getCurrentLocNo() == null) { continue; } if (shuttleProtocol.getCurrentLocNo().equals(loc)) { //存在小车 return slave.getId(); } } } return null; } } src/main/java/com/zy/common/utils/NavigateMapData.java
@@ -235,57 +235,4 @@ return lists; } /** * 写入路径节点数据到redis地图中 * lock为true 禁用库位,lock为false恢复库位 */ public synchronized boolean writeNavigateNodeToRedisMap(List<NavigateNode> nodes, boolean lock) { RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class); try { if (!redisUtil.tryLock("realtimeBasMap_" + lev)) { return false;//加锁失败 } Object o = redisUtil.get("realtimeBasMap_" + lev); if (o == null) { return false; } BasMap basMap = JSON.parseObject(o.toString(), BasMap.class); ArrayList arrayList = JSON.parseObject(basMap.getData(), ArrayList.class); List<List<MapNode>> lists = filterMap(NavigationMapType.NONE.id, arrayList, lev, null, null);//获取全部地图数据 NavigateMapData mapData = new NavigateMapData(nodes.get(0).getZ()); List<List<MapNode>> realMap = mapData.getJsonData(-1, null, null);//获取完整地图(包括入库出库) for (NavigateNode node : nodes) { if (node.getZ() != lev) { continue; } List<MapNode> listX = lists.get(node.getX()); MapNode mapNode = listX.get(node.getY()); if (lock) { mapNode.setValue(-999);//禁用库位 } else { //获取原始节点数据 List<MapNode> rows = realMap.get(node.getX()); MapNode col = rows.get(node.getY()); mapNode.setValue(col.getValue());//恢复库位 } listX.set(node.getY(), mapNode); lists.set(node.getX(), listX); } basMap.setData(JSON.toJSONString(lists)); basMap.setUpdateTime(new Date()); //将数据库地图数据存入redis redisUtil.set("realtimeBasMap_" + lev, JSON.toJSONString(basMap)); //解锁 redisUtil.unlock("realtimeBasMap_" + lev); } catch (Exception e) { e.printStackTrace(); } return true; } } src/main/java/com/zy/common/utils/NavigateMapUtils.java
New file @@ -0,0 +1,73 @@ package com.zy.common.utils; import com.alibaba.fastjson.JSON; import com.core.common.SpringUtils; import com.zy.asrs.entity.BasMap; import com.zy.common.model.MapNode; import com.zy.common.model.NavigateNode; import com.zy.common.model.enums.NavigationMapType; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.Date; import java.util.List; @Component public class NavigateMapUtils { /** * 写入路径节点数据到redis地图中 * lock为true 禁用库位,lock为false恢复库位 */ public synchronized boolean writeNavigateNodeToRedisMap(Integer lev, List<NavigateNode> nodes, boolean lock) { RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class); try { NavigateMapData navigateMapData = new NavigateMapData(lev); if (!redisUtil.tryLock("realtimeBasMap_" + lev)) { return false;//加锁失败 } Object o = redisUtil.get("realtimeBasMap_" + lev); if (o == null) { return false; } BasMap basMap = JSON.parseObject(o.toString(), BasMap.class); ArrayList arrayList = JSON.parseObject(basMap.getData(), ArrayList.class); List<List<MapNode>> lists = navigateMapData.filterMap(NavigationMapType.NONE.id, arrayList, lev, null, null);//获取全部地图数据 NavigateMapData mapData = new NavigateMapData(nodes.get(0).getZ()); List<List<MapNode>> realMap = mapData.getJsonData(-1, null, null);//获取完整地图(包括入库出库) for (NavigateNode node : nodes) { if (node.getZ() != lev) { continue; } List<MapNode> listX = lists.get(node.getX()); MapNode mapNode = listX.get(node.getY()); if (lock) { mapNode.setValue(-999);//禁用库位 } else { //获取原始节点数据 List<MapNode> rows = realMap.get(node.getX()); MapNode col = rows.get(node.getY()); mapNode.setValue(col.getValue());//恢复库位 } listX.set(node.getY(), mapNode); lists.set(node.getX(), listX); } basMap.setData(JSON.toJSONString(lists)); basMap.setUpdateTime(new Date()); //将数据库地图数据存入redis redisUtil.set("realtimeBasMap_" + lev, JSON.toJSONString(basMap)); //解锁 redisUtil.unlock("realtimeBasMap_" + lev); } catch (Exception e) { e.printStackTrace(); } return true; } } src/main/java/com/zy/common/utils/ShuttleDispatchUtils.java
@@ -69,6 +69,14 @@ * 调度车辆 */ public boolean dispatchShuttle(Integer wrkNo, String locNo) { //检测目标库位组是否存在小车,如存在小车则直接指定该车 List<String> groupLoc = Utils.getGroupLoc(locNo); Integer groupShuttleNo = Utils.checkGroupLocHasShuttle(groupLoc); if (groupShuttleNo != null) { //存在小车,直接调度该车 return shuttleMoveGenerate(wrkNo, locNo, groupShuttleNo); } ArrayList<NyShuttleThread> sameLev = new ArrayList<>();//相同楼层的穿梭车 ArrayList<NyShuttleThread> diffLev = new ArrayList<>();//不同楼层的穿梭车 src/main/java/com/zy/core/model/protocol/NyShuttleProtocol.java
@@ -582,4 +582,10 @@ } } } public void setShuttleNo(Short shuttleNo) { if (shuttleNo != 0) { this.shuttleNo = shuttleNo; } } } src/main/java/com/zy/core/thread/NyShuttleThread.java
@@ -370,6 +370,7 @@ return false; } NavigateMapUtils navigateMapUtils = SpringUtils.getBean(NavigateMapUtils.class); WrkMastMapper wrkMastMapper = SpringUtils.getBean(WrkMastMapper.class); WrkMast wrkMast = wrkMastMapper.selectByWorkNo(wrkNo.intValue()); @@ -388,8 +389,6 @@ } checkIOSta(commands, commandStep);//检测小车是否进出提升机输送站 NavigateMapData navigateMapData = new NavigateMapData(Utils.getLev(shuttleProtocol.getCurrentLocNo())); boolean isLock = false;//是否解锁路径 //取出命令 @@ -414,7 +413,7 @@ // nodes.addAll(command.getNodes()); // } if (nodes != null) { boolean result = navigateMapData.writeNavigateNodeToRedisMap(nodes, false);//解锁路径 boolean result = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(shuttleProtocol.getCurrentLocNo()), nodes, false);//解锁路径 if (!result) { return false;//解锁失败 } @@ -503,7 +502,7 @@ nodes.addAll(nextNodes); } if (nodes != null) { boolean result = navigateMapData.writeNavigateNodeToRedisMap(nodes, true);//所使用的路径进行锁定禁用 boolean result = navigateMapUtils.writeNavigateNodeToRedisMap(Utils.getLev(shuttleProtocol.getCurrentLocNo()), nodes, true);//所使用的路径进行锁定禁用 if (!result) { return false;//路径锁定失败 }