feat: 입고 시 herb_products에서 자동 정보 매핑
주요 개선사항: 1. 보험코드로 herb_products 테이블에서 자동 정보 조회 - 성분코드(ingredient_code) 자동 매핑 - 회사명(specification) 자동 입력 - 표준 제품명 자동 적용 2. 입고 날짜 처리 버그 수정 - pandas groupby 튜플 문제 해결 - receipt_date 문자열 변환 처리 - 입고번호 정상 생성 (PR-YYYYMMDD-XXXX) 3. 데이터 타입 문제 수정 - total_amount numpy 타입을 float로 변환 - JSON 직렬화 오류 방지 이제 Excel 입고 시 보험코드만으로 모든 정보 자동 입력 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
1198c22083
commit
849c2dd561
101
app.py
101
app.py
@ -545,12 +545,18 @@ def upload_purchase_excel():
|
|||||||
return jsonify({'success': False, 'error': '유효하지 않은 도매상입니다'}), 400
|
return jsonify({'success': False, 'error': '유효하지 않은 도매상입니다'}), 400
|
||||||
|
|
||||||
# 날짜별로 그룹화 (도매상은 이미 선택됨)
|
# 날짜별로 그룹화 (도매상은 이미 선택됨)
|
||||||
grouped = df.groupby(['receipt_date'])
|
grouped = df.groupby('receipt_date') # 리스트 대신 문자열로 변경
|
||||||
|
|
||||||
for receipt_date, group in grouped:
|
for receipt_date, group in grouped:
|
||||||
|
# receipt_date가 튜플인 경우 처리
|
||||||
|
if isinstance(receipt_date, tuple):
|
||||||
|
receipt_date = receipt_date[0]
|
||||||
|
|
||||||
|
# receipt_date를 문자열로 확실히 변환
|
||||||
|
receipt_date_str = str(receipt_date)
|
||||||
|
|
||||||
# 입고장 번호 생성 (PR-YYYYMMDD-XXXX)
|
# 입고장 번호 생성 (PR-YYYYMMDD-XXXX)
|
||||||
date_str = str(receipt_date).replace('-', '')
|
date_str = receipt_date_str.replace('-', '')
|
||||||
|
|
||||||
# 해당 날짜의 최대 번호 찾기
|
# 해당 날짜의 최대 번호 찾기
|
||||||
cursor.execute("""
|
cursor.execute("""
|
||||||
@ -564,30 +570,93 @@ def upload_purchase_excel():
|
|||||||
receipt_no = f"PR-{date_str}-{next_num:04d}"
|
receipt_no = f"PR-{date_str}-{next_num:04d}"
|
||||||
|
|
||||||
# 입고장 헤더 생성
|
# 입고장 헤더 생성
|
||||||
total_amount = group['total_amount'].sum()
|
total_amount = float(group['total_amount'].sum()) # float로 변환하여 numpy 타입 문제 해결
|
||||||
cursor.execute("""
|
cursor.execute("""
|
||||||
INSERT INTO purchase_receipts (supplier_id, receipt_date, receipt_no, total_amount, source_file)
|
INSERT INTO purchase_receipts (supplier_id, receipt_date, receipt_no, total_amount, source_file)
|
||||||
VALUES (?, ?, ?, ?, ?)
|
VALUES (?, ?, ?, ?, ?)
|
||||||
""", (supplier_id, str(receipt_date), receipt_no, total_amount, filename))
|
""", (supplier_id, receipt_date_str, receipt_no, total_amount, filename))
|
||||||
receipt_id = cursor.lastrowid
|
receipt_id = cursor.lastrowid
|
||||||
|
|
||||||
# 입고장 라인 생성
|
# 입고장 라인 생성
|
||||||
for _, row in group.iterrows():
|
for _, row in group.iterrows():
|
||||||
# 약재 확인/생성
|
insurance_code = row.get('insurance_code')
|
||||||
cursor.execute("""
|
|
||||||
SELECT herb_item_id FROM herb_items
|
|
||||||
WHERE insurance_code = ? OR herb_name = ?
|
|
||||||
""", (row.get('insurance_code'), row['herb_name']))
|
|
||||||
herb = cursor.fetchone()
|
|
||||||
|
|
||||||
if not herb:
|
# 보험코드가 있는 경우 herb_products에서 정보 가져오기
|
||||||
|
if insurance_code:
|
||||||
cursor.execute("""
|
cursor.execute("""
|
||||||
INSERT INTO herb_items (insurance_code, herb_name)
|
SELECT DISTINCT
|
||||||
VALUES (?, ?)
|
hp.ingredient_code,
|
||||||
""", (row.get('insurance_code'), row['herb_name']))
|
hp.product_name,
|
||||||
herb_item_id = cursor.lastrowid
|
hp.company_name
|
||||||
|
FROM herb_products hp
|
||||||
|
WHERE hp.product_code = ?
|
||||||
|
""", (insurance_code,))
|
||||||
|
product_info = cursor.fetchone()
|
||||||
|
|
||||||
|
if product_info:
|
||||||
|
ingredient_code = product_info[0]
|
||||||
|
product_name = product_info[1]
|
||||||
|
company_name = product_info[2]
|
||||||
|
|
||||||
|
# herb_items에서 해당 보험코드 제품 확인
|
||||||
|
cursor.execute("""
|
||||||
|
SELECT herb_item_id FROM herb_items
|
||||||
|
WHERE insurance_code = ?
|
||||||
|
""", (insurance_code,))
|
||||||
|
herb = cursor.fetchone()
|
||||||
|
|
||||||
|
if not herb:
|
||||||
|
# 새 제품 생성 (ingredient_code, company_name 포함)
|
||||||
|
cursor.execute("""
|
||||||
|
INSERT INTO herb_items (
|
||||||
|
ingredient_code,
|
||||||
|
insurance_code,
|
||||||
|
herb_name,
|
||||||
|
specification
|
||||||
|
) VALUES (?, ?, ?, ?)
|
||||||
|
""", (ingredient_code, insurance_code, product_name, company_name))
|
||||||
|
herb_item_id = cursor.lastrowid
|
||||||
|
else:
|
||||||
|
herb_item_id = herb[0]
|
||||||
|
# 기존 제품의 ingredient_code가 없으면 업데이트
|
||||||
|
cursor.execute("""
|
||||||
|
UPDATE herb_items
|
||||||
|
SET ingredient_code = COALESCE(ingredient_code, ?),
|
||||||
|
specification = COALESCE(specification, ?)
|
||||||
|
WHERE herb_item_id = ?
|
||||||
|
""", (ingredient_code, company_name, herb_item_id))
|
||||||
|
else:
|
||||||
|
# herb_products에 없는 경우 기존 로직
|
||||||
|
cursor.execute("""
|
||||||
|
SELECT herb_item_id FROM herb_items
|
||||||
|
WHERE insurance_code = ? OR herb_name = ?
|
||||||
|
""", (insurance_code, row['herb_name']))
|
||||||
|
herb = cursor.fetchone()
|
||||||
|
|
||||||
|
if not herb:
|
||||||
|
cursor.execute("""
|
||||||
|
INSERT INTO herb_items (insurance_code, herb_name)
|
||||||
|
VALUES (?, ?)
|
||||||
|
""", (insurance_code, row['herb_name']))
|
||||||
|
herb_item_id = cursor.lastrowid
|
||||||
|
else:
|
||||||
|
herb_item_id = herb[0]
|
||||||
else:
|
else:
|
||||||
herb_item_id = herb[0]
|
# 보험코드가 없는 경우 약재명으로만 처리
|
||||||
|
cursor.execute("""
|
||||||
|
SELECT herb_item_id FROM herb_items
|
||||||
|
WHERE herb_name = ?
|
||||||
|
""", (row['herb_name'],))
|
||||||
|
herb = cursor.fetchone()
|
||||||
|
|
||||||
|
if not herb:
|
||||||
|
cursor.execute("""
|
||||||
|
INSERT INTO herb_items (herb_name)
|
||||||
|
VALUES (?)
|
||||||
|
""", (row['herb_name'],))
|
||||||
|
herb_item_id = cursor.lastrowid
|
||||||
|
else:
|
||||||
|
herb_item_id = herb[0]
|
||||||
|
|
||||||
# 단가 계산 (총액 / 수량)
|
# 단가 계산 (총액 / 수량)
|
||||||
quantity = float(row['quantity'])
|
quantity = float(row['quantity'])
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user