# πŸ₯ μžλ™λ°œμ£Όμ‹œμŠ€ν…œ 고도화 κΈ°νšμ„œ v2 > **μž‘μ„±μΌ**: 2026-03-06 > **μž‘μ„±μž**: 용림 (with μ•½μ‚¬λ‹˜) > **μƒνƒœ**: 기획 κ²€ν†  쀑 --- ## πŸ“‹ λͺ©μ°¨ 1. [ν˜„μž¬ κ΅¬ν˜„ ν˜„ν™©](#1-ν˜„μž¬-κ΅¬ν˜„-ν˜„ν™©) 2. [핡심 λͺ©ν‘œ](#2-핡심-λͺ©ν‘œ) 3. [μ‹ κ·œ κΈ°λŠ₯ 기획](#3-μ‹ κ·œ-κΈ°λŠ₯-기획) 4. [API 개발 κ³„νš](#4-api-개발-κ³„νš) 5. [DB μŠ€ν‚€λ§ˆ ν™•μž₯](#5-db-μŠ€ν‚€λ§ˆ-ν™•μž₯) 6. [UI κ°œμ„  κ³„νš](#6-ui-κ°œμ„ -κ³„νš) 7. [개발 μš°μ„ μˆœμœ„](#7-개발-μš°μ„ μˆœμœ„) --- ## 1. ν˜„μž¬ κ΅¬ν˜„ ν˜„ν™© ### 1.1 도맀상 API (βœ… μ™„λ£Œ) | 도맀상 | 재고쑰회 | μž₯λ°”κ΅¬λ‹ˆ | μ£Όλ¬Έ | μ·¨μ†Œ/볡원 | μž”κ³  | μ›”λ§€μΆœ | |--------|:--------:|:--------:|:----:|:---------:|:----:|:------:| | **μ§€μ˜€μ˜** | βœ… | βœ… | βœ… 확정포함 | βœ… (μ‚­μ œλ§Œ) | βœ… | βœ… | | **μˆ˜μΈμ•½ν’ˆ** | βœ… | βœ… | βœ… | βœ… | βœ… | βœ… | | **λ°±μ œμ•½ν’ˆ** | βœ… | βœ… | βœ… | ⏳ | βœ… | βœ… | ### 1.2 μ£Όλ¬Έ DB μŠ€ν‚€λ§ˆ (βœ… μ™„λ£Œ) ``` orders.db β”œβ”€β”€ wholesalers # 도맀상 정보 β”œβ”€β”€ orders # μ£Όλ¬Έ 헀더 β”œβ”€β”€ order_items # μ£Όλ¬Έ ν’ˆλͺ© β”œβ”€β”€ order_logs # μ£Όλ¬Έ 둜그 β”œβ”€β”€ order_context # AI ν•™μŠ΅μš© μ»¨ν…μŠ€νŠΈ β”œβ”€β”€ daily_usage # 일별 μ‚¬μš©λŸ‰ └── order_patterns # μ£Όλ¬Έ νŒ¨ν„΄ (AI용) ``` ### 1.3 톡합 μ£Όλ¬Έ API (βœ… μ™„λ£Œ) | μ—”λ“œν¬μΈνŠΈ | κΈ°λŠ₯ | dry_run | |------------|------|:-------:| | `POST /api/order/create` | μ£Όλ¬Έ 생성 (draft) | - | | `POST /api/order/submit` | μ£Όλ¬Έ 제좜 | βœ… | | `POST /api/order/quick-submit` | λΉ λ₯Έ μ£Όλ¬Έ | βœ… | | `GET /api/order/history` | μ£Όλ¬Έ 이λ ₯ | - | | `GET /api/order/ai/training-data` | AI ν•™μŠ΅ 데이터 | - | ### 1.4 UI ν˜„ν™© (βœ… μ™„λ£Œ) - **Rx μ‚¬μš©λŸ‰ νŽ˜μ΄μ§€**: 처방 기반 μ‚¬μš©λŸ‰ 쑰회 + μ£Όλ¬Έμˆ˜λŸ‰ 계산 - **μž₯λ°”κ΅¬λ‹ˆ λͺ¨λ‹¬**: 선택 ν’ˆλͺ© λ‹΄κΈ° + 도맀상 선택 - **도맀상 μž”κ³  λͺ¨λ‹¬**: μž”κ³  + μ›”λ§€μΆœ λ™μ‹œ ν‘œμ‹œ --- ## 2. 핡심 λͺ©ν‘œ ### 🎯 μ΅œμ’… λͺ©ν‘œ > **μ‚¬μš©λŸ‰ 기반 AI 뢄석 톡합주문 및 μžλ™ν™”μ£Όλ¬Έ μ‹œμŠ€ν…œ** ### 2.1 핡심 μ‹œλ‚˜λ¦¬μ˜€ ``` πŸ“… ν•˜λ£¨ μ£Όλ¬Έ 흐름 [μ˜€μ „ 10μ‹œ] ───────────────────────────────────────────── β”‚ β”œβ”€ μ‚¬μš©λŸ‰ 집계: 아세탑 500T μ‚¬μš© β”œβ”€ 규격 νŒλ‹¨: 30T x 10개? 300T x 2개? β”‚ └─ 도맀상 재고 확인 β†’ 재고 μžˆλŠ” 것 μš°μ„  β”œβ”€ 도맀상 선택: A도맀상 (배솑 3회/일) β”‚ └─ μ›” ν•œλ„ 확인 (5000λ§Œμ› 쀑 3000λ§Œμ› μ‚¬μš©) β”œβ”€ μ£Όλ¬Έ μ‹€ν–‰: 300T x 2개 = 600T └─ λ‘œκΉ…: orders.db에 기둝 [μ˜€ν›„ 4μ‹œ] ────────────────────────────────────────────── β”‚ β”œβ”€ μ‚¬μš©λŸ‰ μž¬μ§‘κ³„: 아세탑 910T μ‚¬μš© β”œβ”€ μ„ μ£Όλ¬Έ 반영: μ˜€μ „ 300T μ£Όλ¬Έ 확인 β”‚ └─ 남은 ν•„μš”λŸ‰: 910 - 300 = 610T β”œβ”€ μΆ”κ°€ μ£Όλ¬Έ: 300T x 2개 + 30T x 1개 = 630T └─ 도맀상 μž¬μ„ νƒ (ν•œλ„/재고 기반) ``` ### 2.2 핡심 ν•΄κ²° 과제 | # | 과제 | ν˜„μž¬ μƒνƒœ | λͺ©ν‘œ | |---|------|----------|------| | 1 | μ„ μ£Όλ¬Έ 반영 | ❌ λ―Έκ΅¬ν˜„ | 같은 λ‚  μ„ μ£Όλ¬ΈλŸ‰ μžλ™ 차감 | | 2 | 규격 μžλ™ 선택 | ⏳ λΆ€λΆ„ | 재고+κ²½μ œμ„± 기반 μžλ™ νŒλ‹¨ | | 3 | 도맀상 ν•œλ„ 관리 | ❌ λ―Έκ΅¬ν˜„ | 월별 ν•œλ„ μ„€μ •/μ•Œλ¦Ό | | 4 | μž₯λ°”κ΅¬λ‹ˆ 동기화 | ⏳ 쑰회만 | μ–‘λ°©ν–₯ 동기화 | | 5 | μ‹€νŒ¨ μ‹œ μž¬μ‹œλ„ | ❌ λ―Έκ΅¬ν˜„ | Aμ‹€νŒ¨β†’B μžλ™ μž¬μ‹œλ„ | | 6 | 배솑 μŠ€μΌ€μ€„ | ❌ λ―Έκ΅¬ν˜„ | 배솑 횟수 κ³ λ € μ£Όλ¬Έ | --- ## 3. μ‹ κ·œ κΈ°λŠ₯ 기획 ### 3.1 도맀상 월별 ν•œλ„ 관리 πŸ†• **λͺ©μ **: 도맀상별 μ›” 거래 ν•œλ„ μ„€μ • 및 μžλ™ λΆ„λ°° ``` μ˜ˆμ‹œ: - A도맀상 (μ§€μ˜€μ˜): μ›” 5000λ§Œμ› ν•œλ„ - B도맀상 (수인): μ›” 3000λ§Œμ› ν•œλ„ - C도맀상 (백제): μ›” 2000λ§Œμ› ν•œλ„ [ν•œλ„ 도달 μ‹œ λ™μž‘] 1. A도맀상 ν•œλ„ 90% β†’ κ²½κ³  μ•Œλ¦Ό 2. A도맀상 ν•œλ„ 100% β†’ Bλ„λ§€μƒμœΌλ‘œ μžλ™ μ „ν™˜ 3. μž₯λ°”κ΅¬λ‹ˆ λ‹¨κ³„μ—μ„œ 미리 λΆ„λ₯˜ (μ£Όλ¬Έ ν™•μ • μ „ μ‘°μ • κ°€λŠ₯) ``` **UI μš”κ΅¬μ‚¬ν•­**: - 도맀상별 ν•œλ„ μ„€μ • ν™”λ©΄ - ν˜„μž¬ μ‚¬μš©λŸ‰/μž”μ—¬ ν•œλ„ ν‘œμ‹œ - ν•œλ„ 초과 μ‹œ κ²½κ³  + λŒ€μ•ˆ 도맀상 μ œμ•ˆ ### 3.2 μ„ μ£Όλ¬Έ 반영 μ‹œμŠ€ν…œ πŸ†• **λͺ©μ **: 같은 λ‚  이미 μ£Όλ¬Έν•œ ν’ˆλͺ© μžλ™ 차감 ```python # 둜직 μ˜ˆμ‹œ def calculate_order_qty(drug_code, usage_qty, current_stock): # 였늘 "μ‹€μ œλ‘œ" μ£Όλ¬Έ μ™„λ£Œλœ μˆ˜λŸ‰ 쑰회 today_ordered = get_today_orders(drug_code) # 300T # ν•„μš”λŸ‰ = μ‚¬μš©λŸ‰ - ν˜„μž¬κ³  - μ„ μ£Όλ¬ΈλŸ‰ needed = usage_qty - current_stock - today_ordered # ν•„μš”λŸ‰μ΄ μ–‘μˆ˜μΌ λ•Œλ§Œ μ£Όλ¬Έ if needed > 0: return calculate_spec_qty(needed) # κ·œκ²©λ³„ μˆ˜λŸ‰ 계산 return 0 ``` **⚠️ 핡심: μ‹€μ œ 주문만 카운트** ```sql -- μ„ μ£Όλ¬Έ 쑰회 쿼리 SELECT SUM(oi.total_dose) as today_ordered FROM order_items oi JOIN orders o ON oi.order_id = o.id WHERE oi.drug_code = ? AND o.order_date = DATE('now') AND o.is_dry_run = 0 -- ⭐ dry_run μ œμ™Έ! AND oi.status IN ('success', 'submitted') -- μ‹€μ œ μ™„λ£Œλœ κ²ƒλ§Œ ``` **DB μŠ€ν‚€λ§ˆ μˆ˜μ • ν•„μš”**: - `orders` ν…Œμ΄λΈ”μ— `is_dry_run INTEGER DEFAULT 0` 컬럼 μΆ”κ°€ - μ„ μ£Όλ¬Έ 쑰회 μ‹œ `is_dry_run=0`인 κ²ƒλ§Œ 카운트 - `status`κ°€ `success` λ˜λŠ” `submitted`인 κ²ƒλ§Œ (pending/failed μ œμ™Έ) ### 3.3 규격 μžλ™ 선택 둜직 πŸ†• **λͺ©μ **: 재고 기반 졜적 규격 선택 ``` ⚠️ 단가 참고사항: - μ „λ¬Έμ˜μ•½ν’ˆ(ETC): λ³΄ν—˜μ•½κ°€ κ³ μ • β†’ 30Tλ“  300Tλ“  1Tλ‹Ή 가격 동일 - μΌλ°˜μ˜μ•½ν’ˆ(OTC): 도맀상/κ·œκ²©λ³„ 단가 차이 κ°€λŠ₯ - λΉ„κΈ‰μ—¬ μ•½ν’ˆ: 도맀상간 가격 비ꡐ 의미 있음 μš°μ„ μˆœμœ„: 1. 재고 μžˆλŠ” 규격 (ν’ˆμ ˆ 규격 μ œμ™Έ) 2. ν•„μš”λŸ‰κ³Ό κ°€μž₯ κ·Όμ ‘ν•œ 규격 (κ³Όμ£Όλ¬Έ μ΅œμ†Œν™”) 3. μ†ŒλΆ„ μ„ ν˜Έ (30T x 10 > 300T x 1) - μœ ν†΅κΈ°ν•œ/μž¬κ³ κ΄€λ¦¬ 유리 4. μ‚¬μš©μž μ„ ν˜Έ νŒ¨ν„΄ (AI ν•™μŠ΅ 데이터 기반) μ˜ˆμ‹œ: - ν•„μš”λŸ‰: 280T - κ°€λŠ₯ 규격: 30T(재고50), 100T(ν’ˆμ ˆ), 300T(재고10) - 선택: 30T x 10개 = 300T (100T ν’ˆμ ˆ, μ†ŒλΆ„ μ„ ν˜Έ) ``` ### 3.4 μ£Όλ¬Έ μ‹€νŒ¨ μ‹œ μž¬μ‹œλ„ πŸ†• **λͺ©μ **: A도맀상 μ‹€νŒ¨ β†’ B도맀상 μžλ™ μž¬μ‹œλ„ ``` [μž¬μ‹œλ„ μ‹œλ‚˜λ¦¬μ˜€] μ‹œλ‚˜λ¦¬μ˜€ 1: 재고 μ—†μŒ - A도맀상 재고 0 β†’ B도맀상 검색 β†’ 재고 있으면 B둜 μ£Όλ¬Έ μ‹œλ‚˜λ¦¬μ˜€ 2: μ£Όλ¬Έ 였λ₯˜ - A도맀상 API 였λ₯˜ β†’ 3회 μž¬μ‹œλ„ β†’ μ‹€νŒ¨ μ‹œ B도맀상 μ‹œλ‚˜λ¦¬μ˜€ 3: λΆ€λΆ„ 성곡 - 10개 ν’ˆλͺ© 쀑 7개 성곡, 3개 μ‹€νŒ¨ - μ‹€νŒ¨ν•œ 3개 β†’ Bλ„λ§€μƒμœΌλ‘œ μžλ™ μž¬μ‹œλ„ [리포트] - μ΅œμ’… μ£Όλ¬Έ κ²°κ³Ό 리포트 (μ–΄λŠ λ„λ§€μƒμ—μ„œ 성곡/μ‹€νŒ¨) - μ•Œλ¦Ό: "A도맀상 ν’ˆμ ˆλ‘œ Bλ„λ§€μƒμœΌλ‘œ μ£Όλ¬Έ 변경됨" ``` ### 3.5 μž₯λ°”κ΅¬λ‹ˆ 동기화 πŸ†• **λͺ©μ **: μ•½κ΅­ μ‹œμŠ€ν…œ ↔ 도맀상 μ‚¬μ΄νŠΈ μž₯λ°”κ΅¬λ‹ˆ 일치 ``` [동기화 흐름] 1. μ•½κ΅­μ—μ„œ μž₯λ°”κ΅¬λ‹ˆ λ‹΄κΈ° └─ 도맀상 API둜 add_to_cart 호좜 └─ 성곡 μ‹œ 둜컬 DB에도 기둝 2. μ£Όλ¬Έ ν™•μ • μ „ 동기화 체크 └─ 도맀상 get_cart() 호좜 └─ 둜컬 DB와 비ꡐ └─ 뢈일치 μ‹œ μ•Œλ¦Ό (λˆ„κ΅°κ°€ 도맀상 μ‚¬μ΄νŠΈμ—μ„œ 직접 μˆ˜μ •?) 3. μ£Όλ¬Έ ν™•μ • └─ 도맀상 submit_order() 호좜 └─ κ²°κ³Ό λ‘œκΉ… ``` ### 3.6 배솑 μŠ€μΌ€μ€„ 관리 πŸ†• **λͺ©μ **: 도맀상별 **μ£Όλ¬Έ λ§ˆκ°μ‹œκ°„** + **배솑 λ„μ°©μ‹œκ°„** 뢄리 관리 ``` ⚠️ 핡심: 두 κ°€μ§€ μ‹œκ°„μ„ ꡬ뢄! 1. μ£Όλ¬Έ λ§ˆκ°μ‹œκ°„ (order_cutoff) - μ–Έμ œκΉŒμ§€ μ£Όλ¬Έν•΄μ•Ό ν•˜λ‚˜ 2. 배솑 λ„μ°©μ‹œκ°„ (delivery_arrival) - μ‹€μ œ 약ꡭ에 μ–Έμ œ λ„μ°©ν•˜λ‚˜ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ 도맀상 β”‚ 배솑 β”‚ μ£Όλ¬Έ 마감 β”‚ 도착 μ˜ˆμ • β”‚ λΉ„κ³  β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ μ§€μ˜€μ˜ β”‚ μ˜€μ „ β”‚ 10:00 β”‚ 11:30 β”‚ 당일 β”‚ β”‚ β”‚ μ˜€ν›„ β”‚ 13:00 β”‚ 15:00 β”‚ 당일 β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 수인 β”‚ μ˜€ν›„ β”‚ 13:00 β”‚ 14:30 β”‚ 당일 β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ 백제 β”‚ 읡일 β”‚ 16:00 β”‚ λ‹€μŒλ‚  15:00 β”‚ ⚠️ 읡일 β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` **AI νŒλ‹¨ μ‹œλ‚˜λ¦¬μ˜€**: ``` 상황: μ˜€μ „ 9μ‹œ, "였늘 μ˜€ν›„ 2μ‹œμ— ν•„μš”" β†’ μ§€μ˜€μ˜ μ˜€μ „: 10μ‹œ 마감 μ „ β†’ 11:30 도착 (βœ… μ—¬μœ ) β†’ μ§€μ˜€μ˜ μ˜€ν›„: 13μ‹œ 마감 μ „ β†’ 15:00 도착 (❌ 늦음) β†’ 수인: 13μ‹œ 마감 μ „ β†’ 14:30 도착 (βœ… κ°€λŠ₯) β†’ 백제: 16μ‹œ 마감 β†’ 내일 15μ‹œ (❌ 늦음) β†’ κ²°λ‘ : μ§€μ˜€μ˜ μ˜€μ „λ°°μ†‘ μΆ”μ²œ (κ°€μž₯ 빠름) 상황: μ˜€μ „ 11μ‹œ, "였늘 μ˜€ν›„ 3μ‹œμ— ν•„μš”" β†’ μ§€μ˜€μ˜ μ˜€μ „: 10μ‹œ 마감 지남 ❌ β†’ μ§€μ˜€μ˜ μ˜€ν›„: 13μ‹œ 마감 μ „ β†’ 15:00 도착 (⚠️ λ”± 맞음) β†’ 수인: 13μ‹œ 마감 μ „ β†’ 14:30 도착 (βœ… μ—¬μœ ) β†’ κ²°λ‘ : 수인 μΆ”μ²œ (14:30 도착) 상황: μ˜€ν›„ 2μ‹œ, "였늘 ν•„μš”" β†’ μ§€μ˜€μ˜: μ˜€μ „/μ˜€ν›„ 마감 λͺ¨λ‘ 지남 ❌ β†’ 수인: 13μ‹œ 마감 지남 ❌ β†’ 백제: 16μ‹œ 마감 μ „ β†’ 내일 15μ‹œ 도착 β†’ κ²°λ‘ : 였늘 배솑 λΆˆκ°€! 백제 μ΅μΌλ°°μ†‘λ§Œ κ°€λŠ₯ β†’ μ•Œλ¦Ό λ°œμ†‘ ``` --- ## 4. API 개발 κ³„νš ### 4.1 μ‹ κ·œ API λͺ©λ‘ #### πŸ”§ 도맀상 ν•œλ„ 관리 API | μ—”λ“œν¬μΈνŠΈ | λ©”μ„œλ“œ | κΈ°λŠ₯ | |------------|--------|------| | `/api/wholesaler/limits` | GET | 전체 도맀상 ν•œλ„ 쑰회 | | `/api/wholesaler/limits/{id}` | GET | νŠΉμ • 도맀상 ν•œλ„ 상세 | | `/api/wholesaler/limits/{id}` | PUT | ν•œλ„ μ„€μ •/μˆ˜μ • | | `/api/wholesaler/limits/{id}/usage` | GET | ν˜„μž¬ μ‚¬μš©λŸ‰ 쑰회 | | `/api/wholesaler/limits/check` | POST | μ£Όλ¬Έ μ „ ν•œλ„ 체크 | ```json // PUT /api/wholesaler/limits/geoyoung { "monthly_limit": 50000000, "warning_threshold": 0.9, "priority": 1, "is_active": true } ``` #### πŸ”§ 배솑 μŠ€μΌ€μ€„ API πŸ†• | μ—”λ“œν¬μΈνŠΈ | λ©”μ„œλ“œ | κΈ°λŠ₯ | |------------|--------|------| | `/api/wholesaler/schedules` | GET | 전체 배솑 μŠ€μΌ€μ€„ | | `/api/wholesaler/schedules/{id}` | GET | νŠΉμ • 도맀상 μŠ€μΌ€μ€„ | | `/api/wholesaler/schedules/{id}` | PUT | μŠ€μΌ€μ€„ μˆ˜μ • | | `/api/wholesaler/next-delivery` | GET | λ‹€μŒ κ°€λŠ₯ν•œ 배솑 쑰회 | | `/api/wholesaler/can-deliver-by` | POST | νŠΉμ • μ‹œκ°„κΉŒμ§€ 배솑 κ°€λŠ₯ μ—¬λΆ€ | ```json // GET /api/wholesaler/schedules/geoyoung { "success": true, "wholesaler": "geoyoung", "schedules": [ { "seq": 1, "name": "μ˜€μ „λ°°μ†‘", "order_cutoff": "08:30", "arrival": "10:30" }, { "seq": 2, "name": "점심배솑", "order_cutoff": "11:00", "arrival": "13:30" }, { "seq": 3, "name": "μ˜€ν›„λ°°μ†‘", "order_cutoff": "15:00", "arrival": "17:30" } ] } // POST /api/wholesaler/can-deliver-by // "μ˜€ν›„ 3μ‹œκΉŒμ§€ 받을 수 μžˆλŠ” 도맀상은?" { "need_by": "15:00", "drug_codes": ["670400830", "654301800"] } // Response { "success": true, "current_time": "10:30", "need_by": "15:00", "options": [ { "wholesaler": "geoyoung", "delivery": "점심배솑", "order_cutoff": "11:00", "arrival": "13:30", "status": "βœ… μ£Όλ¬Έ κ°€λŠ₯ (30λΆ„ λ‚¨μŒ)" }, { "wholesaler": "sooin", "delivery": "μ˜€μ „λ°°μ†‘", "order_cutoff": "09:00", "arrival": "11:00", "status": "❌ 마감됨" }, { "wholesaler": "sooin", "delivery": "μ˜€ν›„λ°°μ†‘", "order_cutoff": "14:00", "arrival": "17:00", "status": "❌ 도착 늦음 (17:00)" } ], "recommendation": "geoyoung 점심배솑 (11:00 마감, 13:30 도착)" } ``` #### πŸ”§ μ„ μ£Όλ¬Έ 쑰회 API | μ—”λ“œν¬μΈνŠΈ | λ©”μ„œλ“œ | κΈ°λŠ₯ | |------------|--------|------| | `/api/order/today` | GET | 였늘 μ£Όλ¬Έ 쑰회 | | `/api/order/today/{drug_code}` | GET | νŠΉμ • μ•½ν’ˆ 였늘 μ£Όλ¬ΈλŸ‰ | | `/api/order/pending` | GET | 아직 ν™•μ • μ•ˆλœ μ£Όλ¬Έ | ```json // GET /api/order/today/670400830 { "success": true, "drug_code": "670400830", "today_ordered_qty": 300, "orders": [ { "order_no": "ORD-20260306-001", "wholesaler": "geoyoung", "specification": "300T", "qty": 1, "status": "submitted", "ordered_at": "2026-03-06T10:30:00" } ] } ``` #### πŸ”§ 규격 μΆ”μ²œ API | μ—”λ“œν¬μΈνŠΈ | λ©”μ„œλ“œ | κΈ°λŠ₯ | |------------|--------|------| | `/api/order/recommend-spec` | POST | 규격 μΆ”μ²œ (단건) | | `/api/order/recommend-specs` | POST | 규격 μΆ”μ²œ (볡수) | | `/api/order/optimize` | POST | 전체 μ£Όλ¬Έ μ΅œμ ν™” | ```json // POST /api/order/recommend-spec { "drug_code": "670400830", "needed_qty": 280, "prefer_wholesaler": "geoyoung" } // Response { "success": true, "drug_type": "ETC", // ETC: λ³΄ν—˜μ•½κ°€ κ³ μ •, OTC: 단가 비ꡐ κ°€λŠ₯ "recommendations": [ { "wholesaler": "geoyoung", "spec": "30T", "qty": 10, "total_dose": 300, "stock": 50, "unit_price": 1200, "total_price": 12000, "reason": "재고 μΆ©λΆ„, μ†ŒλΆ„ μ„ ν˜Έ" }, { "wholesaler": "sooin", "spec": "300T", "qty": 1, "total_dose": 300, "stock": 5, "unit_price": 12000, "total_price": 12000, "reason": "재고 있음 (ETC 단가 동일)" } ] } ``` #### πŸ”§ μ£Όλ¬Έ μž¬μ‹œλ„ API | μ—”λ“œν¬μΈνŠΈ | λ©”μ„œλ“œ | κΈ°λŠ₯ | |------------|--------|------| | `/api/order/retry` | POST | μ‹€νŒ¨ ν’ˆλͺ© μž¬μ‹œλ„ | | `/api/order/fallback` | POST | λ‹€λ₯Έ λ„λ§€μƒμœΌλ‘œ 재주문 | | `/api/order/redistribute` | POST | ν•œλ„ 기반 μž¬λΆ„λ°° | ```json // POST /api/order/retry { "order_id": 123, "item_ids": [456, 457], // μ‹€νŒ¨ν•œ ν’ˆλͺ© "fallback_wholesaler": "sooin" } ``` #### πŸ”§ μž₯λ°”κ΅¬λ‹ˆ 동기화 API | μ—”λ“œν¬μΈνŠΈ | λ©”μ„œλ“œ | κΈ°λŠ₯ | |------------|--------|------| | `/api/cart/sync` | POST | 전체 동기화 | | `/api/cart/compare` | GET | 둜컬 vs 도맀상 비ꡐ | | `/api/cart/resolve` | POST | 뢈일치 ν•΄κ²° | ### 4.2 κΈ°μ‘΄ API ν™•μž₯ #### πŸ“ `/api/order/create` ν™•μž₯ ```json // κΈ°μ‘΄ { "wholesaler_id": "geoyoung", "items": [...] } // ν™•μž₯ { "wholesaler_id": "geoyoung", "items": [...], "options": { "check_prior_orders": true, // μ„ μ£Όλ¬Έ 반영 "auto_spec_select": true, // 규격 μžλ™ 선택 "respect_limits": true, // ν•œλ„ μ€€μˆ˜ "allow_fallback": true, // μ‹€νŒ¨ μ‹œ λ‹€λ₯Έ 도맀상 "fallback_order": ["sooin", "baekje"] } } ``` #### πŸ“ `/api/order/submit` ν™•μž₯ ```json { "order_id": 123, "dry_run": false, "options": { "retry_on_fail": 3, // μ‹€νŒ¨ μ‹œ μž¬μ‹œλ„ 횟수 "fallback_enabled": true, "notify_on_fallback": true // 도맀상 λ³€κ²½ μ‹œ μ•Œλ¦Ό } } ``` --- ## 5. DB μŠ€ν‚€λ§ˆ ν™•μž₯ ### 5.1 μ‹ κ·œ ν…Œμ΄λΈ” #### `wholesaler_limits` - 도맀상 ν•œλ„ 관리 ```sql CREATE TABLE wholesaler_limits ( id INTEGER PRIMARY KEY AUTOINCREMENT, wholesaler_id TEXT NOT NULL, -- ν•œλ„ μ„€μ • monthly_limit INTEGER DEFAULT 0, -- μ›” ν•œλ„ (원) warning_threshold REAL DEFAULT 0.9, -- κ²½κ³  μž„κ³„κ°’ (90%) -- μš°μ„ μˆœμœ„ priority INTEGER DEFAULT 1, -- 1이 μ΅œμš°μ„  -- μƒνƒœ is_active INTEGER DEFAULT 1, -- 메타 created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (wholesaler_id) REFERENCES wholesalers(id) ); ``` #### `delivery_schedules` - 배솑 μŠ€μΌ€μ€„ πŸ†• ```sql CREATE TABLE delivery_schedules ( id INTEGER PRIMARY KEY AUTOINCREMENT, wholesaler_id TEXT NOT NULL, -- 배솑 회차 delivery_seq INTEGER NOT NULL, -- 1, 2, 3... delivery_name TEXT, -- 'μ˜€μ „λ°°μ†‘', 'μ˜€ν›„λ°°μ†‘', '읡일배솑' -- ⭐ μ£Όλ¬Έ λ§ˆκ°μ‹œκ°„ order_cutoff_time TEXT NOT NULL, -- 'HH:MM' (예: '10:00') -- ⭐ 배솑 도착 delivery_days_offset INTEGER DEFAULT 0, -- 0=당일, 1=읡일, 2=2일후... delivery_arrival_time TEXT NOT NULL, -- 'HH:MM' (예: '11:30') -- μš”μΌλ³„ 운영 (NULL=맀일) weekdays TEXT, -- JSON [1,2,3,4,5] (ν‰μΌλ§Œ) -- μƒνƒœ is_active INTEGER DEFAULT 1, created_at TEXT DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (wholesaler_id) REFERENCES wholesalers(id), UNIQUE(wholesaler_id, delivery_seq) ); -- μ‹€μ œ 배솑 μŠ€μΌ€μ€„ (2026-03-06 확인) INSERT INTO delivery_schedules (wholesaler_id, delivery_seq, delivery_name, order_cutoff_time, delivery_days_offset, delivery_arrival_time) VALUES -- μ§€μ˜€μ˜ (2배솑, 당일) ('geoyoung', 1, 'μ˜€μ „λ°°μ†‘', '10:00', 0, '11:30'), ('geoyoung', 2, 'μ˜€ν›„λ°°μ†‘', '13:00', 0, '15:00'), -- 수인 (1배솑, 당일) ('sooin', 1, 'μ˜€ν›„λ°°μ†‘', '13:00', 0, '14:30'), -- 백제 (1배솑, 읡일!) ⚠️ ('baekje', 1, '읡일배솑', '16:00', 1, '15:00'); -- days_offset=1 β†’ λ‹€μŒλ‚  ``` #### `wholesaler_monthly_usage` - 월별 μ‚¬μš©λŸ‰ 좔적 ```sql CREATE TABLE wholesaler_monthly_usage ( id INTEGER PRIMARY KEY AUTOINCREMENT, wholesaler_id TEXT NOT NULL, year_month TEXT NOT NULL, -- 'YYYY-MM' -- 집계 total_orders INTEGER DEFAULT 0, -- μ£Όλ¬Έ 건수 total_items INTEGER DEFAULT 0, -- μ£Όλ¬Έ ν’ˆλͺ© 수 total_amount INTEGER DEFAULT 0, -- 총 μ£Όλ¬Έ κΈˆμ•‘ -- μƒνƒœλ³„ 집계 success_amount INTEGER DEFAULT 0, failed_amount INTEGER DEFAULT 0, -- 메타 last_updated TEXT DEFAULT CURRENT_TIMESTAMP, UNIQUE(wholesaler_id, year_month) ); ``` #### `order_fallback_log` - μž¬μ‹œλ„ 둜그 ```sql CREATE TABLE order_fallback_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, order_item_id INTEGER NOT NULL, -- μ›λž˜ 도맀상 original_wholesaler TEXT NOT NULL, original_error TEXT, -- μ‹€νŒ¨ μ‚¬μœ  -- μž¬μ‹œλ„ 도맀상 fallback_wholesaler TEXT NOT NULL, fallback_result TEXT, -- 'success', 'failed' fallback_message TEXT, -- 메타 created_at TEXT DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (order_item_id) REFERENCES order_items(id) ); ``` #### `cart_sync_log` - μž₯λ°”κ΅¬λ‹ˆ 동기화 둜그 ```sql CREATE TABLE cart_sync_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, wholesaler_id TEXT NOT NULL, -- 동기화 정보 sync_type TEXT, -- 'full', 'partial', 'compare' local_items INTEGER, remote_items INTEGER, matched INTEGER, mismatched INTEGER, -- 상세 detail_json TEXT, created_at TEXT DEFAULT CURRENT_TIMESTAMP ); ``` ### 5.2 κΈ°μ‘΄ ν…Œμ΄λΈ” ν™•μž₯ #### `orders` ν™•μž₯ ⭐ μ€‘μš” ```sql -- dry_run ꡬ뢄 (μ„ μ£Όλ¬Έ 쑰회 μ‹œ μ œμ™Έμš©) ALTER TABLE orders ADD COLUMN is_dry_run INTEGER DEFAULT 0; ``` #### `order_items` ν™•μž₯ ```sql ALTER TABLE order_items ADD COLUMN fallback_from_wholesaler TEXT; ALTER TABLE order_items ADD COLUMN fallback_reason TEXT; ALTER TABLE order_items ADD COLUMN prior_order_qty INTEGER DEFAULT 0; -- μ„ μ£Όλ¬ΈλŸ‰ ``` #### `order_context` ν™•μž₯ ```sql ALTER TABLE order_context ADD COLUMN limit_check_result TEXT; ALTER TABLE order_context ADD COLUMN recommended_by TEXT; -- 'user', 'ai', 'system' ``` --- ## 6. UI κ°œμ„  κ³„νš ### 6.1 도맀상 ν•œλ„ λŒ€μ‹œλ³΄λ“œ πŸ†• ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ πŸ’° 도맀상 ν•œλ„ ν˜„ν™© (2026λ…„ 3μ›”) β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ 🏒 μ§€μ˜€μ˜ β”‚ β”‚ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘ 35,124,164 / 50,000,000 β”‚ β”‚ 70.2% μ‚¬μš© | 남은 ν•œλ„: 14,875,836원 β”‚ β”‚ [배솑 3회] 09:00, 13:00, 17:00 β”‚ β”‚ β”‚ β”‚ 🏒 μˆ˜μΈμ•½ν’ˆ β”‚ β”‚ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘ 14,293,001 / 30,000,000 β”‚ β”‚ 47.6% μ‚¬μš© | 남은 ν•œλ„: 15,706,999원 β”‚ β”‚ [배솑 2회] 09:00, 17:00 β”‚ β”‚ β”‚ β”‚ 🏒 λ°±μ œμ•½ν’ˆ β”‚ β”‚ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘ 14,563,978 / 20,000,000 β”‚ β”‚ 72.8% μ‚¬μš© | 남은 ν•œλ„: 5,436,022원 ⚠️ 주의 β”‚ β”‚ [배솑 2회] 09:00, 17:00 β”‚ β”‚ β”‚ β”‚ [βš™οΈ ν•œλ„ μ„€μ •] [πŸ“Š 상세 리포트] β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### 6.2 μ£Όλ¬Έ ν™”λ©΄ κ°œμ„  ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ πŸ“¦ μ£Όλ¬Έ 생성 - 2026-03-06 μ˜€ν›„ 배치 β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ [μ„ μ£Όλ¬Έ 반영 βœ“] 였늘 μ˜€μ „ μ£Όλ¬Έ: 15ν’ˆλͺ©, 2,340,000원 β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ ν’ˆλͺ© β”‚ ν•„μš”λŸ‰ β”‚ μ„ μ£Όλ¬Έ β”‚ μΆ”κ°€μ£Όλ¬Έ β”‚ β”‚ β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ 아세탑정 β”‚ 910T β”‚ 300T β”‚ 610T β”‚ β”‚ β”‚ β”‚ β”” μΆ”μ²œ: 300T x 2 (μ§€μ˜€μ˜) β”‚ β”‚ β”‚ β”‚ β”” λŒ€μ•ˆ: 30T x 21 (수인, 재고 μΆ©λΆ„) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ λ ˆλ°”λ―Έν”Όλ“œμ • β”‚ 500T β”‚ 0T β”‚ 500T β”‚ β”‚ β”‚ β”‚ β”” μΆ”μ²œ: 30T x 17 (μ§€μ˜€μ˜) ⚠️ ν’ˆμ ˆμœ„ν—˜ β”‚ β”‚ β”‚ β”‚ β”” λŒ€μ•ˆ: 100T x 5 (백제) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ πŸ“Š 도맀상 λΆ„λ°° 미리보기 β”‚ β”‚ - μ§€μ˜€μ˜: 8ν’ˆλͺ© (1,200,000원) [ν•œλ„ μ—¬μœ  βœ“] β”‚ β”‚ - 수인: 3ν’ˆλͺ© (450,000원) β”‚ β”‚ - 백제: 2ν’ˆλͺ© (350,000원) [ν•œλ„ 주의 ⚠️] β”‚ β”‚ β”‚ β”‚ [πŸ”„ μž¬λΆ„λ°°] [βœ… μ£Όλ¬Έ ν™•μ •] [πŸ’Ύ μž₯λ°”κ΅¬λ‹ˆ μ €μž₯] β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### 6.3 μ•Œλ¦Ό/λ…Έν‹°ν”ΌμΌ€μ΄μ…˜ ``` [μ•Œλ¦Ό μœ ν˜•] πŸ“’ ν•œλ„ μ•Œλ¦Ό - "μ§€μ˜€μ˜ ν•œλ„ 90% 도달 (4,500λ§Œμ›/5,000λ§Œμ›)" - "λ°±μ œμ•½ν’ˆ ν•œλ„ 초과! μ‹ κ·œ μ£Όλ¬Έ λΆˆκ°€" πŸ“’ 도맀상 λ³€κ²½ μ•Œλ¦Ό - "아세탑정: μ§€μ˜€μ˜ ν’ˆμ ˆ β†’ μˆ˜μΈμ•½ν’ˆμœΌλ‘œ 변경됨" πŸ“’ μ£Όλ¬Έ κ²°κ³Ό μ•Œλ¦Ό - "μ˜€ν›„ μ£Όλ¬Έ μ™„λ£Œ: 15ν’ˆλͺ© 쀑 14개 성곡, 1개 μž¬μ‹œλ„ 쀑" πŸ“’ 배솑 μ•Œλ¦Ό - "μ§€μ˜€μ˜ 점심 배솑 마감 30λΆ„ μ „ (12:30κΉŒμ§€)" ``` --- ## 7. 개발 μš°μ„ μˆœμœ„ ### Phase 1: 핡심 κΈ°λŠ₯ (1μ£Όμ°¨) | μˆœμœ„ | κΈ°λŠ₯ | μ˜ˆμƒ 곡수 | μ˜μ‘΄μ„± | |:----:|------|:--------:|--------| | 1 | μ„ μ£Όλ¬Έ 쑰회 API | 0.5일 | - | | 2 | 도맀상 ν•œλ„ ν…Œμ΄λΈ” + API | 1일 | - | | 3 | 규격 μΆ”μ²œ API | 1일 | μ„ μ£Όλ¬Έ API | | 4 | ν•œλ„ 체크 둜직 | 0.5일 | ν•œλ„ ν…Œμ΄λΈ” | ### Phase 2: μžλ™ν™” (2μ£Όμ°¨) | μˆœμœ„ | κΈ°λŠ₯ | μ˜ˆμƒ 곡수 | μ˜μ‘΄μ„± | |:----:|------|:--------:|--------| | 5 | μ£Όλ¬Έ μž¬μ‹œλ„ 둜직 | 1일 | Phase 1 | | 6 | μž₯λ°”κ΅¬λ‹ˆ 동기화 | 1일 | - | | 7 | UI: ν•œλ„ λŒ€μ‹œλ³΄λ“œ | 1일 | ν•œλ„ API | | 8 | UI: μ£Όλ¬Έ ν™”λ©΄ κ°œμ„  | 1일 | 규격 μΆ”μ²œ API | ### Phase 3: 고도화 (3μ£Όμ°¨) | μˆœμœ„ | κΈ°λŠ₯ | μ˜ˆμƒ 곡수 | μ˜μ‘΄μ„± | |:----:|------|:--------:|--------| | 9 | 배솑 μŠ€μΌ€μ€„ 관리 | 1일 | - | | 10 | μ•Œλ¦Ό μ‹œμŠ€ν…œ | 1일 | - | | 11 | AI ν•™μŠ΅ νŒŒμ΄ν”„λΌμΈ | 2일 | Phase 1-2 데이터 | | 12 | μžλ™ μŠ€μΌ€μ€„λ§ | 1일 | 배솑 μŠ€μΌ€μ€„ | --- ## πŸ“ κ²€ν†  μš”μ²­ 사항 ### 1. ν•œλ„ κΈ°λ³Έκ°’ 도맀상별 초기 ν•œλ„ μ–Όλ§ˆλ‘œ μ„€μ •? - μ§€μ˜€μ˜: ____λ§Œμ› - 수인: ____λ§Œμ› - 백제: ____λ§Œμ› ### 2. 배솑 μŠ€μΌ€μ€„ βœ… 확인 μ™„λ£Œ | 도맀상 | 배솑 | μ£Όλ¬Έ 마감 | 도착 μ˜ˆμ • | λΉ„κ³  | |--------|------|----------|----------|------| | **μ§€μ˜€μ˜** | μ˜€μ „ | 10:00 | 11:30 | 당일 | | | μ˜€ν›„ | 13:00 | 15:00 | 당일 | | **수인** | μ˜€ν›„ | 13:00 | 14:30 | 당일 | | **백제** | 읡일 | 16:00 | λ‹€μŒλ‚  15:00 | ⚠️ 읡일배솑 | ### 3. μ•Œλ¦Ό 채널 μ–΄λ””λ‘œ λ°›μœΌμ‹€ κ±΄κ°€μš”? - [ ] ν…”λ ˆκ·Έλž¨ - [ ] μΉ΄μΉ΄μ˜€ν†‘ - [ ] μ›Ή μ•Œλ¦Ό - [ ] 기타: ____ ### 4. μž¬μ‹œλ„ μ •μ±… - A도맀상 μ‹€νŒ¨ μ‹œ λ°”λ‘œ B둜? - λͺ‡ λ²ˆκΉŒμ§€ μž¬μ‹œλ„? --- > πŸ‰ **용림 λ©”λͺ¨**: κΈ°νšμ„œ κ²€ν†  ν›„ Phase 1λΆ€ν„° 순차 개발 μ˜ˆμ •. > μ•½μ‚¬λ‹˜ 확인 ν›„ μˆ˜μ •μ‚¬ν•­ λ°˜μ˜ν•˜κ² μŠ΅λ‹ˆλ‹€!