Skip to content

Commit

Permalink
bus history fixed, design fixed
Browse files Browse the repository at this point in the history
  • Loading branch information
Brian0KIM committed Nov 29, 2024
1 parent 89a9319 commit 110cbde
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 35 deletions.
51 changes: 33 additions & 18 deletions back/database/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -891,62 +891,77 @@ async function getPastBusArrival(routeId, stationId, staOrder, date, onlySevenDa
try {
const cache = await loadCache();
const requestDate = DateTime.fromISO(date);
const cacheKey = `${routeId}-${stationId}-${staOrder}-${date}`;

if (cache[cacheKey]) {
return {
ok: true,
data: cache[cacheKey],
source: 'cache'
};
}

let datesToFetch = onlySevenDays ? [-7] : (() => {
const weekday = requestDate.weekday;
switch (weekday) {
case 1: // 월요일
return [-3, -7];
case 2: // 화요일
return [-1, -7];
case 3: // 수요일
case 4: // 목요일
case 5: // 금요일
return [-1, -2, -7];
case 6: // 토요일
case 7: // 일요일
return [-7];
default:
return [-7];
}
})();

const datesToFetch = onlySevenDays
? [-7]
: (requestDate.weekday >= 6 ? [-7] : [-1, -2, -7]);
let allResults = [];
let isAllFromCache = true; // 모든 데이터가 캐시에서 왔는지 확인하는 플래그

for (const dayOffset of datesToFetch) {
const targetDate = requestDate.plus({ days: dayOffset }).toFormat('yyyy-MM-dd');
const cacheKey = `${routeId}-${stationId}-${staOrder}-${targetDate}`;

// 캐시 확인
if (cache[cacheKey]) {
console.log(`캐시 데이터 사용: ${cacheKey}`);
allResults = allResults.concat(cache[cacheKey]);
continue;
}

isAllFromCache = false; // API 호출이 필요한 경우
console.log(`API 호출 필요: ${cacheKey}`);

if (lastApiCall) {
const timeSinceLastCall = Date.now() - lastApiCall;
if (timeSinceLastCall < API_CALL_INTERVAL) {
await new Promise(resolve => setTimeout(resolve, API_CALL_INTERVAL - timeSinceLastCall));
}
}

// specialRouteMappingFullPath 확인
const specialConfig = specialRouteMappingFullPath[stationId]?.[routeId];
const actualStationId = specialConfig ? specialConfig.referenceStationId : stationId;
const actualStaOrder = specialConfig ? (Number(staOrder) - specialConfig.staOrderOffset).toString() : staOrder;

// 실제 API 호출
const busArrivalList = await fetchBusHistory(routeId, actualStationId, actualStaOrder, targetDate);
lastApiCall = Date.now();

if (busArrivalList && busArrivalList.length > 0) {
// specialRouteMapping 적용
const mappedData = applySpecialRouteMapping(busArrivalList, stationId, routeId);
cache[cacheKey] = mappedData;
allResults = allResults.concat(mappedData);
}
}

cache[cacheKey] = allResults;
await saveCache(cache);

return {
ok: true,
data: allResults,
source: 'api'
source: isAllFromCache ? 'cache' : 'api'
};

} catch (error) {
console.error('과거 버스 기록 조회 실패:', error);
throw error;
}
}

function applySpecialRouteMapping(data, stationId, routeId) {
// specialRouteMappingFullPath 적용 로직
const mappedData = data.map(item => {
Expand Down
27 changes: 10 additions & 17 deletions front/lib/station_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,16 @@ class _StationScreenState extends State<StationScreen> {
// 정류장 데이터
final Map<String, List<Map<String, String>>> stationData = {
'ascending': [ // 정문 방향
{'name': '사색의 광장', 'description': ''},
{'name': '생명과학대.산업대학', 'description': '정문행'},
{'name': '경희대체육대학.외대', 'description': '정문행'},
{'name': '경희대학교(정건)', 'description': '정문행'},
{'name': '사색의 광장', 'description': 'ⓘ 정문 방향(29059)'},
{'name': '생명과학대.산업대학', 'description': 'ⓘ 정문 방향(29050)'},
{'name': '경희대체육대학.외대', 'description': 'ⓘ 정문 방향(29044)'},
{'name': '경희대학교(정건)', 'description': 'ⓘ 정문 방향(04241)'},
],
'descending': [ // 사색 방향
{'name': '경희대정문', 'description': '사색행'},
{'name': '외국어대학', 'description': '사색행'},
{'name': '생명과학대', 'description': '사색행'},
{'name': '사색의광장', 'description': '사색행'},
{'name': '경희대정문', 'description': 'ⓘ 사색 방향(29038)'},
{'name': '외국어대학', 'description': 'ⓘ 사색 방향(29040)'},
{'name': '생명과학대', 'description': 'ⓘ 사색 방향(29049)'},
{'name': '사색의광장', 'description': 'ⓘ 사색 방향(29057)'},
],
};

Expand All @@ -49,19 +49,12 @@ class _StationScreenState extends State<StationScreen> {
),
SizedBox(height: 4),
Text(
'M5107과 1560은 서울대학교 학기 시 서울 지역과 교대역 방면을 경유합니다.',
'M5107과 1560은 교내 버스 이동 시간을 고려하여 보정된 버스 도착 정보를 제공합니다.',
style: TextStyle(
color: Colors.grey,
fontSize: 12,
),
),
Text(
'버스 도착 정보 시간은 평균 운행 시간과 시간대별 패턴으로 예측한 결과입니다.',
style: TextStyle(
color: Colors.grey,
fontSize: 12,
),
),
],
),
),
Expand Down Expand Up @@ -173,7 +166,7 @@ class _StationScreenState extends State<StationScreen> {
onPressed: () {
// TODO: 버스 도착 예정 시간 기능 구현
},
child: const Text('버스 도착 예정 시간'),
child: const Text('과거 도착 시간'),
),
),
const SizedBox(width: 8),
Expand Down

0 comments on commit 110cbde

Please sign in to comment.