fix(agent-ratio): 정산 비율 목록을 current history 구조로 정리한다

This commit is contained in:
2026-04-10 13:50:35 +09:00
parent 17065bb4d1
commit 53f37b93fb
5 changed files with 124 additions and 21 deletions

View File

@@ -7,6 +7,7 @@ import kr.co.vividnext.sodalive.partner.agent.ratio.AgentSettlementRatio
import kr.co.vividnext.sodalive.partner.agent.ratio.AgentSettlementRatioRepository
import kr.co.vividnext.sodalive.partner.agent.ratio.CreateAgentSettlementRatioRequest
import kr.co.vividnext.sodalive.partner.agent.ratio.GetAgentSettlementRatioResponse
import kr.co.vividnext.sodalive.partner.agent.ratio.toGroupedResponseItems
import org.springframework.dao.DataIntegrityViolationException
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
@@ -49,6 +50,7 @@ class AdminAgentSettlementRatioService(
fun getAgentSettlementRatio(offset: Long, limit: Long): GetAgentSettlementRatioResponse {
val totalCount = repository.getAgentSettlementRatioTotalCount()
val items = repository.getAgentSettlementRatio(offset = offset, limit = limit)
.toGroupedResponseItems()
return GetAgentSettlementRatioResponse(totalCount = totalCount, items = items)
}

View File

@@ -13,17 +13,31 @@ interface AgentSettlementRatioRepository :
}
interface AgentSettlementRatioQueryRepository {
fun getAgentSettlementRatio(offset: Long, limit: Long): List<GetAgentSettlementRatioItem>
fun getAgentSettlementRatio(offset: Long, limit: Long): List<GetAgentSettlementRatioRow>
fun getAgentSettlementRatioTotalCount(): Int
}
class AgentSettlementRatioQueryRepositoryImpl(
private val queryFactory: JPAQueryFactory
) : AgentSettlementRatioQueryRepository {
override fun getAgentSettlementRatio(offset: Long, limit: Long): List<GetAgentSettlementRatioItem> {
override fun getAgentSettlementRatio(offset: Long, limit: Long): List<GetAgentSettlementRatioRow> {
val memberIds = queryFactory
.select(member.id)
.from(agentSettlementRatio)
.innerJoin(agentSettlementRatio.member, member)
.groupBy(member.id)
.orderBy(member.id.desc())
.offset(offset)
.limit(limit)
.fetch()
if (memberIds.isEmpty()) {
return emptyList()
}
return queryFactory
.select(
QGetAgentSettlementRatioItem(
QGetAgentSettlementRatioRow(
member.id,
member.nickname,
agentSettlementRatio.settlementRatio,
@@ -33,16 +47,16 @@ class AgentSettlementRatioQueryRepositoryImpl(
)
.from(agentSettlementRatio)
.innerJoin(agentSettlementRatio.member, member)
.orderBy(agentSettlementRatio.id.asc())
.offset(offset)
.limit(limit)
.where(member.id.`in`(memberIds))
.orderBy(member.id.desc(), agentSettlementRatio.effectiveFrom.desc())
.fetch()
}
override fun getAgentSettlementRatioTotalCount(): Int {
return queryFactory
.select(agentSettlementRatio.id.count())
.select(member.id.countDistinct())
.from(agentSettlementRatio)
.innerJoin(agentSettlementRatio.member, member)
.fetchOne()
?.toInt()
?: 0

View File

@@ -8,10 +8,41 @@ data class GetAgentSettlementRatioResponse(
val items: List<GetAgentSettlementRatioItem>
)
data class GetAgentSettlementRatioItem @QueryProjection constructor(
data class GetAgentSettlementRatioItem(
val memberId: Long,
val nickname: String,
val current: GetAgentSettlementRatioHistoryItem?,
val history: List<GetAgentSettlementRatioHistoryItem>
)
data class GetAgentSettlementRatioHistoryItem(
val settlementRatio: Int,
val effectiveFrom: LocalDateTime,
val effectiveTo: LocalDateTime?
)
data class GetAgentSettlementRatioRow @QueryProjection constructor(
val memberId: Long,
val nickname: String,
val settlementRatio: Int,
val effectiveFrom: LocalDateTime,
val effectiveTo: LocalDateTime?
)
fun List<GetAgentSettlementRatioRow>.toGroupedResponseItems(): List<GetAgentSettlementRatioItem> {
return groupBy { it.memberId to it.nickname }
.map { (memberInfo, rows) ->
GetAgentSettlementRatioItem(
memberId = memberInfo.first,
nickname = memberInfo.second,
current = rows.firstOrNull { it.effectiveTo == null }?.toHistoryItem(),
history = rows.filter { it.effectiveTo != null }.map { it.toHistoryItem() }
)
}
}
private fun GetAgentSettlementRatioRow.toHistoryItem() = GetAgentSettlementRatioHistoryItem(
settlementRatio = settlementRatio,
effectiveFrom = effectiveFrom,
effectiveTo = effectiveTo
)