Skip to content

Commit 8cdfc1b

Browse files
authored
[fix] 성적관리 2차 수정
[fix] 성적관리 2차 수정
2 parents 6503972 + b483bba commit 8cdfc1b

File tree

11 files changed

+116
-45
lines changed

11 files changed

+116
-45
lines changed

src/main/java/classfit/example/classfit/calendarCategory/repository/CalendarCategoryRepository.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,20 @@
33
import classfit.example.classfit.calendarCategory.domain.CalendarCategory;
44
import classfit.example.classfit.memberCalendar.domain.CalendarType;
55
import classfit.example.classfit.memberCalendar.domain.MemberCalendar;
6-
import java.util.Collection;
76
import java.util.List;
87
import java.util.Optional;
98
import org.springframework.data.jpa.repository.JpaRepository;
9+
import org.springframework.data.jpa.repository.Query;
1010
import org.springframework.stereotype.Repository;
1111

1212
@Repository
1313
public interface CalendarCategoryRepository extends JpaRepository<CalendarCategory, Long> {
1414
boolean existsByNameAndIdNot(String name, Long id);
1515
List<CalendarCategory> findByMemberCalendar(MemberCalendar memberCalendar);
1616
CalendarCategory findById(Optional<Long> aLong);
17+
18+
@Query("SELECT c FROM CalendarCategory c " +
19+
"WHERE c.memberCalendar.type = :type " +
20+
"AND c.memberCalendar.member.academy.id = :academyId")
21+
List<CalendarCategory> findByMemberCalendarTypeAndAcademyId(CalendarType type, Long academyId);
1722
}

