@@ -4,13 +4,12 @@ import gat_be.dev.common.exception.GeneralException
44import gat_be.dev.common.status.ErrorStatus
55import gat_be.dev.domain.review.dto.request.CreateReviewRequest
66import gat_be.dev.domain.review.dto.response.ReviewInfo
7- import gat_be.dev.domain.review.dto.response.ReviewListResponse
87import gat_be.dev.domain.review.entity.Review
98import gat_be.dev.domain.review.entity.ReviewCategory
109import gat_be.dev.domain.review.enums.Category
1110import gat_be.dev.domain.review.repository.ReviewCategoryRepository
1211import gat_be.dev.domain.review.repository.ReviewRepository
13- import gat_be.dev.domain.user.dto.response.UserReviewCategoryCount
12+ import gat_be.dev.domain.user.dto.response.UserReviewCategoryAverage
1413import gat_be.dev.domain.user.dto.response.UserReviewDetails
1514import gat_be.dev.domain.user.entity.User
1615import jakarta.transaction.Transactional
@@ -54,24 +53,35 @@ class ReviewService(
5453
5554 // 유저의 리뷰 카테고리별 개수 집계
5655 fun getUserReviewDetails (user : User ): UserReviewDetails {
56+ // 1. 사용자 리뷰 목록 조회
5757 val reviewList = reviewRepository.findAllWithCategoriesByTeamMemberId(user.userId)
5858
59- val categoryCounts = reviewList
60- .flatMap { it.categories }
61- .groupingBy { it.category }
62- .eachCount()
59+ // 2. 카테고리별 점수 리스트 구성
60+ val categoryScoreMap = mutableMapOf<Category , MutableList <Int >>()
6361
64- val reviewCategoryCount = UserReviewCategoryCount (
65- timePunctuality = categoryCounts[Category .TIME_PUNCTUALITY ] ? : 0 ,
66- communication = categoryCounts[Category .COMMUNICATION ] ? : 0 ,
67- skillAndContribution = categoryCounts[Category .SKILL_AND_CONTRIBUTION ] ? : 0 ,
68- collaborationAndTeamwork = categoryCounts[Category .COLLABORATION_AND_TEAMWORK ] ? : 0
62+ reviewList.flatMap { it.categories }.forEach {
63+ val scores = categoryScoreMap.getOrPut(it.category) { mutableListOf () }
64+ scores.add(it.score)
65+ }
66+
67+ // 3. 카테고리별 평균 점수 계산
68+ val averageScores = categoryScoreMap.mapValues { (_, scores) ->
69+ if (scores.isNotEmpty()) scores.sum().toDouble() / scores.size else 0.0
70+ }
71+
72+ // 4. 평균 점수를 담은 DTO 생성
73+ val reviewCategoryAverage = UserReviewCategoryAverage (
74+ timePunctuality = averageScores[Category .TIME_PUNCTUALITY ] ? : 0.0 ,
75+ communication = averageScores[Category .COMMUNICATION ] ? : 0.0 ,
76+ skillAndContribution = averageScores[Category .SKILL_AND_CONTRIBUTION ] ? : 0.0 ,
77+ collaborationAndTeamwork = averageScores[Category .COLLABORATION_AND_TEAMWORK ] ? : 0.0
6978 )
7079
80+ // 5. 최종 결과 반환
7181 return UserReviewDetails (
7282 rating = user.rating,
7383 reviewCount = reviewList.size.toLong(),
74- reviewCategoryCount = reviewCategoryCount,
84+ reviewCategoryAverage = reviewCategoryAverage
7585 )
7686 }
7787
0 commit comments