import { useState } from "react"; import { Code, AlertCircle, Wand2, ShieldCheck, CheckCircle2, ClipboardList, Download, } from "lucide-react"; // Halaman Assist Coding (tanpa tab ICD dan tanpa kolom departemen) // removed unused CodeUsageStats summary interface interface AssistInput { clinicalNotes: string; labResults: string; procedures: string; } interface RecommendedCode { type: "ICD10" | "ICD9CM"; code: string; description: string; confidence: number; rationale: string; } interface InaCbgsMapping { group: string; code: string; description: string; estTariff: number; } interface AssistResult { preprocessed: AssistInput; recommendedCodes: RecommendedCode[]; inaCbgs: InaCbgsMapping | null; references: string[]; } export default function BPJSCode() { const [assistInput, setAssistInput] = useState({ clinicalNotes: "", labResults: "", procedures: "", }); const [assistLoading, setAssistLoading] = useState(false); const [assistError, setAssistError] = useState(null); const [assistResult, setAssistResult] = useState(null); const formatCurrency = (amount: number) => new Intl.NumberFormat("id-ID", { style: "currency", currency: "IDR", minimumFractionDigits: 0, }).format(amount); // (format tanggal untuk tabel dihapus karena halaman hanya Assist Coding) // Mock pipeline: preprocess -> LLM -> RAG -> INA-CBGs mapping const preprocessInput = (input: AssistInput): AssistInput => { const normalize = (s: string) => s.replace(/\s+/g, " ").trim(); return { clinicalNotes: normalize(input.clinicalNotes), labResults: normalize(input.labResults), procedures: normalize(input.procedures), }; }; const mockLLMRecommend = async ( input: AssistInput ): Promise => { const text = `${input.clinicalNotes} ${input.labResults} ${input.procedures}`.toLowerCase(); const recs: RecommendedCode[] = []; if ( text.includes("hipertensi") || text.includes("bp 150/95") || text.includes("tekanan darah") ) { recs.push({ type: "ICD10", code: "I10", description: "Essential (primary) hypertension", confidence: 90, rationale: "Temuan tekanan darah tinggi/hipertensi pada catatan klinis.", }); } if ( text.includes("hba1c") || text.includes("diabetes") || text.includes("glukosa puasa") ) { recs.push({ type: "ICD10", code: "E11", description: "Type 2 diabetes mellitus", confidence: 86, rationale: "Hasil lab HbA1c/glukosa dan kata kunci diabetes terdeteksi.", }); } if ( text.includes("pneumonia") || text.includes("infiltrat") || text.includes("nyeri dada batuk demam") ) { recs.push({ type: "ICD10", code: "J18.9", description: "Pneumonia, unspecified organism", confidence: 80, rationale: "Gambaran klinis/temuan imaging mendukung pneumonia.", }); } if ( text.includes("endoskopi") || text.includes("kateterisasi") || text.includes("fiksasi") ) { recs.push({ type: "ICD9CM", code: "45.13", description: "Endoskopi lambung (contoh)", confidence: 72, rationale: "Prosedur terekstrak dari tindakan/operasi.", }); } if (recs.length === 0) { recs.push({ type: "ICD10", code: "R69", description: "Illness, unspecified", confidence: 55, rationale: "Tidak ada sinyal kuat; butuh klarifikasi klinis.", }); } await new Promise((r) => setTimeout(r, 500)); return recs.sort((a, b) => b.confidence - a.confidence).slice(0, 6); }; const mockRAGValidate = async ( recs: RecommendedCode[] ): Promise<{ validated: RecommendedCode[]; references: string[] }> => { // Anggap melakukan pencarian ke referensi nasional (Kemenkes/BPJS) const refs: string[] = recs.map((r) => `Ref:${r.type}:${r.code}`); await new Promise((r) => setTimeout(r, 300)); return { validated: recs, references: refs }; }; const mockMapInaCbgs = async ( recs: RecommendedCode[] ): Promise => { // Mapping sederhana contoh saja const hasPneumonia = recs.some((r) => r.code.startsWith("J18")); const hasDM = recs.some((r) => r.code.startsWith("E11")); const mapping: InaCbgsMapping | null = hasPneumonia ? { group: "Respiratory", code: "E-4-13-II", description: "Pneumonia", estTariff: 3500000, } : hasDM ? { group: "Endocrine", code: "E-1-10-I", description: "Diabetes Mellitus", estTariff: 2100000, } : null; await new Promise((r) => setTimeout(r, 300)); return mapping; }; const runAssistPipeline = async () => { setAssistLoading(true); setAssistError(null); setAssistResult(null); try { const pre = preprocessInput(assistInput); const llm = await mockLLMRecommend(pre); const rag = await mockRAGValidate(llm); const ina = await mockMapInaCbgs(rag.validated); setAssistResult({ preprocessed: pre, recommendedCodes: rag.validated, inaCbgs: ina, references: rag.references, }); } catch (e) { console.error(e); setAssistError("Gagal menjalankan Assist Coding. Coba lagi."); } finally { setAssistLoading(false); } }; // Halaman fokus pada Assist Coding return (
{/* Header */}

BPJS Assist Coding

Bantuan penentuan kode ICD dan mapping INA-CBGs berbasis input klinis.

{/* Assist Coding */}