feat: PMR 이전 처방 비교 기능
- /pmr/api/patient/<cus_code>/history: 환자 이전 처방 이력 API - 하단에 이전 처방 영역 + < > 네비게이션 - 현재 처방과 이전 처방 한눈에 비교 가능
This commit is contained in:
@@ -518,3 +518,113 @@ def create_label_image(patient_name, med_name, add_info='', dosage=0, frequency=
|
||||
draw_centered("청 춘 약 국", pharmacy_y, info_font)
|
||||
|
||||
return image
|
||||
|
||||
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
# API: 환자 이전 처방 이력
|
||||
# ─────────────────────────────────────────────────────────────
|
||||
@pmr_bp.route('/api/patient/<cus_code>/history', methods=['GET'])
|
||||
def get_patient_history(cus_code):
|
||||
"""
|
||||
환자 이전 처방 이력 조회
|
||||
|
||||
Args:
|
||||
cus_code: 환자 고유코드 (CusCode)
|
||||
|
||||
Query Params:
|
||||
- limit: 최대 조회 건수 (기본 10, 최대 50)
|
||||
- exclude: 제외할 처방번호 (현재 처방)
|
||||
"""
|
||||
try:
|
||||
limit = min(int(request.args.get('limit', 10)), 50)
|
||||
exclude_serial = request.args.get('exclude', '')
|
||||
|
||||
conn = get_mssql_connection('PM_PRES')
|
||||
cursor = conn.cursor()
|
||||
|
||||
# 이전 처방 목록 조회
|
||||
query = """
|
||||
SELECT TOP (?)
|
||||
m.PreSerial,
|
||||
m.PassDay,
|
||||
m.PresTime,
|
||||
m.Paname,
|
||||
m.InsName,
|
||||
m.Drname,
|
||||
m.PRICE_P,
|
||||
(SELECT COUNT(*) FROM PS_sub_pharm WHERE PreSerial = m.PreSerial) as drug_count
|
||||
FROM PS_MAIN m
|
||||
WHERE m.CusCode = ?
|
||||
"""
|
||||
params = [limit, cus_code]
|
||||
|
||||
if exclude_serial:
|
||||
query += " AND m.PreSerial != ?"
|
||||
params.append(exclude_serial)
|
||||
|
||||
query += " ORDER BY m.PassDay DESC, m.PresTime DESC"
|
||||
|
||||
cursor.execute(query, params)
|
||||
|
||||
history = []
|
||||
for row in cursor.fetchall():
|
||||
pre_serial = row.PreSerial
|
||||
|
||||
# 해당 처방의 약품 목록 조회
|
||||
cursor.execute("""
|
||||
SELECT
|
||||
s.DrugCode,
|
||||
s.Days,
|
||||
s.QUAN,
|
||||
s.QUAN_TIME,
|
||||
g.GoodsName,
|
||||
m.PRINT_TYPE
|
||||
FROM PS_sub_pharm s
|
||||
LEFT JOIN PM_DRUG.dbo.CD_GOODS g ON s.DrugCode = g.DrugCode
|
||||
LEFT JOIN PM_DRUG.dbo.CD_MC m ON s.DrugCode = m.DRUGCODE
|
||||
WHERE s.PreSerial = ?
|
||||
ORDER BY s.SUB_SERIAL
|
||||
""", (pre_serial,))
|
||||
|
||||
medications = []
|
||||
for med_row in cursor.fetchall():
|
||||
medications.append({
|
||||
'medication_code': med_row.DrugCode or '',
|
||||
'med_name': med_row.GoodsName or med_row.DrugCode or '',
|
||||
'add_info': med_row.PRINT_TYPE or '',
|
||||
'dosage': float(med_row.QUAN) if med_row.QUAN else 0,
|
||||
'frequency': med_row.QUAN_TIME or 0,
|
||||
'duration': med_row.Days or 0
|
||||
})
|
||||
|
||||
# 날짜 포맷
|
||||
pass_day = row.PassDay
|
||||
if pass_day and len(pass_day) == 8:
|
||||
date_formatted = f"{pass_day[:4]}-{pass_day[4:6]}-{pass_day[6:8]}"
|
||||
else:
|
||||
date_formatted = pass_day or ''
|
||||
|
||||
history.append({
|
||||
'prescription_id': pre_serial,
|
||||
'date': date_formatted,
|
||||
'time': row.PresTime or '',
|
||||
'patient_name': row.Paname or '',
|
||||
'hospital': row.InsName or '',
|
||||
'doctor': row.Drname or '',
|
||||
'copayment': int(row.PRICE_P or 0),
|
||||
'medication_count': row.drug_count or 0,
|
||||
'medications': medications
|
||||
})
|
||||
|
||||
conn.close()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'cus_code': cus_code,
|
||||
'count': len(history),
|
||||
'history': history
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"환자 이전 처방 조회 오류: {e}")
|
||||
return jsonify({'success': False, 'error': str(e)}), 500
|
||||
|
||||
Reference in New Issue
Block a user