# πŸ–ΌοΈ 동물약 이미지 λ§€ν•‘ κ³„νš ## πŸ“‹ λͺ©ν‘œ μ±—λ΄‡μ—μ„œ 동물약 μΆ”μ²œ μ‹œ **μ œν’ˆ 이미지**λ₯Ό ν•¨κ»˜ ν‘œμ‹œ --- ## πŸ—„οΈ 데이터 ν˜„ν™© ### 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) ```python 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: λ§€ν•‘ ν…Œμ΄λΈ” 생성 (ꢌμž₯) βœ… ```sql -- 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 ); ``` **μž‘μ—… 흐름:** 1. λ°”μ½”λ“œ λ§€μΉ­ (μžλ™) β†’ 14개 μ¦‰μ‹œ λ§€ν•‘ 2. μ œν’ˆλͺ… μœ μ‚¬λ„λ‘œ 후보 μΆ”μ²œ β†’ κ΄€λ¦¬μž 확인 3. μˆ˜λ™ λ§€ν•‘ β†’ λ‚˜λ¨Έμ§€ μ œν’ˆ --- ## πŸ“Š 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 포함 - [ ] ν”„λ‘ νŠΈμ—”λ“œμ— 이미지 ν‘œμ‹œ (썸넀일) - [ ] 클릭 μ‹œ 큰 이미지 λ˜λŠ” 상세 νŽ˜μ΄μ§€ --- ## πŸ“ λ‹€μŒ μž‘μ—… 1. **PostgreSQL apc ν…Œμ΄λΈ” μƒ˜ν”Œ 쑰회** ```sql SELECT product_name, image_url1, godoimage_url_f FROM apc WHERE for_pets = true LIMIT 10; ``` 2. **λ°”μ½”λ“œ 컬럼 쑴재 μ—¬λΆ€ 확인** ```sql 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` ν…Œμ΄λΈ”μ—μ„œ 확인할 컬럼: ```sql -- λ°”μ½”λ“œ κ΄€λ ¨ 컬럼 확인 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*