พาเลท / License Plate (LPN)
หน้า License Plate (LPN) ใช้สำหรับติดตามพาเลท ลัง โถ และคอนเทนเนอร์เป็น "หน่วยเดียว" — ช่วยให้ย้าย แยก รวม และจัดส่งเป็นชุดได้ทั้งพาเลท
คืออะไร?
LPN (License Plate Number) คือรหัสประจำตัวของภาชนะบรรจุ (pallet / case / tote / container) ที่บรรจุสินค้าอยู่ภายใน แต่ละ LPN มีรหัสไม่ซ้ำกัน เช่น LPN-20260601-000123 และเก็บข้อมูล:
- ประเภท — pallet, case, tote, container
- สถานะ — active / in_transit / shipped / empty / damaged / broken_down
- ตำแหน่ง — อยู่ที่ Location ไหน
- แม่ / ลูก — LPN ซ้อนกันเป็นลำดับชั้นได้ (เช่น Case บนพาเลท)
- น้ำหนัก / ปริมาตร — คำนวณจากสินค้าที่อยู่บน LPN
- ประวัติการเคลื่อนไหว — ทุกการ build/move/split/merge/pick/ship
เมื่อไหร่ควรใช้ LPN vs สต๊อกหลวม?
| สถานการณ์ | แนะนำ |
|---|---|
| รับของเข้าเป็นพาเลท แล้วจะเก็บทั้งพาเลท | ✅ ใช้ LPN |
| ของจำนวนน้อย เก็บใส่ชั้นวาง | ⛔ ใช้สต๊อกหลวม |
| ต้องตามรอย "พาเลทใบนี้" จนถึงปลายทาง | ✅ ใช้ LPN |
| เคลื่อนสต๊อกจำนวนมากครั้งเดียว (ทั้งพาเลท) | ✅ ใช้ LPN — ย้ายครั้งเดียว |
| Mixed SKU พาเลทเดียว | ✅ ใช้ LPN — เก็บความสัมพันธ์ |
💡 LPN เป็น optional — ระบบยังรับสต๊อกแบบหลวมตามปกติ ใช้ LPN เฉพาะที่จำเป็น
วงจรชีวิตของ LPN
Build (สร้าง) → Active
↓
Move / Split / Merge (ทำงานปกติ) → Active
↓
Breakdown (ยุบ) → Broken down ⛔
Close / Ship (จัดส่ง) → Shipped ⛔
Pick หมด → Emptyสถานะ terminal (shipped, broken_down) จะไม่ยอมให้แก้ไขใดๆ อีก
วิธีสร้างพาเลท (Build)
- เปิดหน้า LPN จาก sidebar
- กด สร้าง LPN → เลือก Warehouse + ประเภท (pallet)
- ระบบจะ auto-generate รหัส (เช่น
LPN-20260601-000001) หรือกรอกเองได้ - เลือก Location ที่จะวาง LPN
- กด สร้าง → ได้ LPN เปล่า สถานะ active
หรือ ใช้ API POST /lpn/build เพื่อ "ตัก" สต๊อกหลวมขึ้นมาเป็น LPN ทีเดียว:
- ระบุ stockId + qty ของแต่ละ SKU ที่จะนำขึ้นพาเลท
- ระบบจะลดสต๊อกหลวมและสร้าง stock ใหม่ที่ผูกกับ LPN
วิธีแยกพาเลท (Split) — ตัวอย่างที่ลูกค้าถามบ่อย
โจทย์: พาเลทมี SKU A อยู่ 100 ชิ้น ต้องการเอาออก 30 ชิ้นไปวางที่ pick face
- กดไอคอน ✂️ Split ที่แถวของ LPN
- เลือก ปลายทาง:
- 🆕 สร้าง LPN ใหม่ — ของที่หยิบออกไปจะกลายเป็น LPN ใบใหม่
- 📦 เก็บเป็นสต๊อกหลวม — ของที่หยิบออกจะเป็นสต๊อกธรรมดา
- กรอกจำนวนที่จะ "ตักออก" ในแต่ละบรรทัด (ในตัวอย่างนี้คือ 30)
- กด แยก — ระบบจะ:
- ลดสต๊อกบน LPN ต้นทาง 30 → เหลือ 70
- สร้างสต๊อกใหม่ตามที่เลือก
- บันทึก movement type=
split - ถ้า LPN ต้นทางเหลือ 0 จะเปลี่ยนสถานะเป็น
empty
วิธีรวมพาเลท (Merge)
- กดไอคอน 🔀 Merge ที่ LPN ต้นทาง
- กรอกรหัสของ LPN ปลายทาง
- กด รวม — ของทุกอย่างจาก LPN ต้นทางจะย้ายไปอยู่กับ LPN ปลายทาง
- LPN ต้นทางจะเปลี่ยนสถานะเป็น
broken_down
พาเลทผสม (Mixed Pallet)
LPN ตัวเดียวสามารถมีสินค้าหลาย SKU ได้ ใช้ /lpn/build กับ items หลาย SKU พร้อมกัน
ระบบจะแยก stock row ต่อ SKU/Lot/Serial แต่ทั้งหมดผูกกับ lpnId เดียวกัน
ลำดับชั้น (Hierarchy) — Case บน Pallet
ใช้ endpoint /lpn/:id/nest เพื่อใส่ LPN ใบหนึ่งเป็นลูกของอีกใบ
Pallet LPN-...-000001
├── Case LPN-...-000010
├── Case LPN-...-000011
└── Case LPN-...-000012เวลา ย้าย Pallet ระบบจะ cascade ย้ายทุก Case ลูกตามไปด้วยอัตโนมัติ
การ Pick จาก LPN
- เมื่อสร้าง Pick Task ระบบจะรู้ว่า stock ที่จะหยิบอยู่บน LPN ใด
- ถ้าหยิบเต็ม → LPN จะ auto-update สถานะเป็น
empty - ถ้าหยิบบางส่วน → บันทึก movement type=
splitไว้บน LPN
Replenishment + LPN
เมื่อระบบสร้าง replenishment task และพบว่าต้นทางเป็น LPN เต็มใบ:
- ถ้า qty ที่ต้องเติม = qty บน LPN → ย้ายทั้ง LPN ไปยัง pick face
- ถ้าเติมน้อยกว่า → ทำ split — ของ partial ไปเป็นสต๊อกหลวมที่ pick face
ดูประวัติการเคลื่อนไหว
กดไอคอน 👁️ ดูรายละเอียด จะเห็น tab ประวัติการเคลื่อนไหว ที่แสดงทุก movement ที่เกิดกับ LPN นี้ (build, move, split, merge, pick, ship)
API Endpoints หลัก
| Endpoint | คำอธิบาย |
|---|---|
GET /lpn | รายการ LPN พร้อมฟิลเตอร์ |
GET /lpn/by-code/:code | ค้นด้วยรหัส (scanner-friendly) |
POST /lpn/build | สร้าง LPN จากสต๊อกหลวม |
POST /lpn/:id/move | ย้ายทั้ง LPN (cascade ลูก) |
POST /lpn/:id/split | แยกของออกบางส่วน |
POST /lpn/:id/merge | รวมเข้ากับ LPN อื่น |
POST /lpn/:id/breakdown | ยุบ LPN เหลือเป็นสต๊อกหลวม |
POST /lpn/:id/close | ปิด/จัดส่ง |
POST /integration/v1/lpn | สร้าง LPN ผ่าน Push API (สำหรับเครื่องพิมพ์ label) |