kdrug-inventory-system/docs/처방_추가_가이드.md
시골약사 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

9.0 KiB

처방 데이터 추가 가이드

개요

이 문서는 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단계: 약재 성분 코드 확인

처방에 사용할 약재들의 성분 코드를 먼저 확인해야 합니다.

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단계: 처방 데이터 준비

처방 정보와 구성 약재 정보를 준비합니다.

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단계: 데이터베이스에 추가

준비한 데이터를 데이터베이스에 저장합니다.

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. 스크립트 실행:
python3 add_prescription_data.py
  1. 스크립트 수정하여 새 처방 추가:
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: 사용자 정의 처방

데이터 검증

추가된 처방 확인

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()

처방 상세 정보 조회

# 특정 처방의 구성 약재 확인
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가 이미 존재하는지 확인
  • 필요시 기존 처방 삭제 또는 코드 변경

예제: 실제 처방 추가

소청룡탕 추가 예제

{
    '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': '조화제약'},  # 감초
    ]
}

갈근탕 추가 예제

{
    '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 테이블