Junjie
2023-07-14 e0c7be4335fd432e60bfc5cbb81dfd7096589a0b
rgv路径
3个文件已修改
154 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/RgvNode.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/RgvUtils.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/RgvNode.java
@@ -9,6 +9,8 @@
    private Boolean lock = false;//路径锁定
    private Integer rgvNo = 0;//RGV号
    public RgvNode(Integer path) {
        this.path = path;
    }
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -632,7 +632,7 @@
                        }
                        //判断行走路径是否被占用
                        Integer staNo = wrkMast.getStaNo();
                        Integer staNo = wrkMast.getSourceStaNo();
                        BasDevp basDevp = basDevpService.selectById(staNo);
                        if (basDevp == null) {
                            continue;//目标站不存在
@@ -641,8 +641,13 @@
                        int startPath = rgvProtocol.getRgvPos().intValue();
                        //目标路径值
                        int endPath = basDevp.getLocType3().intValue();
                        boolean pathUsed = RgvUtils.isPathUsed(startPath, endPath);
                        boolean pathUsed = RgvUtils.isPathUsed(startPath, endPath);//判断行走路径是否被占用
                        if (pathUsed) {
                            //行走路径被占用,禁止下发命令
                            continue;
                        }
                        //行走路径空闲,锁定路径
                        RgvUtils.lockPath(startPath, endPath, rgvProtocol.getRgvNo(), true);
                        //  命令下发区 --------------------------------------------------------------------------
                        RgvCommand rgvCommand = new RgvCommand();
@@ -672,6 +677,24 @@
                            continue;
                        }
                        //判断行走路径是否被占用
                        Integer staNo = wrkMast.getStaNo();
                        BasDevp basDevp = basDevpService.selectById(staNo);
                        if (basDevp == null) {
                            continue;//目标站不存在
                        }
                        //起始路径
                        int startPath = rgvProtocol.getRgvPos().intValue();
                        //目标路径值
                        int endPath = basDevp.getLocType3().intValue();
                        boolean pathUsed = RgvUtils.isPathUsed(startPath, endPath);//判断行走路径是否被占用
                        if (pathUsed) {
                            //行走路径被占用,禁止下发命令
                            continue;
                        }
                        //行走路径空闲,锁定路径
                        RgvUtils.lockPath(startPath, endPath, rgvProtocol.getRgvNo(), true);
                        //  命令下发区 --------------------------------------------------------------------------
                        RgvCommand rgvCommand = new RgvCommand();
                        rgvCommand.setRgvNo(wrkMast.getRgvNo()); // RGV编号
@@ -696,6 +719,24 @@
                        if (rgvProtocol.getTaskNo1() != 0 || rgvProtocol.getLoaded1() != 0) {//RGV是否无任务、RGV是否无货
                            continue;
                        }
                        //判断行走路径是否被占用
                        Integer staNo = wrkMast.getSourceStaNo();
                        BasDevp basDevp = basDevpService.selectById(staNo);
                        if (basDevp == null) {
                            continue;//目标站不存在
                        }
                        //起始路径
                        int startPath = rgvProtocol.getRgvPos().intValue();
                        //目标路径值
                        int endPath = basDevp.getLocType3().intValue();
                        boolean pathUsed = RgvUtils.isPathUsed(startPath, endPath);//判断行走路径是否被占用
                        if (pathUsed) {
                            //行走路径被占用,禁止下发命令
                            continue;
                        }
                        //行走路径空闲,锁定路径
                        RgvUtils.lockPath(startPath, endPath, rgvProtocol.getRgvNo(), true);
                        //  命令下发区 --------------------------------------------------------------------------
                        RgvCommand rgvCommand = new RgvCommand();
