jianghaiyue
3 天以前 7dd762215b373851ed313b46bad08cc973816665
algo-zkd/src/main/java/com/algo/service/ExecutingTaskExtractor.java
@@ -106,17 +106,38 @@
     */
    private List<ExecutingTask> extractAgvTasks(AGVStatus agvStatus) {
        List<ExecutingTask> tasks = new ArrayList<>();
        // 检查AGV是否可用
        if (!agvStatus.isAvailable()) {
            return tasks;
        }
        System.out.println("  [调试] 正在提取 AGV " + agvStatus.getAgvId() + " 的任务");
        System.out.println("  [调试] isAvailable: " + agvStatus.isAvailable());
        // 分析背篓状态
        List<BackpackData> backpack = agvStatus.getBackpack();
        if (backpack == null || backpack.isEmpty()) {
            System.out.println("  [调试] AGV " + agvStatus.getAgvId() + " 背篓为空,跳过");
            return tasks;
        }
        // 检查是否有已装载的任务(即使AGV不可用,如果有已装载任务也需要规划路径)
        boolean hasLoadedTasks = false;
        for (BackpackData bp : backpack) {
            if (bp.isLoaded() && bp.getTaskId() != null && !bp.getTaskId().trim().isEmpty()) {
                hasLoadedTasks = true;
                break;
            }
        }
        // 如果AGV不可用且没有已装载任务,跳过
        if (!agvStatus.isAvailable() && !hasLoadedTasks) {
            System.out.println("  [调试] AGV " + agvStatus.getAgvId() + " 不可用且无已装载任务,跳过");
            return tasks;
        }
        // 如果有已装载任务但AGV不可用,记录日志但继续处理
        if (!agvStatus.isAvailable() && hasLoadedTasks) {
            System.out.println("  [调试] AGV " + agvStatus.getAgvId() + " 不可用但有已装载任务,继续提取任务");
        }
        System.out.println("  [调试] AGV " + agvStatus.getAgvId() + " 背篓数量: " + backpack.size());
        // 分别收集已装载和未装载的任务
        List<BackpackData> loadedTasks = new ArrayList<>();
@@ -124,21 +145,39 @@
        for (BackpackData bp : backpack) {
            if (bp.getTaskId() != null && !bp.getTaskId().trim().isEmpty()) {
                System.out.println("  [调试] 发现背篓任务: taskId=" + bp.getTaskId() +
                                 ", loaded=" + bp.isLoaded() + ", index=" + bp.getIndex());
                TaskData taskData = getTaskData(bp.getTaskId());
                if (taskData != null) {
                    System.out.println("  [调试] 成功获取TaskData: " + taskData);
                    if (bp.isLoaded()) {
                        loadedTasks.add(bp);
                    } else {
                        unloadedTasks.add(bp);
                    }
                } else {
                    System.out.println("  [调试] 警告:taskId=" + bp.getTaskId() +
                                     " 在taskDataMap中未找到!");
                    System.out.println("  [调试] taskDataMap包含的key: " + taskDataMap.keySet());
                }
            }
        }
        System.out.println("  [调试] AGV " + agvStatus.getAgvId() +
                         " - 已装载任务: " + loadedTasks.size() +
                         ", 未装载任务: " + unloadedTasks.size());
        // 确定下一步最优行动
        ExecutingTask nextTask = determineNextBestAction(agvStatus, loadedTasks, unloadedTasks);
        if (nextTask != null) {
            System.out.println("  [调试] AGV " + agvStatus.getAgvId() +
                             " 生成任务: " + nextTask.getTaskType() +
                             " " + nextTask.getCurrentPosition() + " -> " + nextTask.getTargetPosition());
            tasks.add(nextTask);
        } else {
            System.out.println("  [调试] AGV " + agvStatus.getAgvId() +
                             " determineNextBestAction返回null");
        }
        return tasks;
@@ -157,28 +196,47 @@
                                                  List<BackpackData> loadedTasks,
                                                  List<BackpackData> unloadedTasks) {
        String currentPosition = agvStatus.getPosition();
        System.out.println("  [调试] determineNextBestAction - AGV " + agvStatus.getAgvId() +
                         " 当前位置: " + currentPosition);
        List<TaskOption> taskOptions = new ArrayList<>();
        // 1. 收集所有可选的送货任务
        System.out.println("  [调试] 处理已装载任务数量: " + loadedTasks.size());
        for (BackpackData task : loadedTasks) {
            TaskData taskData = getTaskData(task.getTaskId());
            if (taskData != null && taskData.getEnd() != null) {
                System.out.println("  [调试] 计算送货距离: " + currentPosition + " -> " + taskData.getEnd());
                double distance = calculateDistance(currentPosition, taskData.getEnd());
                System.out.println("  [调试] 距离计算结果: " + distance);
                if (distance >= 0) {
                    double cost = calculateTaskCost(distance, "delivery", taskData.getPriority(), agvStatus);
                    taskOptions.add(new TaskOption(task, true, distance, cost, "delivery"));
                    System.out.println("  [调试] 添加送货选项,成本: " + cost);
                } else {
                    System.out.println("  [调试] 警告:距离为负,跳过此送货任务");
                }
            } else {
                System.out.println("  [调试] 警告:TaskData或end为null,跳过");
            }
        }
        // 2. 收集所有可选的取货任务
        System.out.println("  [调试] 处理未装载任务数量: " + unloadedTasks.size());
        for (BackpackData task : unloadedTasks) {
            TaskData taskData = getTaskData(task.getTaskId());
            if (taskData != null && taskData.getStart() != null) {
                System.out.println("  [调试] 计算取货距离: " + currentPosition + " -> " + taskData.getStart());
                double distance = calculateDistance(currentPosition, taskData.getStart());
                System.out.println("  [调试] 距离计算结果: " + distance);
                if (distance >= 0) {
                    double cost = calculateTaskCost(distance, "pickup", taskData.getPriority(), agvStatus);
                    taskOptions.add(new TaskOption(task, false, distance, cost, "pickup"));
                    System.out.println("  [调试] 添加取货选项,成本: " + cost);
                } else {
                    System.out.println("  [调试] 警告:距离为负,跳过此取货任务");
                }
            }
        }
@@ -196,7 +254,9 @@
        }
        // 4. 选择成本最低的任务
        System.out.println("  [调试] 总任务选项数量: " + taskOptions.size());
        if (taskOptions.isEmpty()) {
            System.out.println("  [调试] 警告:没有可选任务,返回null");
            return null;
        }
