# 건조시럽 환산계수 시스템

> 작성일: 2026-03-19  
> 작성자: 용림 🐉

---

## 1. 개요

건조시럽(dry syrup)은 물로 희석하여 복용하는 시럽 형태의 의약품입니다.  
**환산계수(conversion_factor)**를 사용하여 복용량(mL)을 실제 분말량(g)으로 변환합니다.

### 계산 예시
```
오구멘틴듀오시럽 228mg/5ml
├─ 환산계수: 0.11
├─ 총량: 120mL
└─ 필요 분말량: 120 × 0.11 = 13.2g
```

---

## 2. 데이터베이스 정보

### PostgreSQL 연결

| 항목 | 값 |
|------|-----|
| **Host** | 192.168.0.39 |
| **Port** | 5432 |
| **Database** | label10 |
| **User** | admin |
| **Password** | trajet6640 |

### Connection String
```
postgresql://admin:trajet6640@192.168.0.39:5432/label10
```

### Python 연결 코드
```python
import psycopg2

conn = psycopg2.connect(
    host='192.168.0.39',
    port=5432,
    database='label10',
    user='admin',
    password='trajet6640'
)
```

---

## 3. 테이블 스키마

### drysyrup 테이블

| 컬럼명 | 타입 | 설명 |
|--------|------|------|
| `idx` | INTEGER | PK, 자동증가 |
| `ingredient_code` | VARCHAR | 성분코드 (MSSQL SUNG_CODE와 매칭) |
| `ingredient_name` | VARCHAR | 성분명 |
| `product_name` | VARCHAR | 대표 제품명 |
| `post_prep_amount` | VARCHAR | 조제 후 농도 (예: 25mg/ml) |
| `main_ingredient_amt` | VARCHAR | 주성분량 (예: 0.75g/16.7g) |
| `conversion_factor` | DOUBLE PRECISION | **환산계수** (mL → g) |
| `storage_conditions` | VARCHAR | 보관조건 (냉장, 상온 등) |
| `expiration_date` | VARCHAR | 조제 후 유효기간 |

### 매핑 관계
```
MSSQL (PIT3000)              PostgreSQL (label10)
─────────────────            ────────────────────
PM_DRUG.CD_GOODS             drysyrup
  └─ SUNG_CODE      ──────▶    └─ ingredient_code
```

---

## 4. 데이터 샘플 (23건)

| idx | ingredient_code | 성분명 | 제품명 | 환산계수 | 보관 | 유효기간 |
|-----|-----------------|--------|--------|----------|------|----------|
| 18 | 125333ASY | 세파드록실수화물 | 보령듀리세프 125mg/5ml | 0.557 | 냉장 | 14일 |
| 19 | 125332ASY | 세파드록실수화물 | 보령듀리세프 250mg/5ml | 0.557 | 냉장 | 14일 |
| 20 | 125237ASY | 세파클러수화물 | 크로세프 | 0.667 | 냉장 | 14일 |
| 21 | 128931ASY | 세푸록심악세틸 | 올세프 | 1.0 | 25℃이하 | 10일 |
| 22 | 127931ASY | 세프포독심프록세틸 | 포독스 | 0.2 | 냉장 | 14일 |
| 23 | 128030ASY | 세프프로질수화물 | 세프질시럽 | 0.5 | 냉장 | 14일 |
| 24 | 108130ASY | 아목시실린수화물 | 파목신시럽 | 0.775 | 냉장 | 14일 |
| 25 | 535000ASY | 아목시실린+클라불란산 | 오구멘틴듀오 228mg/5ml | **0.11** | 냉장 | 7일 |
| 26 | 536300ASY | 아목시실린+클라불란산 | 아목클란네오시럽 | 0.22 | 냉장 | 7일 |
| 27 | 112732ASY | 아지트로마이신수화물 | 지스로맥스 | 0.867 | 상온 | 5일 |

---

## 5. API 엔드포인트

### 환산계수 조회

```
GET /api/drug-info/conversion-factor/<sung_code>
```

#### 요청 예시
```bash
curl https://mile.0bin.in/api/drug-info/conversion-factor/535000ASY
```

