- 월비탕 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>
293 lines
9.0 KiB
Markdown
293 lines
9.0 KiB
Markdown
# 처방 데이터 추가 가이드
|
|
|
|
## 개요
|
|
이 문서는 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` 테이블 |