refactor: 주성분코드 기반 데이터베이스 리팩토링 완료
DB 구조 개선: - 454개 주성분코드 기반 herb_masters 테이블 생성 - 53,769개 제품 데이터를 herb_products 테이블에 임포트 - 128개 업체 정보를 product_companies 테이블에 추가 - 기존 herb_items에 ingredient_code 매핑 (100% 완료) UI/API 개선: - 급여 약재 보유 현황 표시 (28/454 = 6.2%) - 재고 현황에 프로그레스 바 추가 - 주성분코드 기준 통계 API 추가 문서화: - 데이터베이스 리팩토링 제안서 작성 - 리팩토링 결과 보고서 작성 - 백업 정보 문서화 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
58
docs/대규모리팩토링.md
Normal file
58
docs/대규모리팩토링.md
Normal file
@@ -0,0 +1,58 @@
|
||||
|
||||
우리 기존설계에 변화가 필요해
|
||||
|
||||
약품 마스터 테이블을 별도로만들어야겟어
|
||||
|
||||
대한민국에서 주기적으로
|
||||
|
||||
한약재 제품코드를 표준화해서 제공한다
|
||||
|
||||
|
||||
|
||||
한약재 품목명, 업체명, 제품명 약품규격 (숫자) 약품 규격(단위) 제공을하고
|
||||
|
||||
"주성분코드" 를 제공하고 이게 FK가 되야할거같아
|
||||
|
||||
|
||||
그리고 해당 성분코드에 여러 제품들이 있는거지
|
||||
|
||||
|
||||
|
||||
|
||||
▶ 표준코드: 개개의 의약품을 식별하기 위해 고유하게 설정된 번호
|
||||
- 국가식별코드, 업체식별코드, 품목코드* 및 검증번호로 구성(13자리 숫자)
|
||||
* 품목코드는 함량포함한 품목코드(4자리)와 포장단위(1자리)로 구성되어 있음
|
||||
|
||||
|
||||
▶ 대표코드: 표준코드의 12번째 자리가 '0'인 코드를 말함(실제 의약품에 부착하는 코드로 사용불가)
|
||||
|
||||
|
||||
▶ 제품코드: 한약재 비용 청구시 사용하는 코드
|
||||
- 업체식별코드와 품목코드로 구성(9자리 숫자)
|
||||
- 9자리 중 제일 마지막 숫자인 포장단위는 대표코드와 동일하게 "0"임
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
우리 입고장에
|
||||
|
||||
건강 : 062400730 9자리숫자는 진짜 해당제품에 "제품코드" 인것이고
|
||||
|
||||
|
||||
해당 건강에 성분 코드는 별도로 존재하는거지 "성분코드로는"
|
||||
|
||||
|
||||
같은 성분 코드를 지닌 다른 회사 제품도 있을수잇는거고
|
||||
|
||||
우리는 성분 코드 기반으로 효능 태그를 사실상 해야할수도잇어
|
||||
|
||||
|
||||
성분코드 = 실제성분이름 1:1 맵핑일거니까
|
||||
|
||||
일단 기존 코드를 두고 프론트에서 봐가면서 마이그레이션 해가야하니까
|
||||
|
||||
|
||||
우리 일단 xls파일을 확인하고 sqlite에 마이그레이션 해줘 약품 마스터 테이블을 만들어서 가능할까?
|
||||
210
docs/데이터베이스_리팩토링_제안.md
Normal file
210
docs/데이터베이스_리팩토링_제안.md
Normal file
@@ -0,0 +1,210 @@
|
||||
# 한약재 재고관리 시스템 데이터베이스 리팩토링 제안
|
||||
|
||||
## 📊 현황 분석
|
||||
|
||||
### 1. 한약재제품코드 엑셀 분석 결과
|
||||
- **전체 데이터**: 53,775개 제품
|
||||
- **주성분코드**: 454개 (약재별 고유 코드)
|
||||
- **업체 수**: 128개
|
||||
- **포장 규격**: -, 500g, 600g, 1000g, 1200g, 6000g 등 다양
|
||||
|
||||
### 2. 핵심 발견사항
|
||||
1. **표준화된 주성분코드 체계 존재**
|
||||
- 예: 3017H1AHM = 건강
|
||||
- 예: 3007H1AHM = 감초
|
||||
- 예: 3105H1AHM = 당귀
|
||||
|
||||
2. **동일 약재, 다양한 제품**
|
||||
- 건강: 246개 제품, 70개 업체
|
||||
- 감초: 284개 제품, 73개 업체
|
||||
- 각 업체마다 고유한 제품명과 제품코드 보유
|
||||
|
||||
3. **바코드 시스템**
|
||||
- 표준코드 (13자리)
|
||||
- 대표코드 (13자리)
|
||||
- 제품코드 (9자리, 0 포함)
|
||||
|
||||
## 🏗️ 현재 시스템 vs 개선안
|
||||
|
||||
### 현재 시스템 구조
|
||||
```
|
||||
herb_items (약재 마스터)
|
||||
├── herb_item_id
|
||||
├── insurance_code
|
||||
├── herb_name
|
||||
└── is_active
|
||||
|
||||
inventory_lots (재고 로트)
|
||||
├── lot_id
|
||||
├── herb_item_id (FK)
|
||||
├── origin_country
|
||||
├── unit_price_per_g
|
||||
└── quantity_onhand
|
||||
```
|
||||
|
||||
### 제안하는 개선 구조
|
||||
|
||||
#### 1단계: 주성분코드 기반 약재 마스터
|
||||
```sql
|
||||
-- 약재 마스터 (주성분코드 기준)
|
||||
CREATE TABLE herb_masters (
|
||||
ingredient_code VARCHAR(10) PRIMARY KEY, -- 예: 3017H1AHM
|
||||
herb_name VARCHAR(100) NOT NULL, -- 예: 건강
|
||||
herb_name_hanja VARCHAR(100), -- 예: 乾薑
|
||||
herb_name_latin VARCHAR(200), -- 예: Zingiberis Rhizoma Siccus
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 제품 마스터 (업체별 제품)
|
||||
CREATE TABLE herb_products (
|
||||
product_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
ingredient_code VARCHAR(10) NOT NULL, -- 주성분코드
|
||||
product_code VARCHAR(9) NOT NULL UNIQUE, -- 9자리 제품코드 (0 포함)
|
||||
company_name VARCHAR(200) NOT NULL, -- 업체명
|
||||
product_name VARCHAR(200) NOT NULL, -- 제품명
|
||||
standard_code VARCHAR(13), -- 표준코드 (바코드)
|
||||
representative_code VARCHAR(13), -- 대표코드
|
||||
package_size VARCHAR(20), -- 약품규격(숫자)
|
||||
package_unit VARCHAR(20), -- 약품규격(단위)
|
||||
valid_from DATE, -- 적용시작일
|
||||
valid_to DATE, -- 적용종료일
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (ingredient_code) REFERENCES herb_masters(ingredient_code)
|
||||
);
|
||||
|
||||
-- 인덱스 추가
|
||||
CREATE INDEX idx_product_ingredient ON herb_products(ingredient_code);
|
||||
CREATE INDEX idx_product_company ON herb_products(company_name);
|
||||
CREATE INDEX idx_product_barcode ON herb_products(standard_code);
|
||||
```
|
||||
|
||||
#### 2단계: 재고 관리 개선
|
||||
```sql
|
||||
-- 재고 로트 (제품별 관리)
|
||||
CREATE TABLE inventory_lots_v2 (
|
||||
lot_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
product_id INTEGER NOT NULL, -- 제품 ID
|
||||
lot_no VARCHAR(50), -- 로트번호
|
||||
origin_country VARCHAR(50), -- 원산지
|
||||
manufacture_date DATE, -- 제조일자
|
||||
expiry_date DATE, -- 유통기한
|
||||
received_date DATE NOT NULL, -- 입고일자
|
||||
quantity_onhand DECIMAL(10,2) NOT NULL, -- 현재고량
|
||||
unit_price_per_g DECIMAL(10,2) NOT NULL, -- 단가
|
||||
is_depleted BOOLEAN DEFAULT FALSE,
|
||||
supplier_id INTEGER,
|
||||
receipt_id INTEGER,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (product_id) REFERENCES herb_products(product_id)
|
||||
);
|
||||
```
|
||||
|
||||
## 🔄 마이그레이션 전략
|
||||
|
||||
### Phase 1: 기초 데이터 구축
|
||||
1. **주성분코드 마스터 데이터 임포트**
|
||||
- 454개 주성분코드와 약재명 매핑
|
||||
- 기존 herb_items와 매칭
|
||||
|
||||
2. **제품 데이터 임포트**
|
||||
- 53,775개 제품 데이터 임포트
|
||||
- 업체별, 규격별 제품 정보 저장
|
||||
|
||||
### Phase 2: 기존 데이터 마이그레이션
|
||||
1. **기존 재고 데이터 매핑**
|
||||
- 현재 herb_items → 적절한 product_id로 매핑
|
||||
- 원산지 정보 유지
|
||||
|
||||
2. **입고 내역 연결**
|
||||
- purchase_receipt_lines → 새로운 product_id 연결
|
||||
|
||||
### Phase 3: 시스템 전환
|
||||
1. **바코드 스캔 기능 추가**
|
||||
- 표준코드로 제품 식별
|
||||
- 자동 입고 처리
|
||||
|
||||
2. **업체별 제품 선택 UI**
|
||||
- 약재 선택 시 업체/제품 선택 가능
|
||||
- 규격별 재고 관리
|
||||
|
||||
## 💡 장점
|
||||
|
||||
1. **표준화**
|
||||
- 건강보험 급여 코드체계와 일치
|
||||
- 업계 표준 바코드 시스템 활용
|
||||
|
||||
2. **정확성**
|
||||
- 업체별, 규격별 정확한 재고 관리
|
||||
- 제품 추적성 향상
|
||||
|
||||
3. **확장성**
|
||||
- 새로운 업체/제품 쉽게 추가
|
||||
- 바코드 스캔 등 자동화 가능
|
||||
|
||||
4. **호환성**
|
||||
- 외부 시스템과 데이터 교환 용이
|
||||
- 도매상 시스템과 연동 가능
|
||||
|
||||
## 🚀 구현 우선순위
|
||||
|
||||
### 즉시 구현 가능
|
||||
1. herb_masters 테이블 생성 및 데이터 임포트
|
||||
2. herb_products 테이블 생성 및 데이터 임포트
|
||||
3. 기존 herb_items에 ingredient_code 컬럼 추가
|
||||
|
||||
### 단계적 구현
|
||||
1. 입고 시 제품코드/바코드 입력 기능
|
||||
2. 재고 조회 시 제품별 표시
|
||||
3. 바코드 스캔 기능 (웹캠 또는 스캐너)
|
||||
|
||||
### 장기 계획
|
||||
1. 도매상 API 연동
|
||||
2. 자동 발주 시스템
|
||||
3. 유통기한 관리
|
||||
|
||||
## 📝 예시 쿼리
|
||||
|
||||
### 건강(乾薑) 제품 조회
|
||||
```sql
|
||||
SELECT
|
||||
p.product_name,
|
||||
p.company_name,
|
||||
p.package_size || p.package_unit as package,
|
||||
p.product_code
|
||||
FROM herb_products p
|
||||
JOIN herb_masters m ON p.ingredient_code = m.ingredient_code
|
||||
WHERE m.herb_name = '건강'
|
||||
ORDER BY p.company_name, p.package_size;
|
||||
```
|
||||
|
||||
### 바코드로 제품 찾기
|
||||
```sql
|
||||
SELECT
|
||||
m.herb_name,
|
||||
p.product_name,
|
||||
p.company_name
|
||||
FROM herb_products p
|
||||
JOIN herb_masters m ON p.ingredient_code = m.ingredient_code
|
||||
WHERE p.standard_code = '8800680001104';
|
||||
```
|
||||
|
||||
## ⚠️ 주의사항
|
||||
|
||||
1. **데이터 무결성**
|
||||
- 제품코드 9자리 유지 (앞자리 0 포함)
|
||||
- 날짜 형식 변환 (20201120 → 2020-11-20)
|
||||
|
||||
2. **하위 호환성**
|
||||
- 기존 기능 유지하면서 점진적 마이그레이션
|
||||
- 임시로 dual-write 전략 사용 가능
|
||||
|
||||
3. **성능 고려**
|
||||
- 53,775개 제품 데이터 인덱싱 필수
|
||||
- 자주 사용하는 쿼리 최적화
|
||||
|
||||
---
|
||||
|
||||
작성일: 2026-02-15
|
||||
작성자: Claude Assistant
|
||||
Reference in New Issue
Block a user