pharmacy-pos-qr-system/docs/APC_MAPPING_PLAN.md

300 lines
14 KiB
Markdown

# 🎯 APC 기반 동물약 매핑 기획서
> ⚠️ **주의**: 기획 단계에서는 MSSQL **READ ONLY**. 절대 데이터 입력/수정 금지.
---
## 📋 현상황 분석
### 1. 동물약 바코드 문제
#### 문제 1: 바코드 없음
- 동물약은 **수의사 소분 판매 방지** 목적으로 공산품이지만 바코드가 없는 경우 많음
- "판매 최소포장단위"별 바코드가 부여되지 않음
- 예: 다이로하트, 넥스가드 등 → 바코드 없음
#### 문제 2: 바코드 중복
- 바코드가 있어도 **여러 사이즈 제품이 동일 바코드** 사용
- 예: 다이로하트정 SS/S/M/L → 모두 동일 바코드
- 바코드만으로 사이즈/체중 구분 불가
#### 문제 3: 약국별 자체 바코드
- 약국은 POS 재고관리를 위해 **자체 바코드 생성**하여 사용
- 원래 바코드 무시하고 새로 지정
- 이유: POS에서 스캔 시 제품별 즉시 구분 + 재고 차감 필요
#### 결과: 중앙 매핑 불가
```
약국 A: "안텔민사사" → 바코드 "A001"
약국 B: "안텔민사사" → 바코드 "B999"
약국 C: "안텔민사사" → 바코드 없음 (수기 입력)
↓ 중앙 시스템 입장
바코드 "A001" = ??? (알 수 없음)
바코드 "B999" = ??? (알 수 없음)
```
---
### 2. 현재 데이터 구조 (2025-06-30 최종 확인)
```
┌─────────────────────────────────────────────────────────────┐
│ MSSQL (팜IT3000 - 약국 POS) │
├─────────────────────────────────────────────────────────────┤
│ │
│ CD_GOODS (제품 마스터) - 178,182개 │
│ ├── DrugCode: LB000003157 (PK) │
│ ├── GoodsName: "안텔민킹(5kg이상)" │
│ └── 팜IT3000 전체 제품 DB │
│ │ │
│ ├────────────────┬─────────────────────────────┐ │
│ ▼ ▼ ▼ │
│ CD_SALEGOODS CD_ITEM_UNIT_MEMBER CD_BARCODE│
│ (대표 바코드 1개) (바코드 N개!) ★ (인체용) │
│ 3,053개 ├ CD_CD_BARCODE 306,565개│
│ BARCODE: │ 0230237810109 (APC!) 동물약X │
│ 9990000001134 │ 9990000001134 (자체) │
│ └ DRUGCODE → CD_GOODS.DrugCode │
│ │
└─────────────────────────────────────────────────────────────┘
★ 핵심: 한 제품에 여러 바코드 가능! → CD_ITEM_UNIT_MEMBER
★ APC 저장 위치: CD_ITEM_UNIT_MEMBER.CD_CD_BARCODE
★ APC로 이미지 조회: https://ani.0bin.in/img/{APC}_F.jpg
```
│ 매핑 필요
┌─────────────────────────────────────────────────────────────┐
│ PostgreSQL (애니팜 - 동물약 마스터) │
├─────────────────────────────────────────────────────────────┤
│ apc 테이블 │
│ ├── apc: "0230237010107" (고유!) │
│ ├── product_name: "대성 안텔민 사사 정 100mg/25mg/10정" │
│ ├── company_name: "(주)대성미생물연구소" │
│ ├── for_pets: true │
│ ├── image_url1: "https://ani.0bin.in/img/..." │
│ └── godoimage_url_f: "https://cdn.../..." │
└─────────────────────────────────────────────────────────────┘
```
---
## 💡 해결책: APC 기반 매핑
### 핵심 아이디어
**APC(Animal Product Code)를 고유 매핑 키로 사용**
```
CD_GOODS.DrugCode ←→ CD_BARCODE.DRUGCODE ←→ APC(새로추가) ←→ PostgreSQL.apc
```
### 왜 APC인가?
| 키 | 고유성 | 중앙관리 | 이미지 | 현황 |
|----|--------|----------|--------|------|
| 바코드 | ❌ 중복/없음 | ❌ 약국별 다름 | ❌ | 사용 불가 |
| DrugCode | ⚠️ 약국내 고유 | ❌ 약국별 다름 | ❌ | 내부용 |
| **APC** | ✅ 전국 고유 | ✅ 애니팜 관리 | ✅ | **사용 가능** |
---
## 🔄 구현 계획
### Phase 1: 동물약 태깅 (완료 ✅)
```
CD_GOODS에서 POS_BOON='010103' 추출 → 38개 동물약 식별
```
### Phase 2: AI 기반 APC 매핑
```
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ MSSQL 동물약 │ │ AI 분석 │ │ PostgreSQL │
│ 38개 제품 │────►│ 제품명 매칭 │────►│ apc 후보 추천 │
│ │ │ 성분/체중 분석 │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
┌─────────────────┐
│ 관리자 확인 │
│ 매핑 승인/수정 │
└─────────────────┘
```
**AI 매칭 로직:**
```python
# MSSQL 제품
mssql_product = "안텔민사사(5kg이하)"
# PostgreSQL 검색
pgsql_candidates = search_apc("안텔민 사사")
# → [
# "대성 안텔민 사사 정 100mg/25mg/10정" (APC: 0230237010107),
# "대성 안텔민 사사 정 100mg/25mg/50정" (APC: 0230237010205),
# ...
# ]
# AI 추천: 체중 범위, 포장단위 분석
recommended_apc = "0230237010107" # 10정 (최소 판매단위)
```
### Phase 3: APC 바코드 등록 방법
**옵션 A: CD_SALEGOODS.BARCODE 업데이트 (현재 구조 활용)**
```sql
-- CD_SALEGOODS에서 바코드를 APC로 변경
UPDATE CD_SALEGOODS
SET BARCODE = '0230237010107' -- APC 코드
WHERE DrugCode = 'LB000003158'; -- 안텔민뽀삐
```
또는 POS에서 직접:
1. 제품 선택 → 바코드 수정 → APC 입력 → 저장
**옵션 B: 별도 매핑 테이블 (SQLite) - MSSQL 수정 최소화**
```sql
-- SQLite에 매핑 테이블 생성
CREATE TABLE animal_drug_apc_mapping (
id INTEGER PRIMARY KEY,
mssql_drug_code TEXT NOT NULL, -- CD_GOODS.DrugCode
mssql_barcode TEXT, -- CD_SALEGOODS.BARCODE (현재값)
apc_code TEXT NOT NULL, -- PostgreSQL apc
product_name TEXT, -- 확인용
verified BOOLEAN DEFAULT 0, -- 관리자 검증 여부
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
**현재 동물약 바코드 현황:**
| 제품 | DrugCode | CD_SALEGOODS.BARCODE |
|------|----------|---------------------|
| 안텔민뽀삐 | LB000003158 | 9990000001133 |
| 안텔민킹 | LB000003157 | 9990000001134 |
| 다이로하트S | LB000003150 | 9990000001131 |
| 다이로하트M | LB000003151 | 9990000001132 |
### Phase 4: QR 라벨 출력 연동
```
┌─────────────────────────────────────────────────────────────┐
│ 프론트엔드: 제품 검색 → QR 라벨 출력 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 제품 선택 (MSSQL) │
│ └── DrugCode: LB000003158 │
│ │
│ 2. APC 매핑 확인 │
│ └── APC: 0230237010107 (매핑됨 ✅) │
│ │
│ 3. QR 라벨 생성 │
│ ├── QR 내용: APC 코드 │
│ ├── 라벨 텍스트: 제품명 + 가격 │
│ └── [인쇄] 버튼 활성화 │
│ │
│ ※ APC 미매핑 제품 → [인쇄] 버튼 비활성화 또는 경고 │
└─────────────────────────────────────────────────────────────┘
```
### Phase 5: 이미지 표시 연동
```
챗봇 응답: "안텔민을 추천드려요"
├── MSSQL: "안텔민사사(5kg이하)" 재고 확인
├── APC 매핑: LB000003158 → 0230237010107
├── PostgreSQL: 이미지 URL 조회
│ └── https://ani.0bin.in/img/0230237010107_F.jpg
└── 프론트: 제품 칩 + 이미지 썸네일 표시
┌──────────────────────────┐
│ 📦 안텔민사사 (5,000원) │
│ [썸네일 이미지] │
└──────────────────────────┘
```
---
## 📊 예상 데이터 흐름
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 전체 데이터 흐름 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ [약국 POS] │
│ │ │
│ ▼ │
│ CD_GOODS ──────► CD_BARCODE (APC 추가) │
│ │ │ │
│ │ │ APC = "0230237010107" │
│ │ │ │
│ ▼ ▼ │
│ 제품 판매 ◄──── QR 스캔 (APC 인식) │
│ │ │ │
│ │ │ │
│ ▼ ▼ │
│ [챗봇/이미지] [애니팜 연동] │
│ │ │ │
│ │ │ │
│ ▼ ▼ │
│ PostgreSQL ◄─────────────┘ │
│ (이미지, 상세정보, 용법용량) │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
---
## ✅ TODO 체크리스트
### 1단계: 분석 (READ ONLY)
- [x] MSSQL 동물약 38개 추출
- [x] CD_BARCODE 구조 분석
- [x] PostgreSQL apc 테이블 구조 분석
- [x] 매핑 가능 제품 샘플 확인 (안텔민, 하트가드 등)
- [ ] 전체 38개 제품 APC 후보 목록 생성
### 2단계: 기획
- [x] 매핑 전략 수립 (APC 기반)
- [ ] CD_BARCODE 활용 vs SQLite 매핑 테이블 결정
- [ ] 관리자 매핑 UI 설계
- [ ] QR 라벨 출력 연동 설계
### 3단계: 구현 (약사님 승인 후)
- [ ] 매핑 테이블 생성
- [ ] AI 매핑 추천 기능
- [ ] 관리자 매핑 확인/수정 UI
- [ ] QR 라벨 출력 (APC 기반)
- [ ] 챗봇 이미지 연동
---
## ⚠️ 주의사항
1. **MSSQL 수정 금지** (기획 단계)
- READ ONLY 유지
- 테스트도 SELECT만
2. **APC 신뢰성**
- PostgreSQL apc 테이블이 마스터
- 애니팜에서 관리하는 공식 코드
3. **약국별 차이**
- 자체 바코드 사용 중인 약국 고려
- 기존 워크플로우 방해하지 않도록
4. **단계적 적용**
- 매핑 확인된 제품만 QR 출력 허용
- 미매핑 제품은 기존 방식 유지
---
*작성일: 2025-06-30*
*작성자: 용림 (Clawdbot)*
*상태: 기획 중*