์ด๋ฆ: ๋ฌผ๋ฅ ๋ฐ์ดํฐ ํตํฉ ์์คํ
๋ชฉ์ : ๋ฌผ๋ฅ ํ์ฅ์์ ๋ฐ์ํ๋ ์ ๊ฐ๊ฐ์ธ ์์
/CSV ๋ฐ์ดํฐ๋ฅผ ํ๋๋ก ํตํฉํ๊ณ , 3PL ๋ฐฐ์ก ์์์ผ๋ก ์๋ ๋ณํ
๊ธฐ์ ์คํ: Python, Streamlit, Pandas, OpenPyXL, XlsxWriter
GitHub: https://github.com/urimeee/LogiFlow-Auto
์คํ ์ค์ธ ์๋น์ค: https://3000-ip2l928h0vug305w91va9-d0b9e1e2.sandbox.novita.ai
์ URL๋ก ์ ์ํ์ฌ ๋ฐ๋ก ์ฌ์ฉํ์ค ์ ์์ต๋๋ค!
git clone https://github.com/urimeee/LogiFlow-Auto.git
cd LogiFlow-Autopython -m venv venv
source venv/bin/activate # Linux/Mac
# ๋๋
venv\Scripts\activate # Windowspip install -r requirements.txt# .env.example ํ์ผ์ .env๋ก ๋ณต์ฌ
cp .env.example .env
# .env ํ์ผ ํธ์ง (ํ์ํ ๊ฒฝ์ฐ)
# API_KEY=your_api_key_herestreamlit run app.py๋ธ๋ผ์ฐ์ ์์ http://localhost:8501๋ก ์ ์ํ์ธ์.
- ์ ๋ GitHub์ ์ปค๋ฐํ์ง ๋ง์ธ์!
.env.exampleํ ํ๋ฆฟ์ ์ฐธ๊ณ ํ์ฌ.envํ์ผ ์์ฑ- API ํค, ๋น๋ฐ๋ฒํธ ๋ฑ ๋ฏผ๊ฐํ ์ ๋ณด๋
.env์๋ง ์ ์ฅ
# ์ ํ๋ฆฌ์ผ์ด์
์ค์
APP_NAME=๋ฌผ๋ฅ ๋ฐ์ดํฐ ํตํฉ ์์คํ
APP_VERSION=3.16
MAX_UPLOAD_SIZE=200
LOG_LEVEL=INFO
# ํฅํ ํ์ฅ ๊ฐ๋ฅ (API ํค ๋ฑ)
# API_KEY=your_api_key_here
# SECRET_KEY=your_secret_key_here์์คํ ์ ๋ค์ 32๊ฐ์ ํ์ค 3PL ๋ฐฐ์ก ์์ ์ปฌ๋ผ์ ์ถ๋ ฅํฉ๋๋ค:
| # | ์ปฌ๋ผ๋ช | ๊ฐ ์์ | ์ค๋ช |
|---|---|---|---|
| 1 | ์ผํ๋ชฐ ์ฝ๋ | ONLINE1 | ๊ณ ์ ๊ฐ |
| 2 | ์ผํ๋ชฐ ์ด๋ฆ | ์นดํ24, ์ฑ, ์ฟ ํก, ๋ค์ด๋ฒ | ํ๋ซํผ ์๋ ๊ฐ์ง |
| 3 | ์ผํ๋ชฐ ๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ | (์ฃผ๋ฌธ๋ฒํธ์ ๋์ผ) | ์๋ ๋ณต์ฌ |
| 4 | ๋ฌถ์๋ฐฐ์ก์ ๋ฌด | ์ | ๊ณ ์ ๊ฐ |
| 5 | ์ ์์ผ์ | 2026-02-25 | ์ค๋ ๋ ์ง ์๋ ์ ๋ ฅ |
| 6 | ๊ฒฐ์ ์ผ์ | 2026-02-25 | ์ค๋ ๋ ์ง ์๋ ์ ๋ ฅ |
| 7 | ์์ทจ์ธ ์์ธ ์ฃผ์ | . | ๊ณ ์ ๊ฐ |
| 8 | ์์ทจ์ธ ์ ํ[์์ฌ ๋ฒํธ] | (์์ทจ์ธ ํธ๋ํฐ) | ์๋ ๋ณต์ฌ |
| 9 | ์์ทจ์ธ ์ ํ๋ฒํธ | (์์ทจ์ธ ํธ๋ํฐ) | ์๋ ๋ณต์ฌ |
| 10 | ์์ทจ์ธ ๊ฑด๋ฌผ ๊ด๋ฆฌ๋ฒํธ | (๊ณต๋ฐฑ) | ๋น ๊ฐ |
| 11 | ์ฃผ๋ฌธ์ ๋ช | (์์ทจ์ธ ๋ช ) | ์๋ ๋ณต์ฌ |
| 12 | ์ฃผ๋ฌธ์ ์ด๋ฉ์ผ | AA@aa.com | ๊ณ ์ ๊ฐ |
| 13 | ์์ทจ์ธ ์ฐํธ๋ฒํธ | (๊ณต๋ฐฑ) | ๋น ๊ฐ |
| 14 | ์์ทจ์ธ ์ฃผ์ ์ ํ | ๋ฏธํ์ธ | ๊ณ ์ ๊ฐ |
| 15 | ์ฃผ๋ฌธ์ ์ ํ[์์ฌ ๋ฒํธ] | (์์ทจ์ธ ํธ๋ํฐ) | ์๋ ๋ณต์ฌ |
| 16 | ์ฃผ๋ฌธ์ ์ ํ๋ฒํธ | (์์ทจ์ธ ํธ๋ํฐ) | ์๋ ๋ณต์ฌ |
| 17 | ์ฃผ๋ฌธ์ ํธ๋ํฐ | (์์ทจ์ธ ํธ๋ํฐ) | ์๋ ๋ณต์ฌ |
| 18 | ์ถ๊ฐ ์ํ ์ฌ๋ถ | ์ถ๊ฐ์ํ | ๊ณ ์ ๊ฐ |
| 19 | ํ๋ฐฐ ์ด์ ์ง๋ถ ๋ฐฉ์ | ์ ์ฉ | ๊ณ ์ ๊ฐ |
| 20 | ์ผํ๋ชฐ ์ฃผ๋ฌธ ๋ผ์ธ๋ฒํธ | 1, 2, 3... | ์์ฐจ ๋ฒํธ (v3.4+) |
| 21 | ๊ฒฐ์ ๊ธ์ก | (๊ณต๋ฐฑ) | ๋น ๊ฐ |
| 22 | ๊ณ ๊ฐ ์ฐธ์กฐ๋ฒํธ | (๊ณต๋ฐฑ) | ๋น ๊ฐ |
| 23 | ์์ฒญ(ํฌ๋ง)๋ฐฐ์ก ์ผ์ | 2026-02-25 | ์ค๋ ๋ ์ง (v3.4+) |
| 24 | ์ผํ๋ชฐ ์ฃผ๋ฌธ๋ฒํธ | 20260220-0000171 | ์ฃผ๋ฌธ๋ฒํธ |
| 25 | ์์ทจ์ธ ๋ช | ํ๊ธธ๋ | ์๋ณธ ๋ฐ์ดํฐ |
| 26 | ์์ทจ์ธ ํธ๋ํฐ | 010-1234-5678 | ์๋ณธ ๋ฐ์ดํฐ |
| 27 | ์์ทจ์ธ ๊ธฐ๋ณธ ์ฃผ์ | ์์ธ์ ๊ฐ๋จ๊ตฌ... | ์๋ณธ ๋ฐ์ดํฐ |
| 28 | ์ผํ๋ชฐ ์ํ ์ฝ๋ | DA-DI-PW | ๋งค์นญ ๊ฒฐ๊ณผ |
| 29 | ์ผํ๋ชฐ ์ํ ์ด๋ฆ | ๋ฅ ํ๋ฆฌ์ํด | ๋งค์นญ ๊ฒฐ๊ณผ |
| 30 | ์ผํ๋ชฐ ์ต์ ์ด๋ฆ | DI-PW | ๋งค์นญ ๊ฒฐ๊ณผ |
| 31 | ์ฃผ๋ฌธ ์๋ | 1 (์ฑ), N (๊ธฐํ) | ์ฑ์ ํญ์ 1 (v3.7) |
| 32 | ๋ฐฐ์ก ๋ฉ์ธ์ง | ๋ฒจx, ๋ฌธ์ (์ฑ) | ์ฑ์ ๊ณ ์ ๊ฐ (v3.7) |
์ถ๊ฐ ๋๋ฒ๊น ์ปฌ๋ผ (33-34):
- 33: ๋งค์นญ ๋ฐฉ๋ฒ (์ฝ๋ ์ ํ ๋งค์นญ, ์ํ๋ช ํจํด ๋งค์นญ ๋ฑ)
- 34: ํ์ธ ํ์ (True/False)
- ์ฑ ํ์ผ ํน๋ณ ์ฒ๋ฆฌ:
์ฃผ๋ฌธ ์๋: ํญ์ 1๋ก ๊ณ ์ ๋ฐฐ์ก ๋ฉ์ธ์ง: ํญ์ **"๋ฒจx, ๋ฌธ์"**๋ก ๊ณ ์
- ์ผํ๋ชฐ ์ฃผ๋ฌธ ๋ผ์ธ๋ฒํธ (20๋ฒ): 1๋ถํฐ ์์ํ๋ ์์ฐจ ๋ฒํธ ์๋ ์์ฑ (int64)
- ๋ค์ค ํ๋ซํผ ํตํฉ ์ ์ค๋ณต ๋ฐฉ์ง: ์ ์ฒด ๋ฐ์ดํฐ์ ๋ํด 1~N ์๋ฒ ์ฌํ ๋น
- ์์ฒญ(ํฌ๋ง)๋ฐฐ์ก ์ผ์ (23๋ฒ): ์ค๋ ๋ ์ง ์๋ ์ ๋ ฅ (YYYY-MM-DD ํ์)
- ๋จ์ผ ํ์ด์ง์์ ์นดํ24, ์ฑ, ์ฟ ํก, ๋ค์ด๋ฒ ๋ชจ๋ ํ์ผ ๋์ ์ ๋ก๋
- ์๋ ํ๋ซํผ ๊ฐ์ง: ํ์ผ ์ ๋ก๋ ์ ์๋์ผ๋ก ํ๋ซํผ ๋ถ๋ฅ
- ํ๋ซํผ๋ณ ํต๊ณ: ๊ฐ ํ๋ซํผ์ ๋งค์นญ ๊ฒฐ๊ณผ๋ฅผ ํ๋์ ํ์ธ
- 10๊ฐ ์ปฌ๋ผ ์ถ๋ ฅ: ํ๋ซํผ ์ปฌ๋ผ ์ถ๊ฐ๋ก ์ถ์ฒ ๋ช ํํ
- ์นดํ24:
์์ฒดํ๋ชฉ์ฝ๋โ ๋ง์คํฐํ๋งค ์ํ ์ฝ๋๋งค์นญ (100%) - ์ฟ ํก:
์ต์ IDโ ๋ง์คํฐํ๋งค ์ํ ์ฝ๋๋งค์นญ (100%) - ์ฑ:
์ฃผ๋ฌธ์ํํ์ฑ ([์ํ๋ช ] N๊ฐ (์ต์ )) โ ๋ง์คํฐํ๋งค ์ํ ์ฝ๋ํจํด ๋งค์นญ (100%)- ํน๋ณ ์ฒ๋ฆฌ: ์ฃผ๋ฌธ ์๋ ํญ์ 1, ๋ฐฐ์ก ๋ฉ์ธ์ง ํญ์ "๋ฒจx, ๋ฌธ์"
- ๋ค์ด๋ฒ:
์ํ๋ฒํธโ ๋ง์คํฐํ๋งค ์ํ ์ฝ๋๋งค์นญ
- ํ๋ซํผ ์ด๋ฆ ๋งคํ ์ถ๊ฐ: ์๋ฌธ(
cafe24) โ ํ๊ธ(์นดํ24) ์๋ ๋ณํ - KeyError ํด๊ฒฐ: ๋ง์คํฐ ๋ฐ์ดํฐ ํํฐ๋ง ์ ํ๊ธ ํ๋งค์ฒ๋ช ์ฌ์ฉ
- Arrow ํ์ ์ค๋ฅ ์์ : ๋ชจ๋ ์ปฌ๋ผ์ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ Streamlit ํธํ์ฑ ๊ฐ์
- ๐ฏ 3PL ๋ฐฐ์ก ์์ ์๋ ๋ณํ (NEW!)
- ๐ง ์ง๋ฅํ ์ํ ์ฝ๋ ๋งค์นญ (NEW!)
- ๐ ๋งค์นญ ๊ฒฐ๊ณผ ๋ถ์ ๋ฐ ํต๊ณ (NEW!)
- ๐ค ๋ค์ค ํ์ผ ์ ๋ก๋: ์ฌ๋ฌ ์์ /CSV ํ์ผ์ ๋์์ ์ ๋ก๋
- ๐ ์๋ ์ปฌ๋ผ ํ์คํ: ๊ฐ๊ธฐ ๋ค๋ฅธ ์ปฌ๋ผ๋ช ์ ํ์ค ํ์์ผ๋ก ์๋ ํตํฉ
- ๐ ํ๊ธ ์ธ์ฝ๋ฉ ์ฒ๋ฆฌ: UTF-8, CP949, EUC-KR ๋ฑ ์๋ ๊ฐ์ง ๋ฐ ์ฒ๋ฆฌ
- ๐ ์ํธํ ํ์ผ ์ง์: ์ํธ๋ก ๋ณดํธ๋ ์์ ํ์ผ ์๋ ๋ณตํธํ ์๋
- ๐ ๋ค์ํ ์์ ํ์: XLSX, XLS ๊ตฌํ ํ์ ๋ชจ๋ ์ง์
- ๐ฅ ๋ ์ง๋ณ ๋ค์ด๋ก๋:
{์ค๋๋ ์ง}_3PL๋ฐฐ์ก์ ๋ฌด.xlsxํ์์ผ๋ก ์๋ ์ ์ฅ - ๐ ์ค์๊ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ: ํตํฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ํ์ธ
- ๋ง์คํฐ ์ฝ๋ ํ์ผ 1๊ฐ + ๋ชจ๋ ํ๋ซํผ ํ์ผ์ ๋์์ ์ ๋ก๋
- ์๋ ํ๋ซํผ ๊ฐ์ง ๋ฐ ๋ถ๋ฅ
- ์ค์๊ฐ ํ์ผ ์ ๋ณด ํ์
- ์นดํ24: CSV ํ์ผ, ์์ฒดํ๋ชฉ์ฝ๋ ๊ธฐ๋ฐ ๋งค์นญ
- ์ฑ: CSV ํ์ผ, ์ฃผ๋ฌธ์ํ ํ์ฑ ํ ๋งค์นญ
- ์ฟ ํก: XLSX ํ์ผ, ์ต์ ID ๊ธฐ๋ฐ ๋งค์นญ
- ๋ค์ด๋ฒ: CSV/XLSX ํ์ผ, ์ํ๋ฒํธ ๊ธฐ๋ฐ ๋งค์นญ
| ์ปฌ๋ผ๋ช | ์ค๋ช | ์์ค |
|---|---|---|
| ํ๋ซํผ | ์ฃผ๋ฌธ ํ๋ซํผ | cafe24, app, coupang, naver |
| ์ฃผ๋ฌธ๋ฒํธ | ์ฃผ๋ฌธ ๊ณ ์ ๋ฒํธ | ์ฃผ๋ฌธ๋ฒํธ |
| ์์ทจ์ธ ๋ช | ๋ฐ๋ ์ฌ๋ ์ด๋ฆ | ๋ฐ๋์ฌ๋ |
| ์์ทจ์ธ ํธ๋ํฐ | ๋ฐ๋ ์ฌ๋ ์ฐ๋ฝ์ฒ | ์๋ น์ธํด๋ํฐ |
| ์์ทจ์ธ ๊ธฐ๋ณธ ์ฃผ์ | ๋ฐฐ์ก ์ฃผ์ | ๋ฐฐ์ก์ฃผ์ |
| ์ผํ๋ชฐ ์ํ ์ฝ๋ | ์ํ ์ฝ๋ | ์์ฒดํ๋ชฉ์ฝ๋ โ ๋งค์นญ |
| ์ผํ๋ชฐ ์ํ ์ด๋ฆ | ์ํ๋ช | ์ํ๋ช โ ๋งค์นญ |
| ์ผํ๋ชฐ ์ต์ ์ด๋ฆ | ์ต์ ์ ๋ณด | ์ต์ โ ๋งค์นญ |
| ์ฃผ๋ฌธ ์๋ | ์ฃผ๋ฌธ ๊ฐ์ | ์๋ |
| ๋ฐฐ์ก ๋ฉ์ธ์ง | ๋ฐฐ์ก ์์ฒญ์ฌํญ | ๋ฐฐ์ก๋ฉ์ธ์ง |
| ๋งค์นญ ๋ฐฉ๋ฒ | ๋งค์นญ ์๊ณ ๋ฆฌ์ฆ | ์ฝ๋ ์ ํ ๋งค์นญ, ์ํ๋ช ๋งค์นญ ๋ฑ |
| ํ์ธ ํ์ | ์๋ ํ์ธ ํ์ ์ฌ๋ถ | True/False |
ํ๋ซํผ๋ณ ์ฝ๋ ์ถ์ถ:
- ์นดํ24:
์์ฒดํ๋ชฉ์ฝ๋โ ๋ง์คํฐํ๋งค ์ํ ์ฝ๋ - ์ฟ ํก:
์ต์ IDโ ๋ง์คํฐํ๋งค ์ํ ์ฝ๋ - ์ฑ:
์ฃผ๋ฌธ์ํํ์ฑ ([์ํ๋ช ] N๊ฐ (์ต์ )) โ์ํ๋ช์ถ์ถ - ๋ค์ด๋ฒ:
์ํ๋ฒํธโ ๋ง์คํฐํ๋งค ์ํ ์ฝ๋
1๋จ๊ณ: ํ๋งค ์ํ ์ฝ๋ ์ ํ ๋งค์นญ โญ
์
๋ ฅ ํ์ผ์ ์ฝ๋ == ๋ง์คํฐ ํ๋งค ์ํ ์ฝ๋
โ
100% ์ ํ ๋งค์นญ (ํ์ธ ํ์ ์์)
์์:
- ์นดํ24: DA_DIP_PW โ DA-DI-PW (๋ฅ ํ๋ฆฌ์ํด)
- ์ฟ ํก: 9353006240 โ C-AR-GRK-03 (๊ทน๋ฝ 3๊ฐ)
2๋จ๊ณ: ์ํ๋ช
+ ์ต์
๋ช
์กฐํฉ ๋งค์นญ
์
๋ ฅ ์ํ๋ช
ํฌํจ ๊ฒ์ฌ โ ๋ง์คํฐ ์ผํ๋ชฐ ์ํ ์ด๋ฆ
+
์
๋ ฅ ์ต์
๋ช
ํฌํจ ๊ฒ์ฌ โ ๋ง์คํฐ ์ผํ๋ชฐ ์ต์
์ด๋ฆ
โ ๏ธ ์ต์
์์ ์ ํ์ธ ํ์ ํ์
3๋จ๊ณ: ์ ์ฌ๋ ๊ธฐ๋ฐ ์ถ์ฒ
์ํ๋ช
์ ์ฌ๋ (70%) + ์ต์
๋ช
์ ์ฌ๋ (30%)
์ ์ฌ๋ 50% ์ด์ โ ์๋ ์ถ์ฒ
โ ๏ธ ํ์ธ ํ์ ํ์
| ํ๋ซํผ | ํ ์คํธ ๊ฑด์ | ๋งค์นญ ์ฑ๊ณต๋ฅ | ๋น๊ณ |
|---|---|---|---|
| ์นดํ24 | 49๊ฑด | 49/49 (100%) | โ |
| ์ฟ ํก | 26๊ฑด | 26/26 (100%) | โ |
| ์ฑ | 1๊ฑด | ๋ง์คํฐ ๋ฐ์ดํฐ ํ์ | |
| ๋ค์ด๋ฒ | - | ๋ง์คํฐ 8๊ฑด ์ค๋น | โ |
- ์ฌ์ด๋๋ฐ์์ ๋ฌผ๋ฅ_์ฝ๋๋ช .xlsx ํ์ผ ์ ๋ก๋
- "โ ๋ง์คํฐ ์ฝ๋ ๋ฐ์ดํฐ ๋ก๋ ์๋ฃ" ๋ฉ์์ง ํ์ธ
- ํ๋ซํผ๋ณ ์ํ ์ ํ์ธ (์: ์นดํ24 65๊ฐ, ์ฟ ํก 4๊ฐ, ๋ค์ด๋ฒ 8๊ฐ, ์ฑ 1๊ฐ)
- ๋ฉ์ธ ์์ญ ํ์ผ ์
๋ก๋์์ ์ฌ๋ฌ ํ์ผ ๋์ ์ ํ
- ์นดํ24 CSV ํ์ผ
- ์ฑ CSV ํ์ผ
- ์ฟ ํก XLSX ํ์ผ
- ๋ค์ด๋ฒ CSV ํ์ผ
- ์๋์ผ๋ก ํ๋ซํผ ๊ฐ์ง ๋ฐ ๋ถ๋ฅ
- ๊ฐ ํ๋ซํผ๋ณ ํ์ผ ๊ฐ์ ํ์ธ
- ํ์ผ ์ ๋ณด ํ ์ด๋ธ: ํ๋ซํผ๋ณ ์๋ณธ ํ ์, ๋งค์นญ ์ฑ๊ณต๋ฅ , ํ์ธ ํ์ ํญ๋ชฉ ์
- ํตํฉ ๊ฒฐ๊ณผ ํต๊ณ: ์ด ์ฃผ๋ฌธ ์, ๋งค์นญ ์ฑ๊ณต, ํ์ธ ํ์, ์ฒ๋ฆฌ ํ๋ซํผ ์
- ํ๋ซํผ๋ณ ํต๊ณ: ๊ฐ ํ๋ซํผ์ ์ฃผ๋ฌธ ์์ ํ์ธ ํ์ ํญ๋ชฉ
- ๋งค์นญ ๋ฐฉ๋ฒ๋ณ ๋ถ์: ์ฝ๋ ์ ํ ๋งค์นญ, ์ํ๋ช ๋งค์นญ ๋ฑ ํต๊ณ
- ์ ์ฒด ๋ฐ์ดํฐ ํ ์ด๋ธ ํ์ธ
- "ํ์ธ ํ์ ํญ๋ชฉ๋ง ๋ณด๊ธฐ" ํํฐ ์ฌ์ฉ
- ๋ ธ๋์ ๊ฐ์กฐ ํญ๋ชฉ ์๋ ํ์ธ
- "๐ฅ ํตํฉ ํ์ผ ๋ค์ด๋ก๋" ๋ฒํผ ํด๋ฆญ
YYYYMMDD_ํตํฉ3PL๋ฐฐ์ก์ ๋ฌด.xlsxํ์ผ ์ ์ฅ- ํ์ธ ํ์ ํญ๋ชฉ์ ์๋์ผ๋ก ์ต์ข ํ์ธ
์๋ฉ/CS ์ฃผ๋ฌธ์ ์ง์ ์ ๋ ฅํ์ฌ 3PL ํ์์ผ๋ก ์ถ๊ฐ
- โ ๋ค์ค ์์ทจ์ธ ์ ๋ ฅ: ํ ๋ฒ์ ์ฌ๋ฌ ๋ช ์ ์์ทจ์ธ ์ ๋ณด ์ ๋ ฅ ๊ฐ๋ฅ
- โ
์๋ ์ฃผ๋ฌธ๋ฒํธ ์์ฑ:
{๋ ์ง}_{Seed/CS}_{a,b,c,...}ํ์ - โ
์๋ ์ํ์ฝ๋ ์์ฑ:
{๋ ์ง}_{Seed/CS}_{a,b,c,...}ํ์ - โ ์ ๋ ฅ๊ฐ ๊ฒ์ฆ: ์์ทจ์ธ, ์ ํ๋ฒํธ, ์ฃผ์ ๊ฐ์ ์ผ์น ํ์ธ
- โ ์ค์๊ฐ ๋ชฉ๋ก ํ์: ์ถ๊ฐ๋ ์ฃผ๋ฌธ ๋ชฉ๋ก ์ฆ์ ํ์ธ
-
"โ๏ธ ์๋ ์ ๋ ฅ" ํญ ์ ํ
-
์นดํ ๊ณ ๋ฆฌ ์ ํ: Seed ๋๋ CS
-
๋ค์ค ์ฃผ๋ฌธ ์ ๋ณด ์ ๋ ฅ (์ค๋ฐ๊ฟ์ผ๋ก ๊ตฌ๋ถ):
- ์์ทจ์ธ ์ด๋ฆ:
๊น์ ๋ฆผ ๊น์ข ๊ตญ ์ดํจ๋ฆฌ - ์ ํ๋ฒํธ:
010-1234-5678 010-2345-6789 010-3456-7890 - ์ฃผ์:
์์ธ์ ๊ฐ๋จ๊ตฌ ํ ํค๋๋ก 123 ๊ฒฝ๊ธฐ๋ ์ฑ๋จ์ ๋ถ๋น๊ตฌ ํ๊ต๋ก 456 ๋ถ์ฐ์ ํด์ด๋๊ตฌ ์ผํ ๋๋ก 789 - ์ํ๋ช : ํ๋ฆฌ๋ฏธ์ ์คํจ์ผ์ด ์ธํธ (์ผํ๋ชฐ ์ํ๋ช /์ต์ ๋ช ์ผ๋ก ์ฌ์ฉ)
- ์๋: 1
- ๋ฐฐ์ก ๋ฉ์์ง (์ ํ์ฌํญ)
- ์์ทจ์ธ ์ด๋ฆ:
-
"โ ์ฃผ๋ฌธ ์ถ๊ฐ" ๋ฒํผ ํด๋ฆญ
-
์ถ๊ฐ๋ ์ฃผ๋ฌธ ํ์ธ:
- ์ฃผ๋ฌธ๋ฒํธ:
20260322_Seed_a,20260322_Seed_b,20260322_Seed_c - ์ผํ๋ชฐ ์ํ ์ฝ๋:
20260322_Seed_a,20260322_Seed_b,20260322_Seed_c
- ์ฃผ๋ฌธ๋ฒํธ:
-
3PL ๋ณํ์ ์๋ ํฌํจ๋์ด ์ฒ๋ฆฌ
์นดํ
๊ณ ๋ฆฌ: Seed
๋ ์ง: 2026-03-22
์
๋ ฅ:
- ์์ทจ์ธ 3๋ช
(๊น์ ๋ฆผ, ๊น์ข
๊ตญ, ์ดํจ๋ฆฌ)
- ์ํ๋ช
: ํ๋ฆฌ๋ฏธ์ ์คํจ์ผ์ด ์ธํธ
์์ฑ ๊ฒฐ๊ณผ:
1. ์ฃผ๋ฌธ๋ฒํธ: 20260322_Seed_a
์ผํ๋ชฐ ์ํ ์ฝ๋: 20260322_Seed_a
์ผํ๋ชฐ ์ํ๋ช
/์ต์
๋ช
: ํ๋ฆฌ๋ฏธ์ ์คํจ์ผ์ด ์ธํธ
2. ์ฃผ๋ฌธ๋ฒํธ: 20260322_Seed_b
์ผํ๋ชฐ ์ํ ์ฝ๋: 20260322_Seed_b
์ผํ๋ชฐ ์ํ๋ช
/์ต์
๋ช
: ํ๋ฆฌ๋ฏธ์ ์คํจ์ผ์ด ์ธํธ
3. ์ฃผ๋ฌธ๋ฒํธ: 20260322_Seed_c
์ผํ๋ชฐ ์ํ ์ฝ๋: 20260322_Seed_c
์ผํ๋ชฐ ์ํ๋ช
/์ต์
๋ช
: ํ๋ฆฌ๋ฏธ์ ์คํจ์ผ์ด ์ธํธ
| ์ปฌ๋ผ๋ช | ์ค๋ช | ์์ |
|---|---|---|
| ํ๋งค์ฒ | ํ๋งค ํ๋ซํผ (ํ๊ธ) | ์นดํ24, ์ฟ ํก, ๋ค์ด๋ฒ, ์ฑ |
| ํ๋งค ์ํ ์ฝ๋ | ๋ด๋ถ ์ํ ์ฝ๋ | DA_DIP_PW, 9353006240 |
| ์ผํ๋ชฐ ์ํ ์ฝ๋ | ์ธ๋ถ ์ํ ์ฝ๋ | DA-DI-PW, C-AR-GRK-03 |
| ์ผํ๋ชฐ ์ํ ์ด๋ฆ | ์ํ๋ช | ๋ฅ ํ๋ฆฌ์ํด, ๊ทน๋ฝ 3๊ฐ |
| ์ผํ๋ชฐ ์ต์ ์ด๋ฆ | ์ต์ ์ ๋ณด | DI-PW, LFT4W |
| ๊ตฌ์ฑํ | ๊ตฌ์ฑ ํ๋ชฉ | ๋ฅT, ๊ทน๋ฝT |
- ํ๋งค์ฒ ์ปฌ๋ผ: ๋ฐ๋์ ํ๊ธ๋ก ์
๋ ฅ (
์นดํ24,์ฟ ํก,๋ค์ด๋ฒ,์ฑ) - ํ๋งค ์ํ ์ฝ๋: ๊ฐ ํ๋ซํผ์ ๊ณ ์ ์ํ ์ฝ๋์ ์ ํํ ์ผ์นํด์ผ ํจ
- ์นดํ24:
์์ฒดํ๋ชฉ์ฝ๋๊ฐ - ์ฟ ํก:
์ต์ ID๊ฐ - ์ฑ: ์ฃผ๋ฌธ์ํ์์ ํ์ฑํ
์ํ๋ช - ๋ค์ด๋ฒ:
์ํ๋ฒํธ๊ฐ
- ์นดํ24:
- โ
Excel:
.xlsx(์ต์ ํ์) - โ
Excel:
.xls(๊ตฌํ ํ์) - โ
CSV:
.csv(UTF-8, CP949, EUC-KR ์๋ ๊ฐ์ง) - โ ์ํธ ๋ณดํธ๋ ์์ ํ์ผ (๋น ๋น๋ฐ๋ฒํธ ๋๋ VelvetSweatshop ์๊ณ ๋ฆฌ์ฆ)
์
๋ก๋ โ ์ธ์ฝ๋ฉ ๊ฐ์ง โ ํ์ผ ์ฝ๊ธฐ โ ์ปฌ๋ผ ํ์คํ
โ ๋ฐ์ดํฐ ๋ณํฉ โ ์์
์์ฑ โ ๋ค์ด๋ก๋
๋ง์คํฐ ์ฝ๋ ๋ก๋
โ
์นดํ24 CSV ์
๋ก๋
โ
1๋จ๊ณ: ์ฝ๋ ์ ํ ๋งค์นญ
โ (์คํจ)
2๋จ๊ณ: ์ํ๋ช
+์ต์
๋ช
๋งค์นญ
โ (์คํจ)
3๋จ๊ณ: ์ ์ฌ๋ ๊ธฐ๋ฐ ์ถ์ฒ
โ
ํ์ธ ํ์ ํญ๋ชฉ ํ์
โ
3PL ํ์ค ์์ ์์ฑ
โ
๋ค์ด๋ก๋
webapp/
โโโ app.py # ๋ฉ์ธ Streamlit ์ ํ๋ฆฌ์ผ์ด์
โโโ requirements.txt # Python ํจํค์ง ์์กด์ฑ
โโโ ecosystem.config.cjs # PM2 ์ค์ ํ์ผ
โโโ .gitignore # Git ์ ์ธ ํ์ผ ๋ชฉ๋ก
โโโ README.md # ํ๋ก์ ํธ ๋ฌธ์
- Streamlit: ์น UI ํ๋ ์์ํฌ
- Pandas: ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐ ๋ถ์
- OpenPyXL: ์ต์ XLSX ํ์ผ ์ฝ๊ธฐ
- XLRD: ๊ตฌํ XLS ํ์ผ ์ฝ๊ธฐ
- XlsxWriter: ์์ ํ์ผ ์์ฑ ๋ฐ ์คํ์ผ๋ง
- Chardet: ํ์ผ ์ธ์ฝ๋ฉ ์๋ ๊ฐ์ง
- msoffcrypto-tool: ์ํธํ๋ Office ํ์ผ ๋ณตํธํ
- difflib: ๋ฌธ์์ด ์ ์ฌ๋ ๋ถ์
- 3๋จ๊ณ ์ง๋ฅํ ์ฝ๋ ๋งค์นญ ์๊ณ ๋ฆฌ์ฆ
- ์ ์ฌ๋ ๊ธฐ๋ฐ ์๋ ์ถ์ฒ (SequenceMatcher)
- ํ์ธ ํ์ ํญ๋ชฉ ์๊ฐ์ ๊ฐ์กฐ (๋ ธ๋์ ๋ฐฐ๊ฒฝ)
- CSV ํ์ผ์ ํ๊ธ ๊นจ์ง ๋ฐฉ์ง
- ์ํธ๋ก ๋ณดํธ๋ ์์ ํ์ผ ์๋ ๋ณตํธํ
- ๋น ํ ์๋ ์ ๊ฑฐ
- ์ด ๋๋น ์๋ ์กฐ์
# PM2๋ก ์๋น์ค ์์
pm2 start ecosystem.config.cjs
# PM2 ์ํ ํ์ธ
pm2 list
# ๋ก๊ทธ ํ์ธ
pm2 logs logistics-app --nostream
# ์ฌ์์
fuser -k 3000/tcp 2>/dev/null || true
pm2 restart logistics-app
# ์ค์ง
pm2 stop logistics-app
# ์ญ์
pm2 delete logistics-app-
๋ง์คํฐ ์ฝ๋ ๋ฐ์ดํฐ ์ ํ์ฑ ํ์ธ
- ์ผํ๋ชฐ ์ํ ์ฝ๋๊ฐ ์ ํํ์ง ํ์ธ
- ์ํ๋ช ๊ณผ ์ต์ ๋ช ์ด ์ผ๊ด๋๊ฒ ์ ๋ ฅ๋์๋์ง ํ์ธ
-
์นดํ24 ๋ฐ์ดํฐ ํ์ธ
- ์์ฒดํ๋ชฉ์ฝ๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ ฅ๋์๋์ง ํ์ธ
- ์ํ๋ช ๊ณผ ์ต์ ์ ๋ณด๊ฐ ๋ช ํํ์ง ํ์ธ
-
ํ์ธ ํ์ ํญ๋ชฉ ์ฒ๋ฆฌ
- ๋ค์ด๋ก๋ํ ํ์ผ์์ ๋ ธ๋์ ํญ๋ชฉ ํ์ธ
- ์๋์ผ๋ก ์ฌ๋ฐ๋ฅธ ์ฝ๋ ์ ๋ ฅ ํ ์ฌ์ ๋ก๋
- ์ฌ๋ฌ ์ธ์ฝ๋ฉ์ ์๋์ผ๋ก ์๋ํ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ๋ฌธ์ ์์
- ๊ทธ๋๋ ์ ๋๋ฉด ๋ฉ๋ชจ์ฅ์์ UTF-8๋ก ์ ์ฅ ํ ์ฌ์๋
- ์์ ์์ ํ์ผ ์ด๊ธฐ โ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ ์ฅ
- ๋๊ตฌ โ ์ผ๋ฐ ์ต์ โ ์ํธ ์ ๊ฑฐ
- PM2 ์๋น์ค ์ํ ํ์ธ:
pm2 list - ํฌํธ 3000 ํ์ธ:
fuser -k 3000/tcp - ์๋น์ค ์ฌ์์:
pm2 restart logistics-app
โ ์๋ ์ฃผ๋ฌธ ์ ๋ ฅ ๊ธฐ๋ฅ ์ถ๊ฐ - ์๋ฉ/CS ์ฃผ๋ฌธ ์ง์ ์ ๋ ฅ
- ์ ๊ท ๊ธฐ๋ฅ:
- "โ๏ธ ์๋ ์ ๋ ฅ" ํญ ์ถ๊ฐ
- ์๋ฉ/CS ์นดํ ๊ณ ๋ฆฌ ์ ํ ๊ฐ๋ฅ
- ์ฃผ๋ฌธ๋ฒํธ ์๋ ์์ฑ:
- ์๋ฉ:
{์ค๋๋ ์ง}_Seed_{๊ณ ์ ๋ฒํธ}(์:20260322_Seed_a) - CS:
{์ค๋๋ ์ง}_CS_{๊ณ ์ ๋ฒํธ}(์:20260322_CS_a)
- ์๋ฉ:
- ์ฃผ๋ฌธ ์ ๋ณด ์
๋ ฅ ํผ:
- ์ฃผ๋ฌธ์๋ช , ์ ํ๋ฒํธ, ์ฃผ์ (ํ์)
- ์ํ ์ฝ๋ (๋ง์คํฐ ์ฝ๋์์ ์๋ ๋ถ๋ฌ์ด)
- ์๋, ๋ฐฐ์ก ๋ฉ์ธ์ง (์ ํ)
- ๋ง์คํฐ ์ฝ๋ ๊ธฐ๋ฐ ์ํ ์ ๋ณด ์๋ ๋งค์นญ
- ์ค์๊ฐ ์ฃผ๋ฌธ ๋ชฉ๋ก ํ์ธ ๋ฐ ์ผ๊ด ์ญ์
- ํ์ผ ์ ๋ก๋ ์ฃผ๋ฌธ๊ณผ ํจ๊ป ํตํฉ ์ฒ๋ฆฌ
- ๊ธฐ์ ๊ตฌํ:
st.session_state๋ก ์๋ ์ฃผ๋ฌธ ๋ชฉ๋ก ๊ด๋ฆฌ- ์ํ๋ฒณ ๊ณ ์ ๋ฒํธ ์๋ ์์ฑ (a, b, c...)
- 3PL 32๊ฐ ํ์ค ์ปฌ๋ผ ์๋ ๋ณํ
- ํ๋ซํผ๋ณ ํต๊ณ์ "์๋์ ๋ ฅ" ์ถ๊ฐ
- ๋ฒ๊ทธ ์์ :
- 'ํ์ธ ํ์' ์ปฌ๋ผ ํ์ ์ค๋ฅ ์์ (๋ฌธ์์ด โ ๋ถ๋ฆฐ ์นด์ดํธ)
- ํ๋ซํผ๋ณ ํต๊ณ ์ง๊ณ ์ค๋ฅ ์์
โ ์๋ ์ ๋ ฅ UI ๋ํญ ๊ฐ์ - ๋ค์ค ์ฃผ๋ฌธ ์ ๋ ฅ ์ง์
- ํต์ฌ ๋ณ๊ฒฝ์ฌํญ:
- ์ํ ์ฝ๋ selectbox โ text input์ผ๋ก ๋ณ๊ฒฝ
- ๋ค์ค ์์ทจ์ธ ์ ๋ ฅ ์ง์ (์ค๋ฐ๊ฟ์ผ๋ก ๊ตฌ๋ถ)
- ์ ๋ ฅํ ์ํ๋ช ์ด ์ผํ๋ชฐ ์ํ๋ช /์ต์ ๋ช ์ผ๋ก ์ง์ ์ฌ์ฉ
- ์นดํ ๊ณ ๋ฆฌ๋ฅผ "Seed"/"CS"๋ก ๋ณ๊ฒฝ (๊ธฐ์กด "์๋ฉ"/"CS")
- ์๋ ์์ฑ ํ์:
- ์ฃผ๋ฌธ๋ฒํธ:
{๋ ์ง}_{Seed/CS}_{a,b,c,...} - ์ผํ๋ชฐ ์ํ ์ฝ๋:
{๋ ์ง}_{Seed/CS}_{a,b,c,...} - ์์:
20260322_Seed_a,20260322_CS_b
- ์ฃผ๋ฌธ๋ฒํธ:
- ๋ค์ค ์
๋ ฅ ๋ฐฉ์:
์์ทจ์ธ ์ด๋ฆ: ์ ํ๋ฒํธ: ์ฃผ์: ๊น์ ๋ฆผ 010-1234-5678 ์์ธ์ ๊ฐ๋จ๊ตฌ... ๊น์ข ๊ตญ 010-2345-6789 ๊ฒฝ๊ธฐ๋ ์ฑ๋จ์... ์ดํจ๋ฆฌ 010-3456-7890 ๋ถ์ฐ์ ํด์ด๋๊ตฌ... - ์
๋ ฅ๊ฐ ๊ฒ์ฆ:
- ์์ทจ์ธ, ์ ํ๋ฒํธ, ์ฃผ์ ๊ฐ์ ์ผ์น ํ์ธ
- ๋น ์ค ์๋ ์ ๊ฑฐ
- ์ค๋ฅ ์ ๋ช ํํ ๋ฉ์์ง ํ์
- ํ
์คํธ ๊ฒฐ๊ณผ:
- โ
Seed ์ฃผ๋ฌธ 3๊ฐ ์์ฑ (
20260322_Seed_a/b/c) - โ
CS ์ฃผ๋ฌธ 2๊ฐ ์์ฑ (
20260322_CS_a/b) - โ ์ฃผ๋ฌธ๋ฒํธ ๋ฐ ์ํ์ฝ๋ ๊ณ ์ ์ฑ ๊ฒ์ฆ ํต๊ณผ
- โ ํ์ ๊ฒ์ฆ ํต๊ณผ
- โ
Seed ์ฃผ๋ฌธ 3๊ฐ ์์ฑ (
- ์ฌ์ฉ์ฑ ํฅ์:
- ๋ง์คํฐ ํ์ผ ๋ถํ์ (์๋ ์ ๋ ฅ ์)
- ํ ๋ฒ์ ์ฌ๋ฌ ์ฃผ๋ฌธ ์ ๋ ฅ ๊ฐ๋ฅ
- ์ค์๊ฐ ์ฃผ๋ฌธ ๋ชฉ๋ก ํ์ธ
- 3PL ๋ณํ์ ์๋ ํฌํจ
โ ๊ณต๊ฐ Google Sheets ์ฐ๋์ผ๋ก ๋ณต๊ท - ์ธ์ฆ ๋ถํ์
- ๋ณ๊ฒฝ ์ฌํญ:
- Service Account ์ธ์ฆ ๋ฐฉ์ ์ ๊ฑฐ (๋ณต์ก๋ ๊ฐ์)
- ๊ณต๊ฐ CSV Export URL ๋ฐฉ์์ผ๋ก ๋ณต๊ท
- ์ธ์ฆ ๋ถํ์ - ๋งํฌ ๊ณต์ ๋ง์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅ
- ํญ ์ด๋ฆ์ ํ๊ธ/๊ดํธ ํฌํจ โ
urllib.parse.quote๋ก URL ์ธ์ฝ๋ฉ ์ฒ๋ฆฌ
- sheets_utils.py ๋ณต์:
- CSV Export URL:
https://docs.google.com/.../export?format=csv&sheet=์ํ ์ฝ๋ ์ต์ข (๋ง์คํฐ ์ฝ๋) - ํญ ์ด๋ฆ:
์ํ ์ฝ๋ ์ต์ข (๋ง์คํฐ ์ฝ๋)(ํ๊ธ/๊ดํธ ์๋ ์ธ์ฝ๋ฉ) - gspread, google-auth ์์กด์ฑ ์ ๊ฑฐ
- ๊ฐ๋จํ
requests.get()ํธ์ถ๋ก ๋ฐ์ดํฐ ๋ก๋
- CSV Export URL:
- webhook_server.py ๊ฐ์ํ:
- Secret token ๊ฒ์ฆ ์ ๊ฑฐ (๊ณต๊ฐ webhook)
- ๋จ์ POST ์๋ํฌ์ธํธ๋ก ๋ณ๊ฒฝ
- Google Apps Script ๊ฐ์ํ:
google_apps_script.js(Service Account ๋ฒ์ ์ ๊ฑฐ)- ๊ณต๊ฐ Sheets ์ ์ฉ ์คํฌ๋ฆฝํธ๋ก ๋ณ๊ฒฝ
- B~F์ด ๋ณ๊ฒฝ ๊ฐ์ง (onEdit ํธ๋ฆฌ๊ฑฐ)
- ์ธ์ฆ ๋ถํ์ - ๋จ์ webhook POST
- ๋ฌธ์ ์ ๋ฆฌ:
- Service Account ๊ด๋ จ ๋ฌธ์ ๋ชจ๋ ์ ๊ฑฐ
GOOGLE_SHEETS_SETUP.md- ๊ณต๊ฐ ๋งํฌ ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธ- ์ค์ ์๊ฐ: 20๋ถ โ 5๋ถ์ผ๋ก ๋จ์ถ
- ์ฅ์ :
- โ ์ค์ ๊ฐ๋จ (Google Cloud Console ๋ถํ์)
- โ ์ธ์ฆ ๋ถํ์ (๋งํฌ ๊ณต์ ๋ง ํ์)
- โ ์ฝ๋ ๊ฐ๊ฒฐ (์์กด์ฑ ๊ฐ์)
- โ ์ ์ง๋ณด์ ์ฉ์ด
โ Google Service Account ์ธ์ฆ์ผ๋ก ์ ํ - ๋น๊ณต๊ฐ Sheets ์ค์๊ฐ ์ฐ๋
- ๊ตฌํ ๋ด์ฉ:
- Google Service Account ์ธ์ฆ ๋ฐฉ์์ผ๋ก ์ ํ (gspread + google-auth)
- ๋น๊ณต๊ฐ Google Sheets ์ ๊ทผ ๊ฐ๋ฅ (Service Account JSON ํค)
st.secrets๋ก ์ธ์ฆ ์ ๋ณด ์์ ํ๊ฒ ๊ด๋ฆฌ- B~F์ด ์ ์ฒด ๋ฐ์ดํฐ ์ฝ๊ธฐ (gid ๊ธฐ๋ฐ)
- Webhook Secret Token ๊ฒ์ฆ ์ถ๊ฐ (๋ฌด๋จ ํธ์ถ ๋ฐฉ์ง)
- sheets_utils.py ์
๋ฐ์ดํธ:
- CSV export ๋ฐฉ์ โ Service Account ์ธ์ฆ ๋ฐฉ์
- gspread๋ก ์ง์ Sheets API ํธ์ถ
- ์ฑ ์ต์ด ์คํ ์ ์๋์ผ๋ก Sheets์์ ๋ง์คํฐ ์ฝ๋ ๋ก๋
- webhook_server.py ์
๋ฐ์ดํธ:
- Secret token ๊ฒ์ฆ ๋ก์ง ์ถ๊ฐ
- ์ธ์ฆ ์คํจ ์ 401 Unauthorized ์๋ต
- Token ์ค์ ์ํ๋ฅผ /health ์๋ํฌ์ธํธ์ ํฌํจ
- Google Apps Script ์ฝ๋ ์ถ๊ฐ:
google_apps_script_service_account.js- B~F์ด ๋ณ๊ฒฝ ๊ฐ์ง (onEdit ํธ๋ฆฌ๊ฑฐ)
- Webhook POST ์์ฒญ (secret token ํฌํจ)
- ์ค์ ๋ฐ ํ ์คํธ ํจ์ ํฌํจ (setupTrigger, testWebhook, checkConfiguration)
- ์ค์ ๊ฐ์ด๋ ๋ฌธ์ ์์ฑ:
GOOGLE_SERVICE_ACCOUNT_SETUP.md- Service Account ๋ฐ๊ธ ๊ฐ์ด๋SETUP_GUIDE.md- ์ ์ฒด ์ค์ ๋จ๊ณ๋ณ ๊ฐ์ด๋.streamlit/secrets.toml.example- Secrets ํ ํ๋ฆฟSERVICE_ACCOUNT_SUMMARY.md- ์๋ฃ ์์ฝ ๋ฌธ์
- ๋ณด์ ๊ฐํ:
.gitignore์ Service Account JSON ํ์ผ ์ถ๊ฐ- secrets.toml์ ์ ๋ ์ปค๋ฐ ์ ๋จ
- ๋ชจ๋ ์ธ์ฆ ์ ๋ณด๋ st.secrets ๋๋ ํ๊ฒฝ๋ณ์๋ก๋ง ๊ด๋ฆฌ
- ์๊ตฌ์ฌํญ ์ถฉ์กฑ:
- โ ๋น๊ณต๊ฐ Google Sheets ์ ๊ทผ (Service Account)
- โ ์ฑ ์ต์ด ์คํ ์ Sheets์์ ๋ง์คํฐ ์ฝ๋ ๊ฐ์ ธ์ค๊ธฐ
- โ Sheets B~F์ด ๋ณ๊ฒฝ ์ ์ฆ์ Streamlit ์ฑ์ ๋ฐ์ (webhook)
- โ Polling ๋ฐฉ์ ์ฌ์ฉํ์ง ์์
- โ Secret token์ผ๋ก webhook ๋ณด์
- โ ์ธ์ฆ ์ ๋ณด๋ ์ฝ๋์ ํ๋์ฝ๋ฉ ๊ธ์ง
โ ์ผํ๋ชฐ ๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ ๋๊ธฐํ ์ด์ ์์ ํด๊ฒฐ
- ๋ฌธ์ : ์ผํ๋ชฐ ์ฃผ๋ฌธ๋ฒํธ์๋ ์ ๋ฏธ์ฌ(a, b, c...)๊ฐ ์ ์ ์ถ๊ฐ๋์์ง๋ง, ์ผํ๋ชฐ ๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ์๋ ์ ์ฉ๋์ง ์์
- ์์ธ: ์ผํ๋ชฐ ๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ๋ฅผ ์ด๊ธฐ์ ์๋ณธ ์ฃผ๋ฌธ๋ฒํธ๋ก ์ค์ ํ๊ณ , ์ ๋ฏธ์ฌ ์ถ๊ฐ ํ ์ ๋ฐ์ดํธํ์ง ์์
- ํด๊ฒฐ: ์ผํ๋ชฐ ๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ๋ฅผ ์ ๋ฏธ์ฌ ์ถ๊ฐ ํ์๋ง ์ค์ ํ์ฌ ํญ์ ์ผํ๋ชฐ ์ฃผ๋ฌธ๋ฒํธ์ ๋์ผํ๊ฒ ์ ์ง
- ๊ฒ์ฆ ๊ฒฐ๊ณผ:
- โ ์ผํ๋ชฐ ์ฃผ๋ฌธ๋ฒํธ == ์ผํ๋ชฐ ๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ (100% ์ผ์น)
- โ ์ผํ๋ชฐ ์ฃผ๋ฌธ๋ฒํธ ๊ณ ์ ์ฑ ๋ณด์ฅ (์ ๋ฏธ์ฌ: a, b, c...)
- โ ์กฐ๊ฑด 1, 2, 3 ๋ชจ๋ ์ถฉ์กฑ
- ํ
์คํธ ์ผ์ด์ค:
์๋ณธ: 20260225-83316T835 (3๊ฐ ์ค๋ณต) ๊ฒฐ๊ณผ: - 20260225-83316T835 (์ฒซ ๋ฒ์งธ) - 20260225-83316T835a (๋ ๋ฒ์งธ, ์ ๋ฏธ์ฌ a) - 20260225-83316T835b (์ธ ๋ฒ์งธ, ์ ๋ฏธ์ฌ b) ๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ: ๊ฐ๊ฐ ๋์ผํ๊ฒ ์ ์ฉ๋จ โ
โ ๋ค์ด๋ฒ(์ค๋งํธ์คํ ์ด) ํ์ผ ์ฒ๋ฆฌ ์์ ์ง์
- ๋ค์ด๋ฒ ํ์ผ skiprows=1 ์๋ ์ฒ๋ฆฌ (ํค๋ ํ ๊ฑด๋๋ฐ๊ธฐ)
- ๋ค์ด๋ฒ ํ์ผ ํนํ ๋งคํ:
- ์ฃผ๋ฌธ๋ฒํธ โ ์ผํ๋ชฐ ์ฃผ๋ฌธ๋ฒํธ
- ์์ทจ์ธ๋ช โ ์์ทจ์ธ ๋ช
- ๊ตฌ๋งค์๋ช โ ์ฃผ๋ฌธ์ ๋ช (๋ค์ด๋ฒ๋ง ๊ตฌ๋ถ)
- ์์ทจ์ธ์ฐ๋ฝ์ฒ1 โ ์์ทจ์ธ ์ ํ๋ฒํธ
- ํตํฉ๋ฐฐ์ก์ง โ ์์ทจ์ธ ๊ธฐ๋ณธ ์ฃผ์
- ๋ฐฐ์ก๋ฉ์ธ์ง โ ๋ฐฐ์ก ๋ฉ์ธ์ง
- ์ํ๋ฒํธ๋ก ๋ง์คํฐ ๋ฐ์ดํฐ ๋งค์นญ (100% ์ฑ๊ณต)
- ์ํธํ๋ ์ค๋งํธ์คํ ์ด ํ์ผ ์๋ ๋ณตํธํ
- ํ ์คํธ ๊ฒฐ๊ณผ: 2๊ฑด ๋ชจ๋ 100% ๋งค์นญ ์ฑ๊ณต โ
โ ๋ค์ด๋ฒ ํ์ผ ์ํธ ์ ๋ ฅ ๊ธฐ๋ฅ
- ๋ค์ด๋ฒ ํญ์ ํ์ผ ์ํธ ์ ๋ ฅ ํ๋ ์ถ๊ฐ
- ์ํธ๋ก ๋ณดํธ๋ ์์ ํ์ผ ์๋ ๋ณตํธํ
- ๋ณตํธํ ์ฐ์ ์์: โ ์ฌ์ฉ์ ์ ๊ณต ๋น๋ฐ๋ฒํธ โ โก ๋น ๋น๋ฐ๋ฒํธ โ โข VelvetSweatshop ์๊ณ ๋ฆฌ์ฆ
- ์ํธ ์ค๋ฅ ์ ๋ช ํํ ์๋ฌ ๋ฉ์์ง ํ์
- ์ฌ์ฉ๋ฒ: ๋ค์ด๋ฒ ํญ์์ ์ํธ ์ ๋ ฅ โ ํ์ผ ์ ๋ก๋
- ์ํธํ๋ ๋ค์ด๋ฒ ํ์ผ 100% ์ง์ โ
โ ์ผํ๋ชฐ ๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ ๋๊ธฐํ
- ์กฐ๊ฑด 1: ์ผํ๋ชฐ ๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ๋ ์ผํ๋ชฐ ์ฃผ๋ฌธ๋ฒํธ์ ํญ์ ๋์ผ
- ์กฐ๊ฑด 2: ์ผํ๋ชฐ ์ฃผ๋ฌธ๋ฒํธ๋ ๊ณ ์ ์ฑ ๋ณด์ฅ (์ ๋ฏธ์ฌ ์๋ ์ถ๊ฐ)
- ์กฐ๊ฑด 3: ๋ ๋ค ๊ฐ์ ์ ๋ฏธ์ฌ ์ ์ฉ
- ๋ฌธ์ : ์ฃผ๋ฌธ๋ฒํธ์ ์ ๋ฏธ์ฌ๊ฐ ๋ถ์ด๋ ๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ๋ ์๋ณธ ์ ์ง๋จ
- ํด๊ฒฐ:
ensure_unique_order_numbers()์คํ ํ ๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ๋ฅผ ์ฃผ๋ฌธ๋ฒํธ์ ๋๊ธฐํ - ์์:
20260301-0000277โ20260301-0000277a(๋ ๋ค ๊ฐ์ ์ ๋ฏธ์ฌ) - 100% ๋๊ธฐํ ๋ฌ์ฑ โ
โ ์ฃผ๋ฌธ๋ฒํธ ์ค๋ณต ๋ฐฉ์ง - ์๋ ์ ๋ฏธ์ฌ ์ถ๊ฐ
- ๋์ผํ ์ฃผ๋ฌธ๋ฒํธ๊ฐ ์ฌ๋ฌ ๊ฐ ์์ ๊ฒฝ์ฐ ์๋์ผ๋ก ์ ๋ฏธ์ฌ ์ถ๊ฐ (a, b, c...)
- ์์:
20260225-83316T835โ20260225-83316T835,20260225-83316T835a,20260225-83316T835b ensure_unique_order_numbers()ํจ์๋ก ๋ชจ๋ ์ฃผ๋ฌธ๋ฒํธ์ ๊ณ ์ ์ฑ ๋ณด์ฅconvert_to_3pl_format()ํจ์์์ ์๋ ํธ์ถ- ์ค๋ณต 0๊ฐ, 100% ๊ณ ์ ํ ์ฃผ๋ฌธ๋ฒํธ ์์ฑ โ
โ ์ฑ ๋งค์นญ ์ค๋ฅ ์์ - ํฉ์ค์ & ๊น์์ ์ผ์ด์ค
- ํฉ์ค์ : "[Dip] 1๊ฐ (๋ฅ ํ๋ฆฌ์ํด 1๊ฐ)" โ ๋ฅ ํ๋ผ์ด ์๋ ๋ฅ ํ๋ฆฌ์ํด ์ ํํ ๋งค์นญ โ
- ๊น์์: "[(์ฑํน๊ฐ) ์ํฌ ๊ทน๋ฝ ๋ฒ๋ค] 1๊ฐ (์์ด์ค 1๊ฐ)" โ PL์ด ์๋ IC ๋ฒ์ ์ ํํ ๋งค์นญ โ
- 4๋จ๊ณ ์ง๋ฅํ ํํฐ๋ง: ์๋ณธ ๋ฌธ์์ด โ ์ต์ ๋ช โ IC/PL ํค์๋ โ ์ต๋จ ๋งค์นญ
- IC/PL ํค์๋ ์๋ ๊ฐ์ง: ๋ชจ๋ ๊ดํธ ๋ด์ฉ ๋ถ์ํ์ฌ "์์ด์ค" โ IC, "ํ๋ผ" โ PL ๊ตฌ๋ถ
- ๋์ด์ฐ๊ธฐ ๋ณด์กด: "๋ฅ ํ๋ฆฌ์ํด" vs "๋ฅ ํ๋ผ" ์ ํํ ๊ตฌ๋ถ (์ด์ ์๋ "๋ฅํ๋ฆฌ์ํด"๋ก ํฉ์ณ์ ๋งค์นญ ์คํจ)
- ์ ๊ท์ โ ๋จ์ ๋ฌธ์์ด ๊ฒ์: ๊ดํธ ํน์๋ฌธ์ ๋ฌธ์ ํด๊ฒฐ
- ๋งค์นญ ์ฑ๊ณต๋ฅ 100% ๋ฌ์ฑ (ํฉ์ค์ 1/1, ๊น์์ 1/1)
โ ์ฑ ํ์ผ ํน๋ณ ์ฒ๋ฆฌ ์ถ๊ฐ
- ์ฑ ํ๋ซํผ ์ ๋ก๋ ์ ์ฃผ๋ฌธ ์๋ ๋ฌด์กฐ๊ฑด 1๋ก ๊ณ ์
- ์ฑ ํ๋ซํผ ์ ๋ก๋ ์ ๋ฐฐ์ก ๋ฉ์ธ์ง ๋ฌด์กฐ๊ฑด "๋ฒจx, ๋ฌธ์"๋ก ๊ณ ์
- ๋ค๋ฅธ ํ๋ซํผ(์นดํ24, ์ฟ ํก, ๋ค์ด๋ฒ)์ ์๋ณธ ๋ฐ์ดํฐ ์ ์ง
โ ์ฑ ํ์ผ ๋งค์นญ ๋ก์ง ์์ ๊ตฌํ
- ํ์ผ ์ธ์ฝ๋ฉ ๋ฌธ์ ํด๊ฒฐ: CP949 ๋์ฝ๋ฉ + ์๋ ์ปฌ๋ผ๋ช ์ค์
parse_app_product()ํจ์ ์ถ๊ฐ:[์ํ๋ช ] N๊ฐ (์ต์ )ํ์ ํ์ฑ- ํจํด ๋งค์นญ์ผ๋ก ๋ง์คํฐ ๋ฐ์ดํฐ์์ ์ํ ์ ๋ณด ์๋ ์ถ์ถ
- ํ ์คํธ ๊ฒฐ๊ณผ: 4๊ฑด ๋ชจ๋ 100% ๋งค์นญ ์ฑ๊ณต โ
โ ์ผํ๋ชฐ ์ฃผ๋ฌธ ๋ผ์ธ๋ฒํธ ์ค๋ณต ๋ฐฉ์ง
- ๋ค์ค ํ๋ซํผ ํตํฉ ์ ์ ์ฒด ๋ฐ์ดํฐ์ 1๋ถํฐ ์๋ฒ ์ฌํ ๋น
- int64 ํ์ ์ ์ง (๋ฌธ์์ด ๋ณํ์์ ์ ์ธ)
- ํ ์คํธ: 98๊ฐ ํ์์ 1~98 ์ฐ์ ๋ฒํธ, ์ค๋ณต 0๊ฐ ํ์ธ
โ
์ผํ๋ชฐ ์ฃผ๋ฌธ ๋ผ์ธ๋ฒํธ ์ถ๊ฐ: 1๋ถํฐ ์์ํ๋ ์์ฐจ ๋ฒํธ ์๋ ์์ฑ
โ
์์ฒญ(ํฌ๋ง)๋ฐฐ์ก ์ผ์ ์ถ๊ฐ: ์ค๋ ๋ ์ง YYYY-MM-DD ํ์์ผ๋ก ์๋ ์
๋ ฅ
โ ํ๋ซํผ ์ด๋ฆ ๋งคํ ์ถ๊ฐ
- ์๋ฌธ ํ๋ซํผ ์ด๋ฆ(
cafe24,coupang,naver,app) โ ํ๊ธ(์นดํ24,์ฟ ํก,๋ค์ด๋ฒ,์ฑ) ์๋ ๋ณํ PLATFORM_NAME_MAP๋์ ๋๋ฆฌ ์ถ๊ฐ๋ก ๋ง์คํฐ ๋ฐ์ดํฐ ํํฐ๋ง ๋ฌธ์ ํด๊ฒฐ
โ KeyError ์์ ํด๊ฒฐ
- ๋ง์คํฐ ๋ฐ์ดํฐ ํํฐ๋ง ์ ํ๊ธ ํ๋งค์ฒ๋ช ์ฌ์ฉ์ผ๋ก ๋น DataFrame ๋ฌธ์ ํด๊ฒฐ
['์ผํ๋ชฐ ์ํ ์ด๋ฆ'] not in index์ค๋ฅ ์์ ์ ๊ฑฐ
โ Arrow ํ์ ๋ณํ ์ค๋ฅ ์์
- ๋ชจ๋ ์ปฌ๋ผ์ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ Streamlit
st.dataframe()ํธํ์ฑ ๊ฐ์ ์ฐํธ๋ฒํธ,์๋๋ฑ ์ ์ํ ์ปฌ๋ผ์ Arrow ๋ณํ ์ค๋ฅ ํด๊ฒฐ
โ
๋ฐ์ดํฐ ํ์
์ ๊ทํ
โ
Arrow ๋ณํ ์ค๋ฅ ํด๊ฒฐ
โ
๋น DataFrame ์ฒดํฌ ์ถ๊ฐ
โ
๋ง์คํฐ ๋ฐ์ดํฐ ์์ ๋ ๋งค์นญ ์คํจ ์ฆ์ ๋ฐํ
โ
ํตํฉ ๋ค์ค ํ๋ซํผ ์ง์ - ๋จ์ผ ํ์ด์ง์์ ์นดํ24, ์ฑ, ์ฟ ํก, ๋ค์ด๋ฒ ๋ชจ๋ ํ์ผ ๋์ ์ฒ๋ฆฌ
โ
์๋ ํ๋ซํผ ๊ฐ์ง - ์ปฌ๋ผ๋ช
๊ธฐ๋ฐ ์ง๋ฅํ ํ๋ซํผ ๋ถ๋ฅ
โ
ํ๋ซํผ๋ณ ๋งค์นญ ๋ก์ง - ๊ฐ ํ๋ซํผ์ ํน์ฑ์ ๋ง๋ ์ฝ๋ ์ถ์ถ ๋ฐ ๋งค์นญ
โ
10๊ฐ ์ปฌ๋ผ ์ถ๋ ฅ - ํ๋ซํผ, ์ฃผ๋ฌธ๋ฒํธ, ์์ทจ์ธ๋ช
, ํธ๋ํฐ, ์ฃผ์, ์ํ์ฝ๋, ์ํ๋ช
, ์ต์
, ์๋, ๋ฐฐ์ก๋ฉ์์ง, ๋งค์นญ๋ฐฉ๋ฒ, ํ์ธํ์
โ
ํ๋ซํผ๋ณ ํต๊ณ - ๊ฐ ํ๋ซํผ์ ๋งค์นญ ๊ฒฐ๊ณผ ๋ฐ ํ์ธ ํ์ ํญ๋ชฉ ํต๊ณ
โ
3PL ์ถ๋ ฅ ์์ ์์ ์์
โ
์ผํ๋ชฐ ์ํ ์ฝ๋, ์ํ ์ด๋ฆ, ์ต์
์ด๋ฆ ๋ชจ๋ ๋ง์คํฐ ํ์ผ์์ ์ถ์ถ
โ
ํ์ค 9๊ฐ ์ปฌ๋ผ ์ถ๋ ฅ
โ
100% ๋งค์นญ ์ฑ๊ณต (49/49๊ฑด)
โ
๋งค์นญ ๋ก์ง ์์ : ์นดํ24 ์์ฒดํ๋ชฉ์ฝ๋ โ ๋ง์คํฐ ํ๋งค ์ํ ์ฝ๋ ๋งค์นญ
โ
100% ๋งค์นญ๋ฅ ๋ฌ์ฑ
โ
3PL ๋ฐฐ์ก ์์ ์๋ ๋ณํ ์์คํ
โ
๋ฌผ๋ฅ_์ฝ๋๋ช
๋ง์คํฐ ๋ฐ์ดํฐ ๋ก๋
โ
3๋จ๊ณ ์ง๋ฅํ ์ฝ๋ ๋งค์นญ ์๊ณ ๋ฆฌ์ฆ
โ
์ ์ฌ๋ ๊ธฐ๋ฐ ์๋ ์ถ์ฒ (50% ์ด์)
โ
ํ์ธ ํ์ ํญ๋ชฉ ์๊ฐ์ ๊ฐ์กฐ
โ
๋งค์นญ ๊ฒฐ๊ณผ ๋ถ์ ๋ฐ ํต๊ณ
โ
๋ค์ค ํ์ผ ์
๋ก๋ ๊ธฐ๋ฅ
โ
8๊ฐ์ง ํ์ค ์ปฌ๋ผ ์๋ ๋งคํ
โ
ํ๊ธ ์ธ์ฝ๋ฉ ์๋ ๊ฐ์ง (UTF-8, CP949, EUC-KR)
โ
์ํธํ๋ ์์
ํ์ผ ์๋ ๋ณตํธํ ์๋
โ
๊ตฌํ XLS ํ์ ์ง์
โ
์ต์ XLSX ํ์ ์ง์
โ
์ค์๊ฐ ๋ฐ์ดํฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
โ
์น ์ธํฐํ์ด์ค ๊ตฌ์ถ
- ๐ ๋ค์ด๋ฒ ํ์ผ ์๋ ๊ฐ์ง ๋ฐ ์ฒ๋ฆฌ
- ํ์ผ๋ช ์ '์ค๋งํธ์คํ ์ด' ํฌํจ ์ ์๋์ผ๋ก skiprows=1 ์ ์ฉ
- ํค๋ ํ(์ค๋ช ๋ฌธ) ์๋ ๊ฑด๋๋ฐ๊ธฐ
- 72๊ฐ ์ปฌ๋ผ ์ค ํ์ํ ์ปฌ๋ผ๋ง ์๋ ์ถ์ถ
- ๐ ๋ค์ด๋ฒ ํนํ ์ปฌ๋ผ ๋งคํ
- ์์ทจ์ธ๋ช : '์์ทจ์ธ๋ช ' ์ปฌ๋ผ (๋ค๋ฅธ ํ๋ซํผ๊ณผ ๋ณ๋)
- ๊ตฌ๋งค์๋ช : '๊ตฌ๋งค์๋ช ' ์ปฌ๋ผ โ ์ฃผ๋ฌธ์ ๋ช (๋ค์ด๋ฒ๋ง ๊ตฌ๋ถ)
- ์์ทจ์ธ ์ ํ: '์์ทจ์ธ์ฐ๋ฝ์ฒ1' ์ปฌ๋ผ
- ์์ทจ์ธ ์ฃผ์: 'ํตํฉ๋ฐฐ์ก์ง' ์ปฌ๋ผ
- ๋ฐฐ์ก๋ฉ์ธ์ง: '๋ฐฐ์ก๋ฉ์ธ์ง' ์ปฌ๋ผ
- ๐ ์ํ๋ฒํธ ๋งค์นญ
- ์ํ๋ฒํธ (11์๋ฆฌ ์ซ์) โ ๋ง์คํฐ ํ๋งค ์ํ ์ฝ๋
- ํ์ ์๋ ๋ณํ (int โ str) ์ผ๋ก 100% ๋งค์นญ
- ๐ ์ํธํ ํ์ผ ์ง์
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋น๋ฐ๋ฒํธ๋ก ์๋ ๋ณตํธํ
- ๋ณตํธํ ์ฑ๊ณต ์ skiprows=1 ์๋ ์ ์ฉ
- ๐ ํ
์คํธ ๊ฒฐ๊ณผ
- 2๊ฑด ๋ค์ด๋ฒ ์ฃผ๋ฌธ ๋ชจ๋ 100% ๋งค์นญ ์ฑ๊ณต
- ์ํ๋ฒํธ 11574588816 โ N-AR-GRK-10 / GRS, LFT4W
- ๐ ์ํธํ๋ ๋ค์ด๋ฒ ํ์ผ ์ง์
- ๋ค์ด๋ฒ ํญ์ ํ์ผ ์ํธ ์ ๋ ฅ ํ๋ ์ถ๊ฐ
st.text_input(type="password")์ฌ์ฉ์ผ๋ก ๋ณด์ ๊ฐํ- ์ํธ ์ ๋ ฅ ํ ํ์ผ ์ ๋ก๋ ์ ์๋์ผ๋ก ๋ณตํธํ
- ๐ง read_file() ํจ์ ๊ฐ์
passwordํ๋ผ๋ฏธํฐ ์ถ๊ฐ:read_file(uploaded_file, password=None)- ๋ค์ด๋ฒ ํ์ผ ์ฝ๊ธฐ ์ ์ธ์ ์คํ ์ดํธ์์ ๋น๋ฐ๋ฒํธ ์๋ ์ ๋ฌ
- ๐ ๋ณตํธํ ์ฐ์ ์์ ์ต์ ํ
- ์ฌ์ฉ์ ์ ๊ณต ๋น๋ฐ๋ฒํธ (์ฐ์ ์๋) โ
- ๋น ๋น๋ฐ๋ฒํธ (
'') (๋น ์ํธ ํ์ผ) - VelvetSweatshop ์๊ณ ๋ฆฌ์ฆ (๊ธฐ๋ณธ ์ํธ)
- ๐ฌ ๋ช
ํํ ํผ๋๋ฐฑ
- ์ํธ ์ค์ ์: "๐ ํ์ผ ์ํธ๊ฐ ์ค์ ๋์์ต๋๋ค"
- ๋ณตํธํ ์ฑ๊ณต: "๐ ์ ๊ณต๋ ์ํธ๋ก ํ์ผ ๋ณตํธํ ์ฑ๊ณต"
- ๋ณตํธํ ์คํจ: "๋ณตํธํ ์คํจ: ์ฌ๋ฐ๋ฅธ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์"
- ๐ ์ฌ์ฉ ๋ฐฉ๋ฒ
- ๋ค์ด๋ฒ ํญ์์ ํ์ผ ์ํธ ์ ๋ ฅ (์ํธ๊ฐ ์๋ ๊ฒฝ์ฐ)
- ๋ค์ด๋ฒ ํ์ผ ์ ๋ก๋
- ์๋์ผ๋ก ๋ณตํธํ ๋ฐ ์ฒ๋ฆฌ
- ๐ ๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ ๋ถ์ผ์น ํด๊ฒฐ
- ๋ฌธ์ : ์ฃผ๋ฌธ๋ฒํธ์ ์ ๋ฏธ์ฌ(a, b, c...)๊ฐ ๋ถ์ด๋ ๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ๋ ์๋ณธ ์ ์ง
- ์์ธ:
์ผํ๋ชฐ ๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ๋ ์๋ณธresult_df['์ฃผ๋ฌธ๋ฒํธ']๋ฅผ ์ฌ์ฉ,ensure_unique_order_numbers()์คํ ํ ์ ๋ฐ์ดํธ ์ ๋จ - ํด๊ฒฐ: ํจ์ ์คํ ํ
output_df['์ผํ๋ชฐ ๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ'] = output_df['์ผํ๋ชฐ ์ฃผ๋ฌธ๋ฒํธ']๋ก ๋๊ธฐํ
- ๐ง 3๊ฐ์ง ์กฐ๊ฑด ์๋ฒฝ ์ค์
- ์ผํ๋ชฐ ๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ๋ ์ผํ๋ชฐ ์ฃผ๋ฌธ๋ฒํธ์ ํญ์ ๊ฐ์ โ
- ์ผํ๋ชฐ ์ฃผ๋ฌธ๋ฒํธ๋ ๊ณ ์ ์ฑ ๋ณด์ฅ (์ ๋ฏธ์ฌ ์๋ ์ถ๊ฐ) โ
- ๋ ๋ค ๊ฐ์ ์ ๋ฏธ์ฌ ์ ์ฉ (์: 20260301-0000277a) โ
- ๐ ํ
์คํธ ๊ฒฐ๊ณผ
- ์๋ณธ 2๊ฑด ์ค๋ณต:
20260301-0000277,20260227-0000288 - ๋ณํ ํ:
20260301-0000277a,20260227-0000288a(๋ฌถ์ ๋ฐฐ์ก ๋ฒํธ๋ ๋์ผ) - 192๊ฑด ์ค 190๊ฑด ์ผ์น, 2๊ฑด ๋๊ธฐํ ์๋ฃ โ 100% ์ผ์น โ
- ์๋ณธ 2๊ฑด ์ค๋ณต:
- โจ ์ฃผ๋ฌธ๋ฒํธ ๊ณ ์ ์ฑ ๋ณด์ฅ
ensure_unique_order_numbers()ํจ์ ์ถ๊ฐ- ๋์ผ ์ฃผ๋ฌธ๋ฒํธ๊ฐ ์ฌ๋ฌ ๊ฐ ์์ ๊ฒฝ์ฐ ๋ ๋ฒ์งธ๋ถํฐ a, b, c... ์ ๋ฏธ์ฌ ์๋ ์ถ๊ฐ
- ์ํ๋ฒณ ์๋ฌธ์ 26๊ฐ ์ง์ (์ต๋ 27๊ฐ ์ค๋ณต๊น์ง ์ฒ๋ฆฌ ๊ฐ๋ฅ)
- ๐ง ์๋ ์ ์ฉ
convert_to_3pl_format()ํจ์์์ ์๋ ํธ์ถ- ํ๋ซํผ ํตํฉ ํ ์ต์ข DataFrame์ ์ ์ฉ
- ์ฌ์ฉ์ ๊ฐ์ ์์ด ์๋์ผ๋ก ์ค๋ณต ์ ๊ฑฐ
- ๐ ์ ์ฉ ์์
์๋ณธ: - 20260225-83316T835 - 20260225-83316T835 - 20260225-83316T835 ๋ณํ ํ: - 20260225-83316T835 - 20260225-83316T835a - 20260225-83316T835b - ๐ ํ ์คํธ ๊ฒฐ๊ณผ: 6๊ฑด ์ค๋ณต โ 0๊ฑด ์ค๋ณต, 100% ๊ณ ์ ์ฃผ๋ฌธ๋ฒํธ ์์ฑ โ
- ๐ ํฉ์ค์ ๋ฅ ํ๋ฆฌ์ํด ๋งค์นญ ์คํจ ํด๊ฒฐ
- ๋ฌธ์ : "[Dip] 1๊ฐ (๋ฅ ํ๋ฆฌ์ํด 1๊ฐ)" โ ๋ฅ ํ๋ผ์ผ๋ก ์๋ชป ๋งค์นญ
- ์์ธ: ์ต์ ๋ช ์์ ๋์ด์ฐ๊ธฐ ์ ๊ฑฐํ์ฌ "๋ฅํ๋ฆฌ์ํด"๋ก ๋ณํ โ ๋ง์คํฐ "๋ฅ ํ๋ฆฌ์ํด 1๊ฐ"์ ๋ถ์ผ์น
- ํด๊ฒฐ: ๋์ด์ฐ๊ธฐ ๋ณด์กด, ์๋ณธ ๋ฌธ์์ด ์ฐ์ ๋งค์นญ
- ๐ ๊น์์ ์ํฌ ๊ทน๋ฝ IC/PL ๊ตฌ๋ถ ์คํจ ํด๊ฒฐ
- ๋ฌธ์ : "[(์ฑํน๊ฐ) ์ํฌ ๊ทน๋ฝ ๋ฒ๋ค] 1๊ฐ (์์ด์ค 1๊ฐ)" โ PL ๋ฒ์ ์ผ๋ก ์๋ชป ๋งค์นญ
- ์์ธ: ์ฒซ ๋ฒ์งธ ๊ดํธ "(์ฑํน๊ฐ)"๋ง ์ถ์ถ โ IC/PL ๊ตฌ๋ถ ๋ถ๊ฐ
- ํด๊ฒฐ: ๋ชจ๋ ๊ดํธ ๋ด์ฉ ๋ถ์, IC/PL ํค์๋ ์๋ ๊ฐ์ง
- โจ parse_app_product ๊ฐ์
- ๋ชจ๋ ๊ดํธ ๋ด์ฉ ์ถ์ถ ๋ฐ IC/PL ํค์๋ ๊ฒ์
- ์ต์ _์๋ณธ ํ๋ ์ถ๊ฐ (๋์ด์ฐ๊ธฐ ํฌํจ)
- IC/PL_ํค์๋ ํ๋ ์ถ๊ฐ (IC, PL, PW ๋ฑ)
- ๐ 4๋จ๊ณ ์ง๋ฅํ ํํฐ๋ง
- ์๋ณธ ๋ฌธ์์ด ์ ํ ๋งค์นญ (์: "๋ฅ ํ๋ฆฌ์ํด 1๊ฐ")
- ์ต์ ๋ช (๋์ด์ฐ๊ธฐ ํฌํจ) ๋งค์นญ
- IC/PL ํค์๋๋ก ๋ฒ์ ๊ตฌ๋ถ
- ์ต๋จ ๋ฌธ์์ด ์ ํ (๊ฐ์ฅ ์ ํํ ๋งค์นญ)
- ๐ง ์ ๊ท์ โ ๋จ์ ๋ฌธ์์ด ๊ฒ์
- ๊ดํธ
()ํน์๋ฌธ์ ๋ฌธ์ ํด๊ฒฐ - regex=True โ regex=False ๋ณ๊ฒฝ
- ๊ดํธ
- ๐ ํ ์คํธ ๊ฒฐ๊ณผ: ํฉ์ค์ & ๊น์์ 100% ์ ํ ๋งค์นญ ์ฑ๊ณต โ
- โจ ์ฑ ์ ์ฉ ๊ณ ์ ๊ฐ ์ค์
์ฃผ๋ฌธ ์๋: ํญ์ 1๋ก ๊ณ ์ (๋ค๋ฅธ ํ๋ซํผ์ ์๋ณธ ๋ฐ์ดํฐ ์ฌ์ฉ)๋ฐฐ์ก ๋ฉ์ธ์ง: ํญ์ "๋ฒจx, ๋ฌธ์"๋ก ๊ณ ์ (๋ค๋ฅธ ํ๋ซํผ์ ์๋ณธ ๋ฐ์ดํฐ ์ฌ์ฉ)
- ๐ง ์กฐ๊ฑด๋ถ ๋ก์ง ์ถ๊ฐ
if platform == 'app':์กฐ๊ฑด์ผ๋ก ์ฑ ํ์ผ๋ง ํน๋ณ ์ฒ๋ฆฌ- ์นดํ24, ์ฟ ํก, ๋ค์ด๋ฒ๋ ๊ธฐ์กด ๋ก์ง ์ ์ง
- ๐ ํ ์คํธ ์๋ฃ: ์ฑ ํ์ผ 4๊ฑด ๋ชจ๋ ๊ณ ์ ๊ฐ ์ ์ฉ ํ์ธ
- ๐ง ์ธ์ฝ๋ฉ ๋ฌธ์ ํด๊ฒฐ
- CP949 ๋์ฝ๋ฉ์ผ๋ก ํ์ผ ์ฝ๊ธฐ ์ฑ๊ณต
- ์๋ ์ปฌ๋ผ๋ช ์ค์ ์ผ๋ก ๊นจ์ง ํค๋ ๋ฌธ์ ํด๊ฒฐ
- โจ ์ฃผ๋ฌธ์ํ ํ์ฑ ํจ์ ์ถ๊ฐ
parse_app_product():[์ํ๋ช ] N๊ฐ (์ต์ )ํ์์์ ์ํ๋ช , ์๋, ์ต์ ์ถ์ถ- ์์:
[Zee] 1๊ฐ (ํ๋ฆฌ์ํด PERIWINKLE 1๊ฐ)โ ์ํ๋ช : Zee, ์๋: 1, ์ต์ : ํ๋ฆฌ์ํด PERIWINKLE 1๊ฐ
- ๐ ํจํด ๋งค์นญ ๊ตฌํ
- ์ ๊ทํํ์์ผ๋ก ๋ง์คํฐ ๋ฐ์ดํฐ์
ํ๋งค ์ํ ์ฝ๋์์[์ํ๋ช ]ํจํด ๊ฒ์ - 100% ๋งค์นญ ์ฑ๊ณต๋ฅ ๋ฌ์ฑ (4/4๊ฑด)
- ์ ๊ทํํ์์ผ๋ก ๋ง์คํฐ ๋ฐ์ดํฐ์
- ๐ ํ
์คํธ ๊ฒฐ๊ณผ
- 4๊ฑด์ ์ฑ ์ฃผ๋ฌธ ๋ชจ๋ ์ฑ๊ณต์ ์ผ๋ก ๋งค์นญ
- ์ผํ๋ชฐ ์ํ ์ฝ๋, ์ํ ์ด๋ฆ, ์ต์ ์ด๋ฆ ์ ํํ ์ถ์ถ
- ๐ง ํตํฉ ์ ์๋ฒ ์ฌํ ๋น
- ๋ค์ค ํ๋ซํผ ํตํฉ ํ
merged_df['์ผํ๋ชฐ ์ฃผ๋ฌธ ๋ผ์ธ๋ฒํธ'] = list(range(1, len(merged_df)+1)) - ๊ฐ ํ๋ซํผ์ 1
N ๋ฒํธ๊ฐ ํตํฉ ํ 1์ ์ฒดํ์๋ก ์ฌํ ๋น
- ๋ค์ค ํ๋ซํผ ํตํฉ ํ
- ๐ข int64 ํ์
์ ์ง
- ๋ฌธ์์ด ๋ณํ ์ ์ผํ๋ชฐ ์ฃผ๋ฌธ ๋ผ์ธ๋ฒํธ ์ ์ธ
if col != '์ผํ๋ชฐ ์ฃผ๋ฌธ ๋ผ์ธ๋ฒํธ':์กฐ๊ฑด ์ถ๊ฐ
- ๐ ํ
์คํธ ๊ฒฐ๊ณผ
- 49๊ฑด + 49๊ฑด = 98๊ฑด ํตํฉ ์ 1~98 ์ฐ์ ๋ฒํธ
- ์ค๋ณต 0๊ฐ, ์์ฐจ ์ฆ๊ฐ ํ์ธ
- โจ ์ผํ๋ชฐ ์ฃผ๋ฌธ ๋ผ์ธ๋ฒํธ ์ถ๊ฐ (20๋ฒ ์ปฌ๋ผ)
- 1๋ถํฐ ์์ํ๋ ์์ฐจ ๋ฒํธ ์๋ ์์ฑ
- ๋ฐ์ดํฐ ํ์ : int64
- ๊ตฌํ:
output_df['์ผํ๋ชฐ ์ฃผ๋ฌธ ๋ผ์ธ๋ฒํธ'] = list(range(1, n_rows + 1))
- โจ ์์ฒญ(ํฌ๋ง)๋ฐฐ์ก ์ผ์ ์ถ๊ฐ (23๋ฒ ์ปฌ๋ผ)
- ์ค๋ ๋ ์ง YYYY-MM-DD ํ์ ์๋ ์ ๋ ฅ
- ๋ฐ์ดํฐ ํ์ : object (๋ ์ง ๋ฌธ์์ด)
- ๊ตฌํ:
output_df['์์ฒญ(ํฌ๋ง)๋ฐฐ์ก ์ผ์'] = [today] * n_rows(today =datetime.now().strftime('%Y-%m-%d'))
- ๐ ์ด 34๊ฐ ์ปฌ๋ผ ์ถ๋ ฅ: 32๊ฐ ํ์ค + 2๊ฐ ๋๋ฒ๊น
- ๐ง ํ๋ซํผ ์ด๋ฆ ๋งคํ ์ถ๊ฐ
PLATFORM_NAME_MAP๋์ ๋๋ฆฌ ์ถ๊ฐ:{'cafe24': '์นดํ24', 'app': '์ฑ', 'coupang': '์ฟ ํก', 'naver': '๋ค์ด๋ฒ'}- ๋ง์คํฐ ๋ฐ์ดํฐ ํํฐ๋ง ์ ์๋ฌธ โ ํ๊ธ ์๋ ๋ณํ
- โ
KeyError ์์ ํด๊ฒฐ
platform_master = master_df[master_df['ํ๋งค์ฒ'] == PLATFORM_NAME_MAP.get(platform)]- ๋น DataFrame ๋ฌธ์ ์์ ์ ๊ฑฐ
- โ
Arrow ํ์
๋ณํ ์ค๋ฅ ์์
- ๋ชจ๋ ์ปฌ๋ผ์ ๋ฌธ์์ด๋ก ๋ณํ:
merged_df[col].astype(str) - 'nan', 'None', '' โ ๋น ๋ฌธ์์ด ์ ๋ฆฌ
- ๋ชจ๋ ์ปฌ๋ผ์ ๋ฌธ์์ด๋ก ๋ณํ:
- ๐ ํ ์คํธ ๊ฒฐ๊ณผ: ์นดํ24 49๊ฑด, ์ฟ ํก 26๊ฑด ๋ชจ๋ 100% ๋งค์นญ ์ฑ๊ณต
- ๐ง ๋ฐ์ดํฐ ํ์
์ ๊ทํ
- ์ฐํธ๋ฒํธ, ์๋ ๋ฑ ์ ์ํ ์ปฌ๋ผ์ ๋ฌธ์์ด๋ก ๋ณํ
- Streamlit Arrow ํ ์ด๋ธ ๋ณํ ํธํ์ฑ ๊ฐ์
- ๐ง ๋ง์คํฐ ๋ฐ์ดํฐ ๊ฒ์ฆ ๊ฐํ
if platform_master.empty:์ฒดํฌ ์ถ๊ฐ- ๋ง์คํฐ ๋ฐ์ดํฐ ์์ ๋ ์ฆ์ ๋งค์นญ ์คํจ ๋ฐํ
- ๐ ๋จ์ผ ํ์ด์ง ํตํฉ UI
- ๋ชจ๋ ํ๋ซํผ ํ์ผ์ ๋์์ ์ ๋ก๋ํ๊ณ ์ฒ๋ฆฌ
- ๋ชจ๋ ํ ๊ธ ์ ๊ฑฐ, ๋จ์ํ๋ ์ํฌํ๋ก์ฐ
- ๐ง ์๋ ํ๋ซํผ ๊ฐ์ง
- ์ปฌ๋ผ๋ช ๊ธฐ๋ฐ ์ง๋ฅํ ํ๋ซํผ ๋ถ๋ฅ
detect_platform()ํจ์๋ก ์๋ ํ๋ณ
- ๐ ํ๋ซํผ๋ณ ๋งค์นญ ๋ก์ง
- ์นดํ24:
์์ฒดํ๋ชฉ์ฝ๋๋งค์นญ - ์ฟ ํก:
์ต์ ID๋งค์นญ - ์ฑ: ์ฃผ๋ฌธ์ํ ํ์ฑ ํ ๋งค์นญ
- ๋ค์ด๋ฒ:
์ํ๋ฒํธ๋งค์นญ
- ์นดํ24:
- ๐ ํ๋ซํผ๋ณ ํต๊ณ ๋ฐ ๋ถ์
- ํ์ผ ์ ๋ณด ํ ์ด๋ธ
- ํ๋ซํผ๋ณ ์ฃผ๋ฌธ ์ ๋ฐ ํ์ธ ํ์ ํญ๋ชฉ
- ๋งค์นญ ๋ฐฉ๋ฒ๋ณ ํต๊ณ
- ๐จ ๊ฐ์ ๋ UI/UX
- ์ ๋ก๋๋ ํ์ผ ์๋ ๋ถ๋ฅ ํ์
- ํ๋ซํผ๋ณ ์นด๋ ํํ ์ ๋ณด ํ์
- ์ค์๊ฐ ํต๊ณ ๋ฉํธ๋ฆญ
- โจ ์ํธํ๋ ์์ ํ์ผ ์ง์ ์ถ๊ฐ
- โจ ๊ตฌํ XLS ํ์ผ ํ์ ์ง์
- ๐ง ์ค๋ฅ ์ฒ๋ฆฌ ๊ฐ์
- ๐ ์ด๊ธฐ ๋ฒ์ ๋ฆด๋ฆฌ์ค
- ๋ค์ค ํ์ผ ์ ๋ก๋ ๊ธฐ๋ฅ
- ์๋ ์ปฌ๋ผ ๋งคํ
- ์น ์ธํฐํ์ด์ค ๊ตฌ์ถ
๋ค์ค ํ๋ซํผ ์ง์: ์ฟ ํก, ๋ค์ด๋ฒ ์ค๋งํธ์คํ ์ด ๋ฑ ์ถ๊ฐโ v3.0 ์๋ฃ- ์ฑ ๋ง์คํฐ ๋ฐ์ดํฐ ์ถ๊ฐ: ๋ฌผ๋ฅ_์ฝ๋๋ช .xlsx์ ์ฑ ์ํ ๋ฐ์ดํฐ ์ถ๊ฐ
- ์ปค์คํ ๋งคํ ๊ท์น: ์น์์ ์ง์ ๋งคํ ๊ท์น ์์
- AI ๊ธฐ๋ฐ ๋งค์นญ: GPT ๋ชจ๋ธ์ ํ์ฉํ ๊ณ ๋ํ๋ ๋งค์นญ
- ๋ฐฐ์น ์ฒ๋ฆฌ: ๋์ฉ๋ ํ์ผ ์ฒ๋ฆฌ ์ต์ ํ
- API ์ฐ๋: 3PL ์์คํ ๊ณผ ์ง์ ์ฐ๋
MIT License
Arooo Operator ๊น์ ๋ฆผ
๐ฏ v3.0 ํต์ฌ ๊ฐ์น: ๋ชจ๋ ์ผํ๋ชฐ ํ๋ซํผ(์นดํ24, ์ฑ, ์ฟ ํก, ๋ค์ด๋ฒ)์ ์ฃผ๋ฌธ ๋ฐ์ดํฐ๋ฅผ ๋ฌผ๋ฅ_์ฝ๋๋ช ๋ง์คํฐ ๋ฐ์ดํฐ์ ์ง๋ฅ์ ์ผ๋ก ๋งค์นญํ์ฌ ํตํฉ 3PL ๋ฐฐ์ก ์์์ผ๋ก ์๋ ๋ณํ, ๋ฌผ๋ฅ ์ ๋ฌด ํจ์จ์ฑ์ ๊ทน๋ํํฉ๋๋ค!