fix(agent-ratio): 정산 비율 목록을 current history 구조로 정리한다
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user