# MediScan Phase 1-B: 분석 엔진 개발

## 작업 레벨: Lv.4 (핵심 비즈니스 로직)

## 프로젝트 3문서
- 계획서: `/home/jay/workspace/memory/plans/mediscan/plan.md`
- 맥락노트: `/home/jay/workspace/memory/plans/mediscan/context-notes.md`
- 체크리스트: `/home/jay/workspace/memory/plans/mediscan/checklist.md`

## 배경
Phase 1-A(PDF 파서)가 완료됨 (PR #1 merged). 5종 PDF에서 구조화된 JSON 추출 가능.
이제 추출된 데이터를 입력으로 **고지의무 분석 엔진**을 구현해야 함.

## Phase 1-A 산출물 (입력 데이터)
- 프로젝트: `/home/jay/projects/MediScan/`
- 파서 모듈: `src/parsers/` (5종 파서 + 자동감지)
- 모델: `src/models/schemas.py` (Pydantic v2)
- 테스트: `tests/` (35건 전체 PASS)

## 목표
파싱된 진료 데이터를 분석하여 **표준체 고지의무 항목을 자동 분류**하는 엔진 구현.

## 구현 사항

### 프로젝트 구조 (src/analysis/ 추가)
```
src/
├── parsers/          # Phase 1-A (완료)
├── models/
│   └── schemas.py    # Phase 1-A (완료) + 분석 결과 모델 추가
└── analysis/         # Phase 1-B (신규)
    ├── __init__.py
    ├── engine.py             # 분석 엔진 메인 (오케스트레이터)
    ├── disease_normalizer.py # 상병코드 정규화기
    ├── obligation_classifier.py  # 고지의무 판별기 (3개월/1년/5년)
    ├── medication_calculator.py  # 누적 투약일수 산출기
    ├── treatment_validator.py    # 진료일/입원일 교차검증기
    ├── surgery_classifier.py     # 수술/중증치료 분류기
    └── seven_day_rule.py         # 7일 이상 치료 합산기
```

### 1. 상병코드 정규화기 (disease_normalizer.py)
- KCD 코드 매핑 (한국표준질병사인분류)
- 주상병/부상병 분리
- 동일 상병 다른 코드 통합
- 6대질병 자동 분류 (암/뇌혈관/심장/간/당뇨/고혈압)
- KCD 데이터: 공개 자료에서 수집하여 JSON/SQLite로 관리

### 2. 고지의무 판별기 (obligation_classifier.py)
- **3개월 기준**: 최근 3개월 이내 진단·치료 여부
  - 처방 있으면: "진단·치료·투약"
  - 처방 없으면: "진단·치료"
  - 동적 분기 출력
- **1년 기준**: 입원, 수술, 재검사/추적관찰 여부
- **5년 기준**: 7일+ 입원, 수술, 중대질병 진단 여부
- 기준일: 분석 실행 시점 기준 역산

### 3. 누적 투약일수 산출기 (medication_calculator.py)
- 처방조제정보 데이터 입력
- 동일 상병(같은 의료기관)의 처방약품 누적일수 합산
- 약품별, 상병별 그룹핑
- 출력: 상병별 총 투약일수 + 약품 목록

### 4. 진료일/입원일 교차검증기 (treatment_validator.py)
- 기본진료 + 세부진료 데이터 교차 대조
- 중복 진료일 제거
- 실제 내원일 산출
- 입원 기간 계산 (시작일~종료일)

### 5. 수술/중증치료 분류기 (surgery_classifier.py)
- 세부진료정보의 코드명 기반 분류
- 수술 vs 단순처치/보조처치 분리
- 중대/특수치료 항목: 항암, 중재시술, 방사선, 체외충격파
- 생검+겸자술 → 수술 치환 로직
- 검사 오탐 방지 (ICT치료, 초음파치료 제외)

### 6. 7일 이상 치료 합산기 (seven_day_rule.py)
- 동일 원인 진단이 여러 의료기관에 분산된 경우 합산
- 합산 기준: 동일 상병코드 or 동일 상병명
- 합산 결과: 총 일수 + 포함된 의료기관/기간 목록
- 7일 이상이면 고지 대상으로 플래그

### 7. 분석 엔진 메인 (engine.py)
```python
class MediScanEngine:
    def analyze(self, parsed_data: list[ParseResult]) -> AnalysisReport:
        """
        1. 상병코드 정규화
        2. 투약일수 산출
        3. 진료일 교차검증
        4. 수술/중증치료 분류
        5. 7일 이상 합산
        6. 고지의무 판별 (3개월/1년/5년)
        7. 리포트 생성
        """
```

### 8. 분석 결과 모델 (schemas.py에 추가)
```python
class ObligationItem(BaseModel):
    period: str  # "3개월", "1년", "5년"
    category: str  # "진단", "입원", "수술", "투약", "7일+치료"
    disease_code: str
    disease_name: str
    details: str  # 상세 설명
    risk_level: str  # "high", "medium", "low"
    
class AnalysisReport(BaseModel):
    obligations_3month: list[ObligationItem]
    obligations_1year: list[ObligationItem]
    obligations_5year: list[ObligationItem]
    surgeries: list[SurgeryItem]
    severe_treatments: list[SevereTreatmentItem]
    medication_summary: list[MedicationSummary]
    seven_day_items: list[SevenDayItem]
    warnings: list[str]
```

## 검증 시나리오

### 시나리오 1: 전체 파이프라인
- 5개 샘플 PDF 파싱 → 분석 엔진 입력 → AnalysisReport 출력
- 성공 기준: 3개월/1년/5년 고지 항목이 빈 리스트가 아닌 의미있는 결과

### 시나리오 2: 투약일수 산출
- 처방조제정보에서 동일 약품의 누적일수 정확 합산

### 시나리오 3: 수술 분류
- 세부진료정보에서 수술 vs 비수술 정확 구분

### 시나리오 4: 7일 합산
- 동일 상병코드 다른 의료기관 방문 합산 → 7일 이상이면 플래그

## KCD 상병코드 데이터 확보
- 건보공단/심평원 공개 자료에서 KCD-8 코드 목록 수집
- 또는 웹 크롤링으로 수집 (koicd.kr 등)
- JSON 파일로 `src/data/kcd_codes.json` 저장

## 주의사항
- ★ Phase 1-A 코드 수정 금지. analysis/ 모듈만 신규 추가.
- ★ docs/samples/ PDF 파일 git 커밋 금지 (.gitignore 확인)
- 기본진료내역 파서가 없으므로, 자동차사고기본진료정보 데이터로 테스트
- 고지의무 기준은 업계 표준 참고 (정확한 기준표 미확보 시 일반적 기준 적용 + TODO 주석)

## 참고
- Phase 1-A 코드: `/home/jay/projects/MediScan/src/parsers/`
- MHS V9.7 릴리즈 노트: `/home/jay/projects/MediScan/docs/MHS V9.7 Update Log 2026-03-20.txt`
- 3문서: `/home/jay/workspace/memory/plans/mediscan/`