@@ -725,6 +766,24 @@
                            continue;
                        }
                        //判断行走路径是否被占用
                        Integer staNo = wrkMast.getStaNo();
                        BasDevp basDevp = basDevpService.selectById(staNo);
                        if (basDevp == null) {
                            continue;//目标站不存在
                        }
                        //起始路径
                        int startPath = rgvProtocol.getRgvPos().intValue();
                        //目标路径值
                        int endPath = basDevp.getLocType3().intValue();
                        boolean pathUsed = RgvUtils.isPathUsed(startPath, endPath);//判断行走路径是否被占用
                        if (pathUsed) {
                            //行走路径被占用,禁止下发命令
                            continue;
                        }
                        //行走路径空闲,锁定路径
                        RgvUtils.lockPath(startPath, endPath, rgvProtocol.getRgvNo(), true);
                        //  命令下发区 --------------------------------------------------------------------------
                        RgvCommand rgvCommand = new RgvCommand();
                        rgvCommand.setRgvNo(wrkMast.getRgvNo()); // RGV编号
src/main/java/com/zy/common/utils/RgvUtils.java
@@ -1,11 +1,98 @@
package com.zy.common.utils;
import com.alibaba.fastjson.JSON;
import com.core.common.SpringUtils;
import com.zy.asrs.entity.RgvNode;
import java.util.ArrayList;
import java.util.List;
public class RgvUtils {
    //判断行走路径是否被占用
    public static boolean isPathUsed(Integer startPath,Integer endPath) {
        RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
        Object data = redisUtil.get("rgv_map");
        List<RgvNode> rgvNodes = JSON.parseArray(data.toString(), RgvNode.class);//实时地图
        List<RgvNode> pathList = getPathList(startPath, endPath);//通过起点和目标点获取行走路径
        //提取受控路径
        ArrayList<Integer> list = new ArrayList<>();
        for (RgvNode rgvNode : pathList) {
            //判断路径是否被占用
            if (rgvNode.getPath().equals(startPath)) {
                //起点路径不纳入计算范围
                continue;
            }
            list.add(rgvNode.getPath());
        }
        for (RgvNode node : rgvNodes) {//遍历实时地图
            if (list.contains(node.getPath())) {
                //路径相同,判断是否被占用
                if (node.getLock()) {
                    return true;//只要有一条路径被占用,整体路均不可用
                }
            }
        }
        return false;
    }
    //锁定/解锁路径
    public static void lockPath(Integer startPath, Integer endPath, Integer rgvNo, boolean lock) {
        List<RgvNode> pathList = getPathList(startPath, endPath);//通过起点和目标点获取行走路径
        lockPath(pathList, rgvNo, lock);
    }
    //锁定/解锁路径
    public static void lockPath(List<RgvNode> pathList, Integer rgvNo, boolean lock) {
        RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
        Object data = redisUtil.get("rgv_map");
        List<RgvNode> rgvNodes = JSON.parseArray(data.toString(), RgvNode.class);//实时地图
        ArrayList<Integer> list = new ArrayList<>();
        for (RgvNode rgvNode : pathList) {//提取受控路径
            list.add(rgvNode.getPath());
        }
        for (RgvNode rgvNode : rgvNodes) {//遍历实时地图
            if (list.contains(rgvNode.getPath())) {
                //路径相同
                if (lock) {
                    rgvNode.setLock(true);//锁定
                    rgvNode.setRgvNo(rgvNo);
                } else {
                    rgvNode.setLock(false);//解锁
                    rgvNode.setRgvNo(0);
                }
            }
        }
    }
    //通过起点和目标点获取行走路径
    public static List<RgvNode> getPathList(Integer startPath, Integer endPath) {
        int result = startPath - endPath;
        ArrayList<RgvNode> list = new ArrayList<>();
        if (result == 0) {
            list.add(new RgvNode(startPath));
            return list;
        }
        if (result > 0) {
            //起点 - 目标点 > 0  正方向
            for (int i = startPath; i >= endPath; i--) {
                list.add(new RgvNode(i));
            }
        }else {
            //起点 = 目标点 < 0  负方向
            for (int i = startPath; i <= endPath; i++) {
                list.add(new RgvNode(i));
            }
        }
        return list;
    }
    public static void main(String[] args) {
        System.out.println(getPathList(5,5));
    }
}