Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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 @@ -27,7 +27,6 @@ public class GraduationCertCriteriaService {
private final GraduationCertRuleRepository graduationCertRuleRepository;
private final CodingCertCriterionRepository codingCertCriterionRepository;
private final GraduationDepartmentInfoRepository departmentInfoRepository;
private final ClassicCertCriterionRepository classicCertCriterionRepository;
private final EnglishCertCriterionRepository englishCertCriterionRepository;


Expand All @@ -49,11 +48,11 @@ public GraduationCertCriteriaResponse getGraduationCertCriteria(Long userId) {
GraduationCertPolicyResponse certPolicy =
buildCertPolicy(graduationCertRule.getGraduationCertRuleType(), englishTargetType, codingTargetType);
EnglishCertCriteriaResponse englishCriteria = buildEnglishCriteria(admissionYear, englishTargetType);
ClassicCertCriteriaResponse classicCriteria = buildClassicCriteria(admissionYear);
ClassicCertCriteriaResponse classicCriteria = buildClassicCriteria();
CodingCertCriteriaResponse codingCriteria = buildCodingCriteria(admissionYear, codingTargetType);

return GraduationCertCriteriaResponse.of(criteriaTarget, certPolicy, englishCriteria, classicCriteria,
codingCriteria);
return GraduationCertCriteriaResponse.of(criteriaTarget, certPolicy, englishCriteria,
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아래 사진에서 사용되는 부분이 해당 졸업인증 기준 데이터 조회 API 응답의 고전독서 부분에서 가져오는 걸로 알고 있는데요!
따라서, 고전독서 기준데이터를 내려주는 건 필요하다고 생각합니다!
기존 DB에서 가져와서 응답을 만드는 로직에서 ENUM 활용 로직으로 충분히 내려줄 수 있지 안을까용? 어떻게 생각하시는지 궁금합니다!

Image

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

헉 왜 response 필드도 지웠지
꼼꼼히 확인해주셔서 감사합니다!! 한번 더 물어보길 잘햇다

classicCriteria, codingCriteria);
}

private GraduationDepartmentInfo findDepartment(int admissionYear, String deptCd) {
Expand Down Expand Up @@ -151,17 +150,8 @@ private EnglishCertCriteriaResponse buildEnglishCriteria(int admissionYear, Engl
);
}

private ClassicCertCriteriaResponse buildClassicCriteria(int admissionYear) {
ClassicCertCriterion classicCertCriterion = classicCertCriterionRepository.findByAdmissionYear(admissionYear)
.orElseThrow(() -> new AllcllException(AllcllErrorCode.CLASSIC_CERT_CRITERIA_NOT_FOUND));

return ClassicCertCriteriaResponse.of(
classicCertCriterion.getTotalRequiredCount(),
classicCertCriterion.getRequiredCountWestern(),
classicCertCriterion.getRequiredCountEastern(),
classicCertCriterion.getRequiredCountEasternAndWestern(),
classicCertCriterion.getRequiredCountScience()
);
private ClassicCertCriteriaResponse buildClassicCriteria() {
return ClassicCertCriteriaResponse.fromEnum();
}

private CodingCertCriteriaResponse buildCodingCriteria(int admissionYear, CodingTargetType codingTargetType) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package kr.allcll.backend.domain.graduation.certification.dto;

import kr.allcll.backend.domain.graduation.check.cert.ClassicsArea;

public record ClassicCertCriteriaResponse(
Integer totalRequiredCount,
Integer requiredCountWestern,
Expand All @@ -23,4 +25,14 @@ public static ClassicCertCriteriaResponse of(
requiredCountScience
);
}

public static ClassicCertCriteriaResponse fromEnum() {
return new ClassicCertCriteriaResponse(
ClassicsArea.getTotalRequiredCount(),
ClassicsArea.WESTERN.getMaxRecognizedCount(),
ClassicsArea.EASTERN.getMaxRecognizedCount(),
ClassicsArea.EASTERN_AND_WESTERN.getMaxRecognizedCount(),
ClassicsArea.SCIENCE.getMaxRecognizedCount()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package kr.allcll.backend.domain.graduation.check.cert;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.util.Arrays;
import java.util.Optional;

@Getter
@RequiredArgsConstructor
public enum ClassicsArea {
WESTERN("서양의 역사와 사상", 4),
EASTERN("동양의 역사와 사상", 2),
EASTERN_AND_WESTERN("동·서양의 문학", 3),
SCIENCE("과학 사상", 1);
Comment on lines +12 to +15
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Derive recognized-count caps from criteria instead of constants

Avoid hard-coding per-area caps here, because this commit now truncates fetched counts to 4/2/3/1 before GraduationCertService evaluates completion against admission-year criteria loaded from DB (GraduationCertService#createOrUpdate), and those criteria are synced from sheet data (AdminGraduationSyncService#syncClassicCertCriteria). If any year’s required counts change (e.g., western > 4), affected students will be permanently undercounted and may be marked as not satisfied even when the source system reports enough books.

Useful? React with 👍 / 👎.


private final String koreanName;
private final int maxRecognizedCount;

public static Optional<ClassicsArea> findByLabel(String label) {
return Arrays.stream(values())
.filter(area -> label.contains(area.koreanName))
.findFirst();
}

public static int getTotalRequiredCount() {
return Arrays.stream(values())
.mapToInt(ClassicsArea::getMaxRecognizedCount)
.sum();
}

public int getRecognizedCount(int actualCount) {
return Math.min(actualCount, maxRecognizedCount);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package kr.allcll.backend.domain.graduation.check.cert;

import jakarta.persistence.EntityManager;
import kr.allcll.backend.domain.graduation.certification.ClassicCertCriterion;
import kr.allcll.backend.domain.graduation.certification.ClassicCertCriterionRepository;
import kr.allcll.backend.domain.graduation.certification.GraduationCertRule;
import kr.allcll.backend.domain.graduation.certification.GraduationCertRuleRepository;
import kr.allcll.backend.domain.graduation.certification.GraduationCertRuleType;
Expand All @@ -21,7 +19,6 @@ public class GraduationCertService {

private final EntityManager entityManager;
private final GraduationCertRuleRepository graduationCertRuleRepository;
private final ClassicCertCriterionRepository classicCertCriterionRepository;
private final GraduationCheckCertResultRepository graduationCheckCertResultRepository;

@Transactional
Expand All @@ -39,17 +36,12 @@ public void createOrUpdate(User user, GraduationCertInfo certInfo) {
int requiredPassCount = certRuleType.getRequiredPassCount();
boolean isSatisfied = certRuleType.isSatisfied(passedCount);

// 고전독서 기준 데이터 DB에서 조회
ClassicCertCriterion classicCriteria = classicCertCriterionRepository
.findByAdmissionYear(user.getAdmissionYear())
.orElseThrow(
() -> new AllcllException(AllcllErrorCode.GRADUATION_CERT_RULE_NOT_FOUND, user.getAdmissionYear()));

int requiredCountWestern = classicCriteria.getRequiredCountWestern();
int requiredCountEastern = classicCriteria.getRequiredCountEastern();
int requiredCountEasternAndWestern = classicCriteria.getRequiredCountEasternAndWestern();
int requiredCountScience = classicCriteria.getRequiredCountScience();
int classicsTotalRequiredCount = classicCriteria.getTotalRequiredCount();
// 고전독서 기준 데이터 enum에서 조회
int classicsTotalRequiredCount = ClassicsArea.getTotalRequiredCount();
int requiredCountWestern = ClassicsArea.WESTERN.getMaxRecognizedCount();
int requiredCountEastern = ClassicsArea.EASTERN.getMaxRecognizedCount();
int requiredCountEasternAndWestern = ClassicsArea.EASTERN_AND_WESTERN.getMaxRecognizedCount();
int requiredCountScience = ClassicsArea.SCIENCE.getMaxRecognizedCount();

boolean isWesternSatisfied = certInfo.myCountWestern() >= requiredCountWestern;
boolean isEasternSatisfied = certInfo.myCountEastern() >= requiredCountEastern;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
import org.jsoup.select.Elements;
import org.springframework.stereotype.Service;

import java.util.EnumMap;
import java.util.Map;

@Service
@RequiredArgsConstructor
public class GraduationClassicsCertFetcher {
Expand Down Expand Up @@ -46,10 +49,7 @@ private ClassicsCounts parseCounts(Document document) {
throw new AllcllException(AllcllErrorCode.CLASSIC_DETAIL_INFO_FETCH_FAIL);
}

int westernCompleted = 0;
int easternCompleted = 0;
int literatureCompleted = 0;
int scienceCompleted = 0;
Map<ClassicsArea, Integer> countMap = new EnumMap<>(ClassicsArea.class);

for (Element row : table.select("tbody tr")) {
Element th = row.selectFirst("th");
Expand All @@ -61,28 +61,24 @@ private ClassicsCounts parseCounts(Document document) {
Elements tds = row.select("td");
if (tds.isEmpty()) continue;

int completedCount = extractCount(tds.get(0));

if (label.contains("서양의 역사와 사상")) {
westernCompleted = completedCount;
}
else if (label.contains("동양의 역사와 사상")) {
easternCompleted = completedCount;
}
else if (label.contains("동·서양의 문학")) {
literatureCompleted = completedCount;
}
else if (label.contains("과학 사상")) {
scienceCompleted = completedCount;
}
ClassicsArea.findByLabel(label).ifPresent(area -> {
int actualCount = extractCompletedCount(tds.getFirst());
countMap.put(area, actualCount);
});
}

return new ClassicsCounts(westernCompleted, easternCompleted, literatureCompleted, scienceCompleted);
return new ClassicsCounts(
countMap.getOrDefault(ClassicsArea.WESTERN, 0),
countMap.getOrDefault(ClassicsArea.EASTERN, 0),
countMap.getOrDefault(ClassicsArea.EASTERN_AND_WESTERN, 0),
countMap.getOrDefault(ClassicsArea.SCIENCE, 0)
);
}

private int extractCount(Element value) {
private int extractCompletedCount(Element value) {
try {
return Integer.parseInt(value.text().replace("권", "").trim());
String text = value.text().replace("권", "").trim();
return Integer.parseInt(text);
} catch (NumberFormatException e) {
return 0;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package kr.allcll.backend.domain.graduation.check.cert.dto;

import kr.allcll.backend.domain.graduation.check.cert.ClassicsArea;
import kr.allcll.backend.domain.graduation.check.cert.GraduationCheckCertResult;

public record ClassicsCounts(
Expand All @@ -10,7 +11,10 @@ public record ClassicsCounts(
) {

public int totalMyCount() {
return myCountWestern + myCountEastern + myCountEasternAndWestern + myCountScience;
return ClassicsArea.WESTERN.getRecognizedCount(myCountWestern)
+ ClassicsArea.EASTERN.getRecognizedCount(myCountEastern)
+ ClassicsArea.EASTERN_AND_WESTERN.getRecognizedCount(myCountEasternAndWestern)
+ ClassicsArea.SCIENCE.getRecognizedCount(myCountScience);
}

public static ClassicsCounts fallback(GraduationCheckCertResult certResult) {
Expand Down
Loading
Loading