99eea01fc1
03_TikTok_Order_Export.xlsx 업로드 → 1박스=1카드 출고 작업 리스트, SKU 피킹 요약, Kagayaku 전달표(A4 인쇄)를 자동 생성. - 1박스 묶음 기준: Package ID > Tracking ID > Order ID, 같은 박스 같은 SKU 합산 - 작업 상태 5단계 토글(AJAX 즉시 저장) + dispatch_logs 기록 - 고객 이름/주소/전화 미저장(파싱 시 폐기, 스키마에 컬럼 없음) - 엑셀은 openpyxl 파싱(pandas 미사용), DB는 dispatch_db 전용 - 인증은 기존 Google OAuth + 신규 권한키 dispatch 재사용 - scripts/sql/dispatch_db_init.sql, docs/DISPATCH_MODULE.md 동봉 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
"""말레이시아 TikTok 출고관리(dispatch) 모듈.
|
|
|
|
라우터/저장소/파서/템플릿을 한 디렉토리에서 관리한다.
|
|
- 라우터: `router.py` (FastAPI APIRouter, prefix=/dispatch)
|
|
- 저장소: `db.py` (dispatch_db / PostgreSQL 전용)
|
|
- 파서: `parser.py` (TikTok Order Export XLSX → 박스 묶기, openpyxl)
|
|
- 순수 로직: `store.py` (컬럼 정규화/박스 묶기/SKU 합산/상태 상수)
|
|
- 템플릿: `templates/dispatch/`
|
|
|
|
데이터 저장은 dispatch_db 전용이다. DISPATCH_DB_URL 미설정 시
|
|
build_dispatch_store 는 None 을 반환하고, 라우터가 "설정 필요" 안내 페이지를
|
|
보여준다(앱은 죽지 않음).
|
|
|
|
업로드 원본 파일은 DATA_DIR/dispatch/<날짜>/<배치>/ 아래에 저장하고, DB 에는
|
|
경로만 기록한다. 고객 이름/주소/전화 등 개인정보는 저장하지 않는다.
|
|
"""
|
|
|
|
from typing import Any
|
|
|
|
from . import store
|
|
from .parser import ParseError, parse_order_export
|
|
from .router import router
|
|
from .store import STATUS_FIELDS, STATUS_LABELS, group_parcels, sku_summary
|
|
|
|
__all__ = [
|
|
"router",
|
|
"store",
|
|
"STATUS_FIELDS",
|
|
"STATUS_LABELS",
|
|
"group_parcels",
|
|
"sku_summary",
|
|
"parse_order_export",
|
|
"ParseError",
|
|
"build_dispatch_store",
|
|
]
|
|
|
|
|
|
def build_dispatch_store(*, dsn: str | None) -> Any:
|
|
"""DISPATCH_DB_URL 이 있으면 DispatchStore, 없으면 None.
|
|
|
|
JSON 폴백을 두지 않는다(운영 데이터 분기 방지). None 이면 라우터가 안내 표시.
|
|
"""
|
|
if not dsn:
|
|
return None
|
|
from .db import DispatchStore # 지연 import (개발 환경 deps 없을 수 있음)
|
|
|
|
return DispatchStore(dsn)
|