Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
9e890ef
refactor: tr, td 태그 들여쓰기 1 depth 추가
whxogus215 Nov 15, 2024
5caa9be
feat: 타임리프 네임스페이스 추가
whxogus215 Nov 16, 2024
481f958
feat: 모달창 뼈대 구성 및 자세히 버튼 추가
whxogus215 Nov 16, 2024
2b8b0a1
feat: 모달창 클릭 시 열기/닫기 트리거 연결
whxogus215 Nov 16, 2024
688f008
feat: 모달창, 배경 CSS 적용
whxogus215 Nov 16, 2024
e523ab4
refactor: html 파일 이름 첫 글자 소문자로 변경
whxogus215 Nov 16, 2024
4fd11c4
refactor: 각 영역별 이수한 과목 정보가 tbody 단위로 생성되도록 타임리프 수정
whxogus215 Nov 16, 2024
5afc40b
feat: 특정 타입의 상세보기를 눌렀을 때, 해당 타입의 테이블만 표시되도록 구현
whxogus215 Nov 17, 2024
df7c98f
style: 불필요한 줄바꿈 제거
whxogus215 Nov 17, 2024
b5d4bd3
refactor: CompletedCoursesService
gmltn9233 Nov 17, 2024
d16f6b6
Merge pull request #87 from Sejong-Java-Study/fix/CompletedCourse
gmltn9233 Nov 17, 2024
d14fd64
refactor: GonghakCoursesByMajorDto
gmltn9233 Nov 17, 2024
675e790
refactor:GonghakCoursesDao
gmltn9233 Nov 17, 2024
3d3b5d0
refactor: dto 구조 변경
gmltn9233 Nov 17, 2024
26166da
refactor: Test
gmltn9233 Nov 17, 2024
9c816c7
refactor: GonghakCalculateService
gmltn9233 Nov 17, 2024
3b1d3b9
feat: GonghakCalculateServiceTes
gmltn9233 Nov 17, 2024
a68ebde
refactor: StatusController
gmltn9233 Nov 17, 2024
7271830
refactor: tr, td 태그 들여쓰기 1 depth 추가
whxogus215 Nov 15, 2024
81e8fbc
feat: 타임리프 네임스페이스 추가
whxogus215 Nov 16, 2024
1f616c4
feat: 모달창 뼈대 구성 및 자세히 버튼 추가
whxogus215 Nov 16, 2024
915f923
feat: 모달창 클릭 시 열기/닫기 트리거 연결
whxogus215 Nov 16, 2024
8f05527
feat: 모달창, 배경 CSS 적용
whxogus215 Nov 16, 2024
9272c8e
refactor: html 파일 이름 첫 글자 소문자로 변경
whxogus215 Nov 16, 2024
5e854cf
refactor: 각 영역별 이수한 과목 정보가 tbody 단위로 생성되도록 타임리프 수정
whxogus215 Nov 16, 2024
94308d5
feat: 특정 타입의 상세보기를 눌렀을 때, 해당 타입의 테이블만 표시되도록 구현
whxogus215 Nov 17, 2024
118de86
style: 불필요한 줄바꿈 제거
whxogus215 Nov 17, 2024
05213f2
fix: 모달창 컨테이너 크기 고정
whxogus215 Nov 18, 2024
4f1fd15
fix: 이수한 과목의 년도를 불러오도록 수정
whxogus215 Nov 18, 2024
d518299
refactor: layout 템플릿 이름 변경
whxogus215 Nov 18, 2024
abe676e
merge fix
whxogus215 Nov 18, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,12 @@ public void checkUser(UserDomain userDomain) {
}

