#
vincentlu
2025-03-27 2b91132611788f78ff4d32fd7798ea739cc588e2
#
2个文件已修改
83 ■■■■ 已修改文件
zy-acs-manager/src/main/java/com/zy/acs/manager/core/constant/AgvAreaDispatcher.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/constant/AgvAreaDispatcher.java
@@ -1,6 +1,10 @@
package com.zy.acs.manager.core.constant;
import org.springframework.stereotype.Component;
import com.zy.acs.manager.manager.entity.Loc;
import com.zy.acs.manager.manager.entity.Task;
import com.zy.acs.manager.manager.service.LocService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.List;
@@ -10,11 +14,14 @@
import static com.zy.acs.manager.core.constant.AreaConstant.*;
import static com.zy.acs.manager.core.constant.AreaDisableConstant.*;
@Component
@Service
public class AgvAreaDispatcher {
    public static final Map<String, List<String>> AGV_AREA = new ConcurrentHashMap<>();
    public static final Map<String, List<String>> AGV_DISABLE_AREA = new ConcurrentHashMap<>();
    @Autowired
    private LocService locService;
    @PostConstruct
    public void init() {
@@ -58,4 +65,40 @@
        }
    }
    public List<String> getAgvNosByTask(Task task) {
        if (null == task) {
            return null;
        }
        Loc oriLoc = null;
        Loc destLoc = null;
        if (null != task.getOriLoc()) {
            oriLoc = locService.getById(task.getOriLoc());
            return this.getAgvNosByRow(oriLoc.getRow());
        }
        if (null != task.getDestLoc()) {
            destLoc = locService.getById(task.getDestLoc());
            return this.getAgvNosByRow(destLoc.getRow());
        }
        return null;
    }
    public List<String> getAgvNosByRow(Integer row) {
        if (LocGroupConstant.FAR_LEFT_LOC_ROW_LIST.contains(row)) {
            return AgvGroupConstant.FIRST_AGV_GROUP;
        }
        if (LocGroupConstant.LEFT_LOC_ROW_LIST.contains(row)) {
            return AgvGroupConstant.SECOND_AGV_GROUP;
        }
        if (LocGroupConstant.MIDDLE_LOC_ROW_LIST.contains(row)) {
            return AgvGroupConstant.THIRD_AGV_GROUP;
        }
        if (LocGroupConstant.RIGHT_LOC_ROW_LIST.contains(row)) {
            return AgvGroupConstant.FOURTH_AGV_GROUP;
        }
        if (LocGroupConstant.FAR_RIGHT_LOC_ROW_LIST.contains(row)) {
            return AgvGroupConstant.FIFTH_AGV_GROUP;
        }
        return null;
    }
}
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java
@@ -3,6 +3,7 @@
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.core.constant.AgvAreaDispatcher;
import com.zy.acs.manager.core.domain.Lane;
import com.zy.acs.manager.core.domain.TaskPosDto;
import com.zy.acs.manager.manager.entity.*;
@@ -43,16 +44,27 @@
    private LocService locService;
    @Autowired
    private LaneService laneService;
    @Autowired
    private AgvAreaDispatcher agvAreaDispatcher;
    /**
     * get available agv list which is idle
     */
    private List<Agv> getAvailableAgv() {
        List<Agv> result = new ArrayList<>();
        List<Agv> agvList = agvService.list(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, StatusType.ENABLE.val));
        Collections.shuffle(agvList);
        for (Agv agv : agvList) {
    private List<String> getAvailableAgvNos(List<String> agvNos) {
        List<Agv> agvList = new ArrayList<>();
        if (Cools.isEmpty(agvNos)) {
            agvList = agvService.list(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, StatusType.ENABLE.val));
        } else {
            for (String agvNo : agvNos) {
                Agv agv = agvService.selectByUuid(agvNo);
                if (agv.getStatusBool()) {
                    agvList.add(agv);
                }
            }
        }
        List<String> result = new ArrayList<>();
        for (Agv agv : agvList) {
            // 1. without running tasks
            if (0 < taskService.count(new LambdaQueryWrapper<Task>()
                    .eq(Task::getAgvId, agv.getId())
@@ -63,13 +75,16 @@
            )) {
                continue;
            }
            // 2. in idle status
            if (!agvService.judgeEnable(agv.getId(), true)) {
                continue;
            }
            result.add(agv);
            result.add(agv.getUuid());
        }
        if (!Cools.isEmpty(result)) {
            Collections.shuffle(result);
        }
        return result;
@@ -85,19 +100,16 @@
     *      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)) {
        List<String> availableAgvNos = this.getAvailableAgvNos(agvAreaDispatcher.getAgvNosByTask(task));
        if (Cools.isEmpty(availableAgvNos)) {
//            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);
        // checkout lane
        Lane originLane = taskService.checkoutOriginLane(task);
        Lane destinationLane = taskService.checkoutDestinationLane(task);
        // allocate about origin
        List<String> availableAgvNosByOriLane = new ArrayList<>(availableAgvNos);