feat(pmr): 라벨에 보관조건 표시 추가
- get_conversion_factor()에서 storage_conditions 함께 반환 - PostgreSQL 조회 결과 없으면 '실온보관' 기본값 - create_label_image()에 storage_conditions 파라미터 추가 - 용법 박스 아래, 조제일 위 여백에 보관조건 표시 - 모든 약품에 보관조건 표시 (실온보관 포함)
This commit is contained in:
parent
2cc9ec6bb1
commit
4944669470
@ -305,7 +305,7 @@ class DatabaseManager:
|
|||||||
|
|
||||||
def get_conversion_factor(self, sung_code):
|
def get_conversion_factor(self, sung_code):
|
||||||
"""
|
"""
|
||||||
건조시럽 환산계수 조회
|
건조시럽 환산계수 및 보관조건 조회
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
sung_code: SUNG_CODE (예: "535000ASY")
|
sung_code: SUNG_CODE (예: "535000ASY")
|
||||||
@ -314,13 +314,15 @@ class DatabaseManager:
|
|||||||
dict: {
|
dict: {
|
||||||
'conversion_factor': float 또는 None,
|
'conversion_factor': float 또는 None,
|
||||||
'ingredient_name': str 또는 None,
|
'ingredient_name': str 또는 None,
|
||||||
'product_name': str 또는 None
|
'product_name': str 또는 None,
|
||||||
|
'storage_conditions': str (기본값 '실온보관')
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
result = {
|
result = {
|
||||||
'conversion_factor': None,
|
'conversion_factor': None,
|
||||||
'ingredient_name': None,
|
'ingredient_name': None,
|
||||||
'product_name': None
|
'product_name': None,
|
||||||
|
'storage_conditions': '실온보관' # 기본값
|
||||||
}
|
}
|
||||||
|
|
||||||
session = self.get_postgres_session()
|
session = self.get_postgres_session()
|
||||||
@ -329,7 +331,7 @@ class DatabaseManager:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
query = text("""
|
query = text("""
|
||||||
SELECT conversion_factor, ingredient_name, product_name
|
SELECT conversion_factor, ingredient_name, product_name, storage_conditions
|
||||||
FROM drysyrup
|
FROM drysyrup
|
||||||
WHERE ingredient_code = :sung_code
|
WHERE ingredient_code = :sung_code
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
@ -340,6 +342,9 @@ class DatabaseManager:
|
|||||||
result['conversion_factor'] = float(row[0]) if row[0] is not None else None
|
result['conversion_factor'] = float(row[0]) if row[0] is not None else None
|
||||||
result['ingredient_name'] = row[1]
|
result['ingredient_name'] = row[1]
|
||||||
result['product_name'] = row[2]
|
result['product_name'] = row[2]
|
||||||
|
# storage_conditions: 값이 있으면 사용, 없으면 기본값 '실온보관' 유지
|
||||||
|
if row[3]:
|
||||||
|
result['storage_conditions'] = row[3]
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[DB Manager] 환산계수 조회 실패 (SUNG_CODE={sung_code}): {e}")
|
print(f"[DB Manager] 환산계수 조회 실패 (SUNG_CODE={sung_code}): {e}")
|
||||||
# 세션 롤백
|
# 세션 롤백
|
||||||
|
|||||||
@ -589,13 +589,15 @@ def preview_label():
|
|||||||
unit = data.get('unit', '정')
|
unit = data.get('unit', '정')
|
||||||
sung_code = data.get('sung_code', '')
|
sung_code = data.get('sung_code', '')
|
||||||
|
|
||||||
# 환산계수 조회 (sung_code가 있는 경우)
|
# 환산계수 및 보관조건 조회 (sung_code가 있는 경우)
|
||||||
conversion_factor = None
|
conversion_factor = None
|
||||||
|
storage_conditions = '실온보관'
|
||||||
if sung_code:
|
if sung_code:
|
||||||
try:
|
try:
|
||||||
from db.dbsetup import db_manager
|
from db.dbsetup import db_manager
|
||||||
cf_result = db_manager.get_conversion_factor(sung_code)
|
cf_result = db_manager.get_conversion_factor(sung_code)
|
||||||
conversion_factor = cf_result.get('conversion_factor')
|
conversion_factor = cf_result.get('conversion_factor')
|
||||||
|
storage_conditions = cf_result.get('storage_conditions', '실온보관')
|
||||||
except Exception as cf_err:
|
except Exception as cf_err:
|
||||||
logging.warning(f"환산계수 조회 실패 (무시): {cf_err}")
|
logging.warning(f"환산계수 조회 실패 (무시): {cf_err}")
|
||||||
|
|
||||||
@ -608,7 +610,8 @@ def preview_label():
|
|||||||
frequency=frequency,
|
frequency=frequency,
|
||||||
duration=duration,
|
duration=duration,
|
||||||
unit=unit,
|
unit=unit,
|
||||||
conversion_factor=conversion_factor
|
conversion_factor=conversion_factor,
|
||||||
|
storage_conditions=storage_conditions
|
||||||
)
|
)
|
||||||
|
|
||||||
# Base64 인코딩
|
# Base64 인코딩
|
||||||
@ -620,7 +623,8 @@ def preview_label():
|
|||||||
return jsonify({
|
return jsonify({
|
||||||
'success': True,
|
'success': True,
|
||||||
'image': f'data:image/png;base64,{img_base64}',
|
'image': f'data:image/png;base64,{img_base64}',
|
||||||
'conversion_factor': conversion_factor
|
'conversion_factor': conversion_factor,
|
||||||
|
'storage_conditions': storage_conditions
|
||||||
})
|
})
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -670,13 +674,15 @@ def print_label():
|
|||||||
printer_ip = '192.168.0.168'
|
printer_ip = '192.168.0.168'
|
||||||
printer_model = 'QL-810W'
|
printer_model = 'QL-810W'
|
||||||
|
|
||||||
# 환산계수 조회
|
# 환산계수 및 보관조건 조회
|
||||||
conversion_factor = None
|
conversion_factor = None
|
||||||
|
storage_conditions = '실온보관'
|
||||||
if sung_code:
|
if sung_code:
|
||||||
try:
|
try:
|
||||||
from db.dbsetup import db_manager
|
from db.dbsetup import db_manager
|
||||||
cf_result = db_manager.get_conversion_factor(sung_code)
|
cf_result = db_manager.get_conversion_factor(sung_code)
|
||||||
conversion_factor = cf_result.get('conversion_factor')
|
conversion_factor = cf_result.get('conversion_factor')
|
||||||
|
storage_conditions = cf_result.get('storage_conditions', '실온보관')
|
||||||
except Exception as cf_err:
|
except Exception as cf_err:
|
||||||
logging.warning(f"환산계수 조회 실패 (무시): {cf_err}")
|
logging.warning(f"환산계수 조회 실패 (무시): {cf_err}")
|
||||||
|
|
||||||
@ -689,7 +695,8 @@ def print_label():
|
|||||||
frequency=frequency,
|
frequency=frequency,
|
||||||
duration=duration,
|
duration=duration,
|
||||||
unit=unit,
|
unit=unit,
|
||||||
conversion_factor=conversion_factor
|
conversion_factor=conversion_factor,
|
||||||
|
storage_conditions=storage_conditions
|
||||||
)
|
)
|
||||||
|
|
||||||
# 2. 방향 설정 (portrait: 회전 없음, landscape: 90도 회전)
|
# 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)
|
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 용지 기준) - 레거시 디자인 적용
|
라벨 이미지 생성 (29mm 용지 기준) - 레거시 디자인 적용
|
||||||
|
|
||||||
@ -810,6 +817,8 @@ def create_label_image(patient_name, med_name, add_info='', dosage=0, frequency=
|
|||||||
conversion_factor: 건조시럽 환산계수 (mL→g 변환용, 선택)
|
conversion_factor: 건조시럽 환산계수 (mL→g 변환용, 선택)
|
||||||
- 예: 0.11이면 120ml * 0.11 = 13.2g
|
- 예: 0.11이면 120ml * 0.11 = 13.2g
|
||||||
- 총량 옆에 괄호로 표시: "총120mL (13.2g)/5일분"
|
- 총량 옆에 괄호로 표시: "총120mL (13.2g)/5일분"
|
||||||
|
storage_conditions: 보관조건 (예: '냉장보관', '실온보관')
|
||||||
|
- 용법 박스와 조제일 사이 여백에 표시
|
||||||
"""
|
"""
|
||||||
# 약품명 정제 (밀리그램 → mg 등)
|
# 약품명 정제 (밀리그램 → mg 등)
|
||||||
med_name = normalize_medication_name(med_name)
|
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
|
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')
|
today = datetime.now().strftime('%Y-%m-%d')
|
||||||
print_date_text = f"조제일 : {today}"
|
print_date_text = f"조제일 : {today}"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user