diff --git a/.claude/flask_process_management.md b/.claude/flask_process_management.md new file mode 100644 index 0000000..059b681 --- /dev/null +++ b/.claude/flask_process_management.md @@ -0,0 +1,48 @@ +# Flask 프로세스 관리 가이드 + +## 🚨 문제 상황 +- Flask Debug 모드로 실행 시 코드 변경 시마다 자동 재시작 +- 여러 개의 백그라운드 프로세스가 누적되어 실행됨 +- 동일한 포트(5001)를 여러 프로세스가 점유하려고 시도 + +## ✅ 해결 방법 + +### 1. 즉시 해결 명령어 +```bash +# 한 줄로 모든 Flask 프로세스 종료 및 재시작 +lsof -ti:5001 | xargs -r kill -9 && sleep 2 && source venv/bin/activate && python app.py +``` + +### 2. run_server.sh 스크립트 사용 (이미 생성됨) +```bash +./run_server.sh +``` + +### 3. 근본적 해결책 +```python +# app.py 수정 - Debug 모드 끄기 +app.run(debug=False, host='0.0.0.0', port=5001) +``` + +## 📝 프로세스 확인 명령어 +```bash +# 포트 5001 사용 중인 프로세스 확인 +lsof -i:5001 + +# 모든 Python 프로세스 확인 +ps aux | grep python + +# 특정 포트 프로세스만 종료 +lsof -ti:5001 | xargs -r kill -9 +``` + +## ⚠️ 주의사항 +- Debug 모드는 개발 중에만 사용 +- Production에서는 반드시 debug=False로 설정 +- 코드 변경이 빈번할 때는 수동으로 재시작 권장 + +## 🔄 자동화 스크립트 +run_server.sh가 이미 생성되어 있음: +- 기존 프로세스 자동 종료 +- 새 프로세스 시작 +- 단일 프로세스만 실행 보장 \ No newline at end of file diff --git a/.claude/inventory_origin_design.md b/.claude/inventory_origin_design.md new file mode 100644 index 0000000..61bcc01 --- /dev/null +++ b/.claude/inventory_origin_design.md @@ -0,0 +1,82 @@ +# 원산지별 재고 관리 및 조제 시 선택 기능 + +## 🎯 완료된 기능 (2026-02-15) + +### 1. 원산지별 재고 구분 표시 +- **재고 현황 API 개선** (`/api/inventory/summary`) + - `origin_count`: 원산지 개수 + - `min_price`, `max_price`: 가격 범위 + - 평균 가격 표시 + +### 2. 재고 상세 API 추가 (`/api/inventory/detail/`) +- 원산지별로 그룹화된 재고 정보 +- 각 원산지별 로트 목록 +- 평균 단가, 재고 수량, 재고 가치 + +### 3. UI 개선 +- 재고 목록에서 원산지 개수 배지 표시 +- 가격 범위 표시 (여러 원산지일 경우) +- 클릭 시 상세 모달 표시 +- 원산지별 재고 카드형 UI + +## 📌 실제 사례: 건강(乾薑) 약재 +``` +페루산: 5,000g @ 12.4원/g (총 62,000원) +한국산: 1,500g @ 51.4원/g (총 77,100원) +``` + +## 🔄 조제 시 원산지 선택 기능 (설계) + +### 1. 데이터베이스 스키마 변경 +```sql +-- compound_details 테이블에 로트 정보 추가 +ALTER TABLE compound_details ADD COLUMN lot_id INTEGER; +ALTER TABLE compound_details ADD FOREIGN KEY (lot_id) REFERENCES inventory_lots(lot_id); +``` + +### 2. 조제 프로세스 개선 +1. **처방 선택 후 약재 목록 표시** + - 각 약재에 원산지 선택 옵션 제공 + - 기본값: 가장 저렴한 원산지 + - 선택 가능: 고품질(비싼) 원산지 + +2. **원산지 선택 UI** + ```javascript + // 예시: 건강 30g 조제 시 + { + herb: "건강", + required: 30, + options: [ + {origin: "페루", price: 12.4, available: 5000}, + {origin: "한국", price: 51.4, available: 1500} + ] + } + ``` + +3. **가격 차이 실시간 표시** + - 기본 선택: 페루산 30g = 372원 + - 프리미엄 선택: 한국산 30g = 1,542원 + - 차이: +1,170원 + +### 3. API 엔드포인트 추가 +- `GET /api/herbs//lots` - 약재별 가용 로트 목록 +- `POST /api/compounds/calculate` - 원산지별 가격 계산 +- `POST /api/compounds/dispense` - 원산지 지정 조제 + +### 4. FIFO 변형 전략 +- **기본**: 저렴한 원산지 우선 (Cost-Optimized FIFO) +- **선택**: 특정 원산지 지정 가능 +- **혼합**: 일부는 저렴, 일부는 고품질 + +## 💡 비즈니스 가치 +1. **환자 선택권**: 가격 vs 품질 선택 가능 +2. **투명성**: 원산지별 가격 명시 +3. **재고 관리**: 원산지별 재고 추적 +4. **수익성**: 프리미엄 옵션 제공 + +## 🚀 구현 우선순위 +1. ✅ 원산지별 재고 표시 (완료) +2. ✅ 재고 상세 모달 (완료) +3. ⏳ 조제 시 원산지 선택 UI +4. ⏳ 원산지별 가격 계산 +5. ⏳ 조제 이력에 원산지 기록 \ No newline at end of file diff --git a/run_server.sh b/run_server.sh new file mode 100755 index 0000000..7577bd7 --- /dev/null +++ b/run_server.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# Flask 서버 실행 스크립트 - 강화 버전 + +echo "=== Flask 서버 관리 스크립트 (강화 버전) ===" + +# 1. 모든 Python Flask 프로세스 종료 +echo "1. 모든 Flask 프로세스 종료 중..." +pkill -9 -f "python app.py" 2>/dev/null +sleep 1 + +# 2. 포트 5001 강제 해제 +echo "2. 포트 5001 강제 해제..." +lsof -ti:5001 | xargs -r kill -9 2>/dev/null +sleep 1 + +# 3. 잔여 Python 프로세스 확인 +echo "3. 잔여 프로세스 확인..." +REMAINING=$(lsof -ti:5001) +if [ ! -z "$REMAINING" ]; then + echo " 경고: 아직 포트를 사용 중인 프로세스 발견. 강제 종료..." + kill -9 $REMAINING 2>/dev/null + sleep 1 +fi + +# 4. 포트 상태 최종 확인 +if lsof -i:5001 > /dev/null 2>&1; then + echo " ⚠️ 포트 5001이 여전히 사용 중입니다. 잠시 후 다시 시도하세요." + exit 1 +else + echo " ✅ 포트 5001이 비어있습니다." +fi + +# 5. Flask 서버 시작 +echo "4. Flask 서버 시작..." +cd /root/kdrug +source venv/bin/activate + +# Debug 모드 비활성화 옵션 (더 안정적) +# export FLASK_DEBUG=0 + +echo " 서버 시작 중... (http://localhost:5001)" +echo " 종료: Ctrl+C" +echo "=======================================" +python app.py \ No newline at end of file