feat: KIMS 약물 상호작용 체크 기능 추가 (조제 탭 버튼 + 모달)

This commit is contained in:
thug0bin
2026-02-28 13:15:31 +09:00
parent 6a786ff042
commit 68dcb919e4
2 changed files with 325 additions and 0 deletions

View File

@@ -4116,6 +4116,172 @@ def kill_process_on_port(port: int) -> bool:
return False
# ═══════════════════════════════════════════════════════════
# KIMS 약물 상호작용 API
# ═══════════════════════════════════════════════════════════
@app.route('/api/kims/interaction-check', methods=['POST'])
def api_kims_interaction_check():
"""
KIMS 약물 상호작용 체크 API
Request:
{
"drug_codes": ["055101150", "622801610"], // DrugCode 배열
"pre_serial": "P20250630001" // 처방번호 (로깅용, optional)
}
Response:
{
"success": true,
"interactions": [...],
"safe_count": 2,
"drugs_checked": [{"code": "...", "name": "...", "kd_code": "..."}]
}
"""
import requests as http_requests
try:
data = request.get_json()
drug_codes = data.get('drug_codes', [])
pre_serial = data.get('pre_serial', '')
if len(drug_codes) < 2:
return jsonify({
'success': False,
'error': '상호작용 체크를 위해 최소 2개 이상의 약품이 필요합니다.'
}), 400
# 1. DrugCode → BASECODE(KIMS 9자리) 변환
drug_session = db_manager.get_session('PM_DRUG')
placeholders = ','.join([f"'{c}'" for c in drug_codes])
code_query = text(f"""
SELECT DISTINCT G.DrugCode, G.GoodsName, B.BASECODE
FROM CD_GOODS G
LEFT JOIN CD_BARCODE B ON G.DrugCode = B.DrugCode
WHERE G.DrugCode IN ({placeholders})
""")
code_result = drug_session.execute(code_query).fetchall()
# KIMS 코드 매핑
kd_codes = []
drugs_info = []
for row in code_result:
kd_code = row.BASECODE
if kd_code:
kd_codes.append(str(kd_code))
drugs_info.append({
'drug_code': row.DrugCode,
'name': row.GoodsName[:50] if row.GoodsName else '알 수 없음',
'kd_code': str(kd_code)
})
if len(kd_codes) < 2:
return jsonify({
'success': False,
'error': 'KIMS 코드로 변환 가능한 약품이 2개 미만입니다.',
'drugs_checked': drugs_info
}), 400
# 2. KIMS API 호출
kims_url = "https://api2.kims.co.kr/api/interaction/info"
kims_headers = {
'Authorization': 'Basic VFNQTUtSOg==',
'Content-Type': 'application/json',
'Accept': 'application/json; charset=utf-8'
}
kims_payload = {'KDCodes': kd_codes}
try:
kims_response = http_requests.get(
kims_url,
headers=kims_headers,
data=json.dumps(kims_payload),
timeout=10,
verify=False # SSL 검증 비활성화 (프로덕션에서는 주의)
)
if kims_response.status_code != 200:
return jsonify({
'success': False,
'error': f'KIMS API 응답 오류: HTTP {kims_response.status_code}',
'drugs_checked': drugs_info
}), 502
kims_data = kims_response.json()
if kims_data.get('Message') != 'SUCCESS':
return jsonify({
'success': False,
'error': f'KIMS API 처리 실패: {kims_data.get("Message", "알 수 없는 오류")}',
'drugs_checked': drugs_info
}), 502
except http_requests.Timeout:
return jsonify({
'success': False,
'error': 'KIMS API 타임아웃 (10초 초과)',
'drugs_checked': drugs_info
}), 504
except Exception as kims_err:
logging.error(f"KIMS API 호출 실패: {kims_err}")
return jsonify({
'success': False,
'error': f'KIMS API 연결 실패: {str(kims_err)}',
'drugs_checked': drugs_info
}), 502
# 3. 상호작용 결과 파싱
interactions = []
severity_text = {1: '심각', 2: '중등도', 3: '경미', 4: '참고', 5: '일반'}
severity_color = {1: '#dc2626', 2: '#f59e0b', 3: '#3b82f6', 4: '#6b7280', 5: '#9ca3af'}
for alert in kims_data.get('AlertList', []):
for item in alert.get('AlertInfo', []):
severity = item.get('SeverityLevel', 5)
interactions.append({
'drug1_code': item.get('DrugCode1'),
'drug1_name': item.get('ProductName1'),
'drug2_code': item.get('DrugCode2'),
'drug2_name': item.get('ProductName2'),
'generic1': item.get('GenericName1'),
'generic2': item.get('GenericName2'),
'severity': severity,
'severity_text': severity_text.get(severity, '알 수 없음'),
'severity_color': severity_color.get(severity, '#9ca3af'),
'description': item.get('Observation', ''),
'management': item.get('ClinicalMng', ''),
'action': item.get('ActionToTake', ''),
'likelihood': item.get('LikelihoodDesc', '')
})
# 심각도 순 정렬 (1=심각이 먼저)
interactions.sort(key=lambda x: x['severity'])
# 총 약품 쌍 수 계산
total_pairs = len(kd_codes) * (len(kd_codes) - 1) // 2
safe_count = total_pairs - len(interactions)
logging.info(f"KIMS 상호작용 체크 완료: {len(kd_codes)}개 약품, {len(interactions)}건 발견 (처방: {pre_serial})")
return jsonify({
'success': True,
'interactions': interactions,
'interaction_count': len(interactions),
'safe_count': max(0, safe_count),
'total_pairs': total_pairs,
'drugs_checked': drugs_info
})
except Exception as e:
logging.error(f"KIMS 상호작용 체크 오류: {e}")
return jsonify({
'success': False,
'error': f'서버 오류: {str(e)}'
}), 500
if __name__ == '__main__':
import os