7.6 KiB
7.6 KiB
🖼️ 동물약 이미지 매핑 계획
📋 목표
챗봇에서 동물약 추천 시 제품 이미지를 함께 표시
🗄️ 데이터 현황
MSSQL (약국 POS - PM_DRUG.CD_GOODS)
| 컬럼 | 설명 | 현황 |
|---|---|---|
DrugCode |
제품코드 | ✅ 전체 있음 (예: LB000003151) |
GoodsName |
제품명 | ✅ 전체 있음 |
BARCODE |
바코드 | ⚠️ 14/38개만 있음 (37%) |
BaseCode |
표준코드 | ❌ 0개 (사용 불가) |
PostgreSQL (애니팜 - apc 테이블)
| 컬럼 | 설명 |
|---|---|
idx |
고유 ID |
apc |
APC 코드 (고유) |
product_name |
제품명 |
image_url1 ~ image_url3 |
이미지 URL |
godoimage_url_f |
고도몰 CDN - 앞 이미지 |
godoimage_url_b |
고도몰 CDN - 뒤 이미지 |
godoimage_url_d |
고도몰 CDN - 상세 이미지 |
확인 필요: apc 테이블에 바코드 컬럼이 있는지?
🔗 매핑 전략
옵션 1: 바코드 매핑 (37% 커버)
MSSQL.BARCODE ↔ PostgreSQL.barcode(?)
- 장점: 정확한 매칭
- 단점: 14/38개만 매핑 가능
옵션 2: 제품명 유사도 매핑 (Fuzzy Matching)
from fuzzywuzzy import fuzz
# MSSQL: "다이로하트정M(12~22kg)"
# PostgreSQL: "다이로하트 정M 12~22kg" 등 유사 이름 매칭
score = fuzz.partial_ratio(mssql_name, pgsql_name)
if score > 80:
matched = True
- 장점: 100% 커버 가능
- 단점: 오매칭 위험
옵션 3: 매핑 테이블 생성 (권장) ✅
-- SQLite에 매핑 테이블 생성
CREATE TABLE drug_image_mapping (
id INTEGER PRIMARY KEY,
mssql_drug_code TEXT UNIQUE, -- MSSQL DrugCode
pgsql_apc TEXT, -- PostgreSQL apc 코드
image_url TEXT, -- 확정된 이미지 URL
verified BOOLEAN DEFAULT 0, -- 수동 검증 여부
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
작업 흐름:
- 바코드 매칭 (자동) → 14개 즉시 매핑
- 제품명 유사도로 후보 추천 → 관리자 확인
- 수동 매핑 → 나머지 제품
📊 MSSQL 동물약 바코드 현황 (38개)
✅ 바코드 있음 (14개)
| 제품명 | DrugCode | 바코드 |
|---|---|---|
| 가드L(20~40kg) | LB000003570 | 8801244508268 |
| 가드M(10~20kg) | LB000003569 | 8801244508237 |
| 가드S(2~10kg) | LB000003568 | 8801244508220 |
| 하트가드정L(10~20kg) | LB000003564 | 8801244508343 |
| 하트가드정M(5~10kg) | LB000003453 | 8801244508329 |
| 하트가드정S(2.5~5kg) | LB000003452 | 8801244508312 |
| 하트가드정SS(2.5kg이하) | LB000003451 | 8801244508305 |
| 심파리카L(10~25kg) | LB000003634 | 8801244508534 |
| 심파리카M(4~10kg) | LB000003635 | 8801244508435 |
| 안텔민 | S0000001 | 8809989000009 |
| 세레타정(10정) | LB000003146 | 8809720800455 |
| 파라칸L(5kg이상) | LB000003159 | 8809625390914 |
| 파라칸S(5kg이하) | LB000003160 | 8809625390655 |
| 하트칸츄어블(11kg이하) | LB000003696 | 8809625390563 |
❌ 바코드 없음 (24개)
| 제품명 | DrugCode |
|---|---|
| (동)클리어민50(100정) | LB000003504 |
| 넥스가드L(15~30kg) | LB000003531 |
| 넥스가드xs(2~3.5kg) | LB000003530 |
| 다이로하트정M(12~22kg) | LB000003151 |
| 다이로하트정S(5.6~11kg) | LB000003150 |
| 다이로하트정SS(5.6kg이하) | LB000003149 |
| 레보M(10~20kg) | LB000003161 |
| 레보S(2~10kg) | LB000003162 |
| 밀베마이신A정16mg(대동미어) | LB000003353 |
| 밀베마이신A정24mg(대동미어) | LB000003354 |
| 하트가드정XL(20~40kg) | LB000003545 |
| 안텔민사사(5kg이하) | LB000003158 |
| 안텔민킹(5kg이상) | LB000003157 |
| 캐치펫캅(2.5~7.5kg)/고양이 | LB000003167 |
| 캐치펫L(10~20kg)/개 | LB000003166 |
| 캐치펫M(5~10kg)/개 | LB000003165 |
| 캐치펫S(2.5~5kg)/개 | LB000003164 |
| 캐치펫SS(2.5kg이하/개,고양이가능) | LB000003163 |
| 하트플레이버블정L(23~45kg) | LB000003544 |
| 하트플레이버블정M(12~22kg) | LB000003152 |
| 하트플레이버블정mini(5.6kg이하) | LB000003154 |
| 하트플레이버블정S(5.6~11kg) | LB000003153 |
| 하트플라블러스정M(12~22kg) | LB000003155 |
| 하트플라블러스정S(11kg이하) | LB000003156 |
🛠️ 구현 단계
Phase 1: PostgreSQL 조사
- apc 테이블에 바코드 컬럼 확인
- 이미지 URL 실제 데이터 샘플 확인
- 동물약 제품 필터링 방법 확인 (
for_pets = true?)
Phase 2: 매핑 테이블 생성
- SQLite에
drug_image_mapping테이블 생성 - 바코드 있는 14개 자동 매핑 시도
- 관리자 페이지에 매핑 UI 추가
Phase 3: 챗봇 연동
- AI 응답에서 제품 매칭 시 이미지 URL 포함
- 프론트엔드에 이미지 표시 (썸네일)
- 클릭 시 큰 이미지 또는 상세 페이지
📝 다음 작업
-
PostgreSQL apc 테이블 샘플 조회
SELECT product_name, image_url1, godoimage_url_f FROM apc WHERE for_pets = true LIMIT 10; -
바코드 컬럼 존재 여부 확인
SELECT column_name FROM information_schema.columns WHERE table_name = 'apc' AND column_name LIKE '%barcode%';
🗃️ MSSQL 테이블 구조 상세
CD_GOODS vs CD_BARCODE 관계
CD_GOODS (제품 마스터) CD_BARCODE (바코드 마스터)
├── DrugCode (PK) ──────────► DRUGCODE (FK)
├── GoodsName ├── BARCODE (개별 바코드)
├── BARCODE (대표 바코드) ├── TITLECODE (대표 바코드)
├── BaseCode (❌ 비어있음) ├── BASECODE ✅ (100% 있음!)
├── SUNG_CODE ├── SUNG_CODE (성분코드)
└── Saleprice ├── DIK_CODE (의약품통합코드)
├── ETCNAME (제품명)
└── SPLNAME (제조사)
핵심 포인트:
CD_GOODS.BaseCode는 비어있음 (사용 안 함)CD_BARCODE.BASECODE에 표준코드 100% 있음!- 1개 제품(DrugCode)에 여러 바코드 가능 (낱개, 박스 등)
CD_BARCODE 매핑 키 통계
| 컬럼 | 보유율 | 설명 | 외부 매핑 |
|---|---|---|---|
BARCODE |
100% | 개별 바코드 | ⭐ PostgreSQL 매핑 가능 |
BASECODE |
100% | 표준코드 (식약처) | 인체용만 |
TITLECODE |
100% | 대표 바코드 | |
DIK_CODE |
68.2% | 의약품통합코드 | |
SUNG_CODE |
44.5% | 성분코드 |
동물약 특이사항
동물약 38개
├── CD_GOODS에 있음 ✅ (POS_BOON = '010103')
├── CD_BARCODE에 없음 ❌ (인체용 아님)
├── DrugCode가 "LB"로 시작 (로컬/자체 등록)
└── BASECODE 매핑 불가 → PostgreSQL(애니팜) 필요
🔗 PostgreSQL(애니팜) 매핑 전략
확인 필요 사항
PostgreSQL apc 테이블에서 확인할 컬럼:
-- 바코드 관련 컬럼 확인
SELECT column_name FROM information_schema.columns
WHERE table_name = 'apc'
AND column_name ILIKE '%barcode%';
-- 코드 관련 컬럼 확인
SELECT column_name FROM information_schema.columns
WHERE table_name = 'apc'
AND (column_name ILIKE '%code%' OR column_name ILIKE '%apc%');
예상 매핑 키
| MSSQL (CD_GOODS/BARCODE) | PostgreSQL (apc) | 매핑 방식 |
|---|---|---|
BARCODE |
barcode? |
직접 매핑 |
GoodsName |
product_name |
유사도 매칭 |
제조사 |
company_name |
보조 키 |
작성일: 2025-06-30 업데이트: 2025-06-30 - CD_BARCODE 구조 분석 추가 프로젝트: pharmacy-pos-qr-system