Appearance
HOATIEU Engine
Patient + Need + Medical Context + Contacts + Location + Preferences
│
┌─────▼─────┐
│ Safety │──── cấp cứu ──▶ "Đến khoa Cấp cứu" (dừng, không matching)
└─────┬─────┘
┌─────▼─────┐
│ Intake │ → specialties[], diagnostics[]
└─────┬─────┘
┌─────▼─────┐
│ Matching │ Service Graph → Match[] (score + reasons)
└─────┬─────┘
┌─────▼──────────┐
│ Recommendation │ → nextSteps[], logistics, humanNavigator
└────────────────┘Engine là hàm thuần navigate(input, graph) → Recommendation: không đọc DB, không gọi mạng. API nạp Service Graph rồi gọi engine. Nhờ vậy engine được test bằng dữ liệu giả và kết quả tái lập được (mỗi recommendation lưu engine_version).
Intake
Từ khóa trong mô tả/chẩn đoán → mã chuyên khoa (cardiology, oncology, neurology, …). Trẻ dưới 16 → pediatrics. Không khớp gì → general (khoa khám để được phân luồng). Đây là định tuyến khoa, không phải chẩn đoán.
Matching — điểm số
| Tiêu chí | Điểm |
|---|---|
| Có đúng chuyên khoa (ưu tiên chuyên khoa đầu) | +40 (−5 mỗi bậc) |
| Chuyên khoa gần / khoa tổng quát | +20 / +10 |
| Trẻ em & bệnh viện Nhi | +30 |
| Có dịch vụ chẩn đoán cần thiết | đến +15 |
| Phẫu thuật/nhập viện & có phẫu thuật | +10 |
| Đúng thành phố mong muốn / gần nhà | +25 |
| Cùng miền | +8 · khác miền −15 |
| Ý kiến thứ hai / ung bướu & tuyến trung ương | +8 |
Mỗi điểm cộng đi kèm một lý do hiển thị cho người dùng (“Có Viện Tim mạch”, “Ở Hà Nội như bạn mong muốn”). Bệnh viện chỉ có khoa Nhi bị loại với người lớn.
Recommendation
Sinh nextSteps theo thứ tự hành động, cộng logistics: giấy tờ (phụ thuộc nhu cầu: chuyển tuyến, kết quả cũ, đồ nằm viện…), người nhà, ăn uống (cảnh báo nhịn ăn khi xét nghiệm/chụp/phẫu thuật), ở lại, di chuyển.
Human Navigator
Đề xuất hoa tiêu viên khi: ≥75 tuổi, ung bướu, phẫu thuật, ≥2 bệnh nền, điểm match thấp (<30), hoặc ≥3 chuyên khoa. Case có needs_human = 1 vào /v1/navigator/queue.