From 74fecddf95d5d31b9218b399e5c57398336f1127 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 14 Mar 2025 23:55:04 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20=EC=9D=BC?= =?UTF-8?q?=EB=B3=84=20=EC=A0=84=EC=B2=B4=20=ED=9A=8C=EC=9B=90=EC=88=98=20?= =?UTF-8?q?API=20-=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B3=84=EC=82=B0=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/AdminMemberStatisticsController.kt | 3 +- .../member/AdminMemberStatisticsRepository.kt | 113 ++++++++++++------ .../member/AdminMemberStatisticsService.kt | 30 +++-- 3 files changed, 99 insertions(+), 47 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/AdminMemberStatisticsController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/AdminMemberStatisticsController.kt index ccab70f..d3ffdc3 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/AdminMemberStatisticsController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/AdminMemberStatisticsController.kt @@ -21,8 +21,7 @@ class AdminMemberStatisticsController(private val service: AdminMemberStatistics service.getStatistics( startDateStr = startDateStr, endDateStr = endDateStr, - offset = pageable.offset, - limit = pageable.pageSize.toLong() + pageable = pageable ) ) } 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 d0e55db..3389986 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 @@ -39,41 +39,7 @@ class AdminMemberStatisticsRepository(private val queryFactory: JPAQueryFactory) .size } - fun getSignUpCountInRange(startDate: LocalDateTime, endDate: LocalDateTime): List { - return queryFactory - .select( - QDateAndMemberCount( - getFormattedDate(member.createdAt), - member.id.countDistinct().castToNum(Int::class.java) - ) - ) - .from(member) - .where( - member.createdAt.goe(startDate), - member.createdAt.loe(endDate) - ) - .groupBy(getFormattedDate(member.createdAt)) - .fetch() - } - - fun getSignOutCountInRange(startDate: LocalDateTime, endDate: LocalDateTime): List { - return queryFactory - .select( - QDateAndMemberCount( - getFormattedDate(signOut.createdAt), - signOut.id.countDistinct().castToNum(Int::class.java) - ) - ) - .from(signOut) - .where( - signOut.createdAt.goe(startDate), - signOut.createdAt.loe(endDate) - ) - .groupBy(getFormattedDate(signOut.createdAt)) - .fetch() - } - - fun getPaymentMemberCountInRange(startDate: LocalDateTime, endDate: LocalDateTime): List { + fun getPaymentMemberCount(startDate: LocalDateTime, endDate: LocalDateTime): Int { return queryFactory .select( QDateAndMemberCount( @@ -92,6 +58,83 @@ class AdminMemberStatisticsRepository(private val queryFactory: JPAQueryFactory) ) .groupBy(getFormattedDate(charge.createdAt)) .fetch() + .sumOf { it.memberCount } + } + + fun getSignUpCountInRange( + startDate: LocalDateTime, + endDate: LocalDateTime, + offset: Long, + limit: Long + ): List { + return queryFactory + .select( + QDateAndMemberCount( + getFormattedDate(member.createdAt), + member.id.countDistinct().castToNum(Int::class.java) + ) + ) + .from(member) + .where( + member.createdAt.goe(startDate), + member.createdAt.loe(endDate) + ) + .groupBy(getFormattedDate(member.createdAt)) + .offset(offset) + .limit(limit) + .fetch() + } + + fun getSignOutCountInRange( + startDate: LocalDateTime, + endDate: LocalDateTime, + offset: Long, + limit: Long + ): List { + return queryFactory + .select( + QDateAndMemberCount( + getFormattedDate(signOut.createdAt), + signOut.id.countDistinct().castToNum(Int::class.java) + ) + ) + .from(signOut) + .where( + signOut.createdAt.goe(startDate), + signOut.createdAt.loe(endDate) + ) + .groupBy(getFormattedDate(signOut.createdAt)) + .offset(offset) + .limit(limit) + .fetch() + } + + fun getPaymentMemberCountInRange( + startDate: LocalDateTime, + endDate: LocalDateTime, + offset: Long, + limit: Long + ): List { + return queryFactory + .select( + QDateAndMemberCount( + getFormattedDate(charge.createdAt), + member.id.countDistinct().castToNum(Int::class.java) + ) + ) + .from(charge) + .innerJoin(charge.member, member) + .leftJoin(charge.payment, payment) + .where( + charge.status.eq(ChargeStatus.CHARGE), + payment.status.eq(PaymentStatus.COMPLETE), + charge.createdAt.goe(startDate), + charge.createdAt.loe(endDate) + ) + .groupBy(getFormattedDate(charge.createdAt)) + .offset(offset) + .limit(limit) + .fetch() } private fun getFormattedDate(dateTimePath: DateTimePath): StringTemplate { 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 d61f1da..319b9b3 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 @@ -1,6 +1,7 @@ package kr.co.vividnext.sodalive.admin.statistics.member 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.LocalTime @@ -13,14 +14,13 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics fun getStatistics( startDateStr: String, endDateStr: String, - offset: Long, - limit: Long + pageable: Pageable ): GetMemberStatisticsResponse { val dateRange = getPagedDateRange( startDate = startDateStr, endDate = endDateStr, - page = (offset + 1).toInt(), - pageSize = limit.toInt() + page = pageable.pageNumber + 1, + pageSize = pageable.pageSize ) if (dateRange == null) { @@ -39,19 +39,29 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics 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 signUpCountInRange = repository.getSignUpCountInRange(startDate = startDate, endDate = endDate) - .associateBy({ it.date }, { it.memberCount }) + val signUpCountInRange = repository.getSignUpCountInRange( + startDate = startDate, + endDate = endDate, + offset = pageable.offset, + limit = pageable.pageSize.toLong() + ).associateBy({ it.date }, { it.memberCount }) - val signOutCountInRange = repository.getSignOutCountInRange(startDate = startDate, endDate = endDate) - .associateBy({ it.date }, { it.memberCount }) + val signOutCountInRange = repository.getSignOutCountInRange( + startDate = startDate, + endDate = endDate, + offset = pageable.offset, + limit = pageable.pageSize.toLong() + ).associateBy({ it.date }, { it.memberCount }) val paymentMemberCountInRange = repository.getPaymentMemberCountInRange( startDate = startDate, - endDate = endDate + endDate = endDate, + offset = pageable.offset, + limit = pageable.pageSize.toLong() ) - val totalPaymentMemberCount = paymentMemberCountInRange.sumOf { it.memberCount } val paymentMemberCountInRangeMap = paymentMemberCountInRange.associateBy({ it.date }, { it.memberCount }) val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")