Skip to content

Commit 3d79ea1

Browse files
committed
feat: 경로 사이의 이동 거리를 고려한 탑승 시간 구현
1 parent 351cf46 commit 3d79ea1

File tree

5 files changed

+60
-5
lines changed

5 files changed

+60
-5
lines changed

domain/src/main/java/com/stop/domain/model/route/TransportIdRequest.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ data class TransportIdRequest(
1515
val term: Int, // 배차 간격, 서울 버스는 노선을 구하는 과정에서 얻을 수 있기 때문에 넣음
1616
val destinationStation: Place,
1717
val destinationStationId: String,
18+
val sectionTime: Int,
19+
val cumulativeSectionTime: Int,
1820
) {
1921
fun changeStartStationId(newStationId: String): TransportIdRequest {
2022
return TransportIdRequest(
@@ -29,6 +31,8 @@ data class TransportIdRequest(
2931
term = term,
3032
destinationStation = destinationStation,
3133
destinationStationId = destinationStationId,
34+
sectionTime = sectionTime,
35+
cumulativeSectionTime = cumulativeSectionTime,
3236
)
3337
}
3438

@@ -45,6 +49,8 @@ data class TransportIdRequest(
4549
term = term,
4650
destinationStation = destinationStation,
4751
destinationStationId = newDestinationStationId,
52+
sectionTime = sectionTime,
53+
cumulativeSectionTime = cumulativeSectionTime,
4854
)
4955
}
5056

@@ -61,6 +67,8 @@ data class TransportIdRequest(
6167
term = newTerm ?: term,
6268
destinationStation = destinationStation,
6369
destinationStationId = destinationStationId,
70+
sectionTime = sectionTime,
71+
cumulativeSectionTime = cumulativeSectionTime,
6472
)
6573
}
6674
}

