| |
| |
| |
| |
|
|
| export type MedicalSpecialty = |
| | 'dermatology' |
| | 'ophthalmology' |
| | 'emergency' |
| | 'general' |
| | 'pediatrics' |
| | 'orthopedics' |
| | 'cardiology' |
| | 'neurology' |
| | 'oncology' |
| | 'surgery' |
| | 'internal_medicine' |
| | 'obstetrics_gynecology'; |
|
|
| |
| |
| |
| const conditionToSpecialtyMap: Record<string, MedicalSpecialty[]> = { |
| |
| 'eczema': ['dermatology'], |
| 'atopic dermatitis': ['dermatology'], |
| 'viêm da cơ địa': ['dermatology'], |
| 'psoriasis': ['dermatology'], |
| 'vảy nến': ['dermatology'], |
| 'acne': ['dermatology'], |
| 'mụn trứng cá': ['dermatology'], |
| 'rash': ['dermatology'], |
| 'phát ban': ['dermatology'], |
| 'urticaria': ['dermatology'], |
| 'mề đay': ['dermatology'], |
| 'fungal infection': ['dermatology'], |
| 'nhiễm nấm': ['dermatology'], |
| 'skin cancer': ['dermatology', 'oncology'], |
| 'ung thư da': ['dermatology', 'oncology'], |
| |
| |
| 'conjunctivitis': ['ophthalmology'], |
| 'viêm kết mạc': ['ophthalmology'], |
| 'đau mắt đỏ': ['ophthalmology'], |
| 'red eye': ['ophthalmology'], |
| 'cataract': ['ophthalmology'], |
| 'đục thủy tinh thể': ['ophthalmology'], |
| 'glaucoma': ['ophthalmology'], |
| 'tăng nhãn áp': ['ophthalmology'], |
| 'eye infection': ['ophthalmology'], |
| 'nhiễm trùng mắt': ['ophthalmology'], |
| |
| |
| 'chest pain': ['emergency', 'cardiology'], |
| 'đau ngực': ['emergency', 'cardiology'], |
| 'difficulty breathing': ['emergency', 'internal_medicine'], |
| 'khó thở': ['emergency', 'internal_medicine'], |
| 'severe bleeding': ['emergency', 'surgery'], |
| 'chảy máu nặng': ['emergency', 'surgery'], |
| 'stroke': ['emergency', 'neurology'], |
| 'đột quỵ': ['emergency', 'neurology'], |
| 'heart attack': ['emergency', 'cardiology'], |
| 'nhồi máu cơ tim': ['emergency', 'cardiology'], |
| |
| |
| 'fracture': ['orthopedics', 'emergency'], |
| 'gãy xương': ['orthopedics', 'emergency'], |
| 'broken bone': ['orthopedics', 'emergency'], |
| 'sprain': ['orthopedics'], |
| 'bong gân': ['orthopedics'], |
| 'wound': ['surgery', 'emergency'], |
| 'vết thương': ['surgery', 'emergency'], |
| 'burn': ['surgery', 'emergency'], |
| 'bỏng': ['surgery', 'emergency'], |
| |
| |
| 'child': ['pediatrics'], |
| 'trẻ em': ['pediatrics'], |
| 'nhi khoa': ['pediatrics'], |
| |
| |
| 'pregnancy': ['obstetrics_gynecology'], |
| 'thai kỳ': ['obstetrics_gynecology'], |
| 'mang thai': ['obstetrics_gynecology'], |
| 'gynecological': ['obstetrics_gynecology'], |
| 'phụ khoa': ['obstetrics_gynecology'], |
| |
| |
| 'fever': ['internal_medicine', 'general'], |
| 'sốt': ['internal_medicine', 'general'], |
| 'headache': ['internal_medicine', 'neurology'], |
| 'đau đầu': ['internal_medicine', 'neurology'], |
| 'infection': ['internal_medicine', 'general'], |
| 'nhiễm trùng': ['internal_medicine', 'general'], |
| }; |
|
|
| |
| |
| |
| const specialtyToKeywords: Record<MedicalSpecialty, string[]> = { |
| dermatology: ['da liễu', 'dermatology', 'skin'], |
| ophthalmology: ['mắt', 'eye', 'ophthalmology', 'nhãn khoa'], |
| emergency: ['cấp cứu', 'emergency', 'tai nạn'], |
| general: ['đa khoa', 'general', 'tổng hợp'], |
| pediatrics: ['nhi', 'pediatric', 'trẻ em'], |
| orthopedics: ['chấn thương', 'orthopedic', 'chỉnh hình'], |
| cardiology: ['tim mạch', 'cardiology', 'heart'], |
| neurology: ['thần kinh', 'neurology'], |
| oncology: ['ung bướu', 'oncology', 'cancer'], |
| surgery: ['phẫu thuật', 'surgery', 'ngoại khoa'], |
| internal_medicine: ['nội khoa', 'internal medicine'], |
| obstetrics_gynecology: ['sản phụ khoa', 'obstetrics', 'gynecology', 'phụ sản'] |
| }; |
|
|
| |
| |
| |
| export function getSpecialtiesForCondition(condition: string): MedicalSpecialty[] { |
| const lowerCondition = condition.toLowerCase().trim(); |
| |
| |
| if (conditionToSpecialtyMap[lowerCondition]) { |
| return conditionToSpecialtyMap[lowerCondition]; |
| } |
| |
| |
| for (const [key, specialties] of Object.entries(conditionToSpecialtyMap)) { |
| if (lowerCondition.includes(key) || key.includes(lowerCondition)) { |
| return specialties; |
| } |
| } |
| |
| |
| return ['general', 'emergency']; |
| } |
|
|
| |
| |
| |
| export function hospitalMatchesSpecialty( |
| hospitalName: string, |
| specialties: MedicalSpecialty[] |
| ): boolean { |
| const lowerName = hospitalName.toLowerCase(); |
| |
| for (const specialty of specialties) { |
| const keywords = specialtyToKeywords[specialty]; |
| for (const keyword of keywords) { |
| if (lowerName.includes(keyword)) { |
| return true; |
| } |
| } |
| } |
| |
| return false; |
| } |
|
|
| |
| |
| |
| |
| export function calculateSpecialtyMatchScore( |
| hospitalName: string, |
| specialties: MedicalSpecialty[] |
| ): number { |
| const lowerName = hospitalName.toLowerCase(); |
| let maxScore = 0; |
| |
| for (const specialty of specialties) { |
| const keywords = specialtyToKeywords[specialty]; |
| for (const keyword of keywords) { |
| if (lowerName.includes(keyword)) { |
| |
| maxScore = Math.max(maxScore, 1.0); |
| } |
| } |
| } |
| |
| |
| if (lowerName.includes('đa khoa') || lowerName.includes('general')) { |
| return 0.3; |
| } |
| |
| |
| if (lowerName.includes('cấp cứu') || lowerName.includes('emergency')) { |
| return 0.5; |
| } |
| |
| return maxScore; |
| } |
|
|
|
|