zjj
2025-02-17 019a83b893a4d6c6f939f7162b96b188470202bf
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java
@@ -56,6 +56,8 @@
    private ShuttleStandbyService shuttleStandbyService;
    @Autowired
    private DictService dictService;
    @Autowired
    private NavigateUtils navigateUtils;
    public synchronized ShuttleThread searchIdleShuttle(Task task) {
        String locNo = taskService.judgeInbound(task) ? task.getDestLoc() : task.getOriginLoc();
@@ -68,7 +70,7 @@
        //获取同层小车
        List<Device> currentLevDevices = new ArrayList<>();
        //获取跨层小车
        List<Device> diffLevDevices = new ArrayList<>();
        HashMap<Integer,List<Device>> diffLevDeviceMap = new HashMap<>();
        for (Device device : list) {
            //获取四向穿梭车线程
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue());
@@ -77,10 +79,18 @@
                continue;
            }
            if (Utils.getLev(shuttleProtocol.getCurrentLocNo()) == lev) {
            int shuttleLev = Utils.getLev(shuttleProtocol.getCurrentLocNo());
            if (shuttleLev == lev) {
                currentLevDevices.add(device);
            }else {
                diffLevDevices.add(device);
                List<Device> devices = null;
                if(diffLevDeviceMap.containsKey(shuttleLev)) {
                    devices = diffLevDeviceMap.get(shuttleLev);
                }else {
                    devices = new ArrayList<>();
                }
                devices.add(device);
                diffLevDeviceMap.put(shuttleLev, devices);
            }
        }
        //搜索同层
@@ -88,7 +98,7 @@
        //同层没有搜索到合适小车,跨楼层搜索
        if(resThread == null) {
            resThread = this.searchDiffLevShuttle(diffLevDevices, locNo, task);
            resThread = this.searchDiffLevShuttle(diffLevDeviceMap, locNo, task);
        }
        return resThread;
@@ -144,7 +154,7 @@
            // 同楼层直接计算到目标库位
            //当前穿梭车线程到当前车子所在楼层的目标库位距离
            List<NavigateNode> currentShuttlePath = NavigateUtils.calc(
            List<NavigateNode> currentShuttlePath = navigateUtils.calc(
                    currentLocNo
                    , locNo
                    , NavigationMapType.NORMAL.id
@@ -154,7 +164,7 @@
                continue;
            }
            Integer currDistance = NavigateUtils.getOriginPathAllDistance(currentShuttlePath);//计算当前路径行走总距离
            Integer currDistance = navigateUtils.getOriginPathAllDistance(currentShuttlePath);//计算当前路径行走总距离
            // 挂载任务权重
            List<Task> tasks = taskService.selectWorkingByShuttle(Integer.valueOf(device.getDeviceNo()), null);
@@ -171,13 +181,16 @@
        return resThread;
    }
    private synchronized ShuttleThread searchDiffLevShuttle(List<Device> devices, String locNo, Task task) {
    private synchronized ShuttleThread searchDiffLevShuttle(HashMap<Integer,List<Device>> devicesMap, String locNo, Task task) {
        ShuttleThread resThread = null;
        Integer finalDistance = ShuttleDispatcher.INF;
        //检测目标楼层车数量是否小于允许的最大数量
        boolean checkDispatchMaxNum = checkDispatchMaxNum(Utils.getLev(locNo), task.getHostId());
        for (Map.Entry<Integer, List<Device>> entry : devicesMap.entrySet()) {
            Integer lev = entry.getKey();
            List<Device> devices = entry.getValue();
        for (Device device : devices) {
            if (taskService.hasBusyOutboundByShuttle(Integer.parseInt(device.getDeviceNo()))) {
                continue;
@@ -238,7 +251,7 @@
            String targetLocNo = shuttleStandby.getDeviceLoc();
            //当前穿梭车线程到当前车子所在楼层的提升机待机位距离
            List<NavigateNode> currentShuttlePath = NavigateUtils.calc(
                List<NavigateNode> currentShuttlePath = navigateUtils.calc(
                    currentLocNo
                    , targetLocNo
                    , NavigationMapType.NORMAL.id
@@ -248,7 +261,7 @@
                continue;
            }
            Integer currDistance = NavigateUtils.getOriginPathAllDistance(currentShuttlePath);//计算当前路径行走总距离
                Integer currDistance = navigateUtils.getOriginPathAllDistance(currentShuttlePath);//计算当前路径行走总距离
            // 不同楼层权重
            if (currentLev != Utils.getLev(locNo)) {
@@ -267,6 +280,10 @@
            }
        }
            if (resThread != null) {
                break;
            }
        }
        return resThread;
    }
@@ -401,7 +418,7 @@
        String recentLoc = null;
        for (String loc : locNos) {
            //当前穿梭车到避让位计算
            List<NavigateNode> currentShuttlePath = NavigateUtils.calc(
            List<NavigateNode> currentShuttlePath = navigateUtils.calc(
                    currentLocNo
                    , loc
                    , NavigationMapType.NORMAL.id
@@ -411,7 +428,7 @@
                continue;
            }
            Integer currDistance = NavigateUtils.getOriginPathAllDistance(currentShuttlePath);//计算当前路径行走总距离
            Integer currDistance = navigateUtils.getOriginPathAllDistance(currentShuttlePath);//计算当前路径行走总距离
            if (currDistance < finalDistance) {
                finalDistance = currDistance;
                recentLoc = loc;
@@ -521,13 +538,13 @@
    //分析出库路径待机库位
    public String analyzeOutPathWaitLoc(String startLoc, String targetLoc, Device shuttleDevice) {
        //计算路径并分解成两段动作
        List<NavigateNode> nodeList = NavigateUtils.calc(startLoc, targetLoc, NavigationMapType.DFX.id, Utils.getShuttlePoints(Integer.parseInt(shuttleDevice.getDeviceNo()), Utils.getLev(startLoc)));
        List<NavigateNode> nodeList = navigateUtils.calc(startLoc, targetLoc, NavigationMapType.DFX.id, Utils.getShuttlePoints(Integer.parseInt(shuttleDevice.getDeviceNo()), Utils.getLev(startLoc)));
        if (nodeList == null) {
            News.error("{} dash {} can't find navigate path!", startLoc, targetLoc);
            return null;
        }
        //获取分段路径
        ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(nodeList);
        ArrayList<ArrayList<NavigateNode>> data = navigateUtils.getSectionPath(nodeList);
        if (data.size() <= 1) {
            return startLoc;//两点之间只有一段路径,在起点位置等待
        }