diff --git a/.gitignore b/.gitignore index fe49e6b..3eb9de7 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,9 @@ output/ # IDE .vscode/ .idea/ + +# 런타임 DB +*.db + +# 개발/디버깅 스크립트 +_dev_scripts/ diff --git a/anipharm_api.py b/anipharm_api.py new file mode 100644 index 0000000..035d4f4 --- /dev/null +++ b/anipharm_api.py @@ -0,0 +1,379 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +애니팜 투약지도서 API +- 동물약 PDF 생성 API +- 포트: 7002 +""" + +from flask import Flask, request, jsonify, send_file, render_template_string +from flask_cors import CORS +import os +import tempfile +import uuid +import sqlite3 +from datetime import datetime + +from animal_med.renderer_v2 import AnimalMedRendererV2 + +app = Flask(__name__) +CORS(app) + +# 렌더러 인스턴스 (싱글톤) +renderer = AnimalMedRendererV2() + +# 출력 디렉토리 +OUTPUT_DIR = os.path.join(os.path.dirname(__file__), 'output') +os.makedirs(OUTPUT_DIR, exist_ok=True) + +# ───────────────────────────────────────────────────────────── +# SQLite 접속 로그 DB +# ───────────────────────────────────────────────────────────── +LOGS_DB = os.path.join(os.path.dirname(__file__), 'lecture_logs.db') + +def init_logs_db(): + """접속 로그 DB 초기화""" + conn = sqlite3.connect(LOGS_DB) + c = conn.cursor() + c.execute(''' + CREATE TABLE IF NOT EXISTS lecture_views ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + lecture_id INTEGER NOT NULL, + ip_address TEXT, + user_agent TEXT, + referer TEXT, + viewed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ) + ''') + c.execute('CREATE INDEX IF NOT EXISTS idx_lecture_id ON lecture_views(lecture_id)') + c.execute('CREATE INDEX IF NOT EXISTS idx_viewed_at ON lecture_views(viewed_at)') + conn.commit() + conn.close() + +def log_lecture_view(lecture_id, ip, user_agent, referer): + """강의 조회 로깅""" + try: + conn = sqlite3.connect(LOGS_DB) + c = conn.cursor() + c.execute(''' + INSERT INTO lecture_views (lecture_id, ip_address, user_agent, referer) + VALUES (?, ?, ?, ?) + ''', (lecture_id, ip, user_agent[:500] if user_agent else None, referer[:500] if referer else None)) + conn.commit() + conn.close() + except Exception as e: + print(f"[LOG ERROR] {e}") + +# DB 초기화 +init_logs_db() + + +@app.route('/health', methods=['GET']) +def health(): + """헬스체크""" + return jsonify({ + 'status': 'ok', + 'service': 'anipharm-api', + 'timestamp': datetime.now().isoformat() + }) + + +@app.route('/api/products', methods=['GET']) +def list_products(): + """등록된 약품 목록 조회""" + products = renderer.list_drugs() + return jsonify({ + 'success': True, + 'count': len(products), + 'products': products + }) + + +@app.route('/api/guide/pdf', methods=['POST']) +def generate_pdf(): + """ + 투약지도서 PDF 생성 + + Request Body: + { + "product_ids": ["nexgard_spectra", "heartsaver", ...], + "patient_name": "김남곤", + "pet_name": "뽀삐", + "pet_species": "푸들", + "pet_age": "3세", + "pharmacy_name": "청춘약국 동물약 전문상담", // optional + "pharmacy_tel": "033-481-0384" // optional + } + + Response: PDF 파일 (application/pdf) + """ + try: + data = request.get_json() + + if not data: + return jsonify({'success': False, 'error': 'No JSON data'}), 400 + + product_ids = data.get('product_ids', []) + if not product_ids: + return jsonify({'success': False, 'error': 'product_ids required'}), 400 + + # 파일명 생성 + timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') + filename = f"guide_{timestamp}_{uuid.uuid4().hex[:8]}.pdf" + output_path = os.path.join(OUTPUT_DIR, filename) + + # PDF 생성 + result = renderer.render_to_pdf( + product_ids=product_ids, + output_path=output_path, + patient_name=data.get('patient_name', '보호자'), + pet_name=data.get('pet_name', '반려동물'), + pet_species=data.get('pet_species', ''), + pet_age=data.get('pet_age', ''), + pharmacy_name=data.get('pharmacy_name', '청춘약국 동물약 전문상담'), + pharmacy_tel=data.get('pharmacy_tel', '033-481-0384') + ) + + if result['success']: + return send_file( + output_path, + mimetype='application/pdf', + as_attachment=True, + download_name=f"투약지도서_{timestamp}.pdf" + ) + else: + return jsonify({ + 'success': False, + 'error': result.get('error', 'Unknown error') + }), 500 + + except Exception as e: + return jsonify({ + 'success': False, + 'error': str(e) + }), 500 + + +@app.route('/api/guide/preview', methods=['POST']) +def preview_guide(): + """ + 투약지도서 미리보기 (메타데이터만 반환) + + Request Body: generate_pdf와 동일 + Response: JSON (약품 정보 + 예상 페이지 수) + """ + try: + data = request.get_json() + + if not data: + return jsonify({'success': False, 'error': 'No JSON data'}), 400 + + product_ids = data.get('product_ids', []) + if not product_ids: + return jsonify({'success': False, 'error': 'product_ids required'}), 400 + + # 약품 정보 조회 + drugs = [] + for pid in product_ids: + drug = renderer.get_drug(pid) + if drug: + drugs.append({ + 'id': pid, + 'name': drug.get('name'), + 'category': drug.get('category'), + 'has_image': bool(drug.get('image_url') or drug.get('apc_code')) + }) + + # 페이지 수 계산 (4개/페이지) + page_count = (len(drugs) + 3) // 4 + + return jsonify({ + 'success': True, + 'drug_count': len(drugs), + 'page_count': page_count, + 'drugs': drugs + }) + + except Exception as e: + return jsonify({ + 'success': False, + 'error': str(e) + }), 500 + + +# ───────────────────────────────────────────────────────────── +# 동물약 강의 콘텐츠 라우트 +# ───────────────────────────────────────────────────────────── +LECTURES_DIR = os.path.join(os.path.dirname(__file__), 'static', 'lectures') +os.makedirs(LECTURES_DIR, exist_ok=True) + +@app.route('/lecture/') +def serve_lecture(lecture_id): + """동물약 강의 콘텐츠 서빙 (카카오톡 og 태그 포함) + 접속 로깅""" + from flask import send_from_directory + + # 접속 로깅 + ip = request.headers.get('X-Forwarded-For', request.remote_addr) + user_agent = request.headers.get('User-Agent', '') + referer = request.headers.get('Referer', '') + log_lecture_view(lecture_id, ip, user_agent, referer) + + filename = f'lecture_{lecture_id:02d}.html' + return send_from_directory(LECTURES_DIR, filename) + + +# ───────────────────────────────────────────────────────────── +# 관리자 페이지 - 강의 접속 통계 +# ───────────────────────────────────────────────────────────── +ADMIN_HTML = ''' + + + + + + 📊 강의 접속 통계 - 애니팜 + + + +
+

📊 강의 접속 통계

+ +
+
+
{{ total_views }}
+
총 조회수
+
+
+
{{ today_views }}
+
오늘 조회수
+
+
+
{{ unique_ips }}
+
순 방문자 (IP)
+
+
+ +
+

📈 강의별 조회수

+ + + + + + {% for row in lecture_stats %} + + + + + + {% endfor %} + +
강의조회수최근 조회
Lecture {{ row[0] }}{{ row[1] }}{{ row[2] }}
+
+ +
+

🕐 최근 접속 로그 (50건)

