kdrug-inventory-system/add_wolbitang_formulas.py
시골약사 f1034c197f feat: 월비탕 및 삼소음 처방 추가
- 월비탕 1차~4차 단계별 처방 추가 (WBT001-1 ~ WBT001-4)
- 삼소음 처방 추가 (SSE001)
- 처방 추가 가이드 문서 작성
- 약재 성분 코드 확인 및 검증 스크립트 추가

월비탕: 단계별 비만치료 처방 (1차~4차)
삼소음: 리기화담, 해표산한 효능의 기침/가래 치료 처방

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-18 04:36:38 +00:00

213 lines
8.4 KiB
Python

#!/usr/bin/env python3
"""
월비탕 단계별 처방 추가 스크립트
월비탕 1차부터 4차까지 단계별로 처방을 등록합니다.
각 단계마다 약재의 용량이 다릅니다.
"""
import sqlite3
from datetime import datetime
def add_wolbitang_formulas():
"""월비탕 단계별 처방 추가"""
# 약재 성분 코드 매핑
herb_codes = {
"마황": "3147H1AHM",
"석고": "3265H1AHM",
"감초": "3007H1AHM",
"진피": "3632H1AHM",
"복령": "3215H1AHM",
"갈근": "3002H1AHM",
"지황": "3463H1AHM", # 건지황 대신 지황 사용
"창출": "3472H1AHM"
}
# 월비탕 단계별 처방 데이터
wolbitang_prescriptions = [
{
'formula_code': 'WBT001-1',
'formula_name': '월비탕 1차',
'formula_type': 'CUSTOM',
'base_cheop': 1,
'base_pouches': 1,
'description': '월비탕 1차 - 단계별 처방의 첫 번째 단계',
'ingredients': [
{'herb': '마황', 'amount': 4.0, 'notes': '발한해표'},
{'herb': '석고', 'amount': 3.0, 'notes': '청열사화'},
{'herb': '감초', 'amount': 3.0, 'notes': '조화제약'},
{'herb': '진피', 'amount': 3.333, 'notes': '리기화담'},
{'herb': '복령', 'amount': 4.0, 'notes': '건비이수'},
{'herb': '갈근', 'amount': 3.333, 'notes': '승진해기'},
{'herb': '지황', 'amount': 3.333, 'notes': '보음청열'},
{'herb': '창출', 'amount': 3.333, 'notes': '건비조습'}
]
},
{
'formula_code': 'WBT001-2',
'formula_name': '월비탕 2차',
'formula_type': 'CUSTOM',
'base_cheop': 1,
'base_pouches': 1,
'description': '월비탕 2차 - 단계별 처방의 두 번째 단계',
'ingredients': [
{'herb': '마황', 'amount': 5.0, 'notes': '발한해표'},
{'herb': '석고', 'amount': 4.0, 'notes': '청열사화'},
{'herb': '감초', 'amount': 3.0, 'notes': '조화제약'},
{'herb': '진피', 'amount': 3.75, 'notes': '리기화담'},
{'herb': '복령', 'amount': 4.0, 'notes': '건비이수'},
{'herb': '갈근', 'amount': 3.333, 'notes': '승진해기'},
{'herb': '지황', 'amount': 3.333, 'notes': '보음청열'},
{'herb': '창출', 'amount': 3.333, 'notes': '건비조습'}
]
},
{
'formula_code': 'WBT001-3',
'formula_name': '월비탕 3차',
'formula_type': 'CUSTOM',
'base_cheop': 1,
'base_pouches': 1,
'description': '월비탕 3차 - 단계별 처방의 세 번째 단계',
'ingredients': [
{'herb': '마황', 'amount': 6.0, 'notes': '발한해표'},
{'herb': '석고', 'amount': 4.17, 'notes': '청열사화'},
{'herb': '감초', 'amount': 3.0, 'notes': '조화제약'},
{'herb': '진피', 'amount': 4.17, 'notes': '리기화담'},
{'herb': '복령', 'amount': 4.17, 'notes': '건비이수'},
{'herb': '갈근', 'amount': 3.75, 'notes': '승진해기'},
{'herb': '지황', 'amount': 3.75, 'notes': '보음청열'},
{'herb': '창출', 'amount': 3.333, 'notes': '건비조습'}
]
},
{
'formula_code': 'WBT001-4',
'formula_name': '월비탕 4차',
'formula_type': 'CUSTOM',
'base_cheop': 1,
'base_pouches': 1,
'description': '월비탕 4차 - 단계별 처방의 네 번째 단계',
'ingredients': [
{'herb': '마황', 'amount': 7.0, 'notes': '발한해표'},
{'herb': '석고', 'amount': 5.0, 'notes': '청열사화'},
{'herb': '감초', 'amount': 3.0, 'notes': '조화제약'},
{'herb': '진피', 'amount': 4.17, 'notes': '리기화담'},
{'herb': '복령', 'amount': 5.0, 'notes': '건비이수'},
{'herb': '갈근', 'amount': 3.75, 'notes': '승진해기'},
{'herb': '지황', 'amount': 4.0, 'notes': '보음청열'},
{'herb': '창출', 'amount': 3.333, 'notes': '건비조습'}
]
}
]
conn = sqlite3.connect('database/kdrug.db')
cursor = conn.cursor()
try:
# 기존 월비탕 처방 확인
cursor.execute("""
SELECT formula_code, formula_name
FROM formulas
WHERE formula_code LIKE 'WBT%'
ORDER BY formula_code
""")
existing = cursor.fetchall()
if existing:
print("⚠️ 기존 월비탕 처방 발견:")
for code, name in existing:
print(f" - {code}: {name}")
print()
# 각 처방 추가
for prescription in wolbitang_prescriptions:
print(f"\n{'='*60}")
print(f"📝 {prescription['formula_name']} 추가 중...")
# 1. formulas 테이블에 처방 추가
cursor.execute("""
INSERT INTO formulas (
formula_code, formula_name, formula_type,
base_cheop, base_pouches, description,
is_active, created_at, updated_at
) VALUES (?, ?, ?, ?, ?, ?, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
""", (
prescription['formula_code'],
prescription['formula_name'],
prescription['formula_type'],
prescription['base_cheop'],
prescription['base_pouches'],
prescription['description']
))
formula_id = cursor.lastrowid
print(f" ✅ 처방 기본 정보 등록 (ID: {formula_id})")
# 2. formula_ingredients 테이블에 약재 추가
sort_order = 0
for ingredient in prescription['ingredients']:
herb_name = ingredient['herb']
ingredient_code = herb_codes[herb_name]
cursor.execute("""
INSERT INTO formula_ingredients (
formula_id, ingredient_code,
grams_per_cheop, notes,
sort_order, created_at
) VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
""", (
formula_id,
ingredient_code,
ingredient['amount'],
ingredient['notes'],
sort_order
))
sort_order += 1
print(f" - {herb_name}: {ingredient['amount']}g ({ingredient['notes']})")
print(f"{prescription['formula_name']} 추가 완료!")
conn.commit()
print(f"\n{'='*60}")
print("🎉 월비탕 1차~4차 모든 처방이 성공적으로 추가되었습니다!")
# 추가된 처방 확인
print("\n📊 추가된 월비탕 처방 목록:")
print("-"*60)
cursor.execute("""
SELECT f.formula_id, f.formula_code, f.formula_name,
COUNT(fi.ingredient_id) as herb_count,
SUM(fi.grams_per_cheop) as total_grams
FROM formulas f
LEFT JOIN formula_ingredients fi ON f.formula_id = fi.formula_id
WHERE f.formula_code LIKE 'WBT%'
GROUP BY f.formula_id
ORDER BY f.formula_code
""")
for row in cursor.fetchall():
print(f"ID {row[0]}: {row[1]} - {row[2]}")
print(f" 약재 {row[3]}개, 총 {row[4]:.3f}g")
except sqlite3.IntegrityError as e:
print(f"❌ 중복 오류: {e}")
print(" 이미 동일한 처방 코드가 존재합니다.")
conn.rollback()
return False
except sqlite3.Error as e:
print(f"❌ 데이터베이스 오류: {e}")
conn.rollback()
return False
finally:
conn.close()
return True
if __name__ == "__main__":
print("🌿 월비탕 단계별 처방 추가 프로그램")
print("="*60)
if add_wolbitang_formulas():
print("\n✅ 월비탕 처방 추가 작업이 완료되었습니다.")
else:
print("\n❌ 처방 추가 중 오류가 발생했습니다.")