From 37d2e0de73d32d603e1e8dca8ce7baee44ac73ed Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 8 Feb 2026 16:26:28 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9D=BC=EB=B3=84=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=20=EC=88=98=EC=97=90=20=EC=95=A0=ED=94=8C=20?= =?UTF-8?q?=EA=B3=84=EC=A0=95=EC=9C=BC=EB=A1=9C=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=EA=B0=80=EC=9E=85=20=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/AdminMemberStatisticsRepository.kt | 32 +++++++++++++++++++ .../member/AdminMemberStatisticsService.kt | 11 +++++++ .../member/GetMemberStatisticsResponse.kt | 2 ++ 3 files changed, 45 insertions(+) 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 66650292..0cb7868d 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 @@ -68,6 +68,19 @@ class AdminMemberStatisticsRepository(private val queryFactory: JPAQueryFactory) .size } + fun getTotalSignUpAppleCount(startDate: LocalDateTime, endDate: LocalDateTime): Int { + return queryFactory + .select(member.id) + .from(member) + .where( + member.createdAt.goe(startDate), + member.createdAt.loe(endDate), + member.provider.eq(MemberProvider.APPLE) + ) + .fetch() + .size + } + fun getTotalSignUpLineCount(startDate: LocalDateTime, endDate: LocalDateTime): Int { return queryFactory .select(member.id) @@ -202,6 +215,25 @@ class AdminMemberStatisticsRepository(private val queryFactory: JPAQueryFactory) .fetch() } + fun getSignUpAppleCountInRange(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), + member.provider.eq(MemberProvider.APPLE) + ) + .groupBy(getFormattedDate(member.createdAt)) + .orderBy(getFormattedDate(member.createdAt).desc()) + .fetch() + } + fun getSignUpLineCountInRange(startDate: LocalDateTime, endDate: LocalDateTime): List { return queryFactory .select( 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 67906d64..9353d65f 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 @@ -58,6 +58,10 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics startDate = startDateTime, endDate = endDateTime ) + val totalSignUpAppleCount = repository.getTotalSignUpAppleCount( + startDate = startDateTime, + endDate = endDateTime + ) val totalSignUpLineCount = repository.getTotalSignUpLineCount( startDate = startDateTime, endDate = endDateTime @@ -96,6 +100,11 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics endDate = endDateTime ).associateBy({ it.date }, { it.memberCount }) + val signUpAppleCountInRange = repository.getSignUpAppleCountInRange( + startDate = startDateTime, + endDate = endDateTime + ).associateBy({ it.date }, { it.memberCount }) + val signUpLineCountInRange = repository.getSignUpLineCountInRange( startDate = startDateTime, endDate = endDateTime @@ -130,6 +139,7 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics signUpEmailCount = signUpEmailCountInRange[date] ?: 0, signUpKakaoCount = signUpKakaoCountInRange[date] ?: 0, signUpGoogleCount = signUpGoogleCountInRange[date] ?: 0, + signUpAppleCount = signUpAppleCountInRange[date] ?: 0, signUpLineCount = signUpLineCountInRange[date] ?: 0, signOutCount = signOutCountInRange[date] ?: 0, paymentMemberCount = paymentMemberCountInRangeMap[date] ?: 0 @@ -144,6 +154,7 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics totalSignUpEmailCount = totalSignUpEmailCount, totalSignUpKakaoCount = totalSignUpKakaoCount, totalSignUpGoogleCount = totalSignUpGoogleCount, + totalSignUpAppleCount = totalSignUpAppleCount, totalSignUpLineCount = totalSignUpLineCount, totalSignOutCount = totalSignOutCount, totalPaymentMemberCount = totalPaymentMemberCount, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/GetMemberStatisticsResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/GetMemberStatisticsResponse.kt index 1558d86f..3286c47b 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/GetMemberStatisticsResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/GetMemberStatisticsResponse.kt @@ -7,6 +7,7 @@ data class GetMemberStatisticsResponse( val totalSignUpEmailCount: Int, val totalSignUpKakaoCount: Int, val totalSignUpGoogleCount: Int, + val totalSignUpAppleCount: Int, val totalSignUpLineCount: Int, val totalSignOutCount: Int, val totalPaymentMemberCount: Int, @@ -20,6 +21,7 @@ data class GetMemberStatisticsItem( val signUpEmailCount: Int, val signUpKakaoCount: Int, val signUpGoogleCount: Int, + val signUpAppleCount: Int, val signUpLineCount: Int, val signOutCount: Int, val paymentMemberCount: Int