ไอเดีย #27: ระบบจัดการคลังสินค้าแบบหลายสาขา
ร้านวัสดุก่อสร้างที่มีสามสาขาเจอปัญหาเดิมซ้ำ ๆ สาขาหนึ่งของขาดจนต้องบอกลูกค้าให้รอ อีกสาขามีของเดียวกันกองอยู่เต็มโกดัง พอโอนของข้ามสาขาด้วยการโทรบอกกัน ตัวเลขในระบบก็ไม่ตรงกับของจริง ส่วนสินค้าที่มีวันหมดอายุอย่างกาวหรือปูนสำเร็จรูป ล็อตเก่ากลับค้างอยู่หลังโกดังจนเสีย ปัญหาแบบนี้แก้ได้ด้วยระบบคลังที่คิดเรื่องสาขา ล็อต และลำดับการจ่ายของตั้งแต่ต้น
ใครจะใช้
- พนักงานคลังแต่ละสาขา — รับเข้า จ่ายออก ตรวจนับ
- ผู้จัดการสาขา — ขอโอนสินค้า อนุมัติการปรับยอด
- เจ้าของหรือฝ่ายจัดซื้อ — ดูสต็อกรวมทุกสาขา และวางแผนสั่งซื้อ
ฟีเจอร์ขั้นต่ำ (MVP)
- ข้อมูลสินค้า หน่วยนับ และสาขาหรือคลัง
- รับสินค้าเข้าโดยระบุล็อต วันผลิต วันหมดอายุ และต้นทุนต่อหน่วย
- จ่ายออกแบบ FIFO ระบบเลือกล็อตที่เข้าก่อนหรือหมดอายุก่อนให้อัตโนมัติ
- ใบโอนระหว่างสาขา มีสถานะ ขอโอน อนุมัติ ส่งของแล้ว รับของแล้ว โดยของระหว่างทางยังไม่เข้าสต็อกปลายทาง
- สมุดเคลื่อนไหวสต็อก (stock ledger) บันทึกทุกการเข้าออก ย้อนดูได้ว่ายอดมาจากไหน
- ตรวจนับสต็อกและปรับยอดพร้อมเหตุผล
- แจ้งเตือนสินค้าต่ำกว่าจุดสั่งซื้อและล็อตใกล้หมดอายุ
ต่อยอดได้อีก
- สแกนบาร์โค้ดหรือ QR ด้วยแอป Flutter ตอนรับและจ่ายของ
- คำนวณต้นทุนขายตามล็อตจริงเพื่อดูกำไรแม่นขึ้น
- แนะนำการโอนของจากสาขาที่เหลือเยอะไปสาขาที่ขาด
- เชื่อมกับระบบ POS หน้าร้านให้ตัดสต็อกทันทีที่ขาย
โครงข้อมูลตั้งต้น
products— id, sku, name, unit, reorder_pointwarehouses— id, branch_name, addressstock_lots— id, product_id, warehouse_id, lot_no, received_at, expire_date, unit_cost, qty_on_handstock_movements— id, lot_id, movement_type, qty, ref_type, ref_id, user_id, created_attransfers— id, from_warehouse_id, to_warehouse_id, status, requested_by, approved_bytransfer_items— id, transfer_id, product_id, lot_id, qty
ระดับความยาก และสิ่งที่จะได้เรียนรู้
ระดับ ท้าทาย เพราะต้องรักษาความถูกต้องของตัวเลขในทุกสถานการณ์ ทำด้วย Yii2 หรือ Laravel + PostgreSQL ก็เหมาะ สิ่งที่จะได้เรียนรู้:
- การออกแบบ ledger ที่ยอดคงเหลือคำนวณย้อนจากรายการเคลื่อนไหวได้เสมอ
- การใช้
SELECT ... FOR UPDATEล็อกแถวล็อตตอนตัดสต็อก - การตัดสต็อกข้ามหลายล็อตในคำสั่งเดียวแบบ FIFO
- การทำ index ให้รายงานสต็อกรวมหลายสาขาเร็ว
ข้อควรระวัง
- สองสาขาเบิกล็อตเดียวกันพร้อมกันอาจทำให้ยอดติดลบ ต้องกัน race condition และใส่ check constraint ไม่ให้ qty ต่ำกว่าศูนย์
- ห้ามลบหรือแก้รายการเคลื่อนไหวที่บันทึกแล้ว ถ้าผิดให้ทำรายการกลับรายการแทน
- วิธีตีราคาสินค้าคงเหลือมีผลทางบัญชีและภาษี ควรตรวจสอบกับนักบัญชีก่อนเลือกวิธี
ใครเคยทำระบบคลังหลายสาขามาแล้ว เก็บยอดคงเหลือแยกเป็นคอลัมน์หรือคำนวณจาก ledger ทุกครั้ง แล้วเจอปัญหาเรื่องความเร็วไหม? ถ้าเป็นคุณจะจัดการของระหว่างทางตอนโอนสาขาแบบไหน มาแชร์แนวคิดหรือผลงานในกระทู้นี้กันครับ