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>
This commit is contained in:
시골약사 2026-02-18 04:36:38 +00:00
parent 831584f752
commit f1034c197f
9 changed files with 1140 additions and 0 deletions

163
add_samsoeun_formula.py Normal file
View File

@ -0,0 +1,163 @@
#!/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❌ 처방 추가 중 오류가 발생했습니다.")

213
add_wolbitang_formulas.py Normal file
View File

@ -0,0 +1,213 @@
#!/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❌ 처방 추가 중 오류가 발생했습니다.")

View File

@ -0,0 +1,109 @@
#!/usr/bin/env python3
"""
삼소음에 사용되는 약재들의 성분 코드 확인
"""
import sqlite3
def check_herb_codes():
"""약재 성분 코드 확인"""
# 삼소음에 사용되는 약재들
herbs_to_check = [
"인삼",
"소엽", # 자소엽
"전호",
"반하",
"갈근",
"적복령", # 적복령 또는 복령
"대조", # 대추
"진피",
"길경",
"지각",
"감초",
"건강"
]
conn = sqlite3.connect('database/kdrug.db')
cursor = conn.cursor()
herb_codes = {}
print("🌿 삼소음 약재 성분 코드 확인")
print("="*60)
for herb in herbs_to_check:
# 정확한 이름으로 먼저 검색
cursor.execute("""
SELECT ingredient_code, herb_name, herb_name_hanja
FROM herb_masters
WHERE herb_name = ?
""", (herb,))
result = cursor.fetchone()
# 정확한 이름이 없으면 포함된 이름으로 검색
if not result:
# 특수 케이스 처리
if herb == "소엽":
search_term = "자소엽"
elif herb == "대조":
search_term = "대추"
elif herb == "적복령":
search_term = "적복령"
else:
search_term = herb
cursor.execute("""
SELECT ingredient_code, herb_name, herb_name_hanja
FROM herb_masters
WHERE herb_name LIKE ? OR herb_name = ?
ORDER BY
CASE WHEN herb_name = ? THEN 0 ELSE 1 END,
LENGTH(herb_name)
LIMIT 1
""", (f'%{search_term}%', search_term, search_term))
result = cursor.fetchone()
if result:
herb_codes[herb] = result[0]
print(f"{herb}: {result[0]} ({result[1]})")
else:
print(f"{herb}: 찾을 수 없음")
# 유사한 이름 검색
cursor.execute("""
SELECT herb_name
FROM herb_masters
WHERE herb_name LIKE ?
LIMIT 5
""", (f'%{herb[:2]}%',))
similar = cursor.fetchall()
if similar:
print(f" 유사한 약재: {', '.join([s[0] for s in similar])}")
# 복령 관련 추가 확인
if "적복령" not in herb_codes or not herb_codes.get("적복령"):
print("\n📌 복령 관련 약재 추가 검색:")
cursor.execute("""
SELECT ingredient_code, herb_name
FROM herb_masters
WHERE herb_name LIKE '%복령%'
ORDER BY herb_name
""")
bokryung_list = cursor.fetchall()
for code, name in bokryung_list:
print(f" - {code}: {name}")
conn.close()
return herb_codes
if __name__ == "__main__":
herb_codes = check_herb_codes()
print("\n📊 약재 코드 매핑 결과:")
print("-"*60)
for herb, code in herb_codes.items():
if code:
print(f'"{herb}": "{code}",')

View File

@ -0,0 +1,78 @@
#!/usr/bin/env python3
"""
월비탕에 사용되는 약재들의 성분 코드 확인
"""
import sqlite3
def check_herb_codes():
"""약재 성분 코드 확인"""
# 월비탕에 사용되는 약재들
herbs_to_check = [
"마황",
"석고",
"감초",
"진피",
"복령",
"갈근",
"건지황",
"창출"
]
conn = sqlite3.connect('database/kdrug.db')
cursor = conn.cursor()
herb_codes = {}
print("🌿 월비탕 약재 성분 코드 확인")
print("="*50)
for herb in herbs_to_check:
# 정확한 이름으로 먼저 검색
cursor.execute("""
SELECT ingredient_code, herb_name, herb_name_hanja
FROM herb_masters
WHERE herb_name = ?
""", (herb,))
result = cursor.fetchone()
# 정확한 이름이 없으면 포함된 이름으로 검색
if not result:
cursor.execute("""
SELECT ingredient_code, herb_name, herb_name_hanja
FROM herb_masters
WHERE herb_name LIKE ?
ORDER BY LENGTH(herb_name)
LIMIT 1
""", (f'%{herb}%',))
result = cursor.fetchone()
if result:
herb_codes[herb] = result[0]
print(f"{herb}: {result[0]} ({result[1]}, {result[2]})")
else:
print(f"{herb}: 찾을 수 없음")
# 비슷한 이름 찾기
cursor.execute("""
SELECT herb_name
FROM herb_masters
WHERE herb_name LIKE ?
LIMIT 5
""", (f'%{herb[:2]}%',))
similar = cursor.fetchall()
if similar:
print(f" 유사한 약재: {', '.join([s[0] for s in similar])}")
conn.close()
return herb_codes
if __name__ == "__main__":
herb_codes = check_herb_codes()
print("\n📊 약재 코드 매핑 결과:")
print("-"*50)
for herb, code in herb_codes.items():
print(f'"{herb}": "{code}",')

View File

@ -0,0 +1,293 @@
# 처방 데이터 추가 가이드
## 개요
이 문서는 K-Drug 시스템에 새로운 한방 처방을 추가하는 방법을 설명합니다.
## 데이터베이스 구조
### 1. formulas 테이블
처방의 기본 정보를 저장하는 테이블입니다.
| 컬럼명 | 타입 | 설명 |
|--------|------|------|
| formula_id | INTEGER | 처방 고유 ID (자동생성) |
| formula_code | TEXT | 처방 코드 (예: SCR001) |
| formula_name | TEXT | 처방 이름 (예: 소청룡탕) |
| formula_type | TEXT | 처방 타입 (STANDARD/CUSTOM) |
| base_cheop | INTEGER | 기본 첩수 |
| base_pouches | INTEGER | 기본 포수 |
| description | TEXT | 처방 설명 |
| is_active | INTEGER | 활성 상태 (1: 활성, 0: 비활성) |
### 2. formula_ingredients 테이블
처방을 구성하는 약재 정보를 저장하는 테이블입니다.
| 컬럼명 | 타입 | 설명 |
|--------|------|------|
| ingredient_id | INTEGER | 구성 약재 ID (자동생성) |
| formula_id | INTEGER | 처방 ID (formulas 테이블 참조) |
| ingredient_code | TEXT | 약재 성분 코드 (herb_masters 테이블 참조) |
| grams_per_cheop | REAL | 1첩당 용량(g) |
| notes | TEXT | 약재 역할/효능 설명 |
| sort_order | INTEGER | 정렬 순서 |
### 3. herb_masters 테이블
약재 마스터 정보를 저장하는 테이블입니다.
| 컬럼명 | 타입 | 설명 |
|--------|------|------|
| ingredient_code | VARCHAR(10) | 약재 성분 코드 (PK) |
| herb_name | VARCHAR(100) | 약재 이름 |
| herb_name_hanja | VARCHAR(100) | 약재 한자명 |
| herb_name_latin | VARCHAR(200) | 약재 학명 |
## 처방 추가 절차
### 1단계: 약재 성분 코드 확인
처방에 사용할 약재들의 성분 코드를 먼저 확인해야 합니다.
```python
import sqlite3
conn = sqlite3.connect('database/kdrug.db')
cursor = conn.cursor()
# 약재 이름으로 성분 코드 검색
herb_name = "마황"
cursor.execute("""
SELECT ingredient_code, herb_name
FROM herb_masters
WHERE herb_name LIKE ?
""", (f'%{herb_name}%',))
results = cursor.fetchall()
for code, name in results:
print(f"{name}: {code}")
conn.close()
```
### 2단계: 처방 데이터 준비
처방 정보와 구성 약재 정보를 준비합니다.
```python
prescription_data = {
'formula_code': 'SCR001', # 고유한 처방 코드
'formula_name': '소청룡탕',
'formula_type': 'STANDARD', # STANDARD 또는 CUSTOM
'base_cheop': 1, # 기본 첩수
'base_pouches': 1, # 기본 포수
'description': '처방 설명',
'ingredients': [
{
'code': '3147H1AHM', # 약재 성분 코드
'amount': 6.0, # 1첩당 용량(g)
'notes': '발한해표' # 약재 역할
},
# ... 추가 약재들
]
}
```
### 3단계: 데이터베이스에 추가
준비한 데이터를 데이터베이스에 저장합니다.
```python
import sqlite3
def add_prescription(prescription_data):
conn = sqlite3.connect('database/kdrug.db')
cursor = conn.cursor()
try:
# 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
# 2. formula_ingredients 테이블에 약재 추가
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 (?, ?, ?, ?, 0, CURRENT_TIMESTAMP)
""", (
formula_id,
ingredient['code'],
ingredient['amount'],
ingredient['notes']
))
conn.commit()
print(f"처방 '{prescription_data['formula_name']}' 추가 완료!")
except Exception as e:
conn.rollback()
print(f"오류 발생: {e}")
finally:
conn.close()
```
## 자동화 스크립트 사용법
### add_prescription_data.py 스크립트
프로젝트에 포함된 `add_prescription_data.py` 스크립트를 사용하여 처방을 쉽게 추가할 수 있습니다.
1. 스크립트 실행:
```bash
python3 add_prescription_data.py
```
2. 스크립트 수정하여 새 처방 추가:
```python
prescriptions = [
{
'formula_code': '새처방코드',
'formula_name': '새처방이름',
'formula_type': 'STANDARD',
'base_cheop': 1,
'base_pouches': 1,
'description': '처방 설명',
'ingredients': [
# 구성 약재 목록
]
}
]
```
## 주의사항
### 1. 성분 코드 확인
- 반드시 herb_masters 테이블에 존재하는 ingredient_code를 사용해야 합니다
- 보험 코드(insurance_code)가 아닌 성분 코드(ingredient_code)를 사용합니다
### 2. 중복 확인
- formula_code는 고유해야 합니다
- 동일한 처방 코드로 중복 추가하지 않도록 주의합니다
### 3. 약재 용량
- grams_per_cheop은 1첩 기준 용량입니다
- 소수점 사용 가능 (예: 1.5, 0.5)
### 4. 처방 타입
- STANDARD: 표준 처방
- CUSTOM: 사용자 정의 처방
## 데이터 검증
### 추가된 처방 확인
```python
import sqlite3
conn = sqlite3.connect('database/kdrug.db')
cursor = conn.cursor()
# 처방 목록 조회
cursor.execute("""
SELECT formula_code, formula_name, formula_type
FROM formulas
WHERE is_active = 1
""")
for row in cursor.fetchall():
print(f"{row[0]}: {row[1]} ({row[2]})")
conn.close()
```
### 처방 상세 정보 조회
```python
# 특정 처방의 구성 약재 확인
formula_code = 'SCR001'
cursor.execute("""
SELECT hm.herb_name, fi.grams_per_cheop, fi.notes
FROM formulas f
JOIN formula_ingredients fi ON f.formula_id = fi.formula_id
JOIN herb_masters hm ON fi.ingredient_code = hm.ingredient_code
WHERE f.formula_code = ?
ORDER BY fi.grams_per_cheop DESC
""", (formula_code,))
for herb_name, amount, notes in cursor.fetchall():
print(f"- {herb_name}: {amount}g ({notes})")
```
## 문제 해결
### 1. 약재를 찾을 수 없는 경우
- herb_masters 테이블에서 정확한 약재명 확인
- 대체 이름 검색 (예: 대조 → 대추, 백작약 → 작약)
### 2. 외래 키 제약 오류
- ingredient_code가 herb_masters 테이블에 존재하는지 확인
- formula_id가 올바른지 확인
### 3. 중복 키 오류
- formula_code가 이미 존재하는지 확인
- 필요시 기존 처방 삭제 또는 코드 변경
## 예제: 실제 처방 추가
### 소청룡탕 추가 예제
```python
{
'formula_code': 'SCR001',
'formula_name': '소청룡탕',
'formula_type': 'STANDARD',
'base_cheop': 1,
'base_pouches': 1,
'description': '외감풍한, 내정수음으로 인한 기침, 천식을 치료하는 처방',
'ingredients': [
{'code': '3147H1AHM', 'amount': 6.0, 'notes': '발한해표'}, # 마황
{'code': '3419H1AHM', 'amount': 6.0, 'notes': '화영지통'}, # 백작약
{'code': '3342H1AHM', 'amount': 6.0, 'notes': '렴폐지해'}, # 오미자
{'code': '3182H1AHM', 'amount': 6.0, 'notes': '화담지구'}, # 반하
{'code': '3285H1AHM', 'amount': 4.0, 'notes': '온폐산한'}, # 세신
{'code': '3017H1AHM', 'amount': 4.0, 'notes': '온중산한'}, # 건강
{'code': '3033H1AHM', 'amount': 4.0, 'notes': '해표발한'}, # 계지
{'code': '3007H1AHM', 'amount': 4.0, 'notes': '조화제약'}, # 감초
]
}
```
### 갈근탕 추가 예제
```python
{
'formula_code': 'GGT001',
'formula_name': '갈근탕',
'formula_type': 'STANDARD',
'base_cheop': 1,
'base_pouches': 1,
'description': '외감풍한으로 인한 두통, 발열, 오한, 항강을 치료하는 처방',
'ingredients': [
{'code': '3002H1AHM', 'amount': 8.0, 'notes': '승진해기'}, # 갈근
{'code': '3147H1AHM', 'amount': 6.0, 'notes': '발한해표'}, # 마황
{'code': '3115H1AHM', 'amount': 6.0, 'notes': '보중익기'}, # 대조
{'code': '3033H1AHM', 'amount': 4.0, 'notes': '해표발한'}, # 계지
{'code': '3419H1AHM', 'amount': 4.0, 'notes': '화영지통'}, # 작약
{'code': '3007H1AHM', 'amount': 4.0, 'notes': '조화제약'}, # 감초
{'code': '3017H1AHM', 'amount': 2.0, 'notes': '온중산한'}, # 건강
]
}
```
## 참고 자료
- 데이터베이스 스키마: `database/kdrug.db`
- 자동화 스크립트: `add_prescription_data.py`
- 약재 마스터 데이터: `herb_masters` 테이블

29
find_jihwang.py Normal file
View File

@ -0,0 +1,29 @@
#!/usr/bin/env python3
"""
지황 관련 약재 찾기
"""
import sqlite3
conn = sqlite3.connect('database/kdrug.db')
cursor = conn.cursor()
# 지황 관련 약재 검색
cursor.execute("""
SELECT ingredient_code, herb_name, herb_name_hanja
FROM herb_masters
WHERE herb_name LIKE '%지황%'
OR herb_name LIKE '%생지%'
OR herb_name LIKE '%건지%'
OR herb_name LIKE '%숙지%'
ORDER BY herb_name
""")
results = cursor.fetchall()
print("🌿 지황 관련 약재 검색 결과:")
print("="*60)
for code, name, hanja in results:
print(f"{code}: {name} ({hanja})")
conn.close()

42
find_jinpi.py Normal file
View File

@ -0,0 +1,42 @@
#!/usr/bin/env python3
"""
진피 관련 약재 찾기
"""
import sqlite3
conn = sqlite3.connect('database/kdrug.db')
cursor = conn.cursor()
# 진피 관련 약재 검색
cursor.execute("""
SELECT ingredient_code, herb_name, herb_name_hanja
FROM herb_masters
WHERE herb_name LIKE '%진피%'
OR herb_name = '진피'
OR herb_name = '陳皮'
ORDER BY herb_name
""")
results = cursor.fetchall()
print("🌿 진피 관련 약재 검색 결과:")
print("="*60)
for code, name, hanja in results:
print(f"{code}: {name} ({hanja})")
# 정확히 '진피'만 찾기
print("\n정확히 '진피' 검색:")
cursor.execute("""
SELECT ingredient_code, herb_name, herb_name_hanja
FROM herb_masters
WHERE herb_name = '진피'
""")
result = cursor.fetchone()
if result:
print(f"✅ 찾음: {result[0]}: {result[1]} ({result[2]})")
else:
print("❌ 정확한 '진피'를 찾을 수 없음")
conn.close()

124
verify_samsoeun.py Normal file
View File

@ -0,0 +1,124 @@
#!/usr/bin/env python3
"""
삼소음 처방 데이터 검증 스크립트
"""
import sqlite3
def verify_samsoeun():
"""추가된 삼소음 처방 검증"""
conn = sqlite3.connect('database/kdrug.db')
cursor = conn.cursor()
print("🔍 삼소음 처방 상세 검증")
print("="*70)
# 삼소음 처방 정보 조회
cursor.execute("""
SELECT f.formula_id, f.formula_code, f.formula_name, f.description,
f.base_cheop, f.base_pouches
FROM formulas f
WHERE f.formula_code = 'SSE001'
""")
formula = cursor.fetchone()
if formula:
formula_id, code, name, description, base_cheop, base_pouches = formula
print(f"\n📝 {name} ({code})")
print(f" ID: {formula_id}")
print(f" 설명: {description}")
print(f" 기본 첩수: {base_cheop}")
print(f" 기본 포수: {base_pouches}")
# 약재 구성 상세 조회
print(f"\n 약재 구성 (1첩 기준):")
print(" " + "-"*60)
cursor.execute("""
SELECT hm.herb_name, fi.grams_per_cheop, fi.notes, hm.ingredient_code
FROM formula_ingredients fi
JOIN herb_masters hm ON fi.ingredient_code = hm.ingredient_code
WHERE fi.formula_id = ?
ORDER BY fi.sort_order
""", (formula_id,))
ingredients = cursor.fetchall()
total_1cheop = 0
total_20cheop = 0 # 20첩(1제) 기준
print(f" {'약재명':15s} | {'1첩(g)':>8s} | {'20첩(g)':>8s} | {'효능'}")
print(" " + "-"*60)
for herb_name, grams, notes, code in ingredients:
total_1cheop += grams
grams_20 = grams * 20
total_20cheop += grams_20
print(f" {herb_name:15s} | {grams:8.1f} | {grams_20:8.1f} | {notes}")
print(" " + "-"*60)
print(f" {'총 용량':15s} | {total_1cheop:8.1f} | {total_20cheop:8.1f} |")
# 원본 데이터와 비교
print(f"\n📊 원본 데이터와 비교:")
print(" " + "-"*60)
original_data = {
"인삼": (4, 80),
"소엽": (4, 80),
"전호": (4, 80),
"반하": (4, 80),
"갈근": (4, 80),
"적복령": (4, 80),
"대조": (4, 80),
"진피": (3, 60),
"길경": (3, 60),
"지각": (3, 60),
"감초": (3, 60),
"건강": (1, 20)
}
print(f" {'약재':10s} | {'원본 1첩':>10s} | {'DB 1첩':>10s} | {'일치여부'}")
print(" " + "-"*60)
# DB 데이터를 딕셔너리로 변환
db_data = {}
for herb_name, grams, notes, code in ingredients:
# 약재명 정규화
if "자소엽" in herb_name:
key = "소엽"
elif "복령" in herb_name:
key = "적복령"
elif "대추" in herb_name:
key = "대조"
elif "진피" in herb_name:
key = "진피"
else:
key = herb_name
db_data[key] = grams
# 비교
all_match = True
for herb, (orig_1, orig_20) in original_data.items():
db_amount = db_data.get(herb, 0)
match = "" if abs(orig_1 - db_amount) < 0.01 else ""
if match == "":
all_match = False
print(f" {herb:10s} | {orig_1:10.1f}g | {db_amount:10.1f}g | {match}")
print("\n" + "="*70)
if all_match:
print("✅ 모든 약재가 원본 데이터와 일치합니다!")
else:
print("⚠️ 일부 약재가 원본 데이터와 일치하지 않습니다.")
else:
print("❌ 삼소음 처방을 찾을 수 없습니다.")
conn.close()
if __name__ == "__main__":
verify_samsoeun()

