Skip to content

Commit b1059ca

Browse files
committed
refactor: 일일업무보고 엑셀 다운로드 코드 개선
1 parent 3fbe4b1 commit b1059ca

6 files changed

Lines changed: 113 additions & 135 deletions

File tree

src/main/java/com/bmilab/backend/domain/report/controller/AdminReportController.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.bmilab.backend.domain.report.controller;
22

33
import com.bmilab.backend.domain.report.dto.response.ReportFindAllResponse;
4+
import com.bmilab.backend.domain.report.service.ReportExcelService;
45
import com.bmilab.backend.domain.report.service.ReportService;
56
import com.bmilab.backend.global.utils.ExcelGenerator;
67
import lombok.RequiredArgsConstructor;
@@ -23,6 +24,7 @@
2324
public class AdminReportController implements AdminReportApi{
2425

2526
private final ReportService reportService;
27+
private final ReportExcelService reportExcelService;
2628

2729
@GetMapping
2830
public ResponseEntity<ReportFindAllResponse> getReportsByAllUser(
@@ -48,7 +50,7 @@ public ResponseEntity<InputStreamResource> createReportExcel(
4850
@RequestParam(required = false) LocalDate endDate
4951
) {
5052

51-
ByteArrayInputStream excel = reportService.getReportExcelFileByPeriodAsBytes(startDate, endDate);
53+
ByteArrayInputStream excel = reportExcelService.getReportExcelFileByPeriodAsBytes(startDate, endDate);
5254
MediaType excelMediaType = MediaType.valueOf(ExcelGenerator.EXCEL_MEDIA_TYPE);
5355

5456
return ResponseEntity.ok()

src/main/java/com/bmilab/backend/domain/report/controller/ReportController.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.bmilab.backend.domain.report.dto.request.ReportRequest;
44
import com.bmilab.backend.domain.report.dto.response.ReportFindAllResponse;
5+
import com.bmilab.backend.domain.report.service.ReportExcelService;
56
import com.bmilab.backend.domain.report.service.ReportService;
67
import com.bmilab.backend.global.security.UserAuthInfo;
78
import com.bmilab.backend.global.utils.ExcelGenerator;
@@ -30,6 +31,7 @@
3031
public class ReportController implements ReportApi {
3132

3233
private final ReportService reportService;
34+
private final ReportExcelService reportExcelService;
3335

3436
@PostMapping
3537
public ResponseEntity<Void> createReport(
@@ -83,7 +85,7 @@ public ResponseEntity<InputStreamResource> getExcelFileByCurrentUser(
8385
@AuthenticationPrincipal UserAuthInfo userAuthInfo
8486
) {
8587

86-
ByteArrayInputStream excel = reportService.getReportExcelFileByUserAsBytes(userAuthInfo.getUserId());
88+
ByteArrayInputStream excel = reportExcelService.getReportExcelFileByUserAsBytes(userAuthInfo.getUserId());
8789
MediaType excelMediaType = MediaType.valueOf(ExcelGenerator.EXCEL_MEDIA_TYPE);
8890

8991
return ResponseEntity.ok()
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package com.bmilab.backend.domain.report.service;
2+
3+
import com.bmilab.backend.domain.file.entity.FileInformation;
4+
import com.bmilab.backend.domain.report.dto.query.GetAllReportsQueryResult;
5+
import com.bmilab.backend.domain.report.entity.Report;
6+
import com.bmilab.backend.domain.report.repository.ReportRepository;
7+
import com.bmilab.backend.global.exception.ApiException;
8+
import com.bmilab.backend.global.utils.ExcelGenerator;
9+
import com.bmilab.backend.global.utils.ExcelRow;
10+
import lombok.RequiredArgsConstructor;
11+
import org.springframework.stereotype.Service;
12+
13+
import java.io.ByteArrayInputStream;
14+
import java.io.File;
15+
import java.io.IOException;
16+
import java.time.LocalDate;
17+
import java.util.List;
18+
19+
@Service
20+
@RequiredArgsConstructor
21+
public class ReportExcelService {
22+
23+
private final ReportRepository reportRepository;
24+
private final ExcelGenerator excelGenerator;
25+
private static final String[] HEADER_TITLES = { "보고 일자", "이름", "이메일", "연구명", "보고 내용", "첨부파일 URL" };
26+
27+
public List<ExcelRow> generateExcelRows(List<GetAllReportsQueryResult> results) {
28+
29+
return results.stream().map((result) -> {
30+
Report report = result.report();
31+
List<FileInformation> files = result.files();
32+
String date = report.getDate().toString();
33+
String userName = report.getUser().getName();
34+
String email = report.getUser().getEmail();
35+
String projectTitle = report.getProject().getTitle();
36+
String content = report.getContent();
37+
List<String> fileUrls = files.stream().map(FileInformation::getUploadUrl).toList();
38+
39+
return ExcelRow.of(date, userName, email, projectTitle, content, String.join("\n", fileUrls));
40+
}).toList();
41+
}
42+
43+
public ByteArrayInputStream getReportExcelFileByDateAsBytes(LocalDate date) {
44+
45+
List<GetAllReportsQueryResult> results = reportRepository.findAllByDateWithFiles(date);
46+
List<ExcelRow> excelRows = generateExcelRows(results);
47+
48+
try {
49+
return excelGenerator.generateBy(HEADER_TITLES, excelRows);
50+
} catch (IOException e) {
51+
e.printStackTrace();
52+
throw new ApiException(e);
53+
}
54+
}
55+
56+
public File getReportExcelFileByDateAsFile(LocalDate date) {
57+
58+
List<GetAllReportsQueryResult> results = reportRepository.findAllByDateWithFiles(date);
59+
List<ExcelRow> excelRows = generateExcelRows(results);
60+
61+
try {
62+
return excelGenerator.generateExcelFile(HEADER_TITLES, excelRows, "bmilab-report_" + date + ".xlsx");
63+
} catch (Exception e) {
64+
e.printStackTrace();
65+
throw new ApiException(e);
66+
}
67+
}
68+
69+
public ByteArrayInputStream getReportExcelFileByUserAsBytes(Long userId) {
70+
71+
List<GetAllReportsQueryResult> results = reportRepository.findAllByUser(userId);
72+
List<ExcelRow> excelRows = generateExcelRows(results);
73+
74+
try {
75+
return excelGenerator.generateBy(HEADER_TITLES, excelRows);
76+
} catch (IOException e) {
77+
e.printStackTrace();
78+
throw new ApiException(e);
79+
}
80+
}
81+
82+
public ByteArrayInputStream getReportExcelFileByPeriodAsBytes(LocalDate startDate, LocalDate endDate) {
83+
84+
List<GetAllReportsQueryResult> results = reportRepository.findReportsByCondition(
85+
null,
86+
null,
87+
startDate,
88+
endDate,
89+
null
90+
);
91+
92+
List<ExcelRow> excelRows = generateExcelRows(results);
93+
94+
try {
95+
return excelGenerator.generateBy(HEADER_TITLES, excelRows);
96+
} catch (IOException e) {
97+
e.printStackTrace();
98+
throw new ApiException(e);
99+
}
100+
}
101+
}

src/main/java/com/bmilab/backend/domain/report/service/ReportSchedulerService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515
@Transactional(readOnly = true)
1616
@RequiredArgsConstructor
1717
public class ReportSchedulerService {
18-
private final ReportService reportService;
18+
private final ReportExcelService reportExcelService;
1919
private final EmailSender emailSender;
2020

2121
@Value("${service.professor-mail-address}")
2222
private String professorMailAddress;
2323

2424
//@Scheduled(cron = "0 0 9 * * MON-FRI", zone = "Asia/Seoul")
25-
@Scheduled(cron = "0 5 21 * * *", zone = "Asia/Seoul")
25+
@Scheduled(cron = "0 43 12 * * *", zone = "Asia/Seoul")
2626
public void sendReportMail() {
2727
//월요일 -> 금요일꺼 나머지는 전날 꺼
2828
LocalDate today = LocalDate.now();
@@ -32,7 +32,7 @@ public void sendReportMail() {
3232
reportDay = today.minusDays(3);
3333
}
3434

35-
File excelFile = reportService.getReportExcelFileByDateAsFile(reportDay);
35+
File excelFile = reportExcelService.getReportExcelFileByDateAsFile(reportDay);
3636
emailSender.sendReportEmailAsync(professorMailAddress, reportDay, excelFile);
3737
}
3838
}

src/main/java/com/bmilab/backend/domain/report/service/ReportService.java

Lines changed: 0 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -138,139 +138,10 @@ public void deleteReport(Long userId, Long reportId) {
138138
reportRepository.delete(report);
139139
}
140140

141-
public ByteArrayInputStream getReportExcelFileByDateAsBytes(LocalDate date) {
142-
143-
List<GetAllReportsQueryResult> results = reportRepository.findAllByDateWithFiles(date);
144-
String[] headerTitles = { "보고 일자", "이름", "이메일", "연구명", "보고 내용", "첨부파일 URL" };
145-
146-
List<ExcelRow> excelRows = results.stream().map((result) -> {
147-
Report report = result.report();
148-
List<FileInformation> files = result.files();
149-
String projectTitle = report.getProject().getTitle();
150-
String userName = report.getUser().getName();
151-
String email = report.getUser().getEmail();
152-
String content = report.getContent();
153-
List<String> fileUrls = files.stream().map(FileInformation::getUploadUrl).toList();
154-
155-
return ExcelRow.of(
156-
date.toString(),
157-
userName,
158-
email,
159-
projectTitle,
160-
content,
161-
String.join("\n", fileUrls)
162-
);
163-
}).toList();
164-
165-
try {
166-
return excelGenerator.generateBy(headerTitles, excelRows);
167-
} catch (IOException e) {
168-
e.printStackTrace();
169-
throw new ApiException(e);
170-
}
171-
}
172-
173-
public File getReportExcelFileByDateAsFile(LocalDate date) {
174-
175-
List<GetAllReportsQueryResult> results = reportRepository.findAllByDateWithFiles(date);
176-
String[] headerTitles = { "보고 일자", "이름", "이메일", "연구명", "보고 내용", "첨부파일 URL" };
177-
178-
List<ExcelRow> excelRows = results.stream().map((result) -> {
179-
Report report = result.report();
180-
List<FileInformation> files = result.files();
181-
String projectTitle = report.getProject().getTitle();
182-
String userName = report.getUser().getName();
183-
String email = report.getUser().getEmail();
184-
String content = report.getContent();
185-
List<String> fileUrls = files.stream().map(FileInformation::getUploadUrl).toList();
186-
187-
return ExcelRow.of(
188-
date.toString(),
189-
userName,
190-
email,
191-
projectTitle,
192-
content,
193-
String.join("\n", fileUrls)
194-
);
195-
}).toList();
196-
197-
try {
198-
return excelGenerator.generateExcelFile(headerTitles, excelRows, "일일업무보고_" + date + ".xlsx");
199-
} catch (Exception e) {
200-
e.printStackTrace();
201-
throw new ApiException(e);
202-
}
203-
}
204-
205141
private void validateUserIsReportAuthor(User user, Report report) {
206142

207143
if (!report.isAuthor(user)) {
208144
throw new ApiException(ReportErrorCode.REPORT_ACCESS_DENIED);
209145
}
210146
}
211-
212-
public ByteArrayInputStream getReportExcelFileByUserAsBytes(Long userId) {
213-
214-
List<GetAllReportsQueryResult> results = reportRepository.findAllByUser(userId);
215-
String[] headerTitles = { "보고 일자", "이름", "이메일", "연구명", "보고 내용", "첨부파일 URL" };
216-
217-
List<ExcelRow> excelRows = results.stream().map((result) -> {
218-
Report report = result.report();
219-
List<FileInformation> files = result.files();
220-
String projectTitle = report.getProject().getTitle();
221-
String userName = report.getUser().getName();
222-
String email = report.getUser().getEmail();
223-
String date = report.getDate().toString();
224-
String content = report.getContent();
225-
List<String> fileUrls = files.stream().map(FileInformation::getUploadUrl).toList();
226-
227-
return ExcelRow.of(
228-
date,
229-
userName,
230-
email,
231-
projectTitle,
232-
content,
233-
String.join("\n", fileUrls)
234-
);
235-
}).toList();
236-
237-
try {
238-
return excelGenerator.generateBy(headerTitles, excelRows);
239-
} catch (IOException e) {
240-
e.printStackTrace();
241-
throw new ApiException(e);
242-
}
243-
}
244-
245-
public ByteArrayInputStream getReportExcelFileByPeriodAsBytes(LocalDate startDate, LocalDate endDate) {
246-
List<GetAllReportsQueryResult> results = reportRepository.findReportsByCondition(null, null, startDate, endDate, null);
247-
String[] headerTitles = { "보고 일자", "이름", "이메일", "연구명", "보고 내용", "첨부파일 URL" };
248-
249-
List<ExcelRow> excelRows = results.stream().map((result) -> {
250-
Report report = result.report();
251-
List<FileInformation> files = result.files();
252-
String projectTitle = report.getProject().getTitle();
253-
String date = report.getDate().toString();
254-
String userName = report.getUser().getName();
255-
String email = report.getUser().getEmail();
256-
String content = report.getContent();
257-
List<String> fileUrls = files.stream().map(FileInformation::getUploadUrl).toList();
258-
259-
return ExcelRow.of(
260-
date,
261-
userName,
262-
email,
263-
projectTitle,
264-
content,
265-
String.join("\n", fileUrls)
266-
);
267-
}).toList();
268-
269-
try {
270-
return excelGenerator.generateBy(headerTitles, excelRows);
271-
} catch (IOException e) {
272-
e.printStackTrace();
273-
throw new ApiException(e);
274-
}
275-
}
276147
}

src/main/java/com/bmilab/backend/global/utils/ExcelGenerator.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import lombok.val;
44
import org.apache.poi.ss.usermodel.CellStyle;
5+
import org.apache.poi.ss.usermodel.FillPatternType;
56
import org.apache.poi.ss.usermodel.Font;
67
import org.apache.poi.ss.usermodel.IndexedColors;
78
import org.apache.poi.xssf.streaming.SXSSFCell;
@@ -63,7 +64,8 @@ private void styleHeaders(SXSSFWorkbook workbook, SXSSFSheet sheet, String[] hea
6364

6465
CellStyle headerCellStyle = workbook.createCellStyle();
6566
headerCellStyle.setFont(headerFont);
66-
headerCellStyle.setFillBackgroundColor(IndexedColors.DARK_BLUE.getIndex());
67+
headerCellStyle.setFillForegroundColor(IndexedColors.DARK_BLUE.getIndex());
68+
headerCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
6769

6870
SXSSFRow headerRow = sheet.createRow(HEADER_ROW);
6971

0 commit comments

Comments
 (0)