Извлечение продукта и всех его потомков с использованием рекурсии в Java - PullRequest
0 голосов
/ 02 ноября 2019

Требование: получить продукт, заданный по имени, и все материалы, необходимые для создания этого продукта.

Дано: таблица MYSQL с именем product_entries со столбцами, такими как id, product_name, количество продукта, имя_ материала, material_quantity.

Итак, для примера, скажем, чтобы построить 1 стол, мне понадобится 4 ножки, 1 нижнее основание, 1 верхнее основание. И в дальнейшем для построения 1 нижней базы мне понадобится несколько bb-part1, bb-part2 и bb-part3 и так далее для верхней базы. Записи выглядят следующим образом:

enter image description here

Итак, если пользователь вводит таблицу в качестве входных данных, он должен получить дерево с таблицей и всеу детей под ним, то есть у стола, будут ноги, нижняя часть основания и верхняя часть основания;нижняя база будет иметь bb-part1, bb-part2 и bb-part3 под ней, а верхняя база будет иметь ub-part1 под ней.

Чтобы добиться этого, я следовал этому post где было дано, как построить дерево с N числом детей. Но проблема, с которой я сталкиваюсь, заключается в том, что мой выход содержит только элементы на уровне 1.

Моя логика выглядит следующим образом:

public void getAllPartsForMaterial(final String partNumber) {

    if (partNumber == null || partNumber.trim().isEmpty()) {
        throw new IllegalArgumentException("Invalid part number received");
    }

    Node<ItemDTO> root = new Node<>(ItemDTO.builder().partNumber(partNumber).build());

    getParts(root, partNumber);
    System.out.println(root.getChildren());
}

private void getParts(Node<ItemDTO> root, final String partNumber) {

    List<Material> materials = materialRepository
        .findAllByProduct(partNumber);

    if(!materials.isEmpty()) {
        materials.forEach(material -> {

            Node<ItemDTO> child = new Node<>(ItemDTO.builder()
                .partNumber(material.getMaterial())
                .quantity(material.getMaterialQuantity())
                .build());

            root.addChild(child);

            getParts(child, material.getMaterial());
        });
    }
}

Таким образом, мой вывод выглядит так:

[Node{data=ItemDTO(partNumber=legs, quantity=4.0)}, Node{data=ItemDTO(partNumber=bottom-base, quantity=1.0)}]

Как добавить все элементы в это дерево, кто-нибудь может сказать, что мне не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...