fix: hotfix 동기화 — history/detail candidate_count 안전 처리 #225

병합
htlee hotfix/sync-candidate-count 에서 develop 로 69 commits 를 머지했습니다 2026-04-04 11:05:43 +09:00
3개의 변경된 파일20개의 추가작업 그리고 16개의 파일을 삭제
Showing only changes of commit 15b68bb634 - Show all commits

파일 보기

@ -320,7 +320,7 @@ export function AnalysisStatsPanel({ stats, lastUpdated, isLoading, analysisMap,
{item.mmsi}
</span>
<span style={{ color, fontWeight: 700, fontSize: 10, flexShrink: 0 }}>
{Math.round(item.score * 100)}
{item.score}
</span>
<span style={{ color: '#94a3b8', fontSize: 9, flexShrink: 0 }}></span>
</div>

파일 보기

@ -240,20 +240,24 @@ export function KoreaMap({ ships, allShips, aircraft, satellites, layers, osintF
return classifyFishingZone(s.lat, s.lng).zone !== 'OUTSIDE';
}).slice(0, 200).map(s => (
<Marker key={`illegal-${s.mmsi}`} longitude={s.lng} latitude={s.lat} anchor="center">
<div style={{
width: 20, height: 20, borderRadius: '50%',
border: '2px solid #ef4444',
backgroundColor: 'rgba(239, 68, 68, 0.2)',
animation: 'pulse 2s infinite',
pointerEvents: 'none',
}} />
<div style={{
fontSize: 8, fontWeight: 700, color: '#ef4444',
textShadow: '0 0 2px #000, 0 0 2px #000',
textAlign: 'center', marginTop: -2,
whiteSpace: 'nowrap', pointerEvents: 'none',
}}>
{s.name || s.mmsi}
<div style={{ position: 'relative', pointerEvents: 'none' }}>
{/* 강조 펄스 링 — 선박 아이콘 중앙에 오버레이 */}
<div style={{
width: 24, height: 24, borderRadius: '50%',
border: '2px solid #ef4444',
backgroundColor: 'rgba(239, 68, 68, 0.15)',
animation: 'pulse 2s infinite',
boxShadow: '0 0 8px rgba(239, 68, 68, 0.4)',
}} />
{/* 선박명 — 아이콘 아래 */}
<div style={{
position: 'absolute', top: 26, left: '50%', transform: 'translateX(-50%)',
fontSize: 8, fontWeight: 700, color: '#ef4444',
textShadow: '0 0 2px #000, 0 0 2px #000',
whiteSpace: 'nowrap',
}}>
{s.name || s.mmsi}
</div>
</div>
</Marker>
))}

파일 보기

@ -10,7 +10,7 @@ logger = logging.getLogger(__name__)
def detect_group_clusters(
vessel_snapshots: list[dict],
spatial_eps_nm: float = 10.0,
spatial_eps_nm: float = 3.0,
time_eps_hours: float = 2.0,
min_vessels: int = 3,
) -> dict[int, list[dict]]: