kdrug-inventory-system/add_samsoeun_formula.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

163 lines
6.5 KiB
Python

#!/usr/bin/env python3
"""
삼소음 처방 추가 스크립트
처방 추가 가이드 문서의 방식에 따라 삼소음을 추가합니다.
"""
import sqlite3
from datetime import datetime
def add_samsoeun():
"""삼소음 처방 추가"""
# 처방 데이터 준비
prescription_data = {
'formula_code': 'SSE001', # 삼소음 코드
'formula_name': '삼소음',
'formula_type': 'STANDARD',
'base_cheop': 1,
'base_pouches': 1,
'description': '리기화담, 해표산한의 효능으로 외감풍한과 내상식적으로 인한 기침, 가래를 치료하는 처방',
'ingredients': [
{'code': '3400H1AHM', 'herb': '인삼', 'amount': 4.0, 'notes': '대보원기'},
{'code': '3411H1AHM', 'herb': '소엽(자소엽)', 'amount': 4.0, 'notes': '해표산한'},
{'code': '3433H1AHM', 'herb': '전호', 'amount': 4.0, 'notes': '강기화담'},
{'code': '3182H1AHM', 'herb': '반하', 'amount': 4.0, 'notes': '화담지구'},
{'code': '3002H1AHM', 'herb': '갈근', 'amount': 4.0, 'notes': '승진해기'},
{'code': '3215H1AHM', 'herb': '적복령(복령)', 'amount': 4.0, 'notes': '건비이수'},
{'code': '3115H1AHM', 'herb': '대조(대추)', 'amount': 4.0, 'notes': '보중익기'},
{'code': '3466H1AHM', 'herb': '진피', 'amount': 3.0, 'notes': '리기화담'},
{'code': '3077H1AHM', 'herb': '길경', 'amount': 3.0, 'notes': '선폐거담'},
{'code': '3454H1AHM', 'herb': '지각', 'amount': 3.0, 'notes': '파기소적'},
{'code': '3007H1AHM', 'herb': '감초', 'amount': 3.0, 'notes': '조화제약'},
{'code': '3017H1AHM', 'herb': '건강', 'amount': 1.0, 'notes': '온중산한'}
]
}
conn = sqlite3.connect('database/kdrug.db')
cursor = conn.cursor()
try:
# 기존 삼소음 처방 확인
cursor.execute("""
SELECT formula_id, formula_code, formula_name
FROM formulas
WHERE formula_code = ? OR formula_name = ?
""", (prescription_data['formula_code'], prescription_data['formula_name']))
existing = cursor.fetchone()
if existing:
print(f"⚠️ 이미 존재하는 처방: {existing[2]} ({existing[1]})")
print("기존 처방을 삭제하고 새로 추가하시겠습니까? (이 스크립트는 자동으로 진행합니다)")
# 기존 처방과 관련 데이터 삭제
cursor.execute("DELETE FROM formula_ingredients WHERE formula_id = ?", (existing[0],))
cursor.execute("DELETE FROM formulas WHERE formula_id = ?", (existing[0],))
print(f"✅ 기존 처방 삭제 완료")
print(f"\n{'='*60}")
print(f"📝 {prescription_data['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_data['formula_code'],
prescription_data['formula_name'],
prescription_data['formula_type'],
prescription_data['base_cheop'],
prescription_data['base_pouches'],
prescription_data['description']
))
formula_id = cursor.lastrowid
print(f"✅ 처방 기본 정보 등록 (ID: {formula_id})")
# 2. formula_ingredients 테이블에 약재 추가
print(f"\n약재 구성:")
sort_order = 0
total_amount = 0
for ingredient in prescription_data['ingredients']:
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
total_amount += ingredient['amount']
print(f" - {ingredient['herb']:15s}: {ingredient['amount']:5.1f}g ({ingredient['notes']})")
print(f"\n총 약재: {len(prescription_data['ingredients'])}")
print(f"1첩 총 용량: {total_amount:.1f}g")
conn.commit()
print(f"\n{prescription_data['formula_name']} 처방 추가 완료!")
# 추가된 처방 확인
print(f"\n{'='*60}")
print("📊 추가된 처방 확인:")
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 = ?
GROUP BY f.formula_id
""", (prescription_data['formula_code'],))
result = cursor.fetchone()
if result:
print(f"ID {result[0]}: {result[1]} - {result[2]}")
print(f" 약재 {result[3]}개, 총 {result[4]:.1f}g")
# 상세 구성 확인
print(f"\n상세 구성:")
cursor.execute("""
SELECT hm.herb_name, fi.grams_per_cheop, fi.notes
FROM formula_ingredients fi
JOIN herb_masters hm ON fi.ingredient_code = hm.ingredient_code
WHERE fi.formula_id = ?
ORDER BY fi.sort_order
""", (result[0],))
for herb, amount, notes in cursor.fetchall():
print(f" - {herb:15s}: {amount:5.1f}g ({notes})")
except sqlite3.IntegrityError as e:
print(f"❌ 중복 오류: {e}")
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_samsoeun():
print("\n✅ 삼소음 처방 추가 작업이 완료되었습니다.")
else:
print("\n❌ 처방 추가 중 오류가 발생했습니다.")