feat(dispatch): 말레이시아 TikTok 출고관리 모듈 추가

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>
This commit is contained in:
2026-06-19 15:11:43 +09:00
parent 8453c425f8
commit 99eea01fc1
19 changed files with 1868 additions and 0 deletions
+47
View File
@@ -0,0 +1,47 @@
"""말레이시아 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)