怎样在PHP项目中实现用车管理?

wen java案例 1

本文目录导读:

怎样在PHP项目中实现用车管理?

  1. 第一步:数据库设计(MySQL)
  2. 第二步:核心功能模块实现
  3. 第三步:开发建议与技术选型
  4. 第四步:示例完整流程时序

在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;

第三步:开发建议与技术选型

  1. 框架推荐:

    • Laravel(自带Eloquent ORM、事件、通知、队列)。
    • ThinkPHP 8(轻量、中文文档完善)。
  2. 前端:

    • 用 Bootstrap + jQuery 或 Vue 3(配合 Element Plus 或 Ant Design Vue)。
    • 关键功能:日期范围选择器(用车时间)、实时表格刷新。
  3. 权限控制:

    • 使用角色:员工(申请)、主管(审批)、调度员(分配)、管理员(管理车辆/司机)。
    • Laravel 可用 spatie/laravel-permission
  4. 消息推送/提醒:

    • 申请提交后通知审批人(邮件、短信或系统内通知)。
    • 分配后通知申请人和司机(如使用 WebSocket 或轮询)。
  5. 避免冲突的高级方案:

    • 在数据库层面用 唯一组合约束事务+排他锁 防止同一辆车在同一时段被重复调度。

第四步:示例完整流程时序

步骤 操作人 系统动作
1 员工 填写用车单,选择时间、人数、目的地
2 系统 检查冲突,状态设为 pending
3 主管 登录后台,审批通过
4 调度员 收到通知,分配车辆/司机,状态改为 approved(或直接 in_progress
5 司机 收到行程,发车后标记开始
6 司机/管理员 行程结束,录入实际里程、费用,状态改为 completed
7 系统 更新车辆里程、司机状态、生成费用记录

在PHP中实现用车管理的关键在于:

  • 清晰的状态机设计(申请 → 审批 → 执行 → 完成)。
  • 时间冲突检测(数据库索引 + 代码校验)。
  • 角色权限分离(谁申请、谁审批、谁调度)。
  • 灵活扩展(后续可对接GPS、费用报销、油卡管理)。

如果你需要更具体的代码实现(Laravel 的 Model、Controller、中间件),可以告诉我你使用的框架,我可以帮你写出对应的模块代码。

抱歉,评论功能暂时关闭!