From e6f4d5b1e760311ff66fb4273087024aac917ec3 Mon Sep 17 00:00:00 2001 From: thug0bin Date: Wed, 11 Mar 2026 22:31:43 +0900 Subject: [PATCH] =?UTF-8?q?feat(pmr):=20=EB=9D=BC=EB=B2=A8=20=EB=8F=99?= =?UTF-8?q?=EC=A0=81=20=ED=8F=B0=ED=8A=B8=20+=20=ED=95=9C=EA=B8=80=20?= =?UTF-8?q?=EC=A4=84=EB=B0=94=EA=BF=88=20+=20=ED=8C=8C=EC=8B=B1=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 약품명 동적 폰트 크기 (32px→18px 자동 축소) - wrap_text_korean(): 글자 단위 줄바꿈 (한글 지원) - (2.5mg)노바스크정 → 앞의 괄호 제거 후 처리 - 파일 상단 함수 가이드 문서화 추가 --- backend/pmr_api.py | 67 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 7 deletions(-) diff --git a/backend/pmr_api.py b/backend/pmr_api.py index 8fb65c6..35a8629 100644 --- a/backend/pmr_api.py +++ b/backend/pmr_api.py @@ -1,5 +1,33 @@ # pmr_api.py - 조제관리(PMR) Blueprint API # PharmaIT3000 MSSQL 연동 (192.168.0.4) +# +# ═══════════════════════════════════════════════════════════════ +# 📋 주요 함수 가이드 +# ═══════════════════════════════════════════════════════════════ +# +# 🏷️ 라벨 관련: +# - normalize_medication_name(med_name) +# 약품명 정규화: 밀리그램→mg, 언더스코어 제거 등 +# 예: "케이발린캡슐75밀리그램_" → "케이발린캡슐75mg" +# +# - get_drug_unit(goods_name, sung_code) [utils/drug_unit.py] +# SUNG_CODE 기반 단위 판별 +# 예: SUNG_CODE "123456TB" → "정" (TB=정제) +# FormCode: TB=정, CA/CH/CS=캡슐, SY=mL, GA/GB=포 등 +# +# - create_label_image(patient_name, med_name, ...) +# PIL로 29mm 라벨 이미지 생성 +# 지그재그 테두리, 동적 폰트, 복용량 박스 등 +# +# 📊 SUNG_CODE FormCode 참조 (마지막 2자리): +# 정제류: TA, TB, TC, TD, TE, TH, TJ, TR → "정" +# 캡슐류: CA, CB, CH, CI, CJ, CS → "캡슐" +# 액제류: SS, SY, LQ → "mL" (시럽) +# 산제류: GA, GB, GC, GN, PD → "포" +# 점안제: EY, OS → "병" 또는 "개" +# 외용제: XT, XO, XL → "g" 또는 "개" +# +# ═══════════════════════════════════════════════════════════════ from flask import Blueprint, jsonify, request, render_template, send_file import pyodbc @@ -708,6 +736,25 @@ def create_label_image(patient_name, med_name, add_info='', dosage=0, frequency= return y + bbox[3] - bbox[1] + 5 # 약품명 줄바꿈 처리 + def wrap_text_korean(text, font, max_width, draw): + """한글/영문 혼합 텍스트 줄바꿈 (글자 단위)""" + if not text: + return [text] + lines = [] + current_line = "" + for char in text: + test_line = current_line + char + bbox = draw.textbbox((0, 0), test_line, font=font) + if bbox[2] - bbox[0] <= max_width: + current_line = test_line + else: + if current_line: + lines.append(current_line) + current_line = char + if current_line: + lines.append(current_line) + return lines if lines else [text] + def wrap_text(text, font, max_width): lines = [] words = text.split() @@ -734,16 +781,22 @@ def create_label_image(patient_name, med_name, add_info='', dosage=0, frequency= y += 5 # 약품명 (줄바꿈) - # 괄호 앞에서 분리 - if '(' in med_name: - main_name = med_name.split('(')[0].strip() - else: + # 앞에 있는 (숫자mg) 패턴 제거 후, 뒤의 괄호 앞에서 분리 + import re + # (2.5mg)노바스크정 → 노바스크정 + main_name = re.sub(r'^\([^)]+\)', '', med_name).strip() + # 노바스크정(고혈압) → 노바스크정 + if '(' in main_name: + main_name = main_name.split('(')[0].strip() + # 빈 문자열이면 원본 사용 + if not main_name: main_name = med_name - # 약품명 줄바꿈 - name_lines = wrap_text(main_name, drug_font, label_width - 30) + # 약품명 - 동적 폰트 크기 적용 (긴 이름 자동 축소) + adaptive_drug_font = get_adaptive_font(main_name, label_width - 30, 32, 18) + name_lines = wrap_text_korean(main_name, adaptive_drug_font, label_width - 30, draw) for line in name_lines: - y = draw_centered(line, y, drug_font) + y = draw_centered(line, y, adaptive_drug_font) # 효능효과 (add_info) - 동적 폰트 크기 적용 if add_info: