docs: 서버 관리 및 시스템 설계 문서 추가
- Flask 서버 관리 스크립트 (run_server.sh) 추가 - 원산지별 재고 관리 설계 문서 추가 - Flask 프로세스 관리 문서 작성 - 다중 Flask 프로세스 문제 해결 방안 문서화 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
c834b5625f
commit
2a14af59c3
48
.claude/flask_process_management.md
Normal file
48
.claude/flask_process_management.md
Normal file
@ -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가 이미 생성되어 있음:
|
||||||
|
- 기존 프로세스 자동 종료
|
||||||
|
- 새 프로세스 시작
|
||||||
|
- 단일 프로세스만 실행 보장
|
||||||
82
.claude/inventory_origin_design.md
Normal file
82
.claude/inventory_origin_design.md
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
# 원산지별 재고 관리 및 조제 시 선택 기능
|
||||||
|
|
||||||
|
## 🎯 완료된 기능 (2026-02-15)
|
||||||
|
|
||||||
|
### 1. 원산지별 재고 구분 표시
|
||||||
|
- **재고 현황 API 개선** (`/api/inventory/summary`)
|
||||||
|
- `origin_count`: 원산지 개수
|
||||||
|
- `min_price`, `max_price`: 가격 범위
|
||||||
|
- 평균 가격 표시
|
||||||
|
|
||||||
|
### 2. 재고 상세 API 추가 (`/api/inventory/detail/<herb_id>`)
|
||||||
|
- 원산지별로 그룹화된 재고 정보
|
||||||
|
- 각 원산지별 로트 목록
|
||||||
|
- 평균 단가, 재고 수량, 재고 가치
|
||||||
|
|
||||||
|
### 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/<id>/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. ⏳ 조제 이력에 원산지 기록
|
||||||
44
run_server.sh
Executable file
44
run_server.sh
Executable file
@ -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
|
||||||
Loading…
Reference in New Issue
Block a user