📦 ระบบรับส่งพัสดุ
รับ คำนวณราคา พิมพ์ใบฝากส่ง + ฉลาก สแกน QR เข้า/ออก ส่งมอบให้ผู้รับด้วย PIN
ในหน้านี้
Flow การทำงาน
- ลูกค้าฝากพัสดุที่สาขาต้นทาง — พนักงานกรอกข้อมูลในระบบ → ระบบสร้างรหัส
PR + YYMMDD + 6 chars+ PIN 6 หลัก - พิมพ์ใบฝากส่งให้ลูกค้า + ใบฉลากแปะกล่อง
- มอบหมายให้เที่ยวรถ — เลือกเที่ยวที่จะส่ง
- พิมพ์ใบสรุปคนรถ — รายการพัสดุทั้งหมดในเที่ยวนั้น
- รถออก → status = in_transit
- ถึงสาขาปลายทาง → สแกน QR เข้าสาขา → ระบบแจ้งเตือนสาขาอัตโนมัติ
- ผู้รับมารับ → สแกน QR + กรอก PIN 6 หลัก → ส่งมอบเสร็จ
รับพัสดุใหม่
เมนู: พัสดุ → + รับพัสดุใหม่
กรอกข้อมูลใน 4 ส่วน:
🛣️ เส้นทาง
- ต้นทาง (สาขาที่รับ)
- ปลายทาง (สาขาที่จะส่ง)
👤 ผู้ส่ง
- ชื่อ * + โทร *
- เลขบัตรประชาชน (ถ้ามี)
📞 ผู้รับ
- ชื่อ * + โทร * (จำเป็น — สำหรับติดต่อ)
- เลขบัตรประชาชน
📦 รายละเอียดพัสดุ
- ประเภท (เอกสาร/พัสดุ/แตกหักง่าย/ใหญ่/อื่นๆ)
- น้ำหนัก (กก.) + จำนวนชิ้น
- ขนาด L × W × H (ซม.)
- คำอธิบาย ("กล่องน้ำตาล ขนาดกลาง")
- มูลค่าประกัน (ถ้าต้องประกัน)
- หมายเหตุ
การ์ดราคา (ฝั่งขวา) — Live calc
ระบบคำนวณราคาแบบ realtime เมื่อเปลี่ยนต้นทาง/ปลายทาง/น้ำหนัก/ประเภท/มูลค่าประกัน
- ระยะทาง
- ค่าส่งพื้นฐาน
- ค่าน้ำหนัก
- ค่าธรรมเนียมประเภท
- ค่าประกัน
- ยอดรวม (ปัดเศษ 5 บาท)
เลือกวิธีชำระ
| วิธี | ผลในระบบ |
|---|---|
| 💵 เงินสด | payment_status = paid (ผู้ส่งจ่ายที่ต้นทาง) |
| 📱 QR Code | payment_status = paid |
| 🟥 เก็บปลายทาง (COD) | payment_status = pending → เก็บตอนผู้รับมารับ → collected_at_dest |
กด "บันทึก + พิมพ์ใบฝากส่ง" → save → redirect ไปหน้า detail พร้อมปุ่ม:
- 🧾 พิมพ์ใบฝากส่ง (parcel_receipt.php)
- 🏷️ พิมพ์ฉลากพัสดุ (parcel_label.php)
เคล็ดลับ: PIN 6 หลักจะแสดงเด่นในใบฝากส่ง — บอกผู้ส่งให้แจ้ง PIN นี้กับผู้รับเพื่อตอนรับของ
รายการพัสดุ
เมนู: พัสดุ
Stat cards ด้านบน
- 🔵 รับแล้ว — ที่ต้นทาง รอมอบหมายเที่ยว
- 🟡 อยู่ระหว่างขนส่ง — บนรถแล้ว
- 🔵 ถึงสาขาปลายทาง — รอผู้รับมารับ
- 🟢 ส่งมอบแล้ว — เสร็จ
Filter
- ค้นหา รหัสพัสดุ / ชื่อผู้ส่ง / ผู้รับ / เบอร์
- กรองสถานะ
- กรองสาขาปลายทาง
Action ในแต่ละแถว
- 👁️ ดูรายละเอียด (timeline + actions ตามสถานะ)
- 🖨️ พิมพ์ใบฝากส่งซ้ำ
- 🏷️ พิมพ์ฉลากซ้ำ
หน้ารายละเอียดพัสดุ
คลิกรหัสพัสดุ → หน้านี้แสดง:
- ข้อมูลพัสดุ — ต้นทาง/ปลายทาง น้ำหนัก ประเภท คำอธิบาย
- ผู้ส่ง / ผู้รับ — ชื่อ + โทร
- Timeline — ประวัติทุก event มี timeline เป็นจุดสี + เวลา + สถานี + ผู้ดำเนินการ
- ราคา breakdown + สถานะการชำระ
- QR + PIN ใหญ่ๆ
Actions (ทำได้ตามสถานะ)
| สถานะปัจจุบัน | ปุ่มที่กดได้ |
|---|---|
| received (ยังไม่มี trip) | มอบหมายให้เที่ยวรถ — เลือกจาก dropdown ของเที่ยวที่ตรง route |
| on_manifest | ขึ้นรถแล้ว (mark loaded) |
| loaded | รถออกแล้ว (mark in_transit) |
| in_transit / loaded | ถึงสาขาปลายทาง (mark arrived) → แจ้งเตือนสาขาอัตโนมัติ |
| arrived | ส่งมอบให้ผู้รับ (ต้องกรอก PIN 6 หลัก) |
สแกน QR Code
เมนู: สแกนพัสดุ — มี 3 tabs
📷 Tab 1: สแกนผ่านกล้อง
- กด "เริ่มสแกน" → เบราว์เซอร์ขออนุญาตกล้อง → อนุญาต
- หันกล้องไปที่ QR บนใบฝากส่ง/ฉลาก
- ระบบอ่าน QR อัตโนมัติ → load ข้อมูลพัสดุ
เบราว์เซอร์อนุญาตกล้อง: เฉพาะ HTTPS หรือ localhost — ถ้าใช้ http://192.168.x.x จะใช้กล้องไม่ได้ ต้องตั้ง HTTPS
🖼️ Tab 2: สแกนจากรูปภาพ
- คลิกเลือกไฟล์ — PNG, JPG, WebP
- Drag & Drop — ลากรูปเข้าโซน
- Ctrl+V — วางรูปจาก clipboard (แชต / สกรีนช็อต)
- ระบบสแกนและ load ข้อมูลอัตโนมัติ
⌨️ Tab 3: กรอกรหัสด้วยมือ
กรอก PR260517XXXXXX → กดค้นหา
หลังสแกนเจอแล้วทำอะไรได้?
- ถ้าพัสดุยังเดินทาง (in_transit/loaded): ปุ่ม "สแกนเข้าสาขา" — อัปเดต status = arrived + แจ้งเตือนสาขา
- ถ้าพัสดุถึงสาขาแล้ว (arrived): ฟอร์มกรอก PIN 6 หลัก + ชื่อผู้รับจริง → ส่งมอบ → status = delivered + เก็บเงิน COD (ถ้ามี)
ใบสรุปส่งของให้คนรถ
เมนู: ใบสรุปส่งของ
- เลือกวันที่ที่ต้องการดู
- ตารางแสดงทุกเที่ยวในวันนั้นพร้อม:
- รหัสเที่ยว + เส้นทาง + เวลาออก
- ทะเบียนรถ
- จำนวนพัสดุ + น้ำหนักรวม + รายได้รวม
- กดปุ่ม "พิมพ์" สำหรับเที่ยวที่มีพัสดุ → เปิด
manifest_print.php
ใบสรุปคนรถมีอะไร?
- หัวเอกสาร: รหัสเที่ยว วันที่ เวลาออก
- ข้อมูลรถ + พนักงานขับ
- ตารางพัสดุ: รหัส, ปลายทาง (highlight), ผู้รับ+โทร, ประเภท, น้ำหนัก, ชิ้น, ราคา, COD ที่ต้องเก็บ (สีแดง)
- Total row: น้ำหนักรวม + จำนวนชิ้น + รายได้
- ลายเซ็น 3 ช่อง: เจ้าหน้าที่ส่ง · พนักงานขับ · เจ้าหน้าที่รับ (ปลายทาง)
💡 ใบนี้สำคัญมาก: คนขับใช้ตรวจสอบของเมื่อรับ + ส่งมอบ + ใช้เป็นหลักฐานเก็บ COD ที่ปลายทาง
สถานะพัสดุทั้ง 8 แบบ
| สถานะ | เกิดเมื่อไหร่ |
|---|---|
| received รับแล้ว | หลังบันทึกพัสดุใหม่ |
| on_manifest อยู่ในใบสรุปรถ | หลังมอบหมายให้ trip |
| loaded ขึ้นรถแล้ว | กดปุ่ม "ขึ้นรถแล้ว" |
| in_transit อยู่ระหว่างขนส่ง | กดปุ่ม "รถออกแล้ว" |
| arrived ถึงสาขาปลายทาง | สแกนเข้าสาขาที่ปลายทาง |
| delivered ส่งมอบแล้ว | ผู้รับมารับด้วย PIN ที่ถูก |
| returned ตีกลับ | (manual โดย admin) |
| lost สูญหาย | (manual โดย admin) |
การคำนวณราคา
$base = max(min_price, distance × baht_per_km)
$weight = max(0, weight − free_kg) × baht_per_kg
$type_mult = doc 0.8× | parcel 1× | fragile 1.3× | oversized 1.5×
$surcharge = ($base + $weight) × ($type_mult − 1)
$insurance = max(10, declared_value × 0.01)
$total = round(($base + $weight + max(0,$surcharge) + $insurance) / 5) × 5
ค่า settings (แก้ได้)
| Setting key | Default | ความหมาย |
|---|---|---|
parcel_base_per_km | 0.50 | บาท/กม. |
parcel_min_price | 50 | ราคาขั้นต่ำ |
parcel_weight_free_kg | 1 | น้ำหนักฟรี |
parcel_weight_per_kg | 8 | บาท/กก. ส่วนเกิน |
parcel_insurance_rate | 0.01 | อัตราประกัน (1% = 0.01) |
