feat: OTC 라벨 프리셋 확인 API + 인쇄 조건 강화
- GET /api/otc-label-check - 바코드 배열로 프리셋 존재 여부 일괄 확인 - 인쇄 API: 프리셋 없으면 인쇄 안 함 (404 반환) - POS 장바구니에서 인쇄 버튼 활성화 판단용
This commit is contained in:
131
backend/app.py
131
backend/app.py
@@ -7885,50 +7885,15 @@ def api_otc_label_print_by_barcode(barcode):
|
|||||||
dosage_instruction = preset['dosage_instruction'] or ''
|
dosage_instruction = preset['dosage_instruction'] or ''
|
||||||
usage_tip = preset['usage_tip'] or ''
|
usage_tip = preset['usage_tip'] or ''
|
||||||
else:
|
else:
|
||||||
# 프리셋 없음 → MSSQL에서 약품명 조회
|
# 프리셋 없음 → 인쇄 안 함
|
||||||
try:
|
response = jsonify({
|
||||||
import pyodbc
|
'success': False,
|
||||||
mssql_conn = pyodbc.connect(
|
'error': f'바코드 {barcode}에 등록된 라벨 프리셋이 없습니다.',
|
||||||
'DRIVER={ODBC Driver 17 for SQL Server};'
|
'barcode': barcode,
|
||||||
'SERVER=192.168.0.4\\PM2014;'
|
'has_preset': False
|
||||||
'DATABASE=PM_DRUG;'
|
})
|
||||||
'UID=sa;'
|
response.headers['Access-Control-Allow-Origin'] = '*'
|
||||||
'PWD=tmddls214!%(;'
|
return response, 404
|
||||||
'TrustServerCertificate=yes',
|
|
||||||
timeout=10
|
|
||||||
)
|
|
||||||
mssql_cursor = mssql_conn.cursor()
|
|
||||||
|
|
||||||
mssql_cursor.execute("""
|
|
||||||
SELECT TOP 1 G.GoodsName
|
|
||||||
FROM CD_GOODS G
|
|
||||||
LEFT JOIN CD_ITEM_UNIT_MEMBER U ON G.DrugCode = U.DRUGCODE
|
|
||||||
WHERE G.BARCODE = ? OR U.CD_CD_BARCODE = ?
|
|
||||||
""", (barcode, barcode))
|
|
||||||
|
|
||||||
row = mssql_cursor.fetchone()
|
|
||||||
mssql_conn.close()
|
|
||||||
|
|
||||||
if row:
|
|
||||||
drug_name = row.GoodsName
|
|
||||||
else:
|
|
||||||
response = jsonify({
|
|
||||||
'success': False,
|
|
||||||
'error': f'바코드 {barcode}에 해당하는 제품을 찾을 수 없습니다. 프리셋을 먼저 등록해주세요.'
|
|
||||||
})
|
|
||||||
response.headers['Access-Control-Allow-Origin'] = '*'
|
|
||||||
return response, 404
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
logging.error(f"MSSQL 조회 오류: {e}")
|
|
||||||
response = jsonify({'success': False, 'error': f'DB 조회 오류: {str(e)}'})
|
|
||||||
response.headers['Access-Control-Allow-Origin'] = '*'
|
|
||||||
return response, 500
|
|
||||||
|
|
||||||
# 기본값으로 인쇄 (효능/용법 없음)
|
|
||||||
effect = ''
|
|
||||||
dosage_instruction = ''
|
|
||||||
usage_tip = ''
|
|
||||||
|
|
||||||
# 2. 인쇄 실행
|
# 2. 인쇄 실행
|
||||||
success = print_otc_label(drug_name, effect, dosage_instruction, usage_tip)
|
success = print_otc_label(drug_name, effect, dosage_instruction, usage_tip)
|
||||||
@@ -7976,6 +7941,84 @@ def api_otc_label_print_options(barcode):
|
|||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/api/otc-label-check', methods=['GET', 'POST'])
|
||||||
|
def api_otc_label_check():
|
||||||
|
"""
|
||||||
|
OTC 라벨 프리셋 존재 여부 일괄 확인 API
|
||||||
|
|
||||||
|
GET /api/otc-label-check?barcodes=8806436044814,8806436058613
|
||||||
|
POST /api/otc-label-check {"barcodes": ["8806436044814", "8806436058613"]}
|
||||||
|
|
||||||
|
- CORS 지원 (외부에서 호출 가능)
|
||||||
|
- 장바구니 등에서 인쇄 버튼 활성화 여부 판단용
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# 바코드 목록 파싱
|
||||||
|
if request.method == 'POST':
|
||||||
|
data = request.get_json() or {}
|
||||||
|
barcodes = data.get('barcodes', [])
|
||||||
|
else:
|
||||||
|
barcodes_param = request.args.get('barcodes', '')
|
||||||
|
barcodes = [b.strip() for b in barcodes_param.split(',') if b.strip()]
|
||||||
|
|
||||||
|
if not barcodes:
|
||||||
|
response = jsonify({'success': False, 'error': '바코드 목록이 필요합니다'})
|
||||||
|
response.headers['Access-Control-Allow-Origin'] = '*'
|
||||||
|
return response, 400
|
||||||
|
|
||||||
|
# 프리셋 존재 여부 확인
|
||||||
|
conn = db_manager.get_sqlite_connection()
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
placeholders = ','.join(['?' for _ in barcodes])
|
||||||
|
cursor.execute(f"""
|
||||||
|
SELECT barcode, display_name
|
||||||
|
FROM otc_label_presets
|
||||||
|
WHERE barcode IN ({placeholders})
|
||||||
|
""", barcodes)
|
||||||
|
|
||||||
|
preset_map = {row['barcode']: row['display_name'] for row in cursor.fetchall()}
|
||||||
|
|
||||||
|
# 결과 생성
|
||||||
|
results = []
|
||||||
|
printable_count = 0
|
||||||
|
for barcode in barcodes:
|
||||||
|
has_preset = barcode in preset_map
|
||||||
|
if has_preset:
|
||||||
|
printable_count += 1
|
||||||
|
results.append({
|
||||||
|
'barcode': barcode,
|
||||||
|
'has_preset': has_preset,
|
||||||
|
'display_name': preset_map.get(barcode),
|
||||||
|
'printable': has_preset
|
||||||
|
})
|
||||||
|
|
||||||
|
response = jsonify({
|
||||||
|
'success': True,
|
||||||
|
'total': len(barcodes),
|
||||||
|
'printable_count': printable_count,
|
||||||
|
'results': results
|
||||||
|
})
|
||||||
|
response.headers['Access-Control-Allow-Origin'] = '*'
|
||||||
|
return response
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"OTC 라벨 체크 오류: {e}")
|
||||||
|
response = jsonify({'success': False, 'error': str(e)})
|
||||||
|
response.headers['Access-Control-Allow-Origin'] = '*'
|
||||||
|
return response, 500
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/api/otc-label-check', methods=['OPTIONS'])
|
||||||
|
def api_otc_label_check_options():
|
||||||
|
"""CORS preflight 요청 처리"""
|
||||||
|
response = make_response()
|
||||||
|
response.headers['Access-Control-Allow-Origin'] = '*'
|
||||||
|
response.headers['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS'
|
||||||
|
response.headers['Access-Control-Allow-Headers'] = 'Content-Type'
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
@app.route('/api/admin/otc-labels/search-mssql', methods=['GET'])
|
@app.route('/api/admin/otc-labels/search-mssql', methods=['GET'])
|
||||||
def api_search_mssql_drug():
|
def api_search_mssql_drug():
|
||||||
"""MSSQL에서 약품 검색 (바코드 또는 이름)"""
|
"""MSSQL에서 약품 검색 (바코드 또는 이름)"""
|
||||||
|
|||||||
Reference in New Issue
Block a user