Skip to content

Commit

Permalink
refactor: 과제 휴강 고려한 로직 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
kckc0608 committed Oct 16, 2024
1 parent 21909c7 commit cf591e2
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -129,24 +129,19 @@ public List<StudyMentorAttendanceResponse> getAttendanceNumbers(Long studyId) {
public StudyStatisticsResponse getStudyStatistics(Long studyId) {
Member currentMember = memberUtil.getCurrentMember();
Study study = studyRepository.findById(studyId).orElseThrow(() -> new CustomException(STUDY_NOT_FOUND));
List<StudyHistory> studyHistories = studyHistoryRepository.findAllByStudyId(studyId);
List<StudyDetail> studyDetails = studyDetailRepository.findAllByStudyIdOrderByWeekAsc(studyId);
studyValidator.validateStudyMentor(currentMember, study);

List<StudyHistory> studyHistories = studyHistoryRepository.findAllByStudyId(studyId);
long totalStudentCount = studyHistories.size();
long studyCompleteStudentCount =
studyHistories.stream().filter(StudyHistory::isComplete).count();

List<StudyDetail> studyDetails = studyDetailRepository.findAllByStudyIdOrderByWeekAsc(studyId);
long openedWeekCount = studyDetails.stream()
.filter(studyDetail -> studyDetail.getCurriculum().isOpen())
.count();

List<StudyWeekStatisticsResponse> studyWeekStatisticsResponses =
calculateStudyWeekStatistics(studyDetails, totalStudentCount);

long averageAttendanceRate = calculateAverageWeekAttendanceRate(studyWeekStatisticsResponses, openedWeekCount);
long averageAssignmentSubmitRate =
calculateAverageWeekAssignmentSubmitRate(studyWeekStatisticsResponses, openedWeekCount);
long averageAttendanceRate = calculateAverageWeekAttendanceRate(studyWeekStatisticsResponses);
long averageAssignmentSubmitRate = calculateAverageWeekAssignmentSubmitRate(studyWeekStatisticsResponses);

return StudyStatisticsResponse.of(
totalStudentCount,
Expand All @@ -161,52 +156,47 @@ private List<StudyWeekStatisticsResponse> calculateStudyWeekStatistics(

return studyDetails.stream()
.map((studyDetail -> {
if (!studyDetail.getCurriculum().isOpen()) {
return canceledWeekStatisticsFrom(studyDetail.getWeek());
}
boolean isCanceledWeek = !studyDetail.getCurriculum().isOpen();
boolean isCanceledAssignment = !studyDetail.getAssignment().isOpen() | isCanceledWeek;

if (totalStudentCount == 0) {
return openedWeekStatisticsOf(studyDetail.getWeek(), 0L, 0L);
return of(studyDetail.getWeek(), 0L, 0L, isCanceledAssignment, isCanceledWeek);
}

long attendanceCount = attendanceRepository.countByStudyDetailId(studyDetail.getId());
long assignmentCount = assignmentHistoryRepository.countByStudyDetailIdAndSubmissionStatusEquals(
studyDetail.getId(), SUCCESS);

return openedWeekStatisticsOf(
return of(
studyDetail.getWeek(),
Math.round(attendanceCount / (double) totalStudentCount * 100),
Math.round(assignmentCount / (double) totalStudentCount * 100));
isCanceledWeek ? 0 : Math.round(attendanceCount / (double) totalStudentCount * 100),
isCanceledAssignment ? 0 : Math.round(assignmentCount / (double) totalStudentCount * 100),
isCanceledAssignment,
isCanceledWeek);
}))
.toList();
}

private long calculateAverageWeekAttendanceRate(
List<StudyWeekStatisticsResponse> studyWeekStatisticsResponses, long openedWeekCount) {
private long calculateAverageWeekAttendanceRate(List<StudyWeekStatisticsResponse> studyWeekStatisticsResponses) {

if (openedWeekCount == 0) {
return 0;
}
double averageAttendanceRate = studyWeekStatisticsResponses.stream()
.filter(weekStatisticsResponse -> !weekStatisticsResponse.isCanceledWeek())
.mapToLong(StudyWeekStatisticsResponse::attendanceRate)
.average()
.orElse(0);

long attendanceRateSum = studyWeekStatisticsResponses.stream()
.mapToLong(weekStatistics -> weekStatistics.isCanceledWeek() ? 0 : weekStatistics.attendanceRate())
.sum();

return Math.round(attendanceRateSum / (double) openedWeekCount);
return Math.round(averageAttendanceRate);
}

private long calculateAverageWeekAssignmentSubmitRate(
List<StudyWeekStatisticsResponse> studyWeekStatisticsResponses, long openedWeekCount) {

if (openedWeekCount == 0) {
return 0;
}
List<StudyWeekStatisticsResponse> studyWeekStatisticsResponses) {

long assignmentSubmitRateSum = studyWeekStatisticsResponses.stream()
.mapToLong(
weekStatistics -> weekStatistics.isCanceledWeek() ? 0 : weekStatistics.assignmentSubmitRate())
.sum();
double averageAssignmentSubmitRate = studyWeekStatisticsResponses.stream()
.filter(studyWeekStatistics -> !studyWeekStatistics.isCanceledAssignment())
.mapToLong(StudyWeekStatisticsResponse::assignmentSubmitRate)
.average()
.orElse(0);

return Math.round(assignmentSubmitRateSum / (double) openedWeekCount);
return Math.round(averageAssignmentSubmitRate);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,16 @@ public record StudyWeekStatisticsResponse(
@Schema(description = "스터디 주차") Long week,
@Schema(description = "출석률") Long attendanceRate,
@Schema(description = "과제 제출률") Long assignmentSubmitRate,
@Schema(description = "휴강 여부") boolean isCanceledWeek) {
@Schema(description = "과제 휴강 여부") boolean isCanceledAssignment,
@Schema(description = "스터디 휴강 여부") boolean isCanceledWeek) {

public static StudyWeekStatisticsResponse openedWeekStatisticsOf(
Long studyWeek, Long attendanceRate, Long assignmentSubmitRate) {
return new StudyWeekStatisticsResponse(studyWeek, attendanceRate, assignmentSubmitRate, false);
}

public static StudyWeekStatisticsResponse canceledWeekStatisticsFrom(Long studyWeek) {
return new StudyWeekStatisticsResponse(studyWeek, 0L, 0L, true);
public static StudyWeekStatisticsResponse of(
Long studyWeek,
Long attendanceRate,
Long assignmentSubmitRate,
boolean isCanceledAssignment,
boolean isCanceledWeek) {
return new StudyWeekStatisticsResponse(
studyWeek, attendanceRate, assignmentSubmitRate, isCanceledAssignment, isCanceledWeek);
}
}

0 comments on commit cf591e2

Please sign in to comment.