diff --git a/src/main/java/ru/mcs/genealogy/controller/TreeController.java b/src/main/java/ru/mcs/genealogy/controller/TreeController.java index 8e5a265..a686e08 100644 --- a/src/main/java/ru/mcs/genealogy/controller/TreeController.java +++ b/src/main/java/ru/mcs/genealogy/controller/TreeController.java @@ -55,12 +55,25 @@ Person selectedPerson = personService.getPersonById(id).orElseThrow(); List tree = treeService.buildFullTree(selectedPerson); - // Преобразуем дерево в список для отчета + // Преобразуем дерево в список для отчета с указанием отношений List> reportData = new ArrayList<>(); + for (TreeNode node : tree) { Map row = new HashMap<>(); row.put("fullName", node.getPerson().getFullName()); row.put("level", node.getLevel()); + + // Определяем отношение к выбранному человеку + String relationship; + if (node.getLevel() == 0) { + relationship = "Выбранный человек"; + } else if (node.getLevel() < 0) { + relationship = "Предок (" + Math.abs(node.getLevel()) + " поколение)"; + } else { + relationship = "Потомок (" + node.getLevel() + " поколение)"; + } + + row.put("relationship", relationship); reportData.add(row); } @@ -75,7 +88,7 @@ parameters.put("title", "Генеалогическое древо: " + selectedPerson.getFullName()); // Заполняем отчет - JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters); + JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource); // Настраиваем response response.setContentType("application/pdf"); diff --git a/src/main/java/ru/mcs/genealogy/dto/TreeNode.java b/src/main/java/ru/mcs/genealogy/dto/TreeNode.java index cf4f708..7768808 100644 --- a/src/main/java/ru/mcs/genealogy/dto/TreeNode.java +++ b/src/main/java/ru/mcs/genealogy/dto/TreeNode.java @@ -4,7 +4,7 @@ public class TreeNode { private Person person; - private int level; + private int level; // 0 - выбранный человек, отрицательные - предки, положительные - потомки private boolean hasChildren; public TreeNode(Person person, int level, boolean hasChildren) { diff --git a/src/main/java/ru/mcs/genealogy/service/TreeService.java b/src/main/java/ru/mcs/genealogy/service/TreeService.java index 370ba7c..9e34c18 100644 --- a/src/main/java/ru/mcs/genealogy/service/TreeService.java +++ b/src/main/java/ru/mcs/genealogy/service/TreeService.java @@ -10,69 +10,43 @@ @Service public class TreeService { - public List buildAncestorTree(Person person) { - List tree = new ArrayList<>(); - buildAncestorTreeRecursive(person, 0, tree); - return tree; - } - - public List buildDescendantTree(Person person) { - List tree = new ArrayList<>(); - buildDescendantTreeRecursive(person, 0, tree); - return tree; - } - - private void buildAncestorTreeRecursive(Person person, int level, List tree) { - if (person == null) return; - - tree.add(new TreeNode(person, level, person.getAllChildren().size() > 0)); - - if (person.getFather() != null) { - buildAncestorTreeRecursive(person.getFather(), level + 1, tree); - } - - if (person.getMother() != null) { - buildAncestorTreeRecursive(person.getMother(), level + 1, tree); - } - } - - private void buildDescendantTreeRecursive(Person person, int level, List tree) { - if (person == null) return; - - tree.add(new TreeNode(person, level, person.getAllChildren().size() > 0)); - - for (Person child : person.getAllChildren()) { - buildDescendantTreeRecursive(child, level + 1, tree); - } - } - public List buildFullTree(Person person) { List tree = new ArrayList<>(); - // Сначала добавляем предков - Person current = person; - int level = 0; - while (current != null) { - tree.add(0, new TreeNode(current, level, current.getAllChildren().size() > 0)); - current = current.getFather(); - level++; - } + // Добавляем предков (отрицательные уровни) + addAncestors(person, -1, tree); - // Затем добавляем потомков - for (Person child : person.getAllChildren()) { - addDescendantsToTree(child, 1, tree); - } + // Добавляем выбранного человека (уровень 0) + tree.add(new TreeNode(person, 0, !person.getAllChildren().isEmpty())); + + // Добавляем потомков (положительные уровни) + addDescendants(person, 1, tree); return tree; } - private void addDescendantsToTree(Person person, int level, List tree) { + private void addAncestors(Person person, int level, List tree) { if (person == null) return; - tree.add(new TreeNode(person, level, person.getAllChildren().size() > 0)); + // Добавляем отца + if (person.getFather() != null) { + tree.add(0, new TreeNode(person.getFather(), level, !person.getFather().getAllChildren().isEmpty())); + addAncestors(person.getFather(), level - 1, tree); + } + + // Добавляем мать + if (person.getMother() != null) { + tree.add(0, new TreeNode(person.getMother(), level, !person.getMother().getAllChildren().isEmpty())); + addAncestors(person.getMother(), level - 1, tree); + } + } + + private void addDescendants(Person person, int level, List tree) { + if (person == null) return; for (Person child : person.getAllChildren()) { - addDescendantsToTree(child, level + 1, tree); + tree.add(new TreeNode(child, level, !child.getAllChildren().isEmpty())); + addDescendants(child, level + 1, tree); } } } \ No newline at end of file diff --git a/src/main/resources/reports/family-tree.jrxml b/src/main/resources/reports/family-tree.jrxml index 09afc96..3604d45 100644 --- a/src/main/resources/reports/family-tree.jrxml +++ b/src/main/resources/reports/family-tree.jrxml @@ -1,18 +1,37 @@ - - - + + + <band height="50"> <textField> - <reportElement x="0" y="0" width="555" height="30" uuid="853b09ab-20b7-4b16-a8d5-323d262a7d4c"/> - <textFieldExpression><![CDATA["Генеалогическое древо"]]></textFieldExpression> + <reportElement x="0" y="0" width="555" height="30"/> + <textFieldExpression><![CDATA[$P{title}]]></textFieldExpression> </textField> </band> - + + + + + + + + + + - + \ No newline at end of file