From b464f7ae4cdb96fd3febf0eaa21bf6bc65757272 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 14 Nov 2023 00:16:04 +0900 Subject: [PATCH] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=20=EB=88=84=EC=A0=81=20=EB=A7=A4=EC=B6=9C=20API?= 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) + } }