private Long courseIdToLong(String courseIdAsString) {
if (courseIdAsString.charAt(0) == 'P') {
courseIdAsString = '0' + courseIdAsString.substring(1);
if (!Character.isDigit(courseIdAsString.charAt(0))){
if (courseIdAsString.charAt(0) == 'P'){
courseIdAsString = '0' + courseIdAsString.substring(1);
} else{
return 0L;
}
}
return Long.parseLong(courseIdAsString);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package com.example.gimmegonghakauth.status.controller;

import com.example.gimmegonghakauth.common.constant.AbeekTypeConst;
import com.example.gimmegonghakauth.status.service.dto.AbeekDetailsDto;
import com.example.gimmegonghakauth.status.service.dto.CourseDetailsDto;
import com.example.gimmegonghakauth.status.service.dto.GonghakResultDto;
import com.example.gimmegonghakauth.status.service.dto.ResultPointDto;
import com.example.gimmegonghakauth.user.infrastructure.UserRepository;
import com.example.gimmegonghakauth.user.domain.UserDomain;
import com.example.gimmegonghakauth.status.service.dto.GonghakResultDto.ResultPointDto;
import com.example.gimmegonghakauth.status.service.dto.IncompletedCoursesDto;
import com.example.gimmegonghakauth.status.service.GonghakCalculateService;
import com.example.gimmegonghakauth.status.service.recommend.GonghakRecommendService;
import com.example.gimmegonghakauth.status.service.recommend.RecommendServiceSelectManager;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.Authentication;
Expand Down Expand Up @@ -38,20 +42,42 @@ public String readGonghakStatusResult(Authentication authentication, Model model
// 컨트롤러가 UserDomain 객체를 가져오는 역할을 수행하고 있음.
UserDomain student = userRepository.findByStudentId(studentId).get();

readUserResultRatio(model, student);
readUserResult(model, student);
readUserRecommendCourses(model, studentId, student);
return "gonghak/statusForm";
}

// 사용자의 인증 현황 데이터를 가져온다.
private void readUserResultRatio(Model model, UserDomain student) {
Map<AbeekTypeConst, ResultPointDto> userResultRatio = gonghakCalculateService.getResultRatio(
private void readUserResult(Model model, UserDomain student) {
GonghakResultDto userResultRatio = gonghakCalculateService.getResult(
student)
.get()
.getUserResultRatio();
model.addAttribute("userResultRatio", userResultRatio);
.orElseThrow(IllegalArgumentException::new);
addResultPoint(model, userResultRatio);
addCoursesDetails(model, userResultRatio);
}

private void addResultPoint(Model model, GonghakResultDto result){
Map<AbeekTypeConst, AbeekDetailsDto> userResult = result.getUserResult();
Map<AbeekTypeConst, ResultPointDto> resultPoint = new ConcurrentHashMap<>();
userResult.forEach((abeekTypeConst, abeekDetailsDto) -> {
resultPoint.put(abeekTypeConst, abeekDetailsDto.getResultPoint());
});

model.addAttribute("userResultRatio", resultPoint);
}

private void addCoursesDetails(Model model, GonghakResultDto result){
Map<AbeekTypeConst, AbeekDetailsDto> userResult = result.getUserResult();

Map<AbeekTypeConst, List<CourseDetailsDto>> coursesDetails = new ConcurrentHashMap<>();
userResult.forEach((abeekTypeConst, abeekDetailsDto) -> {
coursesDetails.put(abeekTypeConst, abeekDetailsDto.getCoursesDetails());
});

model.addAttribute("userCourseDetails", coursesDetails);
}


// 사용자의 공학인증 추천 과목을 가져온다.
private void readUserRecommendCourses(Model model, Long studentId, UserDomain student) {
GonghakRecommendService gonghakRecommendService = recommendServiceSelectManager.selectRecommendService(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.example.gimmegonghakauth.common.constant.CourseCategoryConst;
import com.example.gimmegonghakauth.status.domain.GonghakCoursesDomain;
import com.example.gimmegonghakauth.common.domain.MajorsDomain;
import com.example.gimmegonghakauth.status.service.dto.GonghakCoursesByMajorDto;
import com.example.gimmegonghakauth.status.service.dto.CourseDetailsDto;
import com.example.gimmegonghakauth.status.service.dto.IncompletedCoursesDto;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
Expand All @@ -14,10 +14,10 @@
@Repository
public interface GonghakCoursesDao extends JpaRepository<GonghakCoursesDomain,Long> {

@Query("select new com.example.gimmegonghakauth.status.service.dto.GonghakCoursesByMajorDto(GCD.coursesDomain.courseId, GCD.coursesDomain.name, GCD.year, GCD.courseCategory, GCD.passCategory, GCD.designCredit, GCD.coursesDomain.credit) from GonghakCoursesDomain GCD "
@Query("select new com.example.gimmegonghakauth.status.service.dto.CourseDetailsDto(GCD.coursesDomain.courseId, GCD.coursesDomain.name, CCD.year, CCD.semester, GCD.courseCategory, GCD.passCategory, GCD.designCredit, GCD.coursesDomain.credit) from GonghakCoursesDomain GCD "
+ "join CompletedCoursesDomain CCD on GCD.coursesDomain = CCD.coursesDomain "
+ "where CCD.userDomain.studentId =:studentId and GCD.majorsDomain.id = :majorsId and GCD.year = :year")
List<GonghakCoursesByMajorDto> findUserCompletedCourses(@Param("studentId") Long studentId, @Param("majorsId") Long majorId, @Param("year") Long year);
List<CourseDetailsDto> findUserCompletedCourses(@Param("studentId") Long studentId, @Param("majorsId") Long majorId, @Param("year") Long year);

@Query("select new com.example.gimmegonghakauth.status.service.dto.IncompletedCoursesDto(GCD.coursesDomain.name, GCD.courseCategory, GCD.coursesDomain.credit, GCD.designCredit) from GonghakCoursesDomain GCD "
+ "left join CompletedCoursesDomain CCD on CCD.coursesDomain = GCD.coursesDomain "
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import com.example.gimmegonghakauth.common.constant.CourseCategoryConst;
import com.example.gimmegonghakauth.status.domain.AbeekDomain;
import com.example.gimmegonghakauth.common.domain.MajorsDomain;
import com.example.gimmegonghakauth.status.service.dto.GonghakCoursesByMajorDto;
import com.example.gimmegonghakauth.status.service.dto.CourseDetailsDto;
import com.example.gimmegonghakauth.status.service.dto.GonghakStandardDto;
import com.example.gimmegonghakauth.status.service.dto.IncompletedCoursesDto;
import java.util.List;
Expand Down Expand Up @@ -41,7 +41,7 @@ public Optional<GonghakStandardDto> findStandard(MajorsDomain majorsDomain){

// gonghakCourse 중 이수한 과목을 불러온다.
@Override
public List<GonghakCoursesByMajorDto> findUserCompletedCourses(
public List<CourseDetailsDto> findUserCompletedCourses(
Long studentId, MajorsDomain majorsDomain) {
return gonghakCoursesDao.findUserCompletedCourses(studentId,majorsDomain.getId(), studentId/DIVIDER);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.example.gimmegonghakauth.common.constant.CourseCategoryConst;
import com.example.gimmegonghakauth.status.domain.AbeekDomain;
import com.example.gimmegonghakauth.common.domain.MajorsDomain;
import com.example.gimmegonghakauth.status.service.dto.GonghakCoursesByMajorDto;
import com.example.gimmegonghakauth.status.service.dto.CourseDetailsDto;
import com.example.gimmegonghakauth.status.service.dto.GonghakStandardDto;
import com.example.gimmegonghakauth.status.service.dto.IncompletedCoursesDto;
import java.util.List;
Expand All @@ -17,7 +17,7 @@ public interface GonghakRepository {

Optional<GonghakStandardDto> findStandard(MajorsDomain majorsDomain);

List<GonghakCoursesByMajorDto> findUserCompletedCourses(Long studentId, MajorsDomain majorsDomain);
List<CourseDetailsDto> findUserCompletedCourses(Long studentId, MajorsDomain majorsDomain);

List<IncompletedCoursesDto> findUserIncompletedCourses(
CourseCategoryConst courseCategory,Long studentId, MajorsDomain majorsDomain);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@

import com.example.gimmegonghakauth.common.constant.AbeekTypeConst;
import com.example.gimmegonghakauth.status.infrastructure.GonghakRepository;
import com.example.gimmegonghakauth.status.service.dto.GonghakCoursesByMajorDto;
import com.example.gimmegonghakauth.status.service.dto.AbeekDetailsDto;
import com.example.gimmegonghakauth.status.service.dto.CourseDetailsDto;
import com.example.gimmegonghakauth.status.service.dto.GonghakResultDto;
import com.example.gimmegonghakauth.status.service.dto.GonghakResultDto.ResultPointDto;
import com.example.gimmegonghakauth.status.service.dto.GonghakStandardDto;
import com.example.gimmegonghakauth.status.service.dto.ResultPointDto;
import com.example.gimmegonghakauth.user.domain.UserDomain;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
Expand All @@ -23,116 +25,112 @@ public class GonghakCalculateService {
private final GonghakRepository gonghakRepository;

@Transactional(readOnly = true)
public Optional<GonghakResultDto> getResultRatio(UserDomain userDomain) {
public Optional<GonghakResultDto> getResult(UserDomain userDomain) {

// findStandard -> 학번 입학년도를 기준으로 해당 년도의 abeekType(영역별 구분),minCredit(영역별 인증학점) 불러온다.
Optional<GonghakStandardDto> standard = gonghakRepository.findStandard(
userDomain.getMajorsDomain());
userDomain.getMajorsDomain());

// default user abeek 학점 상태 map
Map<AbeekTypeConst, Double> userAbeekCredit = getUserAbeekCreditDefault(
standard.get().getStandards());
Map<AbeekTypeConst, AbeekDetailsDto> userResult = getUserAbeekCreditDefault(
standard.get().getStandards());

// user 공학 상태 테이블
// gonghakCourse 중 이수한 과목을 불러온다.
List<GonghakCoursesByMajorDto> userCoursesByMajorByGonghakCoursesWithCompletedCourses = gonghakRepository.findUserCompletedCourses(
userDomain.getStudentId(), userDomain.getMajorsDomain());
List<CourseDetailsDto> userCompletedCourses = gonghakRepository.findUserCompletedCourses(
userDomain.getStudentId(), userDomain.getMajorsDomain());

// user
// stackUserGonghakCredit -> abeekType에 맞게 이수한 총 학점을 계산한다.
stackUserGonghakCredit(userCoursesByMajorByGonghakCoursesWithCompletedCourses,
userAbeekCredit);

// getUserGonghakResultRatio -> 인증 상태(비율)를 계산한다.
Map<AbeekTypeConst, ResultPointDto> userResultRatio = getUserGonghakResultRatio(
userAbeekCredit, standard);
stackUserGonghakCredit(userCompletedCourses,
userResult);

// 인증 상태(비율) return
return Optional.of(new GonghakResultDto(userResultRatio));
return Optional.of(new GonghakResultDto(userResult));
}


// default user abeek 학점 상태 map을 만들어 반환한다.
private Map<AbeekTypeConst, Double> getUserAbeekCreditDefault(
Map<AbeekTypeConst, Integer> standards) {
Map<AbeekTypeConst, Double> userAbeekCredit = new ConcurrentHashMap<>();
private Map<AbeekTypeConst, AbeekDetailsDto> getUserAbeekCreditDefault(
Map<AbeekTypeConst, Integer> standards) {
Map<AbeekTypeConst, AbeekDetailsDto> userAbeekCredit = new ConcurrentHashMap<>();
Arrays.stream(AbeekTypeConst.values()).forEach(abeekTypeConst -> {
if (standards.containsKey(abeekTypeConst)) {
userAbeekCredit.put(abeekTypeConst, 0.0);
ResultPointDto resultPoint = new ResultPointDto(0.0, standards.get(abeekTypeConst));
AbeekDetailsDto abeekDetailsDto = new AbeekDetailsDto(resultPoint,
new ArrayList<>());
userAbeekCredit.put(abeekTypeConst, abeekDetailsDto);
}
});
return userAbeekCredit;
}

// 인증 상태(비율)를 계산한다.
private Map<AbeekTypeConst, ResultPointDto> getUserGonghakResultRatio(
Map<AbeekTypeConst, Double> userAbeekCredit,
Optional<GonghakStandardDto> standard) {

Map<AbeekTypeConst, ResultPointDto> userResultRatio = new ConcurrentHashMap<>();
Arrays.stream(AbeekTypeConst.values()).forEach(abeekTypeConst -> {
if (userAbeekCredit.containsKey(abeekTypeConst)) {
getRatio(userAbeekCredit, standard, abeekTypeConst, userResultRatio);
}
}
);
return userResultRatio;
}

private void getRatio(Map<AbeekTypeConst, Double> userAbeekCredit,
Optional<GonghakStandardDto> standard, AbeekTypeConst abeekTypeConst,
Map<AbeekTypeConst, ResultPointDto> userResultRatio) {

userResultRatio.put(
abeekTypeConst,
new ResultPointDto(userAbeekCredit.get(abeekTypeConst), standard.get().getStandards()
.get(abeekTypeConst))
);
}

// abeekType에 맞게 이수한 총 학점을 계산한다.
private void stackUserGonghakCredit(
List<GonghakCoursesByMajorDto> userCoursesByMajorByGonghakCoursesWithCompletedCourses,
Map<AbeekTypeConst, Double> userAbeekCredit) {
userCoursesByMajorByGonghakCoursesWithCompletedCourses.forEach(gonghakCoursesByMajorDto -> {
switch (gonghakCoursesByMajorDto.getCourseCategory()) {
case 전공:
stackCredit(AbeekTypeConst.MAJOR, gonghakCoursesByMajorDto, userAbeekCredit);
break;
case 전문교양:
stackCredit(AbeekTypeConst.PROFESSIONAL_NON_MAJOR, gonghakCoursesByMajorDto,
userAbeekCredit);
break;
case 교양:
stackCredit(AbeekTypeConst.NON_MAJOR, gonghakCoursesByMajorDto,
userAbeekCredit);
break;
case MSC:
stackCredit(AbeekTypeConst.MSC, gonghakCoursesByMajorDto, userAbeekCredit);
break;
case BSM:
stackCredit(AbeekTypeConst.BSM, gonghakCoursesByMajorDto, userAbeekCredit);
break;
private void stackUserGonghakCredit(List<CourseDetailsDto> userCoursesByMajor,
Map<AbeekTypeConst, AbeekDetailsDto> userResult) {
userCoursesByMajor.forEach(courseDetailsDto -> {
AbeekTypeConst typeConst = getCourseCategoryType(
String.valueOf(courseDetailsDto.getCourseCategory()));
if (typeConst != null) {
stackCredit(typeConst, courseDetailsDto, userResult);
addCourseToDetails(typeConst, courseDetailsDto, userResult);
}
stackCredit(AbeekTypeConst.DESIGN, gonghakCoursesByMajorDto, userAbeekCredit);
stackCredit(AbeekTypeConst.MINIMUM_CERTI, gonghakCoursesByMajorDto, userAbeekCredit);
stackCredit(AbeekTypeConst.DESIGN, courseDetailsDto, userResult);
addCourseToDetails(AbeekTypeConst.DESIGN, courseDetailsDto, userResult);
stackCredit(AbeekTypeConst.MINIMUM_CERTI, courseDetailsDto, userResult);
addCourseToDetails(AbeekTypeConst.MINIMUM_CERTI, courseDetailsDto, userResult);
});
}

private AbeekTypeConst getCourseCategoryType(String courseCategory) {
switch (courseCategory) {
case "전공":
return AbeekTypeConst.MAJOR;
case "전문교양":
return AbeekTypeConst.PROFESSIONAL_NON_MAJOR;
case "교양":
return AbeekTypeConst.NON_MAJOR;
case "MSC":
return AbeekTypeConst.MSC;
case "BSM":
return AbeekTypeConst.BSM;
default:
return null;
}
}


private void stackCredit(AbeekTypeConst abeekTypeConst,
GonghakCoursesByMajorDto gonghakCoursesByMajorDto,
Map<AbeekTypeConst, Double> userAbeekCredit) {
double inputCredit = getInputCredit(abeekTypeConst, gonghakCoursesByMajorDto);
userAbeekCredit.put(abeekTypeConst, userAbeekCredit.get(abeekTypeConst) + inputCredit);
private void stackCredit(AbeekTypeConst abeekTypeConst, CourseDetailsDto courseDetailsDto,
Map<AbeekTypeConst, AbeekDetailsDto> userResult) {
double inputCredit = getInputCredit(abeekTypeConst, courseDetailsDto);
AbeekDetailsDto currentDetails = userResult.get(abeekTypeConst);
if (currentDetails != null) {
ResultPointDto currentResultPoint = currentDetails.getResultPoint();
double newUserPoint = currentResultPoint.getUserPoint() + inputCredit;

currentResultPoint.setUserPoint(newUserPoint);
}
}


private double getInputCredit(AbeekTypeConst abeekTypeConst,
GonghakCoursesByMajorDto gonghakCoursesByMajorDto) {
if (abeekTypeConst == AbeekTypeConst.DESIGN) {
return gonghakCoursesByMajorDto.getDesignCredit();
} else {
return (double) gonghakCoursesByMajorDto.getCredit();
CourseDetailsDto courseDetailsDto) {
return (abeekTypeConst == AbeekTypeConst.DESIGN) ? courseDetailsDto.getDesignCredit()
: (double) courseDetailsDto.getCredit();
}

private void addCourseToDetails(AbeekTypeConst abeekTypeConst,
CourseDetailsDto courseDetailsDto,
Map<AbeekTypeConst, AbeekDetailsDto> userAbeekCredit) {
if (getInputCredit(abeekTypeConst, courseDetailsDto) == 0) {
return;
}

AbeekDetailsDto currentDetails = userAbeekCredit.get(abeekTypeConst);
if (currentDetails != null) {
List<CourseDetailsDto> updatedCourses = currentDetails.getCoursesDetails();
updatedCourses.add(courseDetailsDto);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.example.gimmegonghakauth.status.service.dto;


import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class AbeekDetailsDto {

private ResultPointDto resultPoint;
private List<CourseDetailsDto> coursesDetails;
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
package com.example.gimmegonghakauth.status.service.dto;

import com.example.gimmegonghakauth.common.constant.CourseCategoryConst;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class GonghakCoursesByMajorDto {
private final Long courseId;
private final String courseName;
private final int year;
private final CourseCategoryConst courseCategory;
private final String passCategory;
private final double designCredit;
private final int credit;
}
package com.example.gimmegonghakauth.status.service.dto;

import com.example.gimmegonghakauth.common.constant.CourseCategoryConst;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class CourseDetailsDto {

private final Long courseId;
private final String courseName;
private final int year;
private final String semester;
private final CourseCategoryConst courseCategory;
private final String passCategory;
private final double designCredit;
private final int credit;
}
Loading