domain/src/main/java/com/stop/domain/model/route/TransportLastTime.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ data class TransportLastTime(
66
val transportMoveType : TransportMoveType,
77
val area : Area,
88
val lastTime: String,
9+
val timeToBoard: String,
910
val destinationStationName: String,
1011
val stationsUntilStart: List<TransportStation>,
1112
val enableDestinationStation: List<TransportStation>,

domain/src/main/java/com/stop/domain/usecase/route/GetLastTransportTimeUseCaseImpl.kt

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ internal class GetLastTransportTimeUseCaseImpl @Inject constructor(
116116

117117
// 승차지, 도착지, 고유 번호를 알아내는데 필요한 정보로만 구성된 데이터 클래스로 변환하기
118118
private suspend fun createTransportIdRequests(itinerary: Itinerary): List<TransportIdRequest?> {
119+
var cumulativeSectionTime = 0
120+
119121
return itinerary.routes.fold(listOf()) { transportIdRequests, route ->
120122
when (route) {
121123
is WalkRoute -> transportIdRequests + null
@@ -124,6 +126,9 @@ internal class GetLastTransportTimeUseCaseImpl @Inject constructor(
124126
val transportMoveType = TransportMoveType.getMoveTypeByName(route.mode.name)
125127
?: return@fold transportIdRequests
126128

129+
val sectionTime = route.sectionTime.toInt()
130+
cumulativeSectionTime += sectionTime
131+
127132
transportIdRequests + TransportIdRequest(
128133
transportMoveType = transportMoveType,
129134
stationId = startStation.stationId,
@@ -136,6 +141,8 @@ internal class GetLastTransportTimeUseCaseImpl @Inject constructor(
136141
term = NOT_YET_CALCULATED,
137142
destinationStation = route.end,
138143
destinationStationId = UNKNOWN_ID,
144+
sectionTime = sectionTime,
145+
cumulativeSectionTime = cumulativeSectionTime,
139146
)
140147
}
141148
else -> transportIdRequests + null
@@ -232,6 +239,10 @@ internal class GetLastTransportTimeUseCaseImpl @Inject constructor(
232239
transportMoveType = transportIdRequest.transportMoveType,
233240
area = transportIdRequest.area,
234241
lastTime = result,
242+
timeToBoard = subtractSectionTimeFromLastTime(
243+
transportIdRequest.cumulativeSectionTime,
244+
result
245+
),
235246
destinationStationName = transportIdRequest.destinationStation.name,
236247
stationsUntilStart = stationsUntilStart.map {
237248
TransportStation(
@@ -250,6 +261,19 @@ internal class GetLastTransportTimeUseCaseImpl @Inject constructor(
250261
)
251262
}
252263

264+
private fun subtractSectionTimeFromLastTime(sectionTime: Int, lastTime: String): String {
265+
val (hour, minute, second) = lastTime.split(":").map { it.toInt() }
266+
val lastTimeSecond = hour * 60 * 60 + minute * 60 + second
267+
268+
val realLastTimeSecond = lastTimeSecond - sectionTime
269+
270+
val realHour = realLastTimeSecond / 60 / 60
271+
val realMinute = ((realLastTimeSecond / 60) % 60).toString().padStart(TIME_DIGIT, '0')
272+
val realSeconds = (realLastTimeSecond % 60).toString().padStart(TIME_DIGIT, '0')
273+
274+
return "$realHour:$realMinute:$realSeconds"
275+
}
276+
253277
private fun checkInnerOrOuter(
254278
stationType: Int,
255279
startStationIndex: Int,
@@ -335,10 +359,16 @@ internal class GetLastTransportTimeUseCaseImpl @Inject constructor(
335359
lastTime += TIME_CORRECTION_VALUE
336360
}
337361

362+
val lastTimeString = lastTime.toString().chunked(2).joinToString(":")
363+
338364
return TransportLastTime(
339365
transportMoveType = TransportMoveType.BUS,
340366
area = Area.SEOUL,
341-
lastTime = lastTime.toString().chunked(2).joinToString(":"),
367+
lastTime = lastTimeString,
368+
timeToBoard = subtractSectionTimeFromLastTime(
369+
transportIdRequest.cumulativeSectionTime,
370+
lastTimeString
371+
),
342372
destinationStationName = transportIdRequest.destinationStation.name,
343373
stationsUntilStart = listOf(),
344374
enableDestinationStation = listOf(),
@@ -389,6 +419,10 @@ internal class GetLastTransportTimeUseCaseImpl @Inject constructor(
389419
area = newTransportIdRequest.area,
390420
transportDirectionType = directionType,
391421
lastTime = time,
422+
timeToBoard = subtractSectionTimeFromLastTime(
423+
newTransportIdRequest.cumulativeSectionTime,
424+
time
425+
),
392426
destinationStationName = newTransportIdRequest.destinationStation.name,
393427
stationsUntilStart = stationsUntilStart,
394428
enableDestinationStation = listOf(),
@@ -435,6 +469,10 @@ internal class GetLastTransportTimeUseCaseImpl @Inject constructor(
435469
area = transportIdRequest.area,
436470
transportDirectionType = directionType,
437471
lastTime = time,
472+
timeToBoard = subtractSectionTimeFromLastTime(
473+
transportIdRequest.cumulativeSectionTime,
474+
time
475+
),
438476
destinationStationName = transportIdRequest.destinationStation.name,
439477
stationsUntilStart = stationsUntilStart,
440478
enableDestinationStation = listOf(),
@@ -459,10 +497,16 @@ internal class GetLastTransportTimeUseCaseImpl @Inject constructor(
459497
lastTime += TIME_CORRECTION_VALUE
460498
}
461499

500+
val lastTimeString = lastTime.toString().chunked(2).joinToString(":")
501+
462502
return TransportLastTime(
463503
transportMoveType = TransportMoveType.BUS,
464504
area = Area.SEOUL,
465-
lastTime = lastTime.toString().chunked(2).joinToString(":"),
505+
lastTime = lastTimeString,
506+
timeToBoard = subtractSectionTimeFromLastTime(
507+
newTransportIdRequest.cumulativeSectionTime,
508+
lastTimeString
509+
),
466510
destinationStationName = transportIdRequest.destinationStation.name,
467511
stationsUntilStart = listOf(),
468512
enableDestinationStation = listOf(),
@@ -683,6 +727,7 @@ internal class GetLastTransportTimeUseCaseImpl @Inject constructor(
683727
private const val KOREA_LONGITUDE = 127
684728
private const val KOREA_LATITUDE = 37
685729
private const val CORRECTION_VALUE = 100_000
730+
private const val TIME_DIGIT = 2
686731

687732
private const val EMPIRICAL_DISTINCTION = 20
688733

presentation/src/main/java/com/stop/ui/mission/MissionViewModel.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ class MissionViewModel @Inject constructor(
109109
),
110110
enableDestinationStation = listOf(),
111111
transportDirectionType = TransportDirectionType.TO_END,
112-
routeId = "118900001"
112+
routeId = "118900001",
113+
timeToBoard = "23:40:50",
113114
)
114115
startMission()
115116
}

presentation/src/main/java/com/stop/ui/route/RouteViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class RouteViewModel @Inject constructor(
4040
val lastTimeResponse: LiveData<Event<List<TransportLastTime?>>>
4141
get() = _lastTimeResponse
4242

43-
var lastTimes = mutableListOf<String?>()
43+
var lastTimes: List<TransportLastTime?>? = null
4444

4545
private val _errorMessage = MutableLiveData<Event<ErrorType>>()
4646
val errorMessage: LiveData<Event<ErrorType>>
@@ -77,7 +77,7 @@ class RouteViewModel @Inject constructor(
7777
fun calculateLastTransportTime(itinerary: Itinerary) {
7878
checkClickedItinerary(itinerary)
7979
viewModelScope.launch {
80-
this@RouteViewModel._lastTimeResponse.value = Event(getLastTransportTimeUseCase(itinerary))
80+
this@RouteViewModel._lastTimeResponse.value = Event(getLastTransportTimeUseCase(itinerary) )
8181
}
8282
}
8383

0 commit comments

Comments
 (0)