@@ -15,13 +15,22 @@ import hs.kr.entrydsm.application.domain.examcode.util.DistanceUtil
1515import kotlinx.coroutines.async
1616import kotlinx.coroutines.coroutineScope
1717
18+ /* *
19+ * 1차 전형에 합격한 학생들에게 수험번호를 부여하는 유스케이스입니다.
20+ *
21+ * @property applicationContract ApplicationAggregate를 가져옵니다.
22+ * @property statusContract StatusAggregate를 업데이트합니다.
23+ * @property kakaoGeocodeContract 카카오 맵 API와 상호작용합니다.
24+ * @property distanceUtil 두 지점 사이의 거리를 구합니다.
25+ * @property baseLocationContract 기준이 되는 장소의 위경도를 가져옵니다.
26+ */
1827@UseCase
1928class GrantExamCodesUseCase (
2029 private val applicationContract : ApplicationContract ,
21- private val statusContract : StatusContract ,
2230 private val kakaoGeocodeContract : KakaoGeocodeContract ,
23- private val distanceUtil : DistanceUtil ,
2431 private val baseLocationContract : BaseLocationContract ,
32+ private val statusContract : StatusContract ,
33+ private val distanceUtil : DistanceUtil ,
2534) : GrantExamCodesContract {
2635
2736 companion object {
@@ -31,6 +40,10 @@ class GrantExamCodesUseCase(
3140 private const val SPECIAL_EXAM_CODE_PREFIX = " 02"
3241 }
3342
43+ /* *
44+ * 1차 전형에 합격한 학생들의 주소와 학교까지의 거리를 계산하고,
45+ * 전형별로 그룹화하여 수험번호를 부여합니다.
46+ */
3447 override suspend fun execute () {
3548 val allFirstRoundPassedApplication = applicationContract.queryAllFirstRoundPassedApplication()
3649 val examCodeInfos = collectDistanceInfo(allFirstRoundPassedApplication)
@@ -46,16 +59,26 @@ class GrantExamCodesUseCase(
4659 saveExamCodes(examCodeInfos)
4760 }
4861
62+ /* *
63+ * 학생들의 주소를 위경도로 변환하고, 학교와의 거리를 계산합니다.
64+ *
65+ * @param applications 1차 전형에 합격한 학생 리스트
66+ * @return 학생들의 접수 코드, 전형 유형, 학교까지의 거리를 담은 리스트
67+ * @throws ExamCodeException.failedGeocodeConversion 주소 변환에 실패했을 경우
68+ */
4969 private suspend fun collectDistanceInfo (applications : List <Application >): List <ExamCodeInfo > = coroutineScope {
5070 applications.map { application ->
5171 async {
5272 val address = application.streetAddress as String
5373 val coordinate = kakaoGeocodeContract.geocode(address)
5474 ? : throw ExamCodeException .failedGeocodeConversion(address)
75+
5576 val baseLat = baseLocationContract.baseLat
5677 val baseLon = baseLocationContract.baseLon
78+
5779 val userLat = coordinate.first
5880 val userLon = coordinate.second
81+
5982 val distance = distanceUtil.haversine(baseLat, baseLon, userLat, userLon)
6083 ExamCodeInfo (
6184 receiptCode = application.receiptCode,
@@ -66,6 +89,12 @@ class GrantExamCodesUseCase(
6689 }.map { it.await() }
6790 }
6891
92+ /* *
93+ * 학생들을 학교까지의 거리를 기준으로 그룹화하고, 그룹 내에서 수험번호를 부여합니다.
94+ *
95+ * @param examCodeInfos 학생들의 정보 리스트
96+ * @param applicationType 전형 유형 (일반, 특별)
97+ */
6998 private fun assignExamCodes (examCodeInfos : List <ExamCodeInfo >, applicationType : String ) {
7099 val sortedByDistance = examCodeInfos.sortedByDescending { it.distance }
71100
@@ -76,6 +105,13 @@ class GrantExamCodesUseCase(
76105 }
77106 }
78107
108+ /* *
109+ * 학생들을 학교까지의 거리가 같은 그룹으로 묶습니다.
110+ *
111+ * @param sortedInfos 거리를 기준으로 내림차순 정렬된 학생 정보 리스트
112+ * @param applicationType 전형 유형
113+ * @return 거리가 같은 학생들끼리 묶인 그룹 리스트
114+ */
79115 private fun createDistanceGroups (sortedInfos : List <ExamCodeInfo >, applicationType : String ): List <DistanceGroup > {
80116 val groups = mutableListOf<DistanceGroup >()
81117 val uniqueDistances = sortedInfos.map { it.distance }.distinct()
@@ -88,6 +124,11 @@ class GrantExamCodesUseCase(
88124 }
89125
90126
127+ /* *
128+ * 같은 거리 그룹 내의 학생들에게 수험번호를 부여합니다.
129+ *
130+ * @param distanceGroup 거리가 같은 학생 그룹
131+ */
91132 private fun assignNumbersInGroup (distanceGroup : DistanceGroup ) {
92133 distanceGroup.examCodeInfoList.forEach { examCodeInfo ->
93134 val receiptCode = String .format(" %03d" , examCodeInfo.receiptCode)
@@ -96,7 +137,11 @@ class GrantExamCodesUseCase(
96137 }
97138 }
98139
99-
140+ /* *
141+ * 부여된 수험번호를 저장합니다.
142+ *
143+ * @param examCodeInfos 수험번호가 부여된 학생 정보 리스트
144+ */
100145 private suspend fun saveExamCodes (examCodeInfos : List <ExamCodeInfo >) {
101146 examCodeInfos.forEach { info ->
102147 info.examCode?.let { examCode ->
0 commit comments