feat(pmr): 라벨에 보관조건 표시 추가

- get_conversion_factor()에서 storage_conditions 함께 반환
- PostgreSQL 조회 결과 없으면 '실온보관' 기본값
- create_label_image()에 storage_conditions 파라미터 추가
- 용법 박스 아래, 조제일 위 여백에 보관조건 표시
- 모든 약품에 보관조건 표시 (실온보관 포함)
This commit is contained in:
thug0bin 2026-03-12 17:26:05 +09:00
parent 2cc9ec6bb1
commit 4944669470
2 changed files with 37 additions and 10 deletions

View File

@ -305,7 +305,7 @@ class DatabaseManager:
def get_conversion_factor(self, sung_code):
"""
건조시럽 환산계수 조회
건조시럽 환산계수 보관조건 조회
Args:
sung_code: SUNG_CODE (: "535000ASY")
@ -314,13 +314,15 @@ class DatabaseManager:
dict: {
'conversion_factor': float 또는 None,
'ingredient_name': str 또는 None,
'product_name': str 또는 None
'product_name': str 또는 None,
'storage_conditions': str (기본값 '실온보관')
}
"""
result = {
'conversion_factor': None,
'ingredient_name': None,
'product_name': None
'product_name': None,
'storage_conditions': '실온보관' # 기본값
}
session = self.get_postgres_session()
@ -329,7 +331,7 @@ class DatabaseManager:
try:
query = text("""
SELECT conversion_factor, ingredient_name, product_name
SELECT conversion_factor, ingredient_name, product_name, storage_conditions
FROM drysyrup
WHERE ingredient_code = :sung_code
LIMIT 1
@ -340,6 +342,9 @@ class DatabaseManager:
result['conversion_factor'] = float(row[0]) if row[0] is not None else None
result['ingredient_name'] = row[1]
result['product_name'] = row[2]
# storage_conditions: 값이 있으면 사용, 없으면 기본값 '실온보관' 유지
if row[3]:
result['storage_conditions'] = row[3]
except Exception as e:
print(f"[DB Manager] 환산계수 조회 실패 (SUNG_CODE={sung_code}): {e}")
# 세션 롤백

View File

@ -589,13 +589,15 @@ def preview_label():
unit = data.get('unit', '')
sung_code = data.get('sung_code', '')
# 환산계수 조회 (sung_code가 있는 경우)
# 환산계수 및 보관조건 조회 (sung_code가 있는 경우)
conversion_factor = None
storage_conditions = '실온보관'
if sung_code:
try:
from db.dbsetup import db_manager
cf_result = db_manager.get_conversion_factor(sung_code)
conversion_factor = cf_result.get('conversion_factor')
storage_conditions = cf_result.get('storage_conditions', '실온보관')
except Exception as cf_err:
logging.warning(f"환산계수 조회 실패 (무시): {cf_err}")
@ -608,7 +610,8 @@ def preview_label():
frequency=frequency,
duration=duration,
unit=unit,
conversion_factor=conversion_factor
conversion_factor=conversion_factor,
storage_conditions=storage_conditions
)
# Base64 인코딩
@ -620,7 +623,8 @@ def preview_label():
return jsonify({
'success': True,
'image': f'data:image/png;base64,{img_base64}',
'conversion_factor': conversion_factor
'conversion_factor': conversion_factor,
'storage_conditions': storage_conditions
})
except Exception as e:
@ -670,13 +674,15 @@ def print_label():
printer_ip = '192.168.0.168'
printer_model = 'QL-810W'
# 환산계수 조회
# 환산계수 및 보관조건 조회
conversion_factor = None
storage_conditions = '실온보관'
if sung_code:
try:
from db.dbsetup import db_manager
cf_result = db_manager.get_conversion_factor(sung_code)
conversion_factor = cf_result.get('conversion_factor')
storage_conditions = cf_result.get('storage_conditions', '실온보관')
except Exception as cf_err:
logging.warning(f"환산계수 조회 실패 (무시): {cf_err}")
@ -689,7 +695,8 @@ def print_label():
frequency=frequency,
duration=duration,
unit=unit,
conversion_factor=conversion_factor
conversion_factor=conversion_factor,
storage_conditions=storage_conditions
)
# 2. 방향 설정 (portrait: 회전 없음, landscape: 90도 회전)
@ -802,7 +809,7 @@ def draw_scissor_border(draw, width, height, edge_size=5, steps=20):
draw.line(right_points, fill="black", width=2)
def create_label_image(patient_name, med_name, add_info='', dosage=0, frequency=0, duration=0, unit='', conversion_factor=None):
def create_label_image(patient_name, med_name, add_info='', dosage=0, frequency=0, duration=0, unit='', conversion_factor=None, storage_conditions='실온보관'):
"""
라벨 이미지 생성 (29mm 용지 기준) - 레거시 디자인 적용
@ -810,6 +817,8 @@ def create_label_image(patient_name, med_name, add_info='', dosage=0, frequency=
conversion_factor: 건조시럽 환산계수 (mLg 변환용, 선택)
- : 0.11이면 120ml * 0.11 = 13.2g
- 총량 옆에 괄호로 표시: "총120mL (13.2g)/5일분"
storage_conditions: 보관조건 (: '냉장보관', '실온보관')
- 용법 박스와 조제일 사이 여백에 표시
"""
# 약품명 정제 (밀리그램 → mg 등)
med_name = normalize_medication_name(med_name)
@ -1000,6 +1009,19 @@ def create_label_image(patient_name, med_name, add_info='', dosage=0, frequency=
y = box_bottom + 10
# 보관조건 표시 (용법 박스와 조제일 사이 여백)
if storage_conditions:
# 모든 보관조건 표시 (실온보관, 냉장보관 등)
storage_text = f"* {storage_conditions}"
try:
storage_font = ImageFont.truetype(font_path, 22)
except:
storage_font = ImageFont.load_default()
bbox_storage = draw.textbbox((0, 0), storage_text, font=storage_font)
storage_w = bbox_storage[2] - bbox_storage[0]
draw.text(((label_width - storage_w) / 2, y), storage_text, font=storage_font, fill="black")
y += 25
# 조제일 (시그니처 위쪽에 배치)
today = datetime.now().strftime('%Y-%m-%d')
print_date_text = f"조제일 : {today}"