|
17 | 17 | import com.itextpdf.layout.properties.HorizontalAlignment; |
18 | 18 | import com.itextpdf.layout.properties.TextAlignment; |
19 | 19 | import com.itextpdf.layout.properties.UnitValue; |
| 20 | +import com.neeis.neeis.domain.attendance.dto.res.AttendanceFeedbackResDto; |
20 | 21 | import com.neeis.neeis.domain.scoreSummary.dto.res.SubjectScoreDto; |
21 | 22 | import com.neeis.neeis.domain.student.dto.report.*; |
22 | 23 | import lombok.RequiredArgsConstructor; |
|
39 | 40 | import java.io.InputStream; |
40 | 41 | import java.nio.charset.StandardCharsets; |
41 | 42 | import java.time.format.DateTimeFormatter; |
| 43 | +import java.util.List; |
42 | 44 | import java.util.concurrent.atomic.AtomicInteger; |
43 | 45 |
|
44 | 46 | @Service |
@@ -101,6 +103,14 @@ public byte[] generateStudentReportPdf(StudentReportResponseDto report) { |
101 | 103 | addBehaviorSection(document, report.getBehavior(), font, isKorean, sectionNumber.getAndIncrement()); |
102 | 104 | } |
103 | 105 |
|
| 106 | + if (report.getScoreFeedbacks() != null) { |
| 107 | + addScoreFeedbackSection(document, report.getScoreFeedbacks(), font, isKorean, sectionNumber.getAndIncrement()); |
| 108 | + } |
| 109 | + |
| 110 | + if (report.getAttendanceFeedback() != null) { |
| 111 | + addAttendanceFeedbackSection(document, report.getAttendanceFeedback(), font, isKorean, sectionNumber.getAndIncrement()); |
| 112 | + } |
| 113 | + |
104 | 114 | // Document ๋ซ๊ธฐ |
105 | 115 | document.close(); |
106 | 116 | document = null; // null๋ก ์ค์ ํ์ฌ finally์์ ์ค๋ณต close ๋ฐฉ์ง |
@@ -330,7 +340,7 @@ private void addAttendanceSection(Document document, AttendanceReportDto attenda |
330 | 340 | .setBold() |
331 | 341 | .setBackgroundColor(new DeviceRgb(52, 152, 219)) |
332 | 342 | .setFontColor(ColorConstants.WHITE) |
333 | | - .setPadding(10) |
| 343 | + .setPadding(5) |
334 | 344 | .setMarginTop(20) |
335 | 345 | .setMarginBottom(10); |
336 | 346 | document.add(title); |
@@ -375,7 +385,7 @@ private void addGradesSection(Document document, GradesReportDto grades, PdfFont |
375 | 385 | .setBold() |
376 | 386 | .setBackgroundColor(new DeviceRgb(52, 152, 219)) |
377 | 387 | .setFontColor(ColorConstants.WHITE) |
378 | | - .setPadding(10) |
| 388 | + .setPadding(5) |
379 | 389 | .setMarginTop(20) |
380 | 390 | .setMarginBottom(10); |
381 | 391 | document.add(title); |
@@ -569,7 +579,7 @@ private void addCounselingSection(Document document, CounselingReportDto counsel |
569 | 579 | .setBold() |
570 | 580 | .setBackgroundColor(new DeviceRgb(52, 152, 219)) |
571 | 581 | .setFontColor(ColorConstants.WHITE) |
572 | | - .setPadding(10) |
| 582 | + .setPadding(5) |
573 | 583 | .setMarginTop(20) |
574 | 584 | .setMarginBottom(10); |
575 | 585 | document.add(title); |
@@ -774,7 +784,7 @@ private void addBehaviorSection(Document document, BehaviorReportDto behavior, P |
774 | 784 | .setBold() |
775 | 785 | .setBackgroundColor(new DeviceRgb(52, 152, 219)) |
776 | 786 | .setFontColor(ColorConstants.WHITE) |
777 | | - .setPadding(10) |
| 787 | + .setPadding(5) |
778 | 788 | .setMarginTop(20) |
779 | 789 | .setMarginBottom(10); |
780 | 790 | document.add(title); |
@@ -848,6 +858,104 @@ private void addBehaviorBox(Document document, String title, String content, Pdf |
848 | 858 | } |
849 | 859 | } |
850 | 860 |
|
| 861 | + /* |
| 862 | + * ์ฑ์ ํผ๋๋ฐฑ |
| 863 | + * */ |
| 864 | + private void addScoreFeedbackSection(Document document, |
| 865 | + List<SubjectFeedbackDto> feedbacks, |
| 866 | + PdfFont font, boolean isKorean, int sectionNumber) { |
| 867 | + try { |
| 868 | + String sectionTitle = isKorean ? |
| 869 | + sectionNumber + ". ๊ณผ๋ชฉ๋ณ ์ฑ์ ํผ๋๋ฐฑ" : |
| 870 | + sectionNumber + ". Subject Feedback"; |
| 871 | + |
| 872 | + Paragraph title = new Paragraph(sectionTitle) |
| 873 | + .setFont(font) |
| 874 | + .setFontSize(14) |
| 875 | + .setBold() |
| 876 | + .setBackgroundColor(new DeviceRgb(52, 152, 219)) |
| 877 | + .setFontColor(ColorConstants.WHITE) |
| 878 | + .setPadding(5) |
| 879 | + .setMarginTop(20) |
| 880 | + .setMarginBottom(10); |
| 881 | + document.add(title); |
| 882 | + |
| 883 | + if (feedbacks == null || feedbacks.isEmpty()) { |
| 884 | + String noDataText = isKorean ? |
| 885 | + "๋ฑ๋ก๋ ํผ๋๋ฐฑ์ด ์์ต๋๋ค." : |
| 886 | + "No feedback available."; |
| 887 | + document.add(new Paragraph(noDataText).setFont(font).setFontSize(11).setItalic()); |
| 888 | + return; |
| 889 | + } |
| 890 | + |
| 891 | + // ํ
์ด๋ธ: 2์ด (๊ณผ๋ชฉ๋ช
| ํผ๋๋ฐฑ ๋ด์ฉ) |
| 892 | + Table table = new Table(UnitValue.createPercentArray(new float[]{1f, 3f})) |
| 893 | + .useAllAvailableWidth() |
| 894 | + .setMarginBottom(15); |
| 895 | + |
| 896 | + // ํค๋ |
| 897 | + String subjectHeader = isKorean ? "๊ณผ๋ชฉ๋ช
" : "Subject"; |
| 898 | + String feedbackHeader = isKorean ? "ํผ๋๋ฐฑ ๋ด์ฉ" : "Feedback"; |
| 899 | + table.addHeaderCell(createHeaderCell(subjectHeader, font)); |
| 900 | + table.addHeaderCell(createHeaderCell(feedbackHeader, font)); |
| 901 | + |
| 902 | + // ๋ฐ์ดํฐ ํ |
| 903 | + for (SubjectFeedbackDto dto : feedbacks) { |
| 904 | + table.addCell(createDataCell(dto.getSubjectName(), font)); |
| 905 | + String feedbackText = dto.getFeedback(); |
| 906 | + if (feedbackText == null || feedbackText.trim().isEmpty()) { |
| 907 | + feedbackText = "-"; |
| 908 | + } |
| 909 | + table.addCell(createDataCell(feedbackText, font)); |
| 910 | + } |
| 911 | + |
| 912 | + document.add(table); |
| 913 | + |
| 914 | + } catch (Exception e) { |
| 915 | + log.error("๊ณผ๋ชฉ๋ณ ์ฑ์ ํผ๋๋ฐฑ ์น์
์ถ๊ฐ ์คํจ", e); |
| 916 | + } |
| 917 | + } |
| 918 | + |
| 919 | + /* |
| 920 | + * ์ถ๊ฒฐ ํผ๋๋ฐฑ |
| 921 | + * */ |
| 922 | + private void addAttendanceFeedbackSection(Document document, |
| 923 | + AttendanceFeedbackResDto attendanceFeedback, |
| 924 | + PdfFont font, boolean isKorean, int sectionNumber) { |
| 925 | + try { |
| 926 | + String sectionTitle = isKorean ? |
| 927 | + sectionNumber + ". ์ถ๊ฒฐ ํผ๋๋ฐฑ" : |
| 928 | + sectionNumber + ". Attendance Feedback"; |
| 929 | + |
| 930 | + Paragraph title = new Paragraph(sectionTitle) |
| 931 | + .setFont(font) |
| 932 | + .setFontSize(14) |
| 933 | + .setBold() |
| 934 | + .setBackgroundColor(new DeviceRgb(52, 152, 219)) |
| 935 | + .setFontColor(ColorConstants.WHITE) |
| 936 | + .setPadding(5) |
| 937 | + .setMarginTop(20) |
| 938 | + .setMarginBottom(10); |
| 939 | + document.add(title); |
| 940 | + |
| 941 | + if (attendanceFeedback == null || attendanceFeedback.getFeedback() == null || attendanceFeedback.getFeedback().isEmpty()) { |
| 942 | + String noDataText = isKorean ? |
| 943 | + "๋ฑ๋ก๋ ์ถ๊ฒฐ ํผ๋๋ฐฑ์ด ์์ต๋๋ค." : |
| 944 | + "No attendance feedback available."; |
| 945 | + document.add(new Paragraph(noDataText).setFont(font).setFontSize(11).setItalic()); |
| 946 | + return; |
| 947 | + } |
| 948 | + |
| 949 | + // ํผ๋๋ฐฑ ๋ด์ฉ์ ๋ฐ์ค ํํ๋ก ํ์ |
| 950 | + addBehaviorBox(document, |
| 951 | + isKorean ? "์ถ๊ฒฐ ํผ๋๋ฐฑ ๋ด์ฉ" : "Feedback Content", |
| 952 | + attendanceFeedback.getFeedback(), |
| 953 | + font, isKorean); |
| 954 | + |
| 955 | + } catch (Exception e) { |
| 956 | + log.error("์ถ๊ฒฐ ํผ๋๋ฐฑ ์น์
์ถ๊ฐ ์คํจ", e); |
| 957 | + } |
| 958 | + } |
851 | 959 |
|
852 | 960 | private void addTableRow(Table table, String label1, String value1, String label2, String value2, PdfFont font) { |
853 | 961 | table.addCell(createLabelCell(sanitizeText(label1), font)); |
|
0 commit comments