From f6e9c6d0103cb8f4a74d21cbde85b7ad0eac324b Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 3 Oct 2023 23:58:16 +0900 Subject: [PATCH 1/2] =?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=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EB=B8=8C=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 --- .../CreatorAdminCalculateController.kt | 26 +++++++ .../CreatorAdminCalculateQueryRepository.kt | 61 +++++++++++++++ .../calculate/CreatorAdminCalculateService.kt | 75 +++++++++++++++++++ 3 files changed, 162 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateController.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateQueryRepository.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt 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 new file mode 100644 index 0000000..6c9266c --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateController.kt @@ -0,0 +1,26 @@ +package kr.co.vividnext.sodalive.creator.admin.calculate + +import kr.co.vividnext.sodalive.common.ApiResponse +import kr.co.vividnext.sodalive.common.SodaException +import kr.co.vividnext.sodalive.member.Member +import org.springframework.security.access.prepost.PreAuthorize +import org.springframework.security.core.annotation.AuthenticationPrincipal +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.RestController + +@RestController +@PreAuthorize("hasRole('CREATOR')") +@RequestMapping("/creator-admin/calculate") +class CreatorAdminCalculateController(private val service: CreatorAdminCalculateService) { + @GetMapping("/live") + fun getCalculateLive( + @RequestParam startDateStr: String, + @RequestParam endDateStr: String, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + ApiResponse.ok(service.getCalculateLive(startDateStr, endDateStr, member)) + } +} 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 new file mode 100644 index 0000000..bf35b5e --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateQueryRepository.kt @@ -0,0 +1,61 @@ +package kr.co.vividnext.sodalive.creator.admin.calculate + +import com.querydsl.core.types.dsl.Expressions +import com.querydsl.jpa.impl.JPAQueryFactory +import kr.co.vividnext.sodalive.admin.calculate.GetCalculateLiveQueryData +import kr.co.vividnext.sodalive.admin.calculate.QGetCalculateLiveQueryData +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 +import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom +import kr.co.vividnext.sodalive.member.QMember.member +import org.springframework.stereotype.Repository +import java.time.LocalDateTime + +@Repository +class CreatorAdminCalculateQueryRepository(private val queryFactory: JPAQueryFactory) { + fun getCalculateLive( + startDate: LocalDateTime, + endDate: LocalDateTime, + memberId: Long + ): List { + val formattedDate = Expressions.stringTemplate( + "DATE_FORMAT({0}, {1})", + Expressions.dateTimeTemplate( + LocalDateTime::class.java, + "CONVERT_TZ({0},{1},{2})", + liveRoom.beginDateTime, + "UTC", + "Asia/Seoul" + ), + "%Y-%m-%d" + ) + + return queryFactory + .select( + QGetCalculateLiveQueryData( + member.email, + member.nickname, + formattedDate, + liveRoom.title, + liveRoom.price, + useCan.canUsage, + useCanCalculate.id.count(), + useCanCalculate.can.sum() + ) + ) + .from(useCanCalculate) + .innerJoin(useCanCalculate.useCan, useCan) + .innerJoin(useCan.room, liveRoom) + .innerJoin(liveRoom.member, member) + .where( + useCanCalculate.status.eq(UseCanCalculateStatus.RECEIVED) + .and(useCanCalculate.recipientCreatorId.eq(memberId)) + .and(liveRoom.beginDateTime.goe(startDate)) + .and(liveRoom.beginDateTime.loe(endDate)) + ) + .groupBy(liveRoom.id, useCan.canUsage) + .orderBy(formattedDate.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 new file mode 100644 index 0000000..636db1f --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/calculate/CreatorAdminCalculateService.kt @@ -0,0 +1,75 @@ +package kr.co.vividnext.sodalive.creator.admin.calculate + +import kr.co.vividnext.sodalive.admin.calculate.GetCalculateLiveResponse +import kr.co.vividnext.sodalive.can.use.CanUsage +import kr.co.vividnext.sodalive.member.Member +import org.springframework.stereotype.Service +import java.time.LocalDate +import java.time.ZoneId +import java.time.format.DateTimeFormatter +import kotlin.math.roundToInt + +@Service +class CreatorAdminCalculateService(private val repository: CreatorAdminCalculateQueryRepository) { + fun getCalculateLive(startDateStr: String, endDateStr: String, member: Member): List { + val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + val startDate = LocalDate.parse(startDateStr, dateTimeFormatter).atTime(0, 0, 0) + .atZone(ZoneId.of("Asia/Seoul")) + .withZoneSameInstant(ZoneId.of("UTC")) + .toLocalDateTime() + + val endDate = LocalDate.parse(endDateStr, dateTimeFormatter).atTime(23, 59, 59) + .atZone(ZoneId.of("Asia/Seoul")) + .withZoneSameInstant(ZoneId.of("UTC")) + .toLocalDateTime() + + return repository + .getCalculateLive(startDate, endDate, member.id!!) + .asSequence() + .map { + val canUsageStr = if (it.canUsage == CanUsage.LIVE) { + "유료" + } else { + "후원" + } + + val numberOfPeople = if (it.canUsage == CanUsage.LIVE) { + it.memberCount.toInt() + } else { + 0 + } + + // 원화 = totalCoin * 100 ( 캔 1개 = 100원 ) + val totalKrw = it.totalAmount * 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 + + GetCalculateLiveResponse( + email = it.email, + nickname = it.nickname, + date = it.date, + title = it.title, + entranceFee = it.entranceFee, + canUsageStr = canUsageStr, + numberOfPeople = numberOfPeople, + totalAmount = it.totalAmount, + totalKrw = totalKrw, + paymentFee = paymentFee.roundToInt(), + settlementAmount = settlementAmount.roundToInt(), + tax = tax.roundToInt(), + depositAmount = depositAmount.roundToInt() + ) + } + .toList() + } +} -- 2.40.1 From 75efb564fc3d14e895f771b992dd4aa320026c4b Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 4 Oct 2023 11:22:41 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EC=98=88=EC=95=BD=20=ED=9B=84=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EB=B8=8C=20=EC=A1=B0=EA=B1=B4=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?-=20=EC=B1=84=EB=84=90=20=EC=9D=B4=EB=A6=84=EC=9D=B4=20?= =?UTF-8?q?=EC=97=86=EB=8A=94=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=EB=A7=8C=20?= =?UTF-8?q?=EC=B7=A8=EC=86=8C=EB=90=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 --- .../sodalive/admin/live/AdminLiveRoomQueryRepository.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveRoomQueryRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveRoomQueryRepository.kt index 3b435c9..ddd2170 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveRoomQueryRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveRoomQueryRepository.kt @@ -43,8 +43,8 @@ class AdminLiveRoomQueryRepository(private val queryFactory: JPAQueryFactory) { .selectFrom(liveRoom) .where( liveRoom.isActive.isTrue - .and(liveRoom.channelName.isNotNull) - .and(liveRoom.beginDateTime.loe(LocalDateTime.now().minusHours(12))) + .and(liveRoom.channelName.isNull) + .and(liveRoom.beginDateTime.loe(LocalDateTime.now().minusHours(4))) ) .fetch() } -- 2.40.1