89
verify_wolbitang.py Normal file
View File

@ -0,0 +1,89 @@
#!/usr/bin/env python3
"""
월비탕 처방 데이터 검증 스크립트
"""
import sqlite3
def verify_wolbitang():
"""추가된 월비탕 처방 검증"""
conn = sqlite3.connect('database/kdrug.db')
cursor = conn.cursor()
print("🔍 월비탕 처방 상세 검증")
print("="*70)
# 각 처방별 상세 정보 조회
cursor.execute("""
SELECT f.formula_id, f.formula_code, f.formula_name, f.description
FROM formulas f
WHERE f.formula_code LIKE 'WBT%'
ORDER BY f.formula_code
""")
formulas = cursor.fetchall()
for formula_id, formula_code, formula_name, description in formulas:
print(f"\n📝 {formula_name} ({formula_code})")
print(f" 설명: {description}")
print(f" 약재 구성:")
# 각 처방의 약재 상세 조회
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
""", (formula_id,))
ingredients = cursor.fetchall()
total_grams = 0
for herb_name, grams, notes in ingredients:
print(f" - {herb_name:8s}: {grams:6.3f}g ({notes})")
total_grams += grams
print(f" 총 용량: {total_grams:.3f}g")
# 단계별 용량 변화 비교
print(f"\n{'='*70}")
print("📊 단계별 약재 용량 변화:")
print("-"*70)
# 약재별 단계별 용량 조회
cursor.execute("""
SELECT DISTINCT hm.herb_name
FROM formula_ingredients fi
JOIN herb_masters hm ON fi.ingredient_code = hm.ingredient_code
JOIN formulas f ON fi.formula_id = f.formula_id
WHERE f.formula_code LIKE 'WBT%'
ORDER BY hm.herb_name
""")
herbs = [row[0] for row in cursor.fetchall()]
print(f"{'약재명':10s} | {'1차':>8s} | {'2차':>8s} | {'3차':>8s} | {'4차':>8s}")
print("-"*50)
for herb in herbs:
amounts = []
for stage in range(1, 5):
cursor.execute("""
SELECT fi.grams_per_cheop
FROM formula_ingredients fi
JOIN herb_masters hm ON fi.ingredient_code = hm.ingredient_code
JOIN formulas f ON fi.formula_id = f.formula_id
WHERE f.formula_code = ? AND hm.herb_name = ?
""", (f'WBT001-{stage}', herb))
result = cursor.fetchone()
amounts.append(f"{result[0]:.3f}g" if result else "-")
print(f"{herb:10s} | {amounts[0]:>8s} | {amounts[1]:>8s} | {amounts[2]:>8s} | {amounts[3]:>8s}")
conn.close()
if __name__ == "__main__":
verify_wolbitang()