ระบบจัดการยานพาหนะภาครัฐ (Public Sector Odoo Community Series 1: Fleet Maintenance)
เจาะลึกการพัฒนา Odoo Community เพื่อจัดการสถานะว่าง/ไม่ว่างของรถยนต์ในหน่วยงานภาครัฐ ด้วยระบบตรวจสอบสถานะการซ่อมบำรุงและคิวใช้งานแบบเรียลไทม์
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) จากต้นทาง (ฝ่ายซ่อมและฝ่ายจัดสรร) มาแสดงผลที่จุดเดียว