@@ -409,17 +469,33 @@
     */
    private double calculateDistance(String pos1, String pos2) {
        if (pos1 == null || pos2 == null) {
            System.out.println("    [调试] 警告:位置为null: pos1=" + pos1 + ", pos2=" + pos2);
            return -1;
        }
        // 如果位置相同,返回0
        if (pos1.equals(pos2)) {
            System.out.println("    [调试] 位置相同,返回距离0");
            return 0;
        }
        int[] coord1 = JsonUtils.getCoordinate(pos1, pathMapping);
        int[] coord2 = JsonUtils.getCoordinate(pos2, pathMapping);
        if (coord1 == null || coord2 == null) {
            System.out.println("    [调试] 警告:坐标查找失败!");
            System.out.println("      pos1=" + pos1 + " -> coord1=" +
                             (coord1 != null ? "[" + coord1[0] + "," + coord1[1] + "]" : "null"));
            System.out.println("      pos2=" + pos2 + " -> coord2=" +
                             (coord2 != null ? "[" + coord2[0] + "," + coord2[1] + "]" : "null"));
            System.out.println("      pathMapping包含pos1? " + pathMapping.containsKey(pos1));
            System.out.println("      pathMapping包含pos2? " + pathMapping.containsKey(pos2));
            return -1;
        }
        return JsonUtils.calculateManhattanDistance(coord1, coord2);
        double distance = JsonUtils.calculateManhattanDistance(coord1, coord2);
        System.out.println("    [调试] 曼哈顿距离: " + distance + " (" + pos1 + " -> " + pos2 + ")");
        return distance;
    }
    /**