kdrug-inventory-system/analyze_product_deep.py
시골약사 38838e5ecf feat: 처방 관리 및 재고 원장 시스템 구현
## 처방 관리 (조제) 기능
- compounds API 추가 (목록/상세/환자별 조회)
- 조제 시 자동 재고 차감 (FIFO)
- 조제 내역 UI (EMR 스타일)
- 조제 상세보기 모달 (처방구성, 재고소비내역)
- 오늘/이번달 조제 통계 표시

## 재고 원장 시스템
- stock-ledger API 구현
- 입출고 내역 실시간 추적
- 재고 현황 페이지 개선 (통계 카드 추가)
- 입출고 원장 모달 UI
- 약재별/전체 입출고 내역 조회

## 확인된 동작
- 박주호 환자 오미자 200g 조제
- 재고 2000g → 1800g 정확히 차감
- 모든 입출고 stock_ledger에 기록

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-15 11:21:20 +00:00

84 lines
4.0 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
한약재 제품 코드 심층 분석
"""
import pandas as pd
def deep_analyze():
file_path = 'sample/(게시)한약재제품코드_2510.xlsx'
sheet_name = '한약재 제품코드_20250930기준(유효코드만 공지)'
# 데이터 읽기 - 제품코드를 문자열로 읽어서 0 유지
df = pd.read_excel(file_path, sheet_name=sheet_name, dtype={'제품코드': str})
print("=== 한약재 제품 코드 데이터 심층 분석 ===")
print(f"전체 데이터: {len(df):,}개 제품")
print(f"유일한 주성분코드: {df['주성분코드'].nunique()}")
print(f"유일한 약재 품목명: {df['한약재 품목명'].nunique()}")
print(f"유일한 업체: {df['업체명'].nunique()}")
# 주성분코드별 통계
print("\n=== 주성분코드별 제품 수 (상위 20개) ===")
ingredient_stats = df.groupby(['주성분코드', '한약재 품목명']).size().reset_index(name='제품수')
ingredient_stats = ingredient_stats.sort_values('제품수', ascending=False).head(20)
for _, row in ingredient_stats.iterrows():
print(f" {row['주성분코드']} ({row['한약재 품목명']}): {row['제품수']}개 제품")
# 업체별 통계
print("\n=== 업체별 제품 수 (상위 10개) ===")
company_stats = df['업체명'].value_counts().head(10)
for company, count in company_stats.items():
print(f" {company}: {count}개 제품")
# 규격별 분석
print("\n=== 약품 규격 분석 ===")
spec_stats = df['약품규격(단위)'].value_counts()
print("규격 단위별 제품 수:")
for spec, count in spec_stats.items():
print(f" {spec}: {count}")
# 특정 약재들 확인
print("\n=== 주요 약재 확인 ===")
target_herbs = ['건강', '감초', '당귀', '황기', '숙지황', '백출', '천궁', '육계', '백작약', '인삼', '생강', '대추']
for herb in target_herbs:
herb_data = df[df['한약재 품목명'] == herb]
if not herb_data.empty:
unique_code = herb_data['주성분코드'].iloc[0] if len(herb_data) > 0 else 'N/A'
product_count = len(herb_data)
company_count = herb_data['업체명'].nunique()
print(f" {herb}: 주성분코드={unique_code}, {product_count}개 제품, {company_count}개 업체")
else:
print(f" {herb}: 데이터 없음")
# 한 약재에 여러 제품이 있는 예시 - 건강
print("\n=== '건강' 약재의 제품 예시 (처음 10개) ===")
gangang_data = df[df['한약재 품목명'] == '건강'].head(10)
if not gangang_data.empty:
for _, row in gangang_data.iterrows():
# 제품코드를 9자리로 표시 (0 패딩)
product_code = str(row['제품코드']).zfill(9)
print(f" 업체: {row['업체명']}, 제품명: {row['제품명']}, 제품코드: {product_code}, 규격: {row['약품규격(숫자)']} {row['약품규격(단위)']}")
# 현재 시스템과의 비교
print("\n=== 현재 DB 설계와의 차이점 ===")
print("1. 현재 시스템:")
print(" - herb_items: 약재 기본 정보 (예: 건강)")
print(" - inventory_lots: 로트별 재고 (원산지, 가격 등)")
print("\nㅇ2. 제품코드 시스템:")
print(" - 주성분코드: 약재별 고유 코드 (예: 3050H1AHM = 건강)")
print(" - 제품코드: 업체별 제품 고유코드")
print(" - 표준코드/대표코드: 바코드 시스템")
print(" - 규격: 포장 단위 (500g, 1000g 등)")
print("\n=== 시사점 ===")
print("- 54,000개 이상의 유통 제품이 454개 주성분코드로 분류됨")
print("- 같은 약재(주성분)라도 업체별로 다른 제품명과 코드를 가짐")
print("- 제품별로 다양한 포장 규격 존재 (-, 500g, 600g, 1000g 등)")
print("- 표준코드(바코드)를 통한 제품 식별 가능")
if __name__ == "__main__":
deep_analyze()