From b6f1d34e29751a75144193adeb0398393ae419d4 Mon Sep 17 00:00:00 2001 From: GokaPek Date: Sun, 16 Feb 2025 12:49:31 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B5=D0=B9=D0=BD=20=D0=B8=20=D1=84?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BE=D1=82=D1=87=D1=91=D1=82=D0=B0=20=D0=B2=20=D0=BF?= =?UTF-8?q?=D0=B4=D1=84=20=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../unive/schedule/ScheduleApplication.java | 2 + .../schedule/client/GroupServiceClient.java | 27 ++++++ .../schedule/client/TeacherServiceClient.java | 27 ++++++ .../java/edu/unive/schedule/domain/Group.java | 10 +++ .../edu/unive/schedule/domain/Teacher.java | 11 +++ .../service/PdfGenerationService.java | 83 +++++++++++++++---- 6 files changed, 143 insertions(+), 17 deletions(-) create mode 100644 schedule/src/main/java/edu/unive/schedule/client/GroupServiceClient.java create mode 100644 schedule/src/main/java/edu/unive/schedule/client/TeacherServiceClient.java create mode 100644 schedule/src/main/java/edu/unive/schedule/domain/Group.java create mode 100644 schedule/src/main/java/edu/unive/schedule/domain/Teacher.java diff --git a/schedule/src/main/java/edu/unive/schedule/ScheduleApplication.java b/schedule/src/main/java/edu/unive/schedule/ScheduleApplication.java index 5a563da..edb37cf 100644 --- a/schedule/src/main/java/edu/unive/schedule/ScheduleApplication.java +++ b/schedule/src/main/java/edu/unive/schedule/ScheduleApplication.java @@ -2,10 +2,12 @@ package edu.unive.schedule; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.PropertySource; @SpringBootApplication @PropertySource("classpath:application.yml") +@EnableFeignClients public class ScheduleApplication { public static void main(String[] args) { diff --git a/schedule/src/main/java/edu/unive/schedule/client/GroupServiceClient.java b/schedule/src/main/java/edu/unive/schedule/client/GroupServiceClient.java new file mode 100644 index 0000000..1256a7c --- /dev/null +++ b/schedule/src/main/java/edu/unive/schedule/client/GroupServiceClient.java @@ -0,0 +1,27 @@ +package edu.unive.schedule.client; + +import edu.unive.schedule.domain.Group; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@FeignClient(name = "group-service", url = "http://localhost:8281/api/groups") +public interface GroupServiceClient { + + @PostMapping + ResponseEntity createGroup(@RequestBody Group group); + + @GetMapping("/{id}") + ResponseEntity getGroupById(@PathVariable Long id); + + @GetMapping + List getAllGroups(); + + @PutMapping("/{id}") + ResponseEntity updateGroup(@PathVariable Long id, @RequestBody Group group); + + @DeleteMapping("/{id}") + ResponseEntity deleteGroup(@PathVariable Long id); +} diff --git a/schedule/src/main/java/edu/unive/schedule/client/TeacherServiceClient.java b/schedule/src/main/java/edu/unive/schedule/client/TeacherServiceClient.java new file mode 100644 index 0000000..dd2ba18 --- /dev/null +++ b/schedule/src/main/java/edu/unive/schedule/client/TeacherServiceClient.java @@ -0,0 +1,27 @@ +package edu.unive.schedule.client; + +import edu.unive.schedule.domain.Teacher; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@FeignClient(name = "teacher-service", url = "http://localhost:8281/api/teachers") +public interface TeacherServiceClient { + + @PostMapping + ResponseEntity createTeacher(@RequestBody Teacher teacher); + + @GetMapping("/{id}") + ResponseEntity getTeacherById(@PathVariable Long id); + + @GetMapping + List getAllTeachers(); + + @PutMapping("/{id}") + ResponseEntity updateTeacher(@PathVariable Long id, @RequestBody Teacher teacher); + + @DeleteMapping("/{id}") + ResponseEntity deleteTeacher(@PathVariable Long id); +} diff --git a/schedule/src/main/java/edu/unive/schedule/domain/Group.java b/schedule/src/main/java/edu/unive/schedule/domain/Group.java new file mode 100644 index 0000000..93a1b18 --- /dev/null +++ b/schedule/src/main/java/edu/unive/schedule/domain/Group.java @@ -0,0 +1,10 @@ +package edu.unive.schedule.domain; + +import lombok.Data; + +@Data +public class Group { + private Long id; + private String name; + private Long directionId; +} diff --git a/schedule/src/main/java/edu/unive/schedule/domain/Teacher.java b/schedule/src/main/java/edu/unive/schedule/domain/Teacher.java new file mode 100644 index 0000000..5173b7e --- /dev/null +++ b/schedule/src/main/java/edu/unive/schedule/domain/Teacher.java @@ -0,0 +1,11 @@ +package edu.unive.schedule.domain; + +import lombok.Data; + +@Data +public class Teacher { + private Long id; + private String firstName; + private String lastName; + private Long departmentId; +} diff --git a/schedule/src/main/java/edu/unive/schedule/service/PdfGenerationService.java b/schedule/src/main/java/edu/unive/schedule/service/PdfGenerationService.java index 57ec345..8416fca 100644 --- a/schedule/src/main/java/edu/unive/schedule/service/PdfGenerationService.java +++ b/schedule/src/main/java/edu/unive/schedule/service/PdfGenerationService.java @@ -1,5 +1,9 @@ package edu.unive.schedule.service; +import edu.unive.schedule.client.GroupServiceClient; +import edu.unive.schedule.client.TeacherServiceClient; +import edu.unive.schedule.domain.Group; +import edu.unive.schedule.domain.Teacher; import edu.unive.schedule.domain.entity.ScheduleEntity; import edu.unive.schedule.repository.ScheduleRepository; import lombok.RequiredArgsConstructor; @@ -7,23 +11,25 @@ import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDType1Font; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class PdfGenerationService { private final ScheduleRepository scheduleRepository; - - //private final GroupServiceClient groupServiceClient; - - //private final TeacherServiceClient teacherServiceClient; + private final GroupServiceClient groupServiceClient; + private final TeacherServiceClient teacherServiceClient; public byte[] generatePdf(Long groupId) throws IOException { + // Получаем расписания для указанной группы List schedules = scheduleRepository.findByGroupIdsContaining(groupId); try (PDDocument document = new PDDocument()) { @@ -31,44 +37,87 @@ public class PdfGenerationService { document.addPage(page); try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) { + // Настройка шрифта и заголовка contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12); contentStream.beginText(); contentStream.newLineAtOffset(100, 700); contentStream.showText("Group Schedule"); contentStream.endText(); - int yOffset = 650; + int yOffset = 650; // Начальная позиция текста по вертикали + for (ScheduleEntity schedule : schedules) { - // Получаем название группы из внешнего микросервиса - //String groupNames = schedule.getGroupIds().stream() - // .map(groupServiceClient::getGroupById) - // .map(Group::getName) - // .collect(Collectors.joining(", ")); + // Получаем название групп из внешнего микросервиса + String groupNames = fetchGroupNames(schedule.getGroupIds()); // Получаем данные о преподавателе из внешнего микросервиса - //Teacher teacher = teacherServiceClient.getTeacherById(schedule.getTeacherId()); + String teacherName = fetchTeacherName(schedule.getTeacherId()); - String text = String.format("Week %d, %s, Pair %d: %s - %s (Classroom: %s, Teacher: %s, Groups: %s)", + // Формируем текст для PDF + String classroomName = (schedule.getClassroom() != null) ? schedule.getClassroom().getName() : "N/A"; + + String text = String.format( + "Week %d, %s, Pair %d: Course %s - Classroom %s (Teacher: %s, Groups: %s)", schedule.getWeekNumber(), schedule.getDayOfWeek(), schedule.getPairNumber(), schedule.getCourseId(), - schedule.getClassroom().getName()); - //teacher.getName(), - //groupNames); + classroomName, + teacherName, + groupNames + ); + // Выводим текст на страницу PDF contentStream.beginText(); contentStream.newLineAtOffset(100, yOffset); contentStream.showText(text); contentStream.endText(); - yOffset -= 20; + yOffset -= 20; // Смещение следующей строки вниз } } + // Сохраняем документ PDF в ByteArrayOutputStream ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); document.save(byteArrayOutputStream); return byteArrayOutputStream.toByteArray(); } } -} + + /** + * Метод для получения названий групп. + * + * @param groupIds Список ID групп + * @return Строка с названиями групп через запятую или "No Groups" + */ + private String fetchGroupNames(List groupIds) { + if (groupIds == null || groupIds.isEmpty()) { + return "No Groups"; + } + + return groupIds.stream() + .map(groupId -> { + ResponseEntity groupResponse = groupServiceClient.getGroupById(groupId); + Group group = groupResponse.getBody(); + return (group != null) ? group.getName() : "Unknown Group"; + }) + .filter(Objects::nonNull) + .collect(Collectors.joining(", ")); + } + + /** + * Метод для получения имени преподавателя. + * + * @param teacherId ID преподавателя + * @return Имя преподавателя или "Unknown Teacher" + */ + private String fetchTeacherName(Long teacherId) { + if (teacherId == null) { + return "Unknown Teacher"; + } + + ResponseEntity teacherResponse = teacherServiceClient.getTeacherById(teacherId); + Teacher teacher = teacherResponse.getBody(); + return (teacher != null && teacher.getLastName() != null) ? teacher.getLastName() : "Unknown Teacher"; + } +} \ No newline at end of file