#
luxiaotao1123
2024-11-21 f3481e45dbca9adac7e95c4f7c6f1bd08d681fc2
#
3个文件已修改
154 ■■■■■ 已修改文件
zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/TaskPosDto.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/TaskPosDto.java
@@ -30,24 +30,27 @@
    }
    public enum PosType {
        MOVE(0),
        ORI_LOC(0),
        ORI_STA(0),
        DEST_LOC(INF),
        DEST_STA(INF),
        TO_CHARGE(INF * 10),
        TO_STANDBY(INF * 10),
        MOVE(0, "MOVE"),
        ORI_LOC(0, "ORIGIN"),
        ORI_STA(0, "ORIGIN"),
        DEST_LOC(INF, "DESTINATION"),
        DEST_STA(INF, "DESTINATION"),
        TO_CHARGE(INF * 10, "TO_CHARGE"),
        TO_STANDBY(INF * 10, "TO_STANDBY"),
        ;
        public int compOffset;
        public String brief;
        PosType(int compOffset) {
        PosType(int compOffset, String brief) {
            this.compOffset = compOffset;
            this.brief = brief;
        }
    }
    public static void packagePosGroup(Map<String, List<TaskPosDto>> groups, Task task, Code code, PosType posType, String sameGroupXy) {
        String key = ("Y".equals(sameGroupXy) ? code.getY() : code.getX()) + posType.toString();
        String key = ("Y".equals(sameGroupXy) ? code.getY() : code.getX()) + posType.brief;
        Long taskId = task == null ? 0L : task.getId();
        TaskPosDto taskPosDto = new TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType);
        taskPosDto.setCodeId(code.getId());
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java
@@ -4,6 +4,7 @@
import com.zy.acs.framework.common.Cools;
import com.zy.acs.manager.common.utils.CommonUtil;
import com.zy.acs.manager.core.domain.Lane;
import com.zy.acs.manager.core.domain.TaskPosDto;
import com.zy.acs.manager.manager.entity.*;
import com.zy.acs.manager.manager.enums.StatusType;
import com.zy.acs.manager.manager.enums.TaskStsType;
@@ -247,4 +248,51 @@
    }
    // The Permutations and combinations for task
    public Double[] pac(Double[] currPosition, List<List<TaskPosDto>> list) {
        List<TaskPosDto> theFirstOne = list.get(0);
        List<TaskPosDto> theLastOne = list.get(list.size() - 1);
        if (list.size() == 1) {
            TaskPosDto head = theFirstOne.get(0);
            TaskPosDto tail = theFirstOne.get(theFirstOne.size() - 1);
            int distanceByHead = CommonUtil.calcDistance(currPosition, head.getXy());
            int distanceByTail = CommonUtil.calcDistance(currPosition, tail.getXy());
            if (distanceByTail < distanceByHead) {
                Collections.reverse(theFirstOne);
            }
        } else {
            TaskPosDto headOfFirst = theFirstOne.get(0);
            TaskPosDto tailOfFirst = theFirstOne.get(theFirstOne.size() - 1);
            TaskPosDto headOfLast = theLastOne.get(0);
            TaskPosDto tailOfLast = theLastOne.get(theLastOne.size() - 1);
            int distanceByHeadOfFirst = CommonUtil.calcDistance(currPosition, headOfFirst.getXy());
            int distanceByTailOfFirst = CommonUtil.calcDistance(currPosition, tailOfFirst.getXy());
            int distanceByHeadOfLast = CommonUtil.calcDistance(currPosition, headOfLast.getXy());
            int distanceByTailOfLast = CommonUtil.calcDistance(currPosition, tailOfLast.getXy());
            if (Math.min(distanceByHeadOfLast, distanceByTailOfLast) < Math.min(distanceByHeadOfFirst, distanceByTailOfFirst)) {
                Collections.reverse(list);
                if (distanceByTailOfLast < distanceByHeadOfLast) {
                    Collections.reverse(theLastOne);
                }
            } else {
                if (distanceByTailOfFirst < distanceByHeadOfFirst) {
                    Collections.reverse(theFirstOne);
                }
            }
        }
        theLastOne = list.get(list.size() - 1);
        return theLastOne.get(theLastOne.size() - 1).getXy();
    }
}
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -350,13 +350,19 @@
            /**
             * 1.Map<String, List<TaskPosDto>> groups
             *
             * key: 1000 + ORI_LOC
             * key: 1000 + ORIGIN
             * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...]
             *
             * key: 3000 + ORI_LOC
             * key: 3000 + ORIGIN
             * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...]
             *
             * key: 2000 + ORI_LOC
             * key: 2000 + ORIGIN
             * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...]
             *
             * key: 1000 + DESTINATION
             * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...]
             *
             * key: 2000 + DESTINATION
             * val: [TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType), TaskPosDto(taskId, new Double[]{code.getX(), code.getY()}, posType),...]
             *
             * ......
@@ -374,6 +380,8 @@
             * 对所有巷道进行有序排序,先是针对List为一个单位,对他们进行FirstWeight排序,相当于表1的key的数值进行有序排序
             *  List<TaskPosDto>: task list on the same lane
             *  ArrayList<List<TaskPosDto>>: all the task list by one agv
             *
             *  tip: ORI 和 DEST 永远不会存在同一个 List
             */
            ArrayList<List<TaskPosDto>> list = new ArrayList<>(groups.values());
            list.sort((o1, o2) -> {
@@ -387,48 +395,35 @@
            }
            // re-order by agv current position
//            Code currCode = codeService.getById(agvDetail.getRecentCode());
//            Double[] currPosition = new Double[] {currCode.getX(), currCode.getY()};
//
//            List<TaskPosDto> theFirstOne = list.get(0);
//            List<TaskPosDto> theLastOne = list.get(list.size() - 1);
//
//            if (list.size() == 1) {
//                TaskPosDto head = theFirstOne.get(0);
//                TaskPosDto tail = theFirstOne.get(theFirstOne.size() - 1);
//
//                int distanceByHead = CommonUtil.calcDistance(currPosition, head.getXy());
//                int distanceByTail = CommonUtil.calcDistance(currPosition, tail.getXy());
//
//                if (distanceByTail < distanceByHead) {
//                    Collections.reverse(theFirstOne);
//                }
//
//            } else {
//                TaskPosDto headOfFirst = theFirstOne.get(0);
//                TaskPosDto tailOfFirst = theFirstOne.get(theFirstOne.size() - 1);
//
//                TaskPosDto headOfLast = theLastOne.get(0);
//                TaskPosDto tailOfLast = theLastOne.get(theLastOne.size() - 1);
//
//                int distanceByHeadOfFirst = CommonUtil.calcDistance(currPosition, headOfFirst.getXy());
//                int distanceByTailOfFirst = CommonUtil.calcDistance(currPosition, tailOfFirst.getXy());
//
//                int distanceByHeadOfLast = CommonUtil.calcDistance(currPosition, headOfLast.getXy());
//                int distanceByTailOfLast = CommonUtil.calcDistance(currPosition, tailOfLast.getXy());
//
//                if (Math.min(distanceByHeadOfLast, distanceByTailOfLast) < Math.min(distanceByHeadOfFirst, distanceByTailOfFirst)) {
//                    Collections.reverse(list);
//
//                    if (distanceByTailOfLast < distanceByHeadOfLast) {
//                        Collections.reverse(theLastOne);
//                    }
//                } else {
//                    if (distanceByTailOfFirst < distanceByHeadOfFirst) {
//                        Collections.reverse(theFirstOne);
//                    }
//                }
//            }
            Code currCode = codeService.getById(agvDetail.getRecentCode());
            Double[] currPosition = new Double[] {currCode.getX(), currCode.getY()};
            List<List<TaskPosDto>> pickGroups = new ArrayList<>();
            List<List<TaskPosDto>> dropGroups = new ArrayList<>();
            for (List<TaskPosDto> group : list) {
                // Assume 一个任务组中所有TaskPosDto的PosType.brief相同
                TaskPosDto.PosType posType = group.get(0).getPosType();
                if (posType == TaskPosDto.PosType.ORI_LOC || posType == TaskPosDto.PosType.ORI_STA) {
                    pickGroups.add(group);
                } else if (posType == TaskPosDto.PosType.DEST_LOC || posType == TaskPosDto.PosType.DEST_STA) {
                    dropGroups.add(group);
                } else {
                    // import tip: the list must only contain ORIGIN and DESTINATION
                    log.error("the list must only contain ORIGIN and DESTINATION");
                }
            }
            currPosition = allocateService.pac(currPosition, pickGroups);
            currPosition = allocateService.pac(currPosition, dropGroups);
            List<List<TaskPosDto>> reorderedList = new ArrayList<>();
            reorderedList.addAll(pickGroups);
            reorderedList.addAll(dropGroups);
            list.clear();
            list.addAll(reorderedList);
            // generate travel
            Travel travel = new Travel();