fix: 처방목록 조회 기준을 발행일에서 조제일로 변경
문제: - PMR 처방 목록이 PassDay(처방전 발행일) 기준으로 조회되어 발행일과 조제일이 다른 처방(예: 3일 전 발행, 오늘 조제)이 오늘 목록에 표시되지 않는 버그 해결: - PS_MAIN 테이블 조회 시 PassDay 대신 Indate(조제일) 기준으로 변경 - issue_date(발행일), dispense_date(조제일) 필드 추가로 구분 명확화 추가 변경: - WebSocket 연결/해제 시 토스트 알림 추가 - WebSocket 프록시 트러블슈팅 문서 추가 (NPM 설정 가이드)
This commit is contained in:
@@ -70,6 +70,7 @@ def get_prescriptions_by_date():
|
||||
PreSerial,
|
||||
Day_Serial,
|
||||
PassDay,
|
||||
Indate,
|
||||
Paname,
|
||||
PaNum,
|
||||
CusCode,
|
||||
@@ -81,7 +82,7 @@ def get_prescriptions_by_date():
|
||||
PRICE_P,
|
||||
PRICE_C
|
||||
FROM PS_MAIN
|
||||
WHERE PassDay = ?
|
||||
WHERE Indate = ?
|
||||
ORDER BY Day_Serial ASC
|
||||
""", (date_yyyymmdd,))
|
||||
|
||||
@@ -112,7 +113,9 @@ def get_prescriptions_by_date():
|
||||
prescriptions.append({
|
||||
'prescription_id': row.PreSerial,
|
||||
'order_number': row.Day_Serial,
|
||||
'date': row.PassDay,
|
||||
'date': row.Indate, # 조제일 기준
|
||||
'issue_date': row.PassDay, # 처방전 발행일
|
||||
'dispense_date': row.Indate, # 조제일
|
||||
'patient_name': row.Paname,
|
||||
'patient_id': row.PaNum[:6] + '******' if row.PaNum and len(row.PaNum) > 6 else row.PaNum,
|
||||
'patient_code': row.CusCode,
|
||||
@@ -221,8 +224,6 @@ def get_prescription_detail(prescription_id):
|
||||
'sung_code': row.SUNG_CODE or ''
|
||||
})
|
||||
|
||||
conn.close()
|
||||
|
||||
# 나이/성별 계산
|
||||
panum = rx_row.PaNum or ''
|
||||
age = None
|
||||
@@ -255,6 +256,23 @@ def get_prescription_detail(prescription_id):
|
||||
'name_2': disease_name_2
|
||||
}
|
||||
|
||||
# 환자 특이사항(CUSETC) 조회 - CD_PERSON 테이블
|
||||
cusetc = ''
|
||||
cus_code = rx_row.CusCode
|
||||
if cus_code:
|
||||
try:
|
||||
# PM_BASE.dbo.CD_PERSON에서 조회
|
||||
cursor.execute("""
|
||||
SELECT CUSETC FROM PM_BASE.dbo.CD_PERSON WHERE CUSCODE = ?
|
||||
""", (cus_code,))
|
||||
person_row = cursor.fetchone()
|
||||
if person_row and person_row.CUSETC:
|
||||
cusetc = person_row.CUSETC
|
||||
except Exception as e:
|
||||
logging.warning(f"특이사항 조회 실패: {e}")
|
||||
|
||||
conn.close()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'prescription': {
|
||||
@@ -271,8 +289,10 @@ def get_prescription_detail(prescription_id):
|
||||
'patient': {
|
||||
'name': rx_row.Paname,
|
||||
'code': rx_row.CusCode,
|
||||
'cus_code': rx_row.CusCode, # 호환성
|
||||
'age': age,
|
||||
'gender': gender
|
||||
'gender': gender,
|
||||
'cusetc': cusetc # 특이사항
|
||||
},
|
||||
'disease_info': disease_info,
|
||||
'medications': medications,
|
||||
@@ -822,6 +842,102 @@ def get_patient_otc_history(cus_code):
|
||||
# PAAI (Pharmacist Assistant AI) API
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
|
||||
@pmr_bp.route('/api/paai/result/<pre_serial>', methods=['GET'])
|
||||
def paai_get_result(pre_serial):
|
||||
"""
|
||||
PAAI 분석 결과 조회 (캐시)
|
||||
|
||||
Response:
|
||||
- 결과 있음: {exists: true, status: "success", result: {...}, log_id: 123}
|
||||
- 생성 중: {exists: true, status: "generating", log_id: 123}
|
||||
- 없음: {exists: false}
|
||||
"""
|
||||
import sqlite3
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
try:
|
||||
db_path = Path(__file__).parent / 'db' / 'paai_logs.db'
|
||||
if not db_path.exists():
|
||||
return jsonify({'exists': False})
|
||||
|
||||
conn = sqlite3.connect(str(db_path))
|
||||
conn.row_factory = sqlite3.Row
|
||||
cursor = conn.cursor()
|
||||
|
||||
# 해당 처방의 최신 성공 로그 조회
|
||||
cursor.execute('''
|
||||
SELECT id, status, created_at, patient_name,
|
||||
disease_name_1, disease_name_2,
|
||||
current_med_count, kims_interaction_count, kims_has_severe,
|
||||
kims_response_time_ms, ai_response_time_ms,
|
||||
ai_response
|
||||
FROM paai_logs
|
||||
WHERE pre_serial = ?
|
||||
ORDER BY id DESC
|
||||
LIMIT 1
|
||||
''', (pre_serial,))
|
||||
|
||||
row = cursor.fetchone()
|
||||
conn.close()
|
||||
|
||||
if not row:
|
||||
return jsonify({'exists': False})
|
||||
|
||||
status = row['status']
|
||||
|
||||
# 생성 중 상태
|
||||
if status in ('pending', 'kims_done', 'generating'):
|
||||
return jsonify({
|
||||
'exists': True,
|
||||
'status': 'generating',
|
||||
'log_id': row['id']
|
||||
})
|
||||
|
||||
# 에러 상태
|
||||
if status == 'error':
|
||||
return jsonify({
|
||||
'exists': True,
|
||||
'status': 'error',
|
||||
'log_id': row['id']
|
||||
})
|
||||
|
||||
# 성공 상태 - 전체 결과 반환
|
||||
ai_response = {}
|
||||
if row['ai_response']:
|
||||
try:
|
||||
ai_response = json.loads(row['ai_response'])
|
||||
except:
|
||||
pass
|
||||
|
||||
return jsonify({
|
||||
'exists': True,
|
||||
'status': 'success',
|
||||
'log_id': row['id'],
|
||||
'result': {
|
||||
'created_at': row['created_at'],
|
||||
'patient_name': row['patient_name'],
|
||||
'disease_name_1': row['disease_name_1'],
|
||||
'disease_name_2': row['disease_name_2'],
|
||||
'medication_count': row['current_med_count'],
|
||||
'kims_summary': {
|
||||
'interaction_count': row['kims_interaction_count'],
|
||||
'has_severe': bool(row['kims_has_severe'])
|
||||
},
|
||||
'timing': {
|
||||
'kims_ms': row['kims_response_time_ms'],
|
||||
'ai_ms': row['ai_response_time_ms'],
|
||||
'total_ms': (row['kims_response_time_ms'] or 0) + (row['ai_response_time_ms'] or 0)
|
||||
},
|
||||
'analysis': ai_response
|
||||
}
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"PAAI 결과 조회 오류: {e}")
|
||||
return jsonify({'exists': False, 'error': str(e)})
|
||||
|
||||
|
||||
@pmr_bp.route('/api/paai/analyze', methods=['POST'])
|
||||
def paai_analyze():
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user