| | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.zy.acs.framework.common.Cools; |
| | | import com.zy.acs.manager.common.utils.CommonUtil; |
| | | import com.zy.acs.manager.common.utils.LocUtils; |
| | | import com.zy.acs.manager.core.domain.Lane; |
| | | import com.zy.acs.manager.manager.entity.*; |
| | | import com.zy.acs.manager.manager.enums.StatusType; |
| | |
| | | List<String> availableAgvNosByOriLane = new ArrayList<>(availableAgvNos); |
| | | if (null != originLane) { |
| | | List<String> agvNosByOriLane = findAgvNosByLane(originLane); // the agv list that had tasks in this lane |
| | | if (!Cools.isEmpty(agvNosByOriLane) && agvNosByOriLane.size() >= maxAgvCountInLane) { |
| | | // if full lane |
| | | if (agvNosByOriLane.size() >= maxAgvCountInLane) { |
| | | |
| | | availableAgvNosByOriLane = Cools.getIntersection(agvNosByOriLane, availableAgvNos); |
| | | } |
| | |
| | | List<String> availableAgvNosByDestLane = new ArrayList<>(availableAgvNos); |
| | | if (null != destinationLane) { |
| | | List<String> agvNosByDestLane = findAgvNosByLane(destinationLane); |
| | | if (!Cools.isEmpty(agvNosByDestLane) && agvNosByDestLane.size() >= maxAgvCountInLane) { |
| | | if (agvNosByDestLane.size() >= maxAgvCountInLane) { |
| | | |
| | | availableAgvNosByDestLane = Cools.getIntersection(agvNosByDestLane, availableAgvNos); |
| | | } |
| | |
| | | log.warn("No available agv to assign the task destination[{}]", task.getSeqNum()); |
| | | return null; |
| | | } |
| | | |
| | | List<String> actualAvailableAgvNos = Cools.getIntersection(availableAgvNosByOriLane, availableAgvNosByDestLane); |
| | | if (Cools.isEmpty(actualAvailableAgvNos)) { |
| | | log.warn("No available agv to assign the task[{}]", task.getSeqNum()); |
| | |
| | | return agvService.selectByUuid(actualAvailableAgvNos.stream().findFirst().orElse(null)); |
| | | } |
| | | |
| | | private List<String> findAgvNosByLane(Lane lane) { |
| | | public List<String> findAgvNosByLane(Lane lane) { |
| | | if (null == lane) { |
| | | return null; |
| | | return new ArrayList<>(); |
| | | } |
| | | List<Task> taskList = taskService.findRunningTasksByLaneHash(lane.getHashCode()); |
| | | if (Cools.isEmpty(taskList)) { |
| | | return null; |
| | | return new ArrayList<>(); |
| | | } |
| | | return taskList.stream().map(task -> { |
| | | return agvService.getById(task.getAgvId()).getUuid(); |
| | | }).distinct().collect(Collectors.toList()); |
| | | return taskList.stream() |
| | | .map(task -> agvService.getById(task.getAgvId()).getUuid()) |
| | | .distinct() |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | | private List<String> validBackpackLimit(List<String> agvNoList) { |
| | |
| | | return agvNoList.stream().filter(agvNo -> { |
| | | Agv agv = agvService.selectByUuid(agvNo); |
| | | AgvModel agvModel = agvModelService.getById(agv.getAgvModel()); |
| | | List<Task> runningTasks = taskService.findRunningTasksByAgv(agv.getId()); |
| | | return runningTasks.size() < agvModel.getBackpack(); |
| | | List<Task> transportTasks = taskService.findTransportTasksByAgv(agv.getId()); |
| | | return transportTasks.size() < agvModel.getBackpack(); |
| | | }).collect(Collectors.toList()); |
| | | } |
| | | |
| | |
| | | Agv agv = agvService.selectByUuid(agvNo); |
| | | |
| | | // backpack |
| | | List<Task> runningTasks = taskService.findRunningTasksByAgv(agv.getId()); |
| | | if (!Cools.isEmpty(runningTasks)) { |
| | | weight = weight + runningTasks.size() * 100000; |
| | | List<Task> transportTasks = taskService.findTransportTasksByAgv(agv.getId()); |
| | | if (!Cools.isEmpty(transportTasks)) { |
| | | weight = weight + transportTasks.size() * 100000; |
| | | } |
| | | |
| | | // distance |
| | |
| | | return -weight; |
| | | } |
| | | |
| | | public synchronized Agv execute(Task task, Map<String, List<Long>> taskAllot, List<Long> taskIds) { |
| | | String oriLocNo = task.getOriLoc$(); |
| | | int oriLocRow = LocUtils.getRow(oriLocNo); |
| | | String destLocNo = task.getDestLoc$(); |
| | | int destLocRow = LocUtils.getRow(destLocNo); |
| | | public Boolean validCapacityOfLane(Agv agv, Code code) { |
| | | Lane lane = laneService.search(code.getData()); |
| | | if (null != lane) { |
| | | Integer maxAgvCountInLane = configService.getVal("maxAgvCountInLane", Integer.class); |
| | | |
| | | Agv hit = null; |
| | | |
| | | List<Agv> agvList = agvService.list(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, StatusType.ENABLE.val)); |
| | | Collections.shuffle(agvList); |
| | | for (Agv agv : agvList) { |
| | | AgvModel agvModel = agvModelService.getById(agv.getAgvModel()); |
| | | int allotTaskCount = 0; |
| | | List<Long> allotTaskIds = taskAllot.get(agv.getUuid()); |
| | | if (!Cools.isEmpty(allotTaskIds)) { |
| | | allotTaskCount = allotTaskIds.size(); |
| | | List<String> agvNosByLane = this.findAgvNosByLane(lane); |
| | | agvNosByLane.remove(agv.getUuid()); |
| | | if (agvNosByLane.size() >= maxAgvCountInLane) { |
| | | return false; |
| | | } |
| | | if (allotTaskCount >= agvModel.getBackpack()) { |
| | | continue; |
| | | } |
| | | if (taskService.count(new LambdaQueryWrapper<Task>() |
| | | .eq(Task::getAgvId, agv.getId()) |
| | | .notIn(Task::getId, taskIds) |
| | | .and(i -> { |
| | | i.eq(Task::getTaskSts, TaskStsType.WAITING.val()) // 已经有waiting任务的车不能再分配 |
| | | .or().eq(Task::getTaskSts, TaskStsType.ASSIGN.val()) |
| | | .or().eq(Task::getTaskSts, TaskStsType.PROGRESS.val()); |
| | | })) > 0) { |
| | | log.info(agv.getUuid() + "号AGV不可用,已经存在进行中的任务..."); |
| | | continue; |
| | | } |
| | | if (!agvService.judgeEnable(agv.getId(), true)) { |
| | | log.info(agv.getUuid() + "号AGV不可用," + task.getSeqNum() + "任务无法计算..."); |
| | | continue; |
| | | } |
| | | |
| | | hit = agv; |
| | | break; |
| | | } |
| | | |
| | | return hit; |
| | | return true; |
| | | } |
| | | |
| | | public synchronized Agv execute1(Task task, Map<String, List<Long>> taskAllot, List<Long> taskIds) { |
| | | String oriLocNo = task.getOriLoc$(); |
| | | int oriLocRow = LocUtils.getRow(oriLocNo); |
| | | String destLocNo = task.getDestLoc$(); |
| | | int destLocRow = LocUtils.getRow(destLocNo); |
| | | |
| | | Agv agv = null; |
| | | if (oriLocRow <= 2 && destLocRow <= 2) { |
| | | agv = agvService.selectByUuid(String.valueOf(1)); |
| | | } |
| | | if (oriLocRow > 2 && destLocRow > 2) { |
| | | agv = agvService.selectByUuid(String.valueOf(2)); |
| | | } |
| | | assert agv != null; |
| | | AgvModel agvModel = agvModelService.getById(agv.getAgvModel()); |
| | | int allotTaskCount = 0; |
| | | List<Long> allotTaskIds = taskAllot.get(agv.getUuid()); |
| | | if (!Cools.isEmpty(allotTaskIds)) { |
| | | allotTaskCount = allotTaskIds.size(); |
| | | } |
| | | if (allotTaskCount >= agvModel.getBackpack()) { |
| | | return null; |
| | | } |
| | | if (taskService.count(new LambdaQueryWrapper<Task>() |
| | | .eq(Task::getAgvId, agv.getId()) |
| | | .notIn(Task::getId, taskIds) |
| | | .and(i -> { |
| | | i.eq(Task::getTaskSts, TaskStsType.WAITING.val()) // 已经有waiting任务的车不能再分配 |
| | | .or().eq(Task::getTaskSts, TaskStsType.ASSIGN.val()) |
| | | .or().eq(Task::getTaskSts, TaskStsType.PROGRESS.val()); |
| | | })) > 0) { |
| | | log.info(agv.getUuid() + "号AGV不可用,已经存在进行中的任务..."); |
| | | return null; |
| | | } |
| | | if (!agvService.judgeEnable(agv.getId(), true)) { |
| | | log.info(agv.getUuid() + "号AGV不可用," + task.getSeqNum() + "任务无法计算..."); |
| | | return null; |
| | | } |
| | | |
| | | return agv; |
| | | } |
| | | |
| | | } |