很多中小企业都有几辆或几十辆车用于货运、配送、业务拜访,但管理方式往往是:纸质登记、微信群记录、财务凭证上手工贴单。结果是什么?违章忘记处理、年检过期、维修费用虚高、保险理赔慢、成本核算混乱,最后都是老板和财务头疼。
把这些人工流程搬到一个车务管理模块能带来的好处很直接:合规风险降低、维修/保养可追溯、费用及时入账、调度更高效、资产利用率提升。对中小企业来说,投入并不高,但回报明显。
本文你将了解
- 车务管理模块需求与功能清单
- 数据模型
- 系统架构
- 关键业务流程(年检、违章、维修、事故、保养、保险) + 流程图
- API 与前端设计(接口示例 + 表单/校验要点)
- 开发技巧与落地建议(权限、同步、通知、报表、导入导出)
- 实现效果与验收标准(企业看什么算上线)
- 代码参考(数据库建表 SQL、后端 Node.js/TypeScript + ORM、前端 React 示例)
注:本文示例所用方案模板:简道云车辆管理系统,给大家示例的是一些通用的功能和模块,都是支持自定义修改的,你可以根据自己的需求修改里面的功能。
车辆管理系统一般包含:车辆台账(基础信息)、车务管理(年检/保险/违章/事故/维修/保养登记)、油耗与费用管理、调度/派车、驾驶员管理、报表与对账。本文聚焦车务管理板块,即车辆的合规、维修、保养、事故与费用记录与追踪。
一、车务管理板块需求与功能清单
核心功能(必须有):
- 车辆基础信息:车牌、VIN、品牌、型号、采购日期、所属部门、司机、使用状态。
- 违章登记:违章时间、地点、违章项、罚款金额、处理状态、票据附件。
- 事故登记:事故时间、地点、责任判定、损失估算、理赔进度、照片、第三方信息。
- 年检登记:年检到期、提醒、合格证书附件、记录历史。
- 维修登记:维修单号、维修厂、项目明细、金额、里程、附件发票。
- 保养登记:常规保养记录、里程、下次保养提醒。
- 保险登记:保险公司、保单号、保险期限、理赔记录。
- 统计报表:按车、按部门、按时间区间的维修费用、违章费用、保养成本。
- 权限与审批:谁能新增、谁能审批费用、谁能确认年检通过。
- 导入/导出:Excel 批量导入车辆与历史记录,PDF/Excel 导出报表。
- 通知中心:年检/保险到期提醒、违章处理逾期提醒、维修完成通知。
- 附件管理:支持照片、PDF、扫描件。
加分功能:
- 与 GPS / 行车记录仪或油卡对接(后续可接)。
- 与财务系统对接,自动生成凭证。
- 移动端友好:现场拍照上传、司机端简单登记界面。
二、数据模型
scss
Vehicle (车辆)
id, plate_no, vin, brand, model, purchase_date, dept_id, driver_id, status, mileage
Violation (违章)
id, vehicle_id, time, location, violation_type, fine_amount, points, status, evidence_urls, remarks
Accident (事故)
id, vehicle_id, time, location, responsibility, damage_estimate, report_url, status
Maintenance (维修)
id, vehicle_id, time, vendor, items(json), amount, mileage, invoice_url, status
Service (保养)
id, vehicle_id, time, next_service_mileage, mileage, items, vendor, amount, invoice_url
Inspection (年检)
id, vehicle_id, valid_until, certificate_url, last_inspection_time, status
Insurance (保险)
id, vehicle_id, insurer, policy_no, start_date, end_date, premium, claims(json)
说明:
- items、claims 可设计成 JSON 字段或单独表格(按需)。
- 附件(evidence_urls/invoice_url)建议存储文件在对象存储(S3/兼容服务),数据库存 URL 与元数据。
三、系统架构
架构图:
+---------------------+ +-------------------------+
| 浏览器 / 移动端App | <----> | 前端 (React) |
+---------------------+ +-------------------------+
|
v
+------------------------+
| API 网关 / Nginx |
+------------------------+
|
+-------------------------+-------------------------+
| |
v v
+------------------------+ +-------------------------+
| 后端服务 (Node.js/TS) | | 后端服务 (Python/Java) |
| - Auth, RBAC | | - 报表、对接财务、批处理 |
| - Vehicle CRUD | +-------------------------+
| - Business Logic |
+------------------------+
|
v
+------------------------+
| 关系型数据库 (Postgres) |
+------------------------+
|
v
+-------------------------------+
| 对象存储 (S3/MinIO) / 邮件/短信 |
+-------------------------------+
部署建议:
- 小公司可以把后端、数据库、对象存储都部署在云上(一个小型RDS + S3兼容桶),用单体应用快速迭代;
- 成熟后拆分微服务:车辆信息服务、业务事件服务、报表服务、通知服务。
四、API 与前端设计
1.RESTful API 示例
GET /api/vehicles
GET /api/vehicles/{id}
POST /api/vehicles
PUT /api/vehicles/{id}
DELETE /api/vehicles/{id}
GET /api/vehicles/{id}/violations
POST /api/vehicles/{id}/violations
PUT /api/violations/{id}
GET /api/violations/{id}
POST /api/vehicles/{id}/maintenance
GET /api/vehicles/{id}/maintenance
POST /api/vehicles/{id}/inspection
POST /api/vehicles/{id}/insurance
注意点:
- 对于上传附件,使用预签名 URL(signed URL)方式,降低后端压力。
- API 返回尽量包含事件状态、处理人、时间戳、附件 URL。
2.前端表单要点
- 强制拍照上传(违章罚单/维修发票/年检证书),优先使用手机拍照。
- 表单中对时间、金额、里程做前端校验(时间不能未来、金额 >=0、里程 >= 上次里程)。
- 对敏感字段(票据金额)显示权限控制:普通用户看不到审批金额或敏感信息。
五、开发技巧与落地建议
- 先做最小可行产品(MVP):车辆台账 + 年检提醒 + 违章登记 + 附件上传。先满足合规与风险降级,再扩展维修与报表。
- 权限设计要从流程出发:比如“登记人、处理人、财务审核人、管理员”。建议用细粒度 RBAC。
- 提醒机制:使用每日定时任务(cron),但也支持事件驱动(队列)形式。提醒应包含多渠道(系统通知、邮件、短信/企业微信)。
- 附件与证据链:文件使用对象存储,并记录上传人/上传时间/哈希值,便于理赔或审计。
- 数据导入:允许 Excel 导入历史维修/保养/违章记录,导入时做校验并提供错误明细。
- 报表与分析:按车/部门/供应商统计维修成本、每万公里维修费用、违章成本,帮助采购/业务决策。
- 对接财务:提供凭证导出(CSV/Excel)或 API,做到费用从业务模块自动进入财务待审流程。
- 移动优先:司机在现场能拍照并快速提交记录,流程审批放在桌面端更方便。
- 离线录入策略:移动端可做离线缓存,网络恢复后同步,注意冲突解决(乐观锁)。
- 测试场景:模拟年检到期提醒、违章多个处理人、维修驳回重审等业务流程。
六、实现效果与验收标准
上线后可验收的指标:
- 年检/保险到期提醒准确率:100%(所有到期车辆被提醒且有处理记录)。
- 违章处理时效:从登记到处理完成平均 ≤ 7 天(KPI 可定)。
- 维修费用录入准确率:发票附件与金额一致,且能被财务核销。
- 导入成功率:历史数据导入错误率 ≤ 5%,并且企业可查看导入错误明细。
- 用户满意度:司机能在手机端完成 90% 的现场登记操作。
七、代码参考
1.建表
-- 车辆表
CREATE TABLE vehicle (
id SERIAL PRIMARY KEY,
plate_no VARCHAR(20) NOT NULL UNIQUE,
vin VARCHAR(50),
brand VARCHAR(50),
model VARCHAR(50),
purchase_date DATE,
dept_id INT,
driver_id INT,
status VARCHAR(20) DEFAULT 'active',
mileage INT DEFAULT 0,
created_at TIMESTAMP DEFAULT now(),
updated_at TIMESTAMP DEFAULT now()
);
-- 违章表
CREATE TABLE violation (
id SERIAL PRIMARY KEY,
vehicle_id INT REFERENCES vehicle(id),
occ_time TIMESTAMP NOT NULL,
location TEXT,
violation_type VARCHAR(100),
fine_amount NUMERIC(10,2),
points INT,
status VARCHAR(20) DEFAULT 'pending',
evidence_urls TEXT[],
remarks TEXT,
created_at TIMESTAMP DEFAULT now()
);
-- 年检表
CREATE TABLE inspection (
id SERIAL PRIMARY KEY,
vehicle_id INT REFERENCES vehicle(id),
last_inspection_time TIMESTAMP,
valid_until DATE,
certificate_url TEXT,
status VARCHAR(20),
created_at TIMESTAMP DEFAULT now()
);
-- 维修表
CREATE TABLE maintenance (
id SERIAL PRIMARY KEY,
vehicle_id INT REFERENCES vehicle(id),
maintenance_time TIMESTAMP,
vendor VARCHAR(200),
items JSONB,
amount NUMERIC(12,2),
mileage INT,
invoice_url TEXT,
status VARCHAR(20),
created_at TIMESTAMP DEFAULT now()
);
-- 保险表
CREATE TABLE insurance (
id SERIAL PRIMARY KEY,
vehicle_id INT REFERENCES vehicle(id),
insurer VARCHAR(200),
policy_no VARCHAR(100),
start_date DATE,
end_date DATE,
premium NUMERIC(12,2),
claims JSONB,
created_at TIMESTAMP DEFAULT now()
);
2.后端:TypeORM 实体
// entities/Vehicle.ts
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
@Entity()
export class Vehicle {
@PrimaryGeneratedColumn()
id: number;
@Column({ unique: true })
plate_no: string;
@Column({ nullable: true })
vin: string;
@Column({ nullable: true })
brand: string;
@Column({ nullable: true })
model: string;
@Column({ type: 'date', nullable: true })
purchase_date: string;
@Column({ default: 'active' })
status: string;
@Column({ type: 'int', default: 0 })
mileage: number;
@CreateDateColumn()
created_at: Date;
@UpdateDateColumn()
updated_at: Date;
}
3.前端:React 表单
// ViolationForm.jsx (简化)
import React, { useState } from 'react';
import axios from 'axios';
export default function ViolationForm({ vehicleId }) {
const [form, setForm] = useState({
occ_time: '',
location: '',
violation_type: '',
fine_amount: '',
evidence: null
});
const handleFile = (e) => setForm({...form, evidence: e.target.files[0]});
const submit = async () => {
// 1. 上传附件 获取 URL(请求后端返回 presigned url 或直接上传)
let evidence_urls = [];
if (form.evidence) {
const fd = new FormData();
fd.append('file', form.evidence);
const r = await axios.post('/api/upload', fd); // 后端处理并返回 fileUrl
evidence_urls.push(r.data.url);
}
// 2. 提交违章
await axios.post(`/api/vehicles/${vehicleId}/violations`, {
occ_time: form.occ_time,
location: form.location,
violation_type: form.violation_type,
fine_amount: parseFloat(form.fine_amount || 0),
evidence_urls
});
alert('提交成功');
};
return (
违章登记
setForm({...form, occ_time:e.target.value})}/>
setForm({...form, location:e.target.value})}/>
setForm({...form, violation_type:e.target.value})}/>
setForm({...form, fine_amount:e.target.value})}/>
提交
);
}
八、部署与运维要点
- 备份策略:数据库每日全量备份,日志与附件异地存储。
- 日志与审计:对重要操作(违章登记/审批/报销)做审计日志,包含操作者、时间、IP。
- 容错:附件上传采用分片或重试,定时任务做好幂等处理避免重复提醒。
- 性能:列表查询做分页与索引(按车牌、部门、时间等建索引)。
九、落地建议
- 第一月:把车辆基础信息录入系统,启用年检提醒并完成一次年检闭环(提醒 → 上传 → 归档)。
- 第二月:收集近三个月的维修/违章发票导入系统,开始统计每车平均维修成本。
- 第三月:与财务对接,自动导出维修费用凭证,减少人工对账工作。 通过分阶段交付,减少变更风险,快速实现可见价值。
FAQ(每条不少于100字)
Q1:我公司只有10辆车,是否值得建系统?如何判断投入产出?
A1:绝对值得。
对于10辆车,纸质管理虽看似便宜但隐含成本大:违章罚款漏缴导致罚款翻倍、年检逾期导致罚停、维修票据丢失导致报销困难。
你可以做个简单的 ROI 估算:假设每辆车每年因管理不善平均产生 2000 元隐性成本(违章、延误、重复维修),10 辆就是 2 万元/年。
系统初期投入(SaaS 或自建)如果控制在 1 万到 5 万之间,半年到一年即可回本。另外系统能带来的可追溯性和自动通知对合规尤为重要,尤其是客户/监管需要证明你车辆合规时,电子记录能节省大量沟通成本。
Q2:数据从纸质如何迁移到系统?怕历史记录导入一塌糊涂怎么办?
A2:迁移分两步走。
- 第一步是“清洗表单”,把纸质或 Excel 的数据按统一模板整理,建议按车辆、日期、类型(维修/保养/违章/事故)分别列表。
- 第二步是“增量导入+人工复核”:先导入最近 6-12 个月的关键数据(年检、保险到期、近半年维修和违章),其余历史数据可以作为附件扫描保存。
导入工具需要返回错误报告(如无车牌、时间格式错误、金额不合规),让业务人员逐条复核。总体策略是“先入关键、后补充”,这样既能快速上线也降低一次性出错风险。
Q3:我们担心司机不会用手机上传发票或照片,有什么落地方法?
A3:这个问题很常见。解决办法是:
- 把司机端流程做极简:只有 3 个必填项(时间、里程、拍照),其余信息由后台自动补全。
- 提供扫码上传或微信群+小程序入口:部分司机习惯微信,可先通过企业微信小程序快速上传,系统后台做同步。
- 培训与奖励:上线初期给司机做 15-30 分钟的演示,并设置小奖励(比如完成月度登记有额外油卡补贴),能显著提高采集率。
- 提供后台代录选项:行政或调度人员可代为上传并注明“代录”以便追溯。结合这些措施,绝大多数中小企业能在 1-2 月内达到较高的现场数据完整性。
最后一句
车务管理不是花里胡哨的系统工程,而是把零散、风险高、重复的人工流程标准化、自动化,少花钱多解决问题。按本文给出的模型和落地建议,中小企业完全可以在一个到三个月内把核心车务从纸质迁入系统,马上看到合规与成本的改善。