diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/service/AssignmentService.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/service/AssignmentService.java index 54505dd..6a7e818 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/assignment/service/AssignmentService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/service/AssignmentService.java @@ -30,6 +30,7 @@ import java.time.DayOfWeek; import java.time.LocalDate; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; @Service @@ -248,17 +249,21 @@ public StudentWeeklyStatusResponse getStudentWeeklyStatus( List sessions = curriculumRepository.findByWeek(week); - List dayResponses = new ArrayList<>(); + List sessionDates = sessions.stream() + .map(StudySession::getSessionDate) + .distinct() + .sorted() + .toList(); - for (StudySession session : sessions) { + List dayResponses = new ArrayList<>(); - LocalDate sessionDate = session.getSessionDate(); + for (LocalDate sessionDate : sessionDates) { - String day = - sessionDate.getDayOfWeek().toString(); + String day = sessionDate.getDayOfWeek().toString(); /* * 과제 조회 + * 과제 date를 요일/sessionDate 기준으로 조회하는 기존 방식 유지 */ List assignments = assignmentRepository.findBySessionDate(sessionDate); @@ -293,12 +298,14 @@ public StudentWeeklyStatusResponse getStudentWeeklyStatus( /* * 출석 조회 + * attendance는 attendance_code의 날짜 기준으로 계산하는 기존 방식 유지 */ List attendanceCodes = attendanceCodeRepository.findByAttendanceDate(sessionDate); List attendanceResponses = attendanceCodes.stream() + .sorted(Comparator.comparing(AttendanceCode::getAttendanceOrder)) .map(code -> { Attendance attendance = diff --git a/frontend/src/pages/pirocheck/students/StudentDetail.js b/frontend/src/pages/pirocheck/students/StudentDetail.js index d3e5c17..9c9e825 100644 --- a/frontend/src/pages/pirocheck/students/StudentDetail.js +++ b/frontend/src/pages/pirocheck/students/StudentDetail.js @@ -10,8 +10,8 @@ import Toggle2 from '../../../assets/images/icon_togle2.svg'; const IS_MOCK = false; const dayLabel = { TUESDAY: 'TUE', THURSDAY: 'THU', SATURDAY: 'SAT' }; -const statusOptions = ['SUBMITTED', 'LATE', 'NOT_SUBMITTED']; -const statusLabel = { SUBMITTED: '성공', LATE: '미달', NOT_SUBMITTED: '실패' }; +const statusOptions = ['PENDING', 'SUCCESS', 'INSUFFICIENT', 'FAILURE']; +const statusLabel = { PENDING: '대기', SUCCESS: '성공', INSUFFICIENT: '미달', FAILURE: '실패' }; function WeekBlock({ weekData, onChange }) { const [isOpen, setIsOpen] = useState(false); @@ -134,6 +134,20 @@ function StudentDetail() { [1, 2, 3, 4, 5].map(w => authFetch(`/api/admin/admin/student/${userId}/status/${w}`) .then(r => r.json()) + .then(res => { + const weekData = res.data ?? { week: w, days: [] }; + + const uniqueDays = Array.from( + new Map( + (weekData.days || []).map(day => [day.sessionDate, day]) + ).values() + ).sort((a, b) => new Date(a.sessionDate) - new Date(b.sessionDate)); + + return { + ...weekData, + days: uniqueDays, + }; + }) .catch(() => ({ week: w, days: [] })) ) );