+
+
EVMS 공정/원가 관리
+
+
+
+ {isLoading &&
로딩 중...
}
+
+ {!isLoading && !latest && (
+
+
EVMS 데이터가 없습니다
+
EVMS 재계산 버튼을 눌러 스냅샷을 생성하세요.
+
+ )}
+
+ {latest && (
+ <>
+ {/* Index badges */}
+
+
+
+ 기준일: {latest.snapshot_date}
+
+
+ {/* Progress bars */}
+
+
공정률
+
+
+
+ {/* EVM stats */}
+
+
+
+ latest.ev ? "text-red-600" : "text-green-600"}
+ />
+
+
+
+
+
+
+
+ {/* Chart (simple ASCII-style bar) */}
+ {chart && chart.labels.length > 0 && (
+
+
공정률 추이 (최근 {chart.labels.length}일)
+
+
+ {chart.labels.map((label, i) => (
+
+
+
+
= (chart.planned[i] ?? 0) ? "bg-green-400" : "bg-red-400"}`}
+ style={{ height: `${(chart.actual[i] ?? 0) * 0.8}%` }}
+ />
+
+
+ {label.slice(5)}
+
+
+ ))}
+
+
+ 계획
+ 실적
+
+
+
+ )}
+
+ {/* Forecast + Claim */}
+
+ {forecast && (
+
+
📅 공기 예측
+
{forecast.message}
+ {forecast.predicted_end && (
+
예상 준공일: {forecast.predicted_end}
+ )}
+
+ )}
+ {claim && (
+
+
💰 기성 청구 예측
+
{claim.milestone}
+
+ {(claim.estimated_amount / 1e6).toFixed(1)}백만원 ({claim.pct}%)
+
+
{claim.note}
+
+ )}
+
+ >
+ )}
+
+
+ );
+}
diff --git a/frontend/src/app/projects/[id]/page.tsx b/frontend/src/app/projects/[id]/page.tsx
index 79de9e1..1a01b5e 100644
--- a/frontend/src/app/projects/[id]/page.tsx
+++ b/frontend/src/app/projects/[id]/page.tsx
@@ -14,6 +14,10 @@ const TABS = [
{ id: "quality", label: "✅ 품질시험", href: (id: string) => `/projects/${id}/quality` },
{ id: "weather", label: "🌤 날씨", href: (id: string) => `/projects/${id}/weather` },
{ id: "permits", label: "🏛 인허가", href: (id: string) => `/projects/${id}/permits` },
+ { id: "agents", label: "🤖 AI 에이전트", href: (id: string) => `/projects/${id}/agents` },
+ { id: "evms", label: "📊 EVMS", href: (id: string) => `/projects/${id}/evms` },
+ { id: "vision", label: "👁 Vision AI", href: (id: string) => `/projects/${id}/vision` },
+ { id: "completion", label: "📦 준공도서", href: (id: string) => `/projects/${id}/completion` },
];
export default function ProjectDetailPage() {
@@ -60,7 +64,7 @@ export default function ProjectDetailPage() {
{/* Module Tabs */}
-