diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/ad/AdminAdStatisticsRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/ad/AdminAdStatisticsRepository.kt index 143777b..750a3ab 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/ad/AdminAdStatisticsRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/ad/AdminAdStatisticsRepository.kt @@ -13,10 +13,17 @@ import java.time.LocalDateTime @Repository class AdminAdStatisticsRepository(private val queryFactory: JPAQueryFactory) { - fun getAdStatisticsDataTotalCount(): Int { + fun getAdStatisticsDataTotalCount( + startDate: LocalDateTime, + endDate: LocalDateTime + ): Int { return queryFactory .select(adTrackingHistory.id.pid) .from(adTrackingHistory) + .where( + adTrackingHistory.id.createdAt.goe(startDate), + adTrackingHistory.id.createdAt.loe(endDate) + ) .groupBy( getFormattedDate(adTrackingHistory.id.createdAt), adTrackingHistory.mediaGroup, @@ -115,6 +122,7 @@ class AdminAdStatisticsRepository(private val queryFactory: JPAQueryFactory) { adTrackingHistory.id.pid, adTrackingHistory.pidName ) + .orderBy(getFormattedDate(adTrackingHistory.id.createdAt).desc()) .offset(offset) .limit(limit) .fetch() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/ad/AdminAdStatisticsService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/ad/AdminAdStatisticsService.kt index 511a5a4..8ec2f5f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/ad/AdminAdStatisticsService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/ad/AdminAdStatisticsService.kt @@ -16,7 +16,7 @@ class AdminAdStatisticsService( val startDate = startDateStr.convertLocalDateTime() val endDate = endDateStr.convertLocalDateTime(hour = 23, minute = 59, second = 59) - val totalCount = repository.getAdStatisticsDataTotalCount() + val totalCount = repository.getAdStatisticsDataTotalCount(startDate, endDate) val items = repository.getAdStatisticsDataList(startDate, endDate, offset, limit) return GetAdminAdStatisticsResponse( diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/AdminMemberStatisticsRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/AdminMemberStatisticsRepository.kt index 25c69fc..1333993 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/AdminMemberStatisticsRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/AdminMemberStatisticsRepository.kt @@ -80,6 +80,7 @@ class AdminMemberStatisticsRepository(private val queryFactory: JPAQueryFactory) member.createdAt.loe(endDate) ) .groupBy(getFormattedDate(member.createdAt)) + .orderBy(getFormattedDate(member.createdAt).desc()) .offset(offset) .limit(limit) .fetch() @@ -104,6 +105,7 @@ class AdminMemberStatisticsRepository(private val queryFactory: JPAQueryFactory) signOut.createdAt.loe(endDate) ) .groupBy(getFormattedDate(signOut.createdAt)) + .orderBy(getFormattedDate(signOut.createdAt).desc()) .offset(offset) .limit(limit) .fetch() @@ -132,6 +134,7 @@ class AdminMemberStatisticsRepository(private val queryFactory: JPAQueryFactory) charge.createdAt.loe(endDate) ) .groupBy(getFormattedDate(charge.createdAt)) + .orderBy(getFormattedDate(charge.createdAt).desc()) .offset(offset) .limit(limit) .fetch() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/AdminMemberStatisticsService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/AdminMemberStatisticsService.kt index 754a013..2024110 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/AdminMemberStatisticsService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/AdminMemberStatisticsService.kt @@ -4,6 +4,7 @@ import kr.co.vividnext.sodalive.common.SodaException import org.springframework.data.domain.Pageable import org.springframework.stereotype.Service import java.time.LocalDate +import java.time.LocalDateTime import java.time.LocalTime import java.time.ZoneId import java.time.format.DateTimeFormatter @@ -16,9 +17,16 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics endDateStr: String, pageable: Pageable ): GetMemberStatisticsResponse { + val startDate = LocalDate.parse(startDateStr) + val endDate = LocalDate.parse(endDateStr) + val now = LocalDateTime.now() + .atZone(ZoneId.of("UTC")) + .withZoneSameInstant(ZoneId.of("Asia/Seoul")) + .toLocalDate() + val dateRange = getPagedDateRange( - startDate = startDateStr, - endDate = endDateStr, + startDate = startDate, + endDate = endDate.coerceAtMost(now), page = pageable.pageNumber + 1, pageSize = pageable.pageSize ) @@ -27,47 +35,47 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics throw SodaException("잘못된 접근입니다.") } - var startDate = LocalDate.parse(startDateStr).atStartOfDay() + var startDateTime = startDate.atStartOfDay() .atZone(ZoneId.of("Asia/Seoul")) .withZoneSameInstant(ZoneId.of("UTC")) .toLocalDateTime() - var endDate = LocalDate.parse(endDateStr).atTime(LocalTime.MAX) + var endDateTime = endDate.atTime(LocalTime.MAX) .atZone(ZoneId.of("Asia/Seoul")) .withZoneSameInstant(ZoneId.of("UTC")) .toLocalDateTime() - val totalSignUpCount = repository.getTotalSignUpCount(startDate = startDate, endDate = endDate) - val totalSignOutCount = repository.getTotalSignOutCount(startDate = startDate, endDate = endDate) - val totalPaymentMemberCount = repository.getPaymentMemberCount(startDate = startDate, endDate = endDate) + val totalSignUpCount = repository.getTotalSignUpCount(startDate = startDateTime, endDate = endDateTime) + val totalSignOutCount = repository.getTotalSignOutCount(startDate = startDateTime, endDate = endDateTime) + val totalPaymentMemberCount = repository.getPaymentMemberCount(startDate = startDateTime, endDate = endDateTime) - startDate = dateRange.startDate + startDateTime = dateRange.startDate .atZone(ZoneId.of("Asia/Seoul")) .withZoneSameInstant(ZoneId.of("UTC")) .toLocalDateTime() - endDate = dateRange.endDate + endDateTime = dateRange.endDate .atZone(ZoneId.of("Asia/Seoul")) .withZoneSameInstant(ZoneId.of("UTC")) .toLocalDateTime() val signUpCountInRange = repository.getSignUpCountInRange( - startDate = startDate, - endDate = endDate, + startDate = startDateTime, + endDate = endDateTime, offset = pageable.offset, limit = pageable.pageSize.toLong() ).associateBy({ it.date }, { it.memberCount }) val signOutCountInRange = repository.getSignOutCountInRange( - startDate = startDate, - endDate = endDate, + startDate = startDateTime, + endDate = endDateTime, offset = pageable.offset, limit = pageable.pageSize.toLong() ).associateBy({ it.date }, { it.memberCount }) val paymentMemberCountInRange = repository.getPaymentMemberCountInRange( - startDate = startDate, - endDate = endDate, + startDate = startDateTime, + endDate = endDateTime, offset = pageable.offset, limit = pageable.pageSize.toLong() ) @@ -75,8 +83,8 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics val paymentMemberCountInRangeMap = paymentMemberCountInRange.associateBy({ it.date }, { it.memberCount }) val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") - val items = generateSequence(dateRange.startDate) { it.plusDays(1) } - .takeWhile { !it.isAfter(dateRange.endDate) } + val items = generateSequence(dateRange.endDate) { it.minusDays(1) } + .takeWhile { !it.isBefore(dateRange.startDate) } .map { val date = it.format(formatter) GetMemberStatisticsItem( @@ -97,17 +105,14 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics ) } - private fun getPagedDateRange(startDate: String, endDate: String, page: Int, pageSize: Int): PagedDateRange? { - val start = LocalDate.parse(startDate) - val end = LocalDate.parse(endDate) - - val totalDays = ChronoUnit.DAYS.between(start, end).toInt() + 1 + private fun getPagedDateRange(startDate: LocalDate, endDate: LocalDate, page: Int, pageSize: Int): PagedDateRange? { + val totalDays = ChronoUnit.DAYS.between(startDate, endDate).toInt() + 1 val totalPages = (totalDays + pageSize - 1) / pageSize // 전체 페이지 개수 계산 if (page < 1 || page > totalPages) return null // 페이지 범위를 벗어나면 null 반환 - val rangeStart = start.plusDays((page - 1) * pageSize.toLong()).atStartOfDay() - val rangeEnd = start.plusDays((page * pageSize - 1).toLong()).coerceAtMost(end).atTime(LocalTime.MAX) + val rangeEnd = endDate.minusDays((page - 1) * pageSize.toLong()).atTime(LocalTime.MAX) + val rangeStart = endDate.minusDays((page * pageSize - 1).toLong()).coerceAtLeast(startDate).atStartOfDay() return PagedDateRange(rangeStart, rangeEnd, totalDays) }