#
luxiaotao1123
2024-10-28 5a9828d9466e0ae7d57c255b6c5f4dfe4999ddcc
#
3个文件已修改
84 ■■■■■ 已修改文件
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/TaskService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/TaskServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java
@@ -69,7 +69,13 @@
    }
    /**
     * it can break the limit of the number of agv backpack
     * 1.   判断task的起始点和目的点所在的巷道承载任务数量,
     *      如果数量已经达到负载,则判断负载任务的AGV是否还有空背篓,如果有则优先派发给它,
     *      如果没有了,那么则阻塞任务,直到该巷道释放
     * 2.   轮询空闲小车,目标是让每台小车都动起来
     *      判断逻辑:背篓数量最少的小车轮询的时候,优先级最高
     *
     *      it can break the limit of the number of agv backpack
     */
    public synchronized Agv execute(Task task) {
        List<Agv> availableAgvList = getAvailableAgv();
@@ -93,13 +99,10 @@
            if (!Cools.isEmpty(agvNosByOriLane) && agvNosByOriLane.size() >= maxAgvCountInLane) {
                availableAgvNosByOriLane = Cools.getIntersection(agvNosByOriLane, availableAgvNos);
                availableAgvNosByOriLane = availableAgvNosByOriLane.stream().filter(agvNo -> {
                    Agv agv = agvService.selectByUuid(agvNo);
                    return agv.getStatus() == 1;
                }).collect(Collectors.toList());
            }
        }
        // valid backpack limit
        availableAgvNosByOriLane = this.validBackpackLimit(availableAgvNosByOriLane);
        // allocate about destination
@@ -109,13 +112,9 @@
            if (!Cools.isEmpty(agvNosByDestLane) && agvNosByDestLane.size() >= maxAgvCountInLane) {
                availableAgvNosByDestLane = Cools.getIntersection(agvNosByDestLane, availableAgvNos);
                availableAgvNosByDestLane = availableAgvNosByDestLane.stream().filter(agvNo -> {
                    Agv agv = agvService.selectByUuid(agvNo);
                    return agv.getStatus() == 1;
                }).collect(Collectors.toList());
            }
        }
        availableAgvNosByDestLane = this.validBackpackLimit(availableAgvNosByDestLane);
        // valid
        if (Cools.isEmpty(availableAgvNosByOriLane)) {
@@ -133,29 +132,23 @@
            return null;
        }
        // choose min number of running task
        actualAvailableAgvNos.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return 0;
            public int compare(String agvNo1, String agvNo2) {
                return calcAllocateWeight(agvNo2, task) - calcAllocateWeight(agvNo1, task);
            }
        });
        String s = actualAvailableAgvNos.stream().findFirst().orElse(null);
        if (null != originLane) {
            task.setOriLaneHash(originLane.getHashCode());
        }
        if (null != destinationLane) {
            task.setDestLaneHash(destinationLane.getHashCode());
        }
        /**
         * 1.   判断task的起始点和目的点所在的巷道承载任务数量,
         *      如果数量已经达到负载,则判断负载任务的AGV是否还有空背篓,如果有则优先派发给它,
         *      如果没有了,那么则阻塞任务,直到该巷道释放
         *
         * 2.   轮询空闲小车,目标是让每台小车都动起来
         *      判断逻辑:背篓数量最少的小车轮询的时候,优先级最高
         */
        task.setOriLaneHash(originLane.getHashCode());
        task.setDestLaneHash(destinationLane.getHashCode());
        return null;
        return agvService.selectByUuid(actualAvailableAgvNos.stream().findFirst().orElse(null));
    }
    private List<String> findAgvNosByLane(Lane lane) {
@@ -171,6 +164,30 @@
        }).distinct().collect(Collectors.toList());
    }
    // calculate wight
    private int calcAllocateWeight(String agvNo, Task task) {
        int weight = 0;
        Agv agv = agvService.selectByUuid(agvNo);
        List<Task> runningTasks = taskService.findRunningTasksByAgv(agv.getId());
        if (!Cools.isEmpty(runningTasks)) {
            weight = weight + runningTasks.size() * 10;
        }
        return weight;
    }
    private List<String> validBackpackLimit(List<String> agvNoList) {
        if (Cools.isEmpty(agvNoList)) {
            return new ArrayList<>();
        }
        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();
        }).collect(Collectors.toList());
    }
    public synchronized Agv execute(Task task, Map<String, List<Long>> taskAllot, List<Long> taskIds) {
        String oriLocNo = task.getOriLoc$();
        int oriLocRow = LocUtils.getRow(oriLocNo);
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/TaskService.java
@@ -32,4 +32,6 @@
    List<Task> findRunningTasksByLaneHash(String laneHash);
    List<Task> findRunningTasksByAgv(Long agvId);
}
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/TaskServiceImpl.java
@@ -175,6 +175,17 @@
        );
    }
    @Override
    public List<Task> findRunningTasksByAgv(Long agvId) {
        if (null == agvId) {
            return new ArrayList<>();
        }
        LambdaQueryWrapper<Task> wrapper = new LambdaQueryWrapper<Task>().eq(Task::getAgvId, agvId);
        wrapper.in(Task::getTaskSts, TaskStsType.WAITING.val(), TaskStsType.ASSIGN.val(), TaskStsType.PROGRESS.val());
        wrapper.notIn(Task::getTaskType, TaskTypeType.MOVE.val(), TaskTypeType.TO_CHARGE.val(), TaskTypeType.TO_STANDBY.val());
        return this.list(wrapper);
    }
    @Transactional
    public void maintainLocSts(Task task, Boolean complete) {
        Loc oriLoc = null; Loc destLoc = null;