feat(dispatch): Shopee 플랫폼 추가 + 받는 사람 정보 저장/출고 엑셀
- 플랫폼 TikTok/Shopee 분리: 업로드 화면이 선택에 따라 파일 안내 변경 (TikTok=Order Export xlsx, Shopee=Packing List xlsx / 라벨 PDF 선택) - TikTok Picking List.pdf 업로드 제거(피킹 요약은 데이터 엑셀로 생성) - 파서 공용화 + 헤더 행 자동탐지(Shopee 제목행 대응), 두 포맷 헤더 별칭 통합 - 받는 사람 이름/전화/주소를 박스 단위로 dispatch_db 에 저장(개인정보) · init SQL 갱신 + 기존 DB용 멱등 마이그레이션 dispatch_add_recipient_columns.sql - 출고 작업 카드: Package 제거, 받는 사람 이름(크게)+주소(여러 줄)+전화 표시 - 배치 다운로드 zip 에 취합 출고 엑셀 포함 파일명 YYYY.MM.DD(Ddd)_tictoc.xlsx / _shopee.xlsx (export.py) - 문서(CLAUDE.md, DISPATCH_MODULE.md) PII 보관·Shopee 반영 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+41
-13
@@ -1,4 +1,4 @@
|
||||
# 말레이시아 배송 모듈 (dispatch) — TikTok 출고관리
|
||||
# 말레이시아 배송 모듈 (dispatch) — TikTok·Shopee 출고관리
|
||||
|
||||
> 초보 물류 직원이 엑셀을 열지 않고 웹 화면만 보고 출고 작업을 하도록 만든 모듈.
|
||||
> main-app ERP 에 편입된 **모듈**이다(별도 앱/포트 아님). 인증은 기존 Google
|
||||
@@ -8,17 +8,29 @@
|
||||
|
||||
## 1. 무엇을 하나
|
||||
|
||||
TikTok Seller Center 에서 매일 받는 3개 파일을 업로드하면, 직원용 **출고 작업
|
||||
리스트(04_Daily_Dispatch_List)** 를 웹에서 자동 생성한다(엑셀 파일로 만들 필요 없음).
|
||||
플랫폼(TikTok·Shopee)에서 매일 받는 파일을 업로드하면, 직원용 **출고 작업
|
||||
리스트** 를 웹에서 자동 생성한다(엑셀 파일로 만들 필요 없음). 플랫폼마다 올리는
|
||||
파일이 다르며, 업로드 화면이 플랫폼 선택에 따라 바뀐다.
|
||||
|
||||
**TikTok**
|
||||
|
||||
| 파일 | 용도 | 업로드 |
|
||||
| --- | --- | --- |
|
||||
| 01_Picking_List.pdf | 전체 상품 피킹 참고용 | 선택(보관) |
|
||||
| 02_Shipping_Label_Packing_Slip.pdf | 실제 포장/라벨 부착 원본 | 선택(보관) |
|
||||
| 03_TikTok_Order_Export.xlsx | **자동 출고 리스트 기준 데이터** | **필수** |
|
||||
|
||||
작업 기준은 고객정보가 아니라 **Order ID / Package ID / Tracking ID / Seller SKU /
|
||||
Quantity** 뿐이다. 고객 이름·주소·전화는 파싱 단계에서 버려 **DB 에 저장하지 않는다.**
|
||||
> 01_Picking_List.pdf 는 더 이상 받지 않는다(피킹 요약은 데이터 엑셀로 생성).
|
||||
|
||||
**Shopee**
|
||||
|
||||
| 파일 | 용도 | 업로드 |
|
||||
| --- | --- | --- |
|
||||
| Shopee Seller Centre.pdf | 택배 송장(라벨) 원본 | 선택(보관) |
|
||||
| Packing List.Doorstep Delivery.xlsx | **자동 출고 리스트 기준 데이터** | **필수** |
|
||||
|
||||
작업 기준 키는 **Order ID / Package ID / Tracking ID / Seller SKU / Quantity** 이고,
|
||||
**받는 사람 이름·전화·주소**는 출고 작업 카드 표시 + 취합 출고 엑셀 생성을 위해
|
||||
박스 단위로 **dispatch_db 에 저장한다**(개인정보 — 접근/보관 정책 검토 대상).
|
||||
|
||||
### 1박스 묶음 규칙
|
||||
|
||||
@@ -90,12 +102,21 @@ cd /opt/www/main && docker compose up -d --build web
|
||||
업로드한 PDF/XLSX 원본은 아래에 저장되고 DB 에는 경로만 기록한다.
|
||||
|
||||
```
|
||||
# TikTok
|
||||
$DATA_DIR/dispatch/2026-06-19/<배치slug>_<HHMMSS>/
|
||||
01_Picking_List.pdf
|
||||
02_Shipping_Label_Packing_Slip.pdf
|
||||
03_TikTok_Order_Export.xlsx
|
||||
# Shopee
|
||||
$DATA_DIR/dispatch/2026-06-19/<배치slug>_<HHMMSS>/
|
||||
Shopee_Seller_Centre.pdf
|
||||
Packing_List.Doorstep_Delivery.xlsx
|
||||
```
|
||||
|
||||
배치 목록의 **다운로드** 버튼은 위 업로드 원본에 더해, 발송 날짜·고객 이름·전화·
|
||||
주소·상품명·아이템 코드·주문 수량·오더번호·택배사·송장번호·주문처를 취합한
|
||||
**출고 엑셀**을 같은 zip 에 함께 넣는다. 엑셀 파일명: `YYYY.MM.DD(Ddd)_tictoc.xlsx`
|
||||
(Shopee 는 끝이 `_shopee`).
|
||||
|
||||
같은 날짜/플랫폼이라도 batch_name 으로 구분해 **새 배치**로 생성된다(덮어쓰지 않음).
|
||||
예: "2026-06-19 TikTok 오전 출고", "2026-06-19 TikTok 오후 출고".
|
||||
|
||||
@@ -107,10 +128,14 @@ $DATA_DIR/dispatch/2026-06-19/<배치slug>_<HHMMSS>/
|
||||
- Quantity 가 비면 1 로 처리한다.
|
||||
- Tracking ID 가 숫자로 읽혀도 문자열로 보존한다(과학표기/`.0` 제거).
|
||||
- NaN/None 은 빈 문자열로 처리한다.
|
||||
- 고객 이름/주소/전화 컬럼은 매핑하지 않아 **읽는 즉시 버린다**(미저장).
|
||||
- 받는 사람 이름/전화/주소 컬럼은 매핑되면 **박스 단위로 보존**한다(작업 카드·엑셀).
|
||||
- 헤더가 첫 행이 아닐 수 있어(Shopee 는 제목 행이 위에 붙을 수 있음) 상단 몇 행을
|
||||
훑어 필수 컬럼이 잡히는 첫 행을 헤더로 본다.
|
||||
|
||||
가능한 헤더(앞뒤 공백·대소문자 무시): Order ID, Package ID, Tracking ID,
|
||||
Shipping Provider Name, Seller SKU, Product Name, Quantity.
|
||||
가능한 헤더(앞뒤 공백·대소문자 무시, TikTok·Shopee 별칭은 `store.COLUMN_ALIASES`):
|
||||
Order ID(또는 Order SN), Package ID, Tracking ID(또는 Tracking Number),
|
||||
Shipping Provider Name(또는 Shipping Option/Courier), Seller SKU(또는 SKU Reference No.),
|
||||
Product Name, Quantity, Recipient(받는 사람), Phone(전화), Address(주소).
|
||||
|
||||
---
|
||||
|
||||
@@ -128,6 +153,9 @@ python -m app.modules.dispatch.tests.test_grouping # 앱 의존성 설치 환
|
||||
|
||||
- 스택: FastAPI · PostgreSQL(psycopg3) · Jinja2 · 기존 ERP CSS(Bootstrap 미사용,
|
||||
레포 공통 `erp.css` 재사용) · **openpyxl**(스펙의 pandas 대신, 레포 의존성 경량 유지).
|
||||
- 코드: `app/modules/dispatch/` (`store.py` 순수 로직 / `parser.py` 엑셀 / `db.py`
|
||||
DB I/O / `router.py` 라우팅 / `templates/dispatch/` 화면).
|
||||
- 개인정보 미보관: 스키마에 이름/주소/전화 컬럼 자체가 없다.
|
||||
- 코드: `app/modules/dispatch/` (`store.py` 순수 로직 / `parser.py` 엑셀 파싱 /
|
||||
`export.py` 취합 출고 엑셀 생성 / `db.py` DB I/O / `router.py` 라우팅 /
|
||||
`templates/dispatch/` 화면).
|
||||
- 개인정보 보관: `dispatch_parcels.recipient_name/recipient_phone/recipient_address`.
|
||||
기존 DB 에는 마이그레이션 `scripts/sql/dispatch_add_recipient_columns.sql` 로 컬럼을
|
||||
추가한다(멱등). 접근/보관 기간 정책을 별도로 검토할 것.
|
||||
|
||||
Reference in New Issue
Block a user