signal-batch/frontend/src/api/gisApi.ts
htlee 4e6e6392c6 fix: 항적 조회 500 에러 + 리플레이 쿼리 무반응 수정
- gisApi: mmsiList → vessels 필드명 백엔드 DTO 일치
- ReplaySetupPanel: datetime 포맷 ISO 'T' 유지 (백엔드 @JsonFormat 호환)
- replayWebSocket: STOMP 에러/응답 로깅 강화

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 15:36:42 +09:00

61 lines
1.5 KiB
TypeScript

import { fetchJson, postJson } from './httpClient.ts'
export interface HaeguBoundary {
haegu_no: number
area_name: string | null
geom_json: string
center_lon: number
center_lat: number
}
/** CompactVesselTrack.java 기준 */
export interface VesselTrackResult {
vesselId: string
nationalCode: string
shipKindCode?: string
shipName?: string
shipType?: string
geometry: number[][]
timestamps: string[] // 백엔드가 문자열 배열로 전송
speeds: number[]
totalDistance?: number
avgSpeed?: number
maxSpeed?: number
pointCount?: number
}
/** RecentVesselPositionDto.java 기준 */
export interface RecentPosition {
mmsi: string
imo?: number
lon: number
lat: number
sog: number
cog: number
shipNm?: string
shipTy?: string
shipKindCode?: string
nationalCode?: string
lastUpdate: string
shipImagePath?: string | null
shipImageCount?: number | null
}
export const gisApi = {
getHaeguBoundaries(): Promise<HaeguBoundary[]> {
return fetchJson('/api/v1/haegu/boundaries')
},
getHaeguTracks(haeguNo: number, hours = 24): Promise<VesselTrackResult[]> {
return fetchJson(`/api/v2/tracks/haegu/${haeguNo}?hours=${hours}`)
},
getVesselTracks(mmsiList: string[], startTime: string, endTime: string): Promise<VesselTrackResult[]> {
return postJson('/api/v2/tracks/vessels', { vessels: mmsiList, startTime, endTime })
},
getRecentPositions(minutes = 10): Promise<RecentPosition[]> {
return fetchJson(`/api/v1/vessels/recent-positions?minutes=${minutes}`)
},
}