From 263ca3ac9a1c1a736f90089c64862cb80514da43 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 2 Jul 2024 19:20:00 +0900 Subject: [PATCH 01/12] =?UTF-8?q?=EB=A3=B0=EB=A0=9B=20=ED=95=A9=EA=B3=84?= =?UTF-8?q?=20=EA=B2=80=EC=A6=9D=20-=20Float=EB=A5=BC=20Decimal=EB=A1=9C?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=ED=95=9C=20=ED=9B=84=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/live/roulette/v2/RouletteService.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt index b8c39e9..84ad0bc 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt @@ -23,6 +23,7 @@ import kr.co.vividnext.sodalive.member.MemberRole import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional +import java.math.BigDecimal import java.util.concurrent.locks.ReentrantReadWriteLock import kotlin.concurrent.write import kotlin.random.Random @@ -236,8 +237,8 @@ class RouletteService( throw SodaException("룰렛 옵션은 최소 2개, 최대 10개까지 설정할 수 있습니다.") } - val totalPercentage = items.map { it.percentage }.sum() - if (totalPercentage != 100f) { + val totalPercentage = items.map { BigDecimal(it.percentage.toDouble()) }.reduce(BigDecimal::plus) + if (totalPercentage != BigDecimal(100.0)) { throw SodaException("확률이 100%가 아닙니다") } } From 0e0114a7d1dbfdaba034a003922afb082d55bda4 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 2 Jul 2024 21:14:15 +0900 Subject: [PATCH 02/12] =?UTF-8?q?=EB=A3=B0=EB=A0=9B=20=ED=95=A9=EA=B3=84?= =?UTF-8?q?=20=EA=B2=80=EC=A6=9D=20-=20Float=20=EA=B0=92=EC=9D=B4=EB=9D=BC?= =?UTF-8?q?=20=EC=A0=95=ED=99=95=ED=9E=88=20100.0=EC=9D=B4=20=EB=82=98?= =?UTF-8?q?=EC=98=A4=EC=A7=80=20=EC=95=8A=EC=9C=BC=EB=AF=80=EB=A1=9C=20tot?= =?UTF-8?q?alPercentage=EA=B0=80=2099.9=EB=B3=B4=EB=8B=A4=20=ED=81=AC?= =?UTF-8?q?=EA=B3=A0=20100.1=EB=B3=B4=EB=8B=A4=20=EC=9E=91=EC=9C=BC?= =?UTF-8?q?=EB=A9=B4=20=ED=86=B5=EA=B3=BC=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/live/roulette/v2/RouletteService.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt index 84ad0bc..1b92053 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt @@ -23,7 +23,6 @@ import kr.co.vividnext.sodalive.member.MemberRole import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional -import java.math.BigDecimal import java.util.concurrent.locks.ReentrantReadWriteLock import kotlin.concurrent.write import kotlin.random.Random @@ -237,8 +236,8 @@ class RouletteService( throw SodaException("룰렛 옵션은 최소 2개, 최대 10개까지 설정할 수 있습니다.") } - val totalPercentage = items.map { BigDecimal(it.percentage.toDouble()) }.reduce(BigDecimal::plus) - if (totalPercentage != BigDecimal(100.0)) { + val totalPercentage = items.map { it.percentage }.sum() + if (totalPercentage > 100.1f || totalPercentage < 99.9f) { throw SodaException("확률이 100%가 아닙니다") } } From 87000307076d5157aa5bef1527ce808d1ca9fd69 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 2 Jul 2024 21:29:48 +0900 Subject: [PATCH 03/12] =?UTF-8?q?=EB=A3=B0=EB=A0=9B=20=ED=95=A9=EA=B3=84?= =?UTF-8?q?=20=EA=B2=80=EC=A6=9D=20-=20Float=20=EA=B0=92=EC=9D=B4=EB=9D=BC?= =?UTF-8?q?=20=EC=A0=95=ED=99=95=ED=9E=88=20100.0=EC=9D=B4=20=EB=82=98?= =?UTF-8?q?=EC=98=A4=EC=A7=80=20=EC=95=8A=EC=9C=BC=EB=AF=80=EB=A1=9C=20tot?= =?UTF-8?q?alPercentage=EA=B0=80=2099.9=EB=B3=B4=EB=8B=A4=20=ED=81=AC?= =?UTF-8?q?=EA=B3=A0=20100.1=EB=B3=B4=EB=8B=A4=20=EC=9E=91=EC=9C=BC?= =?UTF-8?q?=EB=A9=B4=20=ED=86=B5=EA=B3=BC=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/vividnext/sodalive/live/roulette/v2/RouletteService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt index 1b92053..6529381 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt @@ -237,7 +237,7 @@ class RouletteService( } val totalPercentage = items.map { it.percentage }.sum() - if (totalPercentage > 100.1f || totalPercentage < 99.9f) { + if (totalPercentage > 100.1f || totalPercentage <= 99.99f) { throw SodaException("확률이 100%가 아닙니다") } } From 80a78a036e80320546d9440d74a9051688adcca3 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 5 Jul 2024 23:08:44 +0900 Subject: [PATCH 04/12] =?UTF-8?q?=EC=BB=A4=EB=AE=A4=EB=8B=88=ED=8B=B0=20?= =?UTF-8?q?=EC=A0=95=EC=82=B0=20-=203=EC=8B=9C=EA=B0=84=20=EC=BA=90?= =?UTF-8?q?=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 | 7 ++++++- 1 file changed, 6 insertions(+), 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 f82afed..75b8c50 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 @@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.Transactional class AdminCalculateService(private val repository: AdminCalculateQueryRepository) { @Transactional(readOnly = true) @Cacheable( - cacheNames = ["default"], + cacheNames = ["cache_ttl_3_hours"], key = "'calculateLive:' + " + "#startDateStr + ':' + #endDateStr" ) fun getCalculateLive(startDateStr: String, endDateStr: String): List { @@ -67,6 +67,11 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor .map { it.toGetCalculateContentDonationResponse() } } + @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["cache_ttl_3_hours"], + key = "'calculateCommunityPost:' + " + "#startDateStr + ':' + #endDateStr + ':' + #offset" + ) fun getCalculateCommunityPost( startDateStr: String, endDateStr: String, From c4e58890eaf02211f2c7253fbeceb8e857d9d959 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sat, 6 Jul 2024 00:15:40 +0900 Subject: [PATCH 05/12] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EA=B8=B0=EC=A4=80=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20?= =?UTF-8?q?=ED=95=A9=EA=B3=84=20=EC=A0=95=EC=82=B0=20API=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calculate/AdminCalculateController.kt | 14 ++++++ .../AdminCalculateQueryRepository.kt | 40 +++++++++++++++++ .../admin/calculate/AdminCalculateService.kt | 17 +++++++ .../GetCalculateLiveByCreatorItem.kt | 14 ++++++ .../GetCalculateLiveByCreatorQueryData.kt | 44 +++++++++++++++++++ .../GetCalculateLiveByCreatorResponse.kt | 6 +++ 6 files changed, 135 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorItem.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorQueryData.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorResponse.kt 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 30dbe37..35bf0a4 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 @@ -48,4 +48,18 @@ class AdminCalculateController(private val service: AdminCalculateService) { pageable.pageSize.toLong() ) ) + + @GetMapping("/live-by-creator") + fun getCalculateLiveByCreator( + @RequestParam startDateStr: String, + @RequestParam endDateStr: String, + pageable: Pageable + ) = ApiResponse.ok( + service.getCalculateLiveByCreator( + 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 a4d25f3..c8e700c 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 @@ -224,4 +224,44 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { .limit(limit) .fetch() } + + fun getCalculateLiveByCreatorTotalCount(startDate: LocalDateTime, endDate: LocalDateTime): Int { + return queryFactory + .select(member.id) + .from(useCan) + .innerJoin(useCan.room, liveRoom) + .innerJoin(liveRoom.member, member) + .leftJoin(creatorSettlementRatio) + .on(member.id.eq(creatorSettlementRatio.member.id)) + .groupBy(member.id) + .fetch() + .size + } + + fun getCalculateLiveByCreator( + startDate: LocalDateTime, + endDate: LocalDateTime, + offset: Long, + limit: Long + ): List { + return queryFactory + .select( + QGetCalculateLiveByCreatorQueryData( + member.email, + member.nickname, + useCan.can.add(useCan.rewardCan).sum(), + creatorSettlementRatio.liveSettlementRatio + ) + ) + .from(useCan) + .innerJoin(useCan.room, liveRoom) + .innerJoin(liveRoom.member, member) + .leftJoin(creatorSettlementRatio) + .on(member.id.eq(creatorSettlementRatio.member.id)) + .groupBy(member.id) + .orderBy(useCan.can.add(useCan.rewardCan).desc()) + .offset(offset) + .limit(limit) + .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 75b8c50..985cd5a 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 @@ -88,4 +88,21 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor return GetCreatorCalculateCommunityPostResponse(totalCount, items) } + + fun getCalculateLiveByCreator( + startDateStr: String, + endDateStr: String, + offset: Long, + limit: Long + ) = run { + val startDate = startDateStr.convertLocalDateTime() + val endDate = endDateStr.convertLocalDateTime(hour = 23, minute = 59, second = 59) + + val totalCount = repository.getCalculateLiveByCreatorTotalCount(startDate, endDate) + val items = repository + .getCalculateLiveByCreator(startDate, endDate, offset, limit) + .map { it.toGetCalculateLiveByCreator() } + + GetCalculateLiveByCreatorResponse(totalCount, items) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorItem.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorItem.kt new file mode 100644 index 0000000..4d87621 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorItem.kt @@ -0,0 +1,14 @@ +package kr.co.vividnext.sodalive.admin.calculate + +import com.fasterxml.jackson.annotation.JsonProperty + +data class GetCalculateLiveByCreatorItem( + @JsonProperty("email") val email: String, + @JsonProperty("nickname") val nickname: String, + @JsonProperty("totalCan") val totalCan: Int, + @JsonProperty("totalKrw") val totalKrw: Int, + @JsonProperty("paymentFee") val paymentFee: Int, + @JsonProperty("settlementAmount") val settlementAmount: Int, + @JsonProperty("tax") val tax: Int, + @JsonProperty("depositAmount") val depositAmount: Int +) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorQueryData.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorQueryData.kt new file mode 100644 index 0000000..5e1bb86 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorQueryData.kt @@ -0,0 +1,44 @@ +package kr.co.vividnext.sodalive.admin.calculate + +import com.querydsl.core.annotations.QueryProjection +import java.math.BigDecimal +import java.math.RoundingMode + +data class GetCalculateLiveByCreatorQueryData @QueryProjection constructor( + val email: String, + val nickname: String, + val totalCan: Int, + val settlementRatio: Int? +) { + fun toGetCalculateLiveByCreator(): GetCalculateLiveByCreatorItem { + // 원화 = totalCoin * 100 ( 캔 1개 = 100원 ) + val totalKrw = BigDecimal(totalCan).multiply(BigDecimal(100)) + + // 결제수수료 : 6.6% + val paymentFee = totalKrw.multiply(BigDecimal(0.066)) + + // 정산금액 = (원화 - 결제수수료) 의 70% + val settlementAmount = if (settlementRatio != null) { + totalKrw.subtract(paymentFee).multiply(BigDecimal(settlementRatio).divide(BigDecimal(100.0))) + } else { + totalKrw.subtract(paymentFee).multiply(BigDecimal(0.7)) + } + + // 원천세 = 정산금액의 3.3% + val tax = settlementAmount.multiply(BigDecimal(0.033)) + + // 입금액 + val depositAmount = settlementAmount.subtract(tax) + + return GetCalculateLiveByCreatorItem( + email = email, + nickname = nickname, + totalCan = totalCan, + totalKrw = totalKrw.toInt(), + paymentFee = paymentFee.setScale(0, RoundingMode.HALF_UP).toInt(), + settlementAmount = settlementAmount.setScale(0, RoundingMode.HALF_UP).toInt(), + tax = tax.setScale(0, RoundingMode.HALF_UP).toInt(), + depositAmount = depositAmount.setScale(0, RoundingMode.HALF_UP).toInt() + ) + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorResponse.kt new file mode 100644 index 0000000..cd93b59 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorResponse.kt @@ -0,0 +1,6 @@ +package kr.co.vividnext.sodalive.admin.calculate + +data class GetCalculateLiveByCreatorResponse( + val totalCount: Int, + val items: List +) From e3bacfb8cbad49a1cb6f1218f1dd1665fa79ea2e Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 8 Jul 2024 12:09:02 +0900 Subject: [PATCH 06/12] =?UTF-8?q?=EC=9C=A0=EB=A3=8C=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=20=EC=BA=94=20=EC=A7=80=EB=B6=88=20=EC=97=AC=EB=B6=80?= =?UTF-8?q?=20=ED=8C=90=EB=8B=A8=EB=A1=9C=EC=A7=81=20-=20=ED=99=98?= =?UTF-8?q?=EB=B6=88=EB=90=9C=20=EA=B1=B4=EC=9D=80=20=EC=A7=80=EB=B6=88?= =?UTF-8?q?=EB=90=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EA=B1=B8=EB=A1=9C=20?= =?UTF-8?q?=ED=8C=90=EB=8B=A8=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/kr/co/vividnext/sodalive/can/CanRepository.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/CanRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/CanRepository.kt index 418d9fb..61863a0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/CanRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/CanRepository.kt @@ -109,6 +109,7 @@ class CanQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : CanQue member.id.eq(memberId) .and(liveRoom.id.eq(roomId)) .and(useCan.canUsage.eq(CanUsage.LIVE)) + .and(useCan.isRefund.isFalse) ) .orderBy(useCan.id.desc()) .fetchFirst() From 27bf60b94f20d2e5b9e19a37ec875866753b1294 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 8 Jul 2024 13:43:07 +0900 Subject: [PATCH 07/12] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EA=B8=B0=EC=A4=80=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20?= =?UTF-8?q?=ED=95=A9=EA=B3=84=20=EC=A0=95=EC=82=B0=20API=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/admin/calculate/AdminCalculateQueryRepository.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c8e700c..ada1ec9 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 @@ -258,7 +258,7 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { .innerJoin(liveRoom.member, member) .leftJoin(creatorSettlementRatio) .on(member.id.eq(creatorSettlementRatio.member.id)) - .groupBy(member.id) + .groupBy(member.id, creatorSettlementRatio.liveSettlementRatio) .orderBy(useCan.can.add(useCan.rewardCan).desc()) .offset(offset) .limit(limit) From 9bb1195fb65227156018437b36962ff72974069d Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 8 Jul 2024 13:52:14 +0900 Subject: [PATCH 08/12] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EA=B8=B0=EC=A4=80=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20?= =?UTF-8?q?=ED=95=A9=EA=B3=84=20=EC=A0=95=EC=82=B0=20API=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/admin/calculate/AdminCalculateQueryRepository.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ada1ec9..b0155e7 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 @@ -259,7 +259,7 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { .leftJoin(creatorSettlementRatio) .on(member.id.eq(creatorSettlementRatio.member.id)) .groupBy(member.id, creatorSettlementRatio.liveSettlementRatio) - .orderBy(useCan.can.add(useCan.rewardCan).desc()) + .orderBy(member.id.desc()) .offset(offset) .limit(limit) .fetch() From a9d74605af24ff3ff96c7b43e2b88d728a1bad4e Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 8 Jul 2024 14:04:52 +0900 Subject: [PATCH 09/12] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EA=B8=B0=EC=A4=80=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20?= =?UTF-8?q?=ED=95=A9=EA=B3=84=20=EC=A0=95=EC=82=B0=20API=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/calculate/AdminCalculateQueryRepository.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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 b0155e7..8c01312 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 @@ -233,6 +233,12 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { .innerJoin(liveRoom.member, member) .leftJoin(creatorSettlementRatio) .on(member.id.eq(creatorSettlementRatio.member.id)) + .where( + useCan.isRefund.isFalse + .and(useCan.canUsage.eq(CanUsage.LIVE)) + .and(useCan.createdAt.goe(startDate)) + .and(useCan.createdAt.loe(endDate)) + ) .groupBy(member.id) .fetch() .size @@ -258,6 +264,12 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { .innerJoin(liveRoom.member, member) .leftJoin(creatorSettlementRatio) .on(member.id.eq(creatorSettlementRatio.member.id)) + .where( + useCan.isRefund.isFalse + .and(useCan.canUsage.eq(CanUsage.LIVE)) + .and(useCan.createdAt.goe(startDate)) + .and(useCan.createdAt.loe(endDate)) + ) .groupBy(member.id, creatorSettlementRatio.liveSettlementRatio) .orderBy(member.id.desc()) .offset(offset) From 331a1549da6ed34c997c1dcf9534cf7db6fd8f39 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 8 Jul 2024 15:41:51 +0900 Subject: [PATCH 10/12] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EA=B8=B0=EC=A4=80=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20?= =?UTF-8?q?=ED=95=A9=EA=B3=84=20=EC=A0=95=EC=82=B0=20API=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/admin/calculate/AdminCalculateQueryRepository.kt | 2 -- 1 file changed, 2 deletions(-) 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 8c01312..78c0222 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 @@ -235,7 +235,6 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { .on(member.id.eq(creatorSettlementRatio.member.id)) .where( useCan.isRefund.isFalse - .and(useCan.canUsage.eq(CanUsage.LIVE)) .and(useCan.createdAt.goe(startDate)) .and(useCan.createdAt.loe(endDate)) ) @@ -266,7 +265,6 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { .on(member.id.eq(creatorSettlementRatio.member.id)) .where( useCan.isRefund.isFalse - .and(useCan.canUsage.eq(CanUsage.LIVE)) .and(useCan.createdAt.goe(startDate)) .and(useCan.createdAt.loe(endDate)) ) From 586db3f008c09be610fbd399c708c3e2ea034981 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 8 Jul 2024 16:11:42 +0900 Subject: [PATCH 11/12] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EA=B8=B0=EC=A4=80=20=EC=BD=98=ED=85=90=EC=B8=A0=20?= =?UTF-8?q?=ED=95=A9=EA=B3=84=20=EC=A0=95=EC=82=B0=20API=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calculate/AdminCalculateController.kt | 14 +++++ .../AdminCalculateQueryRepository.kt | 54 ++++++++++++++++++- .../admin/calculate/AdminCalculateService.kt | 21 +++++++- ...orItem.kt => GetCalculateByCreatorItem.kt} | 2 +- ...a.kt => GetCalculateByCreatorQueryData.kt} | 6 +-- .../GetCalculateByCreatorResponse.kt | 6 +++ .../GetCalculateLiveByCreatorResponse.kt | 6 --- 7 files changed, 95 insertions(+), 14 deletions(-) rename src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/{GetCalculateLiveByCreatorItem.kt => GetCalculateByCreatorItem.kt} (92%) rename src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/{GetCalculateLiveByCreatorQueryData.kt => GetCalculateByCreatorQueryData.kt} (88%) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateByCreatorResponse.kt delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorResponse.kt 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 35bf0a4..36655ae 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 @@ -62,4 +62,18 @@ class AdminCalculateController(private val service: AdminCalculateService) { pageable.pageSize.toLong() ) ) + + @GetMapping("/content-by-creator") + fun getCalculateContentByCreator( + @RequestParam startDateStr: String, + @RequestParam endDateStr: String, + pageable: Pageable + ) = ApiResponse.ok( + service.getCalculateContentByCreator( + 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 78c0222..8450c45 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 @@ -248,10 +248,10 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { endDate: LocalDateTime, offset: Long, limit: Long - ): List { + ): List { return queryFactory .select( - QGetCalculateLiveByCreatorQueryData( + QGetCalculateByCreatorQueryData( member.email, member.nickname, useCan.can.add(useCan.rewardCan).sum(), @@ -274,4 +274,54 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { .limit(limit) .fetch() } + + fun getCalculateContentByCreatorTotalCount(startDate: LocalDateTime, endDate: LocalDateTime): Int { + return queryFactory + .select(member.id) + .from(order) + .innerJoin(order.audioContent, audioContent) + .innerJoin(audioContent.member, member) + .leftJoin(creatorSettlementRatio) + .on(member.id.eq(creatorSettlementRatio.member.id)) + .where( + order.createdAt.goe(startDate) + .and(order.createdAt.loe(endDate)) + .and(order.isActive.isTrue) + ) + .groupBy(member.id) + .fetch() + .size + } + + fun getCalculateContentByCreator( + startDate: LocalDateTime, + endDate: LocalDateTime, + offset: Long, + limit: Long + ): List { + return queryFactory + .select( + QGetCalculateByCreatorQueryData( + member.email, + member.nickname, + order.can.sum(), + creatorSettlementRatio.contentSettlementRatio + ) + ) + .from(order) + .innerJoin(order.audioContent, audioContent) + .innerJoin(audioContent.member, member) + .leftJoin(creatorSettlementRatio) + .on(member.id.eq(creatorSettlementRatio.member.id)) + .where( + order.createdAt.goe(startDate) + .and(order.createdAt.loe(endDate)) + .and(order.isActive.isTrue) + ) + .groupBy(member.id) + .orderBy(member.id.desc()) + .offset(offset) + .limit(limit) + .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 985cd5a..b0cf463 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 @@ -101,8 +101,25 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor val totalCount = repository.getCalculateLiveByCreatorTotalCount(startDate, endDate) val items = repository .getCalculateLiveByCreator(startDate, endDate, offset, limit) - .map { it.toGetCalculateLiveByCreator() } + .map { it.toGetCalculateByCreator() } - GetCalculateLiveByCreatorResponse(totalCount, items) + GetCalculateByCreatorResponse(totalCount, items) + } + + fun getCalculateContentByCreator( + startDateStr: String, + endDateStr: String, + offset: Long, + limit: Long + ) = run { + val startDate = startDateStr.convertLocalDateTime() + val endDate = endDateStr.convertLocalDateTime(hour = 23, minute = 59, second = 59) + + val totalCount = repository.getCalculateContentByCreatorTotalCount(startDate, endDate) + val items = repository + .getCalculateContentByCreator(startDate, endDate, offset, limit) + .map { it.toGetCalculateByCreator() } + + GetCalculateByCreatorResponse(totalCount, items) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorItem.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateByCreatorItem.kt similarity index 92% rename from src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorItem.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateByCreatorItem.kt index 4d87621..6b33b29 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorItem.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateByCreatorItem.kt @@ -2,7 +2,7 @@ package kr.co.vividnext.sodalive.admin.calculate import com.fasterxml.jackson.annotation.JsonProperty -data class GetCalculateLiveByCreatorItem( +data class GetCalculateByCreatorItem( @JsonProperty("email") val email: String, @JsonProperty("nickname") val nickname: String, @JsonProperty("totalCan") val totalCan: Int, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorQueryData.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateByCreatorQueryData.kt similarity index 88% rename from src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorQueryData.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateByCreatorQueryData.kt index 5e1bb86..e392da5 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorQueryData.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateByCreatorQueryData.kt @@ -4,13 +4,13 @@ import com.querydsl.core.annotations.QueryProjection import java.math.BigDecimal import java.math.RoundingMode -data class GetCalculateLiveByCreatorQueryData @QueryProjection constructor( +data class GetCalculateByCreatorQueryData @QueryProjection constructor( val email: String, val nickname: String, val totalCan: Int, val settlementRatio: Int? ) { - fun toGetCalculateLiveByCreator(): GetCalculateLiveByCreatorItem { + fun toGetCalculateByCreator(): GetCalculateByCreatorItem { // 원화 = totalCoin * 100 ( 캔 1개 = 100원 ) val totalKrw = BigDecimal(totalCan).multiply(BigDecimal(100)) @@ -30,7 +30,7 @@ data class GetCalculateLiveByCreatorQueryData @QueryProjection constructor( // 입금액 val depositAmount = settlementAmount.subtract(tax) - return GetCalculateLiveByCreatorItem( + return GetCalculateByCreatorItem( email = email, nickname = nickname, totalCan = totalCan, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateByCreatorResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateByCreatorResponse.kt new file mode 100644 index 0000000..49036e3 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateByCreatorResponse.kt @@ -0,0 +1,6 @@ +package kr.co.vividnext.sodalive.admin.calculate + +data class GetCalculateByCreatorResponse( + val totalCount: Int, + val items: List +) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorResponse.kt deleted file mode 100644 index cd93b59..0000000 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveByCreatorResponse.kt +++ /dev/null @@ -1,6 +0,0 @@ -package kr.co.vividnext.sodalive.admin.calculate - -data class GetCalculateLiveByCreatorResponse( - val totalCount: Int, - val items: List -) From dbc5d6c31e3608a5180f6fe83b138556729fca7e Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 8 Jul 2024 21:39:30 +0900 Subject: [PATCH 12/12] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EA=B8=B0=EC=A4=80=20=EC=BB=A4=EB=AE=A4=EB=8B=88?= =?UTF-8?q?=ED=8B=B0=20=ED=95=A9=EA=B3=84=20=EC=A0=95=EC=82=B0=20API=20?= =?UTF-8?q?=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 | 52 +++++++++++++++++++ .../admin/calculate/AdminCalculateService.kt | 17 ++++++ 3 files changed, 83 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 36655ae..ddcb051 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 @@ -76,4 +76,18 @@ class AdminCalculateController(private val service: AdminCalculateService) { pageable.pageSize.toLong() ) ) + + @GetMapping("/community-by-creator") + fun getCalculateCommunityByCreator( + @RequestParam startDateStr: String, + @RequestParam endDateStr: String, + pageable: Pageable + ) = ApiResponse.ok( + service.getCalculateCommunityByCreator( + 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 8450c45..6a45e4a 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 @@ -324,4 +324,56 @@ class AdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { .limit(limit) .fetch() } + + fun getCalculateCommunityByCreatorTotalCount(startDate: LocalDateTime, endDate: LocalDateTime): Int { + return queryFactory + .select(member.id) + .from(useCan) + .innerJoin(useCan.communityPost, creatorCommunity) + .innerJoin(creatorCommunity.member, member) + .leftJoin(creatorSettlementRatio) + .on(member.id.eq(creatorSettlementRatio.member.id)) + .where( + useCan.isRefund.isFalse + .and(useCan.canUsage.eq(CanUsage.PAID_COMMUNITY_POST)) + .and(useCan.createdAt.goe(startDate)) + .and(useCan.createdAt.loe(endDate)) + ) + .groupBy(member.id) + .fetch() + .size + } + + fun getCalculateCommunityByCreator( + startDate: LocalDateTime, + endDate: LocalDateTime, + offset: Long, + limit: Long + ): List { + return queryFactory + .select( + QGetCalculateByCreatorQueryData( + member.email, + member.nickname, + useCan.can.add(useCan.rewardCan).sum(), + creatorSettlementRatio.communitySettlementRatio + ) + ) + .from(useCan) + .innerJoin(useCan.communityPost, creatorCommunity) + .innerJoin(creatorCommunity.member, member) + .leftJoin(creatorSettlementRatio) + .on(member.id.eq(creatorSettlementRatio.member.id)) + .where( + useCan.isRefund.isFalse + .and(useCan.canUsage.eq(CanUsage.PAID_COMMUNITY_POST)) + .and(useCan.createdAt.goe(startDate)) + .and(useCan.createdAt.loe(endDate)) + ) + .groupBy(member.id, creatorSettlementRatio.communitySettlementRatio) + .orderBy(member.id.desc()) + .offset(offset) + .limit(limit) + .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 b0cf463..255d456 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 @@ -122,4 +122,21 @@ class AdminCalculateService(private val repository: AdminCalculateQueryRepositor GetCalculateByCreatorResponse(totalCount, items) } + + fun getCalculateCommunityByCreator( + startDateStr: String, + endDateStr: String, + offset: Long, + limit: Long + ) = run { + val startDate = startDateStr.convertLocalDateTime() + val endDate = endDateStr.convertLocalDateTime(hour = 23, minute = 59, second = 59) + + val totalCount = repository.getCalculateCommunityByCreatorTotalCount(startDate, endDate) + val items = repository + .getCalculateCommunityByCreator(startDate, endDate, offset, limit) + .map { it.toGetCalculateByCreator() } + + GetCalculateByCreatorResponse(totalCount, items) + } }