#### 응답 (성공)
```json
{
  "success": true,
  "sung_code": "535000ASY",
  "conversion_factor": 0.11,
  "ingredient_name": "아목시실린수화물·클라불란산칼륨",
  "product_name": "일성오구멘틴듀오시럽 228mg/5ml"
}
```

#### 응답 (데이터 없음)
```json
{
  "success": true,
  "sung_code": "NOTEXIST",
  "conversion_factor": null,
  "ingredient_name": null,
  "product_name": null
}
```

---

## 6. 쿼리 예시

### 환산계수 조회
```sql
SELECT conversion_factor, ingredient_name, product_name,
       storage_conditions, expiration_date
FROM drysyrup 
WHERE ingredient_code = '535000ASY';
```

### 전체 목록 조회
```sql
SELECT * FROM drysyrup ORDER BY idx;
```

### 특정 성분 검색
```sql
SELECT * FROM drysyrup 
WHERE ingredient_name LIKE '%아목시실린%';
```

---

## 7. Python 사용 예시

### 환산계수 조회 함수
```python
import psycopg2

def get_conversion_factor(sung_code):
    """성분코드로 환산계수 조회"""
    conn = psycopg2.connect(
        host='192.168.0.39',
        port=5432,
        database='label10',
        user='admin',
        password='trajet6640'
    )
    cursor = conn.cursor()
    
    cursor.execute("""
        SELECT conversion_factor, ingredient_name, product_name,
               storage_conditions, expiration_date
        FROM drysyrup 
        WHERE ingredient_code = %s
    """, (sung_code,))
    
    row = cursor.fetchone()
    conn.close()
    
    if row:
        return {
            'conversion_factor': row[0],
            'ingredient_name': row[1],
            'product_name': row[2],
            'storage_conditions': row[3],
            'expiration_date': row[4]
        }
    return None

# 사용 예시
result = get_conversion_factor('535000ASY')
print(result)
# {'conversion_factor': 0.11, 'ingredient_name': '아목시실린...', ...}
```

### 분말량 계산 함수
```python
def calculate_powder_amount(sung_code, total_ml):
    """총 mL로 필요한 분말량(g) 계산"""
    data = get_conversion_factor(sung_code)
    if data and data['conversion_factor']:
        return round(total_ml * data['conversion_factor'], 2)
    return None

# 사용 예시
powder = calculate_powder_amount('535000ASY', 120)
print(f"필요 분말량: {powder}g")  # 필요 분말량: 13.2g
```

---

## 8. 관련 파일

| 파일 | 위치 | 설명 |
|------|------|------|
| app.py | `backend/app.py` | Flask API 라우트 |
| DRYSYRUP_CONVERSION.md | `docs/` | 기존 문서 |

### Flask 라우트 위치
```python
# backend/app.py
@app.route('/api/drug-info/conversion-factor/<sung_code>')
def get_drug_conversion_factor(sung_code):
    ...
```

---

## 9. 아키텍처

```
┌─────────────────────────────────────────────────────────┐
│                    클라이언트                            │
│         (POS, 라벨 프린터, 웹 UI)                        │
└─────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────┐
│              Flask Backend (7001)                       │
│  GET /api/drug-info/conversion-factor/<sung_code>       │
└─────────────────────────────────────────────────────────┘
                          │
          ┌───────────────┴───────────────┐
          ▼                               ▼
┌─────────────────────┐       ┌─────────────────────┐
│   MSSQL (PIT3000)   │       │  PostgreSQL         │
│   192.168.0.4       │       │  192.168.0.39:5432  │
├─────────────────────┤       ├─────────────────────┤
│ PM_DRUG.CD_GOODS    │       │ label10.drysyrup    │
│   └─ SUNG_CODE ─────┼──────▶│   └─ ingredient_code│
│   └─ GoodsName      │       │   └─ conversion_factor
│   └─ DrugCode       │       │   └─ storage_conditions
└─────────────────────┘       └─────────────────────┘
```

---

*총 23개 건조시럽 환산계수 등록됨*
