From 9458a3976bbafc2f5940f978fbe17d50423416b3 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 14 Nov 2023 00:05:21 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EB=88=84?= =?UTF-8?q?=EC=A0=81=20=EB=A7=A4=EC=B6=9C=20API=20-=203=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=20=EC=BA=90=EC=8B=9C=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/admin/calculate/AdminCalculateService.kt | 5 +++++ 1 file changed, 5 insertions(+) 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 d528a94..3f96ef6 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 @@ -135,6 +135,11 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor .toList() } + @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["cache_ttl_3_hours"], + key = "'getCumulativeSalesByContent:' + " + "#offset + ':' + #limit" + ) fun getCumulativeSalesByContent(offset: Long, limit: Long): GetCumulativeSalesByContentResponse { val totalCount = repository.getCumulativeSalesByContentTotalCount() val items = repository -- 2.40.1 From 8da7ee0bb3a9e49e96918f7c7b806aa962966556 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 14 Nov 2023 00:07:31 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=A7=A4?= =?UTF-8?q?=EC=B6=9C=20API=20-=2030=EB=B6=84=20=EC=BA=90=EC=8B=9C=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/admin/calculate/AdminCalculateService.kt | 5 +++++ 1 file changed, 5 insertions(+) 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 3f96ef6..bd2c762 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 @@ -12,6 +12,11 @@ import kotlin.math.roundToInt @Service class AdminCalculateService(private val repository: AdminCalculateQueryRepository) { + @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["default"], + key = "'calculateLive:' + " + "#startDateStr + ':' + #endDateStr" + ) fun getCalculateLive(startDateStr: String, endDateStr: String): List { val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") val startDate = LocalDate.parse(startDateStr, dateTimeFormatter).atTime(0, 0, 0) -- 2.40.1 From 3164232f9d6a17147d2d8af0c979d033fd393009 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 14 Nov 2023 00:08:13 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EB=88=84?= =?UTF-8?q?=EC=A0=81=20=EB=A7=A4=EC=B6=9C=20API=20-=20=EC=BA=90=EC=8B=9C?= =?UTF-8?q?=20=ED=82=A4=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/admin/calculate/AdminCalculateService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 bd2c762..5f859b6 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 @@ -143,7 +143,7 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor @Transactional(readOnly = true) @Cacheable( cacheNames = ["cache_ttl_3_hours"], - key = "'getCumulativeSalesByContent:' + " + "#offset + ':' + #limit" + key = "'cumulativeSalesByContent:' + " + "#offset + ':' + #limit" ) fun getCumulativeSalesByContent(offset: Long, limit: Long): GetCumulativeSalesByContentResponse { val totalCount = repository.getCumulativeSalesByContentTotalCount() -- 2.40.1 From b464f7ae4cdb96fd3febf0eaa21bf6bc65757272 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 14 Nov 2023 00:16:04 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20=EC=BD=98?= =?UTF-8?q?=ED=85=90=EC=B8=A0=20=EB=88=84=EC=A0=81=20=EB=A7=A4=EC=B6=9C=20?= =?UTF-8?q?API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreatorAdminCalculateController.kt | 10 ++++ .../CreatorAdminCalculateQueryRepository.kt | 42 ++++++++++++++++ .../calculate/CreatorAdminCalculateService.kt | 49 +++++++++++++++++++ 3 files changed, 101 insertions(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateController.kt index 99646c1..409c472 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateController.kt @@ -43,4 +43,14 @@ class CreatorAdminCalculateController(private val service: CreatorAdminCalculate ) ) } + + @GetMapping("/cumulative-sales-by-content") + fun getCumulativeSalesByContent( + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, + pageable: Pageable + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.getCumulativeSalesByContent(member.id!!, pageable.offset, pageable.pageSize.toLong())) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateQueryRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateQueryRepository.kt index 99c3814..0a9e488 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateQueryRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateQueryRepository.kt @@ -6,8 +6,10 @@ import com.querydsl.core.types.dsl.StringTemplate import com.querydsl.jpa.impl.JPAQueryFactory import kr.co.vividnext.sodalive.admin.calculate.GetCalculateContentQueryData import kr.co.vividnext.sodalive.admin.calculate.GetCalculateLiveQueryData +import kr.co.vividnext.sodalive.admin.calculate.GetCumulativeSalesByContentQueryData import kr.co.vividnext.sodalive.admin.calculate.QGetCalculateContentQueryData import kr.co.vividnext.sodalive.admin.calculate.QGetCalculateLiveQueryData +import kr.co.vividnext.sodalive.admin.calculate.QGetCumulativeSalesByContentQueryData import kr.co.vividnext.sodalive.can.use.QUseCan.useCan import kr.co.vividnext.sodalive.can.use.QUseCanCalculate.useCanCalculate import kr.co.vividnext.sodalive.can.use.UseCanCalculateStatus @@ -142,4 +144,44 @@ class CreatorAdminCalculateQueryRepository(private val queryFactory: JPAQueryFac "%Y-%m-%d" ) } + + fun getCumulativeSalesByContentTotalCount(memberId: Long): Int { + return queryFactory + .select(audioContent.id) + .from(order) + .innerJoin(order.audioContent, audioContent) + .innerJoin(audioContent.member, member) + .where(audioContent.member.id.eq(memberId)) + .groupBy(member.id, audioContent.id, order.can) + .fetch() + .size + } + + fun getCumulativeSalesByContent( + memberId: Long, + offset: Long, + limit: Long + ): List { + return queryFactory + .select( + QGetCumulativeSalesByContentQueryData( + member.nickname, + audioContent.title, + getFormattedDate(audioContent.createdAt), + order.type, + order.can, + order.id.count(), + order.can.sum() + ) + ) + .from(order) + .innerJoin(order.audioContent, audioContent) + .innerJoin(audioContent.member, member) + .where(audioContent.member.id.eq(memberId)) + .groupBy(member.id, audioContent.id, order.type, order.can) + .offset(offset) + .limit(limit) + .orderBy(member.id.desc(), audioContent.id.desc()) + .fetch() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt index fda18dc..e4dedeb 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt @@ -1,7 +1,9 @@ package kr.co.vividnext.sodalive.creator.admin.calculate +import kr.co.vividnext.sodalive.admin.calculate.CumulativeSalesByContentItem import kr.co.vividnext.sodalive.admin.calculate.GetCalculateContentResponse import kr.co.vividnext.sodalive.admin.calculate.GetCalculateLiveResponse +import kr.co.vividnext.sodalive.admin.calculate.GetCumulativeSalesByContentResponse import kr.co.vividnext.sodalive.can.use.CanUsage import kr.co.vividnext.sodalive.content.order.OrderType import kr.co.vividnext.sodalive.member.Member @@ -138,4 +140,51 @@ class CreatorAdminCalculateService(private val repository: CreatorAdminCalculate return GetCalculateContentListResponse(totalCount, items) } + + fun getCumulativeSalesByContent(memberId: Long, offset: Long, limit: Long): GetCumulativeSalesByContentResponse { + val totalCount = repository.getCumulativeSalesByContentTotalCount(memberId) + val items = repository + .getCumulativeSalesByContent(memberId, offset, limit) + .asSequence() + .map { + val orderTypeStr = if (it.orderType == OrderType.RENTAL) { + "대여" + } else { + "소장" + } + + // 원화 = totalCoin * 100 ( 캔 1개 = 100원 ) + val totalKrw = it.totalCan * 100 + + // 결제수수료 : 6.6% + val paymentFee = totalKrw * 0.066f + + // 정산금액 = (원화 - 결제수수료) 의 70% + val settlementAmount = (totalKrw.toFloat() - paymentFee) * 0.7 + + // 원천세 = 정산금액의 3.3% + val tax = settlementAmount * 0.033 + + // 입금액 + val depositAmount = settlementAmount - tax + + CumulativeSalesByContentItem( + nickname = it.nickname, + title = it.title, + registrationDate = it.registrationDate, + orderType = orderTypeStr, + orderPrice = it.orderPrice, + numberOfPeople = it.numberOfPeople.toInt(), + totalCan = it.totalCan, + totalKrw = totalKrw, + paymentFee = paymentFee.roundToInt(), + settlementAmount = settlementAmount.roundToInt(), + tax = tax.roundToInt(), + depositAmount = depositAmount.roundToInt() + ) + } + .toList() + + return GetCumulativeSalesByContentResponse(totalCount, items) + } } -- 2.40.1