#
luxiaotao1123
2024-10-28 7b6dabd2ac8b30edf695e0d09c22129c16961f84
#
5个文件已修改
103 ■■■■ 已修改文件
zy-acs-framework/src/main/java/com/zy/acs/framework/common/Cools.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/DispatcherTestController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java 75 ●●●●● 补丁 | 查看 | 原始文档 | 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 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-framework/src/main/java/com/zy/acs/framework/common/Cools.java
@@ -5,10 +5,7 @@
import java.lang.reflect.*;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
/**
 * Created by vincent on 2019-06-09
@@ -365,4 +362,13 @@
        return false;
    }
    public static List<String> getIntersection(List<String> list1, List<String> list2) {
        if (isEmpty(list1) || isEmpty(list2)) {
            return new ArrayList<>();
        }
        List<String> intersection = new ArrayList<>(list1);
        intersection.retainAll(list2);
        return intersection;
    }
}
zy-acs-manager/src/main/java/com/zy/acs/manager/core/DispatcherTestController.java
@@ -25,7 +25,7 @@
    @GetMapping("/lanes")
    public R getLanes() {
        List<Task> taskList = taskService.findTasksByLaneHash("4b81ebaedd8ed7662d37b63e20dec5dd089d4c32136b8826c6323839fe51938e");
        List<Task> taskList = taskService.findRunningTasksByLaneHash("4b81ebaedd8ed7662d37b63e20dec5dd089d4c32136b8826c6323839fe51938e");
        return R.ok().add(laneService.search("00000010"));
    }
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java
@@ -17,6 +17,7 @@
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
 * Created by vincent on 8/12/2024
@@ -67,12 +68,16 @@
        return result;
    }
    /**
     * it can break the limit of the number of agv backpack
     */
    public synchronized Agv execute(Task task) {
        List<Agv> availableAgvList = getAvailableAgv();
        if (Cools.isEmpty(availableAgvList)) {
            log.warn("No available agv to assign the task[{}]", task.getSeqNum());
            return null;
        }
        List<String> availableAgvNos = availableAgvList.stream().map(Agv::getUuid).distinct().collect(Collectors.toList());
        Integer maxAgvCountInLane = configService.getVal("maxAgvCountInLane", Integer.class);
@@ -80,11 +85,63 @@
        Lane originLane = taskService.checkoutOriginLane(task);
        Lane destinationLane = taskService.checkoutDestinationLane(task);
        // allocate about origin
        taskService.findTasksByLaneHash(originLane.getHashCode());
        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) {
                availableAgvNosByOriLane = Cools.getIntersection(agvNosByOriLane, availableAgvNos);
                availableAgvNosByOriLane = availableAgvNosByOriLane.stream().filter(agvNo -> {
                    Agv agv = agvService.selectByUuid(agvNo);
                    return agv.getStatus() == 1;
                }).collect(Collectors.toList());
            }
        }
        // allocate about destination
        taskService.findTasksByLaneHash(destinationLane.getHashCode());
        List<String> availableAgvNosByDestLane = new ArrayList<>(availableAgvNos);
        if (null != destinationLane) {
            List<String> agvNosByDestLane = findAgvNosByLane(destinationLane);
            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());
            }
        }
        // valid
        if (Cools.isEmpty(availableAgvNosByOriLane)) {
            log.warn("No available agv to assign the task origin[{}]", task.getSeqNum());
            return null;
        }
        if (Cools.isEmpty(availableAgvNosByDestLane)) {
            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 null;
        }
        actualAvailableAgvNos.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return 0;
            }
        });
        String s = actualAvailableAgvNos.stream().findFirst().orElse(null);
        /**
         * 1.   判断task的起始点和目的点所在的巷道承载任务数量,
@@ -95,13 +152,25 @@
         *      判断逻辑:背篓数量最少的小车轮询的时候,优先级最高
         */
        task.setOriLaneHash(originLane.getHashCode());
        task.setDestLaneHash(destinationLane.getHashCode());
        return null;
    }
    private List<String> findAgvNosByLane(Lane lane) {
        if (null == lane) {
            return null;
        }
        List<Task> taskList = taskService.findRunningTasksByLaneHash(lane.getHashCode());
        if (Cools.isEmpty(taskList)) {
            return null;
        }
        return taskList.stream().map(task -> {
            return agvService.getById(task.getAgvId()).getUuid();
        }).distinct().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
@@ -30,6 +30,6 @@
    Lane checkoutDestinationLane(Task task);
    List<Task> findTasksByLaneHash(String laneHash);
    List<Task> findRunningTasksByLaneHash(String laneHash);
}
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/TaskServiceImpl.java
@@ -162,11 +162,17 @@
    }
    @Override
    public List<Task> findTasksByLaneHash(String laneHash) {
    public List<Task> findRunningTasksByLaneHash(String laneHash) {
        if (Cools.isEmpty(laneHash)) {
            return new ArrayList<>();
        }
        return this.list(new LambdaQueryWrapper<Task>().eq(Task::getOriLaneHash, laneHash).or().eq(Task::getDestLaneHash, laneHash));
        return this.list(new LambdaQueryWrapper<Task>()
                .in(Task::getTaskSts, TaskStsType.WAITING.val(), TaskStsType.ASSIGN.val(), TaskStsType.PROGRESS.val())
                .and(i -> {
                    i.eq(Task::getOriLaneHash, laneHash).or().eq(Task::getDestLaneHash, laneHash);
                })
        );
    }
    @Transactional