// screens/recommend.jsx — 시술 추천 (Primary/Secondary, 3 옵션) + Package bundling
function RecommendScreen({ persona, setRoute }) {
const Icons = window.Icons;
const [mode, setMode] = React.useState("treatment"); // treatment | package
const [selectedTx, setSelectedTx] = React.useState("rf-microneedling");
const [scriptOpen, setScriptOpen] = React.useState(null);
const [activePkg, setActivePkg] = React.useState("pkg-comprehensive");
const tx = TREATMENTS.find(t => t.id === selectedTx) || TREATMENTS[0];
const primary = TREATMENTS.filter(t => t.tier === "primary");
const secondary = TREATMENTS.filter(t => t.tier === "secondary");
const pkg = PACKAGES.find(p => p.id === activePkg);
return (
05 · 시술 추천 · 패키지
개인화 시술 — Primary 2건 · Secondary 2건 추천
환자 배경, 진단 결과, 예산·다운타임 조건과 유사 환자 cohort 데이터를 결합하여 최적 시술 조합과 패키지 옵션을 도출했습니다. AI 추천은 의사 검토 후 최종 확정됩니다.
{mode === "treatment" ? (
{/* LEFT — Treatment list */}
Primary 추천 · 핵심 시술
{primary.map((t, i) =>
setSelectedTx(t.id)}
onScript={() => setScriptOpen(scriptOpen === t.id ? null : t.id)}
scriptOpen={scriptOpen === t.id}
persona={persona} />)}
Secondary · 보조 시술
{secondary.map((t, i) =>
setSelectedTx(t.id)}
onScript={() => setScriptOpen(scriptOpen === t.id ? null : t.id)}
scriptOpen={scriptOpen === t.id}
persona={persona} />)}
{/* RIGHT — Detail + sessions */}
{tx.tier === "primary" ? "Primary" : "Secondary"}
{tx.targetConcern.join(" · ")}
{tx.name}
{tx.category}
회차 옵션
{tx.sessions.map((s, i) => (
{s.count}
회 패키지
{s.badge &&
{s.badge}}
{Math.round(s.count * 1.5)}주 · 회당 ₩{Math.round(s.price / s.count / 1000)}K
₩{(s.price/10000).toFixed(0)}만
₩{(s.original/10000).toFixed(0)}만
))}
AI 근거 (Evidence)
{tx.aiEvidence.studies}
레퍼런스 연구
{tx.aiEvidence.improvement}
평균 개선 폭
{tx.aiEvidence.cohort}
6개월 추적
) : (
// PACKAGE MODE
{PACKAGES.map((p, i) => (
setActivePkg(p.id)}
style={{
cursor: "pointer",
borderColor: activePkg === p.id ? "var(--ink-1)" : "var(--line-hair)",
borderWidth: activePkg === p.id ? 1.5 : 1,
boxShadow: activePkg === p.id ? "0 8px 24px rgba(15,15,17,0.08)" : "var(--shadow-card)",
position: "relative",
}}>
{p.recommended && (
AI 권장
)}
{p.tier}
{p.name}
{p.targets.join(" · ")}
₩{(p.price / 10000).toFixed(0)}만
₩{(p.original / 10000).toFixed(0)}만
-{p.discount}%
{p.sessions}회 · {p.duration} · 회당 평균 ₩{Math.round(p.price / p.sessions / 10000)}만
구성
{p.items.map((item, j) => (
{item}
))}
))}
{/* Package detail */}
예상 일정 (자동 생성)
{/* Timeline */}
{Array.from({ length: pkg.sessions }).map((_, i) => {
const pos = (i / (pkg.sessions - 1)) * 100;
const recommended = i === 2;
return (
W{i * Math.ceil(parseInt(pkg.duration) / pkg.sessions) || 0}
);
})}
예상 결과 (6개월)
{pkg.targets.map((t, i) => (
{t}
+{[38, 30, 24][i] || 22}%
))}
)}
);
}
// Treatment card
function TxCard({ tx, selected, onSelect, onScript, scriptOpen, persona }) {
const Icons = window.Icons;
return (
{tx.targetConcern.join(" · ")}
·
{tx.duration} · 다운타임 {tx.downtime}
{scriptOpen && (
)}
회당 ₩{(tx.pricePerSession/10000).toFixed(0)}만
);
}
window.RecommendScreen = RecommendScreen;