src/main/java/classfit/example/classfit/calendarCategory/service/CalendarCategoryService.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,26 +71,37 @@ private boolean isDuplicateName(String name, Long categoryId) {
7171
@Transactional(readOnly = true)
7272
public CalendarCategoryListResponse getCategories(@AuthMember Member member) {
7373
MemberCalendar personalCalendar = getMemberCalendarByMemberAndType(member, CalendarType.PERSONAL);
74-
MemberCalendar sharedCalendar = getMemberCalendarByMemberAndType(member, CalendarType.SHARED);
75-
7674
List<CalendarCategoryResponse> personalCategories = classifyAndSortCategories(personalCalendar);
77-
List<CalendarCategoryResponse> sharedCategories = classifyAndSortCategories(sharedCalendar);
75+
76+
List<CalendarCategoryResponse> sharedCategories = classifyAndSortSharedCategories(member);
7877

7978
return CalendarCategoryListResponse.of(personalCategories, sharedCategories);
8079
}
8180

8281
private List<CalendarCategoryResponse> classifyAndSortCategories(MemberCalendar memberCalendar) {
83-
List<CalendarCategoryResponse> typeCategories = calendarCategoryRepository.findByMemberCalendar(memberCalendar)
82+
return calendarCategoryRepository.findByMemberCalendar(memberCalendar)
8483
.stream()
8584
.map(category -> CalendarCategoryResponse.of(
8685
category.getId(),
8786
category.getName(),
8887
category.getColor()
8988
))
89+
.sorted(Comparator.comparing(CalendarCategoryResponse::name))
9090
.collect(Collectors.toList());
91+
}
9192

92-
typeCategories.sort(Comparator.comparing(CalendarCategoryResponse::name));
93-
return typeCategories;
93+
private List<CalendarCategoryResponse> classifyAndSortSharedCategories(Member member) {
94+
Long academyId = member.getAcademy().getId();
95+
96+
return calendarCategoryRepository.findByMemberCalendarTypeAndAcademyId(CalendarType.SHARED, academyId)
97+
.stream()
98+
.map(category -> CalendarCategoryResponse.of(
99+
category.getId(),
100+
category.getName(),
101+
category.getColor()
102+
))
103+
.sorted(Comparator.comparing(CalendarCategoryResponse::name))
104+
.collect(Collectors.toList());
94105
}
95106

96107
@Transactional

src/main/java/classfit/example/classfit/classStudent/repository/ClassStudentRepository.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,16 @@ Page<ClassStudent> findAllByMainClassAndSubClass(
4040

4141
List<ClassStudent> findByStudent(Student student);
4242

43-
List<ClassStudent> findBySubClass(SubClass subClass);
43+
@Query("SELECT cs FROM ClassStudent cs " +
44+
"JOIN cs.subClass sc " +
45+
"JOIN sc.mainClass mc " +
46+
"JOIN mc.academy a " +
47+
"WHERE a.id = :academyId " +
48+
"AND sc = :subClass")
49+
List<ClassStudent> findByAcademyIdAndSubClass(@Param("academyId") Long academyId,
50+
@Param("subClass") SubClass subClass);
51+
52+
4453

4554
@Query("SELECT new classfit.example.classfit.scoreReport.dto.response.FindClassStudent(cs.student.id, cs.student.name) " +
4655
"FROM ClassStudent cs " +

src/main/java/classfit/example/classfit/event/repository/EventRepository.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,23 @@ public interface EventRepository extends JpaRepository<Event, Long> {
1717
"WHERE e.memberCalendar.type = :calendarType " +
1818
"AND e.memberCalendar.member = :member " +
1919
"AND e.startDate BETWEEN :startOfMonth AND :endOfMonth")
20-
List<Event> findByCalendarTypeAndStartDateBetween(
20+
List<Event> findByPersonalCalendarTypeAndStartDateBetween(
2121
@Param("calendarType") CalendarType calendarType,
2222
@Param("startOfMonth") LocalDateTime startOfMonth,
2323
@Param("endOfMonth") LocalDateTime endOfMonth,
2424
@Param("member")Member member
2525
);
26+
27+
@Query("SELECT e FROM Event e " +
28+
"WHERE e.memberCalendar.type = :calendarType " +
29+
"AND e.memberCalendar.member.academy.id = :academyId " +
30+
"AND e.startDate BETWEEN :startOfMonth AND :endOfMonth")
31+
List<Event> findBySharedCalendarAndStartDateBetween(
32+
@Param("calendarType") CalendarType calendarType,
33+
@Param("startOfMonth") LocalDateTime startOfMonth,
34+
@Param("endOfMonth") LocalDateTime endOfMonth,
35+
@Param("academyId") Long academyId
36+
);
37+
2638
Optional<Event> findById(long eventId);
2739
}

src/main/java/classfit/example/classfit/event/service/EventGetService.java

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

33
import static classfit.example.classfit.common.exception.ClassfitException.EVENT_NOT_FOUND;
44

5+
import classfit.example.classfit.academy.domain.Academy;
56
import classfit.example.classfit.common.exception.ClassfitException;
67
import classfit.example.classfit.event.domain.Event;
78
import classfit.example.classfit.event.dto.response.EventModalResponse;
@@ -39,7 +40,14 @@ public List<EventMonthlyResponse> getMonthlyEventsByCalendarType(CalendarType ca
3940
LocalDateTime startOfMonth = LocalDateTime.of(year, month, 1, 0, 0, 0, 0);
4041
LocalDateTime endOfMonth = startOfMonth.plusMonths(1).minusSeconds(1);
4142

42-
List<Event> events = eventRepository.findByCalendarTypeAndStartDateBetween(calendarType, startOfMonth, endOfMonth, member);
43+
List<Event> events;
44+
if (calendarType == CalendarType.SHARED) {
45+
Long academyId = member.getAcademy().getId();
46+
events = eventRepository.findBySharedCalendarAndStartDateBetween(calendarType, startOfMonth, endOfMonth, academyId);
47+
} else {
48+
events = eventRepository.findByPersonalCalendarTypeAndStartDateBetween(calendarType, startOfMonth, endOfMonth, member);
49+
}
50+
4351
return mapToEventCreateResponse(events);
4452
}
4553

src/main/java/classfit/example/classfit/scoreReport/domain/ScoreReport.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public class ScoreReport extends BaseEntity {
6262
private Boolean includeAverage;
6363

6464

65+
6566
@Builder
6667
public ScoreReport(SubClass subClass, MainClass mainClass, String reportName, Student student,
6768
String overallOpinion, LocalDate startDate,

src/main/java/classfit/example/classfit/student/service/StudentService.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,26 +51,29 @@ public StudentResponse registerStudent(StudentRequest request) {
5151
classStudent.addSubClass(subClass);
5252
classStudentRepository.save(classStudent);
5353

54-
createAttendanceForThreeWeeks(student);
54+
createAttendanceForSevenWeeks(student);
5555
});
5656

5757
return StudentResponse.from(student);
5858
}
5959

60-
private void createAttendanceForThreeWeeks(Student student) {
60+
private void createAttendanceForSevenWeeks(Student student) {
6161
LocalDate currentDate = LocalDate.now();
62-
LocalDate weekStart = currentDate.with(DayOfWeek.MONDAY);
62+
LocalDate weekStart = currentDate.with(DayOfWeek.MONDAY).minusWeeks(4);
63+
6364
List<ClassStudent> classStudents = classStudentRepository.findByStudent(student);
6465

6566
classStudents.forEach(classStudent -> {
66-
for (int i = 0; i < 3; i++) {
67+
for (int i = 0; i < 7; i++) {
6768
LocalDate weekDate = weekStart.plusWeeks(i);
69+
AttendanceStatus status = (i < 4) ? AttendanceStatus.ABSENT : AttendanceStatus.PRESENT; // 4주 전은 ABSENT, 나머지는 PRESENT
70+
6871
for (int j = 0; j < 7; j++) {
6972
LocalDate attendanceDate = weekDate.plusDays(j);
7073
Attendance attendance = Attendance.builder()
7174
.date(attendanceDate)
7275
.week(j)
73-
.status(AttendanceStatus.PRESENT)
76+
.status(status)
7477
.student(student)
7578
.classStudent(classStudent)
7679
.build();

src/main/java/classfit/example/classfit/studentExam/domain/Exam.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ public class Exam extends BaseEntity {
3535
@Column(name = "exam_id")
3636
private Long id;
3737

38+
@Column(name = "created_by")
39+
private Long createdBy;
40+
3841
@ManyToOne(fetch = FetchType.LAZY)
3942
@JoinColumn(name = "sub_class_id", nullable = false)
4043
private SubClass subClass;
@@ -112,6 +115,6 @@ public void updateHighestScore(Integer highestScore) {
112115
public void updateAverage(Integer newAverage) {
113116
this.average = newAverage.doubleValue();
114117
}
115-
118+
public void updateCreatedBy(Long createdBy) {this.createdBy = createdBy;}
116119

117120
}

src/main/java/classfit/example/classfit/studentExam/domain/ExamRepository.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,32 @@ public interface ExamRepository extends JpaRepository<Exam, Long> {
1313
"JOIN e.mainClass mc " +
1414
"JOIN mc.academy a " +
1515
"JOIN a.members m " +
16-
"WHERE a.name = :academyName " +
16+
"WHERE a.id = :academyId " +
1717
"AND m.name = :memberName")
18-
List<Exam> findByAcademyAndMemberName(@Param("academyName") String academyName,
18+
List<Exam> findByAcademyIdAndMemberName(@Param("academyId") Long academyId,
1919
@Param("memberName") String memberName);
2020

2121

22-
List<Exam> findByExamName(String examName);
22+
@Query("SELECT e FROM Exam e " +
23+
"JOIN e.mainClass mc " +
24+
"JOIN mc.academy a " +
25+
"WHERE a.id = :academyId " +
26+
"AND e.examName = :examName")
27+
List<Exam> findByAcademyIdAndExamName(@Param("academyId") Long academyId,
28+
@Param("examName") String examName);
29+
2330

2431
@Query("SELECT e FROM Exam e WHERE e.mainClass.academy.id = :academyId ORDER BY e.id ASC")
2532
List<Exam> findAllByAcademyId(@Param("academyId") Long academyId);
2633

27-
List<Exam> findByMainClassIdAndSubClassId(Long mainClassId, Long subClassId);
34+
@Query("SELECT e FROM Exam e " +
35+
"JOIN e.mainClass mc " +
36+
"JOIN mc.academy a " +
37+
"WHERE a.id = :academyId " +
38+
"AND mc.id = :mainClassId " +
39+
"AND e.subClass.id = :subClassId")
40+
List<Exam> findByAcademyIdAndMainClassIdAndSubClassId(@Param("academyId") Long academyId,
41+
@Param("mainClassId") Long mainClassId,
42+
@Param("subClassId") Long subClassId);
43+
2844
}

src/main/java/classfit/example/classfit/studentExam/dto/response/FindExamResponse.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,37 @@
55
import classfit.example.classfit.studentExam.domain.Standard;
66
import classfit.example.classfit.member.domain.Member;
77
import java.time.LocalDate;
8-
import java.time.LocalDateTime;
98
import org.springframework.format.annotation.DateTimeFormat;
109

1110
public record FindExamResponse(
1211
Long examId,
1312
ExamPeriod examPeriod,
1413
Long memberId,
15-
String memberName,
1614
Standard standard,
1715
String mainClassName,
1816
String subClassName,
1917
String examName,
20-
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate createdAt
21-
) {
18+
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate examDate,
19+
String createdByName
20+
) {
21+
22+
23+
public static FindExamResponse from(Exam exam, Member findMember) {
24+
Member createdByMember = findMember.getAcademy().getMembers().stream()
25+
.filter(member -> member.getId().equals(exam.getCreatedBy()))
26+
.findFirst()
27+
.orElse(null);
2228

23-
public static FindExamResponse from(Exam exam, Member member) {
2429
return new FindExamResponse(
2530
exam.getId(),
2631
exam.getExamPeriod(),
27-
member.getId(),
28-
member.getName(),
32+
findMember.getId(),
2933
exam.getStandard(),
3034
exam.getMainClass().getMainClassName(),
3135
exam.getSubClass().getSubClassName(),
3236
exam.getExamName(),
33-
convertToLocalDate(exam.getCreatedAt())
37+
exam.getExamDate(),
38+
createdByMember != null ? createdByMember.getName() : "선생님"
3439
);
3540
}
36-
37-
private static LocalDate convertToLocalDate(LocalDateTime dateTime) {
38-
return dateTime.toLocalDate();
39-
}
4041
}

0 commit comments

Comments
 (0)