// screens/bi.jsx — 클리닉 운영 BI Dashboard function BIScreen() { const Icons = window.Icons; const [range, setRange] = React.useState("14d"); const maxStaffAvg = Math.max(...STAFF.map(s => s.avg)); return (
10 · 클리닉 운영 BI Dashboard

안양피부과 강남점 — 운영 KPI 통합

상담 전환율·객단가·재방문율·장비 utilization·package mix 등 핵심 운영 지표를 통합 관리하며 peer clinic 대비 benchmark를 제공합니다.

{/* KPI strip */}
{KPIS.map((k, i) => (
))}
{/* Revenue trend */}
실측 목표 라인
}>
₩238M
14일 누적 · ▲ 12.4% vs 전기간
₩17.0M
일평균
₩1.42M
객단가
62.4%
전환율
16)} />
{/* Staff perf */} {STAFF.map((s, i) => ( ))}
실장 상담 전환율 객단가 만족도 패키지 전환
{s.name}
{s.role}
{s.consults}건
{Math.round(s.conv * 100)}%
₩{(s.avg/10000).toFixed(0)}만
{s.sat.toFixed(1)} /5 {Math.round(s.conv * s.consults * 0.6)}건
{/* RIGHT — Package mix, peer compare, funnel */}
{/* Stacked pie via SVG */} {(() => { const data = [ { v: 0.42, c: "var(--phase-tint)" }, { v: 0.28, c: "var(--data-teal)" }, { v: 0.18, c: "var(--data-violet)" }, { v: 0.08, c: "var(--data-amber)" }, { v: 0.04, c: "var(--ink-3)" }, ]; let acc = 0; return data.map((d, i) => { const start = acc * 100; acc += d.v; return ( ); }); })()} 142 패키지
{[ { l: "Pore Control", v: 42, c: "var(--phase-tint)" }, { l: "Anti-aging", v: 28, c: "var(--data-teal)" }, { l: "Acne Care", v: 18, c: "var(--data-violet)" }, { l: "Pigment", v: 8, c: "var(--data-amber)" }, { l: "기타", v: 4, c: "var(--ink-3)" }, ].map((d, i) => (
{d.l} {d.v}%
))}
강남구 동급 클리닉 8개 평균 대비
{[ { l: "객단가", you: 142, peer: 128, unit: "만" }, { l: "전환율", you: 62, peer: 54, unit: "%" }, { l: "재방문율", you: 48, peer: 41, unit: "%" }, { l: "패키지 mix", you: 58, peer: 46, unit: "%" }, { l: "장비 가동률", you: 49, peer: 52, unit: "%" }, ].map((b, i) => { const isBetter = b.you >= b.peer; return (
{b.l} {b.you}{b.unit} {isBetter ? "▲" : "▼"} {Math.abs(b.you - b.peer)}{b.unit}
); })}
{[ { l: "내원", v: 348, pct: 1.0, color: "var(--ink-2)" }, { l: "상담 진행", v: 312, pct: 0.90, color: "var(--data-blue)" }, { l: "패키지 제안", v: 246, pct: 0.71, color: "var(--data-teal)" }, { l: "전환 (결제)", v: 168, pct: 0.48, color: "var(--good)" }, { l: "재방문 (30일)", v: 80, pct: 0.23, color: "var(--phase-tint)" }, ].map((s, i) => (
{s.l}
{Math.round(s.pct * 100)}%
{s.v}
))}
); } window.BIScreen = BIScreen;