From 0040a521690d35b4c442e3a65c7ac934777b031c Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 28 May 2024 17:51:48 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20=EC=BB=A4?= =?UTF-8?q?=EB=AE=A4=EB=8B=88=ED=8B=B0=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20?= =?UTF-8?q?=EC=A0=95=EC=82=B0=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calculate/AdminCalculateController.kt | 14 ++++++++ .../AdminCalculateQueryRepository.kt | 32 +++++++++++++++++ .../admin/calculate/AdminCalculateService.kt | 34 +++++++++++++++++++ .../sodalive/extensions/StringExtensions.kt | 17 ++++++++++ 4 files changed, 97 insertions(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateController.kt index 2231204..30dbe37 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateController.kt @@ -34,4 +34,18 @@ class AdminCalculateController(private val service: AdminCalculateService) { @RequestParam startDateStr: String, @RequestParam endDateStr: String ) = ApiResponse.ok(service.getCalculateContentDonationList(startDateStr, endDateStr)) + + @GetMapping("/community-post") + fun getCalculateCommunityPost( + @RequestParam startDateStr: String, + @RequestParam endDateStr: String, + pageable: Pageable + ) = ApiResponse.ok( + service.getCalculateCommunityPost( + startDateStr, + endDateStr, + pageable.offset, + pageable.pageSize.toLong() + ) + ) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateQueryRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateQueryRepository.kt index 6c43dab..cdd1433 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateQueryRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateQueryRepository.kt @@ -8,6 +8,7 @@ import kr.co.vividnext.sodalive.can.use.CanUsage import kr.co.vividnext.sodalive.can.use.QUseCan.useCan import kr.co.vividnext.sodalive.content.QAudioContent.audioContent import kr.co.vividnext.sodalive.content.order.QOrder.order +import kr.co.vividnext.sodalive.explorer.profile.creatorCommunity.QCreatorCommunity.creatorCommunity import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom import kr.co.vividnext.sodalive.member.QMember.member import org.springframework.stereotype.Repository @@ -152,4 +153,35 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { .orderBy(member.id.asc(), donationFormattedDate.desc()) .fetch() } + + fun getCalculateCommunityPostList( + startDate: LocalDateTime?, + endDate: LocalDateTime?, + offset: Long, + limit: Long + ): List { + val formattedDate = getFormattedDate(useCan.createdAt) + return queryFactory + .select( + QGetCalculateCommunityPostQueryData( + member.nickname, + Expressions.stringTemplate("substring({0}, 1, 10)", creatorCommunity.content), + formattedDate, + useCan.id.count(), + useCan.can.add(useCan.rewardCan).sum() + ) + ) + .from(useCan) + .innerJoin(useCan.communityPost, creatorCommunity) + .innerJoin(creatorCommunity.member, member) + .where( + useCan.isRefund.isFalse + .and(useCan.canUsage.eq(CanUsage.PAID_COMMUNITY_POST)) + .and(useCan.createdAt.goe(startDate)) + .and(useCan.createdAt.loe(endDate)) + ) + .groupBy(formattedDate, creatorCommunity.id) + .orderBy(member.id.asc(), formattedDate.desc()) + .fetch() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateService.kt index 8b1bd4c..2e5a780 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/AdminCalculateService.kt @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.admin.calculate import kr.co.vividnext.sodalive.can.use.CanUsage import kr.co.vividnext.sodalive.content.order.OrderType +import kr.co.vividnext.sodalive.extensions.convertLocalDateTime import org.springframework.cache.annotation.Cacheable import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -266,4 +267,37 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor } .toList() } + + fun getCalculateCommunityPost( + startDateStr: String, + endDateStr: String, + offset: Long, + limit: Long + ): List { + val startDate = startDateStr.convertLocalDateTime() + val endDate = endDateStr.convertLocalDateTime(hour = 23, minute = 59, second = 59) + + return repository + .getCalculateCommunityPostList(startDate, endDate, offset, limit) + .map { + val totalKrw = it.totalCan * 100 + val paymentFee = totalKrw * 0.066f + val settlementAmount = (totalKrw.toFloat() - paymentFee) * 0.7 + val tax = settlementAmount * 0.033 + val depositAmount = settlementAmount - tax + + GetCalculateCommunityPostResponse( + nickname = it.nickname, + title = it.title, + date = it.date, + numberOfPurchase = it.numberOfPurchase.toInt(), + totalCan = it.totalCan, + totalKrw = totalKrw, + paymentFee = paymentFee.roundToInt(), + settlementAmount = settlementAmount.roundToInt(), + tax = tax.roundToInt(), + depositAmount = depositAmount.roundToInt() + ) + } + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/extensions/StringExtensions.kt b/src/main/kotlin/kr/co/vividnext/sodalive/extensions/StringExtensions.kt index ff1bb02..3e810b5 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/extensions/StringExtensions.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/extensions/StringExtensions.kt @@ -1,9 +1,26 @@ package kr.co.vividnext.sodalive.extensions +import java.time.LocalDate import java.time.LocalDateTime +import java.time.ZoneId import java.time.format.DateTimeFormatter fun String.convertLocalDateTime(format: String): LocalDateTime { val dateTimeFormatter = DateTimeFormatter.ofPattern(format) return LocalDateTime.parse(this, dateTimeFormatter) } + +fun String.convertLocalDateTime( + format: String = "yyyy-MM-dd", + currentTimeZoneStr: String = "ASIA/Seoul", + hour: Int = 0, + minute: Int = 0, + second: Int = 0 +): LocalDateTime { + val dateTimeFormatter = DateTimeFormatter.ofPattern(format) + return LocalDate.parse(this, dateTimeFormatter) + .atTime(hour, minute, second) + .atZone(ZoneId.of(currentTimeZoneStr)) + .withZoneSameInstant(ZoneId.of("UTC")) + .toLocalDateTime() +}