+ + + + + + {% for row in recent_logs %} + + + + + + + {% endfor %} + +
시간강의IPReferer
{{ row[0] }}Lecture {{ row[1] }}{{ row[2] }}{{ row[3] or '-' }}
+
+ + +
+ + +''' + +@app.route('/admin/lectures') +def admin_lectures(): + """강의 접속 통계 관리자 페이지""" + conn = sqlite3.connect(LOGS_DB) + c = conn.cursor() + + # 총 조회수 + c.execute('SELECT COUNT(*) FROM lecture_views') + total_views = c.fetchone()[0] + + # 오늘 조회수 + c.execute("SELECT COUNT(*) FROM lecture_views WHERE date(viewed_at) = date('now', 'localtime')") + today_views = c.fetchone()[0] + + # 순 방문자 (unique IP) + c.execute('SELECT COUNT(DISTINCT ip_address) FROM lecture_views') + unique_ips = c.fetchone()[0] + + # 강의별 통계 + c.execute(''' + SELECT lecture_id, COUNT(*) as cnt, MAX(viewed_at) as last_view + FROM lecture_views + GROUP BY lecture_id + ORDER BY cnt DESC + ''') + lecture_stats = c.fetchall() + + # 최근 로그 50건 + c.execute(''' + SELECT viewed_at, lecture_id, ip_address, referer + FROM lecture_views + ORDER BY viewed_at DESC + LIMIT 50 + ''') + recent_logs = c.fetchall() + + conn.close() + + return render_template_string(ADMIN_HTML, + total_views=total_views, + today_views=today_views, + unique_ips=unique_ips, + lecture_stats=lecture_stats, + recent_logs=recent_logs + ) + + +if __name__ == '__main__': + print("=" * 50) + print("🐾 애니팜 투약지도서 API") + print("=" * 50) + print(f"📍 http://localhost:7002") + print(f"📋 GET /health - 헬스체크") + print(f"📋 GET /api/products - 약품 목록") + print(f"📋 POST /api/guide/pdf - PDF 생성") + print(f"📋 POST /api/guide/preview - 미리보기") + print("=" * 50) + + app.run(host='0.0.0.0', port=7002, debug=False, threaded=True) diff --git a/data/master/actibet.json b/data/master/actibet.json index b29cf05..ae92c21 100644 --- a/data/master/actibet.json +++ b/data/master/actibet.json @@ -1,58 +1,386 @@ { "product_id": "MASTER-016", - "apc_code": "0519-ACTIBET", + "apc_code": "9240043910403", "name": "액티벳정", "english_name": "Actibet (Amoxicillin + Clavulanate)", "manufacturer": "홍익메디케어", "category": "antibiotic", "category_display": "항생제 (β-Lactam)", - "target_animal": ["개", "고양이"], + "drug_class": "Aminopenicillin + β-Lactamase 억제제", + "ema_ameg_category": "D (Prudence) — 1차 선택 가능", + "who_classification": "CIA (Critically Important Antimicrobials) - High Priority", + "target_animal": [ + "개", + "고양이" + ], "administration": "경구 (정제)", - - "indication": "광범위 세균 감염 (피부, 호흡기, 요로, 치주)", - + "composition": { + "amoxicillin_mg": 40, + "potassium_clavulanate_mg": 10, + "ratio": "4:1", + "description": "아목시실린 40mg + 클라불란산칼륨 10mg (1정 기준)" + }, "mechanism": { - "amoxicillin": "40mg - PBP 결합 → 세포벽 합성 억제 → 살균", - "clavulanate": "10mg - β-Lactamase 억제 → 내성균 커버 확장", - "ratio": "4:1 (Amoxicillin:Clavulanate)" + "amoxicillin": "세균 세포벽 합성 효소(PBP)에 결합 → Peptidoglycan 교차결합 억제 → 세포벽 파괴 → 살균", + "clavulanate": "β-Lactamase 효소에 비가역적 결합 → 아목시실린 분해 방지 → 내성균 커버 확장", + "killing_type": "살균성(bactericidal), 시간 의존적(time-dependent)", + "clinical_implication": "MIC 이상 농도 유지 시간이 효능 결정 → 1일 2회 분할 투여 필수" + }, + "spectrum": { + "gram_positive_aerobic": [ + "Staphylococcus pseudintermedius (MSSP)", + "Staphylococcus aureus (MSSA)", + "Streptococcus spp.", + "Enterococcus faecalis" + ], + "gram_negative_aerobic": [ + "Escherichia coli", + "Proteus mirabilis", + "Klebsiella spp.", + "Pasteurella multocida" + ], + "anaerobes": [ + "Bacteroides spp.", + "Fusobacterium spp.", + "Clostridium spp. (일부)" + ], + "resistant_organisms": [ + "MRSP (메티실린 내성 S. pseudintermedius)", + "MRSA", + "Pseudomonas aeruginosa", + "Mycoplasma spp.", + "Bordetella bronchiseptica (일부)" + ] + }, + "indications": { + "summary": "광범위 세균 감염 (피부, 요로, 호흡기, 연조직, 구강)", + "detailed": [ + { + "name": "피부감염 (농피증)", + "description": "표재성 및 심부 세균성 피부감염", + "iscaid_position": "전신 항생제 1차 선택 (국소치료 실패 시)" + }, + { + "name": "요로감염 (방광염, 신우신염)", + "description": "단순 산발성 방광염부터 복잡성 상부 UTI까지", + "iscaid_position": "1차 선택" + }, + { + "name": "호흡기 감염", + "description": "상·하부 호흡기 세균 감염 (폐렴 포함)", + "iscaid_position": "대안 1차 (Doxycycline 불가 시)" + }, + { + "name": "연조직 감염", + "description": "농양, 항문낭염, 교상(물린 상처)", + "iscaid_position": "1차 선택" + }, + { + "name": "구강/치주 감염", + "description": "치주질환, 구강 내 혼합감염", + "iscaid_position": "2차 (Clindamycin이 1차)" + } + ] }, - "dosage": { - "standard": "12.5mg/kg 1일 2회", - "formula": "체중 4kg당 1정", - "duration": "5~7일 (질환별 상이)" + "standard": "12.5mg/kg (복합) 1일 2회 (q12h)", + "formula": "체중 4kg당 1정, 12시간 간격", + "per_kg": { + "amoxicillin": "10mg/kg/회", + "clavulanate": "2.5mg/kg/회" + } }, - "dosage_table": [ - {"weight": "4kg", "tablets": "1정 × 2회"}, - {"weight": "8kg", "tablets": "2정 × 2회"}, - {"weight": "12kg", "tablets": "3정 × 2회"}, - {"weight": "20kg", "tablets": "5정 × 2회"} + { + "weight": "2kg", + "tablets_per_dose": "0.5정", + "frequency": "1일 2회", + "daily_amoxicillin": "40mg", + "daily_clavulanate": "10mg" + }, + { + "weight": "4kg", + "tablets_per_dose": "1정", + "frequency": "1일 2회", + "daily_amoxicillin": "80mg", + "daily_clavulanate": "20mg" + }, + { + "weight": "6kg", + "tablets_per_dose": "1.5정", + "frequency": "1일 2회", + "daily_amoxicillin": "120mg", + "daily_clavulanate": "30mg" + }, + { + "weight": "8kg", + "tablets_per_dose": "2정", + "frequency": "1일 2회", + "daily_amoxicillin": "160mg", + "daily_clavulanate": "40mg" + }, + { + "weight": "10kg", + "tablets_per_dose": "2.5정", + "frequency": "1일 2회", + "daily_amoxicillin": "200mg", + "daily_clavulanate": "50mg" + }, + { + "weight": "12kg", + "tablets_per_dose": "3정", + "frequency": "1일 2회", + "daily_amoxicillin": "240mg", + "daily_clavulanate": "60mg" + }, + { + "weight": "16kg", + "tablets_per_dose": "4정", + "frequency": "1일 2회", + "daily_amoxicillin": "320mg", + "daily_clavulanate": "80mg" + }, + { + "weight": "20kg", + "tablets_per_dose": "5정", + "frequency": "1일 2회", + "daily_amoxicillin": "400mg", + "daily_clavulanate": "100mg" + } ], - - "indications_by_disease": { - "skin_pyoderma": "5~7일 (표재성) / 3~4주 (심부)", - "uti": "7~14일", - "respiratory": "7~10일", - "dental": "수술 전후 5~7일" + "duration_by_indication": [ + { + "indication": "단순 방광염", + "duration": "3~5일", + "note": "ISCAID 2019 권장. 증상 소실 후에도 완료", + "source": "ISCAID UTI Guidelines 2019" + }, + { + "indication": "신우신염 (상부 UTI)", + "duration": "10~14일", + "note": "전신 증상 동반 시. 배양검사 권장", + "source": "ISCAID UTI Guidelines 2019" + }, + { + "indication": "표재성 농피증", + "duration": "2주 + 재평가", + "note": "국소치료 실패 시만 전신투여. 임상호전 후 1주 추가", + "source": "ISCAID Pyoderma Guidelines 2025" + }, + { + "indication": "심부 농피증", + "duration": "3주 + 재평가", + "note": "배양검사 권장. 증상 소실 후 최소 1주 연장", + "source": "ISCAID Pyoderma Guidelines 2025" + }, + { + "indication": "상부 호흡기 감염", + "duration": "7~10일", + "note": "Mycoplasma 의심 시 Doxycycline 선택", + "source": "ISCAID Respiratory Guidelines 2017" + }, + { + "indication": "하부 호흡기/폐렴 (개)", + "duration": "14일", + "note": "경증~중등도 폐렴", + "source": "ISCAID Respiratory Guidelines 2017" + }, + { + "indication": "하부 호흡기/폐렴 (고양이)", + "duration": "21일", + "note": "고양이는 재발률 높아 장기 투여", + "source": "ISCAID Respiratory Guidelines 2017" + }, + { + "indication": "연조직 감염/교상", + "duration": "5~7일", + "note": "Pasteurella + 혐기성균 동시 커버", + "source": "ISCAID" + }, + { + "indication": "치주/구강 감염", + "duration": "5~7일", + "note": "수술 전후 예방적 투여 포함", + "source": "General practice" + } + ], + "administration_instructions": { + "timing": [ + "1일 2회, 12시간 간격 유지 (예: 아침 8시, 저녁 8시)", + "시간 의존적 살균제 → 일정한 간격이 효과에 중요" + ], + "with_food": { + "recommended": true, + "reason": "음식과 함께 투여 시 위장관 부작용 감소", + "note": "공복 투여도 가능하나 구토/설사 위험 증가" + }, + "completion_importance": { + "message": "증상이 나아져도 처방 기간 끝까지 복용 완료", + "reason": "불완전 투약 시 남은 세균이 내성을 획득할 위험", + "warning": "임의 중단은 항생제 내성 유발의 주요 원인" + }, + "missed_dose": "1회분을 놓쳤을 경우 기억난 즉시 투여. 다음 투약 시간이 가까우면 건너뛰고 다음 회차에 정상 용량 투여 (2배 용량 투여 금지)" }, - + "side_effects": { + "common": [ + { + "symptom": "구토", + "frequency": "흔함", + "management": "음식과 함께 투여. 지속 시 수의사 상담" + }, + { + "symptom": "설사", + "frequency": "흔함", + "management": "장내균총 교란 가능. 프로바이오틱스 병행 고려 (투약 2시간 간격)" + }, + { + "symptom": "식욕 부진", + "frequency": "흔함", + "management": "대부분 일시적. 지속 시 수의사 상담" + } + ], + "uncommon": [ + { + "symptom": "알레르기 반응 (두드러기, 안면부종, 호흡곤란)", + "frequency": "드묾", + "management": "즉시 투약 중단 및 응급 처치 필요", + "severity": "심각" + }, + { + "symptom": "아나필락시스", + "frequency": "매우 드묾", + "management": "응급 상황. 에피네프린 투여 필요", + "severity": "생명 위협" + } + ], + "when_to_stop": [ + "심한 구토/설사가 지속될 때", + "두드러기, 안면 부종, 호흡 곤란 발생 시 (알레르기)", + "혈변, 극심한 복통 등 심각한 증상 시" + ] + }, + "contraindications": [ + { + "condition": "페니실린 계열 알레르기", + "severity": "절대 금기", + "note": "과거 페니실린/세팔로스포린 과민반응 이력 있는 경우" + }, + { + "condition": "중증 신부전", + "severity": "주의 필요", + "note": "용량 조절 또는 투여 간격 연장 필요. 수의사 판단" + } + ], "warnings": [ - "⚠️ 페니실린 알레르기 과거력 확인", - "⚠️ 소형견/고양이 정확한 체중 투여", - "⚠️ 시간 의존적 살균 → 분할 투여 필수", - "⚠️ 장기 투여 시 내성균 모니터링" + "⚠️ 페니실린 알레르기 과거력 반드시 확인", + "⚠️ 소형견/고양이는 체중에 정확히 비례하여 투여 (과량 주의)", + "⚠️ 시간 의존적 살균제 → 1일 2회 분할 투여 필수 (1일 1회 투여 금지)", + "⚠️ 사람용 오그멘틴(Augmentin) 임의 투여 금지 (비율/용량 다름)", + "⚠️ 장기 투여 시 내성균 발생 모니터링 필요", + "⚠️ 치료 실패 시 배양검사 시행 (경험적 재처방 지양)" ], - - "clinical_notes": [ - "EMA AMEG Category D: 1차 선택 가능", - "β-Lactamase 생산균까지 커버 (단독 AMX 대비)", - "MIC 이상 농도 유지 시간이 핵심 → BID 분할" - ], - - "source": { - "guidelines": ["ISCAID (수의 피부과)", "AAHA"] + "antibiotic_stewardship": { + "importance": "항생제 내성은 인수공통 문제. 동물에서의 오남용은 사람에게도 영향", + "principles": [ + "처방된 기간 끝까지 복용 완료 (조기 중단 금지)", + "남은 약 보관 후 자가 투약 금지", + "증상 재발 시 수의사 재진 (같은 약 임의 복용 금지)", + "가능하면 배양검사 후 처방 (특히 재발/치료 실패 시)" + ], + "resistance_warning": "불완전 투약, 과소/과다 용량, 불필요한 처방은 내성균 선택의 주요 원인", + "iscaid_effect": "ISCAID 가이드라인 준수 결과 이탈리아에서 E.coli의 AMX-CLV 내성률이 52.6%→25.6%로 감소 (PMID:41012835)" }, - - "storage": "25°C 이하, 건조, 차광 보관" -} + "drug_interactions": [ + { + "drug": "Methotrexate", + "effect": "Methotrexate 배설 감소 → 독성 증가 가능", + "recommendation": "병용 시 모니터링 필요" + }, + { + "drug": "Probenecid", + "effect": "아목시실린 신장 배설 억제 → 혈중 농도 상승", + "recommendation": "용량 조절 고려" + }, + { + "drug": "구충제 (일반)", + "effect": "대부분 병용 가능", + "recommendation": "펜벤다졸, 이버멕틴 등 일반 구충제와 병용 안전" + }, + { + "drug": "프로바이오틱스", + "effect": "항생제로 인한 장내균총 교란 완화", + "recommendation": "병용 가능. 투약 시간 2시간 간격 권장" + } + ], + "susceptibility_data": [ + { + "pathogen": "E. coli (개 UTI)", + "susceptibility": "92%", + "source": "KuKanich 2020 (PMID:31777977)", + "region": "미국 중서부" + }, + { + "pathogen": "E. coli (이탈리아, 2019 이후)", + "susceptibility": "74.4%", + "source": "Tagliasacchi 2025 (PMID:41012835)", + "note": "ISCAID 가이드라인 도입 후 내성률 25.6%로 감소" + }, + { + "pathogen": "S. pseudintermedius (MSSP, 유럽)", + "susceptibility": "≥88.5%", + "source": "ComPath 2020 (PMID:32924232)", + "note": "피부 분리주" + }, + { + "pathogen": "S. pseudintermedius (MRSP)", + "susceptibility": "내성 (일반)", + "source": "Pirolo 2023 (PMID:37294541)", + "note": "Low-level MRSP 일부는 임상 반응" + } + ], + "clinical_notes": [ + "EMA AMEG Category D: 경험적 처방 허용되는 1차 선택 항생제", + "β-Lactamase 생산균까지 커버 (Amoxicillin 단독 대비 스펙트럼 확장)", + "시간 의존적 살균 → MIC 이상 농도 유지가 핵심 → BID 분할 필수", + "ISCAID 가이드라인이 항생제 내성률 감소에 실질적 효과 입증됨", + "치료 실패 시 Category C (Cephalexin 등) → B (Fluoroquinolone) 순으로 상향" + ], + "pharmacy_counseling": { + "key_messages": [ + "체중 4kg당 1정, 하루 2번 (12시간 간격)", + "음식과 함께 드리면 위장 부작용 감소", + "증상 나아져도 처방 기간 끝까지 복용 완료 (내성 예방)", + "구토/설사 심하거나 알레르기 증상(부종, 호흡곤란) 시 즉시 중단" + ], + "common_questions": [ + { + "question": "며칠이나 먹여야 하나요?", + "answer": "질환에 따라 다릅니다. 방광염 3~5일, 피부감염 2~3주, 호흡기 7~21일. 수의사 처방 기간 준수하세요." + }, + { + "question": "증상이 나았는데 계속 먹여야 하나요?", + "answer": "네, 반드시요. 증상만 나아지고 세균은 남아있을 수 있습니다. 중간에 끊으면 내성균이 생깁니다." + }, + { + "question": "사람용 오그멘틴 줘도 되나요?", + "answer": "안 됩니다. 용량과 비율이 다릅니다. 동물 전용 제품만 사용하세요." + }, + { + "question": "부작용은 없나요?", + "answer": "구토, 설사 같은 위장 증상이 흔합니다. 음식과 함께 주면 줄어듭니다. 알레르기 반응(부종, 호흡곤란)은 드물지만 발생 시 즉시 중단하세요." + } + ] + }, + "source": { + "guidelines": [ + "ISCAID UTI Guidelines 2019 (PMID:30971357)", + "ISCAID Pyoderma Guidelines 2025 (PMID:40338805)", + "ISCAID Respiratory Guidelines 2017 (PMC5354050)", + "AAHA/AAFP Antimicrobial Stewardship Guidelines 2022" + ], + "golden_pattern": "actibet_amoxicillin_clavulanate.md (2026-03-02)" + }, + "storage": "25°C 이하, 건조, 차광 보관", + "last_updated": "2026-03-19", + "indication": "광범위 세균 감염 (피부, 요로, 호흡기, 연조직, 구강)" +} \ No newline at end of file diff --git a/data/master/antelmin.json b/data/master/antelmin.json index d3d8583..f9a12c1 100644 --- a/data/master/antelmin.json +++ b/data/master/antelmin.json @@ -1,64 +1,101 @@ { "product_id": "MASTER-014", - "apc_code": "0519-ANTELMIN", + "apc_code": "0230237810109", "name": "안텔민 뽀삐/킹", "english_name": "Antelmin (Mebendazole + Praziquantel)", "manufacturer": "대성", "category": "antiparasitic", "category_display": "광범위 내부구충제", - "target_animal": ["개", "고양이"], + "target_animal": [ + "개", + "고양이" + ], "administration": "경구 (정제)", - "indication": "회충, 조충(촌충), 십이지장충(구충), 편충 구제", - "coverage_summary": { - "covered": ["회충", "조충(촌충)", "구충(십이지장충)", "편충"], - "not_covered": ["벼룩", "진드기", "심장사상충"], + "covered": [ + "회충", + "조충(촌충)", + "구충(십이지장충)", + "편충" + ], + "not_covered": [ + "벼룩", + "진드기", + "심장사상충" + ], "gap_solution": "넥스가드/셀라이트의 조충 갭 보완용" }, - "mechanism": { "mebendazole": "벤즈이미다졸계 → 회충, 구충, 편충 구제", "praziquantel": "프라지노이소퀴놀린계 → 조충(촌충) 구제" }, - "dosing": { "interval": "3개월마다 (연 4회)", "interval_reason": "ESCCAP/CAPC 가이드라인 기반, 기생충 prepatent period 고려", "puppy_kitten": "6개월 미만: 2주~1개월 간격", "minimum_age": "제한 없음" }, - "dosage_table": [ - {"product": "뽀삐 정", "weight": "~5kg", "tablets": "1정"}, - {"product": "킹 정 5kg", "weight": "5kg", "tablets": "1정"}, - {"product": "킹 정 10kg", "weight": "10kg", "tablets": "2정"}, - {"product": "킹 정 15kg", "weight": "15kg", "tablets": "3정"}, - {"product": "킹 정 20kg", "weight": "20kg", "tablets": "4정"} + { + "product": "뽀삐 정", + "weight": "~5kg", + "tablets": "1정" + }, + { + "product": "킹 정 5kg", + "weight": "5kg", + "tablets": "1정" + }, + { + "product": "킹 정 10kg", + "weight": "10kg", + "tablets": "2정" + }, + { + "product": "킹 정 15kg", + "weight": "15kg", + "tablets": "3정" + }, + { + "product": "킹 정 20kg", + "weight": "20kg", + "tablets": "4정" + } ], - "prepatent_periods": [ - {"parasite": "십이지장충", "period": "14~18일"}, - {"parasite": "개회충", "period": "2~5주"}, - {"parasite": "조충(벼룩매개)", "period": "~3주"}, - {"parasite": "편충", "period": "10~12주"} + { + "parasite": "십이지장충", + "period": "14~18일" + }, + { + "parasite": "개회충", + "period": "2~5주" + }, + { + "parasite": "조충(벼룩매개)", + "period": "~3주" + }, + { + "parasite": "편충", + "period": "10~12주" + } ], - "warnings": [ "⚠️ 공복 투여 권장 (효과 증가)", "⚠️ 다두 사육 시 동시 투약 (교차 감염 방지)", "⚠️ 유기동물: 즉시 투약 + 2주 후 재투약" ], - "clinical_notes": [ "넥스가드 스펙트라/셀라이트의 조충 미커버 보완", "3개월 간격 정기 투약 권장 (ESCCAP/CAPC)", "벼룩 관리 필수 (조충 중간숙주)" ], - "source": { - "guidelines": ["ESCCAP GL01 7th Ed (2025)", "CAPC Guidelines"] + "guidelines": [ + "ESCCAP GL01 7th Ed (2025)", + "CAPC Guidelines" + ] }, - "storage": "실온 보관" -} +} \ No newline at end of file diff --git a/data/master/asikaff_carprofen.json b/data/master/asikaff_carprofen.json index b4931eb..2892479 100644 --- a/data/master/asikaff_carprofen.json +++ b/data/master/asikaff_carprofen.json @@ -1,38 +1,58 @@ { "product_id": "MASTER-002", - "apc_code": "0232617800004", + "apc_code": "0232635710103", "name": "아시카프 츄어블정", "english_name": "Asikaff Chewable (Carprofen 50mg)", "manufacturer": "미상", "category": "nsaid", "category_display": "진통소염제 (NSAIDs)", - "target_animal": ["개"], + "target_animal": [ + "개" + ], "administration": "경구 (츄어블정)", - "image_url": "/images/asikaff.png", - "indication": "개의 관절염, 수술 후 통증, 근골격계 염증 완화", - "mechanism": { "drug_class": "프로피온산계 NSAIDs", "action": "COX-2 우선 억제 → 염증성 프로스타글란딘 생성 억제", "selectivity": "COX-2 우선 (preferential) - 완전 선택적 아님" }, - "dosage": { "standard": "4.4mg/kg 1일 1회", "alternative": "2.2mg/kg 1일 2회", "note": "최소 유효 용량 원칙 - 효과 확인 후 감량 시도" }, - "dosage_table": [ - {"weight": "5kg", "daily_dose": "22mg", "tablets": "0.5정 (반정)"}, - {"weight": "10kg", "daily_dose": "44mg", "tablets": "1정"}, - {"weight": "15kg", "daily_dose": "66mg", "tablets": "1.5정"}, - {"weight": "20kg", "daily_dose": "88mg", "tablets": "2정"}, - {"weight": "25kg", "daily_dose": "110mg", "tablets": "2.5정"}, - {"weight": "30kg", "daily_dose": "132mg", "tablets": "3정"} + { + "weight": "5kg", + "daily_dose": "22mg", + "tablets": "0.5정 (반정)" + }, + { + "weight": "10kg", + "daily_dose": "44mg", + "tablets": "1정" + }, + { + "weight": "15kg", + "daily_dose": "66mg", + "tablets": "1.5정" + }, + { + "weight": "20kg", + "daily_dose": "88mg", + "tablets": "2정" + }, + { + "weight": "25kg", + "daily_dose": "110mg", + "tablets": "2.5정" + }, + { + "weight": "30kg", + "daily_dose": "132mg", + "tablets": "3정" + } ], - "absolute_contraindications": [ { "item": "고양이 사용 절대 금지", @@ -50,16 +70,14 @@ "severity": "치명적" } ], - "relative_contraindications": [ "신장 기능 저하", - "간 기능 저하", + "간 기능 저하", "위장관 궤양 병력", "출혈 경향", "심부전", "탈수 상태" ], - "warnings": [ "🚫 고양이에게 절대 투여하지 마세요 (치명적)", "🚫 스테로이드와 함께 투여하지 마세요", @@ -67,16 +85,33 @@ "⚠️ 장기 투여 시 3~6개월마다 혈액검사 필요", "⚠️ 음식과 함께 투여하면 위장 자극 감소" ], - "side_effects": { - "common": ["구토", "설사", "식욕부진"], - "serious": ["위장관 궤양/출혈 (흑색변)", "간독성 (황달)", "신독성 (다음다뇨)"], - "monitoring_signs": ["흑색변", "토혈", "황달", "기력저하", "다음다뇨"] + "common": [ + "구토", + "설사", + "식욕부진" + ], + "serious": [ + "위장관 궤양/출혈 (흑색변)", + "간독성 (황달)", + "신독성 (다음다뇨)" + ], + "monitoring_signs": [ + "흑색변", + "토혈", + "황달", + "기력저하", + "다음다뇨" + ] }, - "monitoring": { "required": true, - "pre_treatment": ["CBC", "간기능 (ALT, ALP, AST)", "신기능 (BUN, Cr)", "뇨검사"], + "pre_treatment": [ + "CBC", + "간기능 (ALT, ALP, AST)", + "신기능 (BUN, Cr)", + "뇨검사" + ], "during_treatment": { "2_4_weeks": "혈청 화학 (간·신기능)", "3_months": "혈청 화학, 뇨검사", @@ -89,31 +124,39 @@ "황달" ] }, - "washout_period": { "to_other_nsaid": "3~5일", "to_steroid": "5~7일", "from_short_steroid": "5~7일", "from_long_steroid": "2주 이상" }, - "clinical_efficacy": { "osteoarthritis": "89.1~92.4% 개선", "post_surgical": "우수한 통증 관리", - "source_pmid": ["7759332", "12665145", "17056650", "25433056"] + "source_pmid": [ + "7759332", + "12665145", + "17056650", + "25433056" + ] }, - "storage": "실온 보관, 습기 피할 것", - "pharmacist_tips": [ "음식과 함께 투여 권장 (위장 자극 감소)", "장기 투여 시 정기 검사 안내 필수", "보호자에게 중단 신호 교육 (흑색변, 구토, 황달)", "스테로이드 병용 여부 반드시 확인" ], - "source": { - "guidelines": ["WSAVA Pain Management Guidelines"], - "pmid": ["7759332", "12665145", "17056650", "16468926", "25433056"] + "guidelines": [ + "WSAVA Pain Management Guidelines" + ], + "pmid": [ + "7759332", + "12665145", + "17056650", + "16468926", + "25433056" + ] } -} +} \ No newline at end of file diff --git a/data/master/chlorhexidine_shampoo.json b/data/master/chlorhexidine_shampoo.json index 2ba7970..e29f74e 100644 --- a/data/master/chlorhexidine_shampoo.json +++ b/data/master/chlorhexidine_shampoo.json @@ -1,39 +1,36 @@ { "product_id": "MASTER-009", - "apc_code": "0519-CHLORHEX-SHAMPOO", + "apc_code": "0231334930108", "name": "클로르헥시딘 샴푸", "english_name": "Chlorhexidine Shampoo 2%", "manufacturer": "비르박", "category": "topical", "category_display": "피부외용제 (샴푸)", - "target_animal": ["개", "고양이"], + "target_animal": [ + "개", + "고양이" + ], "administration": "외용 (샴푸)", - "indication": "세균성/진균성 피부염, 농피증, 피부 감염 예방", - "mechanism": { "drug_class": "비구아나이드계 소독제", "action": "세균 세포막 파괴 → 살균 작용", "spectrum": "그람양성균, 그람음성균, 효모균" }, - "dosage": { "frequency": "주 2~3회", "contact_time": "5~10분간 방치 후 헹굼", "duration": "증상 호전 시까지 (보통 2~4주)" }, - "warnings": [ "⚠️ 눈, 귀, 점막 접촉 피할 것", "⚠️ 사용 후 완전히 헹굴 것", "⚠️ 깊은 상처에는 사용 금지" ], - "clinical_notes": [ "경구 항생제와 병용 시 효과 증가", "거품을 충분히 내어 피부에 접촉시키는 것이 중요", "피부 건조 시 보습제 병용 권장" ], - "storage": "실온 보관, 직사광선 피할 것" -} +} \ No newline at end of file diff --git a/data/master/enrofloxacin.json b/data/master/enrofloxacin.json index e714bdf..ce43638 100644 --- a/data/master/enrofloxacin.json +++ b/data/master/enrofloxacin.json @@ -1,67 +1,89 @@ { "product_id": "MASTER-003", - "apc_code": "0519-ENROFLOXACIN", + "apc_code": "0232532310106", "name": "아시엔로 50", "english_name": "Enrofloxacin 50mg", "manufacturer": "아시아제약", "category": "antibiotic", "category_display": "항생제 (퀴놀론계)", - "target_animal": ["개", "고양이"], + "target_animal": [ + "개", + "고양이" + ], "administration": "경구 (정제)", - "image_url": "/images/enrofloxacin.png", - "indication": "피부감염, 요로감염, 호흡기감염, 상처감염 등 세균성 감염증 치료", - "mechanism": { "drug_class": "Fluoroquinolone (3세대 퀴놀론)", "action": "DNA gyrase 및 topoisomerase IV 억제 → 세균 DNA 복제 차단", "spectrum": "그람양성균, 그람음성균 광범위" }, - "dosage": { "standard": "5mg/kg 1일 1회", "duration": "7~14일", "note": "음식과 함께 또는 공복 투여 가능" }, - "dosage_table": [ - {"weight": "5kg", "daily_dose": "25mg", "tablets": "0.5정"}, - {"weight": "10kg", "daily_dose": "50mg", "tablets": "1정"}, - {"weight": "15kg", "daily_dose": "75mg", "tablets": "1.5정"}, - {"weight": "20kg", "daily_dose": "100mg", "tablets": "2정"}, - {"weight": "25kg", "daily_dose": "125mg", "tablets": "2.5정"} + { + "weight": "5kg", + "daily_dose": "25mg", + "tablets": "0.5정" + }, + { + "weight": "10kg", + "daily_dose": "50mg", + "tablets": "1정" + }, + { + "weight": "15kg", + "daily_dose": "75mg", + "tablets": "1.5정" + }, + { + "weight": "20kg", + "daily_dose": "100mg", + "tablets": "2정" + }, + { + "weight": "25kg", + "daily_dose": "125mg", + "tablets": "2.5정" + } ], - "warnings": [ "⚠️ 고양이: 5mg/kg 초과 금지 (망막 독성 위험!)", "⚠️ 성장기 동물: 연골 손상 가능성 (1세 미만 주의)", "⚠️ 간질/경련 병력 동물 주의", "⚠️ 제산제(알루미늄, 마그네슘)와 2시간 간격 투여" ], - "contraindications": [ "1세 미만 강아지 (대형견은 18개월 미만)", "임신/수유 중", "간질/경련 병력", "퀴놀론 과민반응 이력" ], - "side_effects": { - "common": ["구토", "설사", "식욕부진"], - "serious": ["고양이 망막 독성 (고용량)", "연골 손상 (성장기)", "경련 (드묾)"] + "common": [ + "구토", + "설사", + "식욕부진" + ], + "serious": [ + "고양이 망막 독성 (고용량)", + "연골 손상 (성장기)", + "경련 (드묾)" + ] }, - "cat_warning": { "max_dose": "5mg/kg/day", "max_duration": "21일", "risk": "망막 변성 → 실명 가능", "source": "다수 문헌 보고" }, - "storage": "실온 보관, 습기 피할 것", - "source": { - "guidelines": ["ISCAID Antimicrobial Guidelines"], + "guidelines": [ + "ISCAID Antimicrobial Guidelines" + ], "notes": "고양이 망막 독성 관련 다수 증례 보고" } -} +} \ No newline at end of file diff --git a/data/master/fronilspot.json b/data/master/fronilspot.json index 57700c2..5463c2d 100644 --- a/data/master/fronilspot.json +++ b/data/master/fronilspot.json @@ -6,43 +6,63 @@ "manufacturer": "한국동물약품", "category": "antiparasitic", "category_display": "외부구충제 (스팟온)", - "target_animal": ["개", "고양이"], + "target_animal": [ + "개", + "고양이" + ], "administration": "경피 도포 (스팟온)", - "indication": "벼룩, 진드기 구제", - "coverage": { "external": { - "fleas": {"covered": true, "note": "4~8시간 내 사멸"}, - "ticks": {"covered": true, "note": "접촉 사멸"} + "fleas": { + "covered": true, + "note": "4~8시간 내 사멸" + }, + "ticks": { + "covered": true, + "note": "접촉 사멸" + } + }, + "heartworm": { + "covered": false }, - "heartworm": {"covered": false}, "intestinal": { - "roundworm": {"covered": false}, - "hookworm": {"covered": false}, - "whipworm": {"covered": false}, - "tapeworm": {"covered": false} + "roundworm": { + "covered": false + }, + "hookworm": { + "covered": false + }, + "whipworm": { + "covered": false + }, + "tapeworm": { + "covered": false + } } }, - "coverage_summary": { - "covered": ["벼룩", "진드기"], - "not_covered": ["심장사상충", "내부기생충"], + "covered": [ + "벼룩", + "진드기" + ], + "not_covered": [ + "심장사상충", + "내부기생충" + ], "gap_solution": "심장사상충: 하트세이버 / 내부기생충: 안텔민 추가" }, - "dosing": { "interval": "매월 1회", "interval_reason": "효능 지속 4주", "minimum_age": "8주 이상", "minimum_weight": "제한 없음" }, - "warnings": [ "⚠️ 도포 후 2일간 목욕/수영 금지", "⚠️ 토끼에게는 독성 (사용 금지)", "⚠️ 피부 상처 부위 도포 금지" ], - - "storage": "실온 보관, 직사광선 피할 것" -} + "storage": "실온 보관, 직사광선 피할 것", + "image_url": "https://d1vgkbcgf4kpck.cloudfront.net/medicine/3faefec5-4bdf-4039-93e3-b99b55ef9417.png" +} \ No newline at end of file diff --git a/data/master/gaesidin.json b/data/master/gaesidin.json index d565432..2462346 100644 --- a/data/master/gaesidin.json +++ b/data/master/gaesidin.json @@ -1,43 +1,264 @@ { "product_id": "MASTER-012", - "apc_code": "0231093500002", + "apc_code": "0231093520106", + "apc_variants": { + "5g": "0231093510108", + "10g": "0231093520106", + "15g": "0231093530104", + "20g": "0231093540102", + "30g": "0231093550109", + "50g": "0231093560107", + "100g": "0231093570105", + "200g": "0231093580103" + }, "name": "복합 개시딘 겔", "english_name": "GaeSidin Gel (Fusidic acid + Betamethasone)", "manufacturer": "(주)이엘티사이언스", + "approval_number": "194", + "approval_date": "2020-02-13", "category": "topical", "category_display": "피부외용제 (농피증)", - "target_animal": ["개"], + "target_animal": [ + "개" + ], "administration": "외용 (겔)", - "indication": "표면성 세균성 농피증 국소 치료", - - "mechanism": { - "fusidic_acid": "0.5% - 황색포도상구균·MRSP 살균", - "betamethasone": "0.1% - 항염증·항소양 (Class III 스테로이드)" + "active_ingredients": { + "fusidic_acid": { + "concentration": "5mg/g (0.5%)", + "class": "스테로이드 구조 항생제", + "mechanism": "EF-G 결합 → 단백질 합성 억제 → 살균", + "target_bacteria": [ + "황색포도상구균", + "S. pseudintermedius", + "MRSP" + ] + }, + "betamethasone_valerate": { + "concentration": "1mg/g (0.1%)", + "class": "Class III 코르티코스테로이드", + "mechanism": "PLA2 억제 → 프로스타글란딘/루코트리엔 감소 → 항염증·항소양" + } + }, + "formulation_advantage": { + "why_gel": "털이 있는 개 피부에 최적화 - 겔이 털 사이로 침투하여 피부에 직접 도달", + "vs_cream": "크림/연고는 털에 흡착되어 피부 도달 저하", + "ph_optimization": "개 피부 pH(6.5~8.2)에 맞는 중성~친수성 기제", + "efficacy_evidence": "피부 내 농도 MIC90의 67,000배 달성 (PMID 29162115)" }, - "dosage": { "frequency": "1일 2회", - "duration": "최소 5일 → 증상 소실 후 2일 추가", - "max_duration": "7일 초과 금지", - "application": "환부 청결 후 환부에만 국소 도포" + "duration_min": "최소 5일", + "duration_after_resolution": "증상 소실 후 2일 추가", + "duration_max": "7일 (절대 초과 금지)", + "amount": "소량을 환부에만" + }, + "application_method": { + "step_1": { + "action": "환부 세정", + "detail": "미온수 또는 클로르헥시딘 희석액으로 환부를 깨끗이 닦고 완전히 건조" + }, + "step_2": { + "action": "털 갈라내기", + "detail": "환부 주변 털을 손가락으로 갈라 피부를 최대한 노출" + }, + "step_3": { + "action": "도포", + "detail": "소량(완두콩 크기 정도)을 환부에만 얇게 펴 바름" + }, + "step_4": { + "action": "흡수 대기", + "detail": "2~3분간 자연 건조 - 겔이 빠르게 흡수됨" + }, + "step_5": { + "action": "핥기 방지", + "detail": "도포 직후 엘리자베스 칼라 착용 또는 15분간 감시" + }, + "caregiver_tip": "장갑 착용 권장 - 베타메타손 피부 흡수 방지" + }, + "wound_care_guidelines": { + "before_application": [ + "환부가 심하게 오염된 경우 생리식염수로 세척", + "딱지나 가피가 있으면 무리하게 제거하지 말 것", + "출혈이 있는 깊은 상처에는 사용 금지" + ], + "after_application": [ + "통기성 유지 - 밀폐 드레싱 금지", + "붕대 감기 비권장 (습기 축적 → 세균 증식)", + "환부 긁기 방지를 위해 발톱 정리 권장" + ], + "environment": [ + "도포 후 30분간 산책/목욕 금지", + "수영/물놀이 금지 (치료 기간 중)", + "습한 환경 피하기 - 건조한 환경 유지" + ] + }, + "elizabethan_collar_guide": { + "necessity": "필수 - 베타메타손 경구 섭취 시 전신 흡수 위험", + "timing": "도포 직후 최소 15~20분, 가능하면 치료 기간 내내", + "size_selection": "코 끝이 칼라 가장자리에 닿지 않는 크기 선택", + "alternatives": [ + "도넛형 넥칼라 (목 부담 적음)", + "수술복/보호복 (체간 환부인 경우)", + "발 환부인 경우 양말+테이프" + ], + "signs_of_licking": [ + "환부 주변 털이 축축함", + "겔이 번들거리지 않고 매트함", + "환부 악화 또는 발적 증가" + ] + }, + "progress_monitoring": { + "day_1_2": { + "expected": "소양감 감소 시작 (베타메타손 효과)", + "observe": [ + "긁는 빈도 감소", + "발적 약간 완화" + ], + "action": "계속 도포, 칼라 유지" + }, + "day_3": { + "expected": "병변 크기 감소, 삼출물 감소", + "observe": [ + "환부 건조해짐", + "딱지 형성 시작" + ], + "checkpoint": true, + "action_if_improved": "계속 도포", + "action_if_no_change": "⚠️ 수의사 재진 필요 (내성균 또는 진균 가능성)" + }, + "day_5": { + "expected": "대부분 증상 소실", + "observe": [ + "피부 정상색 회복", + "털 재성장 시작" + ], + "action": "증상 소실 확인 후 2일 추가 도포" + }, + "day_7": { + "expected": "완전 치유", + "observe": [ + "환부 완전 건조", + "정상 피부와 구분 어려움" + ], + "action": "사용 종료 - 7일 초과 절대 금지" + } + }, + "veterinary_revisit_triggers": { + "timing_3_days": "3일 사용 후 호전 없거나 악화 시", + "immediate_triggers": [ + "환부 급격히 확대", + "고름 증가 또는 악취", + "발열, 식욕저하, 무기력", + "전신으로 병변 확산" + ], + "possible_causes": [ + "퓨시드산 내성균 감염 (한국 27%)", + "진균성(Malassezia) 농피증 오진", + "심부 농피증으로 진행" + ], + "required_tests": "세균 배양검사 및 감수성 검사 권장" }, - "warnings": [ - "⚠️ 7일 초과 사용 금지", + "⚠️ 7일 초과 사용 금지 - HPA 억제 위험", "⚠️ 3일 사용 후 호전 없으면 수의사 재진", - "⚠️ 눈·점막·깊은 상처 도포 금지", - "⚠️ 도포 후 핥지 않도록 엘리자베스 칼라" + "⚠️ 눈·점막·귀 내부·깊은 상처 도포 금지", + "⚠️ 도포 후 핥지 않도록 엘리자베스 칼라 필수", + "⚠️ 사용자(보호자) 장갑 착용 권장" ], - + "contraindications": { + "absolute": [ + "진균성(곰팡이) 농피증 - 스테로이드가 악화시킴", + "고양이 - 개 전용 허가", + "고막 천공된 귀 감염", + "바이러스성 피부 감염" + ], + "relative": [ + "임신·수유 중인 개 - 수의사 판단", + "당뇨병 환자 - 스테로이드 영향", + "쿠싱 증후군 환자" + ] + }, + "side_effects": { + "local": [ + "도포 부위 자극감 (드묾)", + "피부 얇아짐 - 장기 사용 시" + ], + "systemic_if_ingested": [ + "다음다뇨 (스테로이드 효과)", + "식욕 증가", + "장기: HPA 축 억제" + ] + }, + "vs_human_fucidin": { + "can_use_human": false, + "reason_1": "제형 차이: 사람용=크림(털에 흡착), 개시딘=겔(털 통과)", + "reason_2": "pH 차이: 사람 피부 4.5~5.5 vs 개 피부 6.5~8.2", + "reason_3": "농도 차이: 사람용 2% vs 개시딘 0.5%+스테로이드 복합" + }, + "clinical_evidence": { + "skin_penetration": "표재성 240μm에서 MIC90의 67,000배 농도 (PMID 29162115)", + "mrsp_coverage": "MRSP 포함 대부분 MIC ≤0.03 mg/L (PMID 25749003)", + "resistance_korea": "한국 S. pseudintermedius 내성률 27% (PMID 32115810)" + }, + "available_sizes": [ + "5g", + "10g", + "15g", + "20g", + "30g", + "50g", + "100g", + "200g" + ], + "storage": "실온 보관, 직사광선 피할 것", + "prescription_required": false, + "pharmacy_counseling": { + "quick_explanation": "개 피부 농피증(세균성 피부병) 치료 겔이에요. 항생제와 소염제가 함께 들어있어 세균도 죽이고 가려움도 줄여줘요.", + "key_points": [ + "하루 2번, 환부에만 얇게", + "최소 5일, 최대 7일", + "핥지 못하게 넥칼라 필수", + "3일째 안 좋아지면 병원으로" + ], + "common_question": { + "q": "사람 후시딘 써도 되나요?", + "a": "제형이 달라요. 사람용 크림은 개 털에 묻어서 피부에 안 닿아요. 개시딘 겔은 털 사이로 스며들어 피부에 직접 도달해요." + } + }, + "references": [ + { + "pmid": "29162115", + "title": "Opportunities for topical antimicrobial therapy: permeation of canine skin by fusidic acid", + "key_finding": "퓨시드산 겔 피부 침투: MIC의 67,000배 농도" + }, + { + "pmid": "25749003", + "title": "Susceptibility in vitro of canine staphylococcal isolates to fusidic acid", + "key_finding": "MRSP 포함 대부분 MIC ≤0.03 mg/L" + }, + { + "pmid": "34414614", + "title": "Influence of age, sex on skin pH in dogs", + "key_finding": "개 피부 pH 4.4~8.2 (사람보다 알칼리성)" + }, + { + "pmid": "32115810", + "title": "Fusidic acid resistance in S. pseudintermedius from dogs in Korea", + "key_finding": "한국 퓨시드산 내성률 27%" + } + ], + "last_updated": "2026-03-19", + "version": "2.0", "clinical_notes": [ - "개 피부 pH (4.4~8.2)에 최적화된 겔 제형", - "사람용 후시딘과 농도·제형 다름", + "사람용 후시딘과 농도/제형 다름 (동물 피부 pH 최적화)", + "개 피부 pH (4.4~8.2)에 맞춘 겔 제형", "털 있는 피부 침투에 유리한 겔 타입", "MRSP(메티실린 내성 포도상구균)에도 효과" ], - - "available_sizes": ["5g", "10g", "15g", "20g", "30g", "50g", "100g"], - - "storage": "실온 보관" -} + "pharmacy_tips": { + "human_vs_animal": "사람용 후시딘: 크림제형, 농도 2% / 동물용 개시딘: 겔제형, 농도 0.5%", + "ph_tip": "개 피부 pH는 4.4~8.2로 사람(5.5)보다 넓음. 겔 제형이 털 사이 침투에 유리", + "mrsp_note": "MRSP(메티실린 내성 포도상구균)에도 효과 있음" + } +} \ No newline at end of file diff --git a/data/master/heartsaver.json b/data/master/heartsaver.json index 723e8f3..8d831e7 100644 --- a/data/master/heartsaver.json +++ b/data/master/heartsaver.json @@ -1,51 +1,74 @@ { "product_id": "MASTER-005", - "apc_code": "0519-HEARTSAVER", + "apc_code": "0230467230300", "name": "하트세이버 츄어블", "english_name": "Heartsaver (Ivermectin + Pyrantel)", "manufacturer": "중앙바이오텍", "category": "antiparasitic", "category_display": "심장사상충 예방", - "target_animal": ["개"], + "target_animal": [ + "개" + ], "administration": "경구 (츄어블)", - "indication": "심장사상충 예방 + 회충/구충 구제", - "coverage": { "external": { - "fleas": {"covered": false, "note": ""}, - "ticks": {"covered": false, "note": ""} + "fleas": { + "covered": false, + "note": "" + }, + "ticks": { + "covered": false, + "note": "" + } }, "heartworm": { "covered": true, "note": "L3/L4 유충 구제" }, "intestinal": { - "roundworm": {"covered": true, "note": "회충"}, - "hookworm": {"covered": true, "note": "구충"}, - "whipworm": {"covered": false, "note": ""}, - "tapeworm": {"covered": false, "note": ""} + "roundworm": { + "covered": true, + "note": "회충" + }, + "hookworm": { + "covered": true, + "note": "구충" + }, + "whipworm": { + "covered": false, + "note": "" + }, + "tapeworm": { + "covered": false, + "note": "" + } } }, - "coverage_summary": { - "covered": ["심장사상충", "회충", "구충"], - "not_covered": ["벼룩", "진드기", "편충", "조충"], + "covered": [ + "심장사상충", + "회충", + "구충" + ], + "not_covered": [ + "벼룩", + "진드기", + "편충", + "조충" + ], "gap_solution": "외부구충: 프로닐스팟 / 편충·조충: 안텔민 추가" }, - "dosing": { "interval": "매월 1회", "interval_reason": "심장사상충 윈도우 30일", "minimum_age": "6주 이상", "minimum_weight": "제한 없음" }, - "warnings": [ "⚠️ 콜리 품종: MDR1 유전자 확인 필요", "⚠️ 투약 전 심장사상충 검사 필수", "⚠️ 감염견에 투약 시 쇼크 위험" ], - "storage": "실온 보관" -} +} \ No newline at end of file diff --git a/data/master/impact.json b/data/master/impact.json index 5667c7d..b13bd84 100644 --- a/data/master/impact.json +++ b/data/master/impact.json @@ -1,60 +1,91 @@ { "product_id": "MASTER-013", - "apc_code": "0232873800003", + "apc_code": "0232873820205", "name": "임팩트액", "english_name": "Impact (Imidacloprid + Moxidectin)", "manufacturer": "제이에스코리아 (애드보킷 제네릭)", "category": "antiparasitic", "category_display": "스팟온 복합구충제", - "target_animal": ["개", "고양이", "페렛"], + "target_animal": [ + "개", + "고양이", + "페렛" + ], "administration": "경피 도포 (스팟온)", - "indication": "벼룩 + 심장사상충 예방 + 회충 + 구충 + 귀진드기 + 모낭충", - "coverage_summary": { - "covered": ["벼룩", "심장사상충", "회충", "구충", "편충(개)", "귀진드기", "모낭충", "개선충"], - "not_covered": ["진드기", "조충"], + "covered": [ + "벼룩", + "심장사상충", + "회충", + "구충", + "편충(개)", + "귀진드기", + "모낭충", + "개선충" + ], + "not_covered": [ + "진드기", + "조충" + ], "gap_solution": "진드기: 프로닐스팟 추가 / 조충: 안텔민 추가" }, - "dosing": { "interval": "매월 1회", "interval_reason": "심장사상충 L3→L5 30일 윈도우", "minimum_age": "개 7주, 고양이 9주 이상", "minimum_weight": "제한 없음" }, - "weight_products": [ - {"size": "개 XS", "weight_range": "~4kg", "dose": "0.4mL"}, - {"size": "개 S", "weight_range": "4~10kg", "dose": "1.0mL"}, - {"size": "개 M", "weight_range": "10~25kg", "dose": "2.5mL"}, - {"size": "개 L", "weight_range": "25~40kg", "dose": "4.0mL"}, - {"size": "고양이 S", "weight_range": "~4kg", "dose": "0.4mL"}, - {"size": "고양이 M", "weight_range": "4~8kg", "dose": "0.8mL"} + { + "size": "개 XS", + "weight_range": "~4kg", + "dose": "0.4mL" + }, + { + "size": "개 S", + "weight_range": "4~10kg", + "dose": "1.0mL" + }, + { + "size": "개 M", + "weight_range": "10~25kg", + "dose": "2.5mL" + }, + { + "size": "개 L", + "weight_range": "25~40kg", + "dose": "4.0mL" + }, + { + "size": "고양이 S", + "weight_range": "~4kg", + "dose": "0.4mL" + }, + { + "size": "고양이 M", + "weight_range": "4~8kg", + "dose": "0.8mL" + } ], - "special_protocols": { "demodex": "모낭충: 2~4주 간격, 2회 연속 피부검사 음성까지", "mf_treatment": "마이크로필라리아 치료: 월 1회, 성충구제 후 9개월" }, - "warnings": [ "⚠️ 도포 후 48시간 목욕 금지 (셀라멕틴 2시간과 다름)", "⚠️ 등 전체 정중선으로 분산 도포 (한 곳 X)", "⚠️ 도포 부위 마를 때까지 다른 동물과 격리", "⚠️ 핥으면 신경 증상 가능" ], - "clinical_notes": [ "셀라이트보다 커버 넓음: 구충+편충+모낭충까지", "진드기 미커버 → 진드기 유행 시 프로닐 추가", "이미다클로프리드: 접촉 즉시 사멸 (흡혈 전)", "목시덱틴: 전신 흡수 → 심장사상충·내부기생충" ], - "source": { "original": "애드보킷 (Advocate®, 엘랑코)" }, - "storage": "직사광선 피하여 서늘한 곳 보관" -} +} \ No newline at end of file diff --git a/data/master/meloxicash.json b/data/master/meloxicash.json index f148d49..61a83f4 100644 --- a/data/master/meloxicash.json +++ b/data/master/meloxicash.json @@ -1,37 +1,58 @@ { "product_id": "MASTER-011", - "apc_code": "0232523500007", + "apc_code": "0232523510309", "name": "멜록시캐시 CH", "english_name": "Meloxicash (Meloxicam 1mg)", "manufacturer": "국내", "category": "nsaid", "category_display": "진통소염제 (NSAIDs)", - "target_animal": ["개"], + "target_animal": [ + "개" + ], "administration": "경구 (츄어블정)", - "indication": "개의 급성·만성 근골격계 질환 통증경감 및 염증 치료", - "mechanism": { "drug_class": "옥시캄계 NSAIDs", "action": "COX-2 강선택 억제 → 카프로펜보다 위장관 유리", "half_life": "~24시간 (1일 1회 투여 가능)" }, - "dosage": { "standard": "로딩 0.2mg/kg → 유지 0.1mg/kg", "note": "첫날 2배 용량 → 다음날부터 1일 1회", "formula": "유지: 10kg당 1정" }, - "dosage_table": [ - {"weight": "5kg", "loading": "1.0mg", "tablets": "0.5정"}, - {"weight": "10kg", "loading": "2.0mg", "tablets": "1정"}, - {"weight": "15kg", "loading": "3.0mg", "tablets": "1.5정"}, - {"weight": "20kg", "loading": "4.0mg", "tablets": "2정"}, - {"weight": "30kg", "loading": "6.0mg", "tablets": "3정"}, - {"weight": "40kg", "loading": "8.0mg", "tablets": "4정"} + { + "weight": "5kg", + "loading": "1.0mg", + "tablets": "0.5정" + }, + { + "weight": "10kg", + "loading": "2.0mg", + "tablets": "1정" + }, + { + "weight": "15kg", + "loading": "3.0mg", + "tablets": "1.5정" + }, + { + "weight": "20kg", + "loading": "4.0mg", + "tablets": "2정" + }, + { + "weight": "30kg", + "loading": "6.0mg", + "tablets": "3정" + }, + { + "weight": "40kg", + "loading": "8.0mg", + "tablets": "4정" + } ], - "absolute_contraindications": [ { "item": "다른 NSAIDs 동시 투여 금지", @@ -46,28 +67,28 @@ "reason": "31일 반복 투여 시 신장 손상 입증 (PMID:41549544)" } ], - "washout_period": { "to_other_nsaid": "3~5일", "to_steroid": "5~7일" }, - "warnings": [ "⚠️ 탈수·저혈압 상태 투여 금지 (신장독성)", "⚠️ 장기 투여 시 정기 혈액검사 필요", "⚠️ 구토, 흑색변, 식욕부진 시 즉시 중단", "✅ 카프로펜보다 COX-2 선택성 높음" ], - "clinical_notes": [ "로딩 용량: 첫날 치료 농도 즉시 달성", "수술 후 24시간 통증: 로베나콕시브보다 우수 (PMID:30637777)", "OA 개: 마바콕시브와 동등 효과 (PMID:24859353)" ], - "source": { - "pmid": ["10769766", "24859353", "30637777", "32059002"] + "pmid": [ + "10769766", + "24859353", + "30637777", + "32059002" + ] }, - "storage": "실온 보관" -} +} \ No newline at end of file diff --git a/data/master/nexgard_spectra.json b/data/master/nexgard_spectra.json index 19f9471..accc3cd 100644 --- a/data/master/nexgard_spectra.json +++ b/data/master/nexgard_spectra.json @@ -1,24 +1,39 @@ { "product_id": "MASTER-001", - "apc_code": "0519-NEXGARD-SPECTRA", + "apc_code": null, "name": "넥스가드 스펙트라", "english_name": "NexGard Spectra (Afoxolaner + Milbemycin Oxime)", "manufacturer": "베링거인겔하임 (Boehringer Ingelheim)", "category": "antiparasitic", "category_display": "올인원 구충제", - "target_animal": ["개"], + "target_animal": [ + "개" + ], "administration": "경구 (소고기맛 츄어블)", - "image_url": "/images/nexgard_spectra.png", - + "image_url": "data:image/jpeg;base64,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", "indication": "벼룩·진드기 구제 + 심장사상충 예방 + 내부기생충 구제", - "coverage": { "external": { - "fleas": {"covered": true, "note": "6~8시간 내 사멸"}, - "ticks": {"covered": true, "note": "12~24시간 내 사멸"}, - "demodex": {"covered": true, "note": "모낭충증 치료"}, - "sarcoptes": {"covered": true, "note": "개선충증"}, - "ear_mites": {"covered": true, "note": "귀진드기"} + "fleas": { + "covered": true, + "note": "6~8시간 내 사멸" + }, + "ticks": { + "covered": true, + "note": "12~24시간 내 사멸" + }, + "demodex": { + "covered": true, + "note": "모낭충증 치료" + }, + "sarcoptes": { + "covered": true, + "note": "개선충증" + }, + "ear_mites": { + "covered": true, + "note": "귀진드기" + } }, "heartworm": { "covered": true, @@ -26,19 +41,39 @@ "limitation": "성충(L5+)은 구제 불가" }, "intestinal": { - "roundworm": {"covered": true, "note": "회충"}, - "hookworm": {"covered": true, "note": "구충"}, - "whipworm": {"covered": true, "note": "편충 - 하트가드에 없는 커버!"}, - "tapeworm": {"covered": false, "note": "❌ 조충 미커버 - Praziquantel 필요"} + "roundworm": { + "covered": true, + "note": "회충" + }, + "hookworm": { + "covered": true, + "note": "구충" + }, + "whipworm": { + "covered": true, + "note": "편충 - 하트가드에 없는 커버!" + }, + "tapeworm": { + "covered": false, + "note": "❌ 조충 미커버 - Praziquantel 필요" + } } }, - "coverage_summary": { - "covered": ["벼룩", "진드기", "심장사상충", "회충", "구충", "편충", "모낭충"], - "not_covered": ["조충(촌충)"], + "covered": [ + "벼룩", + "진드기", + "심장사상충", + "회충", + "구충", + "편충", + "모낭충" + ], + "not_covered": [ + "조충(촌충)" + ], "gap_solution": "안텔민(Praziquantel) 3개월마다 보조 투약" }, - "dosing": { "interval": "매월 1회", "interval_reason": "심장사상충 L3→L5 전환 시간 ~60일, 30일 간격으로 차단", @@ -47,52 +82,87 @@ "minimum_age": "8주 이상", "minimum_weight": "2kg 이상" }, - "weight_products": [ - {"size": "XS", "weight_range": "2~3.5kg", "afoxolaner": "9.4mg", "milbemycin": "1.9mg", "price_approx": "16,000원"}, - {"size": "S", "weight_range": "3.6~7.5kg", "afoxolaner": "18.8mg", "milbemycin": "3.8mg", "price_approx": "17,000원"}, - {"size": "M", "weight_range": "7.6~15kg", "afoxolaner": "37.5mg", "milbemycin": "7.5mg", "price_approx": "18,000원"}, - {"size": "L", "weight_range": "15.1~30kg", "afoxolaner": "75mg", "milbemycin": "15mg", "price_approx": "20,000원"}, - {"size": "XL", "weight_range": "30.1~60kg", "afoxolaner": "150mg", "milbemycin": "30mg", "price_approx": "22,000원"} + { + "size": "XS", + "weight_range": "2~3.5kg", + "afoxolaner": "9.4mg", + "milbemycin": "1.9mg", + "price_approx": "16,000원" + }, + { + "size": "S", + "weight_range": "3.6~7.5kg", + "afoxolaner": "18.8mg", + "milbemycin": "3.8mg", + "price_approx": "17,000원" + }, + { + "size": "M", + "weight_range": "7.6~15kg", + "afoxolaner": "37.5mg", + "milbemycin": "7.5mg", + "price_approx": "18,000원" + }, + { + "size": "L", + "weight_range": "15.1~30kg", + "afoxolaner": "75mg", + "milbemycin": "15mg", + "price_approx": "20,000원" + }, + { + "size": "XL", + "weight_range": "30.1~60kg", + "afoxolaner": "150mg", + "milbemycin": "30mg", + "price_approx": "22,000원" + } ], - "warnings": [ "⚠️ 경련/간질 이력이 있는 개는 수의사 상담 필수 (이소자졸린 계열 FDA 경고)", "⚠️ 투약 전 심장사상충 검사 필수 (감염 상태에서 투약 시 위험)", "⚠️ 8주(2개월) 미만, 2kg 미만 투여 금지", "⚠️ 콜리 품종은 MDR1 유전자 검사 후 투여 권장" ], - "contraindications": [ "8주 미만, 2kg 미만", "심장사상충 양성 (미검사 포함)", "경련/간질 이력 (상대적 금기)" ], - "side_effects": [ "드물게 구토, 설사, 무기력, 식욕부진 (대부분 일시적)", "매우 드물게 근육떨림, 운동실조, 경련 (FDA 경고)" ], - "fda_warning": { "year": 2018, "content": "이소자졸린 계열에서 드물게 신경계 부작용 보고", - "symptoms": ["근육 떨림", "운동실조", "경련"], + "symptoms": [ + "근육 떨림", + "운동실조", + "경련" + ], "fda_statement": "대다수 동물에서 안전하고 효과적" }, - "comparison_with_3set": { "convenience": "넥스가드 스펙트라 우위 (한 알로 끝)", "cost": "3종 세트가 저렴 (~15,000원 vs ~20,000원)", "coverage": "넥스가드가 편충까지 추가 커버", "tapeworm_gap": "둘 다 안텔민 보조 필요" }, - "storage": "직사광선 피하여 서늘한 곳 보관", - "source": { - "guidelines": ["ESCCAP GL1/GL3/GL5 (2024-2025)", "CAPC (2024)", "AHS Think 12 (2024)"], + "guidelines": [ + "ESCCAP GL1/GL3/GL5 (2024-2025)", + "CAPC (2024)", + "AHS Think 12 (2024)" + ], "fda": "FDA Isoxazoline Fact Sheet (2018)", - "pmid": ["40234985", "30201031", "30516132", "32485788"] + "pmid": [ + "40234985", + "30201031", + "30516132", + "32485788" + ] } -} +} \ No newline at end of file diff --git a/data/master/oridermyl.json b/data/master/oridermyl.json index 42e0951..139ac67 100644 --- a/data/master/oridermyl.json +++ b/data/master/oridermyl.json @@ -1,39 +1,36 @@ { "product_id": "MASTER-007", - "apc_code": "0519-ORIDERMYL", + "apc_code": "0231065620103", "name": "오리더밀", "english_name": "Oridermyl (Nystatin+Neomycin+Triamcinolone)", "manufacturer": "TVM", "category": "otic", "category_display": "귀염증 치료제", - "target_animal": ["개", "고양이"], + "target_animal": [ + "개", + "고양이" + ], "administration": "점이 (귀에 투약)", - "indication": "외이염, 귀진드기 감염, 세균성/진균성 귀감염", - "mechanism": { "nystatin": "항진균 (칸디다, 말라세지아)", "neomycin": "항균 (그람음성균)", "triamcinolone": "항염증 (가려움, 부종 완화)", "permethrin": "귀진드기 구제" }, - "dosage": { "standard": "1일 1~2회", "amount": "귀당 5~10방울", "duration": "7~14일" }, - "warnings": [ "⚠️ 고막 천공 시 사용 금지", "⚠️ 투약 전 귀 세정 권장", "⚠️ 장기 사용 시 내성균 주의" ], - "contraindications": [ "고막 천공/손상", "아미노글리코사이드 과민증" ], - "storage": "실온 보관" -} +} \ No newline at end of file diff --git a/data/master/selight.json b/data/master/selight.json index d3b315e..024925d 100644 --- a/data/master/selight.json +++ b/data/master/selight.json @@ -1,69 +1,119 @@ { "product_id": "MASTER-010", - "apc_code": "0519-SELIGHT", + "apc_code": "0232545420203", "name": "셀라이트", "english_name": "Selight (Selamectin)", "manufacturer": "국내산 (레볼루션 제네릭)", "category": "antiparasitic", "category_display": "스팟온 종합구충제", - "target_animal": ["개", "고양이"], + "target_animal": [ + "개", + "고양이" + ], "administration": "경피 도포 (스팟온)", - "indication": "심장사상충 예방 + 벼룩 + 귀진드기 + 개선충(옴) + 회충 + 이 + 참진드기(개)", - "coverage_summary": { - "covered": ["심장사상충", "벼룩", "귀진드기", "개선충", "회충", "이", "진드기(개)"], - "not_covered": ["조충(촌충)", "편충", "구충(개)"], + "covered": [ + "심장사상충", + "벼룩", + "귀진드기", + "개선충", + "회충", + "이", + "진드기(개)" + ], + "not_covered": [ + "조충(촌충)", + "편충", + "구충(개)" + ], "gap_solution": "안텔민 3개월마다 보조 투약 (조충·편충 보완)" }, - "dosing": { "interval": "매월 1회", "interval_reason": "심장사상충 L3→L5 전환 30일 윈도우 + 벼룩 라이프사이클", "minimum_age": "6주 이상", "minimum_weight": "제한 없음" }, - "weight_products": [ - {"size": "SS", "weight_range": "~2.5kg", "dose": "0.25mL (15mg)"}, - {"size": "S", "weight_range": "2.5~5kg", "dose": "0.5mL (30mg)"}, - {"size": "M", "weight_range": "5~10kg", "dose": "0.5mL (60mg)"}, - {"size": "L", "weight_range": "10~20kg", "dose": "1.0mL (120mg)"}, - {"size": "XL", "weight_range": "20~40kg", "dose": "2.0mL (240mg)"} + { + "size": "SS", + "weight_range": "~2.5kg", + "dose": "0.25mL (15mg)" + }, + { + "size": "S", + "weight_range": "2.5~5kg", + "dose": "0.5mL (30mg)" + }, + { + "size": "M", + "weight_range": "5~10kg", + "dose": "0.5mL (60mg)" + }, + { + "size": "L", + "weight_range": "10~20kg", + "dose": "1.0mL (120mg)" + }, + { + "size": "XL", + "weight_range": "20~40kg", + "dose": "2.0mL (240mg)" + } ], - "special_protocols": { "tick_intensive": "진드기 집중: 2주 간격 3회 → 이후 월 1회", "sarcoptes": "옴 치료: Day 0 + Day 30 (2회)", "ear_mite_cat": "귀진드기(고양이): 단일 도포 (100%)", "ear_mite_dog": "귀진드기(개): Day 0 + Day 30 (2회 - 이도 깊음)" }, - "efficacy_data": [ - {"target": "심장사상충", "efficacy": "100%", "source": "PMID:10940527"}, - {"target": "벼룩(C.felis)", "efficacy": "≥98.9%", "source": "PMID:10940521"}, - {"target": "귀진드기(고양이)", "efficacy": "94~100%", "source": "PMID:10940530"}, - {"target": "개선충(옴)", "efficacy": "100% (Day60)", "source": "PMID:10940530"} + { + "target": "심장사상충", + "efficacy": "100%", + "source": "PMID:10940527" + }, + { + "target": "벼룩(C.felis)", + "efficacy": "≥98.9%", + "source": "PMID:10940521" + }, + { + "target": "귀진드기(고양이)", + "efficacy": "94~100%", + "source": "PMID:10940530" + }, + { + "target": "개선충(옴)", + "efficacy": "100% (Day60)", + "source": "PMID:10940530" + } ], - "warnings": [ "⚠️ 6주 미만 사용 금지", "⚠️ 도포 후 2시간 이후 목욕 가능", "⚠️ 피부 상처 부위 도포 금지", "✅ 콜리 품종 안전 (PMID:10940536 확인)" ], - "clinical_notes": [ "레볼루션(Zoetis) 국내산 제네릭 - 동일 성분·동일 효능", "개+고양이 겸용 (체중별 제품 선택)", "조충·편충 미커버 → 안텔민 병행 필요", "도포 후 건조될 때까지 다른 동물이 핥지 않도록" ], - "source": { - "guidelines": ["AHS 2024", "ESCCAP GL5 2024", "CAPC 2024"], - "pmid": ["10940527", "10940521", "10940530", "10940536"] + "guidelines": [ + "AHS 2024", + "ESCCAP GL5 2024", + "CAPC 2024" + ], + "pmid": [ + "10940527", + "10940521", + "10940530", + "10940536" + ] }, - "storage": "직사광선 피하여 서늘한 곳 보관" -} +} \ No newline at end of file diff --git a/data/master/serenia_maropitant.json b/data/master/serenia_maropitant.json index f827982..aa2c7fa 100644 --- a/data/master/serenia_maropitant.json +++ b/data/master/serenia_maropitant.json @@ -1,23 +1,22 @@ { "product_id": "MASTER-004", - "apc_code": "0519-SERENIA", + "apc_code": "0231884620107", "name": "세레니아 정", "english_name": "Serenia (Maropitant citrate)", "manufacturer": "조에티스 (Zoetis)", "category": "antiemetic", "category_display": "항구토제", - "target_animal": ["개", "고양이"], + "target_animal": [ + "개", + "고양이" + ], "administration": "경구 (정제)", - "image_url": "/images/serenia.png", - "indication": "급성 구토, 멀미(차멀미) 예방 및 치료", - "mechanism": { "drug_class": "NK1 수용체 길항제", "action": "구토중추의 NK1 수용체 차단 → 구토 억제", "feature": "중추 및 말초 모두 작용" }, - "dosage": { "acute_vomiting": { "dose": "2mg/kg 1일 1회", @@ -29,45 +28,68 @@ "note": "공복 상태 권장 (효과 향상)" } }, - "dosage_table": [ - {"weight": "3kg", "acute": "6mg", "motion": "24mg"}, - {"weight": "5kg", "acute": "10mg", "motion": "40mg"}, - {"weight": "10kg", "acute": "20mg", "motion": "80mg"}, - {"weight": "15kg", "acute": "30mg", "motion": "120mg"}, - {"weight": "20kg", "acute": "40mg", "motion": "160mg"} + { + "weight": "3kg", + "acute": "6mg", + "motion": "24mg" + }, + { + "weight": "5kg", + "acute": "10mg", + "motion": "40mg" + }, + { + "weight": "10kg", + "acute": "20mg", + "motion": "80mg" + }, + { + "weight": "15kg", + "acute": "30mg", + "motion": "120mg" + }, + { + "weight": "20kg", + "acute": "40mg", + "motion": "160mg" + } + ], + "available_strengths": [ + "16mg", + "24mg", + "60mg", + "160mg" ], - - "available_strengths": ["16mg", "24mg", "60mg", "160mg"], - "warnings": [ "⚠️ 16주(4개월) 미만 강아지 금지", "⚠️ 고양이: 급성 구토에만 사용 (멀미 적응증 없음)", "⚠️ 5일 이상 연속 투여 금지 (급성 구토)", "⚠️ 차멀미 예방 시 공복 상태에서 효과적" ], - "contraindications": [ "16주 미만 강아지", "위장관 폐색 의심 시 (구토 억제가 위험)", "독소 섭취 후 (구토 유도 필요 시)" ], - "side_effects": { - "common": ["침흘림 (일시적)", "무기력"], - "rare": ["설사", "식욕부진"] + "common": [ + "침흘림 (일시적)", + "무기력" + ], + "rare": [ + "설사", + "식욕부진" + ] }, - "clinical_notes": [ "구토 원인 파악 필수 (단순 증상 억제 아님)", "위장관 폐색, 독소 섭취 시에는 구토 유도가 필요할 수 있음", "멀미 예방: 이동 2시간 전 + 공복 = 최대 효과" ], - "storage": "실온 보관", - "source": { "product_info": "Zoetis Serenia Product Information", "notes": "FDA 승인 수의용 항구토제" } -} +} \ No newline at end of file diff --git a/data/master/simparica.json b/data/master/simparica.json index 8987a02..6913d4a 100644 --- a/data/master/simparica.json +++ b/data/master/simparica.json @@ -1,6 +1,6 @@ { "product_id": "MASTER-019", - "apc_code": "0519-SIMPARICA", + "apc_code": "0232571730106", "name": "심파리카 트리오", "english_name": "Simparica Trio (Sarolaner+Moxidectin+Pyrantel)", "manufacturer": "조에티스 (Zoetis)", diff --git a/data/master/terbiderm.json b/data/master/terbiderm.json index da983fb..c27b9cd 100644 --- a/data/master/terbiderm.json +++ b/data/master/terbiderm.json @@ -1,38 +1,35 @@ { "product_id": "MASTER-008", - "apc_code": "0519-TERBIDERM", + "apc_code": "0232064110102", "name": "터비덤 스프레이", "english_name": "Terbiderm (Terbinafine)", "manufacturer": "동방동물약품", "category": "antifungal", "category_display": "항진균제 (피부)", - "target_animal": ["개", "고양이"], + "target_animal": [ + "개", + "고양이" + ], "administration": "외용 (스프레이)", - "indication": "피부사상균증 (백선), 말라세지아 피부염", - "mechanism": { "drug_class": "알릴아민계 항진균제", "action": "스쿠알렌 에폭시다제 억제 → 진균 세포막 합성 차단" }, - "dosage": { "frequency": "1일 1~2회", "duration": "2~4주 (완치 후 1주 추가)", "application": "병변 및 주변 2cm까지 도포" }, - "warnings": [ "⚠️ 눈, 점막 접촉 피할 것", "⚠️ 핥지 못하게 엘리자베스 칼라 권장", "⚠️ 경구 항진균제 병용 시 효과 증가" ], - "clinical_notes": [ "피부사상균 배양 검사 권장 (치료 전)", "환경 소독 병행 필수 (재감염 방지)", "장모종은 병변 주변 제모 권장" ], - "storage": "실온 보관, 화기 주의" -} +} \ No newline at end of file diff --git a/data/master/tiergard.json b/data/master/tiergard.json index 6838e96..e153369 100644 --- a/data/master/tiergard.json +++ b/data/master/tiergard.json @@ -1,50 +1,393 @@ { "product_id": "MASTER-015", - "apc_code": "0231089400001", + "apc_code": "0231089420409", "name": "티어가드 정", "english_name": "TierGard (Tylosin tartrate)", - "manufacturer": "국내", + "name_meaning": "Tier(동물) + Guard(보호) — 동물 안구·피부 감염 보호", + "manufacturer": "(주)이엘티사이언스", + "country": "한국", + "global_status": "한국 독자 허가 제품 (글로벌 개용 60mg 정제 시판 없음)", + "approval_date": "2013-03-20", + "approval_number": "159", "category": "antibiotic", "category_display": "항생제 (마크롤라이드계)", - "target_animal": ["개"], + "target_animal": [ + "개" + ], "administration": "경구 (정제)", - - "indication": "결막염, 눈물 자국(세균성), 농피증 치료", - + "indication": "포도상구균·연쇄상구균에 의한 결막염, 농피증 치료", "mechanism": { - "drug_class": "마크롤라이드계 항생제 (16원환)", - "action": "세균 50S 리보솜 결합 → 단백 합성 억제", - "spectrum": "포도상구균, 연쇄상구균, 마이코플라즈마" + "drug_class": "마크롤라이드계 항생제 (16원환 Macrolide)", + "action": "세균 50S 리보솜 결합 → 단백 합성 억제 → 정균 작용", + "spectrum": { + "covered": [ + "Staphylococcus pseudintermedius", + "Staphylococcus aureus", + "Streptococcus spp.", + "Mycoplasma spp." + ], + "not_covered": [ + "Pseudomonas aeruginosa", + "E. coli", + "Proteus spp.", + "진균류" + ], + "susceptibility_rate": "82.61% (항생제 미노출 S. pseudintermedius, PMID: 20960412)" + }, + "tear_staining_mechanism": { + "description": "세균성 분비물 감소 + 마크롤라이드 항염증 효과 복합 작용", + "pathway": [ + "내안각·결막 세균 (S. pseudintermedius, Mycoplasma 등)", + "타일로신 → 세균 50S 리보솜 결합 → 단백 합성 억제", + "세균 부하 감소", + "결막·비루관 주변 만성 염증 감소 + 세균성 분비물 감소", + "눈물관 주변 환경 개선", + "포르피린 착색 유발 삼출물 감소", + "눈물 자국 완화 (수주 이상 소요)" + ], + "limitation": "이미 착색된 털은 항생제로 탈색 불가 — 새 털이 자라면서 교체됨" + }, + "porphyrin_explanation": { + "what": "혈액 속 헤모글로빈의 헴(heme) 합성 과정에서 생성되는 대사산물", + "why_staining": "눈물에 과도하게 분비되면 흰 털에 갈색-적갈색 얼룩", + "why_darkens": "빛(자외선)에 노출되면 산화되어 색이 짙어짐", + "note": "포르피린 자체는 무해하나 미용적으로 문제" + } }, - "dosage": { - "standard": "10~20mg/kg 1일 2회", - "duration": "4주간", - "note": "소형견(말티즈·비숑) 주 사용" + "standard": "20mg/kg (타일로신 기준)", + "approved_range": "10~20mg/kg (한국 허가사항)", + "confirmed_dose": "20mg/kg bid (임상 근거 확정)", + "frequency": "1일 2회 (12시간 간격)", + "duration": "4주 (한국 허가사항)", + "with_food": "권장 (위장관 자극 최소화)", + "note": "반감기 54분으로 짧아 1일 2회 투여 필수" }, - "dosage_table": [ - {"weight": "2kg", "dose": "40mg", "tablets": "20mg × 2정"}, - {"weight": "3kg", "dose": "60mg", "tablets": "60mg × 1정"}, - {"weight": "5kg", "dose": "100mg", "tablets": "60mg × 1.7정"}, - {"weight": "10kg", "dose": "200mg", "tablets": "200mg × 1정"}, - {"weight": "15kg", "dose": "300mg", "tablets": "200mg × 1.5정"} + { + "weight": "2kg", + "dose": "40mg", + "tablets": "20mg × 2정" + }, + { + "weight": "3kg", + "dose": "60mg", + "tablets": "60mg × 1정", + "breed_example": "말티즈·요크셔" + }, + { + "weight": "5kg", + "dose": "100mg", + "tablets": "60mg × 1.5~2정", + "breed_example": "푸들·비숑" + }, + { + "weight": "6kg", + "dose": "120mg", + "tablets": "60mg × 2정", + "breed_example": "시추·페키니즈" + }, + { + "weight": "9kg", + "dose": "180mg", + "tablets": "60mg × 3정", + "breed_example": "코커스패니얼" + }, + { + "weight": "10kg", + "dose": "200mg", + "tablets": "200mg × 1정", + "note": "중형견 경계" + }, + { + "weight": "15kg", + "dose": "300mg", + "tablets": "200mg × 1.5정" + }, + { + "weight": "20kg", + "dose": "400mg", + "tablets": "200mg × 2정" + } ], - - "available_strengths": ["20mg", "60mg", "200mg"], - + "available_strengths": [ + "20mg", + "60mg", + "200mg" + ], + "strength_recommendation": { + "small_dog": "60mg 정이 가장 실용적 (3~6kg 소형견)", + "medium_large": "10kg 이상은 200mg 정 전환 권장" + }, + "treatment_timeline": { + "description": "효과가 나타나는 시기 (눈물자국 기준)", + "phases": [ + { + "week": "1~2주", + "expected": "결막 충혈·분비물 감소 (세균성인 경우)" + }, + { + "week": "2~3주", + "expected": "눈물 분비량 감소 시작" + }, + { + "week": "4주", + "expected": "눈물 자국 색이 옅어지기 시작" + }, + { + "week": "4주 이후", + "expected": "새 털이 자라면서 착색 털 교체 (트리밍 병행)" + } + ], + "realistic_expectation": "효과를 눈으로 확인하려면 최소 4~8주 소요", + "important_note": "이미 착색된 털은 항생제로 탈색되지 않음" + }, + "follow_up_points": { + "description": "4주 복용 후 경과 관찰 포인트", + "checkpoints": [ + { + "timing": "2주차", + "items": [ + "병변 면적 감소 확인", + "눈물 분비량 변화", + "새 병변 발생 여부" + ] + }, + { + "timing": "4주차", + "items": [ + "완치 여부 판단", + "추가 연장 필요성 결정", + "착색 털 트리밍 권고" + ] + }, + { + "timing": "치료 완료 후", + "items": [ + "근본 원인(알레르기·구조적) 교정 여부 확인", + "재발 모니터링" + ] + } + ], + "treatment_failure_signs": [ + "2주 투여 후 뚜렷한 개선 없음 → 감수성 재검", + "반복 재발 (3개월 내) → 원인 감별 + 배양 검사", + "MRSP 의심 → 다약제 내성 확인" + ] + }, + "relapse_prevention": { + "description": "재발 방지 관리법", + "daily_care": [ + { + "action": "외안각 세정", + "detail": "매일 생리식염수나 안과용 세정제로 내안각(눈물 고이는 부분) 닦기" + }, + { + "action": "물 관리", + "detail": "정수 또는 생수 사용 (철분 포함 수돗물은 포르피린 착색 악화 가능)" + }, + { + "action": "미용 관리", + "detail": "착색된 털은 정기적으로 트리밍" + } + ], + "dietary_management": { + "principle": "알레르기 원인 제거", + "recommendation": "첨가물 없는 단순 식이로 변경 검토" + }, + "root_cause_correction": { + "importance": "근본 원인 미교정 시 치료 중단 후 재발 빈번", + "causes_to_address": [ + "비루관 협착", + "삼모증", + "안검 내번", + "알레르기" + ], + "warning": "마크롤라이드 100일 이상 장기 투여 시 내성균 선택 위험 (PMID: 32109782)" + }, + "relapse_rate": "28.6% (3개월 내, PMID: 7994702)" + }, + "concurrent_treatments": { + "description": "병행 시술 안내", + "structural_causes": { + "conditions": [ + "비루관 협착·폐쇄", + "속눈썹 이상(삼모증)", + "안검 내번" + ], + "treatment": "수의안과 전문 처치/수술 필요", + "note": "구조적 원인은 항생제로 해결 불가" + }, + "nasolacrimal_flushing": { + "description": "비루관 세척", + "purpose": "비루관 협착 예방 및 눈물 배출 개선", + "frequency": "수의사가 주기적으로 시행", + "when_needed": "비루관 폐쇄 의심 시, 반복적 눈물 과다 시" + }, + "topical_treatments": { + "eye_cleaning": "안과용 세정제로 외안부 세정 병행", + "note": "전신 항생제 + 국소 관리 병행 시 효과 극대화" + } + }, + "tear_staining_info": { + "description": "눈물자국(Tear Staining) 상세 정보", + "causes_multifactorial": { + "bacterial": { + "role": "내안각 만성 세균 감염 → 분비물 증가", + "tylosin_helps": true + }, + "structural": { + "conditions": [ + "비루관 협착·폐쇄", + "삼모증", + "안검 내번" + ], + "tylosin_helps": false, + "treatment": "수술/시술 필요" + }, + "allergic": { + "conditions": [ + "음식 알레르기", + "환경 알레르기" + ], + "tylosin_helps": false, + "treatment": "원인 제거 필요" + }, + "dietary": { + "issue": "포르피린 전구체 함유 식품 과다", + "tylosin_helps": false + }, + "breed_predisposition": { + "issue": "단두형 안구 돌출, 얕은 안와", + "tylosin_helps": false, + "note": "해부학적 한계" + } + }, + "high_risk_breeds": [ + { + "breed": "말티즈", + "reason": "흰 털 + 비루관 저형성 빈번" + }, + { + "breed": "비숑 프리제", + "reason": "흰 털 + 내안각 삼모증" + }, + { + "breed": "토이·미니어처 푸들", + "reason": "흰 털 개체에서 두드러짐" + }, + { + "breed": "시추", + "reason": "안검불완전폐쇄 82%, 삼모증 100%, TBUT 4초" + }, + { + "breed": "퍼그·페키니즈·불독", + "reason": "단두형 안구 돌출" + } + ], + "key_message": "타일로신은 세균성 원인에만 작용. 구조적·알레르기성 원인 먼저 교정해야 효과 극대화" + }, + "pharmacokinetics": { + "t_half": "54분 (IV, 개)", + "Vd": "1.7-2.0 L/kg (높음 → 조직 침투 우수)", + "primary_excretion": "담즙 (간→장), bile/serum ratio 1,230-3,780", + "renal_excretion": "극소량", + "accumulation": "없음 (29일, 2년 투여 확인)", + "bioavailability_im": "92.6%", + "clinical_implication": "반감기 매우 짧아 1일 2회 투여 필수" + }, + "safety": { + "NOAEL_dog_2yr": "100 mg/kg/day", + "LD50_dog_oral": ">800 mg/kg", + "clinical_dose": "40 mg/kg/day (20mg/kg bid)", + "safety_margin": "2.5배 (NOAEL/임상용량)", + "liver_burden": "주 대사·배설 경로이나 100mg/kg/day까지 중대한 간 손상 없음", + "kidney_burden": "신장 배설 극소량 → 부담 매우 낮음", + "gi_side_effect": "일과성 위염 3.3% (30마리 중 1마리)", + "long_term_risk": "100일 이상 투여 시 마크롤라이드 내성균 선택 위험" + }, "warnings": [ - "⚠️ 세균성 원인에만 효과 (구조적·알레르기성 X)", - "⚠️ 비루관 협착 시 수술/시술 필요", - "⚠️ 4주 이상 투여 시 내성균 주의" + "⚠️ 세균성 원인에만 효과 (구조적·알레르기성 원인은 별도 처치 필요)", + "⚠️ 비루관 협착 시 수술/시술 필요 — 항생제로 해결 불가", + "⚠️ 이미 착색된 털은 탈색 불가 — 트리밍으로 제거", + "⚠️ 4주 이상 장기 투여 시 내성균 주의", + "⚠️ 식사와 함께 투여 (공복 시 위장관 자극 가능)" + ], + "contraindications": [ + "❌ 마크롤라이드계 항생제 과민반응·쇼크 병력", + "❌ 린코사마이드계 항생제(린코마이신·클린다마이신) 동시 투여", + "❌ 다른 마크롤라이드 동시 투여", + "❌ 고양이 (개 전용 제품)", + "⚠️ 임신·수유 중 암캐 — 수의사 상담 후 결정" ], - "clinical_notes": [ - "눈물 자국: 세균 부하 감소 → 염증 감소 → 완화", - "포르피린 착색: 햇빛 노출 시 더 진해짐", + "눈물 자국: 세균 부하 감소 → 염증 감소 → 분비물 감소 → 완화", + "포르피린 착색: 햇빛 노출 시 더 진해짐 (실내견보다 야외 활동 많은 개에서 더 진함)", "구조적 원인 먼저 교정해야 효과 극대화", - "흰 털 품종(말티즈, 비숑)에서 눈물 자국 두드러짐" + "흰 털 품종(말티즈, 비숑)에서 눈물 자국 두드러짐", + "한국 독자 허가 — 글로벌에 개용 60mg 정제 없음" ], - - "storage": "실온 보관" -} + "patient_education_qa": [ + { + "q": "왜 눈 밑이 갈색으로 얼룩져 있나요?", + "a": "눈물에 포르피린이라는 물질이 포함되어 있어요. 눈물이 흘러넘치면 털에 쌓이고, 빛에 의해 산화되면서 갈색으로 변합니다." + }, + { + "q": "티어가드를 먹이면 눈물 자국이 없어지나요?", + "a": "이미 생긴 자국은 사라지지 않습니다. 세균성 원인을 억제해서 새로 자라는 털에 자국이 덜 생기게 합니다. 기존 착색 털은 트리밍으로 제거하세요." + }, + { + "q": "효과는 언제 나타나나요?", + "a": "1~2주: 분비물 감소, 2~4주: 눈물량 감소, 4~8주: 새 털에서 자국 감소. 눈으로 확인하려면 최소 4~8주 소요됩니다." + }, + { + "q": "4주 먹였는데 효과가 없어요", + "a": "두 가지를 확인하세요: 1) 구조적 원인(비루관 협착, 삼모증) → 수의안과 진찰 필요, 2) 타일로신 내성균 → 세균 배양·감수성 검사" + }, + { + "q": "재발을 막으려면 계속 먹여야 하나요?", + "a": "근본 원인 미교정 시 재발합니다. 장기 투여(100일+)는 내성 위험이 있어 권장하지 않습니다. 일상 관리(외안각 세정, 물 관리, 트리밍)와 근본 원인 교정이 장기 해결책입니다." + }, + { + "q": "간이나 신장에 부담이 큰 약인가요?", + "a": "담즙으로 배설되며 신장 부담은 매우 낮습니다. 2년 장기 시험에서 임상 용량의 2.5배까지 중대한 손상 없었습니다. 4주 투여 범위에서 안전합니다." + } + ], + "references": { + "korean_approval": "APDB 허가사항 (APC: 0231089400001, 허가번호: 159, 2013-03-20)", + "clinical_efficacy": [ + "Scott et al. 1994 (PMID: 7994702) — 농피증 90.5% 성공률, n=21", + "Harvey 1996 (PMID: 8873399) — 표재성 농피증 80%, n=30", + "Scott BA et al. 2010 (PMID: 20960412) — In vitro 감수성 82.61%, n=103" + ], + "pk_safety": [ + "Weisel et al. 1977 (PMID: 842925) — PK: t½ 54분, Vd 1.7L/kg", + "Kim et al. 2011 (PMID: 21068517) — IM 생체이용률 92.6%", + "JECFA/WHO 1991 — 개 2년 독성시험, NOAEL 100mg/kg/day" + ], + "pathogen_data": [ + "Murphy et al. 1978 (PMID: 624664) — 결막염 원인균 (S. aureus 68%)", + "Casemiro et al. 2025 (PMID: 38768284) — 각막염 병원체", + "Cooper et al. 1993 (PMID: 8393208) — Mycoplasma 탁월한 활성" + ], + "resistance_data": [ + "Kang et al. 2014 (PMID: 24690601) — 한국 MRSP 36%", + "Cazer et al. 2020 (PMID: 32109782) — 100일+ 투여 시 내성 증가" + ], + "tear_staining": [ + "Sebbag & Sanchez 2023 (PMID: 36585820) — 단두형 안구 증후군 총설" + ] + }, + "storage": "실온 보관, 직사광선 피함", + "last_updated": "2026-03-19", + "version": "2.0", + "source_documents": [ + "tiergard_tylosin_conjunctivitis_tearstain_v3.md", + "tiergard_tylosin_pyoderma_v2.md" + ], + "indication_detail": { + "primary": "포도상구균·연쇄상구균에 의한 결막염, 농피증 치료", + "secondary": "세균성 눈물자국(tear staining) 완화 보조", + "note": "눈물자국 직접 치료 RCT 없음. 세균성 원인 있는 경우 임상적으로 사용됨." + } +} \ No newline at end of file diff --git a/docs/AI_MAPPING_ARCHITECTURE.md b/docs/AI_MAPPING_ARCHITECTURE.md new file mode 100644 index 0000000..1ef2754 --- /dev/null +++ b/docs/AI_MAPPING_ARCHITECTURE.md @@ -0,0 +1,347 @@ +# 동물약 투약지도서 API - AI 매핑 아키텍처 + +> 작성일: 2026-03-19 +> 작성자: 용림 🐉 + +--- + +## 1. 문제 정의 + +### 현재 상황 + +``` +약국 POS (PIT3000) + └─ DrugCode: LB000003158 + └─ GoodsName: "안텔민뽀삐(5kg이하)" + └─ BARCODE: 9990000001134 (자체 바코드) ❌ APC 아님 + └─ CD_ITEM_UNIT_MEMBER + └─ 0230237010107 (APC) ✅ 있으면 좋음 + └─ 9990000001134 (자체) ← 이것만 있는 경우 多 +``` + +### 핵심 문제 + +| 상황 | 비율 | 처리 방법 | +|------|------|----------| +| APC 매핑 완료 | ~18% (17건) | APC로 바로 조회 ✅ | +| APC 미매핑 | ~82% (32건+) | **제품명 기반 AI 매핑 필요** ⚠️ | + +### 왜 어려운가? + +1. **약국마다 바코드 체계 다름** + - A약국: "안텔민사향" → 바코드 "A001" + - B약국: "안텔민사향" → 바코드 "B999" + - C약국: "안텔민사향" → 바코드 없음 (수기 입력) + +2. **제품명 표기 불일치** + - POS: "안텔민뽀삐(5kg이하)" + - APDB: "뉴펫 안텔민 정사 정 100mg/25mg/10정" + - 쇼핑몰: "안텔민 뽀삐 5kg이하" + +3. **사이즈/용량 구분** + - 하트세이버 mini/S/M/L → 각각 다른 APC + - 넥스가드 XS/S/M/L → 각각 다른 APC + +--- + +## 2. 제안 아키텍처 + +### 2.1 전체 흐름 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ API 요청 │ +│ { │ +│ "items": [ │ +│ { "apc": "0230237010107", "name": "안텔민뽀삐" }, │ ← APC 있음 +│ { "apc": null, "name": "하트세이버S(5.6~11kg)" } │ ← APC 없음 +│ ], │ +│ "patient_name": "김남곤", │ +│ "pet_name": "뽀삐" │ +│ } │ +└─────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────┐ +│ 매핑 분기 처리 │ +├─────────────────────────────────────────────────────────────┤ +│ │ +│ for each item: │ +│ if item.apc exists: │ +│ ──────────────────▶ [직접 조회] │ +│ else: │ +│ ──────────────────▶ [AI 매핑 레이어] │ +│ │ +└─────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────┐ +│ PDF 렌더링 │ +│ │ +│ 매핑된 APC들로 APDB 조회 → 템플릿 렌더링 → PDF 반환 │ +└─────────────────────────────────────────────────────────────┘ +``` + +### 2.2 AI 매핑 레이어 상세 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ AI 매핑 레이어 │ +├─────────────────────────────────────────────────────────────┤ +│ │ +│ 입력: "하트세이버S(5.6~11kg)" │ +│ │ +│ ┌───────────────────────────────────────────────────────┐ │ +│ │ Step 1: 정규화 (Normalize) │ │ +│ │ - 공백/특수문자 정리 │ │ +│ │ - 체중 정보 추출: 5.6~11kg → S사이즈 │ │ +│ │ - 브랜드 추출: "하트세이버" │ │ +│ └───────────────────────────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌───────────────────────────────────────────────────────┐ │ +│ │ Step 2: 후보 검색 (Candidate Search) │ │ +│ │ - PostgreSQL 퍼지 매칭 │ │ +│ │ - 벡터 유사도 검색 (선택적) │ │ +│ │ │ │ +│ │ 결과: [ │ │ +│ │ { apc: "0230474210202", name: "하트세이버S", score: 0.95 }, │ +│ │ { apc: "0230474220200", name: "하트세이버M", score: 0.72 }, │ +│ │ { apc: "0230470000008", name: "하트세이버mini", score: 0.68 }│ +│ │ ] │ │ +│ └───────────────────────────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌───────────────────────────────────────────────────────┐ │ +│ │ Step 3: AI 최종 선택 (LLM Decision) │ │ +│ │ │ │ +│ │ 프롬프트: │ │ +│ │ "POS 제품명: 하트세이버S(5.6~11kg) │ │ +│ │ 후보 APC: │ │ +│ │ 1. 0230474210202 - 하트세이버S (5.6~11kg) │ │ +│ │ 2. 0230474220200 - 하트세이버M (12~22kg) │ │ +│ │ 3. 0230470000008 - 하트세이버mini (5.6kg이하) │ │ +│ │ │ │ +│ │ 가장 적합한 APC는?" │ │ +│ │ │ │ +│ │ AI 응답: "0230474210202" (체중 범위 일치) │ │ +│ └───────────────────────────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌───────────────────────────────────────────────────────┐ │ +│ │ Step 4: 캐싱 (선택적) │ │ +│ │ - 동일 제품명 재요청 시 캐시 사용 │ │ +│ │ - Redis 또는 SQLite │ │ +│ └───────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────┘ +``` + +--- + +## 3. 구현 옵션 비교 + +### 옵션 A: 규칙 기반 매핑 (No AI) + +```python +def match_by_rules(product_name): + # 정규식 + 키워드 매칭 + if "안텔민" in product_name: + if "뽀삐" in product_name or "5kg이하" in product_name: + return "0230237010107" + elif "킹" in product_name or "5kg이상" in product_name: + return "0230237810109" + # ... 수십 개 규칙 +``` + +| 장점 | 단점 | +|------|------| +| 빠름, 비용 0 | 유지보수 지옥 | +| 예측 가능 | 새 제품 대응 불가 | +| | 표기 변형에 취약 | + +**적합**: 제품 수 적고, 변동 없을 때 + +--- + +### 옵션 B: 퍼지 매칭 + 점수 기반 + +```python +from rapidfuzz import fuzz + +def match_by_fuzzy(product_name, candidates): + scores = [] + for c in candidates: + score = fuzz.token_sort_ratio(product_name, c['name']) + scores.append((c['apc'], score)) + + best = max(scores, key=lambda x: x[1]) + if best[1] > 80: # 임계값 + return best[0] + return None # 매칭 실패 +``` + +| 장점 | 단점 | +|------|------| +| AI 비용 없음 | 체중/사이즈 구분 어려움 | +| 빠름 | 애매한 경우 오매핑 | + +**적합**: 1:1 매핑이 명확한 경우 + +--- + +### 옵션 C: AI 하이브리드 (권장) ⭐ + +```python +def match_hybrid(product_name): + # 1. 캐시 확인 + cached = cache.get(product_name) + if cached: + return cached + + # 2. 퍼지 매칭으로 후보 추림 + candidates = fuzzy_search(product_name, limit=5) + + # 3. 고신뢰 매칭이면 바로 반환 + if candidates[0]['score'] > 95: + return candidates[0]['apc'] + + # 4. 애매하면 AI 판단 + if candidates[0]['score'] > 70: + apc = llm_decide(product_name, candidates) + cache.set(product_name, apc) + return apc + + # 5. 전혀 못 찾으면 실패 + return None +``` + +| 장점 | 단점 | +|------|------| +| 정확도 높음 | AI 비용 (캐싱으로 최소화) | +| 새 제품 대응 가능 | 초기 구축 복잡 | +| 체중/사이즈 정확 구분 | | + +**적합**: 현재 상황 (다양한 표기, 사이즈 구분 필요) + +--- + +## 4. 비용 분석 + +### AI 호출 비용 (GPT-4o-mini 기준) + +| 시나리오 | 월 요청 | AI 호출률 | AI 호출 수 | 비용 | +|----------|---------|----------|-----------|------| +| 소규모 | 100건 | 30% | 30건 | ~$0.01 | +| 중규모 | 1,000건 | 20% | 200건 | ~$0.10 | +| 대규모 | 10,000건 | 10% | 1,000건 | ~$0.50 | + +**캐싱 효과**: 동일 제품명 재요청 시 AI 호출 안 함 → 호출률 급감 + +--- + +## 5. 내 생각 (용림) + +### 현실적인 접근 + +1. **Phase 1: 규칙 기반 시작** + - 현재 17건의 APC 매핑된 제품은 직접 조회 + - 자주 쓰는 10~20개 제품은 수동 규칙 추가 + - 나머지는 "매핑 실패" 로깅 + +2. **Phase 2: 퍼지 매칭 도입** + - PostgreSQL `pg_trgm` 확장으로 유사도 검색 + - 95% 이상 매칭은 자동 처리 + - 70~95%는 로깅 + 수동 검토 + +3. **Phase 3: AI 레이어 추가** + - 70~95% 구간에 LLM 판단 도입 + - 판단 결과 캐싱 + - 오매핑 피드백 루프 + +### 왜 AI가 필요한가? + +``` +POS: "하트세이버츄어블S(5.6~11kg)" +APDB: "뉴펫 하트세이버 츄어블 소형견용 5.6-11kg" + +→ 퍼지 매칭만으로는 "소형견용 = S" 판단 어려움 +→ 체중 범위 파싱 + 의미 이해 필요 +→ LLM이 "5.6~11kg"와 "5.6-11kg" 같다고 판단 가능 +``` + +### 우선순위 제안 + +| 순위 | 항목 | 이유 | +|------|------|------| +| 1 | APC 직접 매핑 확대 | 가장 정확, 비용 0 | +| 2 | 캐시 레이어 | AI 비용 절감 | +| 3 | 퍼지 매칭 | AI 호출 최소화 | +| 4 | AI 최종 판단 | 애매한 케이스만 | + +--- + +## 6. API 인터페이스 (안) + +### 요청 + +```json +POST /api/guide/pdf + +{ + "items": [ + { + "apc": "0230237010107", + "name": "안텔민뽀삐", + "drugcode": "LB000003158" + }, + { + "apc": null, + "name": "하트세이버S(5.6~11kg)", + "drugcode": "LB000003153" + } + ], + "patient_name": "김남곤", + "pet_name": "뽀삐", + "pet_species": "푸들", + "pet_age": "3세" +} +``` + +### 응답 + +```json +{ + "success": true, + "pdf_url": "/output/guide_20260319_abc123.pdf", + "mapping_results": [ + { + "name": "안텔민뽀삐", + "apc": "0230237010107", + "method": "direct", + "confidence": 1.0 + }, + { + "name": "하트세이버S(5.6~11kg)", + "apc": "0230474210202", + "method": "ai_matched", + "confidence": 0.92, + "candidates_considered": 3 + } + ] +} +``` + +--- + +## 7. 다음 단계 + +- [ ] APDB 퍼지 검색 인덱스 구축 (`pg_trgm`) +- [ ] AI 매핑 프롬프트 설계 +- [ ] 캐시 레이어 (Redis/SQLite) +- [ ] 매핑 실패 로깅 & 대시보드 +- [ ] 피드백 루프 (오매핑 수정) + +--- + +*이 문서는 논의용입니다. 피드백 주세요!* 🐉 diff --git a/docs/API_SPEC.md b/docs/API_SPEC.md new file mode 100644 index 0000000..5ebe63e --- /dev/null +++ b/docs/API_SPEC.md @@ -0,0 +1,226 @@ +# 애니팜 투약지도서 API 명세서 + +> **Base URL:** `https://ap.0bin.in` +> **Local:** `http://localhost:7002` +> **Version:** 1.0.0 +> **Last Updated:** 2026-03-19 + +--- + +## 📋 엔드포인트 목록 + +| Method | Endpoint | 설명 | +|--------|----------|------| +| GET | `/health` | 헬스체크 | +| GET | `/api/products` | 약품 목록 조회 | +| POST | `/api/guide/pdf` | PDF 생성 | +| POST | `/api/guide/preview` | 미리보기 (메타데이터) | + +--- + +## 1. 헬스체크 + +서버 상태 확인 + +### Request +``` +GET /health +``` + +### Response +```json +{ + "status": "ok", + "service": "anipharm-api", + "timestamp": "2026-03-19T20:01:13.292109" +} +``` + +--- + +## 2. 약품 목록 조회 + +등록된 모든 약품 목록 반환 + +### Request +``` +GET /api/products +``` + +### Response +```json +{ + "success": true, + "count": 21, + "products": [ + { + "product_id": "MASTER-001", + "name": "넥스가드 스펙트라", + "category": "antiparasitic", + "category_display": "올인원 구충제" + }, + { + "product_id": "MASTER-002", + "name": "아시카프 츄어블정", + "category": "nsaid", + "category_display": "진통소염제 (NSAIDs)" + } + // ... 21개 + ] +} +``` + +--- + +## 3. PDF 생성 + +투약지도서 PDF 파일 생성 및 다운로드 + +### Request +``` +POST /api/guide/pdf +Content-Type: application/json +``` + +### Request Body +```json +{ + "product_ids": ["MASTER-001", "MASTER-002", "MASTER-005"], + "patient_name": "김남곤", + "pet_name": "뽀삐", + "pet_species": "푸들", + "pet_age": "3세", + "pharmacy_name": "청춘약국 동물약 전문상담", + "pharmacy_tel": "033-481-0384" +} +``` + +| 필드 | 타입 | 필수 | 설명 | +|------|------|------|------| +| product_ids | string[] | ✅ | 약품 ID 배열 | +| patient_name | string | ❌ | 보호자 이름 (기본: "보호자") | +| pet_name | string | ❌ | 반려동물 이름 (기본: "반려동물") | +| pet_species | string | ❌ | 품종 | +| pet_age | string | ❌ | 나이 | +| pharmacy_name | string | ❌ | 약국명 (기본: "청춘약국 동물약 전문상담") | +| pharmacy_tel | string | ❌ | 전화번호 (기본: "033-481-0384") | + +### Response +- **Success:** `application/pdf` (PDF 파일 다운로드) +- **Error:** +```json +{ + "success": false, + "error": "에러 메시지" +} +``` + +### cURL 예시 +```bash +curl -X POST https://ap.0bin.in/api/guide/pdf \ + -H "Content-Type: application/json" \ + -d '{ + "product_ids": ["MASTER-001", "MASTER-002"], + "patient_name": "김남곤", + "pet_name": "뽀삐", + "pet_species": "푸들", + "pet_age": "3세" + }' \ + --output 투약지도서.pdf +``` + +--- + +## 4. 미리보기 (메타데이터) + +PDF 생성 전 약품 정보 및 예상 페이지 수 확인 + +### Request +``` +POST /api/guide/preview +Content-Type: application/json +``` + +### Request Body +```json +{ + "product_ids": ["MASTER-001", "MASTER-002", "MASTER-005"] +} +``` + +### Response +```json +{ + "success": true, + "drug_count": 3, + "page_count": 1, + "drugs": [ + { + "id": "MASTER-001", + "name": "넥스가드 스펙트라", + "category": "antiparasitic", + "has_image": true + }, + { + "id": "MASTER-002", + "name": "아시카프 츄어블정", + "category": "nsaid", + "has_image": true + }, + { + "id": "MASTER-005", + "name": "하트세이버 츄어블", + "category": "antiparasitic", + "has_image": true + } + ] +} +``` + +--- + +## 📦 등록된 약품 목록 (21개) + +| ID | 이름 | 카테고리 | +|----|------|----------| +| MASTER-001 | 넥스가드 스펙트라 | antiparasitic | +| MASTER-002 | 아시카프 츄어블정 | nsaid | +| MASTER-003 | 아시엔로 50 | antibiotic | +| MASTER-004 | 세레니아 정 | antiemetic | +| MASTER-005 | 하트세이버 츄어블 | antiparasitic | +| MASTER-006 | 프로닐스팟 | antiparasitic | +| MASTER-007 | 오리더밀 | otic | +| MASTER-008 | 터비덤 스프레이 | antifungal | +| MASTER-009 | 클로르헥시딘 샴푸 | topical | +| MASTER-010 | 셀라이트 | antiparasitic | +| MASTER-011 | 멜록시캐시 CH | nsaid | +| MASTER-012 | 복합 개시딘 겔 | topical | +| MASTER-013 | 임팩트액 | antiparasitic | +| MASTER-014 | 안텔민 뽀삐/킹 | antiparasitic | +| MASTER-015 | 티어가드 정 | antibiotic | +| MASTER-016 | 액티벳정 | antibiotic | +| MASTER-017 | 아포퀠 | immunomodulator | +| MASTER-018 | 브라벡토 | antiparasitic | +| MASTER-019 | 심파리카 트리오 | antiparasitic | +| MASTER-020 | 가바펜틴 | analgesic | +| MASTER-021 | 메트로니다졸 | antibiotic | + +--- + +## 🔧 서버 정보 + +| 항목 | 값 | +|------|-----| +| 프레임워크 | Flask | +| 포트 | 7002 | +| PM2 이름 | anipharm-api | +| PDF 엔진 | WeasyPrint | +| 페이지당 약품 | 4개 | + +--- + +## 📝 변경 이력 + +| 날짜 | 버전 | 내용 | +|------|------|------| +| 2026-03-19 | 1.0.0 | 최초 배포 | diff --git a/scripts/update_apc_mapping.py b/scripts/update_apc_mapping.py new file mode 100644 index 0000000..7574819 --- /dev/null +++ b/scripts/update_apc_mapping.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +"""마스터 JSON에 실제 쇼핑몰 APC 매핑""" +import json +import os + +# 마스터 JSON → 쇼핑몰 APC 매핑 +APC_MAPPING = { + "nexgard_spectra.json": "0232555060207", # 넥스포인트(20~40kg) - 넥스가드 대용 + "heartsaver.json": "0230467230300", # 하트세이버L(23~45kg) + "impact.json": "0232873820205", # 임팩트 독(4~10kg) + "antelmin.json": "0230237810109", # 안텔민 킹(5kg이상) + "selight.json": "0232545420203", # 셀라이트 독(4~10kg) + "meloxicash.json": "0232523510309", # 멜록시캐시CH + "asikaff_carprofen.json": "0232635710103", # 아시카프정 + "enrofloxacin.json": "0232532310106", # 아시엔로정 + "tiergard.json": "0231089420409", # 티어가드(100T) + "chlorhexidine_shampoo.json": "0231334930108", # 클로르헥시딘샴푸(200ml) + "actibet.json": "9240043910403", # 액티벳(100T) + "serenia_maropitant.json": "0231884620107", # 세레니아정 24mg + "terbiderm.json": "0232064110102", # 터비더미 솔루션 + "simparica.json": "0232571730106", # 심파리카 트리오 L(20~40kg) + "gaesidin.json": "0231093520106", # 복합개시딘겔(10g) + "oridermyl.json": "0231065620103", # 오이드로믹스클린(10ml) - 귀약 대용 + "fronilspot.json": None, # 쇼핑몰 미등록 + "apoquel.json": None, # 쇼핑몰 미등록 + "bravecto.json": None, # 쇼핑몰 미등록 + "gabapentin.json": None, # 쇼핑몰 미등록 + "metronidazole.json": None, # 쇼핑몰 미등록 +} + +MASTER_DIR = os.path.join(os.path.dirname(__file__), "..", "data", "master") + +def update_json_files(): + updated = [] + skipped = [] + + for filename, apc in APC_MAPPING.items(): + filepath = os.path.join(MASTER_DIR, filename) + if not os.path.exists(filepath): + skipped.append(f"{filename} (파일 없음)") + continue + + with open(filepath, 'r', encoding='utf-8') as f: + data = json.load(f) + + old_apc = data.get('apc_code', '') + + if apc: + data['apc_code'] = apc + with open(filepath, 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=2) + updated.append(f"{filename}: {old_apc} → {apc}") + else: + skipped.append(f"{filename} (매핑 없음)") + + print("=" * 60) + print("APC 매핑 업데이트 완료") + print("=" * 60) + print(f"\n✅ 업데이트됨 ({len(updated)}개):") + for item in updated: + print(f" {item}") + print(f"\n⏭️ 건너뜀 ({len(skipped)}개):") + for item in skipped: + print(f" {item}") + +if __name__ == "__main__": + update_json_files() diff --git a/static/lectures/lecture_01.html b/static/lectures/lecture_01.html new file mode 100644 index 0000000..7a13099 --- /dev/null +++ b/static/lectures/lecture_01.html @@ -0,0 +1,914 @@ + + + + + + 시골약사의 동물약 이야기 #1 복합 개시딘 겔 | 애니팜 + + + + + + + + + + + + + + + + + +
+

+ 애니팜 로고 +

+

동물약의 전문가는 약사입니다

+
+ +

시골약사의 동물약 이야기

+

#1 복합 개시딘 겔

+

🐕 세균성 피부염·농피증 치료제 | 퓨시드산 + 베타메타손 | 비처방대상 동물용의약품

+ +
+

"사람 후시딘 개한테 발라도 돼요?"

+
+

약국에서 한 번쯤 들어보셨죠? 저도 처음엔 "뭐... 되지 않을까?" 했는데, 알고 보니 꽤 복잡한 이야기가 숨어 있더라고요. 오늘은 이 질문에 제대로 답할 수 있는 약사가 되어봅시다! 🎯

+
+

💊 약사와 동물약 - 우리가 할 수 있는 것

+

법적으로, 이미 가능합니다

+

혹시 "동물약은 수의사만 줄 수 있는 거 아니야?"라고 생각하셨다면, 그건 오해예요.

+ + + + + + + + + + + + + + + + + +
구분약국 판매
처방대상 동물용의약품 (항생제 일부, 호르몬제 등)✅ 가능 (수의사 처방 필요)
비처방대상 동물용의약품 (구충제, 외용제, 소화제 등)✅ 가능 (처방 없이)
+

👉 동물약국 개설허가를 받은 약국은 동물용의약품을 취급할 수 있습니다. 복합 개시딘 겔처럼 비처방대상 동물용의약품은 수의사 처방 없이 판매 가능해요.

+

수의사와 약사, 다른 전문성

+

수의사를 깎아내리려는 게 아닙니다. 교육 구조 자체가 다르고, 그래서 강점이 다릅니다.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
영역수의대 (6년)약대 (6년)
교육 목표진단 → 처방 → 수술까지 종합 임상약 중심 전문가
약물학종별 차이 + 임상 적용 중심Receptor, signaling pathway 수준 심화
약동학기본 PK + 종간 차이Compartment model, Clearance, TDM, Modeling
제제학·제형사용자 입장 (tablet, injection 이해)설계자 입장 (서방형, 나노, 생체이용률)
약물 상호작용임상 빈용 조합 중심CYP, Transporter, Mechanism 분석
+

종간 차이 — 특히 대동물(소, 말)과 소동물(개, 고양이)의 용량 체계, 종별 독성 프로파일, 그리고 진단에서 수술까지 이어지는 임상 판단은 수의사의 전문 영역이에요. 6년간 그걸 집중적으로 훈련받은 분들이니까요.

+

물론 우리도 고양이 acetaminophen 독성 같은 건 알고 있죠. 하지만 "말에게는 이 용량, 소에게는 저 용량" 같은 대동물 임상 디테일까지는 솔직히 깊지 않아요.

+

반면, "이 약이 왜 이런 제형인지", "왜 이 농도인지", "왜 이 기간만 써야 하는지" — 이건 우리가 평소 인체약으로 매일 하고 있는 설명이잖아요? 동물약도 마찬가지예요. 약의 원리를 깊이 있게 전달하는 건 약사가 잘할 수 있는 영역입니다.

+

반려인이 약국에 오는 이유

+

반려인들은 수의사 가기 전, 또는 처방받고 나서도 약국에 와요.

+ +

이때 정확한 정보 + 전문가다운 설명을 해주면?
+→ 신뢰가 쌓이고, "약 관련은 약국에 물어봐야지"가 됩니다.

+

우리는 법적 테두리 안에서 충분히 전문가로서 역할할 수 있어요. 항생제 남용 문제, 제형 선택 이유, 투약 기간의 근거 — 이런 건 약사가 더 잘 전달할 수 있는 영역입니다.

+
+

💡 이 연재의 목표: 이미 알고 있는 동물약, 더 깊이 알고 더 잘 설명하자.

+
+
+

🔬 개시딘 vs 사람 후시딘 - 뭐가 다른데?

+

+ 복합 개시딘 겔 +
+ 복합 개시딘 겔 (퓨시드산 0.5% + 베타메타손 0.1%) +

+ +

"어차피 퓨시드산 아니야?" 맞아요. 근데 결정적 차이가 3가지 있어요.

+

1️⃣ 제형: 겔 vs 크림

+ + + + + + + + + + + + + + + + + + + + + + + + + +
구분개시딘사람 후시딘
제형크림
털 침투✅ 우수❌ 불량
잔여감깔끔번들거림
+

개는 털이 있어요. (너무 당연한가요? ㅋㅋ) 크림은 털 위에서 뭉치는데, 겔은 털 사이로 쭉쭉 스며들어요. 이게 생각보다 큰 차이예요.

+

2️⃣ pH 최적화

+ +

개시딘은 개 피부 pH 범위에 맞게 제형화되어 있어요. 사람용은 사람 피부에 최적화되어 있고요.

+

3️⃣ 농도 & 스테로이드 차이

+

+ 인체용 후시딘 +     + 후시딘H +
+ 후시딘 연고 (퓨시드산 2%)  |  후시딘H 크림 (퓨시드산 2% + 하이드로코르티손 1%) +

+ +

후시딘 제품별 성분 비교

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
제품퓨시드산스테로이드스테로이드 강도
개시딘 겔 (동물용)0.5%베타메타손발레레이트 0.1%Class IV (중등도)
후시딘 연고/크림 (인체용)2%❌ 없음-
후시딘H 크림 (인체용)2%하이드로코르티손아세테이트 1%Class VI (약함)
+

스테로이드 강도 분류 기준 (Stoughton-Cornell Classification)

+

국소 스테로이드 강도는 혈관수축 분석(Vasoconstriction Assay)을 기반으로 Class I(초강력)~VII(가장 약함)로 분류됩니다.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Class강도대표 약물
I초강력 (Superpotent)Clobetasol propionate 0.05%
II강력 (Potent)Betamethasone dipropionate 0.05%
III상위 중강도Fluticasone propionate 0.005%
IV중등도 (Mid-strength)Betamethasone valerate 0.1% ← 개시딘
V하위 중등도Fluticasone propionate 0.05% cream
VI약함 (Mild)Hydrocortisone 1% ← 후시딘H
VII가장 약함Hydrocortisone 0.5%
+
+

📚 근거: Stoughton RB. Vasoconstrictor assay—specific applications. In: Maibach HI, Surber C, eds. Topical Corticosteroids. Basel: Karger; 1992:42-53. 및 PMID 3881106 - Jacob SE, Steele T. Corticosteroid classes: a quick reference guide including patch test substances and cross-reactivity. J Am Acad Dermatol. 2006.

+
+

베타메타손 "염(Ester)"에 따른 차이

+

같은 베타메타손이라도 어떤 염(ester)으로 결합되어 있느냐에 따라 효력이 다릅니다:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
베타메타손 염스테로이드 등급특징
Betamethasone valerate (개시딘)Class IV중등도, 표피 침투 적당
Betamethasone dipropionateClass I~II초강력, 깊은 침투
Betamethasone sodium phosphate주사용수용성, 전신 투여
+
+

💡 약사 포인트: 개시딘의 베타메타손발레레이트(Class IV)는 후시딘H의 하이드로코르티손(Class VI)보다 약 10~15배 강력합니다. 그래서 개시딘은 최대 7일로 사용 기간이 제한되어 있어요.

+
+

왜 개시딘이 낮은 농도인데 괜찮을까?

+

"어? 퓨시드산이 0.5%밖에 안 돼?" 맞아요. 근데 여기서 약사의 시선이 필요해요.

+

겔 제형은 피부 침투가 좋아서 낮은 농도로도 피부 내 MIC의 67,000배 농도를 달성해요! (PMID 29162115)

+

높은 농도가 항상 좋은 게 아닙니다:
+- 크림 2% → 털에 흡착되어 실제 피부 도달량 ↓
+- 겔 0.5% → 털 통과 + 피부 직접 도달 → 유효 농도 충분

+
+

🧪 약제학 깊이 보기: 왜 겔이어야 하는가?

+

대학 시절 약제학 시간에 배웠던 에멀전, Henderson-Hasselbalch 방정식... 기억나시죠? 개시딘이 왜 인지, 그 과학적 이유를 파헤쳐봅시다.

+

에멀전의 기초: O/W vs W/O

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
구분O/W (수중유형)W/O (유중수형)Gel (수성 겔)
연속상오일
분산상오일(없음)
촉감산뜻함유성/무거움가장 산뜻
털 침투보통나쁨우수
증발 후약간 잔여기름막깔끔
+

크림(O/W)이나 연고(W/O)는 지용성 기제가 털 위에서 뭉쳐요. 반면 겔은 수성 기반이라 털 사이로 쭉쭉 퍼지고, 증발 후 약물만 피부에 남깁니다.

+

pH와 약물 흡수: Henderson-Hasselbalch로 이해하기

+

퓨시드산은 약산(pKa ≈ 6.0)입니다. 약산의 이온화는 pH에 따라 달라지죠:

+
Henderson-Hasselbalch 방정식:
+pH = pKa + log([A⁻]/[HA])
+
+비이온화율(%) = 100 / (1 + 10^(pH-pKa))
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
피부 환경pH비이온화(HA)이온화(A⁻)지용성
사람 피부5.091%9%높음
개 피부(귀/발)6.050%50%중간
개 피부(체간)7.09%91%낮음
+

핵심 포인트:
+- 사람 피부(pH 5): 비이온화↑ → 지용성 크림이 각질층 확산에 유리
+- 개 피부(pH 7): 이온화↑ → 수성 겔 기제가 이온화된 약물을 피부 표면에 효율적으로 전달 후, 피부 pH에서 약물 방출

+

겔 제형의 과학: 털 있는 피부에서의 강점

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
특성크림/연고
Spreading coefficient낮음높음
모낭 침투털 위에 머묾털 사이 침투
핥았을 때기름 맛 = 더 핥음무미건조
약물 잔류기제와 함께 제거피부 흡착 유지
+

PMID 29162115 연구에서 퓨시드산 겔 적용 시, 표피 상층 240μm에서 2,000 μg/g 농도 달성 - 이는 MIC(0.03 mg/L)의 약 67,000배입니다!

+
+

💡 약사 포인트: 제형 선택은 약물의 물리화학적 특성 + 적용 부위의 생리적 조건을 모두 고려해야 해요. 개시딘이 겔인 건 마케팅이 아니라, 약제학적 근거가 있는 거죠!

+
+
+

🐱 잠깐! 고양이는 왜 안 되나요?

+

개시딘이 "개 전용"인 이유는 제품명에 '개'가 들어가서가 아닙니다. 베타메타손 0.1%가 포함되어 있기 때문이에요.

+

고양이와 스테로이드: 민감한 관계

+

고양이도 스테로이드를 "잘 견딘다"는 오래된 인식이 있지만, 이는 급성 부작용이 적다는 의미일 뿐입니다. 진짜 문제는 대사적 취약성이에요.

+

고양이의 HPA axis(시상하부-뇌하수체-부신 축)는 외인성 글루코코르티코이드에 의해 억제될 수 있으며, 특히 고양이의 당뇨 발생 기전이 개와 근본적으로 다릅니다. 고양이는 사람의 제2형 당뇨와 유사한 췌도 아밀로이드 침착(islet amyloidosis) 기전을 가지고 있어, 스테로이드에 의한 인슐린 저항성이 비가역적 당뇨로 진행할 위험이 높아요 (PMID 11106586).

+

약동학으로 보는 차이

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
항목고양이
Glucuronidation활발미숙 (UGT 효소 결핍)
스테로이드 대사상대적 빠름지연
당뇨 발생 기전Type 1 유사Type 2 유사 (amyloid)
인슐린 저항성가역적 경향비가역적 위험↑
+

고양이는 glucuronidation 경로가 미숙하여 여러 약물의 대사가 느립니다. 베타메타손 같은 강력한 fluorocorticoid(C-16 치환, mineralocorticoid 활성 無)는 외용제라도 피부를 통해 전신 흡수되어 HPA axis 억제를 유발할 수 있습니다.

+

임상적 위험: 숫자로 보면 무섭습니다

+

2021년 J Feline Med Surg 연구(PMID 32716236):
+- Prednisolone ≥1.9mg/kg/day 투여 고양이 143마리 중 14마리(9.7%)에서 당뇨 발생
+- 85.7%가 투약 3개월 이내 발생

+

2022년 브라질 연구(PMID 35202848):
+- MPA 단회 주사만으로도 혈당·인슐린 상승, HOMA-IR 지표 악화
+- 메트포르민이나 당뇨식이로도 예방 실패

+ + + + + + + + + + + + + + + + + + + + +
고양이 스테로이드 부작용
당뇨병 유발 (특히 비만묘, 버미즈 품종)
의인성 쿠싱 증후군
피부 위축, 상처 치유 지연
면역억제 → 감염 취약
+

그럼 고양이는 뭘 써요?

+

고양이 피부 세균 감염 시:
+1. 퓨시드산 단독 제품 (스테로이드 無) - 사람용 후시딘 연고 off-label
+2. 클로르헥시딘 세정제 - 1차 관리
+3. 전신 항생제 - 세팔렉신, 아목시실린-클라불란산 등
+4. 수의사 처방 - 고양이 허가 제품 또는 off-label 사용 판단

+
+

⚠️ 복약상담 포인트: "고양이 키우시는 분들 많으시죠? 개시딘은 스테로이드 성분 때문에 고양이에게 당뇨를 유발할 수 있어요. 퓨시드산만 필요하시면 스테로이드 없는 제품을 찾거나, 수의사 선생님과 상의해 보세요."

+
+
+

📋 약사의 꿀팁: 이렇게 설명하세요!

+

🎯 3-5-7 법칙

+
┌─────────────────────────────────────────┐
+│  3일: 효과 체크 (안 나으면 수의사!)     │
+│  5일: 최소 사용 기간                    │
+│  7일: 최대 사용 기간 (이상 사용 금지)   │
+└─────────────────────────────────────────┘
+
+

반려인에게 이렇게 말해주세요:

+
+

"3일 발랐는데 전혀 안 나아지면 수의사 선생님께 가세요. 효과 있으면 5~7일 꾸준히! 근데 7일 넘기면 안 돼요~"

+
+

🐶 핥기 방지 필수!

+

이거 꼭 강조하세요:

+
+

"바르고 나서 10~15분은 핥지 못하게 해주세요. 엘리자베스 칼라 있으면 씌우시고, 없으면 안고 계시거나 간식으로 관심 돌리세요!"

+
+

🍄 곰팡이(진균) 감별 포인트

+

퓨시드산은 세균성 피부염에 써요. 진균이면 안 들어요!

+ + + + + + + + + + + + + + + + + + + + + +
세균성 (개시딘 OK)진균성 (터비덤 or 수의사)
부분적, 붉은 병변동그란 링 모양
고름/삼출물털 빠짐 + 비듬
급성 발생서서히 퍼짐
+
+

💡 진균이 의심된다면? 약국에서 바로 추천할 수 있는 제품이 있어요!
+터비덤 스프레이 큐어 — 테르비나핀(항진균) + 클로르헥시딘(항균) 복합 스프레이
+- Malassezia 피부염, 윤선(Microsporum), 표재성 세균 감염까지 커버
+- 1일 1~2회 분무, 증상 소실 후 7일 추가 사용
+- 개 전용 비처방대상 동물용의약품

+

확실하지 않거나, 윤선(링웜) 의심 시에는 수의사 진료도 함께 권유하세요. 윤선은 인수공통이라 가족에게도 전파될 수 있거든요!

+
+
+

⚠️ 항생제 스튜어드십 - 이건 진지하게!

+

한국 퓨시드산 내성률: 27% (PMID 32115810)

+

4마리 중 1마리 이상에서 내성균이 나온다는 거예요. 이게 왜 중요하냐면:

+

항생제 스튜어드십이란?

+
+

항생제를 꼭 필요할 때, 적절한 용량으로, 적절한 기간만 쓰자는 원칙

+
+

국소 항생제라고 막 쓰면 안 되는 이유:
+- 피부 상재균에 내성 유발
+- 나중에 전신 감염 시 치료 옵션 감소
+- 사람에게도 내성균 전파 가능 (One Health 개념)

+

그래서 우리가 할 일

+
    +
  1. 7일 넘게 쓰지 말라고 안내 (정말 중요!)
  2. +
  3. 호전 안 되면 수의사 가라고 (배양검사 필요할 수 있음)
  4. +
  5. 예방 목적 사용 금지 (상처 없는데 미리 바르기 ❌)
  6. +
+
+

🌟 마무리: 약사의 자부심

+

우리는 약의 전문가예요. 수의사가 진단하면, 우리는 그 약이 어떻게 작용하고, 어떻게 써야 효과적인지 설명할 수 있어요.

+

동물약도 결국 약리학, 약동학, 제제학의 연장선이에요. 사람약 공부하며 쌓은 내공이 여기서도 빛을 발하는 거죠! ✨

+

다음에 "사람 후시딘 발라도 돼요?" 질문 받으면, 이렇게 답해보세요:

+
+

"쓸 수는 있는데, 개 전용 개시딘이 더 좋아요. 겔이라 털 사이로 잘 스며들고, 개 피부에 맞게 만들어졌거든요. 3일 발라서 효과 없으면 수의사 선생님 가시고, 효과 있으면 5~7일 꾸준히 바르세요. 7일 넘기면 안 돼요!"

+
+

전문가다운 답변, 멋지지 않나요? 😎

+
+

다음 편 예고: 귀 세정제의 과학 - 왜 클로르헥시딘은 귀에 안 될까?

+
+ +

+

📚 참고문헌
+- Fusidic acid resistance in S. pseudintermedius (Korea): PMID 32115810
+- Topical fusidic acid skin concentration: PMID 29162115
+- Feline islet amyloidosis model: PMID 11106586
+- Prednisolone-induced diabetes in cats: PMID 32716236
+- MPA insulin resistance in cats: PMID 35202848
+- 복합 개시딘 겔 제품 설명서

+ + \ No newline at end of file diff --git a/static/nexgard_spectra.jpg b/static/nexgard_spectra.jpg new file mode 100644 index 0000000..bdd1b60 Binary files /dev/null and b/static/nexgard_spectra.jpg differ diff --git a/templates/anipharm_logo.svg b/templates/anipharm_logo.svg new file mode 100644 index 0000000..a0184ec --- /dev/null +++ b/templates/anipharm_logo.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/anipharm_logo_base64.txt b/templates/anipharm_logo_base64.txt new file mode 100644 index 0000000..e757915 Binary files /dev/null and b/templates/anipharm_logo_base64.txt differ diff --git a/templates/medication_guide_v2.html b/templates/medication_guide_v2.html index d16266f..b841008 100644 --- a/templates/medication_guide_v2.html +++ b/templates/medication_guide_v2.html @@ -2,7 +2,7 @@ - 동물약 복약안내문 v2 + 애니팜 투약지도서 @@ -295,13 +375,18 @@
-
{{ patient_name }} 보호자님
-
🐾 {{ pet_name }} ({{ pet_species }}, {{ pet_age }}) | 📅 {{ issue_date }}
+
{{ patient_name }} 반려인님
+
{{ pet_name }} · {{ pet_species }} · {{ pet_age }}
-
🏥 {{ pharmacy_name }}
+
{{ pharmacy_name }}
+
동물약 전문 상담
+
+
+
TEL
+
{{ pharmacy_tel }}
+
{{ issue_date }}
-
{{ pharmacy_tel }}
{% endif %} @@ -312,7 +397,27 @@ {% for drug in drugs[start_idx:end_idx] %}
-
💊
+
+ {% if drug.image_url %} + {{ drug.name }} + + {% elif drug.apc_code is not none and drug.apc_code and (drug.apc_code|string)[:4] != '0519' and (drug.apc_code|string)[:4] != 'None' %} + {{ drug.name }} + + {% else %} + + + + {% endif %} +
{{ drug.name }}
{{ drug.english_name }}
@@ -399,11 +504,49 @@ {% elif drug.category == 'antibiotic' %}
-
📋 {{ drug.indication[:30] }}...
-
{{ drug.dosage.standard }}
+
📋 {{ drug.indication[:40] if drug.indication is string else drug.indication }}...
+
{{ drug.dosage.standard if drug.dosage.standard is defined else drug.dosage }}
+ {% if drug.dosage.duration is defined %}
기간: {{ drug.dosage.duration }}
+ {% endif %}
+ {% if drug.dosage_table %} +
⚖️ 체중별 용량
+
+ {% for row in drug.dosage_table[:6] %} +
+
{{ row.weight }}
+
{{ row.tablets_per_dose if row.tablets_per_dose is defined else (row.tablets if row.tablets is defined else row.dose) }}
+
+ {% endfor %} +
+ {% endif %} + + {% if drug.treatment_timeline %} +
+ 📅 효과 시기
+ {% if drug.treatment_timeline.phases is defined %} + {% for phase in drug.treatment_timeline.phases[:4] %} + • {{ phase.week }}: {{ phase.expected[:30] }}...
+ {% endfor %} + {% else %} + {% for key, val in drug.treatment_timeline.items() %} + {% if key not in ['realistic_expectation', 'important_note', 'description', 'phases'] %} + • {{ key }}: {{ val }}
+ {% endif %} + {% endfor %} + {% endif %} +
+ {% endif %} + + {% if drug.clinical_notes %} +
+ 💡 임상 참고
+ {% for note in drug.clinical_notes[:3] %}• {{ note }}
{% endfor %} +
+ {% endif %} + {% if drug.cat_warning %}
🐱 고양이 주의
@@ -495,7 +638,51 @@
{% if drug.dosage.frequency %}빈도: {{ drug.dosage.frequency }}
{% endif %} {% if drug.dosage.duration %}기간: {{ drug.dosage.duration }}
{% endif %} - {% if drug.dosage.contact_time %}접촉: {{ drug.dosage.contact_time }}{% endif %} + {% if drug.dosage.max_duration %}최대: {{ drug.dosage.max_duration }}
{% endif %} + {% if drug.dosage.application %}방법: {{ drug.dosage.application }}{% endif %} +
+ {% endif %} + + {% if drug.application_method %} +
+ 🖐️ 도포 방법 +
+ {% for key, val in drug.application_method.items() %} + {% if key.startswith('step') and val.action is defined %} + {{ loop.index }}. {{ val.action[:12] }} + {% endif %} + {% endfor %} +
+
+ {% endif %} + + {% if drug.progress_monitoring %} +
+ 📅 경과 관찰
+ {% for key, val in drug.progress_monitoring.items() %} + {% if val.description is defined %} + • {{ key.replace('_', ' ') }}: {{ val.description }}
+ {% endif %} + {% endfor %} +
+ {% endif %} + + {% if drug.pharmacy_tips %} +
+ 💡 약사 꿀팁
+ {% if drug.pharmacy_tips.human_vs_animal %} + • {{ drug.pharmacy_tips.human_vs_animal }}
+ {% endif %} + {% if drug.pharmacy_tips.ph_tip %} + • {{ drug.pharmacy_tips.ph_tip }}
+ {% endif %} +
+ {% endif %} + + {% if drug.clinical_notes %} +
+ 💡 임상 참고
+ {% for note in drug.clinical_notes[:3] %}• {{ note }}
{% endfor %}
{% endif %} {% endif %} @@ -514,13 +701,17 @@ {% endfor %}
- {% if loop.last %} - + - {% endif %}
{% endfor %}