ระบบจัดการยานพาหนะภาครัฐ (Public Sector Odoo Community Series 1: Fleet Maintenance)

เจาะลึกการพัฒนา Odoo Community เพื่อจัดการสถานะว่าง/ไม่ว่างของรถยนต์ในหน่วยงานภาครัฐ ด้วยระบบตรวจสอบสถานะการซ่อมบำรุงและคิวใช้งานแบบเรียลไทม์

· 5 min read

Problem

ระบบจัดการรถเดิมของหน่วยงานไม่สามารถบอกสถานะการซ่อมบำรุงและคิวงานที่ซ้อนทับกันได้ ทำให้เกิดปัญหาการจัดสรรรถยนต์ในภารกิจภาครัฐติดขัด

Solution

พัฒนาสถานะอัตโนมัติ (_compute_is_available) ที่เชื่อมโยงระหว่างทะเบียนรถ คิวการใช้งาน และการแจ้งซ่อมในโมดูล Maintenance

Impact

ช่วยให้เจ้าหน้าที่พัสดุและฝ่ายยานพาหนะเห็นสถานะรถที่เป็นจริง ลดความผิดพลาดในการจัดงานราชการ

การจัดการยานพาหนะในหน่วยงานภาครัฐด้วย Odoo Community (Series 1)

ในหน่วยงานภาครัฐที่มีการใช้งานรถยนต์ส่วนกลางเพื่อปฏิบัติภารกิจนอกสถานที่อย่างต่อเนื่อง ความท้าทายที่พบบ่อยที่สุดคือการประสานงานระหว่าง “ฝ่ายซ่อมบำรุง (Fleet Maintenance)” และ “ฝ่ายจัดสรรคิวยานพาหนะ” บนซอฟต์แวร์ Odoo Community Edition พื้นฐานมักจะเก็บข้อมูลแยกส่วนกัน ทำให้ยากต่อการบริหารจัดการในภาพรวม

บทความนี้จะเจาะลึกเทคนิคการพัฒนา Custom Module fleet_custom เพื่อสร้างระบบสถานะรวม (Unified Status) สำหรับรถยนต์แต่ละคัน

1. ปัญหา: ระบบ Silo ในการจัดการรถราชการ

ปกติสถานะของรถใน Odoo จะบอกแค่สถานะทางทะเบียน แต่ไม่ได้บอกว่ารถคันนั้น “พร้อมปฏิบัติงาน” หรือไม่ ปัจจัยที่ต้องนำมาพิจารณาได้แก่:

  • รถอยู่ในระหว่างการซ่อมแซมหรือไม่? (ข้อมูลจากฝ่าย Maintenance)
  • รถถูกจองใช้งานในภารกิจอื่นในเวลาเดียวกันหรือไม่? (ข้อมูลจากคิวงาน)

แผนผังสถานะ (Vehicle Availability State Machine)

เราได้ออกแบบ Logic การตรวจสอบสถานะเพื่อช่วยให้ Fleet Maintenance ทำงานได้ง่ายขึ้นดังนี้:

flowchart LR
    Start([เริ่มการตรวจสอบสถานะรถยนต์]) --> CheckRepair{ฝ่ายซ่อมบำรุง\nแจ้งซ่อมInProgress?}
    CheckRepair -- ใช่ --> InMaintenance[สถานะ: ไม่ว่าง - อยู่ระหว่างซ่อม]
    CheckRepair -- ไม่ --> CheckUsage{มีการจองใช้งาน\nในช่วงเวลานี้?}

    CheckUsage -- ใช่ --> CheckApprove{คิวได้รับการ\nอนุมัติหรือไม่?}
    CheckApprove -- ใช่ --> InUse[สถานะ: ไม่ว่าง - อยู่ระหว่างภารกิจ]
    CheckApprove -- ไม่ --> CheckQueue{ตรวจสอบคิวถัดไป}
    CheckUsage -- ไม่ --> Available[สถานะ: ว่าง - พร้อมปฏิบัติราชการ]

    InMaintenance --> End([อัปเดตสถานะอัตโนมัติลงฐานข้อมูล])
    InUse --> End
    Available --> End
    CheckQueue --> CheckUsage

2. Technical Deep Dive: การคำนวณจากความสัมพันธ์หลายโมดูล

การพัฒนาบน Odoo Community เราใช้เทคนิค Metadata-driven ผ่าน Computed Fields เพื่อดึงข้อมูลสถานะจากโมดูลแจ้งซ่อมมาตัดสินใจ

โค้ดตัวอย่างการคำนวณสถานะ (fleet_vehicle.py)

เราเขียน Logic เพื่อให้ระบบตรวจสอบความสัมพันธ์ผ่าน One2many ของฝ่ายซ่อมบำรุงและฝ่ายคิวงาน:

# จากไฟล์ fleet_custom/models/fleet_vehicle.py
@api.depends(
    "maintenance_request_ids.stage_id",
    "usage_queue_ids.use_start_date",
    "usage_queue_ids.use_end_date",
    "usage_queue_ids.status"
)
def _compute_is_available(self):
    now = fields.Datetime.now()
    for vehicle in self:
        # 1. ตรวจสอบสถานะจากฝ่าย Fleet Maintenance
        in_maintenance = any(
            req.stage_id.name in {"In Progress", "Scrap"}
            for req in vehicle.maintenance_request_ids
        )

        # 2. ตรวจสอบสถานะการจองภารกิจ
        in_use = any(
            queue.use_start_date
            and queue.use_start_date <= now
            and (not queue.use_end_date or now <= queue.use_end_date)
            and queue.status == "approve"
            for queue in vehicle.usage_queue_ids
        )

        # สรุปผลความพร้อมของรถ
        vehicle.is_available = not (in_maintenance or in_use)

3. ลำดับขั้นตอนการทำงาน (Sequence Diagram)

ฝ่ายซ่อมบำรุง (Maintenance) และระบบ Fleet จะคุยกันผ่าน Trigger อัตโนมัติเมื่อมีการขยับ Stage ของงานซ่อม:

sequenceDiagram
    participant FM as Fleet Maintenance (ฝ่ายซ่อม)
    participant FV as Fleet Vehicle (ทะเบียนรถ)
    participant MR as Maintenance Request (ใบสั่งซ่อม)

    FM->>MR: เปลี่ยนสถานะงานซ่อมเป็น 'In Progress'
    MR->>FV: Trigger อัปเดตสถานะรถ
    Note over FV: ระบบคำนวณค่า _compute_is_available ใหม่
    FV->>FV: เปลี่ยนสถานะเป็น 'ไม่ว่าง (In Maintenance)'

    Note over FM,FV: เมื่อช่างดำเนินการซ่อมเสร็จสิ้น
    FM->>MR: ปิดใบสั่งซ่อม (Stage: Done)
    MR->>FV: คืนสถานะรถยนต์
    FV-->>FM: Dashboard แสดงสีเขียว (Ready for Service)

4. บทสรุปสำหรับโครงการภาครัฐ

การปรับแต่ง Odoo Community ให้รองรับกระบวนการทำงานของภาครัฐ ช่วยให้เจ้าหน้าที่ไม่ต้องคอยถามกันว่า “รถว่างไหม?” หรือ “ซ่อมเสร็จหรือยัง?” ข้อมูลทุกอย่างจะถูกซิงค์ (Sync) จากต้นทาง (ฝ่ายซ่อมและฝ่ายจัดสรร) มาแสดงผลที่จุดเดียว