本文目录导读:

在PHP项目中实现用车管理,通常需要构建一个包含车辆信息管理、司机管理、用车申请、审批流程、调度分配、费用核算、报表统计等模块的系统。
以下是一个从数据库设计到代码实现的分步指南,适用于中小企业或内部OA系统。
第一步:数据库设计(MySQL)
核心需要几张表:vehicles(车辆)、drivers(司机)、bookings(用车申请/行程)。
-- 1. 车辆表
CREATE TABLE `vehicles` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`plate_number` VARCHAR(20) NOT NULL UNIQUE COMMENT '车牌号',
`brand` VARCHAR(50) COMMENT '品牌',
`model` VARCHAR(50) COMMENT '型号',
`seats` TINYINT DEFAULT 5 COMMENT '座位数',
`mileage` DECIMAL(10,2) DEFAULT 0 COMMENT '累计里程(km)',
`status` ENUM('available','maintenance','out_of_service','on_trip') DEFAULT 'available',
`fuel_type` VARCHAR(20) COMMENT '燃油类型',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 2. 司机表
CREATE TABLE `drivers` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL,
`phone` VARCHAR(20),
`license_number` VARCHAR(50) COMMENT '驾驶证号',
`status` ENUM('free','busy','off_duty') DEFAULT 'free'
);
-- 3. 用车申请表
CREATE TABLE `bookings` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`requester_id` INT COMMENT '申请人(user表ID)',
`vehicle_id` INT,
`driver_id` INT DEFAULT NULL,
`start_time` DATETIME,
`end_time` DATETIME,
`destination` VARCHAR(255),
`purpose` TEXT,
`mileage_estimate` DECIMAL(8,2) COMMENT '预估里程',
`status` ENUM('pending','approved','rejected','in_progress','completed','cancelled') DEFAULT 'pending',
`cost` DECIMAL(10,2) DEFAULT 0 COMMENT '费用(油费/过路费等)',
`remark` TEXT,
`approved_by` INT COMMENT '审批人ID',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`vehicle_id`) REFERENCES `vehicles`(`id`),
FOREIGN KEY (`driver_id`) REFERENCES `drivers`(`id`)
);
第二步:核心功能模块实现
车辆与司机管理(CRUD)
使用 Laravel、ThinkPHP 等框架中的 Model + Controller 实现增删改查。
示例(ThinkPHP 6):
// 控制器 - 车辆列表
class VehicleController extends BaseController
{
public function list()
{
$vehicles = Vehicle::where('status', '<>', 'out_of_service')
->paginate(10);
return view('vehicle/list', ['vehicles' => $vehicles]);
}
}
用车申请流程
前端表单: 选择目的地、预计时间、人数、用途。
后端处理:
- 检查车辆状态(是否可用)。
- 检查时间冲突(同一辆车不能同时被预订)。
- 写入
bookings表,状态为pending。
冲突检测SQL示例:
SELECT * FROM bookings
WHERE vehicle_id = :vid
AND status NOT IN ('cancelled','completed')
AND (
start_time < :end AND end_time > :start
);
审批流程
通常分两级:直属主管审批 → 行政部门调度。
实现方式:
- 使用一个
approval_records表存储审批节点(角色 + 结果)。 - 或者简单地在
bookings.status上做状态流转。
示例(审批通过):
if ($user->role_id == $approvalRoleId && $input['action'] == 'approve') {
$booking->status = 'approved';
$booking->approved_by = $user->id;
$booking->save();
// 同时通知调度员
Notification::send($dispatchers, new NewBookingApproved($booking));
}
调度与分配
当申请通过后,调度员手动或自动分配车辆和司机。
自动分配逻辑(简单版):
// 查找空闲车辆
$vehicle = Vehicle::where('status', 'available')
->where('seats', '>=', $booking->required_seats)
->orderBy('mileage', 'asc') // 优先使用里程少的
->first();
// 查找空闲司机
$driver = Driver::where('status', 'free')->first();
// 更新
$booking->vehicle_id = $vehicle->id;
$booking->driver_id = $driver->id;
$booking->status = 'in_progress';
$booking->save();
$vehicle->status = 'on_trip';
$vehicle->save();
$driver->status = 'busy';
$driver->save();
用车结束与费用核算
- 司机/管理员输入实际里程、油费、过路费、停车费等。
- 系统计算总费用。
- 状态更新为
completed,释放车辆和司机状态。
$booking->status = 'completed'; $booking->mileage_actual = $input['mileage']; $booking->cost = $input['fuel_cost'] + $input['toll']; $booking->save(); $vehicle->mileage += $input['mileage']; $vehicle->status = 'available'; $vehicle->save(); $driver->status = 'free'; $driver->save();
报表与统计(可选)
- 月度用车次数、里程统计。
- 车辆利用率、司机工作量。
- 费用汇总(按部门、项目归类)。
SQL示例:
SELECT DATE_FORMAT(start_time, '%Y-%m') AS month,
COUNT(*) AS trips,
SUM(cost) AS total_cost
FROM bookings
WHERE status = 'completed'
GROUP BY month;
第三步:开发建议与技术选型
-
框架推荐:
- Laravel(自带Eloquent ORM、事件、通知、队列)。
- ThinkPHP 8(轻量、中文文档完善)。
-
前端:
- 用 Bootstrap + jQuery 或 Vue 3(配合 Element Plus 或 Ant Design Vue)。
- 关键功能:日期范围选择器(用车时间)、实时表格刷新。
-
权限控制:
- 使用角色:员工(申请)、主管(审批)、调度员(分配)、管理员(管理车辆/司机)。
- Laravel 可用
spatie/laravel-permission。
-
消息推送/提醒:
- 申请提交后通知审批人(邮件、短信或系统内通知)。
- 分配后通知申请人和司机(如使用 WebSocket 或轮询)。
-
避免冲突的高级方案:
- 在数据库层面用 唯一组合约束 或 事务+排他锁 防止同一辆车在同一时段被重复调度。
第四步:示例完整流程时序
| 步骤 | 操作人 | 系统动作 |
|---|---|---|
| 1 | 员工 | 填写用车单,选择时间、人数、目的地 |
| 2 | 系统 | 检查冲突,状态设为 pending |
| 3 | 主管 | 登录后台,审批通过 |
| 4 | 调度员 | 收到通知,分配车辆/司机,状态改为 approved(或直接 in_progress) |
| 5 | 司机 | 收到行程,发车后标记开始 |
| 6 | 司机/管理员 | 行程结束,录入实际里程、费用,状态改为 completed |
| 7 | 系统 | 更新车辆里程、司机状态、生成费用记录 |
在PHP中实现用车管理的关键在于:
- 清晰的状态机设计(申请 → 审批 → 执行 → 完成)。
- 时间冲突检测(数据库索引 + 代码校验)。
- 角色权限分离(谁申请、谁审批、谁调度)。
- 灵活扩展(后续可对接GPS、费用报销、油卡管理)。
如果你需要更具体的代码实现(Laravel 的 Model、Controller、中间件),可以告诉我你使用的框架,我可以帮你写出对应的模块代码。