| | |
| | | package com.zy.asrs.wcs.core.utils; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.zy.asrs.framework.common.Cools; |
| | | import com.zy.asrs.framework.common.SnowflakeIdWorker; |
| | |
| | | import com.zy.asrs.wcs.system.service.DictService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.util.*; |
| | | |
| | |
| | | @Autowired |
| | | private NavigateUtils navigateUtils; |
| | | |
| | | /** |
| | | * 调度车辆 |
| | | */ |
| | | public Device dispatchShuttle(Task task, String locNo) { |
| | | ArrayList<ShuttleThread> sameLev = new ArrayList<>();//相同楼层的穿梭车 |
| | | ArrayList<ShuttleThread> diffLev = new ArrayList<>();//不同楼层的穿梭车 |
| | | |
| | | ShuttleThread resThread = null; |
| | | int lev = Utils.getLev(locNo); |
| | | List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>() |
| | | .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val()) |
| | | .eq(Device::getHostId, task.getHostId()) |
| | | .eq(Device::getStatus, 1)); |
| | | //获取同层小车 |
| | | List<Device> currentLevDevices = new ArrayList<>(); |
| | | //获取跨层小车 |
| | | HashMap<Integer, List<Device>> diffLevDeviceMap = new HashMap<>(); |
| | | for (Device device : list) { |
| | | //获取四向穿梭车线程 |
| | | ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue()); |
| | | ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); |
| | | if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) { |
| | | continue; |
| | | } |
| | | |
| | | if (shuttleProtocol.getCurrentLocNo() == null) { |
| | | continue; |
| | | } |
| | | |
| | | int shuttleLev = Utils.getLev(shuttleProtocol.getCurrentLocNo()); |
| | | if (shuttleLev == lev) { |
| | | currentLevDevices.add(device); |
| | | } else { |
| | | List<Device> devices = null; |
| | | if (diffLevDeviceMap.containsKey(shuttleLev)) { |
| | | devices = diffLevDeviceMap.get(shuttleLev); |
| | | } else { |
| | | devices = new ArrayList<>(); |
| | | } |
| | | devices.add(device); |
| | | diffLevDeviceMap.put(shuttleLev, devices); |
| | | } |
| | | } |
| | | |
| | | //搜索同层 |
| | | resThread = this.searchCurrentLevShuttle(currentLevDevices, locNo); |
| | | |
| | | //同层没有搜索到合适小车,跨楼层搜索 |
| | | if (resThread == null) { |
| | | resThread = this.searchDiffLevShuttle(diffLevDeviceMap, locNo, task); |
| | | } |
| | | |
| | | if (resThread != null) { |
| | | if (resThread.getStatus().getCurrentLocNo().equals(locNo)) { |
| | | return resThread.getDevice(); |
| | | } |
| | | |
| | | Task result = generateMoveTask(resThread.getDevice(), locNo); |
| | | if (result != null) { |
| | | return resThread.getDevice(); |
| | | } |
| | | } |
| | | |
| | | News.info("{}目标库位没有搜索到可用穿梭车", locNo); |
| | | return null; |
| | | } |
| | | |
| | | public synchronized ShuttleThread searchIdleShuttle(Task task) { |
| | | String locNo = taskService.judgeInbound(task) ? task.getDestLoc() : task.getOriginLoc(); |
| | | ShuttleThread resThread = null; |
| | |
| | | ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue()); |
| | | ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); |
| | | if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) { |
| | | continue; |
| | | } |
| | | |
| | | if (shuttleProtocol.getCurrentLocNo() == null) { |
| | | continue; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | // 有没有被其他任务调度 |
| | | List<Task> taskList = taskService.selectWorkingByShuttle(Integer.valueOf(device.getDeviceNo()), null); |
| | | if (!taskList.isEmpty()) { |
| | | continue; |
| | | } |
| | | |
| | | |
| | | int currentLev = Utils.getLev(shuttleProtocol.getCurrentLocNo());//小车当前层高 |
| | | String currentLocNo = shuttleProtocol.getCurrentLocNo();//小车当前库位号 |
| | | |
| | |
| | | |
| | | // 同楼层直接计算到目标库位 |
| | | //当前穿梭车线程到当前车子所在楼层的目标库位距离 |
| | | List<NavigateNode> currentShuttlePath = navigateUtils.calc( |
| | | List<NavigateNode> currentShuttlePath = navigateUtils.calcWhiteList( |
| | | currentLocNo |
| | | , locNo |
| | | , NavigationMapType.NORMAL.id |
| | | , NavigationMapType.DFX.id |
| | | , Utils.getShuttlePoints(Integer.parseInt(shuttleThread.getDevice().getDeviceNo()), currentLev) |
| | | );//搜索空闲穿梭车,使用正常通道地图 |
| | | if (currentShuttlePath == null) { |
| | |
| | | } |
| | | |
| | | // 有没有被其他任务调度 |
| | | List<Task> taskList = taskService.selectWorkingByShuttle(Integer.valueOf(device.getDeviceNo()), null); |
| | | if (!taskList.isEmpty()) { |
| | | continue; |
| | | } |
| | | |
| | | int currentLev = Utils.getLev(shuttleProtocol.getCurrentLocNo());//小车当前层高 |
| | | String currentLocNo = shuttleProtocol.getCurrentLocNo();//小车当前库位号 |
| | | |
| | |
| | | List<NavigateNode> currentShuttlePath = navigateUtils.calc( |
| | | currentLocNo |
| | | , targetLocNo |
| | | , NavigationMapType.NORMAL.id |
| | | , NavigationMapType.DFX.id |
| | | , Utils.getShuttlePoints(Integer.parseInt(shuttleThread.getDevice().getDeviceNo()), currentLev) |
| | | );//搜索空闲穿梭车,使用正常通道地图 |
| | | if (currentShuttlePath == null) { |
| | |
| | | return null; |
| | | } |
| | | |
| | | ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); |
| | | if (shuttleProtocol == null) { |
| | | return null; |
| | | } |
| | | |
| | | Task task = new Task(); |
| | | task.setUuid(String.valueOf(snowflakeIdWorker.nextId())); |
| | | task.setTaskNo(String.valueOf(Utils.getTaskNo("MOVE"))); |
| | |
| | | task.setTaskCtg(taskCtg.getId()); |
| | | task.setPriority(10); |
| | | task.setOriginSite(null); |
| | | task.setOriginLoc(null); |
| | | task.setOriginLoc(shuttleProtocol.getCurrentLocNo()); |
| | | task.setDestSite(null); |
| | | task.setDestLoc(locNo); // 迁移位置 |
| | | task.setIoTime(new Date()); |
| | |
| | | return lastPathStartLoc; |
| | | } |
| | | |
| | | //获取小车坐标 |
| | | public String findShuttleLocNo(Integer shuttleNo, Long hostId) { |
| | | Device device = deviceService.getOne(new LambdaQueryWrapper<Device>() |
| | | .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val()) |
| | | .eq(Device::getDeviceNo, shuttleNo) |
| | | .eq(Device::getHostId, hostId) |
| | | .eq(Device::getStatus, 1)); |
| | | if(device == null) { |
| | | return null; |
| | | } |
| | | |
| | | //获取四向穿梭车线程 |
| | | ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue()); |
| | | ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); |
| | | if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) { |
| | | return null; |
| | | } |
| | | |
| | | return shuttleProtocol.getCurrentLocNo(); |
| | | } |
| | | |
| | | |
| | | } |